Repository: IgnisDa/ryot (language: rust)

Issue:
Replicate Strong app workout UI
I last used Strong app over a year ago. I just checked it out and the UI has had a lot of improvements.


- [x] when adding an exercise to current workout, and it has history, then add all sets of the last time it was done
- [x] first max when calculating set bests
- [x] replicate strong app UI
  - [x] rest timers
  - [x] supersets: store them as exercise indices
  - [x] replace exercise
- [x] collapse exercise details when all sets are complete
- [x] Remove tokio timeout and add a timeout middleware on the base reqwuest instance
- [x] timer drawer automatically closes when timer expires. Close it after a small interval
- [x] allow search pages to function even if there is an error in the loader. Otherwise, users are not able to change the provider.


Discussion / hints:

Fix patch:
diff --git a/Cargo.lock b/Cargo.lock
index 51a2e863c6..9aff972a42 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -1325,6 +1325,7 @@ name = "common-models"
 version = "0.1.0"
 dependencies = [
  "async-graphql",
+ "educe 0.6.0",
  "enum_meta",
  "enums",
  "rust_decimal",
@@ -2346,6 +2347,7 @@ dependencies = [
  "async-trait",
  "common-models",
  "derive_more 1.0.0",
+ "educe 0.6.0",
  "enums",
  "file-storage-service",
  "rust_decimal",
@@ -2375,7 +2377,6 @@ dependencies = [
 name = "fitness-service"
 version = "0.1.0"
 dependencies = [
- "anyhow",
  "apalis",
  "application-utils",
  "async-graphql",
@@ -4632,6 +4633,7 @@ dependencies = [
  "convert_case",
  "database-models",
  "dependent-models",
+ "educe 0.6.0",
  "enums",
  "graphql_client",
  "hashbag",
@@ -7048,6 +7050,7 @@ version = "0.1.0"
 dependencies = [
  "async-graphql",
  "common-models",
+ "educe 0.6.0",
  "enums",
  "fitness-models",
  "sea-orm",
diff --git a/Cargo.toml b/Cargo.toml
index b40a3947c7..aa4d15ba9d 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -68,6 +68,11 @@ derive_more = { version = "=1.0.0", features = [
     "add_assign",
     "sum",
 ], default-features = false }
+educe = { version = "=0.6.0", features = [
+    "Debug",
+    "Default",
+    "full",
+], default-features = false }
 enum_meta = "=0.7.0"
 itertools = "=0.13.0"
 futures = "=0.3.31"
diff --git a/apps/backend/src/job.rs b/apps/backend/src/job.rs
index a9a25df0b9..d93dcba35c 100644
--- a/apps/backend/src/job.rs
+++ b/apps/backend/src/job.rs
@@ -50,12 +50,6 @@ pub async fn perform_core_application_job(
             .bulk_progress_update(user_id, input)
             .await
             .is_ok(),
-        CoreApplicationJob::EntityAddedToCollection(user_id, collection_to_entity_id) => {
-            misc_service
-                .handle_entity_added_to_collection_event(user_id, collection_to_entity_id)
-                .await
-                .is_ok()
-        }
     };
     ryot_log!(
         trace,
@@ -135,9 +129,9 @@ pub async fn perform_application_job(
         ApplicationJob::SyncIntegrationsData => {
             integration_service.yank_integrations_data().await.is_ok()
         }
-        ApplicationJob::HandleEntityAddedToCollectionEvent(user_id, collection_to_entity_id) => {
+        ApplicationJob::HandleEntityAddedToCollectionEvent(collection_to_entity_id) => {
             integration_service
-                .handle_entity_added_to_collection_event(user_id, collection_to_entity_id)
+                .handle_entity_added_to_collection_event(collection_to_entity_id)
                 .await
                 .is_ok()
         }
diff --git a/apps/frontend/app/components/common.tsx b/apps/frontend/app/components/common.tsx
index 176a162bd8..9833047dff 100644
--- a/apps/frontend/app/components/common.tsx
+++ b/apps/frontend/app/components/common.tsx
@@ -82,7 +82,7 @@ import {
 	useConfirmSubmit,
 	useCoreDetails,
 	useFallbackImageUrl,
-	useGetMantineColor,
+	useGetRandomMantineColor,
 	useUserCollections,
 	useUserDetails,
 	useUserPreferences,
@@ -747,11 +747,11 @@ export const DisplayCollection = (props: {
 	entityId: string;
 	entityLot: EntityLot;
 }) => {
-	const getMantineColor = useGetMantineColor();
+	const color = useGetRandomMantineColor(props.col.name);
 	const submit = useConfirmSubmit();
 
 	return (
-		<Badge key={props.col.id} color={getMantineColor(props.col.name)}>
+		<Badge key={props.col.id} color={color}>
 			<Form
 				method="POST"
 				action={withQuery("/actions", { intent: "removeEntityFromCollection" })}
diff --git a/apps/frontend/app/components/fitness.tsx b/apps/frontend/app/components/fitness.tsx
index 0d1000e0a5..12aa85b2bf 100644
--- a/apps/frontend/app/components/fitness.tsx
+++ b/apps/frontend/app/components/fitness.tsx
@@ -15,6 +15,7 @@ import {
 	Skeleton,
 	Stack,
 	Text,
+	useMantineTheme,
 } from "@mantine/core";
 import { useDisclosure, useInViewport } from "@mantine/hooks";
 import { Link } from "@remix-run/react";
@@ -22,8 +23,9 @@ import {
 	ExerciseLot,
 	SetLot,
 	UserUnitSystem,
-	type WorkoutDetailsQuery,
+	type UserWorkoutDetailsQuery,
 	type WorkoutSetStatistic,
+	type WorkoutSupersetsInformation,
 } from "@ryot/generated/graphql/backend/graphql";
 import { isNumber, startCase } from "@ryot/ts-utils";
 import {
@@ -34,7 +36,6 @@ import {
 	IconRun,
 	IconTrophy,
 	IconWeight,
-	IconZzz,
 } from "@tabler/icons-react";
 import { useQuery } from "@tanstack/react-query";
 import type { ReactNode } from "react";
@@ -42,7 +43,7 @@ import { $path } from "remix-routes";
 import { match } from "ts-pattern";
 import { withFragment } from "ufo";
 import { FitnessEntity, dayjsLib, getSetColor } from "~/lib/generals";
-import { useGetMantineColor, useUserUnitSystem } from "~/lib/hooks";
+import { useGetRandomMantineColor, useUserUnitSystem } from "~/lib/hooks";
 import {
 	getExerciseDetailsQuery,
 	getUserExerciseDetailsQuery,
@@ -143,7 +144,7 @@ export const DisplaySetStatistics = (props: {
 };
 
 type Exercise =
-	WorkoutDetailsQuery["workoutDetails"]["details"]["information"]["exercises"][number];
+	UserWorkoutDetailsQuery["userWorkoutDetails"]["details"]["information"]["exercises"][number];
 type Set = Exercise["sets"][number];
 
 export const DisplaySet = (props: {
@@ -151,7 +152,6 @@ export const DisplaySet = (props: {
 	idx: number;
 	exerciseLot: ExerciseLot;
 }) => {
-	const getMantineColor = useGetMantineColor();
 	const [opened, { close, open }] = useDisclosure(false);
 
 	return (
@@ -182,16 +182,14 @@ export const DisplaySet = (props: {
 						</Popover.Target>
 						<Popover.Dropdown style={{ pointerEvents: "none" }} p={4}>
 							<Flex>
-								{props.set.personalBests.map((pb) => (
-									<Badge
-										key={pb}
-										variant="light"
-										size="xs"
-										color={getMantineColor(pb)}
-									>
-										{startCase(pb)}
-									</Badge>
-								))}
+								{props.set.personalBests.map((pb) => {
+									const color = useGetRandomMantineColor(pb);
+									return (
+										<Badge key={pb} size="xs" color={color} variant="light">
+											{startCase(pb)}
+										</Badge>
+									);
+								})}
 							</Flex>
 						</Popover.Dropdown>
 					</Popover>
@@ -213,11 +211,13 @@ export const DisplaySet = (props: {
 export const ExerciseHistory = (props: {
 	entityId: string;
 	exerciseIdx: number;
-	hideExerciseDetails?: boolean;
 	entityType: FitnessEntity;
-	onCopyButtonClick?: () => Promise<void>;
+	hideExerciseDetails?: boolean;
 	hideExtraDetailsButton?: boolean;
+	onCopyButtonClick?: () => Promise<void>;
+	supersetInformation?: WorkoutSupersetsInformation[];
 }) => {
+	const theme = useMantineTheme();
 	const unitSystem = useUserUnitSystem();
 	const [opened, { toggle }] = useDisclosure(false);
 	const [parent] = useAutoAnimate();
@@ -237,33 +237,22 @@ export const ExerciseHistory = (props: {
 	const { data: exerciseDetails } = useQuery(
 		getExerciseDetailsQuery(exercise?.name || ""),
 	);
-
-	const supersetLinks =
-		exercise && exercise.supersetWith.length > 0
-			? exercise.supersetWith
-					.map<ReactNode>((otherExerciseIdx) => (
-						<Anchor
-							key={otherExerciseIdx}
-							fz="xs"
-							href={withFragment(
-								$path("/fitness/:entity/:id", {
-									entity: "workouts",
-									id: props.entityId,
-								}),
-								otherExerciseIdx.toString(),
-							)}
-						>
-							{
-								workoutDetails.details.information.exercises[otherExerciseIdx]
-									.name
-							}
-						</Anchor>
-					))
-					.reduce((prev, curr) => [prev, ", ", curr])
-			: null;
+	const isInSuperset = props.supersetInformation?.find((s) =>
+		s.exercises.includes(props.exerciseIdx),
+	);
 
 	return (
-		<Paper withBorder p="xs" id={props.exerciseIdx.toString()}>
+		<Paper
+			p="xs"
+			withBorder
+			id={props.exerciseIdx.toString()}
+			style={{
+				borderLeftWidth: isInSuperset ? "3px" : undefined,
+				borderLeftColor: isInSuperset
+					? theme.colors[isInSuperset.color][6]
+					: undefined,
+			}}
+		>
 			{exerciseDetails && workoutDetails && exercise ? (
 				<>
 					<Stack mb="xs" gap="xs" ref={parent}>
@@ -312,12 +301,6 @@ export const ExerciseHistory = (props: {
 						{opened ? (
 							<>
 								<SimpleGrid cols={{ base: 2, md: 3 }} spacing={4}>
-									{exercise.restTime ? (
-										<Flex align="center" gap="xs">
-											<IconZzz size={14} />
-											<Text fz="xs">Rest time: {exercise.restTime}s</Text>
-										</Flex>
-									) : null}
 									{exercise.total ? (
 										<>
 											{Number(exercise.total.reps) > 0 ? (
@@ -372,9 +355,6 @@ export const ExerciseHistory = (props: {
 								) : null}
 							</>
 						) : null}
-						{!props.hideExerciseDetails && supersetLinks ? (
-							<Text fz="xs">Superset with {supersetLinks}</Text>
-						) : null}
 						{exercise.notes.map((n, idxN) => (
 							<Text c="dimmed" key={n} size="xs">
 								{exercise.notes.length === 1 ? undefined : `${idxN + 1})`} {n}
diff --git a/apps/frontend/app/lib/generals.ts b/apps/frontend/app/lib/generals.ts
index 3df792b3a0..68e1dbac90 100644
--- a/apps/frontend/app/lib/generals.ts
+++ b/apps/frontend/app/lib/generals.ts
@@ -56,6 +56,16 @@ export const commaDelimitedString = z
 	.optional()
 	.transform((v) => (isString(v) ? v.split(",") : undefined));
 
+export const emptyNumberString = z
+	.any()
+	.transform((v) => (!v ? undefined : Number.parseInt(v)))
+	.nullable();
+
+export const emptyDecimalString = z
+	.any()
+	.transform((v) => (!v ? undefined : Number.parseFloat(v).toString()))
+	.nullable();
+
 export const CurrentWorkoutKey = "CurrentWorkout";
 export const LOGO_IMAGE_URL =
 	"https://raw.githubusercontent.com/IgnisDa/ryot/main/libs/assets/icon-512x512.png";
@@ -307,10 +317,11 @@ export const getMetadataIcon = (lot: MediaLot) => {
 		.exhaustive();
 };
 
-const baseUrl = typeof window !== "undefined" ? window.location.origin : "";
+export const applicationBaseUrl =
+	typeof window !== "undefined" ? window.location.origin : "";
 
 export const clientGqlService = new GraphQLClient(
-	`${baseUrl}/backend/graphql`,
+	`${applicationBaseUrl}/backend/graphql`,
 	{
 		headers: () => {
 			const data = Cookies.get(AUTH_COOKIE_NAME);
diff --git a/apps/frontend/app/lib/hooks.ts b/apps/frontend/app/lib/hooks.ts
index b47f96a59a..768f8f116c 100644
--- a/apps/frontend/app/lib/hooks.ts
+++ b/apps/frontend/app/lib/hooks.ts
@@ -1,5 +1,5 @@
 import { useComputedColorScheme, useMantineTheme } from "@mantine/core";
-import { useForceUpdate } from "@mantine/hooks";
+import { useForceUpdate, useListState } from "@mantine/hooks";
 import {
 	useNavigate,
 	useRevalidator,
@@ -28,15 +28,17 @@ import {
 import { type InProgressWorkout, useCurrentWorkout } from "~/lib/state/fitness";
 import type { loader as dashboardLoader } from "~/routes/_dashboard";
 
-export const useGetMantineColor = () => {
+export const useGetMantineColors = () => {
 	const theme = useMantineTheme();
 	const colors = Object.keys(theme.colors);
+	return colors;
+};
 
-	// taken from https://stackoverflow.com/questions/44975435/using-mod-operator-in-javascript-to-wrap-around#comment76926119_44975435
-	const getColor = (input: string) =>
-		colors[(getStringAsciiValue(input) + colors.length) % colors.length];
+export const useGetRandomMantineColor = (input: string) => {
+	const colors = useGetMantineColors();
 
-	return getColor;
+	// taken from https://stackoverflow.com/questions/44975435/using-mod-operator-in-javascript-to-wrap-around#comment76926119_44975435
+	return colors[(getStringAsciiValue(input) + colors.length) % colors.length];
 };
 
 export const useFallbackImageUrl = (text = "No Image") => {
@@ -191,3 +193,19 @@ export const useGetWatchProviders = (mediaLot: MediaLot) => {
 			?.values || [];
 	return watchProviders;
 };
+
+export const useComplexJsonUpdate = () => {
+	const [toUpdatePreferences, updateUserPreferencesHandler] = useListState<
+		[string, string]
+	>([]);
+
+	const reset = () => updateUserPreferencesHandler.setState([]);
+
+	const appendPref = (property: string, value: string) => {
+		const index = toUpdatePreferences.findIndex((p) => p[0] === property);
+		if (index !== -1) updateUserPreferencesHandler.remove(index);
+		updateUserPreferencesHandler.append([property, value]);
+	};
+
+	return { reset, appendPref, toUpdatePreferences };
+};
diff --git a/apps/frontend/app/lib/state/fitness.ts b/apps/frontend/app/lib/state/fitness.ts
index 607ce4f4f2..df3ec262fb 100644
--- a/apps/frontend/app/lib/state/fitness.ts
+++ b/apps/frontend/app/lib/state/fitness.ts
@@ -4,22 +4,24 @@ import {
 	ExerciseDetailsDocument,
 	type ExerciseLot,
 	SetLot,
+	type SetRestTimersSettings,
 	UserExerciseDetailsDocument,
+	UserWorkoutDetailsDocument,
+	type UserWorkoutDetailsQuery,
 	type UserWorkoutSetRecord,
 	UserWorkoutTemplateDetailsDocument,
-	WorkoutDetailsDocument,
-	type WorkoutDetailsQuery,
 	type WorkoutInformation,
 	type WorkoutSetStatistic,
+	type WorkoutSupersetsInformation,
 } from "@ryot/generated/graphql/backend/graphql";
-import { isString } from "@ryot/ts-utils";
+import { isNumber, isString, mergeWith } from "@ryot/ts-utils";
 import { queryOptions } from "@tanstack/react-query";
-import type { Dayjs } from "dayjs";
 import { createDraft, finishDraft } from "immer";
 import { atom, useAtom } from "jotai";
-import { atomWithReset, atomWithStorage } from "jotai/utils";
+import { atomWithStorage } from "jotai/utils";
 import Cookies from "js-cookie";
 import { $path } from "remix-routes";
+import { match } from "ts-pattern";
 import { withFragment } from "ufo";
 import { v4 as randomUUID } from "uuid";
 import {
@@ -33,10 +35,11 @@ import {
 import type { useCoreDetails } from "../hooks";
 
 export type ExerciseSet = {
-	statistic: WorkoutSetStatistic;
 	lot: SetLot;
 	confirmedAt: string | null;
+	statistic: WorkoutSetStatistic;
 	note?: boolean | string | null;
+	restTimer?: { duration: number; hasElapsed?: boolean } | null;
 };
 
 type AlreadyDoneExerciseSet = Pick<ExerciseSet, "statistic">;
@@ -44,35 +47,38 @@ type AlreadyDoneExerciseSet = Pick<ExerciseSet, "statistic">;
 type Media = { imageSrc: string; key: string };
 
 export type Exercise = {
+	lot: ExerciseLot;
 	identifier: string;
 	exerciseId: string;
-	exerciseDetails: { images: Array<string> };
-	lot: ExerciseLot;
 	notes: Array<string>;
-	sets: Array<ExerciseSet>;
-	alreadyDoneSets: Array<AlreadyDoneExerciseSet>;
-	restTimer?: { enabled: boolean; duration: number } | null;
 	videos: Array<Media>;
 	images: Array<Media>;
-	supersetWith: Array<string>;
+	isCollapsed?: boolean;
+	sets: Array<ExerciseSet>;
 	isShowDetailsOpen: boolean;
 	openedDetailsTab?: "images" | "history";
+	alreadyDoneSets: Array<AlreadyDoneExerciseSet>;
+};
+
+export type Superset = Omit<WorkoutSupersetsInformation, "exercises"> & {
+	identifier: string;
+	exercises: Array<string>;
 };
 
 export type InProgressWorkout = {
-	updateWorkoutId?: string;
-	updateWorkoutTemplateId?: string;
-	repeatedFrom?: string;
-	templateId?: string;
-	startTime: string;
-	endTime?: string;
 	name: string;
 	comment?: string;
-	defaultRestTimer?: number | null;
-	exercises: Array<Exercise>;
+	endTime?: string;
+	startTime: string;
+	templateId?: string;
 	videos: Array<string>;
+	repeatedFrom?: string;
+	supersets: Superset[];
 	images: Array<string>;
-	highlightedSet?: { exerciseIdx: number; setIdx: number };
+	updateWorkoutId?: string;
+	exercises: Array<Exercise>;
+	replacingExerciseIdx?: number;
+	updateWorkoutTemplateId?: string;
 };
 
 type CurrentWorkout = InProgressWorkout | null;
@@ -97,11 +103,12 @@ export const useGetSetAtIndex = (exerciseIdx: number, setIdx: number) => {
 export const getDefaultWorkout = (): InProgressWorkout => {
 	const date = new Date();
 	return {
-		name: `${getTimeOfDay(date.getHours())} Workout`,
-		startTime: date.toISOString(),
-		exercises: [],
 		images: [],
 		videos: [],
+		supersets: [],
+		exercises: [],
+		startTime: date.toISOString(),
+		name: `${getTimeOfDay(date.getHours())} Workout`,
 	};
 };
 
@@ -137,8 +144,8 @@ export const getWorkoutDetailsQuery = (workoutId: string) =>
 		queryKey: queryFactory.fitness.workoutDetails(workoutId).queryKey,
 		queryFn: () =>
 			clientGqlService
-				.request(WorkoutDetailsDocument, { workoutId })
-				.then((data) => data.workoutDetails),
+				.request(UserWorkoutDetailsDocument, { workoutId })
+				.then((data) => data.userWorkoutDetails),
 	});
 
 export const getWorkoutDetails = async (workoutId: string) =>
@@ -154,32 +161,110 @@ export const getWorkoutTemplateDetailsQuery = (workoutTemplateId: string) =>
 				.then((data) => data.userWorkoutTemplateDetails),
 	});
 
-type TWorkoutDetails = WorkoutDetailsQuery["workoutDetails"];
+type TWorkoutDetails = UserWorkoutDetailsQuery["userWorkoutDetails"];
+type TSet =
+	TWorkoutDetails["details"]["information"]["exercises"][number]["sets"][number];
 
 export const convertHistorySetToCurrentSet = (
-	s: Pick<
-		TWorkoutDetails["details"]["information"]["exercises"][number]["sets"][number],
-		"statistic" | "lot" | "note"
-	>,
+	set: Pick<TSet, "statistic" | "lot" | "note" | "restTime">,
 	confirmedAt?: string | null,
 ) =>
 	({
-		lot: s.lot,
-		note: s.note,
-		statistic: s.statistic,
+		lot: set.lot,
+		note: set.note,
+		statistic: set.statistic,
 		confirmedAt: confirmedAt ?? null,
+		restTimer: set.restTime ? { duration: set.restTime } : null,
 	}) satisfies ExerciseSet;
 
+export const currentWorkoutToCreateWorkoutInput = (
+	currentWorkout: InProgressWorkout,
+	isCreatingTemplate: boolean,
+) => {
+	const supersets = currentWorkout.supersets.map((sup) => ({
+		...sup,
+		exercises: sup.exercises.map((e) =>
+			currentWorkout.exercises.findIndex((ex) => ex.identifier === e),
+		),
+	}));
+	const input: CreateOrUpdateUserWorkoutMutationVariables = {
+		input: {
+			supersets,
+			exercises: [],
+			name: currentWorkout.name,
+			comment: currentWorkout.comment,
+			endTime: new Date().toISOString(),
+			templateId: currentWorkout.templateId,
+			repeatedFrom: currentWorkout.repeatedFrom,
+			updateWorkoutId: currentWorkout.updateWorkoutId,
+			updateWorkoutTemplateId: currentWorkout.updateWorkoutTemplateId,
+			startTime: new Date(currentWorkout.startTime).toISOString(),
+			assets: {
+				images: [...currentWorkout.images],
+				videos: [...currentWorkout.videos],
+			},
+		},
+	};
+	for (const exercise of currentWorkout.exercises) {
+		const sets = Array<UserWorkoutSetRecord>();
+		for (const set of exercise.sets)
+			if (isCreatingTemplate || set.confirmedAt) {
+				const note = isString(set.note) ? set.note : undefined;
+				if (Object.keys(set.statistic).length === 0) continue;
+				sets.push({
+					note,
+					lot: set.lot,
+					confirmedAt: set.confirmedAt
+						? new Date(set.confirmedAt).toISOString()
+						: null,
+					statistic: set.statistic,
+					restTime: set.restTimer?.duration,
+				});
+			}
+		if (sets.length === 0) continue;
+		const notes = Array<string>();
+		for (const note of exercise.notes) if (note) notes.push(note);
+		const toAdd = {
+			sets,
+			notes,
+			exerciseId: exercise.exerciseId,
+			assets: {
+				images: exercise.images.map((m) => m.key),
+				videos: exercise.videos.map((m) => m.key),
+			},
+		};
+		input.input.exercises.push(toAdd);
+	}
+	return input;
+};
+
+export type CurrentWorkoutTimer = {
+	endAt: string;
+	totalTime: number;
+	triggeredBy?: { exerciseIdentifier: string; setIdx: number };
+};
+
+const timerAtom = atomWithStorage<CurrentWorkoutTimer | null>(
+	"CurrentWorkoutTimer",
+	null,
+);
+
+export const useTimerAtom = () => useAtom(timerAtom);
+
+const measurementsDrawerOpenAtom = atom(false);
+
+export const useMeasurementsDrawerOpen = () =>
+	useAtom(measurementsDrawerOpenAtom);
+
 export const duplicateOldWorkout = async (
-	workoutInformation: WorkoutInformation,
 	name: string,
+	workoutInformation: WorkoutInformation,
 	coreDetails: ReturnType<typeof useCoreDetails>,
 	params: {
 		repeatedFromId?: string;
 		templateId?: string;
 		updateWorkoutId?: string;
 		updateWorkoutTemplateId?: string;
-		defaultRestTimer?: number | null;
 	},
 ) => {
 	const inProgress = getDefaultWorkout();
@@ -189,7 +274,6 @@ export const duplicateOldWorkout = async (
 	inProgress.updateWorkoutId = params.updateWorkoutId;
 	inProgress.updateWorkoutTemplateId = params.updateWorkoutTemplateId;
 	inProgress.comment = workoutInformation.comment || undefined;
-	inProgress.defaultRestTimer = params.defaultRestTimer;
 	for (const [exerciseIdx, ex] of workoutInformation.exercises.entries()) {
 		const sets = ex.sets.map((v) =>
 			convertHistorySetToCurrentSet(
@@ -198,21 +282,15 @@ export const duplicateOldWorkout = async (
 			),
 		);
 		const exerciseDetails = await getExerciseDetails(ex.name);
-		const defaultRestTime = params.defaultRestTimer || ex.restTime;
 		inProgress.exercises.push({
 			identifier: randomUUID(),
 			isShowDetailsOpen: exerciseIdx === 0,
-			exerciseDetails: { images: exerciseDetails.details.attributes.images },
 			images: [],
 			videos: [],
 			alreadyDoneSets: sets.map((s) => ({ statistic: s.statistic })),
 			exerciseId: ex.name,
 			lot: ex.lot,
 			notes: ex.notes,
-			supersetWith: [],
-			restTimer: defaultRestTime
-				? { duration: defaultRestTime, enabled: true }
-				: null,
 			sets: sets,
 			openedDetailsTab: !coreDetails.isPro
 				? "images"
@@ -221,46 +299,82 @@ export const duplicateOldWorkout = async (
 					: "images",
 		});
 	}
-	for (const [idx, exercise] of workoutInformation.exercises.entries()) {
-		const supersetWith = exercise.supersetWith.map(
-			(index) => inProgress.exercises[index].identifier,
-		);
-		inProgress.exercises[idx].supersetWith = supersetWith;
-	}
+	const supersets = workoutInformation.supersets.map((sup) => ({
+		...sup,
+		identifier: randomUUID(),
+		exercises: sup.exercises.map((e) => inProgress.exercises[e].identifier),
+	}));
+	inProgress.supersets = supersets;
 	return inProgress;
 };
 
+export const getRestTimerForSet = async (
+	lot: SetLot,
+	exerciseId: string,
+	userPreferencesRestTimer: SetRestTimersSettings,
+) => {
+	const exerciseDetails = await getExerciseDetails(exerciseId);
+	const mergedSettings = mergeWith(
+		{},
+		exerciseDetails.userDetails.details?.exerciseExtraInformation?.settings
+			.setRestTimers || {},
+		userPreferencesRestTimer,
+		(objValue?: number, srcValue?: number) => {
+			if (isNumber(objValue)) return objValue;
+			if (isNumber(srcValue)) return srcValue;
+			return undefined;
+		},
+	);
+	const restTime = match(lot)
+		.with(SetLot.Normal, () => mergedSettings.normal)
+		.with(SetLot.Drop, () => mergedSettings.drop)
+		.with(SetLot.WarmUp, () => mergedSettings.warmup)
+		.with(SetLot.Failure, () => mergedSettings.failure)
+		.exhaustive();
+	return restTime;
+};
+
 export const addExerciseToWorkout = async (
+	navigate: NavigateFunction,
 	currentWorkout: InProgressWorkout,
+	userPreferencesRestTimer: SetRestTimersSettings,
 	setCurrentWorkout: (v: InProgressWorkout) => void,
 	selectedExercises: Array<{ name: string; lot: ExerciseLot }>,
-	navigate: NavigateFunction,
 ) => {
 	const draft = createDraft(currentWorkout);
 	const idxOfNextExercise = draft.exercises.length;
 	for (const [_exerciseIdx, ex] of selectedExercises.entries()) {
 		const exerciseDetails = await getExerciseDetails(ex.name);
-		const alreadyDoneSets = [];
-		const allHistory = exerciseDetails.userDetails.history || [];
-		for (const history of allHistory.slice(0, 3)) {
+		const setLot = SetLot.Normal;
+		const restTimer = await getRestTimerForSet(
+			setLot,
+			ex.name,
+			userPreferencesRestTimer,
+		);
+		let sets: ExerciseSet[] = [
+			{
+				lot: setLot,
+				statistic: {},
+				confirmedAt: null,
+				restTimer: restTimer ? { duration: restTimer } : undefined,
+			},
+		];
+		let alreadyDoneSets: AlreadyDoneExerciseSet[] = [];
+		const history = (exerciseDetails.userDetails.history || []).at(0);
+		if (history) {
 			const workout = await getWorkoutDetails(history.workoutId);
-			const setStatistics = workout.details.information.exercises[
-				history.idx
-			].sets.map((s) => s.statistic);
-			alreadyDoneSets.push({ statistic: setStatistics[0] });
+			sets = workout.details.information.exercises[history.idx].sets.map((v) =>
+				convertHistorySetToCurrentSet(v),
+			);
+			alreadyDoneSets = sets.map((s) => ({ statistic: s.statistic }));
 		}
 		draft.exercises.push({
 			identifier: randomUUID(),
 			isShowDetailsOpen: true,
 			exerciseId: ex.name,
-			exerciseDetails: {
-				images: exerciseDetails.details.attributes.images,
-			},
 			lot: ex.lot,
-			sets: [{ statistic: {}, lot: SetLot.Normal, confirmedAt: null }],
-			supersetWith: [],
+			sets,
 			alreadyDoneSets,
-			restTimer: { duration: 60, enabled: true },
 			notes: [],
 			images: [],
 			videos: [],
@@ -281,93 +395,3 @@ export const addExerciseToWorkout = async (
 		),
 	);
 };
-
-export const currentWorkoutToCreateWorkoutInput = (
-	currentWorkout: InProgressWorkout,
-	isCreatingTemplate: boolean,
-) => {
-	const input: CreateOrUpdateUserWorkoutMutationVariables = {
-		input: {
-			endTime: new Date().toISOString(),
-			templateId: currentWorkout.templateId,
-			updateWorkoutId: currentWorkout.updateWorkoutId,
-			updateWorkoutTemplateId: currentWorkout.updateWorkoutTemplateId,
-			startTime: new Date(currentWorkout.startTime).toISOString(),
-			name: currentWorkout.name,
-			comment: currentWorkout.comment,
-			repeatedFrom: currentWorkout.repeatedFrom,
-			defaultRestTimer: currentWorkout.defaultRestTimer,
-			exercises: [],
-			assets: {
-				images: [...currentWorkout.images],
-				videos: [...currentWorkout.videos],
-			},
-		},
-	};
-	for (const exercise of currentWorkout.exercises) {
-		const sets = Array<UserWorkoutSetRecord>();
-		for (const set of exercise.sets)
-			if (isCreatingTemplate || set.confirmedAt) {
-				const note = isString(set.note) ? set.note : undefined;
-				if (Object.keys(set.statistic).length === 0) continue;
-				sets.push({
-					note,
-					lot: set.lot,
-					confirmedAt: set.confirmedAt
-						? new Date(set.confirmedAt).toISOString()
-						: null,
-					statistic: set.statistic,
-				});
-			}
-		if (sets.length === 0) continue;
-		const notes = Array<string>();
-		for (const note of exercise.notes) if (note) notes.push(note);
-		const toAdd = {
-			identifier: exercise.identifier,
-			exerciseId: exercise.exerciseId,
-			notes,
-			sets,
-			// biome-ignore lint/suspicious/noExplicitAny: required here
-			supersetWith: exercise.supersetWith as any,
-			assets: {
-				images: exercise.images.map((m) => m.key),
-				videos: exercise.videos.map((m) => m.key),
-			},
-			restTime: exercise.restTimer?.enabled
-				? exercise.restTimer.duration
-				: undefined,
-		};
-		input.input.exercises.push(toAdd);
-	}
-	for (const ex of input.input.exercises) {
-		let supersetWith = ex.supersetWith.map((identifier) =>
-			// biome-ignore lint/suspicious/noExplicitAny: required here
-			input.input.exercises.findIndex((e: any) => e.identifier === identifier),
-		);
-		supersetWith = supersetWith.filter((idx) => idx !== -1);
-		ex.supersetWith = supersetWith;
-	}
-	for (const ex of input.input.exercises) {
-		// biome-ignore lint/suspicious/noExplicitAny: required here
-		(ex as any).identifier = undefined;
-	}
-	return input;
-};
-
-export const exerciseHasDetailsToShow = (exercise: Exercise) =>
-	exercise.exerciseDetails.images.length > 0;
-
-type Timer = {
-	totalTime: number;
-	endAt: Dayjs;
-	triggeredBy?: { exerciseIdentifier: string; setIdx: number };
-};
-
-const timerAtom = atomWithReset<Timer | null>(null);
-
-export const useTimerAtom = () => useAtom(timerAtom);
-
-const measurementsDrawerOpenAtom = atom(false);
-
-export const useMeasurementsDrawerOpen = () =>
-	useAtom(measurementsDrawerOpenAtom);
diff --git a/apps/frontend/app/lib/utilities.server.ts b/apps/frontend/app/lib/utilities.server.ts
index c6074c2c23..136309c4ab 100644
--- a/apps/frontend/app/lib/utilities.server.ts
+++ b/apps/frontend/app/lib/utilities.server.ts
@@ -35,6 +35,8 @@ import {
 	CurrentWorkoutKey,
 	FitnessAction,
 	dayjsLib,
+	emptyDecimalString,
+	emptyNumberString,
 	pageQueryParam,
 	queryClient,
 	queryFactory,
@@ -153,16 +155,6 @@ export const combineHeaders = (
 	return combined;
 };
 
-const emptyNumberString = z
-	.any()
-	.transform((v) => (!v ? undefined : Number.parseInt(v)))
-	.nullable();
-
-const emptyDecimalString = z
-	.any()
-	.transform((v) => (!v ? undefined : Number.parseFloat(v).toString()))
-	.nullable();
-
 export const MetadataIdSchema = z.object({ metadataId: z.string() });
 
 export const MetadataSpecificsSchema = z.object({
diff --git a/apps/frontend/app/routes/_dashboard._index.tsx b/apps/frontend/app/routes/_dashboard._index.tsx
index c770445ad6..a505f966c4 100644
--- a/apps/frontend/app/routes/_dashboard._index.tsx
+++ b/apps/frontend/app/routes/_dashboard._index.tsx
@@ -71,6 +71,7 @@ import {
 import {
 	useCoreDetails,
 	useDashboardLayoutData,
+	useGetMantineColors,
 	useUserPreferences,
 	useUserUnitSystem,
 } from "~/lib/hooks";
@@ -506,8 +507,7 @@ const ActualDisplayStat = (props: {
 	}>;
 	color?: string;
 }) => {
-	const theme = useMantineTheme();
-	const colors = Object.keys(theme.colors);
+	const colors = useGetMantineColors();
 
 	return (
 		<Flex align="center">
diff --git a/apps/frontend/app/routes/_dashboard.collections.list.tsx b/apps/frontend/app/routes/_dashboard.collections.list.tsx
index e95428b7b6..5d8a086e6e 100644
--- a/apps/frontend/app/routes/_dashboard.collections.list.tsx
+++ b/apps/frontend/app/routes/_dashboard.collections.list.tsx
@@ -21,12 +21,7 @@ import {
 	Title,
 	Tooltip,
 } from "@mantine/core";
-import {
-	useDidUpdate,
-	useDisclosure,
-	useHover,
-	useListState,
-} from "@mantine/hooks";
+import { useDidUpdate, useHover, useListState } from "@mantine/hooks";
 import { notifications } from "@mantine/notifications";
 import { unstable_defineAction, unstable_defineLoader } from "@remix-run/node";
 import {
@@ -75,6 +70,7 @@ import { confirmWrapper } from "~/components/confirmation";
 import {
 	PRO_REQUIRED_MESSAGE,
 	clientGqlService,
+	commaDelimitedString,
 	dayjsLib,
 	getPartialMetadataDetailsQuery,
 	queryClient,
@@ -178,12 +174,9 @@ export const action = unstable_defineAction(async ({ request }) => {
 
 const createOrUpdateSchema = z.object({
 	name: z.string(),
-	description: z.string().optional(),
 	updateId: z.string().optional(),
-	collaborators: z
-		.string()
-		.optional()
-		.transform((v) => (v ? v.split(",") : undefined)),
+	description: z.string().optional(),
+	collaborators: commaDelimitedString,
 	informationTemplate: z
 		.array(
 			z.object({
@@ -198,11 +191,11 @@ const createOrUpdateSchema = z.object({
 });
 
 type UpdateCollectionInput = {
-	name: string;
-	id: string;
-	isDefault: boolean;
-	collaborators: Collection["collaborators"];
-	description?: string | null;
+	id?: string;
+	name?: string;
+	isDefault?: boolean;
+	description?: string;
+	collaborators?: Collection["collaborators"];
 	informationTemplate?: CollectionExtraInformation[] | null;
 };
 
@@ -218,15 +211,10 @@ export default function Page() {
 	);
 
 	const [toUpdateCollection, setToUpdateCollection] =
-		useState<UpdateCollectionInput>();
-	const [
-		createOrUpdateModalOpened,
-		{ open: createOrUpdateModalOpen, close: createOrUpdateModalClose },
-	] = useDisclosure(false);
+		useState<UpdateCollectionInput | null>(null);
 	useEffect(() => {
 		if (transition.state !== "submitting") {
-			createOrUpdateModalClose();
-			setToUpdateCollection(undefined);
+			setToUpdateCollection(null);
 		}
 	}, [transition.state]);
 
@@ -238,19 +226,16 @@ export default function Page() {
 					<ActionIcon
 						color="green"
 						variant="outline"
-						onClick={() => {
-							setToUpdateCollection(undefined);
-							createOrUpdateModalOpen();
-						}}
+						onClick={() => setToUpdateCollection({})}
 					>
 						<IconPlus size={20} />
 					</ActionIcon>
 					<Modal
-						opened={createOrUpdateModalOpened}
-						onClose={createOrUpdateModalClose}
-						withCloseButton={false}
 						centered
 						size="lg"
+						withCloseButton={false}
+						opened={toUpdateCollection !== null}
+						onClose={() => setToUpdateCollection(null)}
 					>
 						<CreateOrUpdateModal toUpdateCollection={toUpdateCollection} />
 					</Modal>
@@ -270,7 +255,6 @@ export default function Page() {
 								index={index}
 								collection={c}
 								setToUpdateCollection={setToUpdateCollection}
-								openModal={createOrUpdateModalOpen}
 							/>
 						);
 					}}
@@ -285,10 +269,9 @@ type Collection = UserCollectionsListQuery["userCollectionsList"][number];
 const IMAGES_CONTAINER_WIDTH = 250;
 
 const DisplayCollection = (props: {
-	collection: Collection;
 	index: number;
+	collection: Collection;
 	setToUpdateCollection: (c: UpdateCollectionInput) => void;
-	openModal: () => void;
 }) => {
 	const userDetails = useUserDetails();
 	const coreDetails = useCoreDetails();
@@ -352,10 +335,10 @@ const DisplayCollection = (props: {
 			pr="md"
 			radius="lg"
 			withBorder
-			mt={props.index !== 0 ? "lg" : undefined}
 			pl={{ base: "md", md: 0 }}
 			py={{ base: "sm", md: 0 }}
 			style={{ overflow: "hidden" }}
+			mt={props.index !== 0 ? "lg" : undefined}
 		>
 			<Flex gap="xs" direction={{ base: "column", md: "row" }}>
 				<Flex
@@ -413,14 +396,13 @@ const DisplayCollection = (props: {
 									variant="outline"
 									onClick={() => {
 										props.setToUpdateCollection({
-											name: props.collection.name,
 											id: props.collection.id,
-											description: props.collection.description,
-											collaborators: props.collection.collaborators,
+											name: props.collection.name,
 											isDefault: props.collection.isDefault,
+											collaborators: props.collection.collaborators,
+											description: props.collection.description ?? undefined,
 											informationTemplate: props.collection.informationTemplate,
 										});
-										props.openModal();
 									}}
 								>
 									<IconEdit size={18} />
@@ -429,7 +411,7 @@ const DisplayCollection = (props: {
 							{!props.collection.isDefault ? (
 								<Form
 									method="POST"
-									action={withQuery("", { intent: "delete" })}
+									action={withQuery(".", { intent: "delete" })}
 								>
 									<input
 										hidden
@@ -509,7 +491,7 @@ const CollectionImageDisplay = (props: {
 };
 
 const CreateOrUpdateModal = (props: {
-	toUpdateCollection: UpdateCollectionInput | undefined;
+	toUpdateCollection: UpdateCollectionInput | null;
 }) => {
 	const loaderData = useLoaderData<typeof loader>();
 	const coreDetails = useCoreDetails();
@@ -524,7 +506,7 @@ const CreateOrUpdateModal = (props: {
 		<Box
 			method="POST"
 			component={Form}
-			action={withQuery("", { intent: "createOrUpdate" })}
+			action={withQuery(".", { intent: "createOrUpdate" })}
 		>
 			<Stack>
 				<Title order={3}>
@@ -534,9 +516,7 @@ const CreateOrUpdateModal = (props: {
 					label="Name"
 					required
 					name="name"
-					defaultValue={
-						props.toUpdateCollection ? props.toUpdateCollection.name : undefined
-					}
+					defaultValue={props.toUpdateCollection?.name}
 					readOnly={props.toUpdateCollection?.isDefault}
 					description={
 						props.toUpdateCollection?.isDefault
@@ -545,14 +525,10 @@ const CreateOrUpdateModal = (props: {
 					}
 				/>
 				<Textarea
-					label="Description"
-					name="description"
-					defaultValue={
-						props.toUpdateCollection?.description
-							? props.toUpdateCollection.description
-							: undefined
-					}
 					autosize
+					name="description"
+					label="Description"
+					defaultValue={props.toUpdateCollection?.description}
 				/>
 				<Tooltip label={PRO_REQUIRED_MESSAGE} disabled={coreDetails.isPro}>
 					<MultiSelect
@@ -637,9 +613,9 @@ const CreateOrUpdateModal = (props: {
 								</Group>
 								<Group mt="xs" justify="space-around">
 									<Checkbox
+										size="sm"
 										label="Required"
 										name={`informationTemplate[${index}].required`}
-										size="sm"
 										defaultChecked={field.required || undefined}
 									/>
 									<Button
@@ -657,12 +633,10 @@ const CreateOrUpdateModal = (props: {
 					</Stack>
 				</Input.Wrapper>
 				<Button
-					variant="outline"
 					type="submit"
+					variant="outline"
+					value={props.toUpdateCollection?.id}
 					name={props.toUpdateCollection ? "updateId" : undefined}
-					value={
-						props.toUpdateCollection ? props.toUpdateCollection.id : undefined
-					}
 				>
 					{props.toUpdateCollection ? "Update" : "Create"}
 				</Button>
diff --git a/apps/frontend/app/routes/_dashboard.fitness.$action.tsx b/apps/frontend/app/routes/_dashboard.fitness.$action.tsx
index 4a88f6392d..cf91273a82 100644
--- a/apps/frontend/app/routes/_dashboard.fitness.$action.tsx
+++ b/apps/frontend/app/routes/_dashboard.fitness.$action.tsx
@@ -22,9 +22,9 @@ import {
 	Progress,
 	RingProgress,
 	ScrollArea,
+	Select,
 	SimpleGrid,
 	Stack,
-	Switch,
 	Text,
 	TextInput,
 	Textarea,
@@ -32,6 +32,7 @@ import {
 	Transition,
 	UnstyledButton,
 	rem,
+	useMantineTheme,
 } from "@mantine/core";
 import {
 	useDebouncedState,
@@ -53,8 +54,10 @@ import type { MetaArgs_SingleFetch } from "@remix-run/react";
 import {
 	CreateOrUpdateUserWorkoutDocument,
 	CreateOrUpdateUserWorkoutTemplateDocument,
+	type ExerciseDetailsQuery,
 	ExerciseLot,
 	SetLot,
+	type UserExerciseDetailsQuery,
 	UserUnitSystem,
 	type WorkoutSetStatistic,
 } from "@ryot/generated/graphql/backend/graphql";
@@ -64,6 +67,7 @@ import {
 	isNumber,
 	isString,
 	snakeCase,
+	sortBy,
 	startCase,
 	sum,
 } from "@ryot/ts-utils";
@@ -71,6 +75,7 @@ import {
 	IconCamera,
 	IconCameraRotate,
 	IconCheck,
+	IconChevronUp,
 	IconClipboard,
 	IconClock,
 	IconDotsVertical,
@@ -81,15 +86,15 @@ import {
 	IconLayersIntersect,
 	IconPhoto,
 	IconReorder,
+	IconReplace,
 	IconTrash,
-	IconZzz,
 } from "@tabler/icons-react";
 import { useQuery } from "@tanstack/react-query";
 import { Howl } from "howler";
 import { produce } from "immer";
 import { RESET } from "jotai/utils";
 import Cookies from "js-cookie";
-import { useRef, useState } from "react";
+import { useEffect, useMemo, useRef, useState } from "react";
 import Webcam from "react-webcam";
 import { $path } from "remix-routes";
 import { ClientOnly } from "remix-utils/client-only";
@@ -97,7 +102,8 @@ import { namedAction } from "remix-utils/named-action";
 import invariant from "tiny-invariant";
 import { match } from "ts-pattern";
 import { withQuery } from "ufo";
-import { useInterval } from "usehooks-ts";
+import { useInterval, useOnClickOutside } from "usehooks-ts";
+import { v4 as randomUUID } from "uuid";
 import { z } from "zod";
 import { zx } from "zodix";
 import { confirmWrapper } from "~/components/confirmation";
@@ -123,14 +129,18 @@ import {
 	forceUpdateEverySecond,
 	useApplicationEvents,
 	useCoreDetails,
+	useGetMantineColors,
 	useUserPreferences,
 	useUserUnitSystem,
 } from "~/lib/hooks";
 import {
+	type CurrentWorkoutTimer,
 	type InProgressWorkout,
+	type Superset,
 	convertHistorySetToCurrentSet,
 	currentWorkoutToCreateWorkoutInput,
-	exerciseHasDetailsToShow,
+	getExerciseDetailsQuery,
+	getRestTimerForSet,
 	getUserExerciseDetailsQuery,
 	getWorkoutDetails,
 	useCurrentWorkout,
@@ -146,7 +156,6 @@ import {
 } from "~/lib/utilities.server";
 
 const workoutCookieName = CurrentWorkoutKey;
-const defaultTimerLocalStorageKey = "DefaultExerciseRestTimer";
 
 export const loader = unstable_defineLoader(async ({ params, request }) => {
 	const { action } = zx.parseParams(params, {
@@ -258,6 +267,9 @@ export default function Page() {
 			open: timerDrawerOpen,
 		},
 	] = useDisclosure(false);
+	const [supersetWithExerciseIdentifier, setSupersetModalOpened] = useState<
+		string | null
+	>(null);
 	const [
 		reorderDrawerOpened,
 		{ close: reorderDrawerClose, toggle: reorderDrawerToggle },
@@ -266,13 +278,16 @@ export default function Page() {
 	const [currentTimer, setCurrentTimer] = useTimerAtom();
 
 	useInterval(() => {
-		const timeRemaining = currentTimer?.endAt.diff(dayjsLib(), "second");
+		const timeRemaining = dayjsLib(currentTimer?.endAt).diff(
+			dayjsLib(),
+			"second",
+		);
 		if (timeRemaining && timeRemaining <= 3) {
 			if (navigator.vibrate) navigator.vibrate(200);
 			if (timeRemaining <= 1) {
 				playCompleteTimerSound();
-				timerDrawerClose();
 				stopTimer();
+				setTimeout(() => timerDrawerClose(), 500);
 			}
 		}
 	}, 1000);
@@ -282,13 +297,27 @@ export default function Page() {
 		triggeredBy?: { exerciseIdentifier: string; setIdx: number },
 	) => {
 		setCurrentTimer({
+			triggeredBy,
 			totalTime: duration,
-			endAt: dayjsLib().add(duration, "second"),
-			triggeredBy: triggeredBy,
+			endAt: dayjsLib().add(duration, "second").toISOString(),
 		});
 	};
 
-	const stopTimer = () => setCurrentTimer(RESET);
+	const stopTimer = () => {
+		const triggeredBy = currentTimer?.triggeredBy;
+		if (currentWorkout && triggeredBy) {
+			setCurrentWorkout(
+				produce(currentWorkout, (draft) => {
+					const exercise = draft.exercises.find(
+						(e) => e.identifier === triggeredBy.exerciseIdentifier,
+					);
+					const restTimer = exercise?.sets[triggeredBy.setIdx].restTimer;
+					if (exercise && restTimer) restTimer.hasElapsed = true;
+				}),
+			);
+		}
+		setCurrentTimer(RESET);
+	};
 
 	const createUserWorkoutFetcher = useFetcher<typeof action>();
 
@@ -309,40 +338,25 @@ export default function Page() {
 								onClose={reorderDrawerClose}
 								key={currentWorkout.exercises.toString()}
 							/>
+							<DisplaySupersetModal
+								supersetWith={supersetWithExerciseIdentifier}
+								onClose={() => setSupersetModalOpened(null)}
+							/>
 							<Stack ref={parent}>
-								<Group justify="space-between">
-									<TextInput
-										w={loaderData.isCreatingTemplate ? "65%" : "100%"}
-										size="sm"
-										label="Name"
-										placeholder="A name for your workout"
-										value={currentWorkout.name}
-										required
-										onChange={(e) =>
-											setCurrentWorkout(
-												produce(currentWorkout, (draft) => {
-													draft.name = e.currentTarget.value;
-												}),
-											)
-										}
-									/>
-									{loaderData.isCreatingTemplate ? (
-										<NumberInput
-											w="30%"
-											suffix="s"
-											label="Rest timer"
-											value={currentWorkout.defaultRestTimer || undefined}
-											onChange={(v) => {
-												if (v)
-													setCurrentWorkout(
-														produce(currentWorkout, (draft) => {
-															draft.defaultRestTimer = Number(v);
-														}),
-													);
-											}}
-										/>
-									) : undefined}
-								</Group>
+								<TextInput
+									size="sm"
+									label="Name"
+									placeholder="A name for your workout"
+									value={currentWorkout.name}
+									required
+									onChange={(e) =>
+										setCurrentWorkout(
+											produce(currentWorkout, (draft) => {
+												draft.name = e.currentTarget.value;
+											}),
+										)
+									}
+								/>
 								<Textarea
 									size="sm"
 									minRows={2}
@@ -358,7 +372,7 @@ export default function Page() {
 									}
 								/>
 								<Group>
-									<DurationTimer />
+									<WorkoutDurationTimer />
 									<StatDisplay
 										name="Exercises"
 										value={
@@ -540,6 +554,7 @@ export default function Page() {
 										startTimer={startTimer}
 										openTimerDrawer={timerDrawerOpen}
 										reorderDrawerToggle={reorderDrawerToggle}
+										openSupersetModal={(s) => setSupersetModalOpened(s)}
 									/>
 								))}
 								<Group justify="center">
@@ -595,6 +610,9 @@ const StatDisplay = (props: {
 	);
 };
 
+const formatTimerDuration = (duration: number) =>
+	dayjsLib.duration(duration).format("mm:ss");
+
 const offsetDate = (startTime?: string) => {
 	const now = dayjsLib();
 	return now.diff(dayjsLib(startTime), "seconds");
@@ -605,11 +623,11 @@ const RestTimer = () => {
 	const [currentTimer] = useTimerAtom();
 
 	return currentTimer
-		? dayjsLib.duration(currentTimer.endAt.diff(dayjsLib())).format("m:ss")
+		? formatTimerDuration(dayjsLib(currentTimer.endAt).diff(dayjsLib()))
 		: "Timer";
 };
 
-const DurationTimer = () => {
+const WorkoutDurationTimer = () => {
 	const { isCreatingTemplate, isUpdatingWorkout } =
 		useLoaderData<typeof loader>();
 	const [currentWorkout] = useCurrentWorkout();
@@ -710,66 +728,202 @@ const ImageDisplay = (props: { imageSrc: string; removeImage: () => void }) => {
 	);
 };
 
-const SupersetExerciseModal = (props: {
-	exerciseIdx: number;
-	exerciseIdentifier: string;
-	opened: boolean;
-	onClose: () => void;
-}) => {
-	const [currentWorkout, setCurrentWorkout] = useCurrentWorkout();
+const DisplaySupersetModal = ({
+	onClose,
+	supersetWith,
+}: { onClose: () => void; supersetWith: string | null }) => {
+	const [cw] = useCurrentWorkout();
 
-	return currentWorkout ? (
+	const exerciseAlreadyInSuperset = useMemo(() => {
+		if (cw && supersetWith) {
+			const index = cw?.supersets.findIndex((s) =>
+				s.exercises.includes(supersetWith),
+			);
+			if (index !== -1) return [index, cw.supersets[index]] as const;
+		}
+		return undefined;
+	}, [cw, supersetWith]);
+
+	return (
 		<Modal
-			opened={props.opened}
-			onClose={props.onClose}
+			onClose={onClose}
 			withCloseButton={false}
+			opened={isString(supersetWith)}
 		>
-			<Stack>
-				<Text size="lg">
-					Superset {currentWorkout.exercises[props.exerciseIdx].exerciseId}{" "}
-					with:
-				</Text>
-				{currentWorkout.exercises.map((e) => (
-					<Switch
-						key={e.identifier}
-						disabled={e.identifier === props.exerciseIdentifier}
-						onChange={(event) => {
+			{supersetWith ? (
+				exerciseAlreadyInSuperset ? (
+					<EditSupersetModal
+						onClose={onClose}
+						supersetWith={supersetWith}
+						superset={exerciseAlreadyInSuperset}
+					/>
+				) : (
+					<CreateSupersetModal onClose={onClose} supersetWith={supersetWith} />
+				)
+			) : null}
+		</Modal>
+	);
+};
+
+const CreateSupersetModal = (props: {
+	onClose: () => void;
+	supersetWith: string;
+}) => {
+	const [cw, setCurrentWorkout] = useCurrentWorkout();
+	const [exercises, setExercisesHandle] = useListState<string>([
+		props.supersetWith,
+	]);
+	const colors = useGetMantineColors();
+	const [allowedColors, setAllowedColors] = useState<string[]>([]);
+	const [selectedColor, setSelectedColor] = useState<string>("");
+
+	useEffect(() => {
+		if (cw) {
+			const newColors = colors
+				.filter((c) => !["dark", "gray"].includes(c))
+				.filter((c) => !cw.supersets.map((s) => s.color).includes(c));
+			setAllowedColors(newColors);
+			setSelectedColor(newColors[0]);
+		}
+	}, [cw]);
+
+	if (!cw) return null;
+
+	return (
+		<Stack gap="lg">
+			<Group>
+				<Text>Select color</Text>
+				<Select
+					size="xs"
+					value={selectedColor}
+					leftSectionWidth={rem(40)}
+					onChange={(v) => setSelectedColor(v ?? "")}
+					data={allowedColors.map((c) => ({
+						value: c,
+						label: changeCase(c),
+					}))}
+				/>
+			</Group>
+			<Stack gap="xs">
+				{cw.exercises.map((ex) => {
+					const index = exercises.findIndex((e) => e === ex.identifier);
+					return (
+						<Button
+							size="xs"
+							fullWidth
+							key={ex.identifier}
+							color={selectedColor}
+							variant={index !== -1 ? "light" : "outline"}
+							disabled={cw.supersets
+								.flatMap((s) => s.exercises)
+								.includes(ex.identifier)}
+							onClick={() => {
+								if (index !== -1) setExercisesHandle.remove(index);
+								else setExercisesHandle.append(ex.identifier);
+							}}
+						>
+							{ex.exerciseId}
+						</Button>
+					);
+				})}
+			</Stack>
+			<Button
+				disabled={exercises.length <= 1}
+				onClick={() => {
+					setCurrentWorkout(
+						produce(cw, (draft) => {
+							draft.supersets.push({
+								exercises,
+								color: selectedColor,
+								identifier: randomUUID(),
+							});
+						}),
+					);
+					props.onClose();
+				}}
+			>
+				Create superset
+			</Button>
+		</Stack>
+	);
+};
+
+const EditSupersetModal = (props: {
+	onClose: () => void;
+	supersetWith: string;
+	superset: readonly [number, Superset];
+}) => {
+	const [cw, setCurrentWorkout] = useCurrentWorkout();
+	const [exercises, setExercisesHandle] = useListState<string>(
+		props.superset[1].exercises,
+	);
+
+	if (!cw) return null;
+
+	return (
+		<Stack gap="lg">
+			<Text>Editing {props.superset[1].color} superset:</Text>
+			<Stack gap="xs">
+				{cw.exercises.map((ex) => {
+					const index = exercises.findIndex((e) => e === ex.identifier);
+					return (
+						<Button
+							size="xs"
+							fullWidth
+							key={ex.identifier}
+							color={props.superset[1].color}
+							variant={index !== -1 ? "light" : "outline"}
+							disabled={cw.supersets
+								.filter((s) => s.identifier !== props.superset[1].identifier)
+								.flatMap((s) => s.exercises)
+								.includes(ex.identifier)}
+							onClick={() => {
+								if (index !== -1) setExercisesHandle.remove(index);
+								else setExercisesHandle.append(ex.identifier);
+							}}
+						>
+							{ex.exerciseId}
+						</Button>
+					);
+				})}
+			</Stack>
+			<Group wrap="nowrap">
+				<Button
+					color="red"
+					flex="none"
+					onClick={async () => {
+						const yes = await confirmWrapper({
+							confirmation: "Are you sure you want to delete this superset?",
+						});
+						if (yes) {
 							setCurrentWorkout(
-								produce(currentWorkout, (draft) => {
-									const otherExercise = draft.exercises.find(
-										(ex) => ex.identifier === e.identifier,
-									);
-									if (!otherExercise) return;
-									const supersetWith =
-										draft.exercises[props.exerciseIdx].supersetWith;
-									if (event.currentTarget.checked) {
-										supersetWith.push(e.identifier);
-										otherExercise.supersetWith.push(
-											currentWorkout.exercises[props.exerciseIdx].identifier,
-										);
-									} else {
-										draft.exercises[props.exerciseIdx].supersetWith =
-											supersetWith.filter((s) => s !== e.identifier);
-										otherExercise.supersetWith =
-											otherExercise.supersetWith.filter(
-												(s) =>
-													s !==
-													currentWorkout.exercises[props.exerciseIdx]
-														.identifier,
-											);
-									}
+								produce(cw, (draft) => {
+									draft.supersets.splice(props.superset[0], 1);
 								}),
 							);
-						}}
-						label={e.exerciseId}
-						defaultChecked={currentWorkout.exercises[
-							props.exerciseIdx
-						].supersetWith.includes(e.identifier)}
-					/>
-				))}
-			</Stack>
-		</Modal>
-	) : null;
+							props.onClose();
+						}
+					}}
+				>
+					Delete superset
+				</Button>
+				<Button
+					fullWidth
+					disabled={exercises.length <= 1}
+					onClick={() => {
+						setCurrentWorkout(
+							produce(cw, (draft) => {
+								draft.supersets[props.superset[0]].exercises = exercises;
+							}),
+						);
+						props.onClose();
+					}}
+				>
+					Add to superset
+				</Button>
+			</Group>
+		</Stack>
+	);
 };
 
 type FuncStartTimer = (
@@ -784,23 +938,36 @@ const focusOnExercise = (idx: number) => {
 	}, 800);
 };
 
+const exerciseHasDetailsToShow = (
+	details?: ExerciseDetailsQuery["exerciseDetails"],
+	userDetails?: UserExerciseDetailsQuery["userExerciseDetails"],
+) =>
+	(details?.attributes.images.length || 0) > 0 ||
+	(userDetails?.history?.length || 0) > 0;
+
 const ExerciseDisplay = (props: {
 	exerciseIdx: number;
+	stopTimer: () => void;
 	startTimer: FuncStartTimer;
 	openTimerDrawer: () => void;
-	stopTimer: () => void;
 	reorderDrawerToggle: () => void;
+	openSupersetModal: (s: string) => void;
 }) => {
 	const { isCreatingTemplate } = useLoaderData<typeof loader>();
+	const theme = useMantineTheme();
+	const userPreferences = useUserPreferences();
 	const unitSystem = useUserUnitSystem();
+	const navigate = useNavigate();
 	const [parent] = useAutoAnimate();
 	const [currentWorkout, setCurrentWorkout] = useCurrentWorkout();
 	const exercise = useGetExerciseAtIndex(props.exerciseIdx);
 	invariant(exercise);
-	const [currentTimer] = useTimerAtom();
 	const coreDetails = useCoreDetails();
 	const fileUploadAllowed = coreDetails.fileStorageEnabled;
 	const [detailsParent] = useAutoAnimate();
+	const { data: exerciseDetails } = useQuery(
+		getExerciseDetailsQuery(exercise.exerciseId),
+	);
 	const { data: userExerciseDetails } = useQuery(
 		getUserExerciseDetailsQuery(exercise.exerciseId),
 	);
@@ -810,10 +977,6 @@ const ExerciseDisplay = (props: {
 		const sound = new Howl({ src: ["/add-set.mp3"] });
 		sound.play();
 	};
-	const [
-		restTimerModalOpened,
-		{ close: restTimerModalClose, toggle: restTimerModalToggle },
-	] = useDisclosure(false);
 	const [cameraFacing, toggleCameraFacing] = useToggle([
 		"environment",
 		"user",
@@ -823,10 +986,6 @@ const ExerciseDisplay = (props: {
 		assetsModalOpened,
 		{ close: assetsModalClose, toggle: assetsModalToggle },
 	] = useDisclosure(false);
-	const [
-		supersetModalOpened,
-		{ close: supersetModalClose, toggle: supersetModalToggle },
-	] = useDisclosure(false);
 
 	const exerciseHistory = userExerciseDetails?.history;
 	const [durationCol, distanceCol, weightCol, repsCol] = match(exercise.lot)
@@ -838,75 +997,16 @@ const ExerciseDisplay = (props: {
 	const toBeDisplayedColumns =
 		[durationCol, distanceCol, weightCol, repsCol].filter(Boolean).length + 1;
 
-	return currentWorkout ? (
+	if (!currentWorkout) return null;
+
+	const isExerciseComplete =
+		getProgressOfExercise(currentWorkout, props.exerciseIdx) === "complete";
+	const partOfSuperset = currentWorkout.supersets.find((s) =>
+		s.exercises.includes(exercise.identifier),
+	);
+
+	return (
 		<>
-			<SupersetExerciseModal
-				opened={supersetModalOpened}
-				onClose={supersetModalClose}
-				exerciseIdx={props.exerciseIdx}
-				exerciseIdentifier={exercise.identifier}
-			/>
-			<Modal
-				opened={restTimerModalOpened}
-				onClose={restTimerModalClose}
-				withCloseButton={false}
-				size="xs"
-			>
-				<Stack>
-					<Switch
-						label="Enabled"
-						labelPosition="left"
-						styles={{ body: { justifyContent: "space-between" } }}
-						defaultChecked={exercise.restTimer?.enabled}
-						onChange={(v) => {
-							setCurrentWorkout(
-								produce(currentWorkout, (draft) => {
-									const defaultDuration = Number.parseInt(
-										localStorage.getItem(defaultTimerLocalStorageKey) || "20",
-									);
-									draft.exercises[props.exerciseIdx].restTimer = {
-										enabled: v.currentTarget.checked,
-										duration: exercise.restTimer?.duration ?? defaultDuration,
-									};
-								}),
-							);
-						}}
-					/>
-					<NumberInput
-						value={exercise.restTimer?.duration}
-						onChange={(v) => {
-							setCurrentWorkout(
-								produce(currentWorkout, (draft) => {
-									const value = isNumber(v) ? v : null;
-									const restTimer =
-										draft.exercises[props.exerciseIdx].restTimer;
-									if (restTimer && value) {
-										restTimer.duration = value;
-										localStorage.setItem(
-											defaultTimerLocalStorageKey,
-											value.toString(),
-										);
-									}
-								}),
-							);
-						}}
-						disabled={!exercise.restTimer?.enabled}
-						hideControls
-						suffix="s"
-						label="Duration"
-						styles={{
-							root: {
-								display: "flex",
-								alignItems: "center",
-								justifyContent: "space-between",
-							},
-							label: { flex: "none" },
-							input: { width: "90px" },
-						}}
-						ta="right"
-					/>
-				</Stack>
-			</Modal>
 			<Modal
 				opened={assetsModalOpened}
 				onClose={assetsModalClose}
@@ -997,11 +1097,19 @@ const ExerciseDisplay = (props: {
 				</Stack>
 			</Modal>
 			<Paper
-				style={{ scrollMargin: 16 }}
+				radius={0}
+				style={{
+					scrollMargin: 16,
+					borderLeft: partOfSuperset
+						? `3px solid ${theme.colors[partOfSuperset.color][6]}`
+						: undefined,
+				}}
+				pl="sm"
+				ml={{ base: "-md", md: 0 }}
 				id={props.exerciseIdx.toString()}
-				px={{ base: 4, md: "xs", lg: "sm" }}
+				pr={{ base: 4, md: "xs", lg: "sm" }}
 			>
-				<Stack>
+				<Stack ref={parent}>
 					<Menu shadow="md" width={200} position="left-end">
 						<Stack ref={parent}>
 							<Group justify="space-between" pos="relative" wrap="nowrap">
@@ -1015,15 +1123,31 @@ const ExerciseDisplay = (props: {
 								>
 									{exercise.exerciseId}
 								</Anchor>
-								<Menu.Target>
-									<ActionIcon color="blue" mr={-10}>
-										<IconDotsVertical />
+								<Group wrap="nowrap" mr={-10}>
+									<ActionIcon
+										variant="transparent"
+										style={{
+											transition: "rotate 0.3s",
+											rotate: exercise.isCollapsed ? "180deg" : undefined,
+										}}
+										color={isExerciseComplete ? "green" : undefined}
+										onClick={() => {
+											setCurrentWorkout(
+												produce(currentWorkout, (draft) => {
+													draft.exercises[props.exerciseIdx].isCollapsed =
+														!exercise.isCollapsed;
+												}),
+											);
+										}}
+									>
+										<IconChevronUp />
 									</ActionIcon>
-								</Menu.Target>
-								{currentTimer?.triggeredBy?.exerciseIdentifier ===
-								exercise.identifier ? (
-									<RestTimerProgress onClick={props.openTimerDrawer} />
-								) : null}
+									<Menu.Target>
+										<ActionIcon color="blue">
+											<IconDotsVertical size={20} />
+										</ActionIcon>
+									</Menu.Target>
+								</Group>
 							</Group>
 							{exercise.notes.map((note, idx) => (
 								<NoteInput
@@ -1035,17 +1159,6 @@ const ExerciseDisplay = (props: {
 							))}
 						</Stack>
 						<Menu.Dropdown>
-							<Menu.Item
-								leftSection={<IconZzz size={14} />}
-								onClick={restTimerModalToggle}
-								rightSection={
-									exercise.restTimer?.enabled
-										? `${exercise.restTimer.duration}s`
-										: "Off"
-								}
-							>
-								Rest timer
-							</Menu.Item>
 							<Menu.Item
 								leftSection={<IconClipboard size={14} />}
 								rightSection={
@@ -1063,12 +1176,7 @@ const ExerciseDisplay = (props: {
 							</Menu.Item>
 							<Menu.Item
 								leftSection={<IconLayersIntersect size={14} />}
-								onClick={supersetModalToggle}
-								rightSection={
-									exercise.supersetWith.length > 0
-										? exercise.supersetWith.length
-										: "Off"
-								}
+								onClick={() => props.openSupersetModal(exercise.identifier)}
 							>
 								Superset
 							</Menu.Item>
@@ -1082,7 +1190,30 @@ const ExerciseDisplay = (props: {
 							>
 								Images
 							</Menu.Item>
-							{exerciseHasDetailsToShow(exercise) ? (
+							<Menu.Item
+								leftSection={<IconReplace size={14} />}
+								onClick={() => {
+									if (!coreDetails.isPro) {
+										notifications.show({
+											message: PRO_REQUIRED_MESSAGE,
+											color: "red",
+										});
+										return;
+									}
+									setCurrentWorkout(
+										produce(currentWorkout, (draft) => {
+											draft.replacingExerciseIdx = props.exerciseIdx;
+										}),
+									);
+									navigate($path("/fitness/exercises/list"));
+								}}
+							>
+								Replace exercise
+							</Menu.Item>
+							{exerciseHasDetailsToShow(
+								exerciseDetails,
+								userExerciseDetails,
+							) ? (
 								<Menu.Item
 									leftSection={<IconInfoCircle size={14} />}
 									onClick={() => {
@@ -1125,224 +1256,221 @@ const ExerciseDisplay = (props: {
 							</Menu.Item>
 						</Menu.Dropdown>
 					</Menu>
-					<Box ref={parent}>
-						{exercise.isShowDetailsOpen ? (
-							<Box mb="md" ref={detailsParent} pos="relative">
-								{match(exercise.openedDetailsTab)
-									.with("images", undefined, () => (
-										<ScrollArea type="scroll">
-											<Group wrap="nowrap">
-												{exercise.exerciseDetails.images.map((i) => (
-													<Image key={i} radius="md" src={i} h={200} w={350} />
-												))}
-											</Group>
-										</ScrollArea>
-									))
-									.with("history", () => (
-										<Carousel
-											align="start"
-											slideGap="md"
-											withControls={false}
-											style={{ userSelect: "none" }}
-											onSlideChange={setActiveHistoryIdx}
-											slideSize={{ base: "100%", md: "50%" }}
-										>
-											{exerciseHistory?.map((history, idx) => (
-												<Carousel.Slide
-													key={`${history.workoutId}-${history.idx}`}
-												>
-													{getSurroundingElements(
-														exerciseHistory,
-														activeHistoryIdx,
-													).includes(idx) ? (
-														<ExerciseHistory
-															hideExerciseDetails
-															hideExtraDetailsButton
-															exerciseIdx={history.idx}
-															entityId={history.workoutId}
-															entityType={FitnessEntity.Workouts}
-															onCopyButtonClick={async () => {
-																if (!coreDetails.isPro) {
-																	notifications.show({
-																		color: "red",
-																		message:
-																			"Ryot Pro required to copy sets from other workouts",
-																	});
-																	return;
-																}
-																const workout = await getWorkoutDetails(
-																	history.workoutId,
-																);
-																const yes = await confirmWrapper({
-																	confirmation: `Are you sure you want to copy all sets from "${workout.details.name}"?`,
-																});
-																if (yes) {
-																	const sets =
-																		workout.details.information.exercises[
-																			history.idx
-																		].sets;
-																	const converted = sets.map((s) =>
-																		convertHistorySetToCurrentSet(s),
-																	);
-																	setCurrentWorkout(
-																		produce(currentWorkout, (draft) => {
-																			draft.exercises[
-																				props.exerciseIdx
-																			].sets.push(...converted);
-																		}),
-																	);
-																}
-															}}
-														/>
-													) : null}
-												</Carousel.Slide>
-											))}
-										</Carousel>
-									))
-									.exhaustive()}
-								{(userExerciseDetails?.history?.length || 0) > 0 ? (
-									<ActionIcon
-										right={10}
-										bottom={10}
-										variant="filled"
-										color="red"
-										size="sm"
-										pos="absolute"
-										p={2}
-										onClick={() => {
-											if (!coreDetails.isPro) {
-												notifications.show({
-													color: "red",
-													message: PRO_REQUIRED_MESSAGE,
-												});
-												return;
-											}
-											setCurrentWorkout(
-												produce(currentWorkout, (draft) => {
-													draft.exercises[props.exerciseIdx].openedDetailsTab =
-														exercise.openedDetailsTab === "images"
-															? "history"
-															: "images";
-												}),
-											);
-										}}
-									>
+					{exercise.isCollapsed ? null : (
+						<>
+							<Box ref={parent}>
+								{exercise.isShowDetailsOpen ? (
+									<Box mb="md" ref={detailsParent} pos="relative">
 										{match(exercise.openedDetailsTab)
-											.with("images", undefined, () => <IconPhoto />)
-											.with("history", () => <IconClock />)
+											.with("images", undefined, () => (
+												<ScrollArea type="scroll">
+													<Group wrap="nowrap">
+														{exerciseDetails?.attributes.images.map((i) => (
+															<Image
+																key={i}
+																radius="md"
+																src={i}
+																h={200}
+																w={350}
+															/>
+														))}
+													</Group>
+												</ScrollArea>
+											))
+											.with("history", () => (
+												<Carousel
+													align="start"
+													slideGap="md"
+													withControls={false}
+													style={{ userSelect: "none" }}
+													onSlideChange={setActiveHistoryIdx}
+													slideSize={{ base: "100%", md: "50%" }}
+												>
+													{exerciseHistory?.map((history, idx) => (
+														<Carousel.Slide
+															key={`${history.workoutId}-${history.idx}`}
+														>
+															{getSurroundingElements(
+																exerciseHistory,
+																activeHistoryIdx,
+															).includes(idx) ? (
+																<ExerciseHistory
+																	hideExerciseDetails
+																	hideExtraDetailsButton
+																	exerciseIdx={history.idx}
+																	entityId={history.workoutId}
+																	entityType={FitnessEntity.Workouts}
+																	onCopyButtonClick={async () => {
+																		if (!coreDetails.isPro) {
+																			notifications.show({
+																				color: "red",
+																				message:
+																					"Ryot Pro required to copy sets from other workouts",
+																			});
+																			return;
+																		}
+																		const workout = await getWorkoutDetails(
+																			history.workoutId,
+																		);
+																		const yes = await confirmWrapper({
+																			confirmation: `Are you sure you want to copy all sets from "${workout.details.name}"?`,
+																		});
+																		if (yes) {
+																			const sets =
+																				workout.details.information.exercises[
+																					history.idx
+																				].sets;
+																			const converted = sets.map((set) =>
+																				convertHistorySetToCurrentSet(set),
+																			);
+																			setCurrentWorkout(
+																				produce(currentWorkout, (draft) => {
+																					draft.exercises[
+																						props.exerciseIdx
+																					].sets.push(...converted);
+																				}),
+																			);
+																		}
+																	}}
+																/>
+															) : null}
+														</Carousel.Slide>
+													))}
+												</Carousel>
+											))
 											.exhaustive()}
-									</ActionIcon>
+										{(userExerciseDetails?.history?.length || 0) > 0 ? (
+											<ActionIcon
+												right={10}
+												bottom={10}
+												variant="filled"
+												color="red"
+												size="sm"
+												pos="absolute"
+												p={2}
+												onClick={() => {
+													if (!coreDetails.isPro) {
+														notifications.show({
+															color: "red",
+															message: PRO_REQUIRED_MESSAGE,
+														});
+														return;
+													}
+													setCurrentWorkout(
+														produce(currentWorkout, (draft) => {
+															draft.exercises[
+																props.exerciseIdx
+															].openedDetailsTab =
+																exercise.openedDetailsTab === "images"
+																	? "history"
+																	: "images";
+														}),
+													);
+												}}
+											>
+												{match(exercise.openedDetailsTab)
+													.with("images", undefined, () => <IconPhoto />)
+													.with("history", () => <IconClock />)
+													.exhaustive()}
+											</ActionIcon>
+										) : null}
+									</Box>
 								) : null}
+								<Flex justify="space-between" align="center" mb="xs">
+									<Text size="xs" w="5%" ta="center">
+										SET
+									</Text>
+									<Text
+										size="xs"
+										w={`${(isCreatingTemplate ? 95 : 85) / toBeDisplayedColumns}%`}
+										ta="center"
+									>
+										PREVIOUS
+									</Text>
+									{durationCol ? (
+										<Text size="xs" style={{ flex: 1 }} ta="center">
+											DURATION (MIN)
+										</Text>
+									) : null}
+									{distanceCol ? (
+										<Text size="xs" style={{ flex: 1 }} ta="center">
+											DISTANCE (
+											{match(unitSystem)
+												.with(UserUnitSystem.Metric, () => "KM")
+												.with(UserUnitSystem.Imperial, () => "MI")
+												.exhaustive()}
+											)
+										</Text>
+									) : null}
+									{weightCol ? (
+										<Text size="xs" style={{ flex: 1 }} ta="center">
+											WEIGHT (
+											{match(unitSystem)
+												.with(UserUnitSystem.Metric, () => "KG")
+												.with(UserUnitSystem.Imperial, () => "LB")
+												.exhaustive()}
+											)
+										</Text>
+									) : null}
+									{repsCol ? (
+										<Text size="xs" style={{ flex: 1 }} ta="center">
+											REPS
+										</Text>
+									) : null}
+									<Box
+										w="10%"
+										style={isCreatingTemplate ? { display: "none" } : undefined}
+									/>
+								</Flex>
+								{exercise.sets.map((_, idx) => (
+									<SetDisplay
+										setIdx={idx}
+										repsCol={repsCol}
+										weightCol={weightCol}
+										distanceCol={distanceCol}
+										durationCol={durationCol}
+										stopTimer={props.stopTimer}
+										startTimer={props.startTimer}
+										exerciseIdx={props.exerciseIdx}
+										key={`${exercise.identifier}-${idx}`}
+										openTimerDrawer={props.openTimerDrawer}
+										toBeDisplayedColumns={toBeDisplayedColumns}
+									/>
+								))}
 							</Box>
-						) : null}
-						<Flex justify="space-between" align="center" mb="xs">
-							<Text size="xs" w="5%" ta="center">
-								SET
-							</Text>
-							<Text
-								size="xs"
-								w={`${(isCreatingTemplate ? 95 : 85) / toBeDisplayedColumns}%`}
-								ta="center"
+							<Button
+								variant="subtle"
+								onClick={async () => {
+									playAddSetSound();
+									const setLot = SetLot.Normal;
+									const restTimer = await getRestTimerForSet(
+										setLot,
+										exercise.exerciseId,
+										userPreferences.fitness.exercises.setRestTimers,
+									);
+									setCurrentWorkout(
+										produce(currentWorkout, (draft) => {
+											const currentSet =
+												draft.exercises[props.exerciseIdx].sets.at(-1);
+											draft.exercises[props.exerciseIdx].sets.push({
+												lot: setLot,
+												confirmedAt: null,
+												statistic: currentSet?.statistic ?? {},
+												restTimer: restTimer
+													? { duration: restTimer }
+													: undefined,
+											});
+										}),
+									);
+								}}
 							>
-								PREVIOUS
-							</Text>
-							{durationCol ? (
-								<Text size="xs" style={{ flex: 1 }} ta="center">
-									DURATION (MIN)
-								</Text>
-							) : null}
-							{distanceCol ? (
-								<Text size="xs" style={{ flex: 1 }} ta="center">
-									DISTANCE (
-									{match(unitSystem)
-										.with(UserUnitSystem.Metric, () => "KM")
-										.with(UserUnitSystem.Imperial, () => "MI")
-										.exhaustive()}
-									)
-								</Text>
-							) : null}
-							{weightCol ? (
-								<Text size="xs" style={{ flex: 1 }} ta="center">
-									WEIGHT (
-									{match(unitSystem)
-										.with(UserUnitSystem.Metric, () => "KG")
-										.with(UserUnitSystem.Imperial, () => "LB")
-										.exhaustive()}
-									)
-								</Text>
-							) : null}
-							{repsCol ? (
-								<Text size="xs" style={{ flex: 1 }} ta="center">
-									REPS
-								</Text>
-							) : null}
-							<Box
-								w="10%"
-								style={isCreatingTemplate ? { display: "none" } : undefined}
-							/>
-						</Flex>
-						{exercise.sets.map((_, idx) => (
-							<SetDisplay
-								setIdx={idx}
-								repsCol={repsCol}
-								weightCol={weightCol}
-								distanceCol={distanceCol}
-								durationCol={durationCol}
-								stopTimer={props.stopTimer}
-								startTimer={props.startTimer}
-								exerciseIdx={props.exerciseIdx}
-								key={`${exercise.identifier}-${idx}`}
-								toBeDisplayedColumns={toBeDisplayedColumns}
-							/>
-						))}
-					</Box>
-					<Button
-						variant="subtle"
-						onClick={() => {
-							playAddSetSound();
-							setCurrentWorkout(
-								produce(currentWorkout, (draft) => {
-									const currentSet =
-										draft.exercises[props.exerciseIdx].sets.at(-1);
-									draft.exercises[props.exerciseIdx].sets.push({
-										statistic: currentSet?.statistic ?? {},
-										lot: SetLot.Normal,
-										confirmedAt: null,
-									});
-								}),
-							);
-						}}
-					>
-						Add set
-					</Button>
+								Add set
+							</Button>
+						</>
+					)}
 				</Stack>
 			</Paper>
-			<Divider />
 		</>
-	) : null;
-};
-
-const RestTimerProgress = (props: { onClick: () => void }) => {
-	const [currentTimer] = useTimerAtom();
-	forceUpdateEverySecond();
-
-	if (!currentTimer) return null;
-
-	return (
-		<Progress
-			pos="absolute"
-			color="violet"
-			bottom={-6}
-			value={
-				(currentTimer.endAt.diff(dayjsLib(), "seconds") * 100) /
-				currentTimer.totalTime
-			}
-			size="xs"
-			radius="md"
-			w="100%"
-			onClick={props.onClick}
-			style={{ cursor: "pointer" }}
-		/>
 	);
 };
 
@@ -1352,23 +1480,39 @@ const getNextSetInWorkout = (
 	currentSetIdx: number,
 ) => {
 	const currentExercise = currentWorkout.exercises[currentExerciseIdx];
-	if (currentExercise.supersetWith.length === 0) {
-		const isLastSet = currentSetIdx === currentExercise.sets.length - 1;
-		if (isLastSet)
-			return {
-				exerciseIdx: currentExerciseIdx + 1,
-				setIdx: 0,
-				wasLastSet: true,
-			};
+	const partOfSuperset = currentWorkout.supersets.find((superset) =>
+		superset.exercises.includes(currentExercise.identifier),
+	);
+	const areAllSetsConfirmed = currentExercise.sets.every((s) => s.confirmedAt);
+	if (partOfSuperset) {
+		const sortedExercises = sortBy(partOfSuperset.exercises, (s) =>
+			currentWorkout.exercises.findIndex((e) => e.identifier === s),
+		);
+		const nextExerciseWithIncompleteSets = currentWorkout.exercises.find(
+			(e) =>
+				e.identifier !== currentExercise.identifier &&
+				sortedExercises.includes(e.identifier) &&
+				e.sets.some((s) => !s.confirmedAt),
+		);
+		if (nextExerciseWithIncompleteSets) {
+			const exerciseIdx = currentWorkout.exercises.findIndex(
+				(e) => e.identifier === nextExerciseWithIncompleteSets.identifier,
+			);
+			const setIdx = nextExerciseWithIncompleteSets.sets.findIndex(
+				(s) => !s.confirmedAt,
+			);
+			return { exerciseIdx, setIdx: setIdx, wasLastSet: areAllSetsConfirmed };
+		}
+	}
+	if (areAllSetsConfirmed)
 		return {
-			exerciseIdx: currentExerciseIdx,
-			setIdx: currentSetIdx + 1,
-			wasLastSet: false,
+			exerciseIdx: currentExerciseIdx + 1,
+			setIdx: 0,
+			wasLastSet: true,
 		};
-	}
 	return {
 		exerciseIdx: currentExerciseIdx,
-		setIdx: currentSetIdx,
+		setIdx: currentSetIdx + 1,
 		wasLastSet: false,
 	};
 };
@@ -1382,19 +1526,27 @@ const SetDisplay = (props: {
 	distanceCol: boolean;
 	stopTimer: () => void;
 	startTimer: FuncStartTimer;
+	openTimerDrawer: () => void;
 	toBeDisplayedColumns: number;
 }) => {
 	const { isCreatingTemplate } = useLoaderData<typeof loader>();
 	const coreDetails = useCoreDetails();
+	const userPreferences = useUserPreferences();
 	const [currentTimer, _] = useTimerAtom();
+	const [parent] = useAutoAnimate();
 	const [currentWorkout, setCurrentWorkout] = useCurrentWorkout();
-	const highlightedSet = currentWorkout?.highlightedSet;
 	const exercise = useGetExerciseAtIndex(props.exerciseIdx);
+	invariant(exercise);
 	const set = useGetSetAtIndex(props.exerciseIdx, props.setIdx);
+	const [isEditingRestTimer, setIsEditingRestTimer] = useState(false);
 	const [value, setValue] = useDebouncedState(set?.note || "", 500);
-	const isHighlighted =
-		highlightedSet?.exerciseIdx === props.exerciseIdx &&
-		highlightedSet?.setIdx === props.setIdx;
+	const { data: exerciseDetails } = useQuery(
+		getExerciseDetailsQuery(exercise.exerciseId),
+	);
+	const { data: userExerciseDetails } = useQuery(
+		getUserExerciseDetailsQuery(exercise.exerciseId),
+	);
+
 	const playCheckSound = () => {
 		const sound = new Howl({ src: ["/check.mp3"] });
 		sound.play();
@@ -1409,16 +1561,16 @@ const SetDisplay = (props: {
 			);
 	}, [value]);
 
-	return currentWorkout && exercise && set ? (
-		<Paper
-			withBorder
-			id={`${props.exerciseIdx}-${props.setIdx}`}
-			shadow={isHighlighted ? "xl" : undefined}
-			style={{
-				transition: "border-color 0.2s ease-in-out",
-				borderColor: isHighlighted ? undefined : "transparent",
-			}}
-		>
+	if (!currentWorkout || !exercise || !set) return null;
+
+	const didCurrentSetActivateTimer =
+		currentTimer?.triggeredBy?.exerciseIdentifier === exercise.identifier &&
+		currentTimer?.triggeredBy?.setIdx === props.setIdx;
+
+	const hasRestTimerOfThisSetElapsed = set.restTimer?.hasElapsed;
+
+	return (
+		<Paper id={`${props.exerciseIdx}-${props.setIdx}`}>
 			<Flex justify="space-between" align="center" py={4}>
 				<Menu>
 					<Menu.Target>
@@ -1442,12 +1594,19 @@ const SetDisplay = (props: {
 										{lot.at(0)}
 									</Text>
 								}
-								onClick={() => {
+								onClick={async () => {
+									const restTime = await getRestTimerForSet(
+										lot,
+										currentWorkout.exercises[props.exerciseIdx].exerciseId,
+										userPreferences.fitness.exercises.setRestTimers,
+									);
 									setCurrentWorkout(
 										produce(currentWorkout, (draft) => {
-											draft.exercises[props.exerciseIdx].sets[
-												props.setIdx
-											].lot = lot;
+											const currentSet =
+												draft.exercises[props.exerciseIdx].sets[props.setIdx];
+											currentSet.lot = lot;
+											if (!hasRestTimerOfThisSetElapsed && restTime)
+												currentSet.restTimer = { duration: restTime };
 										}),
 									);
 								}}
@@ -1625,39 +1784,39 @@ const SetDisplay = (props: {
 										currentTimer?.triggeredBy?.setIdx === props.setIdx
 									)
 										props.stopTimer();
-									if (
-										exercise.restTimer?.enabled &&
-										newConfirmed &&
-										set.lot !== SetLot.WarmUp
-									) {
-										props.startTimer(exercise.restTimer.duration, {
+									if (set.restTimer && newConfirmed)
+										props.startTimer(set.restTimer.duration, {
 											exerciseIdentifier: exercise.identifier,
 											setIdx: props.setIdx,
 										});
-									}
 									setCurrentWorkout(
 										produce(currentWorkout, (draft) => {
 											const currentExercise =
 												draft.exercises[props.exerciseIdx];
 											currentExercise.sets[props.setIdx].confirmedAt =
 												newConfirmed ? dayjsLib().toISOString() : null;
-											const nextSet = getNextSetInWorkout(
-												currentWorkout,
-												props.exerciseIdx,
-												props.setIdx,
-											);
 											if (newConfirmed) {
+												const nextSet = getNextSetInWorkout(
+													draft,
+													props.exerciseIdx,
+													props.setIdx,
+												);
 												focusOnExercise(nextSet.exerciseIdx);
-												draft.highlightedSet = nextSet;
 												if (nextSet.wasLastSet) {
+													currentExercise.isCollapsed = true;
 													currentExercise.isShowDetailsOpen = false;
 													const nextExercise =
 														draft.exercises[nextSet.exerciseIdx];
 													const nextExerciseHasDetailsToShow =
 														nextExercise &&
-														exerciseHasDetailsToShow(nextExercise);
-													if (nextExerciseHasDetailsToShow)
+														exerciseHasDetailsToShow(
+															exerciseDetails,
+															userExerciseDetails,
+														);
+													if (nextExerciseHasDetailsToShow) {
+														nextExercise.isCollapsed = false;
 														nextExercise.isShowDetailsOpen = true;
+													}
 												}
 											}
 										}),
@@ -1678,8 +1837,113 @@ const SetDisplay = (props: {
 					onChange={(v) => setValue(v.currentTarget.value)}
 				/>
 			) : undefined}
+			<Box mx="xs" my="xs" ref={parent}>
+				{set.restTimer && !didCurrentSetActivateTimer ? (
+					<Divider
+						labelPosition="center"
+						size={hasRestTimerOfThisSetElapsed ? undefined : "lg"}
+						color={hasRestTimerOfThisSetElapsed ? "green" : "blue"}
+						opacity={hasRestTimerOfThisSetElapsed ? 0.5 : undefined}
+						style={{
+							cursor: hasRestTimerOfThisSetElapsed ? undefined : "pointer",
+						}}
+						onClick={() => {
+							if (hasRestTimerOfThisSetElapsed) return;
+							setIsEditingRestTimer(true);
+						}}
+						label={
+							isEditingRestTimer ? (
+								<EditSetRestTimer
+									setIdx={props.setIdx}
+									exerciseIdx={props.exerciseIdx}
+									defaultDuration={set.restTimer.duration}
+									onClickOutside={() => setIsEditingRestTimer(false)}
+								/>
+							) : (
+								<Text
+									size={hasRestTimerOfThisSetElapsed ? "xs" : "sm"}
+									c={hasRestTimerOfThisSetElapsed ? "green" : "blue"}
+									fw={hasRestTimerOfThisSetElapsed ? undefined : "bold"}
+								>
+									{formatTimerDuration(set.restTimer.duration * 1000)}
+								</Text>
+							)
+						}
+					/>
+				) : null}
+				{didCurrentSetActivateTimer ? (
+					<DisplaySetRestTimer
+						currentTimer={currentTimer}
+						onClick={props.openTimerDrawer}
+					/>
+				) : null}
+			</Box>
 		</Paper>
-	) : null;
+	);
+};
+
+const EditSetRestTimer = (props: {
+	setIdx: number;
+	exerciseIdx: number;
+	defaultDuration: number;
+	onClickOutside: () => void;
+}) => {
+	const [currentWorkout, setCurrentWorkout] = useCurrentWorkout();
+	const editRestTimerRef = useRef<HTMLInputElement>(null);
+
+	const [value, setValue] = useDebouncedState(props.defaultDuration, 500);
+
+	useDidUpdate(() => {
+		if (currentWorkout && value)
+			setCurrentWorkout(
+				produce(currentWorkout, (draft) => {
+					const exercise = draft.exercises[props.exerciseIdx];
+					exercise.sets[props.setIdx].restTimer = { duration: value };
+				}),
+			);
+	}, [value]);
+
+	useEffect(() => {
+		editRestTimerRef.current?.select();
+	}, [editRestTimerRef]);
+
+	useOnClickOutside(editRestTimerRef, props.onClickOutside);
+
+	if (!currentWorkout) return null;
+
+	return (
+		<NumberInput
+			size="xs"
+			suffix="s"
+			w={rem(80)}
+			// This will be fixed when https://github.com/mantinedev/mantine/pull/6997 is merged
+			ref={editRestTimerRef}
+			value={props.defaultDuration}
+			onChange={(v) => {
+				if (!v) return;
+				setValue(Number.parseInt(v.toString()));
+			}}
+		/>
+	);
+};
+
+const DisplaySetRestTimer = (props: {
+	onClick: () => void;
+	currentTimer: CurrentWorkoutTimer;
+}) => {
+	forceUpdateEverySecond();
+
+	return (
+		<Progress
+			onClick={props.onClick}
+			transitionDuration={300}
+			style={{ cursor: "pointer" }}
+			value={
+				(dayjsLib(props.currentTimer.endAt).diff(dayjsLib(), "seconds") * 100) /
+				props.currentTimer.totalTime
+			}
+		/>
+	);
 };
 
 const styles = {
@@ -1713,13 +1977,14 @@ const TimerDrawer = (props: {
 				{currentTimer ? (
 					<>
 						<RingProgress
+							roundCaps
 							size={300}
 							thickness={8}
-							roundCaps
 							sections={[
 								{
 									value:
-										(currentTimer.endAt.diff(dayjsLib(), "seconds") * 100) /
+										(dayjsLib(currentTimer.endAt).diff(dayjsLib(), "seconds") *
+											100) /
 										currentTimer.totalTime,
 									color: "orange",
 								},
@@ -1727,14 +1992,12 @@ const TimerDrawer = (props: {
 							label={
 								<>
 									<Text ta="center" fz={64}>
-										{dayjsLib
-											.duration(currentTimer.endAt.diff(dayjsLib()))
-											.format("m:ss")}
+										{formatTimerDuration(
+											dayjsLib(currentTimer.endAt).diff(dayjsLib()),
+										)}
 									</Text>
 									<Text ta="center" c="dimmed" fz="lg" mt="-md">
-										{dayjsLib
-											.duration(currentTimer.totalTime * 1000)
-											.format("m:ss")}
+										{formatTimerDuration(currentTimer.totalTime * 1000)}
 									</Text>
 								</>
 							}
@@ -1746,7 +2009,9 @@ const TimerDrawer = (props: {
 									setCurrentTimer(
 										produce(currentTimer, (draft) => {
 											if (draft) {
-												draft.endAt = draft.endAt.subtract(30, "seconds");
+												draft.endAt = dayjsLib(draft.endAt)
+													.subtract(30, "seconds")
+													.toISOString();
 												draft.totalTime -= 30;
 											}
 										}),
@@ -1754,7 +2019,9 @@ const TimerDrawer = (props: {
 								}}
 								size="compact-lg"
 								variant="outline"
-								disabled={currentTimer.endAt.diff(dayjsLib(), "seconds") <= 30}
+								disabled={
+									dayjsLib(currentTimer.endAt).diff(dayjsLib(), "seconds") <= 30
+								}
 							>
 								-30 sec
 							</Button>
@@ -1764,7 +2031,9 @@ const TimerDrawer = (props: {
 									setCurrentTimer(
 										produce(currentTimer, (draft) => {
 											if (draft) {
-												draft.endAt = draft.endAt.add(30, "seconds");
+												draft.endAt = dayjsLib(draft.endAt)
+													.add(30, "seconds")
+													.toISOString();
 												draft.totalTime += 30;
 											}
 										}),
@@ -1834,6 +2103,15 @@ const TimerDrawer = (props: {
 	);
 };
 
+const getProgressOfExercise = (cw: InProgressWorkout, index: number) => {
+	const isCompleted = cw.exercises[index].sets.every((s) => s.confirmedAt);
+	return isCompleted
+		? ("complete" as const)
+		: cw.exercises[index].sets.some((s) => s.confirmedAt)
+			? ("in-progress" as const)
+			: ("not-started" as const);
+};
+
 const ReorderDrawer = (props: { opened: boolean; onClose: () => void }) => {
 	const [currentWorkout, setCurrentWorkout] = useCurrentWorkout();
 	const [exerciseElements, exerciseElementsHandlers] = useListState(
@@ -1857,15 +2135,6 @@ const ReorderDrawer = (props: { opened: boolean; onClose: () => void }) => {
 		}
 	}, [exerciseElements]);
 
-	const getProgressOfExercise = (cw: InProgressWorkout, index: number) => {
-		const isCompleted = cw.exercises[index].sets.every((s) => s.confirmedAt);
-		return isCompleted
-			? ("complete" as const)
-			: cw.exercises[index].sets.some((s) => s.confirmedAt)
-				? ("in-progress" as const)
-				: ("not-started" as const);
-	};
-
 	return currentWorkout ? (
 		<Drawer
 			onClose={props.onClose}
diff --git a/apps/frontend/app/routes/_dashboard.fitness.$entity.$id._index.tsx b/apps/frontend/app/routes/_dashboard.fitness.$entity.$id._index.tsx
index cd800eff66..e7494c1f32 100644
--- a/apps/frontend/app/routes/_dashboard.fitness.$entity.$id._index.tsx
+++ b/apps/frontend/app/routes/_dashboard.fitness.$entity.$id._index.tsx
@@ -24,9 +24,9 @@ import {
 	DeleteUserWorkoutDocument,
 	DeleteUserWorkoutTemplateDocument,
 	EntityLot,
-	UpdateUserWorkoutDocument,
+	UpdateUserWorkoutAttributesDocument,
+	UserWorkoutDetailsDocument,
 	UserWorkoutTemplateDetailsDocument,
-	WorkoutDetailsDocument,
 } from "@ryot/generated/graphql/backend/graphql";
 import {
 	changeCase,
@@ -89,49 +89,50 @@ export const loader = unstable_defineLoader(async ({ request, params }) => {
 	});
 	const resp = await match(entity)
 		.with(FitnessEntity.Workouts, async () => {
-			const [{ workoutDetails }] = await Promise.all([
-				serverGqlService.authenticatedRequest(request, WorkoutDetailsDocument, {
-					workoutId: entityId,
-				}),
+			const [{ userWorkoutDetails }] = await Promise.all([
+				serverGqlService.authenticatedRequest(
+					request,
+					UserWorkoutDetailsDocument,
+					{ workoutId: entityId },
+				),
 			]);
 			let repeatedWorkout = null;
-			if (workoutDetails.details.repeatedFrom) {
-				const { workoutDetails: repeatedWorkoutData } =
+			if (userWorkoutDetails.details.repeatedFrom) {
+				const { userWorkoutDetails: repeatedWorkoutData } =
 					await serverGqlService.authenticatedRequest(
 						request,
-						WorkoutDetailsDocument,
-						{ workoutId: workoutDetails.details.repeatedFrom },
+						UserWorkoutDetailsDocument,
+						{ workoutId: userWorkoutDetails.details.repeatedFrom },
 					);
 				repeatedWorkout = {
-					id: workoutDetails.details.repeatedFrom,
+					id: userWorkoutDetails.details.repeatedFrom,
 					name: repeatedWorkoutData.details.name,
 					doneOn: repeatedWorkoutData.details.startTime,
 				};
 			}
 			let template = null;
-			if (workoutDetails.details.templateId) {
+			if (userWorkoutDetails.details.templateId) {
 				const { userWorkoutTemplateDetails } =
 					await serverGqlService.authenticatedRequest(
 						request,
 						UserWorkoutTemplateDetailsDocument,
-						{ workoutTemplateId: workoutDetails.details.templateId },
+						{ workoutTemplateId: userWorkoutDetails.details.templateId },
 					);
 				template = {
-					id: workoutDetails.details.templateId,
+					id: userWorkoutDetails.details.templateId,
 					name: userWorkoutTemplateDetails.details.name,
 				};
 			}
 			return {
-				entityName: workoutDetails.details.name,
-				startTime: workoutDetails.details.startTime,
-				endTime: workoutDetails.details.endTime,
-				duration: workoutDetails.details.duration,
-				information: workoutDetails.details.information,
-				summary: workoutDetails.details.summary,
+				entityName: userWorkoutDetails.details.name,
+				startTime: userWorkoutDetails.details.startTime,
+				endTime: userWorkoutDetails.details.endTime,
+				duration: userWorkoutDetails.details.duration,
+				information: userWorkoutDetails.details.information,
+				summary: userWorkoutDetails.details.summary,
 				repeatedWorkout: repeatedWorkout,
 				template,
-				collections: workoutDetails.collections,
-				defaultRestTimer: undefined,
+				collections: userWorkoutDetails.collections,
 			};
 		})
 		.with(FitnessEntity.Templates, async () => {
@@ -151,7 +152,6 @@ export const loader = unstable_defineLoader(async ({ request, params }) => {
 				repeatedWorkout: null,
 				template: null,
 				collections: userWorkoutTemplateDetails.collections,
-				defaultRestTimer: userWorkoutTemplateDetails.details.defaultRestTimer,
 			};
 		})
 		.exhaustive();
@@ -169,7 +169,7 @@ export const action = unstable_defineAction(async ({ request }) => {
 			const submission = processSubmission(formData, editWorkoutSchema);
 			await serverGqlService.authenticatedRequest(
 				request,
-				UpdateUserWorkoutDocument,
+				UpdateUserWorkoutAttributesDocument,
 				{ input: submission },
 			);
 			return Response.json({ status: "success", submission } as const, {
@@ -237,12 +237,11 @@ export default function Page() {
 		templateId?: string;
 		updateWorkoutId?: string;
 		updateWorkoutTemplateId?: string;
-		defaultRestTimer?: number | null;
 	}) => {
 		setIsWorkoutLoading(true);
 		const workout = await duplicateOldWorkout(
-			loaderData.information,
 			loaderData.entityName,
+			loaderData.information,
 			coreDetails,
 			params,
 		);
@@ -262,8 +261,8 @@ export default function Page() {
 					<Form
 						replace
 						method="POST"
-						action={withQuery("", { intent: "edit" })}
 						onSubmit={() => adjustTimeModalClose()}
+						action={withQuery(".", { intent: "edit" })}
 					>
 						<Stack>
 							<Title order={3}>Adjust times</Title>
@@ -310,7 +309,6 @@ export default function Page() {
 													performDecision({
 														action: FitnessAction.LogWorkout,
 														templateId: loaderData.entityId,
-														defaultRestTimer: loaderData.defaultRestTimer,
 													})
 												}
 												leftSection={<IconPlayerPlay size={14} />}
@@ -322,7 +320,6 @@ export default function Page() {
 													performDecision({
 														action: FitnessAction.CreateTemplate,
 														updateWorkoutTemplateId: loaderData.entityId,
-														defaultRestTimer: loaderData.defaultRestTimer,
 													})
 												}
 												leftSection={<IconPencil size={14} />}
@@ -349,7 +346,6 @@ export default function Page() {
 													performDecision({
 														action: FitnessAction.UpdateWorkout,
 														updateWorkoutId: loaderData.entityId,
-														defaultRestTimer: loaderData.defaultRestTimer,
 													})
 												}
 												leftSection={<IconPencil size={14} />}
@@ -398,7 +394,7 @@ export default function Page() {
 								</Menu.Item>
 								<Form
 									method="POST"
-									action={withQuery("", { intent: "delete" })}
+									action={withQuery(".", { intent: "delete" })}
 								>
 									<input
 										type="hidden"
@@ -501,12 +497,6 @@ export default function Page() {
 									)}
 								/>
 							) : null}
-							{loaderData.defaultRestTimer ? (
-								<DisplayStat
-									icon={<IconZzz size={16} />}
-									data={`${loaderData.defaultRestTimer}s`}
-								/>
-							) : null}
 							{loaderData.summary.total ? (
 								<>
 									{Number(loaderData.summary.total.weight) !== 0 ? (
@@ -563,8 +553,9 @@ export default function Page() {
 						<ExerciseHistory
 							exerciseIdx={idx}
 							entityId={loaderData.entityId}
-							key={`${exercise.name}-${idx}`}
 							entityType={loaderData.entity}
+							key={`${exercise.name}-${idx}`}
+							supersetInformation={loaderData.information.supersets}
 						/>
 					))}
 				</Stack>
diff --git a/apps/frontend/app/routes/_dashboard.fitness.$entity.list.tsx b/apps/frontend/app/routes/_dashboard.fitness.$entity.list.tsx
index 3bc4d38587..e5f3ab0af1 100644
--- a/apps/frontend/app/routes/_dashboard.fitness.$entity.list.tsx
+++ b/apps/frontend/app/routes/_dashboard.fitness.$entity.list.tsx
@@ -260,7 +260,7 @@ export default function Page() {
 										{workout.summary.exercises.map((exercise, idx) => (
 											<ExerciseDisplay
 												exercise={exercise}
-												key={`${idx}-${exercise.id}`}
+												key={`${idx}-${exercise.name}`}
 											/>
 										))}
 									</Accordion.Panel>
@@ -317,7 +317,7 @@ const ExerciseDisplay = (props: {
 				{props.exercise.numSets} ×
 			</Text>
 			<Text style={{ flex: 1 }} fz="sm">
-				{props.exercise.id}
+				{props.exercise.name}
 			</Text>
 			{stat ? <Text fz="sm">{stat}</Text> : null}
 		</Flex>
diff --git a/apps/frontend/app/routes/_dashboard.fitness.exercises.$action.tsx b/apps/frontend/app/routes/_dashboard.fitness.exercises.$action.tsx
index 9a747744cb..38c48335fb 100644
--- a/apps/frontend/app/routes/_dashboard.fitness.exercises.$action.tsx
+++ b/apps/frontend/app/routes/_dashboard.fitness.exercises.$action.tsx
@@ -39,6 +39,7 @@ import { $path } from "remix-routes";
 import { namedAction } from "remix-utils/named-action";
 import invariant from "tiny-invariant";
 import { match } from "ts-pattern";
+import { withQuery } from "ufo";
 import { z } from "zod";
 import { zx } from "zodix";
 import { useCoreDetails } from "~/lib/hooks";
@@ -170,7 +171,12 @@ export default function Page() {
 
 	return (
 		<Container>
-			<Form method="POST" encType="multipart/form-data" replace>
+			<Form
+				replace
+				method="POST"
+				encType="multipart/form-data"
+				action={withQuery(".", { intent: loaderData.action })}
+			>
 				<Stack>
 					<Title>{title} Exercise</Title>
 					{loaderData.details?.id ? (
@@ -180,7 +186,6 @@ export default function Page() {
 							defaultValue={loaderData.details.id}
 						/>
 					) : null}
-					<input type="hidden" name="intent" value={loaderData.action} />
 					<TextInput
 						label="Name"
 						required
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 362914b10c..ea8c204844 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
@@ -11,6 +11,8 @@ import {
 	Group,
 	Image,
 	List,
+	Modal,
+	NumberInput,
 	Paper,
 	ScrollArea,
 	Select,
@@ -21,17 +23,25 @@ import {
 	Title,
 	rem,
 } from "@mantine/core";
-import { unstable_defineLoader } from "@remix-run/node";
+import { useDisclosure } from "@mantine/hooks";
+import { unstable_defineAction, unstable_defineLoader } from "@remix-run/node";
 import type { MetaArgs_SingleFetch } from "@remix-run/react";
-import { Link, useLoaderData, useNavigate } from "@remix-run/react";
+import { Form, Link, useLoaderData, useNavigate } from "@remix-run/react";
 import {
 	EntityLot,
 	ExerciseDetailsDocument,
 	ExerciseSource,
+	UpdateUserExerciseSettingsDocument,
 	UserExerciseDetailsDocument,
 	WorkoutSetPersonalBest,
 } from "@ryot/generated/graphql/backend/graphql";
-import { changeCase, sortBy, startCase } from "@ryot/ts-utils";
+import {
+	changeCase,
+	isNumber,
+	snakeCase,
+	sortBy,
+	startCase,
+} from "@ryot/ts-utils";
 import {
 	IconChartPie,
 	IconCheck,
@@ -68,6 +78,7 @@ import {
 	getDateFromTimeSpan,
 } from "~/lib/generals";
 import {
+	useComplexJsonUpdate,
 	useUserDetails,
 	useUserPreferences,
 	useUserUnitSystem,
@@ -79,6 +90,7 @@ import {
 } from "~/lib/state/fitness";
 import { useAddEntityToCollection, useReviewEntity } from "~/lib/state/media";
 import {
+	createToastHeaders,
 	getCachedExerciseParameters,
 	getWorkoutCookieValue,
 	serverGqlService,
@@ -90,8 +102,10 @@ const searchParamsSchema = z.object({
 
 export type SearchParams = z.infer<typeof searchParamsSchema>;
 
+const paramsSchema = { id: z.string() };
+
 export const loader = unstable_defineLoader(async ({ params, request }) => {
-	const { id: exerciseId } = zx.parseParams(params, { id: z.string() });
+	const { id: exerciseId } = zx.parseParams(params, paramsSchema);
 	const query = zx.parseQuery(request, searchParamsSchema);
 	const workoutInProgress = !!getWorkoutCookieValue(request);
 	const [exerciseParameters, { exerciseDetails }, { userExerciseDetails }] =
@@ -118,6 +132,32 @@ export const meta = ({ data }: MetaArgs_SingleFetch<typeof loader>) => {
 	return [{ title: `${data?.exerciseDetails.id} | Ryot` }];
 };
 
+export const action = unstable_defineAction(async ({ params, request }) => {
+	const { id: exerciseId } = zx.parseParams(params, paramsSchema);
+	const entries = Object.entries(Object.fromEntries(await request.formData()));
+	const submission = [];
+	for (const [property, value] of entries) {
+		if (property.includes("."))
+			submission.push({
+				property,
+				value: value.toString(),
+			});
+	}
+	for (const change of submission) {
+		await serverGqlService.authenticatedRequest(
+			request,
+			UpdateUserExerciseSettingsDocument,
+			{ input: { change, exerciseId } },
+		);
+	}
+	return Response.json({ status: "success" } as const, {
+		headers: await createToastHeaders({
+			type: "success",
+			message: "Preferences updated",
+		}),
+	});
+});
+
 export default function Page() {
 	const loaderData = useLoaderData<typeof loader>();
 	const userPreferences = useUserPreferences();
@@ -135,6 +175,12 @@ export default function Page() {
 		"ExerciseChartTimeSpan",
 		TimeSpan.Last90Days,
 	);
+	const [_r, setEntityToReview] = useReviewEntity();
+	const [
+		updatePreferencesModalOpened,
+		{ open: openUpdatePreferencesModal, close: closeUpdatePreferencesModal },
+	] = useDisclosure(false);
+	const { toUpdatePreferences, appendPref } = useComplexJsonUpdate();
 	const computedDateAfterForCharts = getDateFromTimeSpan(timeSpanForCharts);
 	const filteredHistoryForCharts = sortBy(
 		loaderData.userExerciseDetails.history || [],
@@ -149,393 +195,472 @@ export default function Page() {
 		loaderData.exerciseParameters.lotMapping.find(
 			(lm) => lm.lot === loaderData.exerciseDetails.lot,
 		)?.bests || [];
-	const [_r, setEntityToReview] = useReviewEntity();
 
 	return (
-		<Container size="xs" px="lg">
-			<Stack>
-				<Title id="exercise-title">{loaderData.exerciseDetails.id}</Title>
-				{loaderData.userExerciseDetails.collections.length > 0 ? (
-					<Group id="entity-collections">
-						{loaderData.userExerciseDetails.collections.map((col) => (
-							<DisplayCollection
-								col={col}
-								key={col.id}
-								creatorUserId={col.userId}
-								entityLot={EntityLot.Exercise}
-								entityId={loaderData.exerciseDetails.id}
+		<>
+			<Modal
+				opened={updatePreferencesModalOpened}
+				onClose={() => closeUpdatePreferencesModal()}
+				withCloseButton={false}
+				centered
+			>
+				<Form method="POST" onSubmit={() => closeUpdatePreferencesModal()}>
+					<Stack>
+						{toUpdatePreferences.map((pref) => (
+							<input
+								hidden
+								readOnly
+								key={pref[0]}
+								name={pref[0]}
+								value={pref[1]}
 							/>
 						))}
-					</Group>
-				) : null}
-				<Tabs
-					variant="outline"
-					keepMounted={false}
-					defaultValue={loaderData.query.defaultTab || "overview"}
-				>
-					<Tabs.List mb="xs">
-						<Tabs.Tab
-							value="overview"
-							leftSection={<IconInfoCircle size={16} />}
-						>
-							Overview
-						</Tabs.Tab>
-						{exerciseNumTimesInteracted > 0 ? (
+						<Title order={3}>Rest timers</Title>
+						<Text size="sm">
+							When a new set is added, rest timers will be added automatically
+							according to the settings below.
+							<Text size="xs" c="dimmed" span>
+								{" "}
+								Default rest timer durations for all exercises can be changed in
+								the fitness preferences.
+							</Text>
+						</Text>
+						<SimpleGrid cols={2}>
+							{(["normal", "warmup", "drop", "failure"] as const).map(
+								(name) => {
+									const value =
+										loaderData.userExerciseDetails.details
+											?.exerciseExtraInformation?.settings.setRestTimers[name];
+									return (
+										<NumberInput
+											suffix="s"
+											key={name}
+											label={changeCase(snakeCase(name))}
+											defaultValue={isNumber(value) ? value : undefined}
+											onChange={(val) => {
+												if (isNumber(val))
+													appendPref(
+														`set_rest_timers.${snakeCase(name)}`,
+														String(val),
+													);
+											}}
+										/>
+									);
+								},
+							)}
+						</SimpleGrid>
+						<Button type="submit">Save settings for exercise</Button>
+					</Stack>
+				</Form>
+			</Modal>
+			<Container size="xs" px="lg">
+				<Stack>
+					<Title id="exercise-title">{loaderData.exerciseDetails.id}</Title>
+					{loaderData.userExerciseDetails.collections.length > 0 ? (
+						<Group id="entity-collections">
+							{loaderData.userExerciseDetails.collections.map((col) => (
+								<DisplayCollection
+									col={col}
+									key={col.id}
+									creatorUserId={col.userId}
+									entityLot={EntityLot.Exercise}
+									entityId={loaderData.exerciseDetails.id}
+								/>
+							))}
+						</Group>
+					) : null}
+					<Tabs
+						variant="outline"
+						keepMounted={false}
+						defaultValue={loaderData.query.defaultTab || "overview"}
+					>
+						<Tabs.List mb="xs">
 							<Tabs.Tab
-								value="history"
-								leftSection={<IconHistoryToggle size={16} />}
+								value="overview"
+								leftSection={<IconInfoCircle size={16} />}
 							>
-								History
+								Overview
 							</Tabs.Tab>
-						) : null}
-						{exerciseNumTimesInteracted > 0 ? (
-							<>
+							{exerciseNumTimesInteracted > 0 ? (
 								<Tabs.Tab
-									value="records"
-									leftSection={<IconTrophy size={16} />}
+									value="history"
+									leftSection={<IconHistoryToggle size={16} />}
 								>
-									Records
+									History
 								</Tabs.Tab>
+							) : null}
+							{exerciseNumTimesInteracted > 0 ? (
+								<>
+									<Tabs.Tab
+										value="records"
+										leftSection={<IconTrophy size={16} />}
+									>
+										Records
+									</Tabs.Tab>
+									<Tabs.Tab
+										value="charts"
+										leftSection={<IconChartPie size={16} />}
+									>
+										Charts
+									</Tabs.Tab>
+								</>
+							) : null}
+							<Tabs.Tab value="actions" leftSection={<IconUser size={16} />}>
+								Actions
+							</Tabs.Tab>
+							{!userPreferences.general.disableReviews ? (
 								<Tabs.Tab
-									value="charts"
-									leftSection={<IconChartPie size={16} />}
+									value="reviews"
+									leftSection={<IconMessageCircle2 size={16} />}
 								>
-									Charts
+									Reviews
 								</Tabs.Tab>
-							</>
-						) : null}
-						<Tabs.Tab value="actions" leftSection={<IconUser size={16} />}>
-							Actions
-						</Tabs.Tab>
-						{!userPreferences.general.disableReviews ? (
-							<Tabs.Tab
-								value="reviews"
-								leftSection={<IconMessageCircle2 size={16} />}
-							>
-								Reviews
-							</Tabs.Tab>
-						) : null}
-					</Tabs.List>
-					<Tabs.Panel value="overview">
-						<Stack>
-							<ScrollArea>
-								<Flex gap={6}>
-									{loaderData.exerciseDetails.attributes.images.map((i) => (
-										<Image key={i} radius="md" src={i} h="200px" w="248px" />
-									))}
-								</Flex>
-							</ScrollArea>
-							<SimpleGrid py="xs" cols={4}>
-								{(["level", "force", "mechanic", "equipment"] as const).map(
-									(f) => (
-										<Fragment key={f}>
-											{loaderData.exerciseDetails[f] ? (
+							) : null}
+						</Tabs.List>
+						<Tabs.Panel value="overview">
+							<Stack>
+								<ScrollArea>
+									<Flex gap={6}>
+										{loaderData.exerciseDetails.attributes.images.map((i) => (
+											<Image key={i} radius="md" src={i} h="200px" w="248px" />
+										))}
+									</Flex>
+								</ScrollArea>
+								<SimpleGrid py="xs" cols={4}>
+									{(["level", "force", "mechanic", "equipment"] as const).map(
+										(f) => (
+											<Fragment key={f}>
+												{loaderData.exerciseDetails[f] ? (
+													<DisplayData
+														name={f}
+														data={loaderData.exerciseDetails[f]}
+													/>
+												) : null}
+											</Fragment>
+										),
+									)}
+									{loaderData.exerciseDetails.lot ? (
+										<DisplayData
+											name="Type"
+											data={changeCase(loaderData.exerciseDetails.lot)}
+										/>
+									) : null}
+									{exerciseNumTimesInteracted > 0 ? (
+										<DisplayData
+											name="Times done"
+											data={`${exerciseNumTimesInteracted} times`}
+											noCasing
+										/>
+									) : null}
+									{(loaderData.userExerciseDetails.history?.length || 0) > 0 ? (
+										<>
+											{loaderData.userExerciseDetails.details?.createdOn ? (
 												<DisplayData
-													name={f}
-													data={loaderData.exerciseDetails[f]}
+													name="First done on"
+													data={dayjsLib(
+														loaderData.userExerciseDetails.details.createdOn,
+													).format("ll")}
+													noCasing
 												/>
 											) : null}
-										</Fragment>
-									),
-								)}
-								{loaderData.exerciseDetails.lot ? (
-									<DisplayData
-										name="Type"
-										data={changeCase(loaderData.exerciseDetails.lot)}
-									/>
-								) : null}
-								{exerciseNumTimesInteracted > 0 ? (
-									<DisplayData
-										name="Times done"
-										data={`${exerciseNumTimesInteracted} times`}
-										noCasing
-									/>
-								) : null}
-								{loaderData.userExerciseDetails.details?.createdOn ? (
-									<DisplayData
-										name="First done on"
-										data={dayjsLib(
-											loaderData.userExerciseDetails.details.createdOn,
-										).format("ll")}
-										noCasing
-									/>
-								) : null}
-								{loaderData.userExerciseDetails.details?.lastUpdatedOn ? (
-									<DisplayData
-										name="Last done on"
-										data={dayjsLib(
-											loaderData.userExerciseDetails.details.lastUpdatedOn,
-										).format("ll")}
-										noCasing
-									/>
+											{loaderData.userExerciseDetails.details?.lastUpdatedOn ? (
+												<DisplayData
+													name="Last done on"
+													data={dayjsLib(
+														loaderData.userExerciseDetails.details
+															.lastUpdatedOn,
+													).format("ll")}
+													noCasing
+												/>
+											) : null}
+										</>
+									) : null}
+								</SimpleGrid>
+								{loaderData.exerciseDetails.muscles.length > 0 ? (
+									<>
+										<Divider />
+										<Group wrap="nowrap">
+											<Text c="dimmed" fz="sm">
+												Muscles
+											</Text>
+											<Text fz="sm">
+												{loaderData.exerciseDetails.muscles
+													.map((s) => startCase(s.toLowerCase()))
+													.join(", ")}
+											</Text>
+										</Group>
+									</>
 								) : null}
-							</SimpleGrid>
-							{loaderData.exerciseDetails.muscles.length > 0 ? (
-								<>
-									<Divider />
-									<Group wrap="nowrap">
-										<Text c="dimmed" fz="sm">
-											Muscles
-										</Text>
-										<Text fz="sm">
-											{loaderData.exerciseDetails.muscles
-												.map((s) => startCase(s.toLowerCase()))
-												.join(", ")}
+								{loaderData.exerciseDetails.attributes.instructions.length >
+								0 ? (
+									<>
+										<Divider />
+										<Text size="xl" fw="bold">
+											Instructions
 										</Text>
-									</Group>
-								</>
-							) : null}
-							{loaderData.exerciseDetails.attributes.instructions.length > 0 ? (
-								<>
-									<Divider />
-									<Text size="xl" fw="bold">
-										Instructions
-									</Text>
-									<List type="ordered" spacing="xs">
-										{loaderData.exerciseDetails.attributes.instructions.map(
-											(d) => (
-												<List.Item key={d}>{d}</List.Item>
-											),
-										)}
-									</List>
-								</>
-							) : null}
-						</Stack>
-					</Tabs.Panel>
-					{loaderData.userExerciseDetails.history ? (
-						<Tabs.Panel value="history" h="68vh">
-							<Virtuoso
-								data={loaderData.userExerciseDetails.history}
-								itemContent={(index, history) => (
-									<Box mt={index !== 0 ? "md" : undefined}>
-										<ExerciseHistory
-											hideExerciseDetails
-											key={history.workoutId}
-											exerciseIdx={history.idx}
-											entityId={history.workoutId}
-											entityType={FitnessEntity.Workouts}
-										/>
-									</Box>
-								)}
-							/>
+										<List type="ordered" spacing="xs">
+											{loaderData.exerciseDetails.attributes.instructions.map(
+												(d) => (
+													<List.Item key={d}>{d}</List.Item>
+												),
+											)}
+										</List>
+									</>
+								) : null}
+							</Stack>
 						</Tabs.Panel>
-					) : null}
-					{loaderData.userExerciseDetails.details?.exerciseExtraInformation ? (
-						<>
-							<Tabs.Panel value="records">
-								<Stack gap="xl">
-									<Stack gap="xs">
-										<Text size="lg" td="underline">
-											Lifetime Stats
-										</Text>
-										<Box>
-											<DisplayLifetimeStatistic
-												stat="weight"
-												val={displayWeightWithUnit(
-													unitSystem,
-													loaderData.userExerciseDetails.details
-														.exerciseExtraInformation.lifetimeStats.weight,
-												)}
-											/>
-											<DisplayLifetimeStatistic
-												stat="distance"
-												val={displayDistanceWithUnit(
-													unitSystem,
-													loaderData.userExerciseDetails.details
-														.exerciseExtraInformation.lifetimeStats.distance,
-												)}
-											/>
-											<DisplayLifetimeStatistic
-												stat="duration"
-												val={`${loaderData.userExerciseDetails.details.exerciseExtraInformation.lifetimeStats.duration} MIN`}
-											/>
-											<DisplayLifetimeStatistic
-												stat="reps"
-												val={
-													loaderData.userExerciseDetails.details
-														.exerciseExtraInformation.lifetimeStats.reps
-												}
-											/>
-											<DisplayLifetimeStatistic
-												stat="times done"
-												val={exerciseNumTimesInteracted}
+						{loaderData.userExerciseDetails.history ? (
+							<Tabs.Panel value="history" h="68vh">
+								<Virtuoso
+									data={loaderData.userExerciseDetails.history}
+									itemContent={(index, history) => (
+										<Box mt={index !== 0 ? "md" : undefined}>
+											<ExerciseHistory
+												hideExerciseDetails
+												key={history.workoutId}
+												exerciseIdx={history.idx}
+												entityId={history.workoutId}
+												entityType={FitnessEntity.Workouts}
 											/>
 										</Box>
-									</Stack>
-									{loaderData.userExerciseDetails.details
-										.exerciseExtraInformation.personalBests.length > 0 ? (
-										<Stack gap="sm">
+									)}
+								/>
+							</Tabs.Panel>
+						) : null}
+						{loaderData.userExerciseDetails.details
+							?.exerciseExtraInformation ? (
+							<>
+								<Tabs.Panel value="records">
+									<Stack gap="xl">
+										<Stack gap="xs">
 											<Text size="lg" td="underline">
-												Personal Bests
+												Lifetime Stats
 											</Text>
-											{loaderData.userExerciseDetails.details.exerciseExtraInformation.personalBests.map(
-												(personalBest) => (
-													<Box key={personalBest.lot}>
-														<Text size="sm" c="dimmed">
-															{changeCase(personalBest.lot)}
-														</Text>
-														{personalBest.sets.map((pbSet) => (
-															<DisplayPersonalBest
-																set={pbSet}
-																key={pbSet.workoutId}
-																personalBestLot={personalBest.lot}
-															/>
-														))}
-													</Box>
-												),
-											)}
+											<Box>
+												<DisplayLifetimeStatistic
+													stat="weight"
+													val={displayWeightWithUnit(
+														unitSystem,
+														loaderData.userExerciseDetails.details
+															.exerciseExtraInformation.lifetimeStats.weight,
+													)}
+												/>
+												<DisplayLifetimeStatistic
+													stat="distance"
+													val={displayDistanceWithUnit(
+														unitSystem,
+														loaderData.userExerciseDetails.details
+															.exerciseExtraInformation.lifetimeStats.distance,
+													)}
+												/>
+												<DisplayLifetimeStatistic
+													stat="duration"
+													val={`${loaderData.userExerciseDetails.details.exerciseExtraInformation.lifetimeStats.duration} MIN`}
+												/>
+												<DisplayLifetimeStatistic
+													stat="reps"
+													val={
+														loaderData.userExerciseDetails.details
+															.exerciseExtraInformation.lifetimeStats.reps
+													}
+												/>
+												<DisplayLifetimeStatistic
+													stat="times done"
+													val={exerciseNumTimesInteracted}
+												/>
+											</Box>
 										</Stack>
-									) : null}
-								</Stack>
-							</Tabs.Panel>
-							<Tabs.Panel value="charts">
-								<Stack>
-									<Select
-										label="Time span"
-										defaultValue={timeSpanForCharts}
-										labelProps={{ c: "dimmed" }}
-										data={Object.values(TimeSpan)}
-										onChange={(v) => {
-											if (v) setTimeSpanForCharts(v as TimeSpan);
+										{loaderData.userExerciseDetails.details
+											.exerciseExtraInformation.personalBests.length > 0 ? (
+											<Stack gap="sm">
+												<Text size="lg" td="underline">
+													Personal Bests
+												</Text>
+												{loaderData.userExerciseDetails.details.exerciseExtraInformation.personalBests.map(
+													(personalBest) => (
+														<Box key={personalBest.lot}>
+															<Text size="sm" c="dimmed">
+																{changeCase(personalBest.lot)}
+															</Text>
+															{personalBest.sets.map((pbSet) => (
+																<DisplayPersonalBest
+																	set={pbSet}
+																	key={pbSet.workoutId}
+																	personalBestLot={personalBest.lot}
+																/>
+															))}
+														</Box>
+													),
+												)}
+											</Stack>
+										) : null}
+									</Stack>
+								</Tabs.Panel>
+								<Tabs.Panel value="charts">
+									<Stack>
+										<Select
+											label="Time span"
+											defaultValue={timeSpanForCharts}
+											labelProps={{ c: "dimmed" }}
+											data={Object.values(TimeSpan)}
+											onChange={(v) => {
+												if (v) setTimeSpanForCharts(v as TimeSpan);
+											}}
+										/>
+										{bestMappings.map((best) => {
+											const data = filteredHistoryForCharts.map((h) => {
+												const stat = h.bestSet?.statistic;
+												const value = match(best)
+													.with(WorkoutSetPersonalBest.OneRm, () => stat?.oneRm)
+													.with(WorkoutSetPersonalBest.Pace, () => stat?.pace)
+													.with(WorkoutSetPersonalBest.Reps, () => stat?.reps)
+													.with(
+														WorkoutSetPersonalBest.Time,
+														() => stat?.duration,
+													)
+													.with(
+														WorkoutSetPersonalBest.Volume,
+														() => stat?.volume,
+													)
+													.with(
+														WorkoutSetPersonalBest.Weight,
+														() => stat?.weight,
+													)
+													.exhaustive();
+												return {
+													name: dayjsLib(h.workoutEndOn).format("DD/MM/YYYY"),
+													value: value ? Number.parseFloat(value) : null,
+												};
+											});
+											invariant(data);
+											return (
+												<Paper key={best} withBorder py="md" radius="md">
+													<Stack>
+														<Title order={3} ta="center">
+															{changeCase(best)}
+														</Title>
+														<LineChart
+															ml={-15}
+															connectNulls
+															h={300}
+															data={data}
+															series={[
+																{ name: "value", label: changeCase(best) },
+															]}
+															dataKey="name"
+														/>
+													</Stack>
+												</Paper>
+											);
+										})}
+									</Stack>
+								</Tabs.Panel>
+							</>
+						) : null}
+						<Tabs.Panel value="actions">
+							<MediaScrollArea>
+								<SimpleGrid cols={{ base: 1, md: 2 }} spacing="lg">
+									<Button
+										variant="outline"
+										onClick={() => openUpdatePreferencesModal()}
+									>
+										Update preferences
+									</Button>
+									<Button
+										variant="outline"
+										onClick={() => {
+											setAddEntityToCollectionData({
+												entityId: loaderData.exerciseId,
+												entityLot: EntityLot.Exercise,
+												alreadyInCollections:
+													loaderData.userExerciseDetails.collections.map(
+														(c) => c.id,
+													),
+											});
 										}}
-									/>
-									{bestMappings.map((best) => {
-										const data = filteredHistoryForCharts.map((h) => {
-											const stat = h.bestSet?.statistic;
-											const value = match(best)
-												.with(WorkoutSetPersonalBest.OneRm, () => stat?.oneRm)
-												.with(WorkoutSetPersonalBest.Pace, () => stat?.pace)
-												.with(WorkoutSetPersonalBest.Reps, () => stat?.reps)
-												.with(WorkoutSetPersonalBest.Time, () => stat?.duration)
-												.with(WorkoutSetPersonalBest.Volume, () => stat?.volume)
-												.with(WorkoutSetPersonalBest.Weight, () => stat?.weight)
-												.exhaustive();
-											return {
-												name: dayjsLib(h.workoutEndOn).format("DD/MM/YYYY"),
-												value: value ? Number.parseFloat(value) : null,
-											};
-										});
-										invariant(data);
-										return (
-											<Paper key={best} withBorder py="md" radius="md">
-												<Stack>
-													<Title order={3} ta="center">
-														{changeCase(best)}
-													</Title>
-													<LineChart
-														ml={-15}
-														connectNulls
-														h={300}
-														data={data}
-														series={[
-															{ name: "value", label: changeCase(best) },
-														]}
-														dataKey="name"
-													/>
-												</Stack>
-											</Paper>
-										);
-									})}
-								</Stack>
-							</Tabs.Panel>
-						</>
-					) : null}
-					<Tabs.Panel value="actions">
-						<MediaScrollArea>
-							<SimpleGrid cols={{ base: 1, md: 2 }} spacing="lg">
-								<Button
-									variant="outline"
-									onClick={() => {
-										setAddEntityToCollectionData({
-											entityId: loaderData.exerciseId,
-											entityLot: EntityLot.Exercise,
-											alreadyInCollections:
-												loaderData.userExerciseDetails.collections.map(
-													(c) => c.id,
-												),
-										});
-									}}
-								>
-									Add to collection
-								</Button>
-								<Button
-									variant="outline"
-									w="100%"
-									onClick={() => {
-										setEntityToReview({
-											entityId: loaderData.exerciseId,
-											entityLot: EntityLot.Exercise,
-											entityTitle: loaderData.exerciseDetails.id,
-										});
-									}}
-								>
-									Post a review
-								</Button>
-								{canCurrentUserUpdate ? (
+									>
+										Add to collection
+									</Button>
 									<Button
 										variant="outline"
-										component={Link}
-										to={$path(
-											"/fitness/exercises/:action",
-											{ action: "update" },
-											{ name: loaderData.exerciseDetails.id },
-										)}
+										w="100%"
+										onClick={() => {
+											setEntityToReview({
+												entityId: loaderData.exerciseId,
+												entityLot: EntityLot.Exercise,
+												entityTitle: loaderData.exerciseDetails.id,
+											});
+										}}
 									>
-										Edit exercise
+										Post a review
 									</Button>
-								) : null}
-							</SimpleGrid>
-						</MediaScrollArea>
-					</Tabs.Panel>
-					{!userPreferences.general.disableReviews ? (
-						<Tabs.Panel value="reviews">
-							<MediaScrollArea>
-								{loaderData.userExerciseDetails.reviews.length > 0 ? (
-									<Stack>
-										{loaderData.userExerciseDetails.reviews.map((r) => (
-											<ReviewItemDisplay
-												review={r}
-												key={r.id}
-												entityLot={EntityLot.Exercise}
-												entityId={loaderData.exerciseId}
-												title={loaderData.exerciseDetails.id}
-											/>
-										))}
-									</Stack>
-								) : (
-									<Text>No reviews</Text>
-								)}
+									{canCurrentUserUpdate ? (
+										<Button
+											variant="outline"
+											component={Link}
+											to={$path(
+												"/fitness/exercises/:action",
+												{ action: "update" },
+												{ name: loaderData.exerciseDetails.id },
+											)}
+										>
+											Edit exercise
+										</Button>
+									) : null}
+								</SimpleGrid>
 							</MediaScrollArea>
 						</Tabs.Panel>
-					) : null}
-				</Tabs>
-			</Stack>
-			{currentWorkout && loaderData.workoutInProgress ? (
-				<Affix position={{ bottom: rem(40), right: rem(30) }}>
-					<ActionIcon
-						color="blue"
-						variant="light"
-						radius="xl"
-						size="xl"
-						onClick={async () => {
-							await addExerciseToWorkout(
-								currentWorkout,
-								setCurrentWorkout,
-								[
-									{
-										name: loaderData.exerciseDetails.id,
-										lot: loaderData.exerciseDetails.lot,
-									},
-								],
-								navigate,
-							);
-						}}
-					>
-						<IconCheck size={32} />
-					</ActionIcon>
-				</Affix>
-			) : null}
-		</Container>
+						{!userPreferences.general.disableReviews ? (
+							<Tabs.Panel value="reviews">
+								<MediaScrollArea>
+									{loaderData.userExerciseDetails.reviews.length > 0 ? (
+										<Stack>
+											{loaderData.userExerciseDetails.reviews.map((r) => (
+												<ReviewItemDisplay
+													review={r}
+													key={r.id}
+													entityLot={EntityLot.Exercise}
+													entityId={loaderData.exerciseId}
+													title={loaderData.exerciseDetails.id}
+												/>
+											))}
+										</Stack>
+									) : (
+										<Text>No reviews</Text>
+									)}
+								</MediaScrollArea>
+							</Tabs.Panel>
+						) : null}
+					</Tabs>
+				</Stack>
+				{currentWorkout && loaderData.workoutInProgress ? (
+					<Affix position={{ bottom: rem(40), right: rem(30) }}>
+						<ActionIcon
+							color="blue"
+							variant="light"
+							radius="xl"
+							size="xl"
+							onClick={async () => {
+								await addExerciseToWorkout(
+									navigate,
+									currentWorkout,
+									userPreferences.fitness.exercises.setRestTimers,
+									setCurrentWorkout,
+									[
+										{
+											name: loaderData.exerciseDetails.id,
+											lot: loaderData.exerciseDetails.lot,
+										},
+									],
+								);
+							}}
+						>
+							<IconCheck size={32} />
+						</ActionIcon>
+					</Affix>
+				) : null}
+			</Container>
+		</>
 	);
 }
 
diff --git a/apps/frontend/app/routes/_dashboard.fitness.exercises.list.tsx b/apps/frontend/app/routes/_dashboard.fitness.exercises.list.tsx
index fe31e47de3..2b19203954 100644
--- a/apps/frontend/app/routes/_dashboard.fitness.exercises.list.tsx
+++ b/apps/frontend/app/routes/_dashboard.fitness.exercises.list.tsx
@@ -38,19 +38,24 @@ import {
 	ExerciseSortBy,
 	ExercisesListDocument,
 } from "@ryot/generated/graphql/backend/graphql";
-import { snakeCase, startCase } from "@ryot/ts-utils";
+import { isNumber, snakeCase, startCase } from "@ryot/ts-utils";
 import {
 	IconAlertCircle,
 	IconCheck,
 	IconFilter,
 	IconPlus,
 } from "@tabler/icons-react";
+import { produce } from "immer";
 import { $path } from "remix-routes";
 import { z } from "zod";
 import { zx } from "zodix";
 import { DebouncedSearchInput, FiltersModal } from "~/components/common";
 import { dayjsLib, pageQueryParam } from "~/lib/generals";
-import { useAppSearchParam, useUserCollections } from "~/lib/hooks";
+import {
+	useAppSearchParam,
+	useUserCollections,
+	useUserPreferences,
+} from "~/lib/hooks";
 import { addExerciseToWorkout, useCurrentWorkout } from "~/lib/state/fitness";
 import {
 	getCachedExerciseParameters,
@@ -138,6 +143,8 @@ export const meta = (_args: MetaArgs_SingleFetch<typeof loader>) => {
 export default function Page() {
 	const loaderData = useLoaderData<typeof loader>();
 	const navigate = useNavigate();
+	const userPreferences = useUserPreferences();
+	const [currentWorkout, setCurrentWorkout] = useCurrentWorkout();
 	const [_, { setP }] = useAppSearchParam(loaderData.cookieName);
 	const [selectedExercises, setSelectedExercises] = useListState<{
 		name: string;
@@ -148,8 +155,6 @@ export default function Page() {
 		{ open: openFiltersModal, close: closeFiltersModal },
 	] = useDisclosure(false);
 
-	const [currentWorkout, setCurrentWorkout] = useCurrentWorkout();
-
 	const isFilterChanged = Object.keys(defaultFiltersValue)
 		.filter((k) => k !== pageQueryParam && k !== "query")
 		.some(
@@ -157,6 +162,11 @@ export default function Page() {
 			(k) => (loaderData.query as any)[k] !== (defaultFiltersValue as any)[k],
 		);
 
+	const allowAddingExerciseToWorkout =
+		currentWorkout &&
+		loaderData.workoutInProgress &&
+		!isNumber(currentWorkout.replacingExerciseIdx);
+
 	return (
 		<Container size="md">
 			<Stack gap="xl">
@@ -212,7 +222,7 @@ export default function Page() {
 										{loaderData.exercisesList.details.total}
 									</Text>{" "}
 									items found
-									{currentWorkout ? (
+									{allowAddingExerciseToWorkout ? (
 										<>
 											{" "}
 											and{" "}
@@ -231,7 +241,7 @@ export default function Page() {
 											align="center"
 											data-exercise-id={exercise.id}
 										>
-											{currentWorkout ? (
+											{allowAddingExerciseToWorkout ? (
 												<Checkbox
 													onChange={(e) => {
 														if (e.currentTarget.checked)
@@ -247,25 +257,44 @@ export default function Page() {
 												/>
 											) : null}
 											<Indicator
-												disabled={!exercise.numTimesInteracted}
-												label={exercise.numTimesInteracted ?? ""}
-												position="top-start"
 												size={16}
 												offset={8}
 												color="grape"
+												position="top-start"
+												disabled={!exercise.numTimesInteracted}
+												label={exercise.numTimesInteracted ?? ""}
 											>
 												<Avatar
-													imageProps={{ loading: "lazy" }}
-													src={exercise.image}
-													radius="xl"
 													size="lg"
+													radius="xl"
+													src={exercise.image}
+													imageProps={{ loading: "lazy" }}
 												/>
 											</Indicator>
 											<Link
+												onClick={(e) => {
+													if (allowAddingExerciseToWorkout) return;
+													e.preventDefault();
+													if (currentWorkout) {
+														setCurrentWorkout(
+															produce(currentWorkout, (draft) => {
+																if (
+																	!isNumber(currentWorkout.replacingExerciseIdx)
+																)
+																	return;
+																draft.exercises[
+																	currentWorkout.replacingExerciseIdx
+																].exerciseId = exercise.id;
+																draft.replacingExerciseIdx = undefined;
+															}),
+														);
+														navigate(-1);
+													}
+												}}
+												style={{ all: "unset", cursor: "pointer" }}
 												to={$path("/fitness/exercises/item/:id", {
 													id: encodeURIComponent(exercise.id),
 												})}
-												style={{ all: "unset", cursor: "pointer" }}
 											>
 												<Flex direction="column" justify="space-around">
 													<Text>{exercise.id}</Text>
@@ -304,7 +333,7 @@ export default function Page() {
 					</>
 				)}
 			</Stack>
-			{currentWorkout && loaderData.workoutInProgress ? (
+			{allowAddingExerciseToWorkout ? (
 				<Affix position={{ bottom: rem(40), right: rem(30) }}>
 					<ActionIcon
 						color="blue"
@@ -314,10 +343,11 @@ export default function Page() {
 						disabled={selectedExercises.length === 0}
 						onClick={async () => {
 							await addExerciseToWorkout(
+								navigate,
 								currentWorkout,
+								userPreferences.fitness.exercises.setRestTimers,
 								setCurrentWorkout,
 								selectedExercises,
-								navigate,
 							);
 						}}
 					>
diff --git a/apps/frontend/app/routes/_dashboard.media.$action.$lot.tsx b/apps/frontend/app/routes/_dashboard.media.$action.$lot.tsx
index af92c65660..166513c542 100644
--- a/apps/frontend/app/routes/_dashboard.media.$action.$lot.tsx
+++ b/apps/frontend/app/routes/_dashboard.media.$action.$lot.tsx
@@ -27,6 +27,7 @@ import {
 import {
 	EntityLot,
 	GraphqlSortOrder,
+	GridPacking,
 	MediaGeneralFilter,
 	MediaLot,
 	MediaSortBy,
@@ -172,19 +173,25 @@ export const loader = unstable_defineLoader(async ({ request, params }) => {
 			const urlParse = zx.parseQuery(request, {
 				source: z.nativeEnum(MediaSource).default(metadataSourcesForLot[0]),
 			});
-			const { metadataSearch } = await serverGqlService.authenticatedRequest(
-				request,
-				MetadataSearchDocument,
-				{
-					input: {
-						lot,
-						search: { page: query[pageQueryParam], query: query.query },
-						source: urlParse.source,
+			let metadataSearch: MetadataSearchQuery["metadataSearch"] | false;
+			try {
+				const response = await serverGqlService.authenticatedRequest(
+					request,
+					MetadataSearchDocument,
+					{
+						input: {
+							lot,
+							search: { page: query[pageQueryParam], query: query.query },
+							source: urlParse.source,
+						},
 					},
-				},
-			);
+				);
+				metadataSearch = response.metadataSearch;
+			} catch {
+				metadataSearch = false;
+			}
 			return [
-				metadataSearch.details.total,
+				metadataSearch === false ? 0 : metadataSearch.details.total,
 				undefined,
 				{
 					search: metadataSearch,
@@ -386,7 +393,11 @@ export default function Page() {
 								/>
 							) : null}
 						</Flex>
-						{loaderData.mediaSearch.search.details.total > 0 ? (
+						{loaderData.mediaSearch.search === false ? (
+							<Text>
+								Something is wrong. Please try with an alternate provider.
+							</Text>
+						) : loaderData.mediaSearch.search.details.total > 0 ? (
 							<>
 								<Box>
 									<Text display="inline" fw="bold">
@@ -445,6 +456,8 @@ const MediaSearchItem = (props: {
 }) => {
 	const navigate = useNavigate();
 	const userDetails = useUserDetails();
+	const userPreferences = useUserPreferences();
+	const gridPacking = userPreferences.general.gridPacking;
 	const [isLoading, setIsLoading] = useState(false);
 	const revalidator = useRevalidator();
 	const events = useApplicationEvents();
@@ -467,6 +480,8 @@ const MediaSearchItem = (props: {
 		return response;
 	};
 
+	const buttonSize =
+		gridPacking === GridPacking.Normal ? "compact-md" : "compact-xs";
 	return (
 		<Box>
 			<BaseMediaDisplayItem
@@ -518,9 +533,9 @@ const MediaSearchItem = (props: {
 			/>
 			<Box px={4}>
 				<Button
-					variant="outline"
 					w="100%"
-					size="compact-md"
+					variant="outline"
+					size={buttonSize}
 					onClick={async () => {
 						const metadataId = await basicCommit();
 						setMetadataToUpdate({ metadataId });
@@ -529,10 +544,10 @@ const MediaSearchItem = (props: {
 					Mark as {getVerb(Verb.Read, props.lot)}
 				</Button>
 				<Button
+					w="100%"
 					mt="xs"
 					variant="outline"
-					w="100%"
-					size="compact-md"
+					size={buttonSize}
 					onClick={async () => {
 						setIsLoading(true);
 						const id = await basicCommit();
@@ -554,7 +569,7 @@ const MediaSearchItem = (props: {
 						revalidator.revalidate();
 					}}
 				>
-					Add to Watchlist
+					Add to watchlist
 				</Button>
 			</Box>
 		</Box>
diff --git a/apps/frontend/app/routes/_dashboard.media.genre.list.tsx b/apps/frontend/app/routes/_dashboard.media.genre.list.tsx
index 6758624c77..86c8253079 100644
--- a/apps/frontend/app/routes/_dashboard.media.genre.list.tsx
+++ b/apps/frontend/app/routes/_dashboard.media.genre.list.tsx
@@ -45,7 +45,7 @@ import {
 	useAppSearchParam,
 	useCoreDetails,
 	useFallbackImageUrl,
-	useGetMantineColor,
+	useGetRandomMantineColor,
 } from "~/lib/hooks";
 import {
 	getEnhancedCookieName,
@@ -133,7 +133,7 @@ type Genre = GenresListQuery["genresList"]["items"][number];
 
 const DisplayGenre = (props: { genre: Genre }) => {
 	const coreDetails = useCoreDetails();
-	const getMantineColor = useGetMantineColor();
+	const color = useGetRandomMantineColor(props.genre.name);
 	const fallbackImageUrl = useFallbackImageUrl(getInitials(props.genre.name));
 	const { data: genreImages } = useQuery({
 		queryKey: queryFactory.media.genreImages(props.genre.id).queryKey,
@@ -192,12 +192,7 @@ const DisplayGenre = (props: { genre: Genre }) => {
 					)}
 				</Box>
 				<Group justify="center">
-					<Box
-						h={11}
-						w={11}
-						style={{ borderRadius: 2 }}
-						bg={getMantineColor(props.genre.name)}
-					/>
+					<Box h={11} w={11} bg={color} style={{ borderRadius: 2 }} />
 					<Text>{truncate(props.genre.name, { length: 13 })}</Text>
 				</Group>
 			</Stack>
diff --git a/apps/frontend/app/routes/_dashboard.media.item.$id._index.tsx b/apps/frontend/app/routes/_dashboard.media.item.$id._index.tsx
index e5147b5cef..337ecb9b96 100644
--- a/apps/frontend/app/routes/_dashboard.media.item.$id._index.tsx
+++ b/apps/frontend/app/routes/_dashboard.media.item.$id._index.tsx
@@ -121,7 +121,7 @@ import {
 	useApplicationEvents,
 	useConfirmSubmit,
 	useCoreDetails,
-	useGetMantineColor,
+	useGetRandomMantineColor,
 	useGetWatchProviders,
 	useUserDetails,
 	useUserPreferences,
@@ -248,7 +248,6 @@ export default function Page() {
 	const loaderData = useLoaderData<typeof loader>();
 	const userPreferences = useUserPreferences();
 	const events = useApplicationEvents();
-	const getMantineColor = useGetMantineColor();
 	const submit = useConfirmSubmit();
 	const [tab, setTab] = useState<string | null>(
 		loaderData.query.defaultTab || "overview",
@@ -589,26 +588,29 @@ export default function Page() {
 									{userPreferences.featuresEnabled.media.genres
 										? loaderData.metadataDetails.genres
 												.slice(0, 12)
-												.map((g) => (
-													<Group key={g.id} wrap="nowrap">
-														<Box
-															h={11}
-															w={11}
-															style={{ borderRadius: 2, flex: "none" }}
-															bg={getMantineColor(g.name)}
-														/>
-														<Anchor
-															component={Link}
-															to={$path("/media/genre/:id", {
-																id: g.id,
-															})}
-															fz="sm"
-															truncate
-														>
-															{g.name.trim()}
-														</Anchor>
-													</Group>
-												))
+												.map((g) => {
+													const color = useGetRandomMantineColor(g.name);
+													return (
+														<Group key={g.id} wrap="nowrap">
+															<Box
+																h={11}
+																w={11}
+																bg={color}
+																style={{ borderRadius: 2, flex: "none" }}
+															/>
+															<Anchor
+																component={Link}
+																to={$path("/media/genre/:id", {
+																	id: g.id,
+																})}
+																fz="sm"
+																truncate
+															>
+																{g.name.trim()}
+															</Anchor>
+														</Group>
+													);
+												})
 										: null}
 								</SimpleGrid>
 								{loaderData.metadataDetails.description ? (
@@ -939,7 +941,7 @@ export default function Page() {
 										</Menu.Item>
 										<Form
 											method="POST"
-											action={withQuery("", { intent: "removeItem" })}
+											action={withQuery(".", { intent: "removeItem" })}
 										>
 											<input
 												hidden
@@ -1314,7 +1316,7 @@ const EditHistoryItemModal = (props: {
 				replace
 				method="POST"
 				onSubmit={props.onClose}
-				action={withQuery("", { intent: "editSeenItem" })}
+				action={withQuery(".", { intent: "editSeenItem" })}
 			>
 				<input hidden name="seenId" defaultValue={id} />
 				<Stack>
@@ -1420,7 +1422,7 @@ const MergeMetadataModal = (props: {
 			<Form
 				replace
 				method="POST"
-				action={withQuery("", { intent: "mergeMetadata" })}
+				action={withQuery(".", { intent: "mergeMetadata" })}
 			>
 				<input hidden name="mergeFrom" defaultValue={props.metadataId} />
 				<Stack>
@@ -1565,7 +1567,7 @@ const HistoryItem = (props: {
 					<Form
 						replace
 						method="POST"
-						action={withQuery("", { intent: "deleteSeenItem" })}
+						action={withQuery(".", { intent: "deleteSeenItem" })}
 					>
 						<input hidden name="seenId" defaultValue={props.history.id} />
 						<ActionIcon
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 19f3bd7fb0..f8a0f3620d 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
@@ -210,8 +210,8 @@ export default function Page() {
 					<Tabs.Panel value="import">
 						<Form
 							method="POST"
-							action={withQuery("", { intent: "deployImport" })}
 							encType="multipart/form-data"
+							action={withQuery(".", { intent: "deployImport" })}
 							onSubmit={() => {
 								if (deployImportSource) events.deployImport(deployImportSource);
 							}}
diff --git a/apps/frontend/app/routes/_dashboard.settings.integrations.tsx b/apps/frontend/app/routes/_dashboard.settings.integrations.tsx
index 1606088ebc..0bf11adb20 100644
--- a/apps/frontend/app/routes/_dashboard.settings.integrations.tsx
+++ b/apps/frontend/app/routes/_dashboard.settings.integrations.tsx
@@ -50,7 +50,11 @@ import { withQuery } from "ufo";
 import { z } from "zod";
 import { zx } from "zodix";
 import { confirmWrapper } from "~/components/confirmation";
-import { commaDelimitedString, dayjsLib } from "~/lib/generals";
+import {
+	applicationBaseUrl,
+	commaDelimitedString,
+	dayjsLib,
+} from "~/lib/generals";
 import {
 	useConfirmSubmit,
 	useCoreDetails,
@@ -226,7 +230,7 @@ export default function Page() {
 						<Form
 							replace
 							method="POST"
-							action={withQuery("", { intent: "generateAuthToken" })}
+							action={withQuery(".", { intent: "generateAuthToken" })}
 						>
 							<Button
 								variant="light"
@@ -302,10 +306,7 @@ const DisplayIntegration = (props: {
 		useDisclosure(false);
 	const submit = useConfirmSubmit();
 
-	const integrationUrl =
-		typeof window !== "undefined"
-			? `${window.location.origin}/_i/${props.integration.id}`
-			: "";
+	const integrationUrl = `${applicationBaseUrl}/_i/${props.integration.id}`;
 
 	return (
 		<Paper p="xs" withBorder>
@@ -348,7 +349,7 @@ const DisplayIntegration = (props: {
 						>
 							<IconPencil />
 						</ActionIcon>
-						<Form method="POST" action={withQuery("", { intent: "delete" })}>
+						<Form method="POST" action={withQuery(".", { intent: "delete" })}>
 							<input
 								type="hidden"
 								name="integrationId"
@@ -404,7 +405,7 @@ const CreateIntegrationModal = (props: {
 				replace
 				method="POST"
 				onSubmit={() => props.closeIntegrationModal()}
-				action={withQuery("", { intent: "create" })}
+				action={withQuery(".", { intent: "create" })}
 			>
 				<Stack>
 					<Select
@@ -573,7 +574,7 @@ const UpdateIntegrationModal = (props: {
 					replace
 					method="POST"
 					onSubmit={() => props.closeIntegrationModal()}
-					action={withQuery("", { intent: "update" })}
+					action={withQuery(".", { intent: "update" })}
 				>
 					<input
 						type="hidden"
diff --git a/apps/frontend/app/routes/_dashboard.settings.notifications.tsx b/apps/frontend/app/routes/_dashboard.settings.notifications.tsx
index 28c293d8e1..cf6151d353 100644
--- a/apps/frontend/app/routes/_dashboard.settings.notifications.tsx
+++ b/apps/frontend/app/routes/_dashboard.settings.notifications.tsx
@@ -176,7 +176,7 @@ export default function Page() {
 								<Form
 									replace
 									method="POST"
-									action={withQuery("", { intent: "test" })}
+									action={withQuery(".", { intent: "test" })}
 								>
 									<Button size="xs" variant="light" color="green" type="submit">
 										Trigger test notifications
@@ -199,9 +199,9 @@ export default function Page() {
 						withCloseButton={false}
 					>
 						<Box
-							component={Form}
 							method="POST"
-							action={withQuery("", { intent: "create" })}
+							component={Form}
+							action={withQuery(".", { intent: "create" })}
 							onSubmit={() => {
 								closeCreateUserNotificationPlatformModal();
 								setCreateUserNotificationPlatformLot(undefined);
@@ -356,7 +356,7 @@ const DisplayNotification = (props: {
 					</Text>
 				</Box>
 				<Group>
-					<Form method="POST" action={withQuery("", { intent: "update" })}>
+					<Form method="POST" action={withQuery(".", { intent: "update" })}>
 						<ActionIcon color="indigo" variant="subtle" type="submit">
 							{props.notification.isDisabled ? (
 								<IconPlayerPlay />
@@ -377,7 +377,7 @@ const DisplayNotification = (props: {
 						</ActionIcon>
 					</Form>
 					<Tooltip label="Delete">
-						<Form method="POST" action={withQuery("", { intent: "delete" })}>
+						<Form method="POST" action={withQuery(".", { intent: "delete" })}>
 							<input
 								hidden
 								name="notificationId"
diff --git a/apps/frontend/app/routes/_dashboard.settings.preferences.tsx b/apps/frontend/app/routes/_dashboard.settings.preferences.tsx
index dabca8d222..6a203782f2 100644
--- a/apps/frontend/app/routes/_dashboard.settings.preferences.tsx
+++ b/apps/frontend/app/routes/_dashboard.settings.preferences.tsx
@@ -24,7 +24,6 @@ import {
 	Tooltip,
 	rem,
 } from "@mantine/core";
-import { useListState } from "@mantine/hooks";
 import { notifications } from "@mantine/notifications";
 import { unstable_defineAction, unstable_defineLoader } from "@remix-run/node";
 import type { MetaArgs_SingleFetch } from "@remix-run/react";
@@ -60,6 +59,7 @@ import { zx } from "zodix";
 import { confirmWrapper } from "~/components/confirmation";
 import { queryClient, queryFactory } from "~/lib/generals";
 import {
+	useComplexJsonUpdate,
 	useConfirmSubmit,
 	useDashboardLayoutData,
 	useUserPreferences,
@@ -137,21 +137,13 @@ export default function Page() {
 	const [dashboardElements, setDashboardElements] = useState(
 		userPreferences.general.dashboard,
 	);
-	const [toUpdatePreferences, updateUserPreferencesHandler] = useListState<
-		[string, string]
-	>([]);
+	const { toUpdatePreferences, appendPref, reset } = useComplexJsonUpdate();
 	const [defaultTab, setDefaultTab] = useState(
 		loaderData.query.defaultTab || "dashboard",
 	);
 	const dashboardData = useDashboardLayoutData();
 	const isEditDisabled = dashboardData.isDemo;
 
-	const appendPref = (property: string, value: string) => {
-		const index = toUpdatePreferences.findIndex((p) => p[0] === property);
-		if (index !== -1) updateUserPreferencesHandler.remove(index);
-		updateUserPreferencesHandler.append([property, value]);
-	};
-
 	return (
 		<Container size="xs">
 			{toUpdatePreferences.length > 0 ? (
@@ -165,7 +157,7 @@ export default function Page() {
 						replace
 						method="POST"
 						action={`?defaultTab=${defaultTab}`}
-						onSubmit={() => updateUserPreferencesHandler.setState([])}
+						onSubmit={() => reset()}
 					>
 						{toUpdatePreferences.map((pref) => (
 							<input
@@ -522,24 +514,11 @@ export default function Page() {
 						</Stack>
 					</Tabs.Panel>
 					<Tabs.Panel value="fitness">
-						<Stack>
+						<Stack gap="xl">
 							<SimpleGrid
 								cols={{ base: 1, md: 2 }}
 								style={{ alignItems: "center" }}
 							>
-								<Select
-									size="xs"
-									label="Unit system to use for measurements"
-									data={Object.values(UserUnitSystem).map((c) => ({
-										value: c.toLowerCase(),
-										label: startCase(c.toLowerCase()),
-									}))}
-									defaultValue={userPreferences.fitness.exercises.unitSystem.toLowerCase()}
-									disabled={!!isEditDisabled}
-									onChange={(val) => {
-										if (val) appendPref("fitness.exercises.unit_system", val);
-									}}
-								/>
 								<Group wrap="nowrap">
 									<ActionIcon
 										onClick={async () => {
@@ -559,27 +538,73 @@ export default function Page() {
 										Show me notifications related to the current workout
 									</Text>
 								</Group>
+								<Select
+									size="xs"
+									label="Unit system to use for measurements"
+									data={Object.values(UserUnitSystem).map((c) => ({
+										value: c.toLowerCase(),
+										label: startCase(c.toLowerCase()),
+									}))}
+									defaultValue={userPreferences.fitness.exercises.unitSystem.toLowerCase()}
+									disabled={!!isEditDisabled}
+									onChange={(val) => {
+										if (val) appendPref("fitness.exercises.unit_system", val);
+									}}
+								/>
 							</SimpleGrid>
-							<Text>The default measurements you want to keep track of.</Text>
-							<SimpleGrid cols={2}>
-								{Object.entries(
-									userPreferences.fitness.measurements.inbuilt,
-								).map(([name, isEnabled]) => (
-									<Switch
-										size="xs"
-										key={name}
-										label={changeCase(snakeCase(name))}
-										defaultChecked={isEnabled}
-										disabled={!!isEditDisabled}
-										onChange={(ev) => {
-											appendPref(
-												`fitness.measurements.inbuilt.${snakeCase(name)}`,
-												String(ev.currentTarget.checked),
+							<Input.Wrapper
+								label="Default Rest Timers"
+								description="When adding an exercise to your workout, these timer values will be used if you have not configured a rest timer for that exercise."
+							>
+								<SimpleGrid cols={{ base: 2, md: 4 }}>
+									{(["normal", "warmup", "drop", "failure"] as const).map(
+										(name) => {
+											const value =
+												userPreferences.fitness.exercises.setRestTimers[name];
+											return (
+												<NumberInput
+													suffix="s"
+													size="xs"
+													key={name}
+													disabled={!!isEditDisabled}
+													label={changeCase(snakeCase(name))}
+													defaultValue={isNumber(value) ? value : undefined}
+													onChange={(val) => {
+														if (isNumber(val)) {
+															appendPref(
+																`fitness.exercises.set_rest_timers.${snakeCase(name)}`,
+																String(val),
+															);
+														}
+													}}
+												/>
 											);
-										}}
-									/>
-								))}
-							</SimpleGrid>
+										},
+									)}
+								</SimpleGrid>
+							</Input.Wrapper>
+							<Stack gap="xs">
+								<Text>The default measurements you want to keep track of</Text>
+								<SimpleGrid cols={2}>
+									{Object.entries(
+										userPreferences.fitness.measurements.inbuilt,
+									).map(([name, isEnabled]) => (
+										<Switch
+											size="xs"
+											key={name}
+											label={changeCase(snakeCase(name))}
+											defaultChecked={isEnabled}
+											disabled={!!isEditDisabled}
+											onChange={(ev) => {
+												appendPref(
+													`fitness.measurements.inbuilt.${snakeCase(name)}`,
+													String(ev.currentTarget.checked),
+												);
+											}}
+										/>
+									))}
+								</SimpleGrid>
+							</Stack>
 							<JsonInput
 								label="The custom metrics you want to keep track of"
 								description="The name of the attribute along with the data type. Only decimal data type is supported."
diff --git a/apps/frontend/app/routes/_dashboard.settings.profile-and-sharing.tsx b/apps/frontend/app/routes/_dashboard.settings.profile-and-sharing.tsx
index 3cf9f38961..3fe089131b 100644
--- a/apps/frontend/app/routes/_dashboard.settings.profile-and-sharing.tsx
+++ b/apps/frontend/app/routes/_dashboard.settings.profile-and-sharing.tsx
@@ -48,7 +48,12 @@ import { withQuery } from "ufo";
 import { z } from "zod";
 import { zx } from "zodix";
 import { confirmWrapper } from "~/components/confirmation";
-import { dayjsLib, queryClient, queryFactory } from "~/lib/generals";
+import {
+	applicationBaseUrl,
+	dayjsLib,
+	queryClient,
+	queryFactory,
+} from "~/lib/generals";
 import {
 	useConfirmSubmit,
 	useCoreDetails,
@@ -274,8 +279,7 @@ export default function Page() {
 													<Text>Make my account public</Text>
 													<Text size="xs" c="dimmed">
 														Anyone would be able to view your profile by
-														visiting {window.location.origin}/u/
-														{userDetails.name}
+														visiting {applicationBaseUrl}/u/{userDetails.name}
 													</Text>
 												</Box>
 												<Button
@@ -336,14 +340,11 @@ const DisplayAccessLink = (props: {
 	const [inputOpened, { toggle: inputToggle }] = useDisclosure(false);
 	const submit = useConfirmSubmit();
 
-	const accessLinkUrl =
-		typeof window !== "undefined"
-			? `${window.location.origin}/${
-					props.accessLink.isAccountDefault
-						? `u/${userDetails.name}`
-						: `_s/${props.accessLink.id}`
-				}`
-			: "";
+	const accessLinkUrl = `${applicationBaseUrl}/${
+		props.accessLink.isAccountDefault
+			? `u/${userDetails.name}`
+			: `_s/${props.accessLink.id}`
+	}`;
 
 	const optionalDetails = [
 		props.accessLink.expiresOn
@@ -380,7 +381,7 @@ const DisplayAccessLink = (props: {
 								</ActionIcon>
 								<Form
 									method="POST"
-									action={withQuery("", { intent: "revokeAccessLink" })}
+									action={withQuery(".", { intent: "revokeAccessLink" })}
 								>
 									<input
 										type="hidden"
@@ -457,7 +458,7 @@ const CreateAccessLinkModal = (props: {
 				replace
 				method="POST"
 				onSubmit={() => props.closeModal()}
-				action={withQuery("", { intent: "createAccessLink" })}
+				action={withQuery(".", { intent: "createAccessLink" })}
 			>
 				<Stack>
 					<Title order={3}>Create new access link</Title>
@@ -487,12 +488,12 @@ const CreateAccessLinkModal = (props: {
 					<TextInput
 						name="redirectTo"
 						label="Redirect to"
-						description="Users will be redirected to this URL after accessing the URL"
+						description="Users will be redirected to this URL when they use the link"
 					/>
 					<Checkbox
 						label="Allow mutation"
 						name="isMutationAllowed"
-						description="Users will be able to change your data if this is checked"
+						description="Allow users to able to change your data?"
 					/>
 					<Button type="submit">Submit</Button>
 				</Stack>
diff --git a/apps/frontend/app/routes/_dashboard.settings.users.tsx b/apps/frontend/app/routes/_dashboard.settings.users.tsx
index 5e63beb7d6..74a75ce0b1 100644
--- a/apps/frontend/app/routes/_dashboard.settings.users.tsx
+++ b/apps/frontend/app/routes/_dashboard.settings.users.tsx
@@ -293,7 +293,7 @@ const UserDisplay = (props: { index: number }) => {
 					>
 						<IconPencil />
 					</ActionIcon>
-					<Form method="POST" action={withQuery("", { intent: "delete" })}>
+					<Form method="POST" action={withQuery(".", { intent: "delete" })}>
 						<input hidden name="toDeleteUserId" defaultValue={user.id} />
 						<ActionIcon
 							color="red"
@@ -332,7 +332,7 @@ const UpdateUserModal = (props: {
 				replace
 				method="POST"
 				onSubmit={() => props.closeIntegrationModal()}
-				action={withQuery("", { intent: "update" })}
+				action={withQuery(".", { intent: "update" })}
 			>
 				<input hidden name="userId" defaultValue={props.updateUserData?.id} />
 				<Stack>
diff --git a/apps/frontend/app/routes/auth.tsx b/apps/frontend/app/routes/auth.tsx
index 33b38cf453..3e1033a3d3 100644
--- a/apps/frontend/app/routes/auth.tsx
+++ b/apps/frontend/app/routes/auth.tsx
@@ -287,7 +287,7 @@ export default function Page() {
 					<Form
 						replace
 						method="POST"
-						action={withQuery("", { intent: "getOidcRedirectUrl" })}
+						action={withQuery(".", { intent: "getOidcRedirectUrl" })}
 					>
 						<Button
 							variant="outline"
diff --git a/crates/background/src/lib.rs b/crates/background/src/lib.rs
index 914cc10d69..a97203d983 100644
--- a/crates/background/src/lib.rs
+++ b/crates/background/src/lib.rs
@@ -14,7 +14,6 @@ pub enum CoreApplicationJob {
     SyncIntegrationsData(String),
     ReviewPosted(ReviewPostedEvent),
     BulkProgressUpdate(String, Vec<ProgressUpdateInput>),
-    EntityAddedToCollection(String, Uuid),
 }
 
 impl Message for CoreApplicationJob {
@@ -37,7 +36,7 @@ pub enum ApplicationJob {
     PerformBackgroundTasks,
     UpdateExerciseLibrary,
     SyncIntegrationsData,
-    HandleEntityAddedToCollectionEvent(String, Uuid),
+    HandleEntityAddedToCollectionEvent(Uuid),
 }
 
 impl Message for ApplicationJob {
diff --git a/crates/migrations/src/lib.rs b/crates/migrations/src/lib.rs
index 00116d8251..5fa8625ddb 100644
--- a/crates/migrations/src/lib.rs
+++ b/crates/migrations/src/lib.rs
@@ -43,6 +43,7 @@ mod m20241002_add_columns_for_associating_seen_with_reviews;
 mod m20241004_create_application_cache;
 mod m20241006_changes_for_issue_1056;
 mod m20241010_changes_for_issue_708;
+mod m20241013_changes_for_issue_1052;
 
 pub use m20230410_create_metadata::Metadata as AliasedMetadata;
 pub use m20230413_create_person::Person as AliasedPerson;
@@ -106,6 +107,7 @@ impl MigratorTrait for Migrator {
             Box::new(m20241004_create_application_cache::Migration),
             Box::new(m20241006_changes_for_issue_1056::Migration),
             Box::new(m20241010_changes_for_issue_708::Migration),
+            Box::new(m20241013_changes_for_issue_1052::Migration),
         ]
     }
 }
diff --git a/crates/migrations/src/m20230818_create_workout_template.rs b/crates/migrations/src/m20230818_create_workout_template.rs
index fefb06cdf3..7e71737b37 100644
--- a/crates/migrations/src/m20230818_create_workout_template.rs
+++ b/crates/migrations/src/m20230818_create_workout_template.rs
@@ -17,7 +17,6 @@ pub enum WorkoutTemplate {
     Summary,
     Visibility,
     Information,
-    DefaultRestTimer,
 }
 
 #[async_trait::async_trait]
@@ -57,7 +56,6 @@ impl MigrationTrait for Migration {
                             .not_null()
                             .default(Expr::current_timestamp()),
                     )
-                    .col(ColumnDef::new(WorkoutTemplate::DefaultRestTimer).integer())
                     .foreign_key(
                         ForeignKey::create()
                             .name("workout_template_to_user_foreign_key")
diff --git a/crates/migrations/src/m20241013_changes_for_issue_1052.rs b/crates/migrations/src/m20241013_changes_for_issue_1052.rs
new file mode 100644
index 0000000000..05ad39c30d
--- /dev/null
+++ b/crates/migrations/src/m20241013_changes_for_issue_1052.rs
@@ -0,0 +1,165 @@
+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();
+        db.execute_unprepared(
+            r#"
+UPDATE "user"
+SET "preferences" = jsonb_set(
+    "preferences",
+    '{fitness,exercises,set_rest_timers}',
+    jsonb_build_object('normal', 60)
+);
+DELETE FROM "daily_user_activity";
+ALTER TABLE "workout_template" DROP COLUMN IF EXISTS "default_rest_timer";
+        "#,
+        )
+        .await?;
+        for x in ["workout", "workout_template"] {
+            db.execute_unprepared(&format!(
+                r#"
+UPDATE "{x}"
+SET "information" = jsonb_set(
+    "information",
+    '{{exercises}}',
+    (
+    SELECT jsonb_agg(
+        jsonb_set(
+            exercise,
+            '{{identifier}}',
+            to_jsonb(gen_random_uuid())
+            )
+        )
+        FROM jsonb_array_elements("information"->'exercises') AS exercise
+    )
+);
+
+UPDATE "{x}"
+SET "summary" = jsonb_set(
+    "summary",
+    '{{exercises}}',
+    (
+        SELECT jsonb_agg(
+            jsonb_set(
+                exercise - 'id',
+                '{{name}}',
+                exercise->'id'
+            )
+        )
+        FROM jsonb_array_elements("summary"->'exercises') AS exercise
+    )
+);
+                    "#,
+            ))
+            .await?;
+            db.execute_unprepared(&format!(
+            r#"
+DO $$
+DECLARE
+    workout_record RECORD;
+    workout_json jsonb;
+    updated_json jsonb;
+    superset_with jsonb;
+    exercise jsonb;
+    exercise_index int;
+    superset_array jsonb := '[]'::jsonb;
+    superset jsonb;
+    color_options text[] := ARRAY['red', 'pink', 'yellow', 'gray', 'teal', 'green'];
+    color_index int := 1;
+BEGIN
+    FOR workout_record IN SELECT id, information FROM "{x}" LOOP
+        workout_json := workout_record.information;
+
+        FOR exercise_index IN 0..jsonb_array_length(workout_json->'exercises')-1 LOOP
+            exercise := workout_json->'exercises'->exercise_index;
+            superset_with := exercise->'superset_with';
+
+            IF jsonb_array_length(superset_with) > 0 THEN
+                superset := jsonb_build_array(exercise_index) || superset_with;
+                superset := (SELECT jsonb_agg(elem ORDER BY elem) FROM jsonb_array_elements(superset) AS elem);
+
+                superset_array := jsonb_insert(superset_array, '{{-1}}', superset);
+            END IF;
+        END LOOP;
+
+        IF jsonb_array_length(superset_array) > 0 THEN
+            superset_array := (SELECT jsonb_agg(DISTINCT elem) FROM jsonb_array_elements(superset_array) AS elem);
+	        superset_array := (
+	            SELECT jsonb_agg(
+	                jsonb_build_object('color', color_options[(row_num - 1) % array_length(color_options, 1) + 1], 'exercises', elem)
+	            )
+	            FROM (
+	                SELECT elem, row_number() OVER () as row_num
+	                FROM jsonb_array_elements(superset_array) AS elem
+	            ) subquery
+	        );
+
+		END IF;
+
+        updated_json := jsonb_set(workout_json, '{{supersets}}', superset_array);
+        UPDATE "{x}" SET information = updated_json WHERE id = workout_record.id;
+
+        superset_array := '[]'::jsonb;
+    END LOOP;
+END $$;
+    "#
+        ))
+        .await?;
+        }
+        db.execute_unprepared(
+            r#"
+UPDATE "user_to_entity"
+SET "exercise_extra_information" = jsonb_set(
+    "exercise_extra_information",
+    '{settings}',
+    jsonb_build_object('set_rest_timers', jsonb_build_object('normal', 60))
+)
+WHERE "user_to_entity"."exercise_extra_information" IS NOT NULL;
+        "#,
+        )
+        .await?;
+        db.execute_unprepared(
+            r#"
+DO $$
+DECLARE
+    workout_row RECORD;
+BEGIN
+    FOR workout_row IN SELECT id, information FROM workout
+    LOOP
+        UPDATE workout
+        SET information = jsonb_set(
+            workout_row.information,
+            '{exercises}',
+            (
+                SELECT jsonb_agg(
+                    CASE
+                        WHEN (exercise->>'rest_time')::int > 0 THEN
+                            jsonb_set(exercise, '{sets}', (
+                                SELECT jsonb_agg(jsonb_set(set_row, '{rest_time}', exercise->'rest_time'))
+                                FROM jsonb_array_elements(exercise->'sets') AS set_row
+                            ))
+                        ELSE
+                            exercise
+                    END
+                )
+                FROM jsonb_array_elements(workout_row.information->'exercises') AS exercise
+            )
+        )
+        WHERE id = workout_row.id;
+    END LOOP;
+END $$;
+        "#,
+        )
+        .await?;
+        Ok(())
+    }
+
+    async fn down(&self, _manager: &SchemaManager) -> Result<(), DbErr> {
+        Ok(())
+    }
+}
diff --git a/crates/models/common/Cargo.toml b/crates/models/common/Cargo.toml
index 9afa46bcbf..780195cb14 100644
--- a/crates/models/common/Cargo.toml
+++ b/crates/models/common/Cargo.toml
@@ -5,6 +5,7 @@ edition = "2021"
 
 [dependencies]
 async-graphql = { workspace = true }
+educe = { workspace = true }
 enums = { path = "../../enums" }
 enum_meta = { workspace = true }
 rust_decimal = { workspace = true }
diff --git a/crates/models/common/src/lib.rs b/crates/models/common/src/lib.rs
index 0ba2f58ac8..0c0aa27283 100644
--- a/crates/models/common/src/lib.rs
+++ b/crates/models/common/src/lib.rs
@@ -1,4 +1,5 @@
 use async_graphql::{Enum, InputObject, SimpleObject};
+use educe::Educe;
 use enum_meta::{meta, Meta};
 use enums::EntityLot;
 use rust_decimal::Decimal;
@@ -36,16 +37,18 @@ pub struct IdAndNamedObject {
     pub name: String,
 }
 
-#[derive(Debug, Serialize, Deserialize, Clone, Eq, PartialEq, Hash)]
+#[derive(Debug, Serialize, Deserialize, Clone, Eq, PartialEq, Hash, Educe)]
+#[educe(Default(expression = StoredUrl::Url(String::from("https://upload.wikimedia.org/wikipedia/en/a/a6/Pok%C3%A9mon_Pikachu_art.png"))))]
 pub enum StoredUrl {
     S3(String),
     Url(String),
 }
 
-impl Default for StoredUrl {
-    fn default() -> Self {
-        Self::Url("".to_owned())
-    }
+#[derive(Debug, InputObject)]
+pub struct UpdateComplexJsonInput {
+    /// Dot delimited path to the property that needs to be changed.
+    pub property: String,
+    pub value: String,
 }
 
 #[derive(Debug, PartialEq, Eq, Clone, Copy, Serialize, Deserialize, Enum, ConfigEnum)]
diff --git a/crates/models/database/Cargo.toml b/crates/models/database/Cargo.toml
index 40d8b06552..eaf5059742 100644
--- a/crates/models/database/Cargo.toml
+++ b/crates/models/database/Cargo.toml
@@ -11,7 +11,7 @@ async-trait = { workspace = true }
 boilermates = { workspace = true }
 chrono = { workspace = true }
 common-models = { path = "../../models/common" }
-educe = { version = "=0.6.0", features = ["Debug"], default-features = false }
+educe = { workspace = true }
 enums = { path = "../../enums" }
 importer-models = { path = "../../models/importer" }
 file-storage-service = { path = "../../services/file-storage" }
diff --git a/crates/models/database/src/workout_template.rs b/crates/models/database/src/workout_template.rs
index 71eb430d9d..f97cd06b99 100644
--- a/crates/models/database/src/workout_template.rs
+++ b/crates/models/database/src/workout_template.rs
@@ -24,7 +24,6 @@ pub struct Model {
     pub user_id: String,
     pub summary: WorkoutSummary,
     pub information: WorkoutInformation,
-    pub default_rest_timer: Option<i32>,
 }
 
 #[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)]
diff --git a/crates/models/fitness/Cargo.toml b/crates/models/fitness/Cargo.toml
index 0f88738ddf..aa290bd3b9 100644
--- a/crates/models/fitness/Cargo.toml
+++ b/crates/models/fitness/Cargo.toml
@@ -9,6 +9,7 @@ async-graphql = { workspace = true }
 async-trait = { workspace = true }
 common-models = { path = "../../models/common" }
 derive_more = { workspace = true }
+educe = { workspace = true }
 enums = { path = "../../enums" }
 file-storage-service = { path = "../../services/file-storage" }
 rust_decimal = { workspace = true }
diff --git a/crates/models/fitness/src/lib.rs b/crates/models/fitness/src/lib.rs
index a86600448a..dab947c7c2 100644
--- a/crates/models/fitness/src/lib.rs
+++ b/crates/models/fitness/src/lib.rs
@@ -3,8 +3,9 @@ use std::collections::HashMap;
 use application_utils::GraphqlRepresentation;
 use async_graphql::{Enum, InputObject, Result as GraphqlResult, SimpleObject};
 use async_trait::async_trait;
-use common_models::{SearchInput, StoredUrl};
+use common_models::{SearchInput, StoredUrl, UpdateComplexJsonInput};
 use derive_more::{Add, AddAssign, Sum};
+use educe::Educe;
 use enums::{
     ExerciseEquipment, ExerciseForce, ExerciseLevel, ExerciseLot, ExerciseMechanic, ExerciseMuscle,
 };
@@ -310,6 +311,7 @@ pub struct WorkoutSetTotals {
 pub struct WorkoutSetRecord {
     pub lot: SetLot,
     pub note: Option<String>,
+    pub rest_time: Option<u16>,
     pub actual_rest_time: Option<i64>,
     pub statistic: WorkoutSetStatistic,
     pub totals: Option<WorkoutSetTotals>,
@@ -369,12 +371,33 @@ pub struct UserToExerciseBestSetExtraInformation {
     pub sets: Vec<ExerciseBestSetRecord>,
 }
 
+#[skip_serializing_none]
+#[derive(
+    Debug, Clone, Serialize, Deserialize, FromJsonQueryResult, Eq, PartialEq, SimpleObject, Educe,
+)]
+#[educe(Default)]
+pub struct SetRestTimersSettings {
+    pub drop: Option<u16>,
+    pub warmup: Option<u16>,
+    #[educe(Default = Some(60))]
+    pub normal: Option<u16>,
+    pub failure: Option<u16>,
+}
+
+#[derive(
+    Debug, Clone, Serialize, Deserialize, FromJsonQueryResult, Eq, PartialEq, SimpleObject, Default,
+)]
+pub struct UserToExerciseSettingsExtraInformation {
+    pub set_rest_timers: SetRestTimersSettings,
+}
+
 #[derive(
     Debug, Clone, Serialize, Deserialize, FromJsonQueryResult, Eq, PartialEq, SimpleObject, Default,
 )]
 pub struct UserToExerciseExtraInformation {
-    pub history: Vec<UserToExerciseHistoryExtraInformation>,
     pub lifetime_stats: WorkoutOrExerciseTotals,
+    pub settings: UserToExerciseSettingsExtraInformation,
+    pub history: Vec<UserToExerciseHistoryExtraInformation>,
     pub personal_bests: Vec<UserToExerciseBestSetExtraInformation>,
 }
 
@@ -419,9 +442,6 @@ pub struct ProcessedExercise {
     pub name: String,
     pub lot: ExerciseLot,
     pub notes: Vec<String>,
-    pub rest_time: Option<u16>,
-    /// The indices of the exercises with which this has been superset with.
-    pub superset_with: Vec<u16>,
     pub sets: Vec<WorkoutSetRecord>,
     pub assets: Option<EntityAssets>,
     pub total: Option<WorkoutOrExerciseTotals>,
@@ -446,6 +466,29 @@ pub enum UserUnitSystem {
     Imperial,
 }
 
+#[skip_serializing_none]
+#[derive(
+    Clone,
+    Debug,
+    Deserialize,
+    Serialize,
+    FromJsonQueryResult,
+    Eq,
+    PartialEq,
+    SimpleObject,
+    Schematic,
+    Default,
+    InputObject,
+)]
+#[serde(rename_all = "snake_case")]
+#[graphql(input_name = "WorkoutSupersetsInformationInput")]
+pub struct WorkoutSupersetsInformation {
+    /// A color that will be displayed on the frontend.
+    pub color: String,
+    /// The identifier of all the exercises which are in the same superset
+    pub exercises: Vec<u16>,
+}
+
 /// Information about a workout done.
 #[skip_serializing_none]
 #[derive(
@@ -465,6 +508,7 @@ pub struct WorkoutInformation {
     pub comment: Option<String>,
     pub assets: Option<EntityAssets>,
     pub exercises: Vec<ProcessedExercise>,
+    pub supersets: Vec<WorkoutSupersetsInformation>,
 }
 
 /// The summary about an exercise done in a workout.
@@ -481,7 +525,7 @@ pub struct WorkoutInformation {
 )]
 #[serde(rename_all = "snake_case")]
 pub struct WorkoutSummaryExercise {
-    pub id: String,
+    pub name: String,
     pub num_sets: usize,
     pub lot: Option<ExerciseLot>,
     pub best_set: Option<WorkoutSetRecord>,
@@ -516,18 +560,17 @@ pub struct UserMeasurementsListInput {
 pub struct UserWorkoutSetRecord {
     pub lot: SetLot,
     pub note: Option<String>,
+    pub rest_time: Option<u16>,
     pub statistic: WorkoutSetStatistic,
     pub confirmed_at: Option<DateTimeUtc>,
 }
 
 #[derive(Clone, Debug, Deserialize, Serialize, InputObject)]
 pub struct UserExerciseInput {
-    pub exercise_id: String,
-    pub sets: Vec<UserWorkoutSetRecord>,
     pub notes: Vec<String>,
-    pub rest_time: Option<u16>,
+    pub exercise_id: String,
     pub assets: Option<EntityAssets>,
-    pub superset_with: Vec<u16>,
+    pub sets: Vec<UserWorkoutSetRecord>,
 }
 
 #[derive(Clone, Debug, Deserialize, Serialize, InputObject)]
@@ -539,13 +582,13 @@ pub struct UserWorkoutInput {
     pub template_id: Option<String>,
     pub assets: Option<EntityAssets>,
     pub repeated_from: Option<String>,
-    pub default_rest_timer: Option<i32>,
     // If specified, the workout will be created with this ID.
     #[graphql(skip_input)]
     pub create_workout_id: Option<String>,
     pub exercises: Vec<UserExerciseInput>,
     pub update_workout_id: Option<String>,
     pub update_workout_template_id: Option<String>,
+    pub supersets: Vec<WorkoutSupersetsInformation>,
 }
 
 impl UserWorkoutSetRecord {
@@ -625,8 +668,14 @@ pub struct ExerciseFilters {
     pub muscle: Vec<ExerciseMuscle>,
 }
 
+#[derive(Debug, InputObject)]
+pub struct UpdateUserExerciseSettings {
+    pub exercise_id: String,
+    pub change: UpdateComplexJsonInput,
+}
+
 #[derive(Clone, Debug, Deserialize, Serialize, InputObject)]
-pub struct UpdateUserWorkoutInput {
+pub struct UpdateUserWorkoutAttributesInput {
     pub id: String,
     pub start_time: Option<DateTimeUtc>,
     pub end_time: Option<DateTimeUtc>,
diff --git a/crates/models/media/src/lib.rs b/crates/models/media/src/lib.rs
index 97bd84e98c..d40dec8425 100644
--- a/crates/models/media/src/lib.rs
+++ b/crates/models/media/src/lib.rs
@@ -516,7 +516,7 @@ pub struct ExternalIdentifiers {
 }
 
 #[derive(Debug, Serialize, Deserialize, Clone, Default)]
-pub struct MediaDetails {
+pub struct MetadataDetails {
     pub identifier: String,
     pub is_nsfw: Option<bool>,
     pub title: String,
@@ -1211,14 +1211,6 @@ pub struct UpdateUserInput {
     pub admin_access_token: Option<String>,
 }
 
-#[derive(Debug, InputObject)]
-pub struct UpdateUserPreferenceInput {
-    /// Dot delimited path to the property that needs to be changed. Setting it\
-    /// to empty resets the preferences to default.
-    pub property: String,
-    pub value: String,
-}
-
 #[derive(Debug, InputObject)]
 pub struct GenreDetailsInput {
     pub genre_id: String,
diff --git a/crates/models/user/Cargo.toml b/crates/models/user/Cargo.toml
index 18bcbec661..1c45311efe 100644
--- a/crates/models/user/Cargo.toml
+++ b/crates/models/user/Cargo.toml
@@ -6,6 +6,7 @@ edition = "2021"
 [dependencies]
 async-graphql = { workspace = true }
 common-models = { path = "../../models/common" }
+educe = { workspace = true }
 enums = { path = "../../enums" }
 fitness-models = { path = "../../models/fitness" }
 sea-orm = { workspace = true }
diff --git a/crates/models/user/src/lib.rs b/crates/models/user/src/lib.rs
index 7335e50f4b..0b5bfb31de 100644
--- a/crates/models/user/src/lib.rs
+++ b/crates/models/user/src/lib.rs
@@ -1,7 +1,8 @@
 use async_graphql::{Enum, SimpleObject};
 use common_models::MediaStateChanged;
+use educe::Educe;
 use enums::MediaLot;
-use fitness_models::UserUnitSystem;
+use fitness_models::{SetRestTimersSettings, UserUnitSystem};
 use sea_orm::{FromJsonQueryResult, Iterable};
 use serde::{Deserialize, Serialize};
 use serde_with::skip_serializing_none;
@@ -19,126 +20,107 @@ const MOVIE_WATCH_PROVIDERS: [&str; 8] = [
 ];
 
 #[derive(
-    Debug, Serialize, Deserialize, SimpleObject, Clone, Eq, PartialEq, FromJsonQueryResult,
+    Debug, Serialize, Deserialize, SimpleObject, Clone, Eq, PartialEq, FromJsonQueryResult, Educe,
 )]
+#[educe(Default)]
 pub struct UserNotificationsPreferences {
+    #[educe(Default(expression = MediaStateChanged::iter().collect()))]
     pub to_send: Vec<MediaStateChanged>,
+    #[educe(Default = true)]
     pub enabled: bool,
 }
 
-impl Default for UserNotificationsPreferences {
-    fn default() -> Self {
-        Self {
-            to_send: MediaStateChanged::iter().collect(),
-            enabled: true,
-        }
-    }
-}
-
 #[derive(
-    Debug, Serialize, Deserialize, SimpleObject, Clone, Eq, PartialEq, FromJsonQueryResult,
+    Debug, Serialize, Deserialize, SimpleObject, Clone, Eq, PartialEq, FromJsonQueryResult, Educe,
 )]
+#[educe(Default)]
 pub struct UserMediaFeaturesEnabledPreferences {
+    #[educe(Default = true)]
     pub enabled: bool,
+    #[educe(Default = true)]
     pub anime: bool,
+    #[educe(Default = true)]
     pub audio_book: bool,
+    #[educe(Default = true)]
     pub book: bool,
+    #[educe(Default = true)]
     pub manga: bool,
+    #[educe(Default = true)]
     pub movie: bool,
+    #[educe(Default = true)]
     pub podcast: bool,
+    #[educe(Default = true)]
     pub show: bool,
+    #[educe(Default = true)]
     pub video_game: bool,
+    #[educe(Default = true)]
     pub visual_novel: bool,
+    #[educe(Default = true)]
     pub people: bool,
+    #[educe(Default = true)]
     pub groups: bool,
+    #[educe(Default = true)]
     pub genres: bool,
 }
 
-impl Default for UserMediaFeaturesEnabledPreferences {
-    fn default() -> Self {
-        Self {
-            enabled: true,
-            anime: true,
-            audio_book: true,
-            book: true,
-            manga: true,
-            movie: true,
-            podcast: true,
-            show: true,
-            video_game: true,
-            visual_novel: true,
-            people: true,
-            groups: true,
-            genres: true,
-        }
-    }
-}
-
 #[derive(
-    Debug, Serialize, Deserialize, SimpleObject, Clone, Eq, PartialEq, FromJsonQueryResult,
+    Debug, Serialize, Deserialize, SimpleObject, Clone, Eq, PartialEq, FromJsonQueryResult, Educe,
 )]
+#[educe(Default)]
 pub struct UserOthersFeaturesEnabledPreferences {
+    #[educe(Default = true)]
     pub collections: bool,
+    #[educe(Default = true)]
     pub calendar: bool,
 }
 
-impl Default for UserOthersFeaturesEnabledPreferences {
-    fn default() -> Self {
-        Self {
-            calendar: true,
-            collections: true,
-        }
-    }
-}
-
 #[derive(
-    Debug, Serialize, Deserialize, SimpleObject, Clone, Eq, PartialEq, FromJsonQueryResult,
+    Debug, Serialize, Deserialize, SimpleObject, Clone, Eq, PartialEq, FromJsonQueryResult, Educe,
 )]
+#[educe(Default)]
 pub struct UserFitnessFeaturesEnabledPreferences {
+    #[educe(Default = true)]
     pub enabled: bool,
+    #[educe(Default = true)]
     pub measurements: bool,
+    #[educe(Default = true)]
     pub workouts: bool,
+    #[educe(Default = true)]
     pub templates: bool,
 }
 
-impl Default for UserFitnessFeaturesEnabledPreferences {
-    fn default() -> Self {
-        Self {
-            enabled: true,
-            measurements: true,
-            workouts: true,
-            templates: true,
-        }
-    }
-}
-
 #[derive(
-    Debug, Serialize, Deserialize, SimpleObject, Clone, Eq, PartialEq, FromJsonQueryResult,
+    Debug, Serialize, Deserialize, SimpleObject, Clone, Eq, PartialEq, FromJsonQueryResult, Educe,
 )]
-pub struct UserExercisePreferences {
+#[educe(Default)]
+pub struct UserExercisesPreferences {
+    #[educe(Default = UserUnitSystem::Metric)]
     pub unit_system: UserUnitSystem,
-}
-
-impl Default for UserExercisePreferences {
-    fn default() -> Self {
-        Self {
-            unit_system: UserUnitSystem::Metric,
-        }
-    }
+    pub set_rest_timers: SetRestTimersSettings,
 }
 
 #[derive(
-    Debug, Serialize, Deserialize, SimpleObject, Clone, Eq, PartialEq, FromJsonQueryResult,
+    Debug, Serialize, Deserialize, SimpleObject, Clone, Eq, PartialEq, FromJsonQueryResult, Educe,
 )]
+#[educe(Default)]
 pub struct UserMeasurementsInBuiltPreferences {
+    #[educe(Default = true)]
     pub weight: bool,
+    #[educe(Default = true)]
     pub body_mass_index: bool,
+    #[educe(Default = true)]
     pub total_body_water: bool,
+    #[educe(Default = true)]
     pub muscle: bool,
+    #[educe(Default = true)]
     pub body_fat: bool,
+    #[educe(Default = true)]
     pub waist_to_height_ratio: bool,
+    #[educe(Default = true)]
     pub waist_to_hip_ratio: bool,
+    #[educe(Default = true)]
     pub basal_metabolic_rate: bool,
+    #[educe(Default = true)]
     pub total_daily_energy_expenditure: bool,
     pub calories: bool,
     pub lean_body_mass: bool,
@@ -156,36 +138,6 @@ pub struct UserMeasurementsInBuiltPreferences {
     pub thigh_skinfold: bool,
 }
 
-impl Default for UserMeasurementsInBuiltPreferences {
-    fn default() -> Self {
-        Self {
-            weight: true,
-            body_mass_index: true,
-            total_body_water: true,
-            muscle: true,
-            body_fat: true,
-            waist_to_height_ratio: true,
-            waist_to_hip_ratio: true,
-            basal_metabolic_rate: true,
-            total_daily_energy_expenditure: true,
-            calories: false,
-            lean_body_mass: false,
-            bone_mass: false,
-            visceral_fat: false,
-            waist_circumference: false,
-            hip_circumference: false,
-            chest_circumference: false,
-            thigh_circumference: false,
-            biceps_circumference: false,
-            neck_circumference: false,
-            body_fat_caliper: false,
-            chest_skinfold: false,
-            abdominal_skinfold: false,
-            thigh_skinfold: false,
-        }
-    }
-}
-
 #[derive(
     Debug, Serialize, Deserialize, Enum, Clone, Eq, PartialEq, FromJsonQueryResult, Copy, Default,
 )]
@@ -205,25 +157,19 @@ pub struct UserCustomMeasurement {
 }
 
 #[derive(
-    Debug, Serialize, Deserialize, SimpleObject, Clone, Eq, PartialEq, FromJsonQueryResult,
+    Debug, Serialize, Deserialize, SimpleObject, Clone, Eq, PartialEq, FromJsonQueryResult, Educe,
 )]
+#[educe(Default)]
 pub struct UserMeasurementsPreferences {
+    #[educe(Default(expression = vec![UserCustomMeasurement {
+        name: "sugar_level".to_owned(),
+        data_type: UserCustomMeasurementDataType::Decimal,
+    }]))]
     pub custom: Vec<UserCustomMeasurement>,
+    #[educe(Default(expression = UserMeasurementsInBuiltPreferences::default()))]
     pub inbuilt: UserMeasurementsInBuiltPreferences,
 }
 
-impl Default for UserMeasurementsPreferences {
-    fn default() -> Self {
-        Self {
-            custom: vec![UserCustomMeasurement {
-                name: "sugar_level".to_owned(),
-                data_type: UserCustomMeasurementDataType::Decimal,
-            }],
-            inbuilt: UserMeasurementsInBuiltPreferences::default(),
-        }
-    }
-}
-
 #[derive(
     Debug, Serialize, Deserialize, SimpleObject, Clone, Eq, PartialEq, Default, FromJsonQueryResult,
 )]
@@ -237,7 +183,7 @@ pub struct UserFeaturesEnabledPreferences {
     Debug, Serialize, Deserialize, SimpleObject, Clone, Eq, PartialEq, Default, FromJsonQueryResult,
 )]
 pub struct UserFitnessPreferences {
-    pub exercises: UserExercisePreferences,
+    pub exercises: UserExercisesPreferences,
     pub measurements: UserMeasurementsPreferences,
 }
 
@@ -314,80 +260,74 @@ pub struct UserGeneralWatchProvider {
 }
 
 #[derive(
-    Debug, Serialize, Deserialize, SimpleObject, Clone, Eq, PartialEq, FromJsonQueryResult,
+    Debug, Serialize, Deserialize, SimpleObject, Clone, Eq, PartialEq, FromJsonQueryResult, Educe,
 )]
+#[educe(Default)]
 pub struct UserGeneralPreferences {
+    #[educe(Default = true)]
     pub display_nsfw: bool,
+    #[educe(Default = false)]
     pub disable_videos: bool,
+    #[educe(Default = false)]
     pub disable_reviews: bool,
+    #[educe(Default = true)]
     pub persist_queries: bool,
+    #[educe(Default(expression = vec![UserGeneralWatchProvider {
+        lot: MediaLot::Movie,
+        values: MOVIE_WATCH_PROVIDERS
+            .into_iter()
+            .map(|s| s.to_owned())
+            .collect(),
+    }]))]
     pub watch_providers: Vec<UserGeneralWatchProvider>,
+    #[educe(Default = GridPacking::Dense)]
     pub grid_packing: GridPacking,
+    #[educe(Default = UserReviewScale::OutOfHundred)]
     pub review_scale: UserReviewScale,
+    #[educe(Default = false)]
     pub disable_watch_providers: bool,
+    #[educe(Default = false)]
     pub disable_integrations: bool,
+    #[educe(Default = false)]
     pub disable_navigation_animation: bool,
+    #[educe(Default(expression = vec![
+        UserGeneralDashboardElement {
+            section: DashboardElementLot::Upcoming,
+            hidden: false,
+            num_elements: Some(8),
+        },
+        UserGeneralDashboardElement {
+            section: DashboardElementLot::InProgress,
+            hidden: false,
+            num_elements: Some(8),
+        },
+        UserGeneralDashboardElement {
+            section: DashboardElementLot::Summary,
+            hidden: false,
+            num_elements: None,
+        },
+        UserGeneralDashboardElement {
+            section: DashboardElementLot::Recommendations,
+            hidden: false,
+            num_elements: Some(8),
+        },
+        UserGeneralDashboardElement {
+            section: DashboardElementLot::Activity,
+            hidden: false,
+            num_elements: None,
+        },
+    ]))]
     pub dashboard: Vec<UserGeneralDashboardElement>,
 }
 
-impl Default for UserGeneralPreferences {
-    fn default() -> Self {
-        Self {
-            watch_providers: vec![UserGeneralWatchProvider {
-                lot: MediaLot::Movie,
-                values: MOVIE_WATCH_PROVIDERS
-                    .into_iter()
-                    .map(|s| s.to_owned())
-                    .collect(),
-            }],
-            display_nsfw: true,
-            review_scale: UserReviewScale::default(),
-            grid_packing: GridPacking::default(),
-            dashboard: vec![
-                UserGeneralDashboardElement {
-                    section: DashboardElementLot::Upcoming,
-                    hidden: false,
-                    num_elements: Some(8),
-                },
-                UserGeneralDashboardElement {
-                    section: DashboardElementLot::InProgress,
-                    hidden: false,
-                    num_elements: Some(8),
-                },
-                UserGeneralDashboardElement {
-                    section: DashboardElementLot::Summary,
-                    hidden: false,
-                    num_elements: None,
-                },
-                UserGeneralDashboardElement {
-                    section: DashboardElementLot::Recommendations,
-                    hidden: false,
-                    num_elements: Some(8),
-                },
-                UserGeneralDashboardElement {
-                    section: DashboardElementLot::Activity,
-                    hidden: false,
-                    num_elements: None,
-                },
-            ],
-            persist_queries: true,
-            disable_integrations: false,
-            disable_navigation_animation: false,
-            disable_videos: false,
-            disable_watch_providers: false,
-            disable_reviews: false,
-        }
-    }
-}
-
 #[derive(
     Debug, Serialize, Deserialize, SimpleObject, Clone, Eq, PartialEq, Default, FromJsonQueryResult,
 )]
 pub struct UserPreferences {
-    pub features_enabled: UserFeaturesEnabledPreferences,
-    pub notifications: UserNotificationsPreferences,
     pub fitness: UserFitnessPreferences,
     pub general: UserGeneralPreferences,
+    pub notifications: UserNotificationsPreferences,
+    pub features_enabled: UserFeaturesEnabledPreferences,
 }
 
 #[derive(Debug, Serialize, Deserialize, Clone, Eq, PartialEq, FromJsonQueryResult)]
diff --git a/crates/providers/Cargo.toml b/crates/providers/Cargo.toml
index 96fc55aa99..71a9a3f205 100644
--- a/crates/providers/Cargo.toml
+++ b/crates/providers/Cargo.toml
@@ -16,6 +16,7 @@ const-str = { workspace = true }
 convert_case = { workspace = true }
 database-models = { path = "../models/database" }
 dependent-models = { path = "../models/dependent" }
+educe = { workspace = true }
 enums = { path = "../enums" }
 graphql_client = "=0.14.0"
 hashbag = { workspace = true }
diff --git a/crates/providers/src/anilist/mod.rs b/crates/providers/src/anilist/mod.rs
index 5c47599ed2..dd2af35f4f 100644
--- a/crates/providers/src/anilist/mod.rs
+++ b/crates/providers/src/anilist/mod.rs
@@ -9,7 +9,7 @@ use enums::{MediaLot, MediaSource};
 use graphql_client::{GraphQLQuery, Response};
 use itertools::Itertools;
 use media_models::{
-    AnimeAiringScheduleSpecifics, AnimeSpecifics, MangaSpecifics, MediaDetails,
+    AnimeAiringScheduleSpecifics, AnimeSpecifics, MangaSpecifics, MetadataDetails,
     MetadataImageForMediaDetails, MetadataPerson, MetadataPersonRelated, MetadataSearchItem,
     MetadataVideo, MetadataVideoSource, PartialMetadataPerson, PartialMetadataWithoutId,
     PeopleSearchItem, PersonSourceSpecifics,
@@ -464,7 +464,7 @@ impl AnilistAnimeService {
 
 #[async_trait]
 impl MediaProvider for AnilistAnimeService {
-    async fn metadata_details(&self, identifier: &str) -> Result<MediaDetails> {
+    async fn metadata_details(&self, identifier: &str) -> Result<MetadataDetails> {
         let details =
             media_details(&self.base.client, identifier, &self.base.preferred_language).await?;
         Ok(details)
@@ -508,7 +508,7 @@ impl AnilistMangaService {
 
 #[async_trait]
 impl MediaProvider for AnilistMangaService {
-    async fn metadata_details(&self, identifier: &str) -> Result<MediaDetails> {
+    async fn metadata_details(&self, identifier: &str) -> Result<MetadataDetails> {
         let details =
             media_details(&self.base.client, identifier, &self.base.preferred_language).await?;
         Ok(details)
@@ -541,7 +541,7 @@ async fn media_details(
     client: &Client,
     id: &str,
     preferred_language: &AnilistPreferredLanguage,
-) -> Result<MediaDetails> {
+) -> Result<MetadataDetails> {
     let variables = media_details_query::Variables {
         id: id.parse::<i64>().unwrap(),
     };
@@ -704,7 +704,7 @@ async fn media_details(
         title.romaji,
         preferred_language,
     );
-    Ok(MediaDetails {
+    Ok(MetadataDetails {
         title,
         identifier: media.id.to_string(),
         is_nsfw: media.is_adult,
diff --git a/crates/providers/src/audible.rs b/crates/providers/src/audible.rs
index 56d79a155e..2adb5124e1 100644
--- a/crates/providers/src/audible.rs
+++ b/crates/providers/src/audible.rs
@@ -6,10 +6,11 @@ use common_utils::{convert_date_to_year, convert_string_to_date};
 use convert_case::{Case, Casing};
 use database_models::metadata_group::MetadataGroupWithoutId;
 use dependent_models::SearchResults;
+use educe::Educe;
 use enums::{MediaLot, MediaSource};
 use itertools::Itertools;
 use media_models::{
-    AudioBookSpecifics, MediaDetails, MetadataFreeCreator, MetadataImageForMediaDetails,
+    AudioBookSpecifics, MetadataDetails, MetadataFreeCreator, MetadataImageForMediaDetails,
     MetadataPerson, MetadataSearchItem, PartialMetadataPerson, PartialMetadataWithoutId,
     PeopleSearchItem, PersonSourceSpecifics,
 };
@@ -33,31 +34,17 @@ enum AudibleSimilarityType {
     NextInSameSeries,
 }
 
-#[derive(Serialize, Deserialize)]
+#[derive(Serialize, Deserialize, Educe)]
+#[educe(Default)]
 struct PrimaryQuery {
+    #[educe(
+        Default = "contributors,category_ladders,media,product_attrs,product_extended_attrs,series,relationships,rating"
+    )]
     response_groups: String,
+    #[educe(Default = "2400")]
     image_sizes: String,
 }
 
-impl Default for PrimaryQuery {
-    fn default() -> Self {
-        Self {
-            response_groups: [
-                "contributors",
-                "category_ladders",
-                "media",
-                "product_attrs",
-                "product_extended_attrs",
-                "series",
-                "relationships",
-                "rating",
-            ]
-            .join(","),
-            image_sizes: ["2400"].join(","),
-        }
-    }
-}
-
 #[derive(Serialize, Deserialize)]
 struct SearchQuery {
     title: String,
@@ -323,7 +310,7 @@ impl MediaProvider for AudibleService {
         ))
     }
 
-    async fn metadata_details(&self, identifier: &str) -> Result<MediaDetails> {
+    async fn metadata_details(&self, identifier: &str) -> Result<MetadataDetails> {
         let rsp = self
             .client
             .get(format!("{}/{}", self.url, identifier))
@@ -423,7 +410,7 @@ impl MediaProvider for AudibleService {
 }
 
 impl AudibleService {
-    fn audible_response_to_search_response(&self, item: AudibleItem) -> MediaDetails {
+    fn audible_response_to_search_response(&self, item: AudibleItem) -> MetadataDetails {
         let images = Vec::from_iter(
             item.product_images
                 .unwrap()
@@ -466,7 +453,7 @@ impl AudibleService {
         } else {
             None
         };
-        MediaDetails {
+        MetadataDetails {
             identifier: item.asin,
             lot: MediaLot::AudioBook,
             source: MediaSource::Audible,
diff --git a/crates/providers/src/google_books.rs b/crates/providers/src/google_books.rs
index 36d0a1b0d6..6784b248ec 100644
--- a/crates/providers/src/google_books.rs
+++ b/crates/providers/src/google_books.rs
@@ -8,7 +8,7 @@ use dependent_models::SearchResults;
 use enums::{MediaLot, MediaSource};
 use itertools::Itertools;
 use media_models::{
-    BookSpecifics, MediaDetails, MetadataFreeCreator, MetadataImageForMediaDetails,
+    BookSpecifics, MetadataDetails, MetadataFreeCreator, MetadataImageForMediaDetails,
     MetadataSearchItem,
 };
 use reqwest::{
@@ -94,7 +94,7 @@ struct SearchResponse {
 
 #[async_trait]
 impl MediaProvider for GoogleBooksService {
-    async fn metadata_details(&self, identifier: &str) -> Result<MediaDetails> {
+    async fn metadata_details(&self, identifier: &str) -> Result<MetadataDetails> {
         let rsp = self
             .client
             .get(format!("{}/{}", URL, identifier))
@@ -135,7 +135,7 @@ impl MediaProvider for GoogleBooksService {
             .unwrap_or_default()
             .into_iter()
             .map(|b| {
-                let MediaDetails {
+                let MetadataDetails {
                     identifier,
                     title,
                     url_images,
@@ -171,7 +171,7 @@ impl GoogleBooksService {
         &self,
         item: ItemVolumeInfo,
         id: String,
-    ) -> MediaDetails {
+    ) -> MetadataDetails {
         let mut images = vec![];
         if let Some(il) = item.image_links {
             if let Some(a) = il.thumbnail {
@@ -222,7 +222,7 @@ impl GoogleBooksService {
         if let Some(g) = item.main_category {
             genres.push(g);
         }
-        MediaDetails {
+        MetadataDetails {
             identifier: id,
             lot: MediaLot::Book,
             source: MediaSource::GoogleBooks,
diff --git a/crates/providers/src/igdb.rs b/crates/providers/src/igdb.rs
index 66054d5bf3..d4924cf872 100644
--- a/crates/providers/src/igdb.rs
+++ b/crates/providers/src/igdb.rs
@@ -11,7 +11,7 @@ use dependent_models::SearchResults;
 use enums::{MediaLot, MediaSource};
 use itertools::Itertools;
 use media_models::{
-    MediaDetails, MetadataGroupSearchItem, MetadataImageForMediaDetails, MetadataPerson,
+    MetadataDetails, MetadataGroupSearchItem, MetadataImageForMediaDetails, MetadataPerson,
     MetadataPersonRelated, MetadataSearchItem, MetadataVideo, MetadataVideoSource,
     PartialMetadataPerson, PartialMetadataWithoutId, PeopleSearchItem, PersonSourceSpecifics,
     VideoGameSpecifics,
@@ -424,7 +424,7 @@ where id = {id};
         })
     }
 
-    async fn metadata_details(&self, identifier: &str) -> Result<MediaDetails> {
+    async fn metadata_details(&self, identifier: &str) -> Result<MetadataDetails> {
         let client = self.get_client().await;
         let req_body = format!(
             r#"{field} where id = {id};"#,
@@ -564,7 +564,7 @@ impl IgdbService {
         ]))
     }
 
-    fn igdb_response_to_search_response(&self, item: IgdbItemResponse) -> MediaDetails {
+    fn igdb_response_to_search_response(&self, item: IgdbItemResponse) -> MetadataDetails {
         let mut images = Vec::from_iter(item.cover.map(|a| MetadataImageForMediaDetails {
             image: self.get_cover_image_url(a.image_id),
         }));
@@ -612,7 +612,7 @@ impl IgdbService {
                 source: MetadataVideoSource::Youtube,
             })
             .collect_vec();
-        MediaDetails {
+        MetadataDetails {
             identifier: item.id.to_string(),
             lot: MediaLot::VideoGame,
             source: MediaSource::Igdb,
diff --git a/crates/providers/src/itunes.rs b/crates/providers/src/itunes.rs
index 3396ee4078..9844a63adf 100644
--- a/crates/providers/src/itunes.rs
+++ b/crates/providers/src/itunes.rs
@@ -7,7 +7,7 @@ use dependent_models::SearchResults;
 use enums::{MediaLot, MediaSource};
 use itertools::Itertools;
 use media_models::{
-    MediaDetails, MetadataFreeCreator, MetadataImageForMediaDetails, MetadataSearchItem,
+    MetadataDetails, MetadataFreeCreator, MetadataImageForMediaDetails, MetadataSearchItem,
     PodcastEpisode, PodcastSpecifics,
 };
 use reqwest::Client;
@@ -79,7 +79,7 @@ struct SearchResponse {
 
 #[async_trait]
 impl MediaProvider for ITunesService {
-    async fn metadata_details(&self, identifier: &str) -> Result<MediaDetails> {
+    async fn metadata_details(&self, identifier: &str) -> Result<MetadataDetails> {
         let rsp = self
             .client
             .get(format!("{}/lookup", URL))
@@ -154,7 +154,7 @@ impl MediaProvider for ITunesService {
             })
             .collect_vec();
         episodes.reverse();
-        Ok(MediaDetails {
+        Ok(MetadataDetails {
             identifier: details.identifier,
             title: details.title,
             publish_date,
diff --git a/crates/providers/src/listennotes.rs b/crates/providers/src/listennotes.rs
index 1f37020806..f9684d5691 100644
--- a/crates/providers/src/listennotes.rs
+++ b/crates/providers/src/listennotes.rs
@@ -10,7 +10,7 @@ use dependent_models::SearchResults;
 use enums::{MediaLot, MediaSource};
 use itertools::Itertools;
 use media_models::{
-    MediaDetails, MetadataFreeCreator, MetadataImageForMediaDetails, MetadataSearchItem,
+    MetadataDetails, MetadataFreeCreator, MetadataImageForMediaDetails, MetadataSearchItem,
     PartialMetadataWithoutId, PodcastEpisode, PodcastSpecifics,
 };
 use reqwest::{
@@ -68,7 +68,7 @@ impl ListennotesService {
 
 #[async_trait]
 impl MediaProvider for ListennotesService {
-    async fn metadata_details(&self, identifier: &str) -> Result<MediaDetails> {
+    async fn metadata_details(&self, identifier: &str) -> Result<MetadataDetails> {
         let mut details = self
             .details_with_paginated_episodes(identifier, None, None)
             .await?;
@@ -196,7 +196,7 @@ impl ListennotesService {
         identifier: &str,
         next_pub_date: Option<i64>,
         episode_number: Option<i32>,
-    ) -> Result<MediaDetails> {
+    ) -> Result<MetadataDetails> {
         #[serde_as]
         #[derive(Serialize, Deserialize, Debug)]
         struct Podcast {
@@ -225,7 +225,7 @@ impl ListennotesService {
             .await
             .map_err(|e| anyhow!(e))?;
         let podcast_data: Podcast = rsp.json().await.map_err(|e| anyhow!(e))?;
-        Ok(MediaDetails {
+        Ok(MetadataDetails {
             identifier: podcast_data.id,
             title: podcast_data.title,
             is_nsfw: podcast_data.explicit_content,
diff --git a/crates/providers/src/mal.rs b/crates/providers/src/mal.rs
index 89f6a860a7..4869c68c3c 100644
--- a/crates/providers/src/mal.rs
+++ b/crates/providers/src/mal.rs
@@ -7,7 +7,7 @@ use convert_case::{Case, Casing};
 use dependent_models::SearchResults;
 use enums::{MediaLot, MediaSource};
 use media_models::{
-    AnimeSpecifics, MangaSpecifics, MediaDetails, MetadataImageForMediaDetails, MetadataSearchItem,
+    AnimeSpecifics, MangaSpecifics, MetadataDetails, MetadataImageForMediaDetails, MetadataSearchItem,
     PartialMetadataWithoutId,
 };
 use rand::{seq::SliceRandom, thread_rng};
@@ -67,7 +67,7 @@ impl MalAnimeService {
 
 #[async_trait]
 impl MediaProvider for MalAnimeService {
-    async fn metadata_details(&self, identifier: &str) -> Result<MediaDetails> {
+    async fn metadata_details(&self, identifier: &str) -> Result<MetadataDetails> {
         let details = details(&self.base.client, "anime", identifier).await?;
         Ok(details)
     }
@@ -105,7 +105,7 @@ impl MalMangaService {
 
 #[async_trait]
 impl MediaProvider for MalMangaService {
-    async fn metadata_details(&self, identifier: &str) -> Result<MediaDetails> {
+    async fn metadata_details(&self, identifier: &str) -> Result<MetadataDetails> {
         let details = details(&self.base.client, "manga", identifier).await?;
         Ok(details)
     }
@@ -202,7 +202,7 @@ struct ItemData {
     node: ItemNode,
 }
 
-async fn details(client: &Client, media_type: &str, id: &str) -> Result<MediaDetails> {
+async fn details(client: &Client, media_type: &str, id: &str) -> Result<MetadataDetails> {
     let details: ItemNode = client
         .get(format!("{}/{}/{}", URL, media_type, id))
         .query(&json!({ "fields": "start_date,end_date,synopsis,genres,status,num_episodes,num_volumes,num_chapters,recommendations,related_manga,related_anime,mean,nsfw" }))
@@ -263,7 +263,7 @@ async fn details(client: &Client, media_type: &str, id: &str) -> Result<MediaDet
     }
     suggestions.shuffle(&mut thread_rng());
     let is_nsfw = details.nsfw.map(|n| !matches!(n.as_str(), "white"));
-    let data = MediaDetails {
+    let data = MetadataDetails {
         identifier: details.id.to_string(),
         title: details.title,
         source: MediaSource::Mal,
diff --git a/crates/providers/src/manga_updates.rs b/crates/providers/src/manga_updates.rs
index 27f0b5db1c..f75d1b7117 100644
--- a/crates/providers/src/manga_updates.rs
+++ b/crates/providers/src/manga_updates.rs
@@ -7,7 +7,7 @@ use dependent_models::SearchResults;
 use enums::{MediaLot, MediaSource};
 use itertools::Itertools;
 use media_models::{
-    MangaSpecifics, MediaDetails, MetadataImageForMediaDetails, MetadataPerson,
+    MangaSpecifics, MetadataDetails, MetadataImageForMediaDetails, MetadataPerson,
     MetadataPersonRelated, MetadataSearchItem, PartialMetadataPerson, PartialMetadataWithoutId,
     PeopleSearchItem, PersonSourceSpecifics,
 };
@@ -274,7 +274,7 @@ impl MediaProvider for MangaUpdatesService {
         Ok(resp)
     }
 
-    async fn metadata_details(&self, identifier: &str) -> Result<MediaDetails> {
+    async fn metadata_details(&self, identifier: &str) -> Result<MetadataDetails> {
         let data: MetadataItemRecord = self
             .client
             .get(format!("{}/series/{}", URL, identifier))
@@ -334,7 +334,7 @@ impl MediaProvider for MangaUpdatesService {
 
         let (volumes, status) = self.extract_status(data.status.clone());
 
-        Ok(MediaDetails {
+        Ok(MetadataDetails {
             identifier: data.series_id.unwrap().to_string(),
             title: data.title.unwrap(),
             description: data.description,
diff --git a/crates/providers/src/openlibrary.rs b/crates/providers/src/openlibrary.rs
index f600e626e0..d4c12e46d8 100644
--- a/crates/providers/src/openlibrary.rs
+++ b/crates/providers/src/openlibrary.rs
@@ -9,7 +9,7 @@ use dependent_models::SearchResults;
 use enums::{MediaLot, MediaSource};
 use itertools::Itertools;
 use media_models::{
-    BookSpecifics, MediaDetails, MetadataImageForMediaDetails, MetadataPerson,
+    BookSpecifics, MetadataDetails, MetadataImageForMediaDetails, MetadataPerson,
     MetadataPersonRelated, MetadataSearchItem, PartialMetadataPerson, PartialMetadataWithoutId,
     PeopleSearchItem, PersonSourceSpecifics,
 };
@@ -295,7 +295,7 @@ impl MediaProvider for OpenlibraryService {
         })
     }
 
-    async fn metadata_details(&self, identifier: &str) -> Result<MediaDetails> {
+    async fn metadata_details(&self, identifier: &str) -> Result<MetadataDetails> {
         let rsp = self
             .client
             .get(format!("{}/works/{}.json", URL, identifier))
@@ -450,7 +450,7 @@ impl MediaProvider for OpenlibraryService {
             }
         }
 
-        Ok(MediaDetails {
+        Ok(MetadataDetails {
             identifier: get_key(&data.key),
             title: data.title,
             description,
diff --git a/crates/providers/src/tmdb.rs b/crates/providers/src/tmdb.rs
index 0d8bb3ab9a..988274ddf2 100644
--- a/crates/providers/src/tmdb.rs
+++ b/crates/providers/src/tmdb.rs
@@ -19,7 +19,7 @@ use enums::{MediaLot, MediaSource};
 use hashbag::HashBag;
 use itertools::Itertools;
 use media_models::{
-    ExternalIdentifiers, MediaDetails, MetadataGroupSearchItem, MetadataImage,
+    ExternalIdentifiers, MetadataDetails, MetadataGroupSearchItem, MetadataImage,
     MetadataImageForMediaDetails, MetadataPerson, MetadataPersonRelated, MetadataSearchItem,
     MetadataVideo, MetadataVideoSource, MovieSpecifics, PartialMetadataPerson,
     PartialMetadataWithoutId, PeopleSearchItem, PersonSourceSpecifics, ShowEpisode, ShowSeason,
@@ -694,7 +694,7 @@ impl MediaProvider for TmdbMovieService {
         })
     }
 
-    async fn metadata_details(&self, identifier: &str) -> Result<MediaDetails> {
+    async fn metadata_details(&self, identifier: &str) -> Result<MetadataDetails> {
         let rsp = self
             .base
             .client
@@ -799,7 +799,7 @@ impl MediaProvider for TmdbMovieService {
             .base
             .get_external_identifiers("movie", identifier)
             .await?;
-        Ok(MediaDetails {
+        Ok(MetadataDetails {
             identifier: data.id.to_string(),
             is_nsfw: data.adult,
             original_language: self.base.get_language_name(data.original_language),
@@ -1002,7 +1002,7 @@ impl TmdbShowService {
 
 #[async_trait]
 impl MediaProvider for TmdbShowService {
-    async fn metadata_details(&self, identifier: &str) -> Result<MediaDetails> {
+    async fn metadata_details(&self, identifier: &str) -> Result<MetadataDetails> {
         let rsp = self
             .base
             .client
@@ -1164,7 +1164,7 @@ impl MediaProvider for TmdbShowService {
             .count();
         let watch_providers = self.base.get_all_watch_providers("tv", identifier).await?;
         let external_identifiers = self.base.get_external_identifiers("tv", identifier).await?;
-        Ok(MediaDetails {
+        Ok(MetadataDetails {
             identifier: show_data.id.to_string(),
             title: show_data.name.unwrap(),
             is_nsfw: show_data.adult,
diff --git a/crates/providers/src/vndb.rs b/crates/providers/src/vndb.rs
index 70d5ea39d7..fb0852e736 100644
--- a/crates/providers/src/vndb.rs
+++ b/crates/providers/src/vndb.rs
@@ -7,7 +7,7 @@ use dependent_models::SearchResults;
 use enums::{MediaLot, MediaSource};
 use itertools::Itertools;
 use media_models::{
-    MediaDetails, MetadataImageForMediaDetails, MetadataPerson, MetadataSearchItem,
+    MetadataDetails, MetadataImageForMediaDetails, MetadataPerson, MetadataSearchItem,
     PartialMetadataPerson, PeopleSearchItem, PersonSourceSpecifics, VisualNovelSpecifics,
 };
 use reqwest::Client;
@@ -164,7 +164,7 @@ impl MediaProvider for VndbService {
         })
     }
 
-    async fn metadata_details(&self, identifier: &str) -> Result<MediaDetails> {
+    async fn metadata_details(&self, identifier: &str) -> Result<MetadataDetails> {
         let rsp = self
             .client
             .post(format!("{}/vn", URL))
@@ -208,7 +208,7 @@ impl MediaProvider for VndbService {
             .unwrap_or_default()
             .into_iter()
             .map(|b| {
-                let MediaDetails {
+                let MetadataDetails {
                     identifier,
                     title,
                     url_images,
@@ -236,7 +236,7 @@ impl MediaProvider for VndbService {
 }
 
 impl VndbService {
-    fn vndb_response_to_search_response(&self, item: ItemResponse) -> MediaDetails {
+    fn vndb_response_to_search_response(&self, item: ItemResponse) -> MetadataDetails {
         let mut images = vec![];
         if let Some(il) = item.image {
             images.push(il.url);
@@ -266,7 +266,7 @@ impl VndbService {
             .into_iter()
             .map(|t| t.name)
             .collect_vec();
-        MediaDetails {
+        MetadataDetails {
             identifier: item.id,
             lot: MediaLot::VisualNovel,
             source: MediaSource::Vndb,
diff --git a/crates/resolvers/fitness/src/lib.rs b/crates/resolvers/fitness/src/lib.rs
index 664170ac35..56d2ca2be2 100644
--- a/crates/resolvers/fitness/src/lib.rs
+++ b/crates/resolvers/fitness/src/lib.rs
@@ -8,8 +8,8 @@ use dependent_models::{
     UserWorkoutTemplateDetails,
 };
 use fitness_models::{
-    ExerciseListItem, ExerciseParameters, ExercisesListInput, UpdateUserWorkoutInput,
-    UserMeasurementsListInput, UserWorkoutInput,
+    ExerciseListItem, ExerciseParameters, ExercisesListInput, UpdateUserExerciseSettings,
+    UpdateUserWorkoutAttributesInput, UserMeasurementsListInput, UserWorkoutInput,
 };
 use fitness_service::ExerciseService;
 use sea_orm::prelude::DateTimeUtc;
@@ -85,14 +85,14 @@ impl ExerciseQuery {
     }
 
     /// Get details about a workout.
-    async fn workout_details(
+    async fn user_workout_details(
         &self,
         gql_ctx: &Context<'_>,
         workout_id: String,
     ) -> Result<UserWorkoutDetails> {
         let service = gql_ctx.data_unchecked::<Arc<ExerciseService>>();
         let user_id = self.user_id_from_ctx(gql_ctx).await?;
-        service.workout_details(&user_id, workout_id).await
+        service.user_workout_details(&user_id, workout_id).await
     }
 
     /// Get information about an exercise for a user.
@@ -189,14 +189,14 @@ impl ExerciseMutation {
     }
 
     /// Change the details about a user's workout.
-    async fn update_user_workout(
+    async fn update_user_workout_attributes(
         &self,
         gql_ctx: &Context<'_>,
-        input: UpdateUserWorkoutInput,
+        input: UpdateUserWorkoutAttributesInput,
     ) -> Result<bool> {
         let service = gql_ctx.data_unchecked::<Arc<ExerciseService>>();
         let user_id = self.user_id_from_ctx(gql_ctx).await?;
-        service.update_user_workout(user_id, input).await
+        service.update_user_workout_attributes(user_id, input).await
     }
 
     /// Delete a workout and remove all exercise associations.
@@ -227,4 +227,15 @@ impl ExerciseMutation {
         let user_id = self.user_id_from_ctx(gql_ctx).await?;
         service.update_custom_exercise(user_id, input).await
     }
+
+    /// Update a user's exercise settings.
+    async fn update_user_exercise_settings(
+        &self,
+        gql_ctx: &Context<'_>,
+        input: UpdateUserExerciseSettings,
+    ) -> Result<bool> {
+        let service = gql_ctx.data_unchecked::<Arc<ExerciseService>>();
+        let user_id = self.user_id_from_ctx(gql_ctx).await?;
+        service.update_user_exercise_settings(user_id, input).await
+    }
 }
diff --git a/crates/resolvers/user/src/lib.rs b/crates/resolvers/user/src/lib.rs
index c9bf68ab1c..0cb20e62a6 100644
--- a/crates/resolvers/user/src/lib.rs
+++ b/crates/resolvers/user/src/lib.rs
@@ -1,14 +1,14 @@
 use std::sync::Arc;
 
 use async_graphql::{Context, Object, Result};
-use common_models::StringIdObject;
+use common_models::{StringIdObject, UpdateComplexJsonInput};
 use database_models::{access_link, integration, notification_platform, user};
 use dependent_models::UserDetailsResult;
 use media_models::{
     AuthUserInput, CreateAccessLinkInput, CreateUserIntegrationInput,
     CreateUserNotificationPlatformInput, LoginResult, OidcTokenOutput, ProcessAccessLinkInput,
     ProcessAccessLinkResult, RegisterResult, RegisterUserInput, UpdateUserInput,
-    UpdateUserIntegrationInput, UpdateUserNotificationPlatformInput, UpdateUserPreferenceInput,
+    UpdateUserIntegrationInput, UpdateUserNotificationPlatformInput,
 };
 use traits::AuthProvider;
 use user_models::UserPreferences;
@@ -181,7 +181,7 @@ impl UserMutation {
     async fn update_user_preference(
         &self,
         gql_ctx: &Context<'_>,
-        input: UpdateUserPreferenceInput,
+        input: UpdateComplexJsonInput,
     ) -> Result<bool> {
         let service = gql_ctx.data_unchecked::<Arc<UserService>>();
         let user_id = self.user_id_from_ctx(gql_ctx).await?;
diff --git a/crates/services/exporter/src/lib.rs b/crates/services/exporter/src/lib.rs
index 4fefd3cfd2..2ac943aae4 100644
--- a/crates/services/exporter/src/lib.rs
+++ b/crates/services/exporter/src/lib.rs
@@ -13,8 +13,8 @@ use database_models::{
     seen, user_to_entity, workout, workout_template,
 };
 use database_utils::{
-    entity_in_collections, item_reviews, user_measurements_list, workout_details,
-    workout_template_details,
+    entity_in_collections, item_reviews, user_measurements_list, user_workout_details,
+    user_workout_template_details,
 };
 use dependent_models::{ImportOrExportWorkoutItem, ImportOrExportWorkoutTemplateItem};
 use enums::EntityLot;
@@ -341,7 +341,7 @@ impl ExporterService {
             .all(&self.0.db)
             .await?;
         for workout_id in workout_ids {
-            let details = workout_details(user_id, workout_id, &self.0).await?;
+            let details = user_workout_details(user_id, workout_id, &self.0).await?;
             let exp = ImportOrExportWorkoutItem {
                 details: details.details,
                 collections: details.collections.into_iter().map(|c| c.name).collect(),
@@ -425,7 +425,7 @@ impl ExporterService {
             .await?;
         for workout_template_id in workout_template_ids {
             let details =
-                workout_template_details(&self.0.db, user_id, workout_template_id).await?;
+                user_workout_template_details(&self.0.db, user_id, workout_template_id).await?;
             let exp = ImportOrExportWorkoutTemplateItem {
                 details: details.details,
                 collections: details.collections.into_iter().map(|c| c.name).collect(),
diff --git a/crates/services/fitness/Cargo.toml b/crates/services/fitness/Cargo.toml
index 09b40d1986..4d6341b732 100644
--- a/crates/services/fitness/Cargo.toml
+++ b/crates/services/fitness/Cargo.toml
@@ -4,7 +4,6 @@ version = "0.1.0"
 edition = "2021"
 
 [dependencies]
-anyhow = { workspace = true }
 apalis = { workspace = true }
 application-utils = { path = "../../utils/application" }
 async-graphql = { workspace = true }
diff --git a/crates/services/fitness/src/lib.rs b/crates/services/fitness/src/lib.rs
index 69a87e544d..c6f6847282 100644
--- a/crates/services/fitness/src/lib.rs
+++ b/crates/services/fitness/src/lib.rs
@@ -17,8 +17,8 @@ use database_models::{
 };
 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, workout_details,
-    workout_template_details,
+    ilike_sql, item_reviews, pro_instance_guard, user_measurements_list, user_workout_details,
+    user_workout_template_details,
 };
 use dependent_models::{
     SearchResults, UpdateCustomExerciseInput, UserExerciseDetails, UserWorkoutDetails,
@@ -34,7 +34,8 @@ use enums::{
 use fitness_models::{
     ExerciseAttributes, ExerciseCategory, ExerciseFilters, ExerciseListItem, ExerciseParameters,
     ExerciseParametersLotMapping, ExerciseSortBy, ExercisesListInput, GithubExercise,
-    GithubExerciseAttributes, ProcessedExercise, UpdateUserWorkoutInput, UserMeasurementsListInput,
+    GithubExerciseAttributes, ProcessedExercise, UpdateUserExerciseSettings,
+    UpdateUserWorkoutAttributesInput, UserMeasurementsListInput, UserToExerciseExtraInformation,
     UserWorkoutInput, WorkoutInformation, WorkoutSetRecord, WorkoutSummary, WorkoutSummaryExercise,
     LOT_MAPPINGS,
 };
@@ -47,12 +48,8 @@ use sea_orm::{
 };
 use sea_query::{extension::postgres::PgExpr, Alias, Condition, Expr, Func, JoinType, OnConflict};
 use slug::slugify;
-
-use logic::delete_existing_workout;
 use supporting_service::SupportingService;
 
-mod logic;
-
 const EXERCISE_DB_URL: &str = "https://raw.githubusercontent.com/yuhonas/free-exercise-db/main";
 const JSON_URL: &str = const_str::concat!(EXERCISE_DB_URL, "/dist/exercises.json");
 const IMAGES_PREFIX_URL: &str = const_str::concat!(EXERCISE_DB_URL, "/exercises");
@@ -95,7 +92,7 @@ impl ExerciseService {
         user_id: String,
         workout_template_id: String,
     ) -> Result<UserWorkoutTemplateDetails> {
-        workout_template_details(&self.0.db, &user_id, workout_template_id).await
+        user_workout_template_details(&self.0.db, &user_id, workout_template_id).await
     }
 
     pub async fn create_or_update_user_workout_template(
@@ -110,13 +107,14 @@ impl ExerciseService {
         };
         let mut information = WorkoutInformation {
             assets: None,
-            comment: input.comment,
             exercises: vec![],
+            comment: input.comment,
+            supersets: input.supersets,
         };
         for exercise in input.exercises {
             let db_ex = self.exercise_details(exercise.exercise_id.clone()).await?;
             summary.exercises.push(WorkoutSummaryExercise {
-                id: exercise.exercise_id.clone(),
+                name: exercise.exercise_id.clone(),
                 best_set: None,
                 lot: None,
                 num_sets: exercise.sets.len(),
@@ -135,13 +133,12 @@ impl ExerciseService {
                         confirmed_at: None,
                         personal_bests: None,
                         actual_rest_time: None,
+                        rest_time: s.rest_time,
                         statistic: s.statistic,
                     })
                     .collect(),
                 notes: exercise.notes,
                 name: exercise.exercise_id,
-                rest_time: exercise.rest_time,
-                superset_with: exercise.superset_with,
             });
         }
         let template = workout_template::ActiveModel {
@@ -154,7 +151,6 @@ impl ExerciseService {
             summary: ActiveValue::Set(summary),
             information: ActiveValue::Set(information),
             visibility: ActiveValue::Set(Visibility::Private),
-            default_rest_timer: ActiveValue::Set(input.default_rest_timer),
             ..Default::default()
         };
         let template = WorkoutTemplate::insert(template)
@@ -165,7 +161,6 @@ impl ExerciseService {
                         workout_template::Column::Summary,
                         workout_template::Column::Visibility,
                         workout_template::Column::Information,
-                        workout_template::Column::DefaultRestTimer,
                     ])
                     .to_owned(),
             )
@@ -248,12 +243,12 @@ impl ExerciseService {
         }
     }
 
-    pub async fn workout_details(
+    pub async fn user_workout_details(
         &self,
         user_id: &String,
         workout_id: String,
     ) -> Result<UserWorkoutDetails> {
-        workout_details(user_id, workout_id, &self.0).await
+        user_workout_details(user_id, workout_id, &self.0).await
     }
 
     pub async fn user_exercise_details(
@@ -554,10 +549,10 @@ impl ExerciseService {
         Ok(identifier)
     }
 
-    pub async fn update_user_workout(
+    pub async fn update_user_workout_attributes(
         &self,
         user_id: String,
-        input: UpdateUserWorkoutInput,
+        input: UpdateUserWorkoutAttributesInput,
     ) -> Result<bool> {
         if let Some(wkt) = Workout::find()
             .filter(workout::Column::UserId.eq(&user_id))
@@ -630,16 +625,42 @@ impl ExerciseService {
     }
 
     pub async fn delete_user_workout(&self, user_id: String, workout_id: String) -> Result<bool> {
-        if let Some(wkt) = Workout::find_by_id(workout_id)
+        let wkt = match Workout::find_by_id(workout_id)
             .filter(workout::Column::UserId.eq(&user_id))
             .one(&self.0.db)
             .await?
         {
-            delete_existing_workout(wkt, &self.0.db, user_id).await?;
-            Ok(true)
-        } else {
-            Err(Error::new("Workout does not exist for user"))
+            Some(wkt) => wkt,
+            None => return Err(Error::new("Workout does not exist for user")),
+        };
+        for (idx, ex) in wkt.information.exercises.iter().enumerate() {
+            let association = match UserToEntity::find()
+                .filter(user_to_entity::Column::UserId.eq(&user_id))
+                .filter(user_to_entity::Column::ExerciseId.eq(ex.name.clone()))
+                .one(&self.0.db)
+                .await?
+            {
+                None => continue,
+                Some(assoc) => assoc,
+            };
+            let mut ei = association
+                .exercise_extra_information
+                .clone()
+                .unwrap_or_default();
+            if let Some(ex_idx) = ei
+                .history
+                .iter()
+                .position(|e| e.workout_id == wkt.id && e.idx == idx)
+            {
+                ei.history.remove(ex_idx);
+            }
+            let mut association: user_to_entity::ActiveModel = association.into();
+            association.exercise_extra_information = ActiveValue::Set(Some(ei));
+            association.update(&self.0.db).await?;
         }
+        wkt.delete(&self.0.db).await?;
+        self.re_evaluate_user_workouts(user_id).await?;
+        Ok(true)
     }
 
     pub async fn re_evaluate_user_workouts(&self, user_id: String) -> Result<()> {
@@ -715,7 +736,7 @@ impl ExerciseService {
                         .unwrap();
                     let mut summary = db_workout.summary.clone();
                     let mut information = db_workout.information.clone();
-                    summary.exercises[workout.idx].id = input.update.id.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);
@@ -736,4 +757,51 @@ impl ExerciseService {
             .await?;
         Ok(true)
     }
+
+    pub async fn update_user_exercise_settings(
+        &self,
+        user_id: String,
+        input: UpdateUserExerciseSettings,
+    ) -> Result<bool> {
+        let err = || Error::new("Incorrect property value encountered");
+        let ute = match UserToEntity::find()
+            .filter(user_to_entity::Column::UserId.eq(&user_id))
+            .filter(user_to_entity::Column::ExerciseId.eq(&input.exercise_id))
+            .one(&self.0.db)
+            .await?
+        {
+            Some(ute) => ute,
+            None => {
+                let data = user_to_entity::ActiveModel {
+                    user_id: ActiveValue::Set(user_id),
+                    exercise_id: ActiveValue::Set(Some(input.exercise_id)),
+                    exercise_extra_information: ActiveValue::Set(Some(
+                        UserToExerciseExtraInformation::default(),
+                    )),
+                    ..Default::default()
+                };
+                data.insert(&self.0.db).await?
+            }
+        };
+        let mut exercise_extra_information = ute.clone().exercise_extra_information.unwrap();
+        let (left, right) = input.change.property.split_once('.').ok_or_else(err)?;
+        match left {
+            "set_rest_timers" => {
+                let value = input.change.value.parse().unwrap();
+                let set_rest_timers = &mut exercise_extra_information.settings.set_rest_timers;
+                match right {
+                    "drop" => set_rest_timers.drop = Some(value),
+                    "normal" => set_rest_timers.normal = Some(value),
+                    "warmup" => set_rest_timers.warmup = Some(value),
+                    "failure" => set_rest_timers.failure = Some(value),
+                    _ => return Err(err()),
+                }
+            }
+            _ => return Err(err()),
+        };
+        let mut ute: user_to_entity::ActiveModel = ute.into();
+        ute.exercise_extra_information = ActiveValue::Set(Some(exercise_extra_information));
+        ute.update(&self.0.db).await?;
+        Ok(true)
+    }
 }
diff --git a/crates/services/fitness/src/logic.rs b/crates/services/fitness/src/logic.rs
deleted file mode 100644
index 9ffd19d77d..0000000000
--- a/crates/services/fitness/src/logic.rs
+++ /dev/null
@@ -1,42 +0,0 @@
-use anyhow::Result;
-use database_models::{prelude::UserToEntity, user_to_entity, workout};
-use sea_orm::{
-    ActiveModelTrait, ActiveValue, ColumnTrait, DatabaseConnection, EntityTrait, ModelTrait,
-    QueryFilter,
-};
-
-// DEV: For exercises, reduce count, remove from history if present. We will not
-// re-calculate exercise associations totals or change personal bests.
-pub async fn delete_existing_workout(
-    input: workout::Model,
-    db: &DatabaseConnection,
-    user_id: String,
-) -> Result<()> {
-    for (idx, ex) in input.information.exercises.iter().enumerate() {
-        let association = match UserToEntity::find()
-            .filter(user_to_entity::Column::UserId.eq(&user_id))
-            .filter(user_to_entity::Column::ExerciseId.eq(ex.name.clone()))
-            .one(db)
-            .await?
-        {
-            None => continue,
-            Some(assoc) => assoc,
-        };
-        let mut ei = association
-            .exercise_extra_information
-            .clone()
-            .unwrap_or_default();
-        if let Some(ex_idx) = ei
-            .history
-            .iter()
-            .position(|e| e.workout_id == input.id && e.idx == idx)
-        {
-            ei.history.remove(ex_idx);
-        }
-        let mut association: user_to_entity::ActiveModel = association.into();
-        association.exercise_extra_information = ActiveValue::Set(Some(ei));
-        association.update(db).await?;
-    }
-    input.delete(db).await?;
-    Ok(())
-}
diff --git a/crates/services/importer/src/strong_app.rs b/crates/services/importer/src/strong_app.rs
index 0cd9f503cf..07d6cccd0b 100644
--- a/crates/services/importer/src/strong_app.rs
+++ b/crates/services/importer/src/strong_app.rs
@@ -80,15 +80,16 @@ pub async fn import(
         }
         sets.push(UserWorkoutSetRecord {
             statistic: WorkoutSetStatistic {
-                duration: entry.seconds.and_then(|r| r.checked_div(dec!(60))),
-                distance: entry.distance,
-                reps: entry.reps,
                 weight,
+                reps: entry.reps,
+                distance: entry.distance,
+                duration: entry.seconds.and_then(|r| r.checked_div(dec!(60))),
                 ..Default::default()
             },
             note: None,
-            lot: SetLot::Normal,
+            rest_time: None,
             confirmed_at: None,
+            lot: SetLot::Normal,
         });
         if let Some(n) = entry.notes {
             notes.push(n);
@@ -98,8 +99,6 @@ pub async fn import(
                 sets,
                 notes,
                 assets: None,
-                rest_time: None,
-                superset_with: vec![],
                 exercise_id: target_exercise.target_name.clone(),
             });
             sets = vec![];
@@ -125,9 +124,9 @@ pub async fn import(
                 exercises,
                 assets: None,
                 start_time: ndt,
+                supersets: vec![],
                 template_id: None,
                 repeated_from: None,
-                default_rest_timer: None,
                 create_workout_id: None,
                 update_workout_id: None,
                 name: entry.workout_name,
diff --git a/crates/services/integration/src/lib.rs b/crates/services/integration/src/lib.rs
index ec18b7f9b0..01ffcdb7a5 100644
--- a/crates/services/integration/src/lib.rs
+++ b/crates/services/integration/src/lib.rs
@@ -3,8 +3,11 @@ use std::sync::Arc;
 use async_graphql::{Error, Result as GqlResult};
 use chrono::Utc;
 use common_utils::ryot_log;
-use database_models::prelude::{CollectionToEntity, Metadata};
-use database_models::{integration, prelude::Integration};
+use database_models::{
+    integration,
+    prelude::{CollectionToEntity, Integration, Metadata, UserToEntity},
+    user_to_entity,
+};
 use database_utils::user_preferences_by_id;
 use dependent_models::ImportResult;
 use dependent_utils::{commit_metadata, process_import};
@@ -66,12 +69,13 @@ impl IntegrationService {
                 }
             });
         });
-        if let Err(err) = process_import(&integration.user_id, true, import, &self.0).await {
-            ryot_log!(debug, "Error updating progress: {:?}", err);
-        } else {
-            let mut to_update: integration::ActiveModel = integration.into();
-            to_update.last_triggered_on = ActiveValue::Set(Some(Utc::now()));
-            to_update.update(&self.0.db).await?;
+        match process_import(&integration.user_id, true, import, &self.0).await {
+            Ok(_) => {
+                let mut to_update: integration::ActiveModel = integration.into();
+                to_update.last_triggered_on = ActiveValue::Set(Some(Utc::now()));
+                to_update.update(&self.0.db).await?;
+            }
+            Err(err) => ryot_log!(debug, "Error updating progress: {:?}", err),
         }
         Ok(())
     }
@@ -132,7 +136,6 @@ impl IntegrationService {
 
     pub async fn handle_entity_added_to_collection_event(
         &self,
-        user_id: String,
         collection_to_entity_id: Uuid,
     ) -> GqlResult<()> {
         let cte = CollectionToEntity::find_by_id(collection_to_entity_id)
@@ -142,58 +145,71 @@ impl IntegrationService {
         if !matches!(cte.entity_lot, EntityLot::Metadata) {
             return Ok(());
         }
-        let integrations = Integration::find()
-            .filter(integration::Column::UserId.eq(user_id))
-            .filter(integration::Column::Lot.eq(IntegrationLot::Push))
+        let users = UserToEntity::find()
+            .select_only()
+            .column(user_to_entity::Column::UserId)
+            .filter(user_to_entity::Column::CollectionId.eq(&cte.collection_id))
+            .into_tuple::<String>()
             .all(&self.0.db)
             .await?;
-        for integration in integrations {
-            let possible_collection_ids = match integration.provider_specifics.clone() {
-                Some(s) => match integration.provider {
-                    IntegrationProvider::Radarr => s.radarr_sync_collection_ids.unwrap_or_default(),
-                    IntegrationProvider::Sonarr => s.sonarr_sync_collection_ids.unwrap_or_default(),
-                    _ => vec![],
-                },
-                None => vec![],
-            };
-            if !possible_collection_ids.contains(&cte.collection_id) {
-                continue;
-            }
-            let specifics = integration.provider_specifics.unwrap();
-            let metadata = Metadata::find_by_id(&cte.entity_id)
-                .one(&self.0.db)
-                .await?
-                .ok_or_else(|| Error::new("Metadata does not exist"))?;
-            let maybe_entity_id = match metadata.lot {
-                MediaLot::Show => metadata
-                    .external_identifiers
-                    .and_then(|ei| ei.tvdb_id.map(|i| i.to_string())),
-                _ => Some(metadata.identifier.clone()),
-            };
-            if let Some(entity_id) = maybe_entity_id {
-                let _push_result = match integration.provider {
-                    IntegrationProvider::Radarr => {
-                        let sonarr = RadarrIntegration::new(
-                            specifics.radarr_base_url.unwrap(),
-                            specifics.radarr_api_key.unwrap(),
-                            specifics.radarr_profile_id.unwrap(),
-                            specifics.radarr_root_folder_path.unwrap(),
-                            entity_id,
-                        );
-                        sonarr.push_progress().await
-                    }
-                    IntegrationProvider::Sonarr => {
-                        let radarr = SonarrIntegration::new(
-                            specifics.sonarr_base_url.unwrap(),
-                            specifics.sonarr_api_key.unwrap(),
-                            specifics.sonarr_profile_id.unwrap(),
-                            specifics.sonarr_root_folder_path.unwrap(),
-                            entity_id,
-                        );
-                        radarr.push_progress().await
-                    }
-                    _ => unreachable!(),
+        for user_id in users {
+            let integrations = Integration::find()
+                .filter(integration::Column::UserId.eq(user_id))
+                .filter(integration::Column::Lot.eq(IntegrationLot::Push))
+                .all(&self.0.db)
+                .await?;
+            for integration in integrations {
+                let possible_collection_ids = match integration.provider_specifics.clone() {
+                    Some(s) => match integration.provider {
+                        IntegrationProvider::Radarr => {
+                            s.radarr_sync_collection_ids.unwrap_or_default()
+                        }
+                        IntegrationProvider::Sonarr => {
+                            s.sonarr_sync_collection_ids.unwrap_or_default()
+                        }
+                        _ => vec![],
+                    },
+                    None => vec![],
+                };
+                if !possible_collection_ids.contains(&cte.collection_id) {
+                    continue;
+                }
+                let specifics = integration.provider_specifics.unwrap();
+                let metadata = Metadata::find_by_id(&cte.entity_id)
+                    .one(&self.0.db)
+                    .await?
+                    .ok_or_else(|| Error::new("Metadata does not exist"))?;
+                let maybe_entity_id = match metadata.lot {
+                    MediaLot::Show => metadata
+                        .external_identifiers
+                        .and_then(|ei| ei.tvdb_id.map(|i| i.to_string())),
+                    _ => Some(metadata.identifier.clone()),
                 };
+                if let Some(entity_id) = maybe_entity_id {
+                    let _push_result = match integration.provider {
+                        IntegrationProvider::Radarr => {
+                            let radarr = RadarrIntegration::new(
+                                specifics.radarr_base_url.unwrap(),
+                                specifics.radarr_api_key.unwrap(),
+                                specifics.radarr_profile_id.unwrap(),
+                                specifics.radarr_root_folder_path.unwrap(),
+                                entity_id,
+                            );
+                            radarr.push_progress().await
+                        }
+                        IntegrationProvider::Sonarr => {
+                            let sonarr = SonarrIntegration::new(
+                                specifics.sonarr_base_url.unwrap(),
+                                specifics.sonarr_api_key.unwrap(),
+                                specifics.sonarr_profile_id.unwrap(),
+                                specifics.sonarr_root_folder_path.unwrap(),
+                                entity_id,
+                            );
+                            sonarr.push_progress().await
+                        }
+                        _ => unreachable!(),
+                    };
+                }
             }
         }
         Ok(())
diff --git a/crates/services/miscellaneous/src/lib.rs b/crates/services/miscellaneous/src/lib.rs
index 3658b6b67f..c4427e3118 100644
--- a/crates/services/miscellaneous/src/lib.rs
+++ b/crates/services/miscellaneous/src/lib.rs
@@ -1,4 +1,5 @@
 use std::{
+    cmp::Reverse,
     collections::{HashMap, HashSet},
     sync::Arc,
 };
@@ -7,7 +8,7 @@ use apalis::prelude::MessageQueue;
 use application_utils::get_current_date;
 use async_graphql::{Error, Result};
 use background::{ApplicationJob, CoreApplicationJob};
-use chrono::{Days, Duration as ChronoDuration, NaiveDate, Utc};
+use chrono::{Days, Duration, NaiveDate, Utc};
 use common_models::{
     ApplicationCacheKey, BackendError, BackgroundJob, ChangeCollectionToEntityInput,
     DefaultCollection, IdAndNamedObject, MediaStateChanged, SearchDetails, SearchInput, StoredUrl,
@@ -46,7 +47,7 @@ use dependent_utils::{
     deploy_update_metadata_job, get_entities_monitored_by, get_metadata_provider,
     get_openlibrary_service, get_tmdb_non_media_service, is_metadata_finished_by_user, post_review,
     progress_update, queue_media_state_changed_notification_for_user,
-    queue_notifications_to_user_platforms, update_metadata, update_metadata_and_notify_users,
+    queue_notifications_to_user_platforms, update_metadata_and_notify_users,
 };
 use enums::{
     EntityLot, MediaLot, MediaSource, MetadataToMetadataRelation, SeenState, UserToMediaReason,
@@ -60,8 +61,8 @@ use media_models::{
     CreateCustomMetadataInput, CreateOrUpdateReviewInput, CreateReviewCommentInput,
     GenreDetailsInput, GenreListItem, GraphqlCalendarEvent, GraphqlMediaAssets,
     GraphqlMetadataDetails, GraphqlMetadataGroup, GraphqlVideoAsset, GroupedCalendarEvent,
-    ImportOrExportItemReviewComment, MediaAssociatedPersonStateChanges, MediaDetails,
-    MediaGeneralFilter, MediaSortBy, MetadataCreator, MetadataCreatorGroupedByRole,
+    ImportOrExportItemReviewComment, MediaAssociatedPersonStateChanges, MediaGeneralFilter,
+    MediaSortBy, MetadataCreator, MetadataCreatorGroupedByRole, MetadataDetails,
     MetadataFreeCreator, MetadataGroupSearchInput, MetadataGroupSearchItem,
     MetadataGroupsListInput, MetadataImage, MetadataImageForMediaDetails, MetadataListInput,
     MetadataPartialDetails, MetadataSearchInput, MetadataSearchItemResponse, MetadataVideo,
@@ -105,6 +106,7 @@ use sea_query::{
 };
 use serde::{Deserialize, Serialize};
 use supporting_service::SupportingService;
+use tokio::time::{sleep, Duration as TokioDuration};
 use traits::{MediaProvider, MediaProviderLanguages, TraceOk};
 use user_models::UserReviewScale;
 use uuid::Uuid;
@@ -183,21 +185,34 @@ ORDER BY RANDOM() LIMIT 10;
         ))
         .all(&self.0.db)
         .await?;
+        ryot_log!(
+            debug,
+            "Media items selected for recommendations: {:?}",
+            media_items
+        );
         let mut media_item_ids = vec![];
         for media in media_items.into_iter() {
+            ryot_log!(debug, "Getting recommendations: {:?}", media);
             let provider = get_metadata_provider(media.lot, media.source, &self.0).await?;
-            if let Ok(recommendations) = provider
+            match provider
                 .get_recommendations_for_metadata(&media.identifier)
                 .await
             {
-                for mut rec in recommendations {
-                    rec.is_recommendation = Some(true);
-                    if let Ok(meta) = self.create_partial_metadata(rec).await {
-                        media_item_ids.push(meta.id);
+                Ok(recommendations) => {
+                    ryot_log!(debug, "Found recommendations: {:?}", recommendations);
+                    for mut rec in recommendations {
+                        rec.is_recommendation = Some(true);
+                        if let Ok(meta) = self.create_partial_metadata(rec).await {
+                            media_item_ids.push(meta.id);
+                        }
                     }
                 }
+                e => {
+                    ryot_log!(warn, "Could not get recommendations {:?}", e);
+                }
             }
         }
+        ryot_log!(debug, "Created recommendations: {:?}", media_item_ids);
         Ok(())
     }
 
@@ -1854,7 +1869,7 @@ ORDER BY RANDOM() LIMIT 10;
             MediaLot::VideoGame => input.video_game_specifics.is_none(),
             MediaLot::VisualNovel => input.visual_novel_specifics.is_none(),
         };
-        let details = MediaDetails {
+        let details = MetadataDetails {
             identifier,
             title: input.title,
             description: input.description,
@@ -1959,22 +1974,6 @@ ORDER BY RANDOM() LIMIT 10;
             .collect()
     }
 
-    pub async fn handle_entity_added_to_collection_event(
-        &self,
-        user_id: String,
-        collection_to_entity_id: Uuid,
-    ) -> Result<()> {
-        self.0
-            .perform_application_job
-            .enqueue(ApplicationJob::HandleEntityAddedToCollectionEvent(
-                user_id,
-                collection_to_entity_id,
-            ))
-            .await
-            .unwrap();
-        Ok(())
-    }
-
     async fn get_monitored_entities(
         &self,
         entity_lot: EntityLot,
@@ -2000,14 +1999,10 @@ ORDER BY RANDOM() LIMIT 10;
             "Users to be notified for metadata state changes: {:?}",
             meta_map
         );
-        for (metadata_id, to_notify) in meta_map {
-            let notifications = update_metadata(&metadata_id, false, &self.0).await?;
-            for user in to_notify {
-                for notification in notifications.iter() {
-                    queue_media_state_changed_notification_for_user(&user, notification, &self.0)
-                        .await?;
-                }
-            }
+        for (metadata_id, _) in meta_map {
+            self.update_metadata_and_notify_users(&metadata_id, true)
+                .await
+                .ok();
         }
         Ok(())
     }
@@ -2019,17 +2014,10 @@ ORDER BY RANDOM() LIMIT 10;
             "Users to be notified for people state changes: {:?}",
             person_map
         );
-        for (person_id, to_notify) in person_map {
-            let notifications = self
-                .update_person(person_id.parse().unwrap())
+        for (person_id, _) in person_map {
+            self.update_person_and_notify_users(person_id.parse().unwrap())
                 .await
-                .unwrap_or_default();
-            for user in to_notify {
-                for notification in notifications.iter() {
-                    queue_media_state_changed_notification_for_user(&user, notification, &self.0)
-                        .await?;
-                }
-            }
+                .ok();
         }
         Ok(())
     }
@@ -2265,12 +2253,12 @@ ORDER BY RANDOM() LIMIT 10;
         }
         let contents = contents
             .into_iter()
-            .sorted_by_key(|(role, _)| role.clone())
             .map(|(name, items)| PersonDetailsGroupedByRole {
                 count: items.len(),
                 name,
                 items,
             })
+            .sorted_by_key(|f| Reverse(f.count))
             .collect_vec();
         let slug = slug::slugify(&details.name);
         let identifier = &details.identifier;
@@ -2681,6 +2669,7 @@ ORDER BY RANDOM() LIMIT 10;
         let provider_person = provider
             .person_details(&person.identifier, &person.source_specifics)
             .await?;
+        ryot_log!(debug, "Updating person for {:?}", person_id);
         let images = provider_person.images.map(|images| {
             images
                 .into_iter()
@@ -2847,7 +2836,7 @@ ORDER BY RANDOM() LIMIT 10;
     }
 
     async fn invalidate_import_jobs(&self) -> Result<()> {
-        let threshold = Utc::now() - ChronoDuration::hours(24);
+        let threshold = Utc::now() - Duration::hours(24);
         let all_jobs = ImportReport::find()
             .filter(import_report::Column::WasSuccess.is_null())
             .filter(import_report::Column::StartedOn.lt(threshold))
@@ -3119,7 +3108,7 @@ ORDER BY RANDOM() LIMIT 10;
 
     #[cfg(debug_assertions)]
     pub async fn development_mutation(&self) -> Result<bool> {
-        tokio::time::sleep(tokio::time::Duration::from_secs(3)).await;
+        sleep(TokioDuration::from_secs(3)).await;
         Ok(true)
     }
 }
diff --git a/crates/services/user/src/lib.rs b/crates/services/user/src/lib.rs
index 894b21e501..ae76c06424 100644
--- a/crates/services/user/src/lib.rs
+++ b/crates/services/user/src/lib.rs
@@ -4,7 +4,7 @@ use application_utils::user_id_from_token;
 use argon2::{Argon2, PasswordHash, PasswordVerifier};
 use async_graphql::{Error, Result};
 use chrono::{Timelike, Utc};
-use common_models::{DefaultCollection, StringIdObject};
+use common_models::{DefaultCollection, StringIdObject, UpdateComplexJsonInput};
 use common_utils::ryot_log;
 use database_models::{
     access_link, integration, metadata, notification_platform,
@@ -29,8 +29,7 @@ use media_models::{
     ProcessAccessLinkErrorVariant, ProcessAccessLinkInput, ProcessAccessLinkResponse,
     ProcessAccessLinkResult, RegisterError, RegisterErrorVariant, RegisterResult,
     RegisterUserInput, UpdateUserInput, UpdateUserIntegrationInput,
-    UpdateUserNotificationPlatformInput, UpdateUserPreferenceInput, UserDetailsError,
-    UserDetailsErrorVariant,
+    UpdateUserNotificationPlatformInput, UserDetailsError, UserDetailsErrorVariant,
 };
 use nanoid::nanoid;
 use notification_service::send_notification;
@@ -46,8 +45,8 @@ use sea_orm::{
 };
 use supporting_service::SupportingService;
 use user_models::{
-    DashboardElementLot, GridPacking, NotificationPlatformSpecifics, UserGeneralDashboardElement,
-    UserGeneralPreferences, UserPreferences, UserReviewScale,
+    DashboardElementLot, GridPacking, NotificationPlatformSpecifics, UserPreferences,
+    UserReviewScale,
 };
 
 fn empty_nonce_verifier(_nonce: Option<&Nonce>) -> Result<(), String> {
@@ -405,7 +404,7 @@ impl UserService {
     pub async fn update_user_preference(
         &self,
         user_id: String,
-        input: UpdateUserPreferenceInput,
+        input: UpdateComplexJsonInput,
     ) -> Result<bool> {
         let err = || Error::new("Incorrect property value encountered");
         let user_model = user_by_id(&self.0.db, &user_id).await?;
@@ -425,13 +424,13 @@ impl UserService {
                                 let (left, right) = right.split_once('.').ok_or_else(err)?;
                                 match left {
                                     "custom" => {
-                                        let value = serde_json::from_str(&input.value).unwrap();
-                                        preferences.fitness.measurements.custom = value;
+                                        preferences.fitness.measurements.custom =
+                                            serde_json::from_str(&input.value).unwrap()
                                     }
                                     "inbuilt" => match right {
                                         "weight" => {
                                             preferences.fitness.measurements.inbuilt.weight =
-                                                value_bool.unwrap();
+                                                value_bool.unwrap()
                                         }
                                         "body_mass_index" => {
                                             preferences
@@ -578,12 +577,29 @@ impl UserService {
                                     _ => return Err(err()),
                                 }
                             }
-                            "exercises" => match right {
-                                "unit_system" => {
-                                    preferences.fitness.exercises.unit_system =
-                                        UserUnitSystem::from_str(&input.value).unwrap();
-                                }
-                                _ => return Err(err()),
+                            "exercises" => match right.split_once('.') {
+                                Some((left, right)) => match left {
+                                    "set_rest_timers" => {
+                                        let value = input.value.parse().ok();
+                                        let set_rest_timers =
+                                            &mut preferences.fitness.exercises.set_rest_timers;
+                                        match right {
+                                            "drop" => set_rest_timers.drop = value,
+                                            "normal" => set_rest_timers.normal = value,
+                                            "warmup" => set_rest_timers.warmup = value,
+                                            "failure" => set_rest_timers.failure = value,
+                                            _ => return Err(err()),
+                                        }
+                                    }
+                                    _ => return Err(err()),
+                                },
+                                None => match right {
+                                    "unit_system" => {
+                                        preferences.fitness.exercises.unit_system =
+                                            UserUnitSystem::from_str(&input.value).unwrap();
+                                    }
+                                    _ => return Err(err()),
+                                },
                             },
                             _ => return Err(err()),
                         }
@@ -704,15 +720,8 @@ impl UserService {
                             preferences.general.display_nsfw = value_bool.unwrap();
                         }
                         "dashboard" => {
-                            let value = serde_json::from_str::<Vec<UserGeneralDashboardElement>>(
-                                &input.value,
-                            )
-                            .unwrap();
-                            let default_general_preferences = UserGeneralPreferences::default();
-                            if value.len() != default_general_preferences.dashboard.len() {
-                                return Err(err());
-                            }
-                            preferences.general.dashboard = value;
+                            preferences.general.dashboard =
+                                serde_json::from_str(&input.value).unwrap();
                         }
                         "disable_integrations" => {
                             preferences.general.disable_integrations = value_bool.unwrap();
diff --git a/crates/traits/src/lib.rs b/crates/traits/src/lib.rs
index e41d4c3071..15c057fbe4 100644
--- a/crates/traits/src/lib.rs
+++ b/crates/traits/src/lib.rs
@@ -10,7 +10,7 @@ use database_models::metadata_group::MetadataGroupWithoutId;
 use database_utils::check_token;
 use dependent_models::SearchResults;
 use media_models::{
-    MediaDetails, MetadataGroupSearchItem, MetadataPerson, MetadataSearchItem,
+    MetadataDetails, MetadataGroupSearchItem, MetadataPerson, MetadataSearchItem,
     PartialMetadataWithoutId, PeopleSearchItem, PersonSourceSpecifics,
 };
 use sea_orm::{prelude::DateTimeUtc, DatabaseConnection};
@@ -30,7 +30,7 @@ pub trait MediaProvider {
 
     /// Get details about a media item.
     #[allow(unused_variables)]
-    async fn metadata_details(&self, identifier: &str) -> Result<MediaDetails> {
+    async fn metadata_details(&self, identifier: &str) -> Result<MetadataDetails> {
         bail!("This provider does not support getting media details")
     }
 
diff --git a/crates/utils/application/src/lib.rs b/crates/utils/application/src/lib.rs
index b592aa648e..0a471d605f 100644
--- a/crates/utils/application/src/lib.rs
+++ b/crates/utils/application/src/lib.rs
@@ -1,4 +1,4 @@
-use std::sync::Arc;
+use std::{sync::Arc, time::Duration};
 
 use async_graphql::{Error, Result};
 use async_trait::async_trait;
@@ -74,6 +74,7 @@ pub fn get_base_http_client(headers: Option<Vec<(HeaderName, HeaderValue)>>) ->
     }
     ClientBuilder::new()
         .default_headers(req_headers)
+        .timeout(Duration::from_secs(15))
         .build()
         .unwrap()
 }
diff --git a/crates/utils/database/src/lib.rs b/crates/utils/database/src/lib.rs
index f0d97bce87..04765c852b 100644
--- a/crates/utils/database/src/lib.rs
+++ b/crates/utils/database/src/lib.rs
@@ -3,7 +3,7 @@ use std::{collections::HashMap, sync::Arc};
 use apalis::prelude::{MemoryStorage, MessageQueue};
 use application_utils::GraphqlRepresentation;
 use async_graphql::{Error, Result};
-use background::{ApplicationJob, CoreApplicationJob};
+use background::ApplicationJob;
 use chrono::Utc;
 use common_models::{
     BackendError, ChangeCollectionToEntityInput, DefaultCollection, IdAndNamedObject,
@@ -187,7 +187,7 @@ pub async fn entity_in_collections(
     Ok(eic.into_iter().map(|(c, _)| c).collect_vec())
 }
 
-pub async fn workout_details(
+pub async fn user_workout_details(
     user_id: &String,
     workout_id: String,
     ss: &Arc<SupportingService>,
@@ -212,7 +212,7 @@ pub async fn workout_details(
     }
 }
 
-pub async fn workout_template_details(
+pub async fn user_workout_template_details(
     db: &DatabaseConnection,
     user_id: &String,
     workout_template_id: String,
@@ -337,11 +337,8 @@ pub async fn add_entity_to_collection(
         }
         created
     };
-    ss.perform_core_application_job
-        .enqueue(CoreApplicationJob::EntityAddedToCollection(
-            user_id.to_owned(),
-            resp.id,
-        ))
+    ss.perform_application_job
+        .enqueue(ApplicationJob::HandleEntityAddedToCollectionEvent(resp.id))
         .await
         .unwrap();
     Ok(true)
diff --git a/crates/utils/dependent/src/lib.rs b/crates/utils/dependent/src/lib.rs
index cfbcdfe1c5..ae506ff1af 100644
--- a/crates/utils/dependent/src/lib.rs
+++ b/crates/utils/dependent/src/lib.rs
@@ -38,7 +38,7 @@ use importer_models::{ImportDetails, ImportFailStep, ImportFailedItem, ImportRes
 use itertools::Itertools;
 use media_models::{
     CommitCache, CommitMediaInput, CommitPersonInput, CreateOrUpdateCollectionInput,
-    CreateOrUpdateReviewInput, ImportOrExportItemRating, MediaDetails, MetadataImage,
+    CreateOrUpdateReviewInput, ImportOrExportItemRating, MetadataDetails, MetadataImage,
     PartialMetadata, PartialMetadataPerson, PartialMetadataWithoutId, ProgressUpdateError,
     ProgressUpdateErrorVariant, ProgressUpdateInput, ProgressUpdateResultUnion, ReviewPostedEvent,
     SeenAnimeExtraInformation, SeenMangaExtraInformation, SeenPodcastExtraInformation,
@@ -182,7 +182,7 @@ pub async fn details_from_provider(
     source: MediaSource,
     identifier: &str,
     ss: &Arc<SupportingService>,
-) -> Result<MediaDetails> {
+) -> Result<MetadataDetails> {
     let provider = get_metadata_provider(lot, source, ss).await?;
     let results = provider.metadata_details(identifier).await?;
     Ok(results)
@@ -292,12 +292,13 @@ pub async fn create_partial_metadata(
             }]
         });
         let c = metadata::ActiveModel {
-            title: ActiveValue::Set(data.title),
-            identifier: ActiveValue::Set(data.identifier),
+            images: ActiveValue::Set(image),
             lot: ActiveValue::Set(data.lot),
+            title: ActiveValue::Set(data.title),
             source: ActiveValue::Set(data.source),
-            images: ActiveValue::Set(image),
             is_partial: ActiveValue::Set(Some(true)),
+            identifier: ActiveValue::Set(data.identifier),
+            is_recommendation: ActiveValue::Set(Some(true)),
             ..Default::default()
         };
         c.insert(db).await?
@@ -740,7 +741,7 @@ pub async fn update_metadata_and_notify_users(
 }
 
 pub async fn commit_metadata_internal(
-    details: MediaDetails,
+    details: MetadataDetails,
     is_partial: Option<bool>,
     ss: &Arc<SupportingService>,
 ) -> Result<metadata::Model> {
@@ -1523,37 +1524,23 @@ pub async fn create_user_measurement(
 }
 
 fn get_best_set_index(records: &[WorkoutSetRecord]) -> Option<usize> {
-    records
-        .iter()
-        .enumerate()
-        .max_by_key(|(_, record)| {
-            record.statistic.duration.unwrap_or(dec!(0))
-                + record.statistic.distance.unwrap_or(dec!(0))
-                + record.statistic.reps.unwrap_or(dec!(0))
-                + record.statistic.weight.unwrap_or(dec!(0))
-        })
-        .map(|(index, _)| index)
+    let record = records.iter().enumerate().max_by_key(|(_, record)| {
+        record.statistic.duration.unwrap_or(dec!(0))
+            + record.statistic.distance.unwrap_or(dec!(0))
+            + record.statistic.reps.unwrap_or(dec!(0))
+            + record.statistic.weight.unwrap_or(dec!(0))
+    });
+    record.and_then(|(_, r)| records.iter().position(|l| l.statistic == r.statistic))
 }
 
 fn get_index_of_highest_pb(
     records: &[WorkoutSetRecord],
     pb_type: &WorkoutSetPersonalBest,
 ) -> Option<usize> {
-    let record = records.iter().reduce(|record1, record2| {
-        let pb1 = record1.get_personal_best(pb_type);
-        let pb2 = record2.get_personal_best(pb_type);
-        match (pb1, pb2) {
-            (Some(pb1), Some(pb2)) => {
-                if pb1 > pb2 {
-                    record1
-                } else {
-                    record2
-                }
-            }
-            _ => record1,
-        }
-    });
-    record.and_then(|r| records.iter().position(|l| l == r))
+    let record = records
+        .iter()
+        .max_by_key(|record| record.get_personal_best(pb_type).unwrap_or(dec!(0)));
+    record.and_then(|r| records.iter().position(|l| l.statistic == r.statistic))
 }
 
 /// Create a workout in the database and also update user and exercise associations.
@@ -1577,7 +1564,7 @@ pub async fn create_or_update_workout(
             None,
         ),
     };
-    ryot_log!(debug, "Creating new workout with id = {}", new_workout_id);
+    ryot_log!(debug, "Creating workout with id = {}", new_workout_id);
     let mut exercises = vec![];
     let mut workout_totals = vec![];
     if input.exercises.is_empty() {
@@ -1606,7 +1593,7 @@ pub async fn create_or_update_workout(
             Some(e) => e,
         };
         let mut sets = vec![];
-        let mut total = WorkoutOrExerciseTotals::default();
+        let mut totals = WorkoutOrExerciseTotals::default();
         let association = UserToEntity::find()
             .filter(user_to_entity::Column::UserId.eq(user_id))
             .filter(user_to_entity::Column::ExerciseId.eq(ex.exercise_id.clone()))
@@ -1620,42 +1607,38 @@ pub async fn create_or_update_workout(
             workout_id: new_workout_id.clone(),
             workout_end_on: end_time,
         };
-        let association = match association {
+        let asc = match association {
+            Some(e) => e,
             None => {
                 let user_to_ex = user_to_entity::ActiveModel {
                     user_id: ActiveValue::Set(user_id.clone()),
                     exercise_id: ActiveValue::Set(Some(ex.exercise_id.clone())),
                     exercise_extra_information: ActiveValue::Set(Some(
-                        UserToExerciseExtraInformation {
-                            history: vec![history_item],
-                            lifetime_stats: WorkoutOrExerciseTotals::default(),
-                            personal_bests: vec![],
-                        },
+                        UserToExerciseExtraInformation::default(),
                     )),
                     created_on: ActiveValue::Set(
                         first_set_of_exercise_confirmed_at.unwrap_or(end_time),
                     ),
-                    exercise_num_times_interacted: ActiveValue::Set(Some(1)),
                     ..Default::default()
                 };
                 user_to_ex.insert(&ss.db).await.unwrap()
             }
-            Some(e) => {
-                let last_updated_on = e.last_updated_on;
-                let mut extra_info = e.exercise_extra_information.clone().unwrap_or_default();
-                extra_info.history.insert(0, history_item);
-                let mut to_update: user_to_entity::ActiveModel = e.into();
-                to_update.exercise_num_times_interacted =
-                    ActiveValue::Set(Some(extra_info.history.len().try_into().unwrap()));
-                to_update.exercise_extra_information = ActiveValue::Set(Some(extra_info));
-                to_update.last_updated_on =
-                    ActiveValue::Set(first_set_of_exercise_confirmed_at.unwrap_or(last_updated_on));
-                to_update.update(&ss.db).await?
-            }
         };
-        if let Some(d) = ex.rest_time {
-            total.rest_time += d * (ex.sets.len() - 1) as u16;
-        }
+        let last_updated_on = asc.last_updated_on;
+        let mut extra_info = asc.exercise_extra_information.clone().unwrap_or_default();
+        extra_info.history.insert(0, history_item);
+        let mut to_update: user_to_entity::ActiveModel = asc.into();
+        to_update.exercise_num_times_interacted =
+            ActiveValue::Set(Some(extra_info.history.len().try_into().unwrap()));
+        to_update.exercise_extra_information = ActiveValue::Set(Some(extra_info));
+        to_update.last_updated_on =
+            ActiveValue::Set(first_set_of_exercise_confirmed_at.unwrap_or(last_updated_on));
+        let association = to_update.update(&ss.db).await?;
+        totals.rest_time = ex
+            .sets
+            .iter()
+            .map(|s| s.rest_time.unwrap_or_default())
+            .sum();
         ex.sets
             .sort_unstable_by_key(|s| s.confirmed_at.unwrap_or_default());
         for set in ex.sets.iter_mut() {
@@ -1672,16 +1655,16 @@ pub async fn create_or_update_workout(
             first_set_of_exercise_confirmed_at = set.confirmed_at;
             set.remove_invalids(&db_ex.lot);
             if let Some(r) = set.statistic.reps {
-                total.reps += r;
+                totals.reps += r;
                 if let Some(w) = set.statistic.weight {
-                    total.weight += w * r;
+                    totals.weight += w * r;
                 }
             }
             if let Some(d) = set.statistic.duration {
-                total.duration += d;
+                totals.duration += d;
             }
             if let Some(d) = set.statistic.distance {
-                total.distance += d;
+                totals.distance += d;
             }
             let mut totals = WorkoutSetTotals::default();
             if let (Some(we), Some(re)) = (&set.statistic.weight, &set.statistic.reps) {
@@ -1692,6 +1675,7 @@ pub async fn create_or_update_workout(
                 actual_rest_time,
                 totals: Some(totals),
                 note: set.note.clone(),
+                rest_time: set.rest_time,
                 personal_bests: Some(vec![]),
                 confirmed_at: set.confirmed_at,
                 statistic: set.statistic.clone(),
@@ -1729,17 +1713,17 @@ pub async fn create_or_update_workout(
                         if let Some(ref mut set_personal_bests) = set.personal_bests {
                             set_personal_bests.push(*best_type);
                         }
-                        total.personal_bests_achieved += 1;
+                        totals.personal_bests_achieved += 1;
                     }
                 }
             } else {
                 if let Some(ref mut set_personal_bests) = set.personal_bests {
                     set_personal_bests.push(*best_type);
                 }
-                total.personal_bests_achieved += 1;
+                totals.personal_bests_achieved += 1;
             }
         }
-        workout_totals.push(total.clone());
+        workout_totals.push(totals.clone());
         for (set_idx, set) in sets.iter().enumerate() {
             if let Some(set_personal_bests) = &set.personal_bests {
                 for best in set_personal_bests.iter() {
@@ -1768,7 +1752,7 @@ pub async fn create_or_update_workout(
             .unwrap_or_default();
         association_extra_information.history[0].best_set = best_set.clone();
         let mut association: user_to_entity::ActiveModel = association.into();
-        association_extra_information.lifetime_stats += total.clone();
+        association_extra_information.lifetime_stats += totals.clone();
         association_extra_information.personal_bests = personal_bests;
         association.exercise_extra_information =
             ActiveValue::Set(Some(association_extra_information));
@@ -1780,11 +1764,9 @@ pub async fn create_or_update_workout(
                 sets,
                 lot: db_ex.lot,
                 name: db_ex.id,
-                total: Some(total),
+                total: Some(totals),
                 notes: ex.notes.clone(),
-                rest_time: ex.rest_time,
                 assets: ex.assets.clone(),
-                superset_with: ex.superset_with.clone(),
             },
         ));
     }
@@ -1804,14 +1786,15 @@ pub async fn create_or_update_workout(
                 .map(|(best_set, lot, e)| WorkoutSummaryExercise {
                     best_set,
                     lot: Some(lot),
-                    id: e.name.clone(),
+                    name: e.name.clone(),
                     num_sets: e.sets.len(),
                 })
                 .collect(),
         },
         information: WorkoutInformation {
-            comment: input.comment,
             assets: input.assets,
+            comment: input.comment,
+            supersets: input.supersets,
             exercises: exercises.into_iter().map(|(_, _, ex)| ex).collect(),
         },
         template_id: input.template_id,
@@ -2158,16 +2141,16 @@ pub async fn process_import(
 pub fn db_workout_to_workout_input(user_workout: workout::Model) -> UserWorkoutInput {
     UserWorkoutInput {
         name: user_workout.name,
-        create_workout_id: Some(user_workout.id),
         update_workout_id: None,
-        default_rest_timer: None,
         end_time: user_workout.end_time,
         update_workout_template_id: None,
         start_time: user_workout.start_time,
         template_id: user_workout.template_id,
         assets: user_workout.information.assets,
+        create_workout_id: Some(user_workout.id),
         repeated_from: user_workout.repeated_from,
         comment: user_workout.information.comment,
+        supersets: user_workout.information.supersets,
         exercises: user_workout
             .information
             .exercises
@@ -2181,13 +2164,12 @@ pub fn db_workout_to_workout_input(user_workout: workout::Model) -> UserWorkoutI
                         lot: s.lot,
                         note: s.note,
                         statistic: s.statistic,
+                        rest_time: s.rest_time,
                         confirmed_at: s.confirmed_at,
                     })
                     .collect(),
                 notes: e.notes,
-                rest_time: e.rest_time,
                 assets: e.assets,
-                superset_with: e.superset_with,
             })
             .collect(),
     }
diff --git a/docs/includes/export-schema.ts b/docs/includes/export-schema.ts
index 5f283ce347..e0eeaa3f9f 100644
--- a/docs/includes/export-schema.ts
+++ b/docs/includes/export-schema.ts
@@ -255,6 +255,7 @@ export interface WorkoutSetRecord {
 	lot: SetLot;
 	note: string | null;
 	personal_bests: WorkoutSetPersonalBest[] | null;
+	rest_time: number | null;
 	statistic: WorkoutSetStatistic;
 	totals: WorkoutSetTotals | null;
 }
@@ -278,25 +279,30 @@ export interface ProcessedExercise {
 	lot: ExerciseLot;
 	name: string;
 	notes: string[];
-	rest_time: number | null;
 	sets: WorkoutSetRecord[];
-	/** The indices of the exercises with which this has been superset with. */
-	superset_with: number[];
 	total: WorkoutOrExerciseTotals | null;
 }
 
+export interface WorkoutSupersetsInformation {
+	/** A color that will be displayed on the frontend. */
+	color: string;
+	/** The identifier of all the exercises which are in the same superset */
+	exercises: number[];
+}
+
 /** Information about a workout done. */
 export interface WorkoutInformation {
 	assets: EntityAssets | null;
 	comment: string | null;
 	exercises: ProcessedExercise[];
+	supersets: WorkoutSupersetsInformation[];
 }
 
 /** The summary about an exercise done in a workout. */
 export interface WorkoutSummaryExercise {
 	best_set: WorkoutSetRecord | null;
-	id: string;
 	lot: ExerciseLot | null;
+	name: string;
 	num_sets: number;
 }
 
@@ -307,7 +313,6 @@ export interface WorkoutSummary {
 
 export interface WorkoutTemplate {
 	created_on: string;
-	default_rest_timer: number | null;
 	id: string;
 	information: WorkoutInformation;
 	name: string;
diff --git a/libs/generated/src/graphql/backend/gql.ts b/libs/generated/src/graphql/backend/gql.ts
index c8cef59dd1..5a48d7a738 100644
--- a/libs/generated/src/graphql/backend/gql.ts
+++ b/libs/generated/src/graphql/backend/gql.ts
@@ -13,7 +13,7 @@ import { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/
  * Therefore it is highly recommended to use the babel or swc plugin for production.
  */
 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 UpdateUserWorkout($input: UpdateUserWorkoutInput!) {\n  updateUserWorkout(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: UpdateUserPreferenceInput!) {\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}": types.RegisterUserDocument,
+    "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    pageLimit\n    websiteUrl\n    smtpEnabled\n    oidcEnabled\n    signupAllowed\n    repositoryLink\n    localAuthDisabled\n    fileStorageEnabled\n    tokenValidForDays\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,
@@ -31,18 +31,18 @@ const 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}": 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      oidcIssuerId\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        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 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 UserPreferences {\n  userPreferences {\n    general {\n      reviewScale\n      gridPacking\n      displayNsfw\n      disableVideos\n      persistQueries\n      disableReviews\n      disableIntegrations\n      disableWatchProviders\n      disableNavigationAnimation\n      dashboard {\n        section\n        hidden\n        numElements\n      }\n      watchProviders {\n        lot\n        values\n      }\n    }\n    fitness {\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      exercises {\n        unitSystem\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}": types.UserPreferencesDocument,
-    "query UserWorkoutTemplateDetails($workoutTemplateId: String!) {\n  userWorkoutTemplateDetails(workoutTemplateId: $workoutTemplateId) {\n    collections {\n      ...CollectionPart\n    }\n    details {\n      id\n      name\n      createdOn\n      visibility\n      defaultRestTimer\n      summary {\n        ...WorkoutSummaryPart\n      }\n      information {\n        ...WorkoutInformationPart\n      }\n    }\n  }\n}": types.UserWorkoutTemplateDetailsDocument,
+    "query UserPreferences {\n  userPreferences {\n    general {\n      reviewScale\n      gridPacking\n      displayNsfw\n      disableVideos\n      persistQueries\n      disableReviews\n      disableIntegrations\n      disableWatchProviders\n      disableNavigationAnimation\n      dashboard {\n        section\n        hidden\n        numElements\n      }\n      watchProviders {\n        lot\n        values\n      }\n    }\n    fitness {\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      exercises {\n        unitSystem\n        setRestTimers {\n          ...SetRestTimersPart\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}": types.UserPreferencesDocument,
+    "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 WorkoutDetails($workoutId: String!) {\n  workoutDetails(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.WorkoutDetailsDocument,
     "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,
-    "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  chapter\n  volume\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  identifier\n  title\n  image\n  publishYear\n}\n\nfragment WorkoutOrExerciseTotalsPart on WorkoutOrExerciseTotals {\n  personalBestsAchieved\n  weight\n  reps\n  distance\n  duration\n  restTime\n}\n\nfragment EntityAssetsPart on EntityAssets {\n  images\n  videos\n}\n\nfragment WorkoutSetStatisticPart on WorkoutSetStatistic {\n  duration\n  distance\n  reps\n  weight\n  oneRm\n  pace\n  volume\n}\n\nfragment WorkoutSetRecordPart on WorkoutSetRecord {\n  statistic {\n    ...WorkoutSetStatisticPart\n  }\n  lot\n  personalBests\n}\n\nfragment WorkoutSummaryPart on WorkoutSummary {\n  total {\n    ...WorkoutOrExerciseTotalsPart\n  }\n  exercises {\n    numSets\n    id\n    lot\n    bestSet {\n      ...WorkoutSetRecordPart\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    createdOn\n    user {\n      id\n      name\n    }\n    likedBy\n  }\n  showExtraInformation {\n    ...SeenShowExtraInformationPart\n  }\n  podcastExtraInformation {\n    ...SeenPodcastExtraInformationPart\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  exercises {\n    name\n    lot\n    notes\n    restTime\n    total {\n      ...WorkoutOrExerciseTotalsPart\n    }\n    supersetWith\n    assets {\n      ...EntityAssetsPart\n    }\n    sets {\n      statistic {\n        ...WorkoutSetStatisticPart\n      }\n      note\n      lot\n      personalBests\n      confirmedAt\n    }\n  }\n}": types.SeenPodcastExtraInformationPartFragmentDoc,
+    "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}\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    ...SeenShowExtraInformationPart\n  }\n  podcastExtraInformation {\n    ...SeenPodcastExtraInformationPart\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,7 +62,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 UpdateUserWorkout($input: UpdateUserWorkoutInput!) {\n  updateUserWorkout(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: UpdateUserPreferenceInput!) {\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}"): (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 UpdateUserWorkout($input: UpdateUserWorkoutInput!) {\n  updateUserWorkout(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: UpdateUserPreferenceInput!) {\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}"];
+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.
  */
@@ -134,7 +134,7 @@ export function graphql(source: "query UserDetails {\n  userDetails {\n    __typ
 /**
  * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
  */
-export function graphql(source: "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        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}"): (typeof documents)["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        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}"];
+export function graphql(source: "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}"): (typeof documents)["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}"];
 /**
  * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
  */
@@ -154,23 +154,23 @@ export function graphql(source: "query UserPersonDetails($personId: String!) {\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 UserPreferences {\n  userPreferences {\n    general {\n      reviewScale\n      gridPacking\n      displayNsfw\n      disableVideos\n      persistQueries\n      disableReviews\n      disableIntegrations\n      disableWatchProviders\n      disableNavigationAnimation\n      dashboard {\n        section\n        hidden\n        numElements\n      }\n      watchProviders {\n        lot\n        values\n      }\n    }\n    fitness {\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      exercises {\n        unitSystem\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}"): (typeof documents)["query UserPreferences {\n  userPreferences {\n    general {\n      reviewScale\n      gridPacking\n      displayNsfw\n      disableVideos\n      persistQueries\n      disableReviews\n      disableIntegrations\n      disableWatchProviders\n      disableNavigationAnimation\n      dashboard {\n        section\n        hidden\n        numElements\n      }\n      watchProviders {\n        lot\n        values\n      }\n    }\n    fitness {\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      exercises {\n        unitSystem\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}"];
+export function graphql(source: "query UserPreferences {\n  userPreferences {\n    general {\n      reviewScale\n      gridPacking\n      displayNsfw\n      disableVideos\n      persistQueries\n      disableReviews\n      disableIntegrations\n      disableWatchProviders\n      disableNavigationAnimation\n      dashboard {\n        section\n        hidden\n        numElements\n      }\n      watchProviders {\n        lot\n        values\n      }\n    }\n    fitness {\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      exercises {\n        unitSystem\n        setRestTimers {\n          ...SetRestTimersPart\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}"): (typeof documents)["query UserPreferences {\n  userPreferences {\n    general {\n      reviewScale\n      gridPacking\n      displayNsfw\n      disableVideos\n      persistQueries\n      disableReviews\n      disableIntegrations\n      disableWatchProviders\n      disableNavigationAnimation\n      dashboard {\n        section\n        hidden\n        numElements\n      }\n      watchProviders {\n        lot\n        values\n      }\n    }\n    fitness {\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      exercises {\n        unitSystem\n        setRestTimers {\n          ...SetRestTimersPart\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}"];
 /**
  * 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      defaultRestTimer\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      defaultRestTimer\n      summary {\n        ...WorkoutSummaryPart\n      }\n      information {\n        ...WorkoutInformationPart\n      }\n    }\n  }\n}"];
+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 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}"];
+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 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}"];
+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 WorkoutDetails($workoutId: String!) {\n  workoutDetails(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 WorkoutDetails($workoutId: String!) {\n  workoutDetails(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}"];
+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.
  */
@@ -178,7 +178,7 @@ export function graphql(source: "query GetOidcRedirectUrl {\n  getOidcRedirectUr
 /**
  * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
  */
-export function graphql(source: "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  chapter\n  volume\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  identifier\n  title\n  image\n  publishYear\n}\n\nfragment WorkoutOrExerciseTotalsPart on WorkoutOrExerciseTotals {\n  personalBestsAchieved\n  weight\n  reps\n  distance\n  duration\n  restTime\n}\n\nfragment EntityAssetsPart on EntityAssets {\n  images\n  videos\n}\n\nfragment WorkoutSetStatisticPart on WorkoutSetStatistic {\n  duration\n  distance\n  reps\n  weight\n  oneRm\n  pace\n  volume\n}\n\nfragment WorkoutSetRecordPart on WorkoutSetRecord {\n  statistic {\n    ...WorkoutSetStatisticPart\n  }\n  lot\n  personalBests\n}\n\nfragment WorkoutSummaryPart on WorkoutSummary {\n  total {\n    ...WorkoutOrExerciseTotalsPart\n  }\n  exercises {\n    numSets\n    id\n    lot\n    bestSet {\n      ...WorkoutSetRecordPart\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    createdOn\n    user {\n      id\n      name\n    }\n    likedBy\n  }\n  showExtraInformation {\n    ...SeenShowExtraInformationPart\n  }\n  podcastExtraInformation {\n    ...SeenPodcastExtraInformationPart\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  exercises {\n    name\n    lot\n    notes\n    restTime\n    total {\n      ...WorkoutOrExerciseTotalsPart\n    }\n    supersetWith\n    assets {\n      ...EntityAssetsPart\n    }\n    sets {\n      statistic {\n        ...WorkoutSetStatisticPart\n      }\n      note\n      lot\n      personalBests\n      confirmedAt\n    }\n  }\n}"): (typeof documents)["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  chapter\n  volume\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  identifier\n  title\n  image\n  publishYear\n}\n\nfragment WorkoutOrExerciseTotalsPart on WorkoutOrExerciseTotals {\n  personalBestsAchieved\n  weight\n  reps\n  distance\n  duration\n  restTime\n}\n\nfragment EntityAssetsPart on EntityAssets {\n  images\n  videos\n}\n\nfragment WorkoutSetStatisticPart on WorkoutSetStatistic {\n  duration\n  distance\n  reps\n  weight\n  oneRm\n  pace\n  volume\n}\n\nfragment WorkoutSetRecordPart on WorkoutSetRecord {\n  statistic {\n    ...WorkoutSetStatisticPart\n  }\n  lot\n  personalBests\n}\n\nfragment WorkoutSummaryPart on WorkoutSummary {\n  total {\n    ...WorkoutOrExerciseTotalsPart\n  }\n  exercises {\n    numSets\n    id\n    lot\n    bestSet {\n      ...WorkoutSetRecordPart\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    createdOn\n    user {\n      id\n      name\n    }\n    likedBy\n  }\n  showExtraInformation {\n    ...SeenShowExtraInformationPart\n  }\n  podcastExtraInformation {\n    ...SeenPodcastExtraInformationPart\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  exercises {\n    name\n    lot\n    notes\n    restTime\n    total {\n      ...WorkoutOrExerciseTotalsPart\n    }\n    supersetWith\n    assets {\n      ...EntityAssetsPart\n    }\n    sets {\n      statistic {\n        ...WorkoutSetStatisticPart\n      }\n      note\n      lot\n      personalBests\n      confirmedAt\n    }\n  }\n}"];
+export function graphql(source: "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}\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    ...SeenShowExtraInformationPart\n  }\n  podcastExtraInformation {\n    ...SeenPodcastExtraInformationPart\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}"): (typeof documents)["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}\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    ...SeenShowExtraInformationPart\n  }\n  podcastExtraInformation {\n    ...SeenPodcastExtraInformationPart\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}"];
 
 export function graphql(source: string) {
   return (documents as any)[source] ?? {};
diff --git a/libs/generated/src/graphql/backend/graphql.ts b/libs/generated/src/graphql/backend/graphql.ts
index e4976d3742..897d36e744 100644
--- a/libs/generated/src/graphql/backend/graphql.ts
+++ b/libs/generated/src/graphql/backend/graphql.ts
@@ -1186,6 +1186,8 @@ export type MutationRoot = {
   updateSeenItem: Scalars['Boolean']['output'];
   /** Update a user's profile details. */
   updateUser: StringIdObject;
+  /** Update a user's exercise settings. */
+  updateUserExerciseSettings: Scalars['Boolean']['output'];
   /** Update an integration for the currently logged in user. */
   updateUserIntegration: Scalars['Boolean']['output'];
   /** Edit a notification platform for the currently logged in user. */
@@ -1193,7 +1195,7 @@ export type MutationRoot = {
   /** Change a user's preferences. */
   updateUserPreference: Scalars['Boolean']['output'];
   /** Change the details about a user's workout. */
-  updateUserWorkout: Scalars['Boolean']['output'];
+  updateUserWorkoutAttributes: Scalars['Boolean']['output'];
 };
 
 
@@ -1408,6 +1410,11 @@ export type MutationRootUpdateUserArgs = {
 };
 
 
+export type MutationRootUpdateUserExerciseSettingsArgs = {
+  input: UpdateUserExerciseSettings;
+};
+
+
 export type MutationRootUpdateUserIntegrationArgs = {
   input: UpdateUserIntegrationInput;
 };
@@ -1419,12 +1426,12 @@ export type MutationRootUpdateUserNotificationPlatformArgs = {
 
 
 export type MutationRootUpdateUserPreferenceArgs = {
-  input: UpdateUserPreferenceInput;
+  input: UpdateComplexJsonInput;
 };
 
 
-export type MutationRootUpdateUserWorkoutArgs = {
-  input: UpdateUserWorkoutInput;
+export type MutationRootUpdateUserWorkoutAttributesArgs = {
+  input: UpdateUserWorkoutAttributesInput;
 };
 
 export type NotificationPlatform = {
@@ -1610,10 +1617,7 @@ export type ProcessedExercise = {
   lot: ExerciseLot;
   name: Scalars['String']['output'];
   notes: Array<Scalars['String']['output']>;
-  restTime?: Maybe<Scalars['Int']['output']>;
   sets: Array<WorkoutSetRecord>;
-  /** The indices of the exercises with which this has been superset with. */
-  supersetWith: Array<Scalars['Int']['output']>;
   total?: Maybe<WorkoutOrExerciseTotals>;
 };
 
@@ -1718,6 +1722,8 @@ export type QueryRoot = {
   userRecommendations: Array<Scalars['String']['output']>;
   /** Get upcoming calendar events for the given filter. */
   userUpcomingCalendarEvents: Array<GraphqlCalendarEvent>;
+  /** Get details about a workout. */
+  userWorkoutDetails: UserWorkoutDetails;
   /** Get information about a workout template. */
   userWorkoutTemplateDetails: UserWorkoutTemplateDetails;
   /** Get a paginated list of templates created by the user. */
@@ -1726,8 +1732,6 @@ export type QueryRoot = {
   userWorkoutsList: WorkoutListResults;
   /** Get details about all the users in the service. */
   usersList: Array<User>;
-  /** Get details about a workout. */
-  workoutDetails: UserWorkoutDetails;
 };
 
 
@@ -1866,6 +1870,11 @@ export type QueryRootUserUpcomingCalendarEventsArgs = {
 };
 
 
+export type QueryRootUserWorkoutDetailsArgs = {
+  workoutId: Scalars['String']['input'];
+};
+
+
 export type QueryRootUserWorkoutTemplateDetailsArgs = {
   workoutTemplateId: Scalars['String']['input'];
 };
@@ -1885,11 +1894,6 @@ export type QueryRootUsersListArgs = {
   query?: InputMaybe<Scalars['String']['input']>;
 };
 
-
-export type QueryRootWorkoutDetailsArgs = {
-  workoutId: Scalars['String']['input'];
-};
-
 export type RegisterError = {
   error: RegisterErrorVariant;
 };
@@ -1986,6 +1990,13 @@ export enum SetLot {
   WarmUp = 'WARM_UP'
 }
 
+export type SetRestTimersSettings = {
+  drop?: Maybe<Scalars['Int']['output']>;
+  failure?: Maybe<Scalars['Int']['output']>;
+  normal?: Maybe<Scalars['Int']['output']>;
+  warmup?: Maybe<Scalars['Int']['output']>;
+};
+
 /** Details about the statistics of the set performed. */
 export type SetStatisticInput = {
   distance?: InputMaybe<Scalars['Decimal']['input']>;
@@ -2063,6 +2074,12 @@ export type StrongAppImportMapping = {
   targetName: Scalars['String']['input'];
 };
 
+export type UpdateComplexJsonInput = {
+  /** Dot delimited path to the property that needs to be changed. */
+  property: Scalars['String']['input'];
+  value: Scalars['String']['input'];
+};
+
 export type UpdateCustomExerciseInput = {
   attributes: ExerciseAttributesInput;
   equipment?: InputMaybe<ExerciseEquipment>;
@@ -2085,6 +2102,11 @@ export type UpdateSeenItemInput = {
   startedOn?: InputMaybe<Scalars['NaiveDate']['input']>;
 };
 
+export type UpdateUserExerciseSettings = {
+  change: UpdateComplexJsonInput;
+  exerciseId: Scalars['String']['input'];
+};
+
 export type UpdateUserInput = {
   adminAccessToken?: InputMaybe<Scalars['String']['input']>;
   extraInformation?: InputMaybe<Scalars['JSON']['input']>;
@@ -2108,16 +2130,7 @@ export type UpdateUserNotificationPlatformInput = {
   notificationId: Scalars['String']['input'];
 };
 
-export type UpdateUserPreferenceInput = {
-  /**
-   * Dot delimited path to the property that needs to be changed. Setting it\
-   * to empty resets the preferences to default.
-   */
-  property: Scalars['String']['input'];
-  value: Scalars['String']['input'];
-};
-
-export type UpdateUserWorkoutInput = {
+export type UpdateUserWorkoutAttributesInput = {
   endTime?: InputMaybe<Scalars['DateTime']['input']>;
   id: Scalars['String']['input'];
   startTime?: InputMaybe<Scalars['DateTime']['input']>;
@@ -2167,12 +2180,11 @@ export type UserExerciseInput = {
   assets?: InputMaybe<EntityAssetsInput>;
   exerciseId: Scalars['String']['input'];
   notes: Array<Scalars['String']['input']>;
-  restTime?: InputMaybe<Scalars['Int']['input']>;
   sets: Array<UserWorkoutSetRecord>;
-  supersetWith: Array<Scalars['Int']['input']>;
 };
 
-export type UserExercisePreferences = {
+export type UserExercisesPreferences = {
+  setRestTimers: SetRestTimersSettings;
   unitSystem: UserUnitSystem;
 };
 
@@ -2190,7 +2202,7 @@ export type UserFitnessFeaturesEnabledPreferences = {
 };
 
 export type UserFitnessPreferences = {
-  exercises: UserExercisePreferences;
+  exercises: UserExercisesPreferences;
   measurements: UserMeasurementsPreferences;
 };
 
@@ -2456,6 +2468,7 @@ export type UserToExerciseExtraInformation = {
   history: Array<UserToExerciseHistoryExtraInformation>;
   lifetimeStats: WorkoutOrExerciseTotals;
   personalBests: Array<UserToExerciseBestSetExtraInformation>;
+  settings: UserToExerciseSettingsExtraInformation;
 };
 
 export type UserToExerciseHistoryExtraInformation = {
@@ -2465,6 +2478,10 @@ export type UserToExerciseHistoryExtraInformation = {
   workoutId: Scalars['String']['output'];
 };
 
+export type UserToExerciseSettingsExtraInformation = {
+  setRestTimers: SetRestTimersSettings;
+};
+
 export enum UserToMediaReason {
   Collection = 'COLLECTION',
   Finished = 'FINISHED',
@@ -2496,12 +2513,12 @@ export type UserWorkoutDetails = {
 export type UserWorkoutInput = {
   assets?: InputMaybe<EntityAssetsInput>;
   comment?: InputMaybe<Scalars['String']['input']>;
-  defaultRestTimer?: InputMaybe<Scalars['Int']['input']>;
   endTime: Scalars['DateTime']['input'];
   exercises: Array<UserExerciseInput>;
   name: Scalars['String']['input'];
   repeatedFrom?: InputMaybe<Scalars['String']['input']>;
   startTime: Scalars['DateTime']['input'];
+  supersets: Array<WorkoutSupersetsInformationInput>;
   templateId?: InputMaybe<Scalars['String']['input']>;
   updateWorkoutId?: InputMaybe<Scalars['String']['input']>;
   updateWorkoutTemplateId?: InputMaybe<Scalars['String']['input']>;
@@ -2511,6 +2528,7 @@ export type UserWorkoutSetRecord = {
   confirmedAt?: InputMaybe<Scalars['DateTime']['input']>;
   lot: SetLot;
   note?: InputMaybe<Scalars['String']['input']>;
+  restTime?: InputMaybe<Scalars['Int']['input']>;
   statistic: SetStatisticInput;
 };
 
@@ -2564,6 +2582,7 @@ export type WorkoutInformation = {
   assets?: Maybe<EntityAssets>;
   comment?: Maybe<Scalars['String']['output']>;
   exercises: Array<ProcessedExercise>;
+  supersets: Array<WorkoutSupersetsInformation>;
 };
 
 export type WorkoutListResults = {
@@ -2600,6 +2619,7 @@ export type WorkoutSetRecord = {
   lot: SetLot;
   note?: Maybe<Scalars['String']['output']>;
   personalBests?: Maybe<Array<WorkoutSetPersonalBest>>;
+  restTime?: Maybe<Scalars['Int']['output']>;
   statistic: WorkoutSetStatistic;
   totals?: Maybe<WorkoutSetTotals>;
 };
@@ -2627,14 +2647,27 @@ export type WorkoutSummary = {
 /** The summary about an exercise done in a workout. */
 export type WorkoutSummaryExercise = {
   bestSet?: Maybe<WorkoutSetRecord>;
-  id: Scalars['String']['output'];
   lot?: Maybe<ExerciseLot>;
+  name: Scalars['String']['output'];
   numSets: Scalars['Int']['output'];
 };
 
+export type WorkoutSupersetsInformation = {
+  /** A color that will be displayed on the frontend. */
+  color: Scalars['String']['output'];
+  /** The identifier of all the exercises which are in the same superset */
+  exercises: Array<Scalars['Int']['output']>;
+};
+
+export type WorkoutSupersetsInformationInput = {
+  /** A color that will be displayed on the frontend. */
+  color: Scalars['String']['input'];
+  /** The identifier of all the exercises which are in the same superset */
+  exercises: Array<Scalars['Int']['input']>;
+};
+
 export type WorkoutTemplate = {
   createdOn: Scalars['DateTime']['output'];
-  defaultRestTimer?: Maybe<Scalars['Int']['output']>;
   id: Scalars['String']['output'];
   information: WorkoutInformation;
   name: Scalars['String']['output'];
@@ -2897,12 +2930,12 @@ export type UpdateUserNotificationPlatformMutationVariables = Exact<{
 
 export type UpdateUserNotificationPlatformMutation = { updateUserNotificationPlatform: boolean };
 
-export type UpdateUserWorkoutMutationVariables = Exact<{
-  input: UpdateUserWorkoutInput;
+export type UpdateUserWorkoutAttributesMutationVariables = Exact<{
+  input: UpdateUserWorkoutAttributesInput;
 }>;
 
 
-export type UpdateUserWorkoutMutation = { updateUserWorkout: boolean };
+export type UpdateUserWorkoutAttributesMutation = { updateUserWorkoutAttributes: boolean };
 
 export type GenerateAuthTokenMutationVariables = Exact<{ [key: string]: never; }>;
 
@@ -2958,7 +2991,7 @@ export type UpdateUserMutationVariables = Exact<{
 export type UpdateUserMutation = { updateUser: { id: string } };
 
 export type UpdateUserPreferenceMutationVariables = Exact<{
-  input: UpdateUserPreferenceInput;
+  input: UpdateComplexJsonInput;
 }>;
 
 
@@ -2985,12 +3018,19 @@ export type RevokeAccessLinkMutationVariables = Exact<{
 
 export type RevokeAccessLinkMutation = { revokeAccessLink: boolean };
 
+export type UpdateUserExerciseSettingsMutationVariables = Exact<{
+  input: UpdateUserExerciseSettings;
+}>;
+
+
+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, createdOn: string, likedBy: Array<string>, user: { id: string, name: string } }>, showExtraInformation?: { episode: number, season: number } | null, podcastExtraInformation?: { episode: number } | null, animeExtraInformation?: { episode?: number | null } | null, mangaExtraInformation?: { chapter?: string | null, volume?: number | 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 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?: { episode: number, season: number } | null, podcastExtraInformation?: { episode: number } | 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; }>;
 
@@ -3099,7 +3139,7 @@ export type UserExerciseDetailsQueryVariables = Exact<{
 }>;
 
 
-export type UserExerciseDetailsQuery = { userExerciseDetails: { 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, createdOn: string, likedBy: Array<string>, user: { id: string, name: string } }>, showExtraInformation?: { episode: number, season: number } | null, podcastExtraInformation?: { episode: number } | null, animeExtraInformation?: { episode?: number | null } | null, mangaExtraInformation?: { chapter?: string | null, volume?: number | null } | null }>, history?: Array<{ idx: number, workoutId: string, workoutEndOn: string, bestSet?: { lot: SetLot, personalBests?: Array<WorkoutSetPersonalBest> | null, statistic: { duration?: string | null, distance?: string | null, reps?: string | null, weight?: string | null, oneRm?: string | null, pace?: string | null, volume?: string | null } } | null }> | null, details?: { exerciseId?: string | null, createdOn: string, lastUpdatedOn: string, exerciseNumTimesInteracted?: number | null, exerciseExtraInformation?: { lifetimeStats: { weight: string, reps: string, distance: string, duration: string, personalBestsAchieved: number }, personalBests: Array<{ lot: WorkoutSetPersonalBest, sets: Array<{ workoutId: string, exerciseIdx: number, setIdx: number }> }> } | null } | null } };
+export type UserExerciseDetailsQuery = { userExerciseDetails: { 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?: { episode: number, season: number } | null, podcastExtraInformation?: { episode: number } | null, animeExtraInformation?: { episode?: number | null } | null, mangaExtraInformation?: { volume?: number | null, chapter?: string | null } | null }>, history?: Array<{ idx: number, workoutId: string, workoutEndOn: string, 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 }> | null, details?: { exerciseId?: string | null, createdOn: string, lastUpdatedOn: string, exerciseNumTimesInteracted?: number | null, exerciseExtraInformation?: { settings: { setRestTimers: { drop?: number | null, warmup?: number | null, normal?: number | null, failure?: number | null } }, lifetimeStats: { weight: string, reps: string, distance: string, duration: string, personalBestsAchieved: number }, personalBests: Array<{ lot: WorkoutSetPersonalBest, sets: Array<{ workoutId: string, exerciseIdx: number, setIdx: number }> }> } | null } | null } };
 
 export type UserMeasurementsListQueryVariables = Exact<{
   input: UserMeasurementsListInput;
@@ -3113,54 +3153,54 @@ 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?: { chapter?: string | null, volume?: number | 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?: { chapter?: string | null, volume?: number | 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, createdOn: string, likedBy: Array<string>, user: { id: string, name: string } }>, showExtraInformation?: { episode: number, season: number } | null, podcastExtraInformation?: { episode: number } | null, animeExtraInformation?: { episode?: number | null } | null, mangaExtraInformation?: { chapter?: string | null, volume?: number | 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 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?: { episode: number, season: number } | null, podcastExtraInformation?: { episode: number } | 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, createdOn: string, likedBy: Array<string>, user: { id: string, name: string } }>, showExtraInformation?: { episode: number, season: number } | null, podcastExtraInformation?: { episode: number } | null, animeExtraInformation?: { episode?: number | null } | null, mangaExtraInformation?: { chapter?: string | null, volume?: number | null } | null }>, collections: Array<{ id: string, name: string, userId: string }> } };
+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?: { episode: number, season: number } | null, podcastExtraInformation?: { episode: number } | 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, createdOn: string, likedBy: Array<string>, user: { id: string, name: string } }>, showExtraInformation?: { episode: number, season: number } | null, podcastExtraInformation?: { episode: number } | null, animeExtraInformation?: { episode?: number | null } | null, mangaExtraInformation?: { chapter?: string | null, volume?: number | null } | null }> } };
+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?: { episode: number, season: number } | null, podcastExtraInformation?: { episode: number } | null, animeExtraInformation?: { episode?: number | null } | null, mangaExtraInformation?: { volume?: number | null, chapter?: string | null } | null }> } };
 
 export type UserPreferencesQueryVariables = Exact<{ [key: string]: never; }>;
 
 
-export type UserPreferencesQuery = { userPreferences: { general: { reviewScale: UserReviewScale, gridPacking: GridPacking, displayNsfw: boolean, disableVideos: boolean, persistQueries: boolean, disableReviews: boolean, disableIntegrations: boolean, disableWatchProviders: boolean, disableNavigationAnimation: boolean, dashboard: Array<{ section: DashboardElementLot, hidden: boolean, numElements?: number | null }>, watchProviders: Array<{ lot: MediaLot, values: Array<string> }> }, fitness: { measurements: { custom: Array<{ name: string, dataType: UserCustomMeasurementDataType }>, inbuilt: { weight: boolean, bodyMassIndex: boolean, totalBodyWater: boolean, muscle: boolean, leanBodyMass: boolean, bodyFat: boolean, boneMass: boolean, visceralFat: boolean, waistCircumference: boolean, waistToHeightRatio: boolean, hipCircumference: boolean, waistToHipRatio: boolean, chestCircumference: boolean, thighCircumference: boolean, bicepsCircumference: boolean, neckCircumference: boolean, bodyFatCaliper: boolean, chestSkinfold: boolean, abdominalSkinfold: boolean, thighSkinfold: boolean, basalMetabolicRate: boolean, totalDailyEnergyExpenditure: boolean, calories: boolean } }, exercises: { unitSystem: UserUnitSystem } }, notifications: { toSend: Array<MediaStateChanged>, enabled: boolean }, featuresEnabled: { others: { calendar: boolean, collections: boolean }, fitness: { enabled: boolean, workouts: boolean, templates: boolean, measurements: boolean }, media: { enabled: boolean, anime: boolean, audioBook: boolean, book: boolean, manga: boolean, movie: boolean, podcast: boolean, show: boolean, videoGame: boolean, visualNovel: boolean, people: boolean, groups: boolean, genres: boolean } } } };
+export type UserPreferencesQuery = { userPreferences: { general: { reviewScale: UserReviewScale, gridPacking: GridPacking, displayNsfw: boolean, disableVideos: boolean, persistQueries: boolean, disableReviews: boolean, disableIntegrations: boolean, disableWatchProviders: boolean, disableNavigationAnimation: boolean, dashboard: Array<{ section: DashboardElementLot, hidden: boolean, numElements?: number | null }>, watchProviders: Array<{ lot: MediaLot, values: Array<string> }> }, fitness: { measurements: { custom: Array<{ name: string, dataType: UserCustomMeasurementDataType }>, inbuilt: { weight: boolean, bodyMassIndex: boolean, totalBodyWater: boolean, muscle: boolean, leanBodyMass: boolean, bodyFat: boolean, boneMass: boolean, visceralFat: boolean, waistCircumference: boolean, waistToHeightRatio: boolean, hipCircumference: boolean, waistToHipRatio: boolean, chestCircumference: boolean, thighCircumference: boolean, bicepsCircumference: boolean, neckCircumference: boolean, bodyFatCaliper: boolean, chestSkinfold: boolean, abdominalSkinfold: boolean, thighSkinfold: boolean, basalMetabolicRate: boolean, totalDailyEnergyExpenditure: boolean, calories: boolean } }, exercises: { unitSystem: UserUnitSystem, setRestTimers: { drop?: number | null, warmup?: number | null, normal?: number | null, failure?: number | null } } }, notifications: { toSend: Array<MediaStateChanged>, enabled: boolean }, featuresEnabled: { others: { calendar: boolean, collections: boolean }, fitness: { enabled: boolean, workouts: boolean, templates: boolean, measurements: boolean }, media: { enabled: boolean, anime: boolean, audioBook: boolean, book: boolean, manga: boolean, movie: boolean, podcast: boolean, show: boolean, videoGame: boolean, visualNovel: boolean, people: boolean, groups: boolean, genres: boolean } } } };
+
+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 }> }, 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, defaultRestTimer?: number | null, summary: { total?: { personalBestsAchieved: number, weight: string, reps: string, distance: string, duration: string, restTime: number } | null, exercises: Array<{ numSets: number, id: string, lot?: ExerciseLot | null, bestSet?: { lot: SetLot, personalBests?: Array<WorkoutSetPersonalBest> | null, statistic: { duration?: string | null, distance?: string | null, reps?: string | null, weight?: string | null, oneRm?: string | null, pace?: string | null, volume?: string | null } } | null }> }, information: { comment?: string | null, assets?: { images: Array<string>, videos: Array<string> } | null, exercises: Array<{ name: string, lot: ExerciseLot, notes: Array<string>, restTime?: number | null, supersetWith: Array<number>, total?: { personalBestsAchieved: number, weight: string, reps: string, distance: string, duration: string, restTime: number } | null, assets?: { images: Array<string>, videos: Array<string> } | null, sets: Array<{ note?: string | null, lot: SetLot, personalBests?: Array<WorkoutSetPersonalBest> | null, confirmedAt?: string | null, statistic: { duration?: string | null, distance?: string | null, reps?: string | null, weight?: string | null, oneRm?: string | null, pace?: string | null, volume?: string | null } }> }> } } } };
+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 }> }, 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?: { personalBestsAchieved: number, weight: string, reps: string, distance: string, duration: string, restTime: number } | null, exercises: Array<{ numSets: number, id: string, lot?: ExerciseLot | null, bestSet?: { lot: SetLot, personalBests?: Array<WorkoutSetPersonalBest> | null, statistic: { duration?: string | null, distance?: string | null, reps?: string | null, weight?: string | null, oneRm?: string | null, pace?: string | null, volume?: string | null } } | null }> } }> } };
+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 }> } }> } };
 
 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?: { personalBestsAchieved: number, weight: string, reps: string, distance: string, duration: string, restTime: number } | null, exercises: Array<{ numSets: number, id: string, lot?: ExerciseLot | null, bestSet?: { lot: SetLot, personalBests?: Array<WorkoutSetPersonalBest> | null, statistic: { duration?: string | null, distance?: string | null, reps?: string | null, weight?: string | null, oneRm?: string | null, pace?: string | null, volume?: string | null } } | null }> } }> } };
-
-export type WorkoutDetailsQueryVariables = Exact<{
-  workoutId: Scalars['String']['input'];
-}>;
-
-
-export type WorkoutDetailsQuery = { workoutDetails: { 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?: { personalBestsAchieved: number, weight: string, reps: string, distance: string, duration: string, restTime: number } | null, exercises: Array<{ numSets: number, id: string, lot?: ExerciseLot | null, bestSet?: { lot: SetLot, personalBests?: Array<WorkoutSetPersonalBest> | null, statistic: { duration?: string | null, distance?: string | null, reps?: string | null, weight?: string | null, oneRm?: string | null, pace?: string | null, volume?: string | null } } | null }> }, information: { comment?: string | null, assets?: { images: Array<string>, videos: Array<string> } | null, exercises: Array<{ name: string, lot: ExerciseLot, notes: Array<string>, restTime?: number | null, supersetWith: Array<number>, total?: { personalBestsAchieved: number, weight: string, reps: string, distance: string, duration: string, restTime: number } | null, assets?: { images: Array<string>, videos: Array<string> } | null, sets: Array<{ note?: string | null, lot: SetLot, personalBests?: Array<WorkoutSetPersonalBest> | null, confirmedAt?: string | null, statistic: { duration?: string | null, distance?: string | null, reps?: string | null, weight?: string | null, oneRm?: string | null, pace?: string | null, volume?: string | null } }> }> } } } };
+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 }> } }> } };
 
 export type GetOidcRedirectUrlQueryVariables = Exact<{ [key: string]: never; }>;
 
@@ -3280,45 +3320,48 @@ export type SeenShowExtraInformationPartFragment = { episode: number, season: nu
 
 export type SeenAnimeExtraInformationPartFragment = { episode?: number | null };
 
-export type SeenMangaExtraInformationPartFragment = { chapter?: string | null, volume?: number | null };
+export type SeenMangaExtraInformationPartFragment = { volume?: number | null, chapter?: string | null };
 
 export type CalendarEventPartFragment = { date: string, metadataId: string, metadataLot: MediaLot, episodeName?: string | null, metadataTitle: string, metadataImage?: string | null, calendarEventId: string, showExtraInformation?: { episode: number, season: number } | null, podcastExtraInformation?: { episode: number } | null, animeExtraInformation?: { episode?: number | null } | null };
 
-export type SeenPartFragment = { 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?: { chapter?: string | null, volume?: number | null } | null };
+export type SeenPartFragment = { 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 };
 
-export type MetadataSearchItemPartFragment = { identifier: string, title: string, image?: string | null, publishYear?: number | null };
+export type MetadataSearchItemPartFragment = { title: string, image?: string | null, identifier: string, publishYear?: number | null };
 
-export type WorkoutOrExerciseTotalsPartFragment = { personalBestsAchieved: number, weight: string, reps: string, distance: string, duration: string, restTime: number };
+export type WorkoutOrExerciseTotalsPartFragment = { reps: string, weight: string, distance: string, duration: string, restTime: number, personalBestsAchieved: number };
 
 export type EntityAssetsPartFragment = { images: Array<string>, videos: Array<string> };
 
-export type WorkoutSetStatisticPartFragment = { duration?: string | null, distance?: string | null, reps?: string | null, weight?: string | null, oneRm?: string | null, pace?: string | null, volume?: string | null };
+export type WorkoutSetStatisticPartFragment = { reps?: string | null, pace?: string | null, oneRm?: string | null, weight?: string | null, volume?: string | null, duration?: string | null, distance?: string | null };
 
-export type WorkoutSetRecordPartFragment = { lot: SetLot, personalBests?: Array<WorkoutSetPersonalBest> | null, statistic: { duration?: string | null, distance?: string | null, reps?: string | null, weight?: string | null, oneRm?: string | null, pace?: string | null, volume?: string | null } };
+export type WorkoutSetRecordPartFragment = { 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 } };
 
-export type WorkoutSummaryPartFragment = { total?: { personalBestsAchieved: number, weight: string, reps: string, distance: string, duration: string, restTime: number } | null, exercises: Array<{ numSets: number, id: string, lot?: ExerciseLot | null, bestSet?: { lot: SetLot, personalBests?: Array<WorkoutSetPersonalBest> | null, statistic: { duration?: string | null, distance?: string | null, reps?: string | null, weight?: string | null, oneRm?: string | null, pace?: string | null, volume?: string | null } } | null }> };
+export type WorkoutSummaryPartFragment = { 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 }> };
 
 export type CollectionPartFragment = { id: string, name: string, userId: string };
 
-export type ReviewItemPartFragment = { 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, createdOn: string, likedBy: Array<string>, user: { id: string, name: string } }>, showExtraInformation?: { episode: number, season: number } | null, podcastExtraInformation?: { episode: number } | null, animeExtraInformation?: { episode?: number | null } | null, mangaExtraInformation?: { chapter?: string | null, volume?: number | null } | null };
+export type ReviewItemPartFragment = { 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?: { episode: number, season: number } | null, podcastExtraInformation?: { episode: number } | null, animeExtraInformation?: { episode?: number | null } | null, mangaExtraInformation?: { volume?: number | null, chapter?: string | null } | null };
+
+export type WorkoutInformationPartFragment = { 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 WorkoutInformationPartFragment = { comment?: string | null, assets?: { images: Array<string>, videos: Array<string> } | null, exercises: Array<{ name: string, lot: ExerciseLot, notes: Array<string>, restTime?: number | null, supersetWith: Array<number>, total?: { personalBestsAchieved: number, weight: string, reps: string, distance: string, duration: string, restTime: number } | null, assets?: { images: Array<string>, videos: Array<string> } | null, sets: Array<{ note?: string | null, lot: SetLot, personalBests?: Array<WorkoutSetPersonalBest> | null, confirmedAt?: string | null, statistic: { duration?: string | null, distance?: string | null, reps?: string | null, weight?: string | null, oneRm?: string | null, pace?: string | null, volume?: string | null } }> }> };
+export type SetRestTimersPartFragment = { drop?: number | null, warmup?: number | null, normal?: number | null, failure?: number | null };
 
 export const SeenShowExtraInformationPartFragmentDoc = {"kind":"Document","definitions":[{"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"}}]}}]} as unknown as DocumentNode<SeenShowExtraInformationPartFragment, unknown>;
 export const SeenPodcastExtraInformationPartFragmentDoc = {"kind":"Document","definitions":[{"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"}}]}}]} as unknown as DocumentNode<SeenPodcastExtraInformationPartFragment, unknown>;
 export const SeenAnimeExtraInformationPartFragmentDoc = {"kind":"Document","definitions":[{"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"}}]}}]} as unknown as DocumentNode<SeenAnimeExtraInformationPartFragment, unknown>;
 export const CalendarEventPartFragmentDoc = {"kind":"Document","definitions":[{"kind":"FragmentDefinition","name":{"kind":"Name","value":"CalendarEventPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"GraphqlCalendarEvent"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"date"}},{"kind":"Field","name":{"kind":"Name","value":"metadataId"}},{"kind":"Field","name":{"kind":"Name","value":"metadataLot"}},{"kind":"Field","name":{"kind":"Name","value":"episodeName"}},{"kind":"Field","name":{"kind":"Name","value":"metadataTitle"}},{"kind":"Field","name":{"kind":"Name","value":"metadataImage"}},{"kind":"Field","name":{"kind":"Name","value":"calendarEventId"}},{"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":"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"}}]}}]} as unknown as DocumentNode<CalendarEventPartFragment, unknown>;
-export const SeenMangaExtraInformationPartFragmentDoc = {"kind":"Document","definitions":[{"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":"chapter"}},{"kind":"Field","name":{"kind":"Name","value":"volume"}}]}}]} as unknown as DocumentNode<SeenMangaExtraInformationPartFragment, unknown>;
-export const SeenPartFragmentDoc = {"kind":"Document","definitions":[{"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":"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":"chapter"}},{"kind":"Field","name":{"kind":"Name","value":"volume"}}]}}]} as unknown as DocumentNode<SeenPartFragment, unknown>;
-export const MetadataSearchItemPartFragmentDoc = {"kind":"Document","definitions":[{"kind":"FragmentDefinition","name":{"kind":"Name","value":"MetadataSearchItemPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"MetadataSearchItem"}},"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<MetadataSearchItemPartFragment, unknown>;
-export const WorkoutOrExerciseTotalsPartFragmentDoc = {"kind":"Document","definitions":[{"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":"personalBestsAchieved"}},{"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":"restTime"}}]}}]} as unknown as DocumentNode<WorkoutOrExerciseTotalsPartFragment, unknown>;
-export const WorkoutSetStatisticPartFragmentDoc = {"kind":"Document","definitions":[{"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":"duration"}},{"kind":"Field","name":{"kind":"Name","value":"distance"}},{"kind":"Field","name":{"kind":"Name","value":"reps"}},{"kind":"Field","name":{"kind":"Name","value":"weight"}},{"kind":"Field","name":{"kind":"Name","value":"oneRm"}},{"kind":"Field","name":{"kind":"Name","value":"pace"}},{"kind":"Field","name":{"kind":"Name","value":"volume"}}]}}]} as unknown as DocumentNode<WorkoutSetStatisticPartFragment, unknown>;
-export const WorkoutSetRecordPartFragmentDoc = {"kind":"Document","definitions":[{"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":"statistic"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"WorkoutSetStatisticPart"}}]}},{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"personalBests"}}]}},{"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":"duration"}},{"kind":"Field","name":{"kind":"Name","value":"distance"}},{"kind":"Field","name":{"kind":"Name","value":"reps"}},{"kind":"Field","name":{"kind":"Name","value":"weight"}},{"kind":"Field","name":{"kind":"Name","value":"oneRm"}},{"kind":"Field","name":{"kind":"Name","value":"pace"}},{"kind":"Field","name":{"kind":"Name","value":"volume"}}]}}]} as unknown as DocumentNode<WorkoutSetRecordPartFragment, unknown>;
-export const WorkoutSummaryPartFragmentDoc = {"kind":"Document","definitions":[{"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":"numSets"}},{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"bestSet"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"WorkoutSetRecordPart"}}]}}]}}]}},{"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":"duration"}},{"kind":"Field","name":{"kind":"Name","value":"distance"}},{"kind":"Field","name":{"kind":"Name","value":"reps"}},{"kind":"Field","name":{"kind":"Name","value":"weight"}},{"kind":"Field","name":{"kind":"Name","value":"oneRm"}},{"kind":"Field","name":{"kind":"Name","value":"pace"}},{"kind":"Field","name":{"kind":"Name","value":"volume"}}]}},{"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":"personalBestsAchieved"}},{"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":"restTime"}}]}},{"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":"statistic"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"WorkoutSetStatisticPart"}}]}},{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"personalBests"}}]}}]} as unknown as DocumentNode<WorkoutSummaryPartFragment, unknown>;
+export const SeenMangaExtraInformationPartFragmentDoc = {"kind":"Document","definitions":[{"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"}}]}}]} as unknown as DocumentNode<SeenMangaExtraInformationPartFragment, unknown>;
+export const SeenPartFragmentDoc = {"kind":"Document","definitions":[{"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":"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"}}]}}]} as unknown as DocumentNode<SeenPartFragment, unknown>;
+export const MetadataSearchItemPartFragmentDoc = {"kind":"Document","definitions":[{"kind":"FragmentDefinition","name":{"kind":"Name","value":"MetadataSearchItemPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"MetadataSearchItem"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"image"}},{"kind":"Field","name":{"kind":"Name","value":"identifier"}},{"kind":"Field","name":{"kind":"Name","value":"publishYear"}}]}}]} as unknown as DocumentNode<MetadataSearchItemPartFragment, unknown>;
+export const WorkoutOrExerciseTotalsPartFragmentDoc = {"kind":"Document","definitions":[{"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"}}]}}]} as unknown as DocumentNode<WorkoutOrExerciseTotalsPartFragment, unknown>;
+export const WorkoutSetStatisticPartFragmentDoc = {"kind":"Document","definitions":[{"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"}}]}}]} as unknown as DocumentNode<WorkoutSetStatisticPartFragment, unknown>;
+export const WorkoutSetRecordPartFragmentDoc = {"kind":"Document","definitions":[{"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":"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"}}]}}]} as unknown as DocumentNode<WorkoutSetRecordPartFragment, unknown>;
+export const WorkoutSummaryPartFragmentDoc = {"kind":"Document","definitions":[{"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":"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":"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":"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"}}]}}]}}]} as unknown as DocumentNode<WorkoutSummaryPartFragment, unknown>;
 export const CollectionPartFragmentDoc = {"kind":"Document","definitions":[{"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<CollectionPartFragment, unknown>;
-export const ReviewItemPartFragmentDoc = {"kind":"Document","definitions":[{"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":"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":"likedBy"}}]}},{"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":"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":"chapter"}},{"kind":"Field","name":{"kind":"Name","value":"volume"}}]}}]} as unknown as DocumentNode<ReviewItemPartFragment, unknown>;
+export const ReviewItemPartFragmentDoc = {"kind":"Document","definitions":[{"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":"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":"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"}}]}}]} as unknown as DocumentNode<ReviewItemPartFragment, unknown>;
 export const EntityAssetsPartFragmentDoc = {"kind":"Document","definitions":[{"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"}}]}}]} as unknown as DocumentNode<EntityAssetsPartFragment, unknown>;
-export const WorkoutInformationPartFragmentDoc = {"kind":"Document","definitions":[{"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":"exercises"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"notes"}},{"kind":"Field","name":{"kind":"Name","value":"restTime"}},{"kind":"Field","name":{"kind":"Name","value":"total"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"WorkoutOrExerciseTotalsPart"}}]}},{"kind":"Field","name":{"kind":"Name","value":"supersetWith"}},{"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":"statistic"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"WorkoutSetStatisticPart"}}]}},{"kind":"Field","name":{"kind":"Name","value":"note"}},{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"personalBests"}},{"kind":"Field","name":{"kind":"Name","value":"confirmedAt"}}]}}]}}]}},{"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":"WorkoutOrExerciseTotalsPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"WorkoutOrExerciseTotals"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"personalBestsAchieved"}},{"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":"restTime"}}]}},{"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":"duration"}},{"kind":"Field","name":{"kind":"Name","value":"distance"}},{"kind":"Field","name":{"kind":"Name","value":"reps"}},{"kind":"Field","name":{"kind":"Name","value":"weight"}},{"kind":"Field","name":{"kind":"Name","value":"oneRm"}},{"kind":"Field","name":{"kind":"Name","value":"pace"}},{"kind":"Field","name":{"kind":"Name","value":"volume"}}]}}]} as unknown as DocumentNode<WorkoutInformationPartFragment, unknown>;
+export const WorkoutInformationPartFragmentDoc = {"kind":"Document","definitions":[{"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"}}]}}]}}]}}]}},{"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":"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"}}]}}]} as unknown as DocumentNode<WorkoutInformationPartFragment, unknown>;
+export const SetRestTimersPartFragmentDoc = {"kind":"Document","definitions":[{"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<SetRestTimersPartFragment, unknown>;
 export const RegisterUserDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"RegisterUser"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"RegisterUserInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"registerUser"},"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":"RegisterError"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"error"}}]}},{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"StringIdObject"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}}]}}]}}]}}]} as unknown as DocumentNode<RegisterUserMutation, RegisterUserMutationVariables>;
 export const LoginUserDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"LoginUser"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"AuthUserInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"loginUser"},"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":"LoginError"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"error"}}]}},{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"LoginResponse"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"apiKey"}}]}}]}}]}}]} as unknown as DocumentNode<LoginUserMutation, LoginUserMutationVariables>;
 export const AddEntityToCollectionDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"AddEntityToCollection"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ChangeCollectionToEntityInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"addEntityToCollection"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}]}]}}]} as unknown as DocumentNode<AddEntityToCollectionMutation, AddEntityToCollectionMutationVariables>;
@@ -3355,7 +3398,7 @@ export const DeployUpdatePersonJobDocument = {"kind":"Document","definitions":[{
 export const DeployUpdateMetadataGroupJobDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"DeployUpdateMetadataGroupJob"},"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":"deployUpdateMetadataGroupJob"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"metadataGroupId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"metadataGroupId"}}}]}]}}]} as unknown as DocumentNode<DeployUpdateMetadataGroupJobMutation, DeployUpdateMetadataGroupJobMutationVariables>;
 export const UpdateSeenItemDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"UpdateSeenItem"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"UpdateSeenItemInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"updateSeenItem"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}]}]}}]} as unknown as DocumentNode<UpdateSeenItemMutation, UpdateSeenItemMutationVariables>;
 export const UpdateUserNotificationPlatformDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"UpdateUserNotificationPlatform"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"UpdateUserNotificationPlatformInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"updateUserNotificationPlatform"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}]}]}}]} as unknown as DocumentNode<UpdateUserNotificationPlatformMutation, UpdateUserNotificationPlatformMutationVariables>;
-export const UpdateUserWorkoutDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"UpdateUserWorkout"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"UpdateUserWorkoutInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"updateUserWorkout"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}]}]}}]} as unknown as DocumentNode<UpdateUserWorkoutMutation, UpdateUserWorkoutMutationVariables>;
+export const UpdateUserWorkoutAttributesDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"UpdateUserWorkoutAttributes"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"UpdateUserWorkoutAttributesInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"updateUserWorkoutAttributes"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}]}]}}]} as unknown as DocumentNode<UpdateUserWorkoutAttributesMutation, UpdateUserWorkoutAttributesMutationVariables>;
 export const GenerateAuthTokenDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"GenerateAuthToken"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"generateAuthToken"}}]}}]} as unknown as DocumentNode<GenerateAuthTokenMutation, GenerateAuthTokenMutationVariables>;
 export const MergeMetadataDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"MergeMetadata"},"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":"mergeMetadata"},"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<MergeMetadataMutation, MergeMetadataMutationVariables>;
 export const DisassociateMetadataDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"DisassociateMetadata"},"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":"disassociateMetadata"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"metadataId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"metadataId"}}}]}]}}]} as unknown as DocumentNode<DisassociateMetadataMutation, DisassociateMetadataMutationVariables>;
@@ -3364,11 +3407,12 @@ export const PresignedPutS3UrlDocument = {"kind":"Document","definitions":[{"kin
 export const RemoveEntityFromCollectionDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"RemoveEntityFromCollection"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ChangeCollectionToEntityInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"removeEntityFromCollection"},"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":"id"}}]}}]}}]} as unknown as DocumentNode<RemoveEntityFromCollectionMutation, RemoveEntityFromCollectionMutationVariables>;
 export const TestUserNotificationPlatformsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"TestUserNotificationPlatforms"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"testUserNotificationPlatforms"}}]}}]} as unknown as DocumentNode<TestUserNotificationPlatformsMutation, TestUserNotificationPlatformsMutationVariables>;
 export const UpdateUserDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"UpdateUser"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"UpdateUserInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"updateUser"},"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":"id"}}]}}]}}]} as unknown as DocumentNode<UpdateUserMutation, UpdateUserMutationVariables>;
-export const UpdateUserPreferenceDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"UpdateUserPreference"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"UpdateUserPreferenceInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"updateUserPreference"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}]}]}}]} as unknown as DocumentNode<UpdateUserPreferenceMutation, UpdateUserPreferenceMutationVariables>;
+export const UpdateUserPreferenceDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"UpdateUserPreference"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"UpdateComplexJsonInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"updateUserPreference"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}]}]}}]} as unknown as DocumentNode<UpdateUserPreferenceMutation, UpdateUserPreferenceMutationVariables>;
 export const CreateAccessLinkDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"CreateAccessLink"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"CreateAccessLinkInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"createAccessLink"},"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":"id"}}]}}]}}]} as unknown as DocumentNode<CreateAccessLinkMutation, CreateAccessLinkMutationVariables>;
 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 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":"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":"chapter"}},{"kind":"Field","name":{"kind":"Name","value":"volume"}}]}},{"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":"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":"likedBy"}}]}},{"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"}}]}}]}}]} as unknown as DocumentNode<CollectionContentsQuery, CollectionContentsQueryVariables>;
+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":"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":"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":"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"}}]}}]}}]} 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":"pageLimit"}},{"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":"localAuthDisabled"}},{"kind":"Field","name":{"kind":"Name","value":"fileStorageEnabled"}},{"kind":"Field","name":{"kind":"Name","value":"tokenValidForDays"}}]}}]}}]} 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>;
@@ -3385,16 +3429,16 @@ export const MetadataSearchDocument = {"kind":"Document","definitions":[{"kind":
 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":"oidcIssuerId"}}]}}]}}]}}]} 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":"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":"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":"chapter"}},{"kind":"Field","name":{"kind":"Name","value":"volume"}}]}},{"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":"duration"}},{"kind":"Field","name":{"kind":"Name","value":"distance"}},{"kind":"Field","name":{"kind":"Name","value":"reps"}},{"kind":"Field","name":{"kind":"Name","value":"weight"}},{"kind":"Field","name":{"kind":"Name","value":"oneRm"}},{"kind":"Field","name":{"kind":"Name","value":"pace"}},{"kind":"Field","name":{"kind":"Name","value":"volume"}}]}},{"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":"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":"likedBy"}}]}},{"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":"WorkoutSetRecordPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"WorkoutSetRecord"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"statistic"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"WorkoutSetStatisticPart"}}]}},{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"personalBests"}}]}}]} as unknown as DocumentNode<UserExerciseDetailsQuery, UserExerciseDetailsQueryVariables>;
+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":"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":"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":"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":"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":"chapter"}},{"kind":"Field","name":{"kind":"Name","value":"volume"}}]}},{"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":"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":"likedBy"}}]}},{"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"}}]}}]}}]} 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":"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":"chapter"}},{"kind":"Field","name":{"kind":"Name","value":"volume"}}]}},{"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":"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":"likedBy"}}]}},{"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":"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":"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":"chapter"}},{"kind":"Field","name":{"kind":"Name","value":"volume"}}]}},{"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":"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":"likedBy"}}]}},{"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"}}]}}]}}]} as unknown as DocumentNode<UserPersonDetailsQuery, UserPersonDetailsQueryVariables>;
-export const UserPreferencesDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"UserPreferences"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"userPreferences"},"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":"section"}},{"kind":"Field","name":{"kind":"Name","value":"hidden"}},{"kind":"Field","name":{"kind":"Name","value":"numElements"}}]}},{"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":"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":"exercises"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"unitSystem"}}]}}]}},{"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"}}]}}]}}]}}]}}]} as unknown as DocumentNode<UserPreferencesQuery, UserPreferencesQueryVariables>;
-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":"defaultRestTimer"}},{"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":"personalBestsAchieved"}},{"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":"restTime"}}]}},{"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":"duration"}},{"kind":"Field","name":{"kind":"Name","value":"distance"}},{"kind":"Field","name":{"kind":"Name","value":"reps"}},{"kind":"Field","name":{"kind":"Name","value":"weight"}},{"kind":"Field","name":{"kind":"Name","value":"oneRm"}},{"kind":"Field","name":{"kind":"Name","value":"pace"}},{"kind":"Field","name":{"kind":"Name","value":"volume"}}]}},{"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":"statistic"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"WorkoutSetStatisticPart"}}]}},{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"personalBests"}}]}},{"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":"numSets"}},{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"bestSet"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"WorkoutSetRecordPart"}}]}}]}}]}},{"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":"exercises"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"notes"}},{"kind":"Field","name":{"kind":"Name","value":"restTime"}},{"kind":"Field","name":{"kind":"Name","value":"total"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"WorkoutOrExerciseTotalsPart"}}]}},{"kind":"Field","name":{"kind":"Name","value":"supersetWith"}},{"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":"statistic"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"WorkoutSetStatisticPart"}}]}},{"kind":"Field","name":{"kind":"Name","value":"note"}},{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"personalBests"}},{"kind":"Field","name":{"kind":"Name","value":"confirmedAt"}}]}}]}}]}}]} 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":"personalBestsAchieved"}},{"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":"restTime"}}]}},{"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":"duration"}},{"kind":"Field","name":{"kind":"Name","value":"distance"}},{"kind":"Field","name":{"kind":"Name","value":"reps"}},{"kind":"Field","name":{"kind":"Name","value":"weight"}},{"kind":"Field","name":{"kind":"Name","value":"oneRm"}},{"kind":"Field","name":{"kind":"Name","value":"pace"}},{"kind":"Field","name":{"kind":"Name","value":"volume"}}]}},{"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":"statistic"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"WorkoutSetStatisticPart"}}]}},{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"personalBests"}}]}},{"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":"numSets"}},{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"bestSet"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"WorkoutSetRecordPart"}}]}}]}}]}}]} 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":"personalBestsAchieved"}},{"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":"restTime"}}]}},{"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":"duration"}},{"kind":"Field","name":{"kind":"Name","value":"distance"}},{"kind":"Field","name":{"kind":"Name","value":"reps"}},{"kind":"Field","name":{"kind":"Name","value":"weight"}},{"kind":"Field","name":{"kind":"Name","value":"oneRm"}},{"kind":"Field","name":{"kind":"Name","value":"pace"}},{"kind":"Field","name":{"kind":"Name","value":"volume"}}]}},{"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":"statistic"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"WorkoutSetStatisticPart"}}]}},{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"personalBests"}}]}},{"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":"numSets"}},{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"bestSet"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"WorkoutSetRecordPart"}}]}}]}}]}}]} as unknown as DocumentNode<UserWorkoutsListQuery, UserWorkoutsListQueryVariables>;
-export const WorkoutDetailsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"WorkoutDetails"},"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":"workoutDetails"},"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":"personalBestsAchieved"}},{"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":"restTime"}}]}},{"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":"duration"}},{"kind":"Field","name":{"kind":"Name","value":"distance"}},{"kind":"Field","name":{"kind":"Name","value":"reps"}},{"kind":"Field","name":{"kind":"Name","value":"weight"}},{"kind":"Field","name":{"kind":"Name","value":"oneRm"}},{"kind":"Field","name":{"kind":"Name","value":"pace"}},{"kind":"Field","name":{"kind":"Name","value":"volume"}}]}},{"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":"statistic"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"WorkoutSetStatisticPart"}}]}},{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"personalBests"}}]}},{"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":"numSets"}},{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"bestSet"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"WorkoutSetRecordPart"}}]}}]}}]}},{"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":"exercises"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"notes"}},{"kind":"Field","name":{"kind":"Name","value":"restTime"}},{"kind":"Field","name":{"kind":"Name","value":"total"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"WorkoutOrExerciseTotalsPart"}}]}},{"kind":"Field","name":{"kind":"Name","value":"supersetWith"}},{"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":"statistic"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"WorkoutSetStatisticPart"}}]}},{"kind":"Field","name":{"kind":"Name","value":"note"}},{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"personalBests"}},{"kind":"Field","name":{"kind":"Name","value":"confirmedAt"}}]}}]}}]}}]} as unknown as DocumentNode<WorkoutDetailsQuery, WorkoutDetailsQueryVariables>;
+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":"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"}}]}}]}}]} 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":"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":"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":"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":"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":"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":"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":"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"}}]}}]}}]} as unknown as DocumentNode<UserPersonDetailsQuery, UserPersonDetailsQueryVariables>;
+export const UserPreferencesDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"UserPreferences"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"userPreferences"},"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":"section"}},{"kind":"Field","name":{"kind":"Name","value":"hidden"}},{"kind":"Field","name":{"kind":"Name","value":"numElements"}}]}},{"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":"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":"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":"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<UserPreferencesQuery, UserPreferencesQueryVariables>;
+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":"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":"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"}}]}}]}}]}}]} 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"}}]}}]}}]}}]} 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>;
diff --git a/libs/graphql/src/backend/mutations/combined.gql b/libs/graphql/src/backend/mutations/combined.gql
index 3a065036dd..abebb61cca 100644
--- a/libs/graphql/src/backend/mutations/combined.gql
+++ b/libs/graphql/src/backend/mutations/combined.gql
@@ -172,8 +172,8 @@ mutation UpdateUserNotificationPlatform($input: UpdateUserNotificationPlatformIn
   updateUserNotificationPlatform(input: $input)
 }
 
-mutation UpdateUserWorkout($input: UpdateUserWorkoutInput!) {
-  updateUserWorkout(input: $input)
+mutation UpdateUserWorkoutAttributes($input: UpdateUserWorkoutAttributesInput!) {
+  updateUserWorkoutAttributes(input: $input)
 }
 
 mutation GenerateAuthToken {
@@ -217,7 +217,7 @@ mutation UpdateUser($input: UpdateUserInput!) {
   }
 }
 
-mutation UpdateUserPreference($input: UpdateUserPreferenceInput!) {
+mutation UpdateUserPreference($input: UpdateComplexJsonInput!) {
   updateUserPreference(input: $input)
 }
 
@@ -245,3 +245,7 @@ mutation ProcessAccessLink($input: ProcessAccessLinkInput!) {
 mutation RevokeAccessLink($accessLinkId: String!) {
   revokeAccessLink(accessLinkId: $accessLinkId)
 }
+
+mutation UpdateUserExerciseSettings($input: UpdateUserExerciseSettings!) {
+  updateUserExerciseSettings(input: $input)
+}
diff --git a/libs/graphql/src/backend/queries/UserExerciseDetails.gql b/libs/graphql/src/backend/queries/UserExerciseDetails.gql
index 23149492e2..55309ca4a9 100644
--- a/libs/graphql/src/backend/queries/UserExerciseDetails.gql
+++ b/libs/graphql/src/backend/queries/UserExerciseDetails.gql
@@ -20,6 +20,11 @@ query UserExerciseDetails($exerciseId: String!) {
       lastUpdatedOn
       exerciseNumTimesInteracted
       exerciseExtraInformation {
+        settings {
+          setRestTimers {
+            ...SetRestTimersPart
+          }
+        }
         lifetimeStats {
           weight
           reps
diff --git a/libs/graphql/src/backend/queries/UserPreferences.gql b/libs/graphql/src/backend/queries/UserPreferences.gql
index 48218b96d7..0994072e8c 100644
--- a/libs/graphql/src/backend/queries/UserPreferences.gql
+++ b/libs/graphql/src/backend/queries/UserPreferences.gql
@@ -54,6 +54,9 @@ query UserPreferences {
       }
       exercises {
         unitSystem
+        setRestTimers {
+          ...SetRestTimersPart
+        }
       }
     }
     notifications {
diff --git a/libs/graphql/src/backend/queries/WorkoutDetails.gql b/libs/graphql/src/backend/queries/UserWorkoutDetails.gql
similarity index 75%
rename from libs/graphql/src/backend/queries/WorkoutDetails.gql
rename to libs/graphql/src/backend/queries/UserWorkoutDetails.gql
index e6ece02939..b50f704563 100644
--- a/libs/graphql/src/backend/queries/WorkoutDetails.gql
+++ b/libs/graphql/src/backend/queries/UserWorkoutDetails.gql
@@ -1,5 +1,5 @@
-query WorkoutDetails($workoutId: String!) {
-  workoutDetails(workoutId: $workoutId) {
+query UserWorkoutDetails($workoutId: String!) {
+  userWorkoutDetails(workoutId: $workoutId) {
     collections {
       ...CollectionPart
     }
diff --git a/libs/graphql/src/backend/queries/UserWorkoutTemplateDetails.gql b/libs/graphql/src/backend/queries/UserWorkoutTemplateDetails.gql
index cf2f67b274..a6b9fbc27b 100644
--- a/libs/graphql/src/backend/queries/UserWorkoutTemplateDetails.gql
+++ b/libs/graphql/src/backend/queries/UserWorkoutTemplateDetails.gql
@@ -8,7 +8,6 @@ query UserWorkoutTemplateDetails($workoutTemplateId: String!) {
       name
       createdOn
       visibility
-      defaultRestTimer
       summary {
         ...WorkoutSummaryPart
       }
diff --git a/libs/graphql/src/backend/queries/fragments.gql b/libs/graphql/src/backend/queries/fragments.gql
index 39b0022166..2eee276e82 100644
--- a/libs/graphql/src/backend/queries/fragments.gql
+++ b/libs/graphql/src/backend/queries/fragments.gql
@@ -12,8 +12,8 @@ fragment SeenAnimeExtraInformationPart on SeenAnimeExtraInformation {
 }
 
 fragment SeenMangaExtraInformationPart on SeenMangaExtraInformation {
-  chapter
   volume
+  chapter
 }
 
 fragment CalendarEventPart on GraphqlCalendarEvent {
@@ -61,19 +61,19 @@ fragment SeenPart on Seen {
 }
 
 fragment MetadataSearchItemPart on MetadataSearchItem {
-  identifier
   title
   image
+  identifier
   publishYear
 }
 
 fragment WorkoutOrExerciseTotalsPart on WorkoutOrExerciseTotals {
-  personalBestsAchieved
-  weight
   reps
+  weight
   distance
   duration
   restTime
+  personalBestsAchieved
 }
 
 fragment EntityAssetsPart on EntityAssets {
@@ -82,21 +82,21 @@ fragment EntityAssetsPart on EntityAssets {
 }
 
 fragment WorkoutSetStatisticPart on WorkoutSetStatistic {
-  duration
-  distance
   reps
-  weight
-  oneRm
   pace
+  oneRm
+  weight
   volume
+  duration
+  distance
 }
 
 fragment WorkoutSetRecordPart on WorkoutSetRecord {
+  lot
+  personalBests
   statistic {
     ...WorkoutSetStatisticPart
   }
-  lot
-  personalBests
 }
 
 fragment WorkoutSummaryPart on WorkoutSummary {
@@ -104,9 +104,9 @@ fragment WorkoutSummaryPart on WorkoutSummary {
     ...WorkoutOrExerciseTotalsPart
   }
   exercises {
-    numSets
-    id
     lot
+    name
+    numSets
     bestSet {
       ...WorkoutSetRecordPart
     }
@@ -135,12 +135,12 @@ fragment ReviewItemPart on ReviewItem {
   comments {
     id
     text
+    likedBy
     createdOn
     user {
       id
       name
     }
-    likedBy
   }
   showExtraInformation {
     ...SeenShowExtraInformationPart
@@ -161,26 +161,36 @@ fragment WorkoutInformationPart on WorkoutInformation {
   assets {
     ...EntityAssetsPart
   }
+  supersets {
+    color
+    exercises
+  }
   exercises {
-    name
     lot
+    name
     notes
-    restTime
     total {
       ...WorkoutOrExerciseTotalsPart
     }
-    supersetWith
     assets {
       ...EntityAssetsPart
     }
     sets {
+      lot
+      note
+      restTime
+      confirmedAt
+      personalBests
       statistic {
         ...WorkoutSetStatisticPart
       }
-      note
-      lot
-      personalBests
-      confirmedAt
     }
   }
 }
+
+fragment SetRestTimersPart on SetRestTimersSettings {
+  drop
+  warmup
+  normal
+  failure
+}
diff --git a/libs/ts-utils/src/index.ts b/libs/ts-utils/src/index.ts
index f4e4d944fc..0070c57e1d 100644
--- a/libs/ts-utils/src/index.ts
+++ b/libs/ts-utils/src/index.ts
@@ -16,6 +16,7 @@ import isInteger from "lodash/isInteger";
 import isNumber from "lodash/isNumber";
 import isString from "lodash/isString";
 import mapValues from "lodash/mapValues";
+import mergeWith from "lodash/mergeWith";
 import omitBy from "lodash/omitBy";
 import pickBy from "lodash/pickBy";
 import set from "lodash/set";
@@ -105,6 +106,7 @@ export {
 	isNumber,
 	isString,
 	mapValues,
+	mergeWith,
 	omitBy,
 	pickBy,
 	set,


Test patch: