diff --git a/devTools/FC.d.ts b/devTools/FC.d.ts
index abc179ce417d94675542045bb8b6d52c0cc05446..4bc3727692c51209576e6accbcd058274233f4b9 100644
--- a/devTools/FC.d.ts
+++ b/devTools/FC.d.ts
@@ -254,8 +254,28 @@ declare namespace App {
 		}
 		namespace View { }
 		namespace SlaveSummary {
-			type StringRenderer = (slave: App.Entity.SlaveState) => String;
 			type AppendRenderer = (slave: App.Entity.SlaveState, parentNode: Node) => void;
+
+			class AbbreviationState {
+				clothes: number;
+				devotion: number;
+				diet: number;
+				drugs: number;
+				genitalia: number;
+				health: number;
+				hormoneBalance: number;
+				mental: number;
+				nationality: number;
+				origins: number;
+				physicals: number;
+				race: number;
+				rules: number;
+				rulesets: number;
+				skills: number;
+			}
+			class State {
+				abbreviation: AbbreviationState;
+			}
 		}
 	}
 
diff --git a/js/002-config/fc-js-init.js b/js/002-config/fc-js-init.js
index 6ee8fcd98120639ab35fa353a5727ed02858bd4e..5eff87da0a2f291b10f185220944887ec5494106 100644
--- a/js/002-config/fc-js-init.js
+++ b/js/002-config/fc-js-init.js
@@ -17,7 +17,7 @@ App.Arcology.Cell = {},
 App.Art = {};
 App.Corporate = {};
 App.Data = {};
-App.Data.HeroSlaves = { };
+App.Data.HeroSlaves = {};
 App.Data.Weather = {};
 App.Debug = {};
 App.Desc = {};
diff --git a/js/003-data/gameVariableData.js b/js/003-data/gameVariableData.js
index 27885b3ef3a8ee399e4eb6d95abd487c30f0c0ed..78cbf91463f9fba2beaed2495424a90d62342a03 100644
--- a/js/003-data/gameVariableData.js
+++ b/js/003-data/gameVariableData.js
@@ -34,24 +34,30 @@ App.Data.defaultGameStateVariables = {
 	cashLastWeek: 0,
 
 	// UI content
+	UI: {
+		slaveSummary: {
+			abbreviation: {
+				clothes: 2,
+				devotion: 2,
+				diet: 2,
+				drugs: 2,
+				genitalia: 2,
+				health: 2,
+				mental: 2,
+				nationality: 2,
+				origins: 2,
+				physicals: 2,
+				race: 2,
+				rules: 2,
+				rulesets: 2,
+				skills: 2,
+			}
+		}
+	},
 	FSNamePref: 0,
 	HGFormality: 1,
 	HGSeverity: 0,
-	abbreviateClothes: 2,
-	abbreviateDevotion: 2,
-	abbreviateDiet: 2,
-	abbreviateDrugs: 2,
-	abbreviateGenitalia: 2,
-	abbreviateHealth: 2,
-	abbreviateMental: 2,
-	abbreviateNationality: 2,
-	abbreviateOrigins: 2,
-	abbreviatePhysicals: 2,
-	abbreviateRace: 2,
-	abbreviateRules: 2,
-	abbreviateRulesets: 2,
 	abbreviateSidebar: 2,
-	abbreviateSkills: 2,
 	adamPrinciple: 0,
 	allowFamilyTitles: 0,
 	allowMaleSlaveNames: false,
@@ -1385,7 +1391,6 @@ App.Data.resetOnNGPlus = {
 		compact: 1, Cash: 1, Upkeep: 1, SexSlaveCount: 1, roomPop: 1, Rep: 1, GSP: 1, Authority: 1, Security: 1, Crime: 1, confirmWeekEnd: 0,
 	},
 	DefaultBirthDestination: "individually decided fates",
-	abbreviateHormoneBalance: 2,
 	legendaryFacility: 0,
 	heroSlavesPurchased : [],
 	fcnn: [
diff --git a/js/003-data/slaveSummaryData.js b/js/003-data/slaveSummaryData.js
new file mode 100644
index 0000000000000000000000000000000000000000..d19b3cc91b7b75a4cf4ce333dbdd4befc7526c52
--- /dev/null
+++ b/js/003-data/slaveSummaryData.js
@@ -0,0 +1,164 @@
+App.Data.SlaveSummary = {
+	long: {
+		clothes: {
+			"Western clothing": 'Chaps.',
+			"a Santa dress": 'Santa dress.',
+			"a ball gown": 'Ball gown.',
+			"a bimbo outfit": 'Bimbo outfit.',
+			"a biyelgee costume": 'Biyelgee costume.',
+			"a bra": 'Nice bra.',
+			"a bunny outfit": 'Bunny outfit.',
+			"a burkini": 'Burkini.',
+			"a burqa": 'Burqa.',
+			"a button-up shirt and panties": 'Button-up shirt, panties.',
+			"a button-up shirt": 'Nice button-up shirt.',
+			"a chattel habit": 'Chattel habit.',
+			"a cheerleader outfit": 'Cheerleader.',
+			"a comfortable bodysuit": 'Bodysuit.',
+			"a courtesan dress": 'Courtesan dress.',
+			"a cybersuit": 'Cybersuit.',
+			"a dirndl": 'Dirndl.',
+			"a fallen nuns habit": 'Slutty habit.',
+			"a gothic lolita dress": 'Gothic lolita dress.',
+			"a halter top dress": 'Halter top dress.',
+			"a hanbok": 'Hanbok.',
+			"a hijab and abaya": 'Hijab and abaya.',
+			"a hijab and blouse": 'Hijab and blouse.',
+			"a huipil": 'Huipil.',
+			"a kimono": 'Kimono.',
+			"a klan robe": 'Klan robe.',
+			"a latex catsuit": 'Nice latex.',
+			"a leotard": 'Leotard.',
+			"a long qipao": 'Long Qipao.',
+			"a maternity dress": 'Maternity dress.',
+			"a military uniform": 'Military uniform.',
+			"a mini dress": 'Mini dress.',
+			"a monokini": 'Monokini.',
+			"a mounty outfit": 'Mounty outfit.',
+			"a nice maid outfit": 'Nice maid.',
+			"a nice nurse outfit": 'Nice nurse.',
+			"a nice pony outfit": 'Nice pony outfit.',
+			"a niqab and abaya": 'Niqab and abaya.',
+			"a one-piece swimsuit": 'Swimsuit.',
+			"a penitent nuns habit": 'Cilice.',
+			"a police uniform": 'Police uniform.',
+			"a red army uniform": 'Red Army uniform.',
+			"a scalemail bikini": 'Scalemail bikini.',
+			"a schoolgirl outfit": 'Schoolgirl outfit.',
+			"a schutzstaffel uniform": 'Schutzstaffel uniform.',
+			"a skimpy loincloth": 'Skimpy loincloth.',
+			"a slave gown": 'Slave gown.',
+			"a slutty klan robe": 'Slutty klan robe.',
+			"a slutty maid outfit": 'Slutty maid.',
+			"a slutty nurse outfit": 'Slutty nurse.',
+			"a slutty outfit": 'Slutty outfit.',
+			"a slutty pony outfit": 'Slutty pony outfit.',
+			"a slutty qipao": 'Slutty qipao.',
+			"a slutty schutzstaffel uniform": 'Slutty Schutzstaffel uniform.',
+			"a sports bra": 'Sports bra.',
+			"a string bikini": 'String bikini.',
+			"a striped bra": 'Striped bra.',
+			"a succubus outfit": 'Succubus outfit.',
+			"a sweater and cutoffs": 'Jean s, sweater.',
+			"a sweater and panties": 'Sweater, panties.',
+			"a sweater": 'Nice sweater.',
+			"a t-shirt and jeans": 'Blue jeans, t-shirt.',
+			"a t-shirt and panties": 'Panties, t-shirt.',
+			"a t-shirt and thong": 'Thong, t-shirt.',
+			"a t-shirt": 'T-shirt.',
+			"a tank-top and panties": 'Tank-top, panties.',
+			"a tank-top": 'Nice tank-top.',
+			"a thong": 'Nice thong.',
+			"a toga": 'Toga.',
+			"a tube top and thong": 'Tube top, thong.',
+			"a tube top": 'Nice tube top.',
+			"an apron": 'Apron.',
+			"an oversized t-shirt and boys": 'Over-sized t-shirt, boy s.',
+			"an oversized t-shirt": 'Nice over-sized t-shirt.',
+			"attractive lingerie for a pregnant woman": 'Preggo lingerie.',
+			"attractive lingerie": 'Nice lingerie.',
+			"battlearmor": 'Battlearmor.',
+			"battledress": 'Battledress.',
+			"body oil": 'Body oil.',
+			"boys": 'Boy s.',
+			"chains": 'Chains.',
+			"clubslut netting": 'Netting.',
+			"conservative clothing": 'Conservative clothing.',
+			"cutoffs and a t-shirt": 'Cutoffs, t-shirt.',
+			"cutoffs": 'Jean s.',
+			"harem gauze": 'Harem outfit.',
+			"jeans": 'Tight blue jeans.',
+			"kitty lingerie": 'Kitty lingerie.',
+			"leather pants and a tube top": 'Leather pants, tube top.',
+			"leather pants and pasties": 'Leather pants, pasties.',
+			"leather pants": 'Nice leather pants.',
+			"lederhosen": 'Lederhosen.',
+			"nice business attire": 'Nice suit.',
+			"overalls": 'Overalls.',
+			"panties and pasties": 'Pasties, panties.',
+			"panties": 'Nice panties.',
+			"pasties": 'Pasties.',
+			"restrictive latex": 'Bondage latex.',
+			"shibari ropes": 'Shibari.',
+			"slutty business attire": 'Slutty suit.',
+			"slutty jewelry": 'Bangles.',
+			"spats and a tank top": 'Spats, tank top.',
+			"sport s and a sports bra": 'Shorts, bra.',
+			"sport s and a t-shirt": 'Nice sport s, shirt.',
+			"sport s": 'Shorts.',
+			"stretch pants and a crop-top": 'Stretch pants, crop-top.',
+			"striped panties": 'Striped panties.',
+			"striped underwear": 'Striped underwear',
+			"uncomfortable straps": 'Leather straps.',
+
+		},
+		accessory: {
+			collar: {
+				"ancient Egyptian": 'Wesekh.',
+				"ball gag": 'Ball gag.',
+				"bell collar": 'Bell collar.',
+				"bit gag": 'Bit gag.',
+				"bowtie": 'Bowtie collar.',
+				"cruel retirement counter": 'Cruel counter collar.',
+				"dildo gag": 'Dildo gag.',
+				"heavy gold": 'Gold collar.',
+				"leather with cowbell": 'Cowbell collar.',
+				"massive dildo gag": 'Throat-bulging dildo gag.',
+				"neck corset": 'Neck corset.',
+				"nice retirement counter": 'Nice counter collar.',
+				"porcelain mask": 'Porcelain mask.',
+				"preg biometrics": 'Pregnancy biometrics collar.',
+				"pretty jewelry": 'Pretty collar.',
+				"satin choker": 'Satin choker.',
+				"shock punishment": 'Shock collar.',
+				"silk ribbon": 'Silken ribbon.',
+				"stylish leather": 'Stylish leather collar.',
+				"tight steel": 'Steel collar.',
+				"uncomfortable leather": 'Leather collar.',
+			},
+			belly: {
+				"a corset": 'Corset.',
+				"a huge empathy belly": 'Huge fake belly.',
+				"a large empathy belly": 'Large fake belly.',
+				"a medium empathy belly": 'Medium fake belly.',
+				"a small empathy belly": 'Small fake belly.',
+				"a support band": 'Support band.',
+				"an extreme corset": 'Extreme corsetage.',
+				"shapewear": 'Shapewear.',
+			},
+			vaginal: {
+				"bullet vibrator": "Attached bullet vibrator.",
+				"smart bullet vibrator": "Attached smart bullet vibrator.",
+				"dildo": "Vaginal dildo.",
+				"large dildo": "Large vaginal dildo.",
+				"huge dildo": "Huge vaginal dildo.",
+				"long dildo": "Long vaginal dildo.",
+				"long, large dildo": "Long and large vaginal dildo.",
+				"long, huge dildo": "Long and wide vaginal dildo.",
+			}
+		},
+		short: {
+
+		},
+	}
+}
diff --git a/src/002-config/fc-version.js b/src/002-config/fc-version.js
index 9be650848c218e931834205c1b94a8380a525fb8..dda732eac5bddf28028fe2ede56ffabe69dd2a0a 100644
--- a/src/002-config/fc-version.js
+++ b/src/002-config/fc-version.js
@@ -1,7 +1,7 @@
 App.Version = {
 	base: "0.10.7.1", // The vanilla version the mod is based off of, this should never be changed.
 	pmod: "3.4.0",
-	release: 1065,
+	release: 1066,
 };
 
 /* Use release as save version */
diff --git a/src/data/backwardsCompatibility/backwardsCompatibility.js b/src/data/backwardsCompatibility/backwardsCompatibility.js
index 930e64d4bce2e80a5c1e00c310d766475e390af3..6d870b3f7e9c33321f3528ee3f531fb460ba69d9 100644
--- a/src/data/backwardsCompatibility/backwardsCompatibility.js
+++ b/src/data/backwardsCompatibility/backwardsCompatibility.js
@@ -199,6 +199,13 @@ App.Update.globalVariables = function(node) {
 		if (V.sortSlavesBy === "income" || V.sortSlavesBy === "lastWeeksCashIncome") {
 			V.sortSlavesBy = "weeklyIncome";
 		}
+
+		if (typeof V.abbreviateClothes === "number") {
+			for (const key of ["clothes", "devotion", "diet", "drugs", "genitalia", "health", "hormoneBalance",
+				"mental", "nationality", "origins", "physicals", "race", "rules", "rulesets", "skills"]) {
+				V.UI.slaveSummary.abbreviation[key] = V["abbreviate" + capFirstChar(key)];
+			}
+		}
 	}
 
 	if (typeof V.taitorWeeks !== "undefined") {
diff --git a/src/debugging/debugJS.js b/src/debugging/debugJS.js
index d2c4dabc29c39f9086ba2f7c25c9ad1f57d7eda9..92f29adeb43750a93d37d3053a083816f3b243e3 100644
--- a/src/debugging/debugJS.js
+++ b/src/debugging/debugJS.js
@@ -121,6 +121,6 @@ App.Debug.dumpGameState = function() {
 
 App.Debug.slaveSummaryText = function(idx) {
 	let span = document.createElement("span");
-	span.appendChild(SlaveSummary(State.variables.slaves[idx]));
+	span.appendChild(App.UI.SlaveSummary.render(State.variables.slaves[idx]));
 	return span.outerHTML;
 };
diff --git a/src/events/intro/introSummary.tw b/src/events/intro/introSummary.tw
index f4663b62525eb58ea43159b44ba9be197235dae6..25f164f96dbd605afa5e7a460a21a47cf22a77d6 100644
--- a/src/events/intro/introSummary.tw
+++ b/src/events/intro/introSummary.tw
@@ -78,7 +78,7 @@ You may review your settings before clicking "Continue" to begin.<br>
 <<if ($economy != 100) || ($seeDicks != 25) || ($continent != "North America") || ($internationalTrade != 1) || ($internationalVariety != 1) || ($seeRace != 1) || ($seeNationality != 1) || ($seeExtreme != 0) || ($seeCircumcision != 1) || ($seeAge != 1) || ($plot != 1)>>
 	| [[restore defaults|Intro Summary][$seeDicks = 25, $economy = 100, $continent = "North America", $internationalTrade = 1, $internationalVariety = 1, $seeRace = 1, $seeNationality = 1, $seeExtreme = 0, $seeCircumcision = 1, $seeAge = 1, $plot = 1]]
 <</if>>
-	| [[Cheat Start|init Nationalities][cashX(1000000, "cheating"), $PC.rules.living = "luxurious",repX(20000, "cheating"), $dojo += 1, $cheatMode = 1, $seeDesk = 0, $seeFCNN = 0, $sortSlavesBy = "devotion", $sortSlavesOrder = "descending", $sortSlavesMain = 0, $rulesAssistantMain = 1, $abbreviateDevotion = 1, $abbreviateRules = 1, $abbreviateClothes = 2, $abbreviateHealth = 1, $abbreviateDiet = 1, $abbreviateDrugs = 1, $abbreviateRace = 1, $abbreviateNationality = 1, $abbreviateGenitalia = 1, $abbreviatePhysicals = 1, $abbreviateSkills = 1, $abbreviateMental = 2, $PC.skill.trading = 100, $PC.skill.warfare = 100, $PC.skill.slaving = 100, $PC.skill.engineering = 100, $PC.skill.medicine = 100, $PC.skill.hacking = 100, resetEyeColor($PC)]] //Intended for debugging: may have unexpected effects//
+	| [[Cheat Start|init Nationalities][cashX(1000000, "cheating"), $PC.rules.living = "luxurious",repX(20000, "cheating"), $dojo += 1, $cheatMode = 1, $seeDesk = 0, $seeFCNN = 0, $sortSlavesBy = "devotion", $sortSlavesOrder = "descending", $sortSlavesMain = 0, $rulesAssistantMain = 1, $UI.slaveSummary.abbreviation = {devotion: 1, rules: 1, clothes: 2, health: 1, diet: 1, drugs: 1, race: 1, nationality: 1, genitalia: 1, physicals: 1, skills: 1, mental: 2}, $PC.skill.trading = 100, $PC.skill.warfare = 100, $PC.skill.slaving = 100, $PC.skill.engineering = 100, $PC.skill.medicine = 100, $PC.skill.hacking = 100, resetEyeColor($PC)]] //Intended for debugging: may have unexpected effects//
 
 <<set $minimumSlaveAge = variableAsNumber($minimumSlaveAge, 3, 18, 18)>>
 <<set $retirementAge = variableAsNumber($retirementAge, 25, 120, 45)>>
@@ -1362,4 +1362,4 @@ You may review your settings before clicking "Continue" to begin.<br>
 	<</if>>
 
 	</div>
-</div>
\ No newline at end of file
+</div>
diff --git a/src/js/slaveListing.js b/src/js/slaveListing.js
index cc59d9a7aa1cc816a4f8890d42fe1b199dad2b90..86eb4a8010566738bd4aaf05a2b61444c40da656 100644
--- a/src/js/slaveListing.js
+++ b/src/js/slaveListing.js
@@ -328,7 +328,7 @@ App.UI.SlaveList.render = function() {
 			res.appendChild(App.UI.jobLinks.transfersFragment(index, (slave, assignment) => { App.UI.SlaveList.ScrollPosition.record(); assignJob(slave, assignment); }));
 		}
 
-		res.appendChild(SlaveSummary(slave));
+		res.appendChild(App.UI.SlaveSummary.render(slave));
 
 		if (postNote !== undefined) {
 			const pn = postNote(slave, index);
diff --git a/src/js/slaveSummaryHelpers.js b/src/js/slaveSummaryHelpers.js
new file mode 100644
index 0000000000000000000000000000000000000000..d08727fb01178530d3f19ba90f17ac58a66d9de7
--- /dev/null
+++ b/src/js/slaveSummaryHelpers.js
@@ -0,0 +1,2636 @@
+// WARNING This file defines objects referenced in slaveSummaryWidgets.js.
+// Either keep this file above the slaveSummaryWidgets.js in the name ordered list
+// (tweego process them in this order), or rework the references.
+
+/* eslint-disable camelcase */
+
+App.UI.SlaveSummaryImpl = function() {
+	const helpers = function() {
+		/**
+		 * @param {HTMLElement} element
+		 * @param {string|string[]} [classNames]
+		 */
+		function _addClassNames(element, classNames) {
+			if (classNames != undefined) { /* eslint-disable-line eqeqeq */
+				if (Array.isArray(classNames)) {
+					element.classList.add(...classNames);
+				} else {
+					element.classList.add(classNames);
+				}
+			}
+		}
+
+		/**
+		 * @param {Node} container
+		 * @param {string} text
+		 * @param {string|string[]} [classNames]
+		 * @param {boolean} [stdDecor=false]
+		 * @param {number} [value]
+		 */
+		function makeSpan(container, text, classNames, stdDecor = false, value) {
+			let r = document.createElement("span");
+			r.classList.add("ssi");
+			_addClassNames(r, classNames);
+			if (value != undefined && V.summaryStats) { /* eslint-disable-line eqeqeq */
+				text += `[${value}]`;
+			}
+			r.textContent = stdDecor ? `${capFirstChar(text)}.` : text;
+			if (container) {
+				container.appendChild(r);
+			}
+			return r;
+		}
+
+		/**
+		 * @param {Node} container
+		 * @param {string} text
+		 * @returns {Text}
+		 */
+		function addText(container, text) {
+			const r = document.createTextNode(text);
+			if (container) {
+				container.appendChild(r);
+			}
+			return r;
+		}
+
+		/**
+		 * @param {Node} [container]
+		 * @param {string|string[]} [classNames]
+		 */
+		function makeBlock(container, classNames) {
+			let r = document.createElement("span");
+			r.classList.add("ssb");
+			_addClassNames(r, classNames);
+			if (container) {
+				container.appendChild(r);
+			}
+			return r;
+		}
+
+		/**
+		 * @param {Node} container
+		 * @param {string|string[]} [classNames]
+		 * @returns {HTMLParagraphElement}
+		 */
+		function makeParagraph(container, classNames) {
+			let r = document.createElement("p");
+			r.classList.add("si");
+			_addClassNames(r, classNames);
+			if (container) {
+				container.appendChild(r);
+			}
+			return r;
+		}
+
+		/**
+		 * @param {object} dict
+		 * @param {*} value
+		 * @param {*} [defaultValue]
+		 * @returns {*|null}
+		 */
+		function getExactRating(dict, value, defaultValue = null) {
+			const res = dict[value];
+			return res ? res : defaultValue;
+		}
+
+		/**
+		 * @param {object} ratings
+		 * @param {number} value
+		 * @returns {*|null}
+		 */
+		function getNumericRating(ratings, value) {
+			let p;
+			for (p in ratings) {
+				// @ts-ignore
+				if (p >= value) {
+					return ratings[p];
+				}
+			}
+			return ratings[p];
+		}
+
+		return {
+			addText: addText,
+			makeSpan: makeSpan,
+			makeBlock: makeBlock,
+			makeParagraph: makeParagraph,
+			getExactRating: getExactRating,
+			getNumericRating: getNumericRating
+		};
+	}();
+
+	const bits = function() {
+		const addText = helpers.addText;
+		const makeSpan = helpers.makeSpan;
+		const makeBlock = helpers.makeBlock;
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function short_health(slave, c) {
+			if (slave.health.health < -20) {
+				makeSpan(c, "H", ["red", "strong"], true, slave.health.health);
+			} else if (slave.health.health <= 20) {
+				makeSpan(c, "H", ["yellow", "strong"], true, slave.health.health);
+			} else if (slave.health.health > 20) {
+				makeSpan(c, "H", ["green", "strong"], true, slave.health.health);
+			}
+			if (passage() === "Clinic" && V.clinicUpgradeScanner) {
+				if (slave.chem > 15) {
+					makeSpan(c, `C${Math.ceil(slave.chem / 10)}`, ["cyan", "strong"]);
+				} else if (slave.chem <= 15 && slave.assignment === "get treatment in the clinic") {
+					makeSpan(c, `CSafe`, ["green", "strong"]);
+				}
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function short_illness(slave, c) {
+			if (slave.health.illness > 4) {
+				makeSpan(c, `Ill${slave.health.illness}`, ["red", "strong"], true, slave.health.illness);
+			} else if (slave.health.illness > 3) {
+				makeSpan(c, `Ill${slave.health.illness}`, ["red", "strong"], true, slave.health.illness);
+			} else if (slave.health.illness > 2) {
+				makeSpan(c, `Ill${slave.health.illness}`, ["red", "strong"], true, slave.health.illness);
+			} else if (slave.health.illness > 0) {
+				makeSpan(c, `Ill${slave.health.illness}`, ["yellow", "strong"], true, slave.health.illness);
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function short_tired(slave, c) {
+			if (slave.health.tired > 90) {
+				makeSpan(c, "Exh", ["red", "strong"], true, slave.health.tired);
+			} else if (slave.health.tired > 60) {
+				makeSpan(c, "Tir+", "orange", true, slave.health.tired);
+			} else if (slave.health.tired > 30) {
+				makeSpan(c, "Tir", "yellow", true, slave.health.tired);
+			} else if (slave.health.tired < 0) {
+				makeSpan(c, "Ene", "green", true, slave.health.tired);
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function long_health(slave, c) {
+			if (slave.health.health < -90) {
+				makeSpan(c, "On the edge of death", ["red", "strong"], true, slave.health.health);
+			} else if (slave.health.health < -50) {
+				makeSpan(c, "Extremely unhealthy", ["red", "strong"], true, slave.health.health);
+			} else if (slave.health.health < -20) {
+				makeSpan(c, "Unhealthy", ["red", "strong"], true, slave.health.health);
+			} else if (slave.health.health <= 20) {
+				makeSpan(c, "healthy", "yellow", true, slave.health.health);
+			} else if (slave.health.health <= 50) {
+				makeSpan(c, "Very healthy", "green", true, slave.health.health);
+			} else if (slave.health.health <= 90) {
+				makeSpan(c, "Extremely healthy", "green", true, slave.health.health);
+			} else {
+				makeSpan(c, "Unnaturally healthy", "green", true, slave.health.health);
+			}
+			if (passage() === "Clinic" && V.clinicUpgradeScanner) {
+				if (slave.chem > 15) {
+					makeSpan(c, `Carcinogen buildup: ${Math.ceil(slave.chem / 10)}.`, "cyan");
+				} else if (slave.chem <= 15 && slave.assignment === "get treatment in the clinic") {
+					makeSpan(c, `Safe chem levels.`, "green");
+				}
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function long_illness(slave, c) {
+			if (slave.health.illness > 4) {
+				makeSpan(c, "Terribly ill", ["red", "strong"], true, slave.health.illness);
+			} else if (slave.health.illness > 3) {
+				makeSpan(c, "Very ill", ["red", "strong"], true, slave.health.illness);
+			} else if (slave.health.illness > 2) {
+				makeSpan(c, "Ill", ["red", "strong"], true, slave.health.illness);
+			} else if (slave.health.illness > 0) {
+				makeSpan(c, "Sick", "yellow", true, slave.health.illness);
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function long_tired(slave, c) {
+			if (slave.health.tired > 90) {
+				makeSpan(c, "Exhausted", ["red", "strong"], true, slave.health.tired);
+			} else if (slave.health.tired > 60) {
+				makeSpan(c, "Fatigued", "orange", true, slave.health.tired);
+			} else if (slave.health.tired > 30) {
+				makeSpan(c, "Tired", "yellow", true, slave.health.tired);
+			} else if (slave.health.tired < 0) {
+				makeSpan(c, "Energetic", "green", true, slave.health.tired);
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function long_age(slave, c) {
+			let r = makeSpan(c, "", "pink");
+			if (V.showAgeDetail === 1) {
+				r.textContent += `Age ` + `${slave.actualAge}` + `.`;
+			} else if (slave.actualAge >= 40) {
+				r.textContent += `Forties.`;
+			} else if (slave.actualAge >= 35) {
+				r.textContent += `Late thirties.`;
+			} else if (slave.actualAge >= 30) {
+				r.textContent += `Early thirties.`;
+			} else if (slave.actualAge >= 25) {
+				r.textContent += `Late twenties.`;
+			} else if (slave.actualAge >= 20) {
+				r.textContent += `Early twenties.`;
+			} else if (slave.actualAge >= 19) {
+				r.textContent += `Nineteen.`;
+			} else if (slave.actualAge >= 18) {
+				r.textContent += `Eighteen.`;
+			} else {
+				r.textContent += `Underage.`;
+			}
+			/*
+			 ** No NCS, then do the standard, However because of the wrinkles of Incubators, as long as visual age is greater
+			 ** than or equal to physical age, we do the old physical body/Looks for fresh out of the can NCS slaves.
+			 */
+			if (((slave.geneMods.NCS === 0) || (slave.visualAge >= slave.physicalAge))) {
+				if (slave.actualAge !== slave.physicalAge) {
+					r.textContent += ` ${slave.physicalAge}` + ` year old body.`;
+				}
+				if (slave.visualAge !== slave.physicalAge) {
+					r.textContent += ` Looks ` + `${slave.visualAge}` + `.`;
+				}
+			} else {
+				/*
+				 ** Now the rub. The use of physical Age for the year old body above, basically conflicts with the changes
+				 ** that NCS introduces, so here to *distinguish* the changes, we use visual age with the 'year old body'
+				 ** and appears, for example: Slave release from incubator at age 10, Her summary would show, 'Age 0. 10
+				 ** year old body.' But if she's given NCS a few weeks after release, while she's still before her first
+				 ** birthday, it'll appear the same. But once her birthday fires, if we ran with the above code it would
+				 ** say: 'Age 1. 11 year old body.' -- this conflicts with the way NCS works though, because she hasn't
+				 ** visually aged, so our change here makes it say 'Age 1. Appears to have a 10 year old body.'
+				 */
+				r.textContent += ` Appears to have a ` + `${slave.visualAge}` + ` year old body.`;
+			}
+			if (slave.geneMods.NCS === 1) {
+				makeSpan(r, "NCS", "orange");
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function long_face(slave, c) {
+			if (slave.face < -95) {
+				makeSpan(c, `Very ugly ${slave.faceShape} face`, "red", true, slave.face);
+			} else if (slave.face < -40) {
+				makeSpan(c, `Ugly ${slave.faceShape} face`, "red", true, slave.face);
+			} else if (slave.face < -10) {
+				makeSpan(c, `Unattractive ${slave.faceShape} face`, "red", true, slave.face);
+			} else if (slave.face <= 10) {
+				makeSpan(c, `Average ${slave.faceShape} face`, null, true, slave.face);
+			} else if (slave.face <= 40) {
+				makeSpan(c, `Attractive ${slave.faceShape} face`, "pink", true, slave.face);
+			} else if (slave.face <= 95) {
+				makeSpan(c, `Beautiful ${slave.faceShape} face`, "pink", true, slave.face);
+			} else {
+				makeSpan(c, `Very beautiful ${slave.faceShape} face`, "pink", true, slave.face);
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function long_eyes(slave, c) {
+			if (!canSee(slave)) {
+				makeSpan(c, "Blind.", "red");
+			} else if (!canSeePerfectly(slave)) {
+				makeSpan(c, "Nearsighted.", "yellow");
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function long_ears(slave, c) {
+			if (slave.hears <= -2) {
+				makeSpan(c, "Deaf.", "red");
+			} else if ((slave.hears === -1) && (slave.earwear !== "hearing aids")) {
+				makeSpan(c, "Hard of hearing.", "yellow");
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function long_lips(slave, c) {
+			if (slave.lips > 95) {
+				makeSpan(c, "Facepussy", undefined, true, slave.lips);
+			} else if (slave.lips > 70) {
+				makeSpan(c, "Huge lips", undefined, true, slave.lips);
+			} else if (slave.lips > 40) {
+				makeSpan(c, "Big lips", undefined, true, slave.lips);
+			} else if (slave.lips > 20) {
+				makeSpan(c, "Pretty lips", undefined, true, slave.lips);
+			} else if (slave.lips > 10) {
+				makeSpan(c, "Normal lips", undefined, true, slave.lips);
+			} else {
+				makeSpan(c, "Thin lips", "red", true, slave.lips);
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function long_teeth(slave, c) {
+			if (slave.teeth === "crooked") {
+				makeSpan(c, "Crooked teeth.", "yellow");
+			} else if (slave.teeth === "gapped") {
+				makeSpan(c, "Tooth gap.", "yellow");
+			} else if (slave.teeth === "cosmetic braces") {
+				makeSpan(c, "Cosmetic braces.");
+			} else if (slave.teeth === "straightening braces") {
+				makeSpan(c, "Braces.");
+			} else if (slave.teeth === "removable") {
+				makeSpan(c, "Removable teeth.");
+			} else if (slave.teeth === "pointy") {
+				makeSpan(c, "Sharp fangs.");
+			} else if (slave.teeth === "baby") {
+				makeSpan(c, "Baby teeth.");
+			} else if (slave.teeth === "mixed") {
+				makeSpan(c, "Mixed teeth.");
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function long_muscles(slave, c) {
+			if (slave.muscles > 95) {
+				makeSpan(c, "Hugely muscular", undefined, true, slave.muscles);
+			} else if (slave.muscles > 50) {
+				makeSpan(c, "Muscular", undefined, true, slave.muscles);
+			} else if (slave.muscles > 30) {
+				makeSpan(c, "Fit", undefined, true, slave.muscles);
+			} else if (slave.muscles > 5) {
+				makeSpan(c, "Toned", undefined, true, slave.muscles);
+			} else if (slave.muscles > -6) {
+				makeSpan(c, "Soft", undefined, true, slave.muscles);
+			} else if (slave.muscles > -31) {
+				if (V.arcologies[0].FSPhysicalIdealist === "unset") {
+					makeSpan(c, "Weak", "red", true, slave.muscles);
+				} else {
+					makeSpan(c, "Weak", undefined, true, slave.muscles);
+				}
+			} else if (slave.muscles > -96) {
+				if (V.arcologies[0].FSPhysicalIdealist === "unset") {
+					makeSpan(c, "Very weak", "red", true, slave.muscles);
+				} else {
+					makeSpan(c, "Very weak", undefined, true, slave.muscles);
+				}
+			} else {
+				makeSpan(c, "Frail", "red", true, slave.muscles);
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function long_voice(slave, c) {
+			if (slave.voice === 0) {
+				makeSpan(c, "Mute.", "red");
+			} else {
+				if (slave.accent === 3) {
+					makeSpan(c, "Bad accent.", "red");
+				} else if (slave.accent === 4) {
+					makeSpan(c, "No language skills.", "red");
+				} else if (slave.accent === 2) {
+					makeSpan(c, "Accent.");
+				} else if (slave.accent === 1) {
+					makeSpan(c, "Cute accent.", "pink");
+				}
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function long_tits_ass(slave, c) {
+			const styles = "pink";
+			if ((slave.boobs >= 12000) && (slave.butt > 9)) {
+				makeSpan(c, "Hyper T&A.", styles);
+			} else if ((slave.boobs > 4000) && (slave.butt > 8)) {
+				makeSpan(c, "Enormous T&A.", styles);
+			} else if ((slave.boobs > 2000) && (slave.butt > 6)) {
+				makeSpan(c, "Huge T&A.", styles);
+			} else if ((slave.boobs > 800) && (slave.butt > 4)) {
+				makeSpan(c, "Big T&A.", styles);
+			} else if ((slave.boobs < 500) && (slave.butt < 3) && (slave.weight <= 10) && (slave.muscles <= 30)) {
+				makeSpan(c, "Girlish figure.", styles);
+			} else if (slave.boobs >= 12000) {
+				makeSpan(c, "Immobilizing tits.", styles);
+			} else if (slave.boobs > 4000) {
+				makeSpan(c, "Monstrous tits.", styles);
+			} else if (slave.boobs > 2000) {
+				makeSpan(c, "Huge tits.", styles);
+			} else if (slave.boobs > 800) {
+				makeSpan(c, "Big tits.", styles);
+			} else if (slave.butt > 9) {
+				makeSpan(c, "Hyper ass.", styles);
+			} else if (slave.butt > 8) {
+				makeSpan(c, "Titanic ass.", styles);
+			} else if (slave.butt > 6) {
+				makeSpan(c, "Huge ass.", styles);
+			} else if (slave.butt > 4) {
+				makeSpan(c, "Big ass.", styles);
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function long_hips(slave, c) {
+			const styles = "red";
+			if (slave.hips < -1) {
+				if (slave.butt > 2 && (V.arcologies[0].FSTransformationFetishist < 20 || V.arcologies[0].FSTransformationFetishist === "unset") && (V.arcologies[0].FSHedonisticDecadence < 20 || V.arcologies[0].FSHedonisticDecadence === "unset") && (V.arcologies[0].FSAssetExpansionist < 20 || V.arcologies[0].FSAssetExpansionist === "unset") && (V.arcologies[0].FSIntellectualDependencyLawBeauty === 0)) {
+					makeSpan(c, "Disproportionately big butt.", styles);
+				}
+			} else if (slave.hips < 0) {
+				if (slave.butt > 4 && (V.arcologies[0].FSTransformationFetishist < 20 || V.arcologies[0].FSTransformationFetishist === "unset") && (V.arcologies[0].FSHedonisticDecadence < 20 || V.arcologies[0].FSHedonisticDecadence === "unset") && (V.arcologies[0].FSAssetExpansionist < 20 || V.arcologies[0].FSAssetExpansionist === "unset") && (V.arcologies[0].FSIntellectualDependencyLawBeauty === 0)) {
+					makeSpan(c, "Disproportionately big butt.", styles);
+				}
+			} else if (slave.hips > 2) {
+				if (slave.butt <= 8) {
+					makeSpan(c, "Disproportionately small butt.", styles);
+				}
+			} else if (slave.hips > 1) {
+				if (slave.butt <= 3 && ((V.arcologies[0].FSSlimnessEnthusiast === "unset") || (slave.boobs >= 500))) {
+					makeSpan(c, "Disproportionately small butt.", styles);
+				}
+			} else if (slave.hips > 0) {
+				if (slave.butt > 8) {
+					if ((V.arcologies[0].FSTransformationFetishist < 20 || V.arcologies[0].FSTransformationFetishist === "unset") && (V.arcologies[0].FSHedonisticDecadence < 20 || V.arcologies[0].FSHedonisticDecadence === "unset") && (V.arcologies[0].FSAssetExpansionist < 20 || V.arcologies[0].FSAssetExpansionist === "unset") && (V.arcologies[0].FSIntellectualDependencyLawBeauty === 0)) {
+						makeSpan(c, "Disproportionately big butt.", styles);
+					}
+				} else if (slave.butt <= 2 && ((V.arcologies[0].FSSlimnessEnthusiast === "unset") || (slave.boobs >= 500))) {
+					makeSpan(c, "Disproportionately small butt.", styles);
+				}
+			} else {
+				if (slave.butt > 6) {
+					if ((V.arcologies[0].FSTransformationFetishist < 20 || V.arcologies[0].FSTransformationFetishist === "unset") && (V.arcologies[0].FSHedonisticDecadence < 20 || V.arcologies[0].FSHedonisticDecadence === "unset") && (V.arcologies[0].FSAssetExpansionist < 20 || V.arcologies[0].FSAssetExpansionist === "unset") && (V.arcologies[0].FSIntellectualDependencyLawBeauty === 0)) {
+						makeSpan(c, "Disproportionately big butt.", styles);
+					}
+				} else if (slave.butt <= 1 && ((V.arcologies[0].FSSlimnessEnthusiast === "unset") || (slave.boobs >= 500))) {
+					makeSpan(c, "Disproportionately small butt.", styles);
+				}
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function long_waist(slave, c) {
+			if (slave.waist > 95) {
+				makeSpan(c, "Masculine waist", "red", true, slave.waist);
+			} else if (slave.waist > 40) {
+				makeSpan(c, "Ugly waist", "red", true, slave.waist);
+			} else if (slave.waist > 10) {
+				makeSpan(c, "Unattractive waist", "red", true, slave.waist);
+			} else if (slave.waist >= -10) {
+				makeSpan(c, "Average waist", null, true, slave.waist);
+			} else if (slave.waist >= -40) {
+				makeSpan(c, "Feminine waist", "pink", true, slave.waist);
+			} else if (slave.waist >= -95) {
+				makeSpan(c, "Hourglass waist", "pink", true, slave.waist);
+			} else {
+				makeSpan(c, "Absurdly narrow waist", "pink", true, slave.waist);
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function long_implants(slave, c) {
+			const styles = "pink";
+			if ((slave.boobsImplant !== 0) || (slave.buttImplant !== 0) || (slave.lipsImplant !== 0) || (slave.bellyImplant !== -1)) {
+				makeSpan(c, "Implants.", styles);
+			} else if ((slave.faceImplant >= 30) || (slave.waist < -95)) {
+				makeSpan(c, "Surgery enhanced.", styles);
+			} else {
+				makeSpan(c, "All natural.", styles);
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function long_lactation(slave, c) {
+			if (slave.lactation === 1) {
+				makeSpan(c, "Lactating naturally.", "pink");
+			} else if (slave.lactation === 2) {
+				makeSpan(c, "Heavy lactation.", "pink");
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function long_mods(slave, c) {
+			V.modScore = SlaveStatsChecker.modScore(slave);
+			if (slave.corsetPiercing === 0 && V.piercingScore < 3 && V.tatScore < 2) {
+				return;
+			} else if (V.modScore > 15 || (V.piercingScore > 8 && V.tatScore > 5)) {
+				makeSpan(c, "Extensive body mods.");
+			} else if (V.modScore > 7) {
+				makeSpan(c, "Noticeable body mods.");
+			} else {
+				makeSpan(c, "Light body mods.");
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function short_age(slave, c) {
+			let r = makeSpan(c, "", "pink");
+			if (V.showAgeDetail === 1) {
+				r.textContent += slave.actualAge.toString();
+			} else if (slave.actualAge >= 40) {
+				r.textContent += "40s";
+			} else if (slave.actualAge >= 35) {
+				r.textContent += "Lt30s";
+			} else if (slave.actualAge >= 30) {
+				r.textContent += "Ea30s";
+			} else if (slave.actualAge >= 25) {
+				r.textContent += "Lt20s";
+			} else if (slave.actualAge >= 20) {
+				r.textContent += "Ea20s";
+			} else if (slave.actualAge >= 18) {
+				r.textContent += slave.actualAge.toString();
+			}
+			if (slave.actualAge !== slave.physicalAge) {
+				r.textContent += ` w ${slave.physicalAge}y-bdy`;
+			}
+			if (slave.visualAge !== slave.physicalAge) {
+				r.textContent += ` Lks${slave.visualAge}`;
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function short_face(slave, c) {
+			if (slave.face < -95) {
+				makeSpan(c, "Face---", "red", true, slave.face);
+			} else if (slave.face < -40) {
+				makeSpan(c, "Face--", "red", true, slave.face);
+			} else if (slave.face < -10) {
+				makeSpan(c, "Face-", "red", true, slave.face);
+			} else if (slave.face <= 10) {
+				makeSpan(c, "Face", null, true, slave.face);
+			} else if (slave.face <= 40) {
+				makeSpan(c, "Face+", "pink", true, slave.face);
+			} else if (slave.face <= 95) {
+				makeSpan(c, "Face++", "pink", true, slave.face);
+			} else {
+				makeSpan(c, "Face+++", "pink", true, slave.face);
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function short_eyes(slave, c) {
+			if (!canSee(slave)) {
+				makeSpan(c, "Blind", "red");
+			} else if (!canSeePerfectly(slave)) {
+				makeSpan(c, "Sight-", "yellow");
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function short_ears(slave, c) {
+			if (slave.hears === -2) {
+				makeSpan(c, "Deaf", "red");
+			} else if ((slave.hears === -1) && (slave.earwear !== "hearing aids")) {
+				makeSpan(c, "Hearing-", "yellow");
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function short_lips(slave, c) {
+			if (slave.lips > 95) {
+				makeSpan(c, "Facepussy");
+			} else if (slave.lips > 70) {
+				makeSpan(c, "Lips+++", null, true, slave.lips);
+			} else if (slave.lips > 40) {
+				makeSpan(c, "Lips++", null, true, slave.lips);
+			} else if (slave.lips > 20) {
+				makeSpan(c, "Lips+", null, true, slave.lips);
+			} else if (slave.lips > 10) {
+				makeSpan(c, "Lips", null, true, slave.lips);
+			} else {
+				makeSpan(c, "Lips-", "red", true, slave.lips);
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function short_teeth(slave, c) {
+			if (slave.teeth === "crooked") {
+				makeSpan(c, "Cr Teeth", "yellow");
+			} else if (slave.teeth === "gapped") {
+				makeSpan(c, "Gap", "yellow");
+			} else if (slave.teeth === "cosmetic braces") {
+				makeSpan(c, `Cos Braces`);
+			} else if (slave.teeth === "straightening braces") {
+				makeSpan(c, `Braces`);
+			} else if (slave.teeth === "removable") {
+				makeSpan(c, `Rem Teeth`);
+			} else if (slave.teeth === "pointy") {
+				makeSpan(c, `Fangs`);
+			} else if (slave.teeth === "baby") {
+				makeSpan(c, `Baby`);
+			} else if (slave.teeth === "mixed") {
+				makeSpan(c, `Mixed`);
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function short_muscles(slave, c) {
+			if (slave.muscles > 95) {
+				makeSpan(c, "Musc++", undefined, true, slave.muscles);
+			} else if (slave.muscles > 50) {
+				makeSpan(c, "Musc+", undefined, true, slave.muscles);
+			} else if (slave.muscles > 30) {
+				makeSpan(c, "Fit", undefined, true, slave.muscles);
+			} else if (slave.muscles > 5) {
+				makeSpan(c, "Toned", undefined, true, slave.muscles);
+			} else if (slave.muscles > -6) {
+				makeSpan(c, "Soft", undefined, true, slave.muscles);
+			} else if (slave.muscles > -31) {
+				if (V.arcologies[0].FSPhysicalIdealist === "unset") {
+					makeSpan(c, "Weak", "red", true, slave.muscles);
+				} else {
+					makeSpan(c, "Soft", undefined, true, slave.muscles);
+				}
+			} else if (slave.muscles > -96) {
+				if (V.arcologies[0].FSPhysicalIdealist === "unset") {
+					makeSpan(c, "Weak+", "red", true, slave.muscles);
+				} else {
+					makeSpan(c, "Soft+", undefined, true, slave.muscles);
+				}
+			} else {
+				makeSpan(c, "Weak++", "red", true, slave.muscles);
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function short_voice(slave, c) {
+			if (slave.voice === 0) {
+				makeSpan(c, "Mute", "red");
+			} else {
+				if (slave.accent === 3) {
+					makeSpan(c, "Acc--", "red");
+				} else if (slave.accent === 2) {
+					makeSpan(c, "Acc-");
+				} else if (slave.accent === 4) {
+					makeSpan(c, "Acc--");
+				} else if (slave.accent === 1) {
+					makeSpan(c, "Acc", "pink");
+				}
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function short_tits_ass(slave, c) {
+			let styles = "pink";
+			if ((slave.boobs >= 12000) && (slave.butt > 9)) {
+				makeSpan(c, "T&A+++", styles);
+			} else if ((slave.boobs > 4000) && (slave.butt > 8)) {
+				makeSpan(c, "T&A++", styles);
+			} else if ((slave.boobs > 2000) && (slave.butt > 6)) {
+				makeSpan(c, "T&A+", styles);
+			} else if ((slave.boobs > 800) && (slave.butt > 4)) {
+				makeSpan(c, "T&A", styles);
+			} else if ((slave.boobs < 500) && (slave.butt < 3) && (slave.weight <= 10) && (slave.muscles <= 30)) {
+				makeSpan(c, "Girlish", styles);
+			} else if (slave.boobs >= 12000) {
+				makeSpan(c, "Boobs+++", styles);
+			} else if (slave.boobs > 4000) {
+				makeSpan(c, "Boobs++", styles);
+			} else if (slave.boobs > 2000) {
+				makeSpan(c, "Boobs+", styles);
+			} else if (slave.boobs > 800) {
+				makeSpan(c, "Boobs", styles);
+			} else if (slave.butt > 9) {
+				makeSpan(c, "Ass+++", styles);
+			} else if (slave.butt > 8) {
+				makeSpan(c, "Ass++", styles);
+			} else if (slave.butt > 6) {
+				makeSpan(c, "Ass+", styles);
+			} else if (slave.butt > 4) {
+				makeSpan(c, "Ass", styles);
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function short_hips(slave, c) {
+			let desc = "";
+			if (slave.hips < -1) {
+				if (slave.butt > 2 && (V.arcologies[0].FSTransformationFetishist < 20 || V.arcologies[0].FSTransformationFetishist === "unset") && (V.arcologies[0].FSHedonisticDecadence < 20 || V.arcologies[0].FSHedonisticDecadence === "unset")) {
+					desc = `Disp+`;
+				}
+			} else if (slave.hips < 0) {
+				if (slave.butt > 4 && (V.arcologies[0].FSTransformationFetishist < 20 || V.arcologies[0].FSTransformationFetishist === "unset") && (V.arcologies[0].FSHedonisticDecadence < 20 || V.arcologies[0].FSHedonisticDecadence === "unset")) {
+					desc = `Disp+`;
+				}
+			} else if (slave.hips > 2) {
+				if (slave.butt <= 8) {
+					desc = `Disp-`;
+				}
+			} else if (slave.hips > 1) {
+				if (slave.butt <= 3 && (V.arcologies[0].FSSlimnessEnthusiast === "unset" || (slave.boobs >= 500))) {
+					desc = `Disp-`;
+				}
+			} else if (slave.hips > 0) {
+				if (slave.butt > 8) {
+					if ((V.arcologies[0].FSTransformationFetishist < 20 || V.arcologies[0].FSTransformationFetishist === "unset") && (V.arcologies[0].FSHedonisticDecadence < 20 || V.arcologies[0].FSHedonisticDecadence === "unset")) {
+						desc = `Disp+`;
+					}
+				} else if (slave.butt <= 2 && (V.arcologies[0].FSSlimnessEnthusiast === "unset" || (slave.boobs >= 500))) {
+					desc = `Disp-`;
+				}
+			} else {
+				if (slave.butt > 6) {
+					if ((V.arcologies[0].FSTransformationFetishist < 20 || V.arcologies[0].FSTransformationFetishist === "unset") && (V.arcologies[0].FSHedonisticDecadence < 20 || V.arcologies[0].FSHedonisticDecadence === "unset")) {
+						desc = `Disp+`;
+					}
+				} else if (slave.butt <= 1 && (V.arcologies[0].FSSlimnessEnthusiast === "unset" || (slave.boobs >= 500))) {
+					desc = `Disp-`;
+				}
+			}
+			if (desc) {
+				makeSpan(c, desc, "red");
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function short_waist(slave, c) {
+			if (slave.waist > 95) {
+				makeSpan(c, "Wst---", "red", false, slave.waist);
+			} else if (slave.waist > 40) {
+				makeSpan(c, "Wst--", "red", false, slave.waist);
+			} else if (slave.waist > 10) {
+				makeSpan(c, "Wst-", "red", false, slave.waist);
+			} else if (slave.waist >= -10) {
+				makeSpan(c, "Wst", undefined, false, slave.waist);
+			} else if (slave.waist >= -40) {
+				makeSpan(c, "Wst+", "pink", false, slave.waist);
+			} else if (slave.waist >= -95) {
+				makeSpan(c, "Wst++", "pink", false, slave.waist);
+			} else {
+				makeSpan(c, "Wst+++", "pink", false, slave.waist);
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function short_implants(slave, c) {
+			if ((slave.boobsImplant === 0) && (slave.buttImplant === 0) && (slave.waist >= -95) && (slave.lipsImplant === 0) && (slave.faceImplant <= 5) && (slave.bellyImplant === -1)) {
+				makeSpan(c, "Natr", "pink");
+			} else {
+				makeSpan(c, "Impl", "pink");
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function short_lactation(slave, c) {
+			if (slave.lactation === 1) {
+				makeSpan(c, "Lact", "pink");
+			} else if (slave.lactation === 2) {
+				makeSpan(c, "Lact", "pink");
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function short_mods(slave, c) {
+			V.modScore = SlaveStatsChecker.modScore(slave);
+			if (slave.corsetPiercing === 0 && V.piercingScore < 3 && V.tatScore < 2) {
+				return;
+			} else if (V.modScore > 15 || (V.piercingScore > 8 && V.tatScore > 5)) {
+				makeSpan(c, "Mods++");
+			} else if (V.modScore > 7) {
+				makeSpan(c, "Mods+");
+			} else {
+				makeSpan(c, "Mods");
+			}
+			if (!jQuery.isEmptyObject(slave.brand)) {
+				makeSpan(c, "Br");
+			}
+		}
+
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function short_intelligence(slave, c) {
+			const intelligence = slave.intelligence + slave.intelligenceImplant;
+			if (slave.fetish === "mindbroken") {
+				return;
+			}
+			let education = "";
+			let naturalIntelligence = "";
+			let styles = undefined;
+			if (slave.intelligenceImplant >= 30) {
+				education = "(e+)";
+			} else if (slave.intelligenceImplant >= 15) {
+				education = "(e)";
+			} else if (slave.intelligenceImplant <= -15) {
+				education = "(e-)";
+			}
+			if (intelligence >= 130) {
+				naturalIntelligence = "I++++";
+				styles = "deepskyblue";
+			} else if (intelligence > 95) {
+				naturalIntelligence = "I+++";
+				styles = "deepskyblue";
+			} else if (intelligence > 50) {
+				naturalIntelligence = "I++";
+				styles = "deepskyblue";
+			} else if (intelligence > 15) {
+				naturalIntelligence = "I+";
+				styles = "deepskyblue";
+			} else if (intelligence >= -15) {
+				naturalIntelligence = "I";
+			} else if (intelligence >= -50) {
+				naturalIntelligence = "I-";
+				styles = "orangered";
+			} else if (intelligence >= -95) {
+				naturalIntelligence = "I--";
+				styles = "orangered";
+			} else {
+				naturalIntelligence = "I---";
+				styles = "orangered";
+			}
+			makeSpan(c, `${naturalIntelligence}${education}`, styles, true, intelligence);
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function short_skills(slave, c) {
+			let _SSkills = slave.skill.anal + slave.skill.oral;
+			let r = makeSpan(c, "", "aquamarine");
+			if (((_SSkills + slave.skill.whoring + slave.skill.entertainment) >= 400) && ((slave.vagina < 0) || (slave.skill.vaginal >= 100))) {
+				r.textContent += `MSS`;
+			} else {
+				_SSkills += slave.skill.vaginal;
+				_SSkills = Math.trunc(_SSkills);
+				if (_SSkills > 180) {
+					r.textContent += `S++`;
+				} else if ((_SSkills > 120) && (slave.vagina < 0)) {
+					r.textContent += `Sh++`;
+				} else if (_SSkills > 90) {
+					r.textContent += `S+`;
+				} else if (_SSkills > 30) {
+					r.textContent += `S`;
+				} else {
+					r.textContent += `S-`;
+				}
+				if (V.summaryStats) {
+					r.textContent += `[${_SSkills}]`;
+				}
+				r.textContent += " ";
+				if (slave.skill.whoring >= 100) {
+					r.textContent += `W+++`;
+				} else if (slave.skill.whoring > 60) {
+					r.textContent += `W++`;
+				} else if (slave.skill.whoring > 30) {
+					r.textContent += `W+`;
+				} else if (slave.skill.whoring > 10) {
+					r.textContent += `W`;
+				}
+				if (slave.skill.whoring > 10) {
+					if (V.summaryStats) {
+						r.textContent += `[${slave.skill.whoring}]`;
+					}
+				}
+				r.textContent += " ";
+				if (slave.skill.entertainment >= 100) {
+					r.textContent += `E+++`;
+				} else if (slave.skill.entertainment > 60) {
+					r.textContent += `E++`;
+				} else if (slave.skill.entertainment > 30) {
+					r.textContent += `E+`;
+				} else if (slave.skill.entertainment > 10) {
+					r.textContent += `E`;
+				}
+				if (slave.skill.entertainment > 10) {
+					if (V.summaryStats) {
+						r.textContent += `[${slave.skill.entertainment}]`;
+					}
+				}
+			}
+			if (slave.skill.combat > 0) {
+				r.textContent += " C";
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function short_prestige(slave, c) {
+			if (slave.prestige > 0) {
+				const styles = "green";
+				if (slave.prestige > 2) {
+					makeSpan(c, "Prest++", styles);
+				} else if (slave.prestige === 2) {
+					makeSpan(c, "Prest+", styles);
+				} else if (slave.prestige === 1) {
+					makeSpan(c, "Prest", styles);
+				}
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function short_porn_prestige(slave, c) {
+			if (slave.porn.prestige > 0) {
+				const styles = "green";
+				if (slave.porn.prestige > 2) {
+					makeSpan(c, "PPrest++", styles);
+				} else if (slave.porn.prestige === 2) {
+					makeSpan(c, "PPrest+", styles);
+				} else if (slave.porn.prestige === 1) {
+					makeSpan(c, "PPrest", styles);
+				}
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function long_intelligence(slave, c) {
+			const intelligence = slave.intelligence + slave.intelligenceImplant;
+			if (slave.fetish === "mindbroken") {
+				return;
+			}
+			let education = "";
+			let naturalIntelligence = "";
+			let styles = undefined;
+			if (slave.intelligenceImplant >= 30) {
+				education = ", well educated";
+			} else if (slave.intelligenceImplant >= 15) {
+				education = ", educated";
+			} else if (slave.intelligenceImplant <= -15) {
+				education = ", hindered";
+			}
+			if (intelligence >= 130) {
+				naturalIntelligence = "Genius";
+				styles = "deepskyblue";
+			} else if (intelligence > 95) {
+				naturalIntelligence = "Brilliant";
+				styles = "deepskyblue";
+			} else if (intelligence > 50) {
+				naturalIntelligence = "Very smart";
+				styles = "deepskyblue";
+			} else if (intelligence > 15) {
+				naturalIntelligence = "Smart";
+				styles = "deepskyblue";
+			} else if (intelligence >= -15) {
+				naturalIntelligence = "Average intelligence";
+			} else if (intelligence >= -50) {
+				naturalIntelligence = "Slow";
+				styles = "orangered";
+			} else if (intelligence >= -95) {
+				naturalIntelligence = "Very slow";
+				styles = "orangered";
+			} else {
+				naturalIntelligence = "Moronic";
+				styles = "orangered";
+			}
+			makeSpan(c, `${naturalIntelligence}${education}`, styles, true, intelligence);
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function long_skills(slave, c) {
+			let _SSkills = (slave.skill.anal + slave.skill.oral);
+			if (((_SSkills + slave.skill.whoring + slave.skill.entertainment) >= 400) && ((slave.vagina < 0) || (slave.skill.vaginal >= 100))) {
+				makeSpan(c, "Masterful Sex Slave.", "aquamarine");
+			} else {
+				let desc;
+				_SSkills += slave.skill.vaginal;
+				if (_SSkills > 180) {
+					desc = "Sex master";
+				} else if ((_SSkills > 120) && (slave.vagina < 0)) {
+					desc = "Masterful shemale";
+				} else if (_SSkills > 90) {
+					desc = "Sexual expert";
+				} else if (_SSkills > 30) {
+					desc = "Sexually skilled";
+				} else {
+					desc = "Sexually unskilled";
+				}
+				if (desc) {
+					makeSpan(c, desc, "aquamarine", true, Math.trunc(_SSkills));
+					desc = "";
+				}
+				if (slave.skill.whoring >= 100) {
+					desc = "Masterful whore";
+				} else if (slave.skill.whoring >= 60) {
+					desc = "Expert whore";
+				} else if (slave.skill.whoring >= 30) {
+					desc = "Skilled whore";
+				} else if (slave.skill.whoring >= 10) {
+					desc = "Basic whore";
+				}
+				if (desc) {
+					makeSpan(c, desc, "aquamarine", true, slave.skill.whoring);
+					desc = "";
+				}
+				if (slave.skill.entertainment >= 100) {
+					desc = "Masterful entertainer";
+				} else if (slave.skill.entertainment >= 60) {
+					desc = "Expert entertainer";
+				} else if (slave.skill.entertainment >= 30) {
+					desc = "Skilled entertainer";
+				} else if (slave.skill.entertainment >= 10) {
+					desc = "Basic entertainer";
+				}
+				if (desc) {
+					makeSpan(c, desc, "aquamarine", true, slave.skill.entertainment);
+					desc = "";
+				}
+			}
+			if (slave.skill.combat > 0) {
+				makeSpan(c, "Trained fighter.", "aquamarine");
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function long_prestige(slave, c) {
+			if (slave.prestige > 0) {
+				const styles = "green";
+				if (slave.prestige > 2) {
+					makeSpan(c, "Extremely prestigious.", styles);
+				} else if (slave.prestige === 2) {
+					makeSpan(c, "Very prestigious.", styles);
+				} else if (slave.prestige === 1) {
+					makeSpan(c, "Prestigious.", styles);
+				}
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function long_porn_prestige(slave, c) {
+			if (slave.porn.prestige > 0) {
+				const styles = "green";
+				if (slave.porn.prestige > 2) {
+					makeSpan(c, "Porn star.", styles);
+				} else if (slave.porn.prestige === 2) {
+					makeSpan(c, "Porn slut.", styles);
+				} else if (slave.porn.prestige === 1) {
+					makeSpan(c, "Porn amateur.", styles);
+				}
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function long_clothes(slave, c) {
+			makeSpan(c, helpers.getExactRating(App.Data.SlaveSummary.long.clothes, slave.clothes,  'Naked.'));
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function long_collar(slave, c) {
+			const s = App.Data.SlaveSummary.long.accessory.collar[slave.collar];
+			if (s) {
+				makeSpan(c, s);
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function long_belly(slave, c) {
+			const s = App.Data.SlaveSummary.long.accessory.belly[slave.bellyAccessory];
+			if (s) {
+				makeSpan(c, s);
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function long_arms(slave, c) {
+			if (["hand gloves", "elbow gloves"].includes(slave.armAccessory)) {
+				makeSpan(c, slave.armAccessory, undefined, true);
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function long_legs(slave, c) {
+			if (slave.legAccessory === "short stockings") {
+				makeSpan(c, "Short stockings.");
+			} else if (slave.legAccessory === "long stockings") {
+				makeSpan(c, "Long stockings.");
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function long_shoes(slave, c) {
+			if (["boots", "extreme heels", "extreme platform heels", "flats", "heels", "platform heels", "platform shoes", "pumps"].includes(slave.shoes)) {
+				makeSpan(c, slave.shoes, undefined, true);
+			} else if (slave.heels === 1) {
+				makeSpan(c, "Crawling.", "yellow");
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function long_chastity(slave, c) {
+			if (slave.chastityAnus === 1 && slave.chastityPenis === 1 && slave.chastityVagina === 1) {
+				makeSpan(c, "Full chastity.");
+			} else if (slave.chastityPenis === 1 && slave.chastityVagina === 1) {
+				makeSpan(c, "Genital chastity.");
+			} else if ((slave.chastityAnus === 1 && slave.chastityVagina === 1) || (slave.chastityAnus === 1 && slave.chastityPenis === 1)) {
+				makeSpan(c, "Combined chastity.");
+			} else if (slave.chastityVagina === 1) {
+				makeSpan(c, "Vaginal chastity.");
+			} else if (slave.chastityPenis === 1) {
+				makeSpan(c, "Chastity cage.");
+			} else if (slave.chastityAnus === 1) {
+				makeSpan(c, "Anal chastity.");
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function long_vaginal_acc(slave, c) {
+			if (slave.vaginalAttachment !== "vibrator") {
+				const s = App.Data.SlaveSummary.long.accessory.vaginal[slave.vaginalAccessory];
+				if (s) {
+					makeSpan(c, s);
+				}
+			}
+			if (slave.vaginalAttachment !== "none") {
+				switch (slave.vaginalAttachment) {
+					case "vibrator":
+						makeSpan(c, "Vibrating dildo.");
+						break;
+				}
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function long_dick_acc(slave, c) {
+			switch (slave.dickAccessory) {
+				case "sock":
+					makeSpan(c, "Cock sock.");
+					break;
+				case "bullet vibrator":
+					makeSpan(c, "Frenulum bullet vibrator.");
+					break;
+				case "smart bullet vibrator":
+					makeSpan(c, "Smart frenulum bullet vibrator.");
+					break;
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function long_buttplug(slave, c) {
+			switch (slave.buttplug) {
+				case "plug":
+					makeSpan(c, "Buttplug.");
+					break;
+				case "large plug":
+					makeSpan(c, "Large buttplug.");
+					break;
+				case "huge plug":
+					makeSpan(c, "Huge buttplug.");
+					break;
+				case "long plug":
+					makeSpan(c, "Long buttplug.");
+					break;
+				case "long, large plug":
+					makeSpan(c, "Large, long buttplug.");
+					break;
+				case "long, huge plug":
+					makeSpan(c, "Enormous buttplug.");
+					break;
+			}
+			switch (slave.buttplugAttachment) {
+				case "tail":
+					makeSpan(c, "Attached tail.");
+					break;
+				case "cat tail":
+					makeSpan(c, "Attached cat tail.");
+					break;
+				case "fox tail":
+					makeSpan(c, "Attached fox tail.");
+					break;
+				case "cow tail":
+					makeSpan(c, "Attached cow tail.");
+					break;
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function short_fetish(slave, c) {
+			let descStr = "";
+			switch (slave.fetish) {
+				case "submissive":
+					if (slave.fetishStrength > 95) {
+						descStr = `Sub++`;
+					} else if (slave.fetishStrength > 60) {
+						descStr = `Sub+`;
+					} else {
+						descStr = `Sub`;
+					}
+					break;
+				case "cumslut":
+					if (slave.fetishStrength > 95) {
+						descStr = `Oral++`;
+					} else if (slave.fetishStrength > 60) {
+						descStr = `Oral+`;
+					} else {
+						descStr = `Oral`;
+					}
+					break;
+				case "humiliation":
+					if (slave.fetishStrength > 95) {
+						descStr = `Humil++`;
+					} else if (slave.fetishStrength > 60) {
+						descStr = `Humil+`;
+					} else {
+						descStr = `Humil`;
+					}
+					break;
+				case "buttslut":
+					if (slave.fetishStrength > 95) {
+						descStr = `Anal++`;
+					} else if (slave.fetishStrength > 60) {
+						descStr = `Anal+`;
+					} else {
+						descStr = `Anal`;
+					}
+					break;
+				case "boobs":
+					if (slave.fetishStrength > 95) {
+						descStr = `Boobs++`;
+					} else if (slave.fetishStrength > 60) {
+						descStr = `Boobs+`;
+					} else {
+						descStr = `Boobs`;
+					}
+					break;
+				case "sadist":
+					if (slave.fetishStrength > 95) {
+						descStr = `Sadist++`;
+					} else if (slave.fetishStrength > 60) {
+						descStr = `Sadist+`;
+					} else {
+						descStr = `Sadist`;
+					}
+					break;
+				case "masochist":
+					if (slave.fetishStrength > 95) {
+						descStr = `Pain++`;
+					} else if (slave.fetishStrength > 60) {
+						descStr = `Pain+`;
+					} else {
+						descStr = `Pain`;
+					}
+					break;
+				case "dom":
+					if (slave.fetishStrength > 95) {
+						descStr = `Dom++`;
+					} else if (slave.fetishStrength > 60) {
+						descStr = `Dom+`;
+					} else {
+						descStr = `Dom`;
+					}
+					break;
+				case "pregnancy":
+					if (slave.fetishStrength > 95) {
+						descStr = `Preg++`;
+					} else if (slave.fetishStrength > 60) {
+						descStr = `Preg+`;
+					} else {
+						descStr = `Preg`;
+					}
+					break;
+				default:
+					descStr = `Vanilla`;
+					break;
+			}
+			if (V.summaryStats) {
+				descStr += `[${slave.fetishStrength}]`;
+			}
+			makeSpan(c, descStr, "lightcoral");
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function short_attraction(slave, c) {
+			if (slave.attrXY <= 5) {
+				makeSpan(c, "XY---", "red", false, slave.attrXY);
+			} else if (slave.attrXY <= 15) {
+				makeSpan(c, "XY--", "red", false, slave.attrXY);
+			} else if (slave.attrXY <= 35) {
+				makeSpan(c, "XY---", "red", false, slave.attrXY);
+			} else if (slave.attrXY <= 65) {
+				makeSpan(c, "XY", undefined, false, slave.attrXY);
+			} else if (slave.attrXY <= 85) {
+				makeSpan(c, "XY+", "green", false, slave.attrXY);
+			} else if (slave.attrXY <= 95) {
+				makeSpan(c, "XY++", "green", false, slave.attrXY);
+			} else if (slave.attrXX > 95) {
+				if (slave.energy <= 95) {
+					makeSpan(c, "Omni!", "green");
+				} else {
+					makeSpan(c, "Omni+Nympho!!", "green");
+				}
+			} else {
+				makeSpan(c, "XY+++", "green", false, slave.attrXY);
+			}
+			if (slave.attrXX <= 5) {
+				makeSpan(c, "XX---", "red", false, slave.attrXX);
+			} else if (slave.attrXX <= 15) {
+				makeSpan(c, "XX--", "red", false, slave.attrXX);
+			} else if (slave.attrXX <= 35) {
+				makeSpan(c, "XX-", "red", false, slave.attrXX);
+			} else if (slave.attrXX <= 65) {
+				makeSpan(c, "XX", undefined, false, slave.attrXX);
+			} else if (slave.attrXX <= 85) {
+				makeSpan(c, "XX+", "green", false, slave.attrXX);
+			} else if (slave.attrXX <= 95) {
+				makeSpan(c, "XX++", "green", false, slave.attrXX);
+			} else if (slave.attrXY <= 95) {
+				makeSpan(c, "XX+++", "green", false, slave.attrXX);
+			}
+			if (slave.energy > 95) {
+				if ((slave.attrXY <= 95) || (slave.attrXX <= 95)) {
+					makeSpan(c, "Nympho!", "green");
+				}
+			} else if (slave.energy > 80) {
+				makeSpan(c, "SD++", "green", false, slave.energy);
+			} else if (slave.energy > 60) {
+				makeSpan(c, "SD+", "green", false, slave.energy);
+			} else if (slave.energy > 40) {
+				makeSpan(c, "SD", "green", false, slave.energy);
+			} else if (slave.energy > 20) {
+				makeSpan(c, "SD-", "red", false, slave.energy);
+			} else {
+				makeSpan(c, "SD--", "red", false, slave.energy);
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function short_smart_fetish(slave, c) {
+			function settingStr() {
+				if (slave.fetishKnown === 1) {
+					if (slave.clitSetting === "off") {
+						return `SP-`;
+					} else if (((slave.fetish !== "submissive") || (slave.fetishStrength <= 95)) && (slave.clitSetting === "submissive")) {
+						return `SP:sub`;
+					} else if (((slave.fetish !== "cumslut") || (slave.fetishStrength <= 95)) && (slave.clitSetting === "oral")) {
+						return `SP:oral`;
+					} else if (((slave.fetish !== "humiliation") || (slave.fetishStrength <= 95)) && (slave.clitSetting === "humiliation")) {
+						return `SP:humil`;
+					} else if (((slave.fetish !== "buttslut") || (slave.fetishStrength <= 95)) && (slave.clitSetting === "anal")) {
+						return `SP:anal`;
+					} else if (((slave.fetish !== "boobs") || (slave.fetishStrength <= 95)) && (slave.clitSetting === "boobs")) {
+						return `SP:boobs`;
+					} else if (((slave.fetish !== "sadist") || (slave.fetishStrength <= 95)) && (slave.clitSetting === "sadist")) {
+						return `SP:sade`;
+					} else if (((slave.fetish !== "masochist") || (slave.fetishStrength <= 95)) && (slave.clitSetting === "masochist")) {
+						return `SP:pain`;
+					} else if (((slave.fetish !== "dom") || (slave.fetishStrength <= 95)) && (slave.clitSetting === "dom")) {
+						return `SP:dom`;
+					} else if (((slave.fetish !== "pregnancy") || (slave.fetishStrength <= 95)) && (slave.clitSetting === "pregnancy")) {
+						return `SP:preg`;
+					} else if (((slave.fetish !== "none") && (slave.clitSetting === "vanilla"))) {
+						return `SP:vanilla`;
+					} else if ((slave.energy <= 95) && (slave.clitSetting === "all")) {
+						return `SP:all`;
+					} else if ((slave.energy > 5) && (slave.clitSetting === "none")) {
+						return `SP:none`;
+					} else if (!["anti-men", "anti-women", "men", "women"].includes(slave.clitSetting)) {
+						return `SP:monitoring`;
+					}
+				} else {
+					switch (slave.clitSetting) {
+						case "off":
+							return `SP-`;
+						case "submissive":
+							return `SP:sub`;
+						case "lesbian":
+							return `SP:les`;
+						case "oral":
+							return `SP:oral`;
+						case "humiliation":
+							return `SP:humil`;
+						case "anal":
+							return `SP:anal`;
+						case "boobs":
+							return `SP:boobs`;
+						case "sadist":
+							return `SP:sade`;
+						case "masochist":
+							return `SP:pain`;
+						case "dom":
+							return `SP:dom`;
+						case "pregnancy":
+							return `SP:pregnancy`;
+						case "vanilla":
+							return `SP:vanilla`;
+						case "all":
+							return `SP:all`;
+						case "none":
+							return `SP:none`;
+					}
+				}
+				return null;
+			}
+			const s = settingStr();
+			if (s) {
+				makeSpan(c, settingStr());
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function short_smart_attraction(slave, c) {
+			function settingStr() {
+				if (slave.attrKnown === 1) {
+					if (slave.clitSetting === "women") {
+						if (slave.attrXX < 95) {
+							return `SP:women`;
+						} else {
+							return `SP:monitoring`;
+						}
+					} else if (slave.clitSetting === "men") {
+						if (slave.attrXY < 95) {
+							return `SP:men`;
+						} else {
+							return `SP:monitoring`;
+						}
+					} else if (slave.clitSetting === "anti-women") {
+						if (slave.attrXX > 0) {
+							return `SP:anti-women`;
+						} else {
+							return `SP:monitoring`;
+						}
+					} else if (slave.clitSetting === "anti-men") {
+						if (slave.attrXY > 0) {
+							return `SP:anti-men`;
+						} else {
+							return `SP:monitoring`;
+						}
+					}
+				} else {
+					if (slave.clitSetting === "women") {
+						return `SP:women`;
+					} else if (slave.clitSetting === "men") {
+						return `SP:men`;
+					} else if (slave.clitSetting === "anti-women") {
+						return `SP:anti-women`;
+					} else if (slave.clitSetting === "anti-men") {
+						return `SP:anti-men`;
+					}
+				}
+				return null;
+			}
+			const s = settingStr();
+			if (s) {
+				makeSpan(c, settingStr());
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function short_behavior_flaw(slave, c) {
+			function descStr() {
+				switch (slave.behavioralFlaw) {
+					case "arrogant":
+						return `Arrog`;
+					case "bitchy":
+						return `Bitchy`;
+					case "odd":
+						return `Odd`;
+					case "hates men":
+						return `Men-`;
+					case "hates women":
+						return `Women-`;
+					case "gluttonous":
+						return `Glut`;
+					case "anorexic":
+						return `Ano`;
+					case "devout":
+						return `Dev`;
+					case "liberated":
+						return `Lib`;
+					default:
+						slave.behavioralFlaw = "none";
+						return null;
+				}
+			}
+			const s = descStr();
+			if (s) {
+				makeSpan(c, descStr(), "red");
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function short_sex_flaw(slave, c) {
+			switch (slave.sexualFlaw) {
+				case "hates oral":
+					makeSpan(c, "Oral-", "red");
+					break;
+				case "hates anal":
+					makeSpan(c, "Anal-", "red");
+					break;
+				case "hates penetration":
+					makeSpan(c, "Fuck-", "red");
+					break;
+				case "shamefast":
+					makeSpan(c, "Shame", "red");
+					break;
+				case "idealistic":
+					makeSpan(c, "Ideal", "red");
+					break;
+				case "repressed":
+					makeSpan(c, "Repre", "red");
+					break;
+				case "apathetic":
+					makeSpan(c, "Apath", "red");
+					break;
+				case "crude":
+					makeSpan(c, "Crude", "red");
+					break;
+				case "judgemental":
+					makeSpan(c, "Judge", "red");
+					break;
+				case "cum addict":
+					makeSpan(c, "CumAdd", "yellow");
+					break;
+				case "anal addict":
+					makeSpan(c, "AnalAdd", "yellow");
+					break;
+				case "attention whore":
+					makeSpan(c, "Attention", "yellow");
+					break;
+				case "breast growth":
+					makeSpan(c, "BoobObsess", "yellow");
+					break;
+				case "abusive":
+					makeSpan(c, "Abusive", "yellow");
+					break;
+				case "malicious":
+					makeSpan(c, "Malice", "yellow");
+					break;
+				case "self hating":
+					makeSpan(c, "SelfHatr", "yellow");
+					break;
+				case "neglectful":
+					makeSpan(c, "SelfNeglect", "yellow");
+					break;
+				case "breeder":
+					makeSpan(c, "BreedObsess", "yellow");
+					break;
+				default:
+					slave.sexualFlaw = "none";
+					break;
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function short_behavior_quirk(slave, c) {
+			function descStr() {
+				switch (slave.behavioralQuirk) {
+					case "confident":
+						return `Confid`;
+					case "cutting":
+						return `Cutting`;
+					case "funny":
+						return `Funny`;
+					case "fitness":
+						return `Fit`;
+					case "adores women":
+						return `Women+`;
+					case "adores men":
+						return `Men+`;
+					case "insecure":
+						return `Insec`;
+					case "sinful":
+						return `Sinf`;
+					case "advocate":
+						return `Advoc`;
+					default:
+						slave.behavioralQuirk = "none";
+						return null;
+				}
+			}
+			const s = descStr();
+			if (s) {
+				makeSpan(c, s, "green");
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function short_sex_quirk(slave, c) {
+			function descStr() {
+				switch (slave.sexualQuirk) {
+					case "gagfuck queen":
+						return `Gagfuck`;
+					case "painal queen":
+						return `Painal`;
+					case "strugglefuck queen":
+						return `Struggle`;
+					case "tease":
+						return `Tease`;
+					case "romantic":
+						return `Romantic`;
+					case "perverted":
+						return `Perverted`;
+					case "caring":
+						return `Caring`;
+					case "unflinching":
+						return `Unflinch`;
+					case "size queen":
+						return `SizeQ`;
+					default:
+						slave.sexualQuirk = "none";
+						return null;
+				}
+			}
+			const s = descStr();
+			if (s) {
+				makeSpan(c, s, "green");
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function long_fetish(slave, c) {
+			function fetishStr() {
+				switch (slave.fetish) {
+					case "submissive":
+						if (slave.fetishStrength > 95) {
+							return "Complete submissive";
+						} else if (slave.fetishStrength > 60) {
+							return "Submissive";
+						} else {
+							return "Submissive tendencies";
+						}
+					case "cumslut":
+						if (slave.fetishStrength > 95) {
+							return "Cumslut";
+						} else if (slave.fetishStrength > 60) {
+							return "Oral fixation";
+						} else {
+							return "Prefers oral";
+						}
+					case "humiliation":
+						if (slave.fetishStrength > 95) {
+							return "Humiliation slut";
+						} else if (slave.fetishStrength > 60) {
+							return "Exhibitionist";
+						} else {
+							return "Interest in humiliation";
+						}
+					case "buttslut":
+						if (slave.fetishStrength > 95) {
+							return "Buttslut";
+						} else if (slave.fetishStrength > 60) {
+							return "Anal fixation";
+						} else {
+							return "Prefers anal";
+						}
+					case "boobs":
+						if (slave.fetishStrength > 95) {
+							return "Boobslut";
+						} else if (slave.fetishStrength > 60) {
+							return "Breast fixation";
+						} else {
+							return "Loves boobs";
+						}
+					case "sadist":
+						if (slave.fetishStrength > 95) {
+							return "Complete sadist";
+						} else if (slave.fetishStrength > 60) {
+							return "Sadist";
+						} else {
+							return "Sadistic tendencies";
+						}
+					case "masochist":
+						if (slave.fetishStrength > 95) {
+							return "Complete masochist";
+						} else if (slave.fetishStrength > 60) {
+							return "Masochist";
+						} else {
+							return "Masochistic tendencies";
+						}
+					case "dom":
+						if (slave.fetishStrength > 95) {
+							return "Complete dom";
+						} else if (slave.fetishStrength > 60) {
+							return "Dominant";
+						} else {
+							return "Dominant tendencies";
+						}
+					case "pregnancy":
+						if (slave.fetishStrength > 95) {
+							return "Pregnancy fetish";
+						} else if (slave.fetishStrength > 60) {
+							return "Pregnancy kink";
+						} else {
+							return "Interest in impregnation";
+						}
+					default:
+						return "Sexually vanilla";
+				}
+			}
+			makeSpan(c, fetishStr(), "lightcoral", true, slave.fetishStrength);
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function long_attraction(slave, c) {
+			if (slave.attrXY <= 5) {
+				makeSpan(c, "Disgusted by men", "red", true, slave.attrXY);
+			} else if (slave.attrXY <= 15) {
+				makeSpan(c, "Turned off by men", "red", true, slave.attrXY);
+			} else if (slave.attrXY <= 35) {
+				makeSpan(c, "Not attracted to men", "red", true, slave.attrXY);
+			} else if (slave.attrXY <= 65) {
+				makeSpan(c, "Indifferent to men", undefined, true, slave.attrXY);
+			} else if (slave.attrXY <= 85) {
+				makeSpan(c, "Attracted to men", "green", true, slave.attrXY);
+			} else if (slave.attrXY <= 95) {
+				makeSpan(c, "Aroused by men", "green", true, slave.attrXY);
+			} else if (slave.attrXX > 95) {
+				if (slave.energy <= 95) {
+					makeSpan(c, "Omnisexual!", "green");
+				} else {
+					makeSpan(c, "Omnisexual nymphomaniac!", "green");
+				}
+			} else {
+				makeSpan(c, "Passionate about men", "green", true, slave.attrXY);
+			}
+			if (slave.attrXX <= 5) {
+				makeSpan(c, "disgusted by women", "red", true, slave.attrXX);
+			} else if (slave.attrXX <= 15) {
+				makeSpan(c, "turned off by women", "red", true, slave.attrXX);
+			} else if (slave.attrXX <= 35) {
+				makeSpan(c, "not attracted to women", "red", true, slave.attrXX);
+			} else if (slave.attrXX <= 65) {
+				makeSpan(c, "indifferent to women", undefined, true, slave.attrXX);
+			} else if (slave.attrXX <= 85) {
+				makeSpan(c, "attracted to women", "green", true, slave.attrXX);
+			} else if (slave.attrXX <= 95) {
+				makeSpan(c, "aroused by women", "green", true, slave.attrXX);
+			} else if (slave.attrXY <= 95) {
+				makeSpan(c, "passionate about women", "green", true, slave.attrXX);
+			}
+			if (slave.energy > 95) {
+				if ((slave.attrXY <= 95) || (slave.attrXX <= 95)) {
+					makeSpan(c, "Nymphomaniac!", "green");
+				}
+			} else if (slave.energy > 80) {
+				makeSpan(c, "Powerful sex drive", "green", true, slave.energy);
+			} else if (slave.energy > 60) {
+				makeSpan(c, "Good sex drive", "green", true, slave.energy);
+			} else if (slave.energy > 40) {
+				makeSpan(c, "Average sex drive", "yellow", true, slave.energy);
+			} else if (slave.energy > 20) {
+				makeSpan(c, "Poor sex drive", "red", true, slave.energy);
+			} else {
+				makeSpan(c, "No sex drive", "red", true, slave.energy);
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function long_smart_fetish(slave, c) {
+			function descStr() {
+				if (slave.fetishKnown === 1) {
+					if (slave.clitSetting === "off") {
+						return `SP off.`;
+					} else if (((slave.fetish !== "submissive") || (slave.fetishStrength <= 95)) && (slave.clitSetting === "submissive")) {
+						return `SP: submissive.`;
+					} else if (((slave.fetish !== "cumslut") || (slave.fetishStrength <= 95)) && (slave.clitSetting === "oral")) {
+						return `SP: oral.`;
+					} else if (((slave.fetish !== "humiliation") || (slave.fetishStrength <= 95)) && (slave.clitSetting === "humiliation")) {
+						return `SP: humiliation.`;
+					} else if (((slave.fetish !== "buttslut") || (slave.fetishStrength <= 95)) && (slave.clitSetting === "anal")) {
+						return `SP: anal.`;
+					} else if (((slave.fetish !== "boobs") || (slave.fetishStrength <= 95)) && (slave.clitSetting === "boobs")) {
+						return `SP: breasts.`;
+					} else if (((slave.fetish !== "sadist") || (slave.fetishStrength <= 95)) && (slave.clitSetting === "sadist")) {
+						return `SP: sadism.`;
+					} else if (((slave.fetish !== "masochist") || (slave.fetishStrength <= 95)) && (slave.clitSetting === "masochist")) {
+						return `SP: masochism.`;
+					} else if (((slave.fetish !== "dom") || (slave.fetishStrength <= 95)) && (slave.clitSetting === "dom")) {
+						return `SP: dominance.`;
+					} else if (((slave.fetish !== "pregnancy") || (slave.fetishStrength <= 95)) && (slave.clitSetting === "pregnancy")) {
+						return `SP: pregnancy.`;
+					} else if ((slave.fetish !== "none") && (slave.clitSetting === "vanilla")) {
+						return `SP: vanilla.`;
+					} else if ((slave.energy <= 95) && (slave.clitSetting === "all")) {
+						return `SP: all.`;
+					} else if ((slave.energy > 5) && (slave.clitSetting === "none")) {
+						return `SP: none.`;
+					} else if (!["anti-men", "anti-women", "men", "women"].includes(slave.clitSetting)) {
+						return `SP: monitoring.`;
+					}
+				} else {
+					switch (slave.clitSetting) {
+						case "off":
+							return `SP off.`;
+						case "submissive":
+							return `SP: submissive.`;
+						case "oral":
+							return `SP: oral.`;
+						case "humiliation":
+							return `SP: humiliation.`;
+						case "anal":
+							return `SP: anal.`;
+						case "boobs":
+							return `SP: breasts.`;
+						case "sadist":
+							return `SP: sadism.`;
+						case "masochist":
+							return `SP: masochism.`;
+						case "dom":
+							return `SP: dominance.`;
+						case "pregnancy":
+							return `SP: pregnancy.`;
+						case "vanilla":
+							return `SP: vanilla.`;
+						case "all":
+							return `SP: all.`;
+						case "none":
+							return `SP: none.`;
+					}
+				}
+				return null;
+			}
+			const s = descStr();
+			if (s) {
+				makeSpan(c, s);
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function long_smart_attraction(slave, c) {
+			if (slave.attrKnown === 1) {
+				if ((slave.attrXX < 100) && (slave.clitSetting === "women")) {
+					makeSpan(c, `SP: women.`);
+				} else if ((slave.attrXY < 100) && (slave.clitSetting === "men")) {
+					makeSpan(c, `SP: men.`);
+				}
+			} else {
+				if (slave.clitSetting === "women") {
+					makeSpan(c, `SP: women.`);
+				} else if (slave.clitSetting === "men") {
+					makeSpan(c, `SP: men.`);
+				}
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function long_behavior_flaw(slave, c) {
+			function descStr() {
+				switch (slave.behavioralFlaw) {
+					case "arrogant":
+						return `Arrogant.`;
+					case "bitchy":
+						return `Bitchy.`;
+					case "odd":
+						return `Odd.`;
+					case "hates men":
+						return `Hates men.`;
+					case "hates women":
+						return `Hates women.`;
+					case "gluttonous":
+						return `Stress eater.`;
+					case "anorexic":
+						return `Anorexic.`;
+					case "devout":
+						return `Devoutly religious.`;
+					case "liberated":
+						return `Mentally liberated.`;
+					default:
+						slave.behavioralFlaw = "none";
+						return null;
+				}
+			}
+			const s = descStr();
+			if (s) {
+				makeSpan(c, s, "red");
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function long_sex_flaw(slave, c) {
+			switch (slave.sexualFlaw) {
+				case "hates oral":
+				case "hates anal":
+				case "hates penetration":
+				case "shamefast":
+					makeSpan(c, slave.sexualFlaw, "red", true);
+					break;
+				case "idealistic":
+				case "repressed":
+				case "apathetic":
+				case "crude":
+				case "judgemental":
+					makeSpan(c, `Sexually ${slave.sexualFlaw}.`, "red");
+					break;
+				case "cum addict":
+				case "anal addict":
+				case "attention whore":
+					makeSpan(c, slave.sexualFlaw, "yellow", true);
+					break;
+				case "breast growth":
+					makeSpan(c, `Breast obsession.`, "yellow");
+					break;
+				case "abusive":
+				case "malicious":
+					makeSpan(c, `Sexually ${slave.sexualFlaw}.`, "yellow");
+					break;
+				case "self hating":
+					makeSpan(c, `Self hatred.`, "yellow");
+					break;
+				case "neglectful":
+					makeSpan(c, `Self neglectful.`, "yellow");
+					break;
+				case "breeder":
+					makeSpan(c, `Breeding obsession.`, "yellow");
+					break;
+				default:
+					slave.sexualFlaw = "none";
+					break;
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function long_behavior_quirk(slave, c) {
+			switch (slave.behavioralQuirk) {
+				case "confident":
+				case "cutting":
+				case "funny":
+				case "fitness":
+				case "adores women":
+				case "adores men":
+				case "insecure":
+				case "sinful":
+				case "advocate":
+					makeSpan(c, slave.behavioralQuirk, "green", true);
+					break;
+				default:
+					slave.behavioralQuirk = "none";
+					break;
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function long_sex_quirk(slave, c) {
+			switch (slave.sexualQuirk) {
+				case "gagfuck queen":
+				case "painal queen":
+				case "strugglefuck queen":
+				case "tease":
+				case "romantic":
+				case "perverted":
+				case "caring":
+				case "unflinching":
+				case "size queen":
+					makeSpan(c, slave.sexualQuirk, "green", true);
+					break;
+				default:
+					slave.sexualQuirk = "none";
+					break;
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function short_family(slave, c) {
+			let res = "";
+			let handled = 0;
+			if (slave.mother > 0) {
+				const _ssj = V.slaves.findIndex(s => s.ID === slave.mother);
+				if (_ssj !== -1) {
+					res += `${SlaveFullName(V.slaves[_ssj])}'s ${getPronouns(slave).daughter}`;
+					if (slave.relationshipTarget === V.slaves[_ssj].ID) {
+						const friendShipShort = relationshipTermShort(slave);
+						res += ` & ${friendShipShort}`;
+						handled = 1;
+					}
+				}
+				res += " ";
+			} else if (slave.mother === -1) {
+				res += `Your ${getPronouns(slave).daughter}`;
+				if (slave.relationship < -1) {
+					res += ` & ${PCrelationshipTerm(slave)}`;
+					handled = 1;
+				}
+				res += " ";
+			} else if (slave.mother in V.missingTable && V.showMissingSlavesSD && V.showMissingSlaves) {
+				res += `${V.missingTable[slave.mother].fullName}'s ${getPronouns(slave).daughter} `;
+			}
+			if (slave.father > 0 && slave.father !== slave.mother) {
+				const _ssj = V.slaves.findIndex(s => s.ID === slave.father);
+				if (_ssj !== -1) {
+					res += `${SlaveFullName(V.slaves[_ssj])}'s ${getPronouns(slave).daughter}`;
+					if (slave.relationshipTarget === V.slaves[_ssj].ID && handled !== 1) {
+						const friendShipShort = relationshipTermShort(slave);
+						res += ` & ${friendShipShort}`;
+						handled = 1;
+					}
+				}
+				res += " ";
+			} else if (slave.father === -1 && slave.mother !== -1) {
+				res += `Your ${getPronouns(slave).daughter}`;
+				if (slave.relationship < -1) {
+					res += ` & ${PCrelationshipTerm(slave)}`;
+					handled = 1;
+				}
+				res += " ";
+			} else if (slave.father in V.missingTable && slave.father !== slave.mother && V.showMissingSlavesSD && V.showMissingSlaves) {
+				res += `${V.missingTable[slave.father].fullName}'s ${getPronouns(slave).daughter}`;
+			}
+			if (slave.daughters === 1) {
+				let _ssj = V.slaves.findIndex(s => s.mother === slave.ID);
+				if (_ssj !== -1) {
+					res += `${SlaveFullName(V.slaves[_ssj])}'s mother`;
+					if (slave.relationshipTarget === V.slaves[_ssj].ID) {
+						const friendShipShort = relationshipTermShort(slave);
+						res += ` & ${friendShipShort}`;
+						handled = 1;
+					}
+				}
+				res += " ";
+				_ssj = V.slaves.findIndex(s => s.father === slave.ID);
+				if (_ssj !== -1) {
+					res += `${SlaveFullName(V.slaves[_ssj])}'s father`;
+					if (slave.relationshipTarget === V.slaves[_ssj].ID && handled !== 1) {
+						const friendShipShort = relationshipTermShort(slave);
+						res += ` & ${friendShipShort}`;
+						handled = 1;
+					}
+				}
+				res += " ";
+			} else if (slave.daughters > 1) {
+				res += `multiple daughters `;
+			}
+			if (slave.sisters === 1) {
+				const _ssj = V.slaves.findIndex(s => areSisters(s, slave) > 0);
+				if (_ssj !== -1) {
+					res += `${SlaveFullName(V.slaves[_ssj])}'s ${getPronouns(slave).sister}`;
+					if (slave.relationshipTarget === V.slaves[_ssj].ID) {
+						const friendShipShort = relationshipTermShort(slave);
+						res += `& ${friendShipShort}`;
+						handled = 1;
+					}
+				}
+				res += " ";
+			} else if (slave.sisters > 1) {
+				res += `multiple sisters `;
+			}
+			if (slave.relationship > 0 && handled !== 1) {
+				const _ssj = V.slaves.findIndex(s => s.ID === slave.relationshipTarget);
+				if (_ssj !== -1) {
+					res += `${SlaveFullName(V.slaves[_ssj])}'s`;
+					const friendShipShort = relationshipTermShort(slave);
+					res += ` ${friendShipShort}`;
+				}
+			} else if (slave.relationship === -3 && slave.mother !== -1 && slave.father !== -1) {
+				res += `Your ${getPronouns(slave).wife}`;
+			} else if (slave.relationship === -2) {
+				res += `E Bonded`;
+			} else if (slave.relationship === -1) {
+				res += `E Slut`;
+			}
+			helpers.makeSpan(c, res);
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function short_clone(slave, c) {
+			if (slave.clone !== 0) {
+				makeSpan(c, "Clone");
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function short_rival(slave, c) {
+			if (slave.rivalry !== 0) {
+				const block = makeBlock(c, "lightsalmon");
+				const _ssj = V.slaves.findIndex(s => s.ID === slave.rivalryTarget);
+				if (_ssj !== -1) {
+					if (slave.rivalry <= 1) {
+						block.textContent = `Disl ${SlaveFullName(V.slaves[_ssj])}`;
+					} else if (slave.rivalry <= 2) {
+						block.textContent = `${SlaveFullName(V.slaves[_ssj])}'s rival`;
+					} else {
+						block.textContent = `Hates ${SlaveFullName(V.slaves[_ssj])}`;
+					}
+				}
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function long_family(slave, c) {
+			let handled = 0;
+			const block = makeBlock();
+			if (slave.mother > 0) {
+				const _ssj = V.slaves.findIndex(s => s.ID === slave.mother);
+				if (_ssj !== -1) {
+					addText(block, `${SlaveFullName(V.slaves[_ssj])}'s `);
+					const tmpSpan = makeSpan(block, getPronouns(slave).daughter, "lightgreen");
+					if (slave.relationshipTarget === V.slaves[_ssj].ID) {
+						const friendShipShort = relationshipTerm(slave);
+						tmpSpan.textContent += ` and ${friendShipShort}`;
+						handled = 1;
+					}
+					tmpSpan.textContent += '.';
+				}
+			} else if (slave.mother === -1) {
+				addText(block, `Your `);
+				if (slave.relationship < -1) {
+					makeSpan(block, `${getPronouns(slave).daughter} and ${PCrelationshipTerm(slave)}.`, "lightgreen");
+					handled = 1;
+				} else {
+					makeSpan(block, `${getPronouns(slave).daughter}.`, "lightgreen");
+				}
+			} else if (slave.mother in V.missingTable && V.showMissingSlavesSD && V.showMissingSlaves) {
+				addText(block, `${V.missingTable[slave.mother].fullName}'s `);
+				makeSpan(block, `${getPronouns(slave).daughter}.`, "lightgreen");
+			}
+			if (slave.father > 0 && slave.father !== slave.mother) {
+				const _ssj = V.slaves.findIndex(s => s.ID === slave.father);
+				if (_ssj !== -1) {
+					addText(block, `${SlaveFullName(V.slaves[_ssj])}'s `);
+					const tmpSpan = makeSpan(block, getPronouns(slave).daughter, "lightgreen");
+					if (slave.relationshipTarget === V.slaves[_ssj].ID) {
+						const friendShipShort = relationshipTerm(slave);
+						tmpSpan.textContent += ` and ${friendShipShort}`;
+						handled = 1;
+					}
+					tmpSpan.textContent += '.';
+				}
+			} else if (slave.father === -1 && slave.father !== slave.mother) {
+				addText(block, `Your `);
+				if (slave.relationship < -1) {
+					makeSpan(block, `${getPronouns(slave).daughter} and ${PCrelationshipTerm(slave)}.`, "lightgreen");
+					handled = 1;
+				} else {
+					makeSpan(block, `${getPronouns(slave).daughter}.`, "lightgreen");
+				}
+			} else if (slave.father in V.missingTable && slave.father !== slave.mother && V.showMissingSlavesSD && V.showMissingSlaves) {
+				addText(block, `${V.missingTable[slave.father].fullName}'s `);
+				makeSpan(block, `${getPronouns(slave).daughter}.`, "lightgreen");
+			}
+			if (areSisters(V.PC, slave) > 0) {
+				addText(block, `Your `);
+				if (slave.relationship < -1) {
+					makeSpan(block, `${relativeTerm(V.PC, slave)} and ${PCrelationshipTerm(slave)}.`, "lightgreen");
+					handled = 1;
+				} else {
+					makeSpan(block, `${relativeTerm(V.PC, slave)}.`, "lightgreen");
+				}
+			}
+			if (slave.daughters === 1) {
+				let _ssj = V.slaves.findIndex(s => s.mother === slave.ID);
+				if (_ssj !== -1) {
+					addText(block, `${SlaveFullName(V.slaves[_ssj])}'s `);
+					const tmpSpan = makeSpan(block, "mother", "lightgreen");
+					if (slave.relationshipTarget === V.slaves[_ssj].ID) {
+						const friendShipShort = relationshipTerm(slave);
+						tmpSpan.textContent += ` and ${friendShipShort}`;
+						handled = 1;
+					}
+					tmpSpan.textContent += '.';
+				}
+				_ssj = V.slaves.findIndex(s => s.father === slave.ID);
+				if (_ssj !== -1) {
+					addText(block, `${SlaveFullName(V.slaves[_ssj])}'s `);
+					const tmpSpan = makeSpan(block, "father", "lightgreen");
+					if (slave.relationshipTarget === V.slaves[_ssj].ID) {
+						const friendShipShort = relationshipTerm(slave);
+						tmpSpan.textContent += ` and ${friendShipShort}`;
+						handled = 1;
+					}
+					tmpSpan.textContent += '.';
+				}
+			} else if (slave.daughters > 1) {
+				if (slave.daughters > 10) {
+					makeSpan(block, "Has tons of daughters.", "lightgreen");
+				} else if (slave.daughters > 5) {
+					makeSpan(block, "Has many daughters.", "lightgreen");
+				} else {
+					makeSpan(block, "Has several daughters.", "lightgreen");
+				}
+			}
+			if (slave.sisters === 1) {
+				const _ssj = V.slaves.findIndex(s => areSisters(s, slave) > 0);
+				if (_ssj !== -1) {
+					addText(block, `${SlaveFullName(V.slaves[_ssj])}'s `);
+					const tmpSpan = makeSpan(block, getPronouns(slave).sister, "lightgreen");
+					if (slave.relationshipTarget === V.slaves[_ssj].ID) {
+						const friendShipShort = relationshipTerm(slave);
+						tmpSpan.textContent += ` and ${friendShipShort}`;
+						handled = 1;
+					}
+					tmpSpan.textContent += '.';
+				}
+			} else if (slave.sisters > 1) {
+				if (slave.sisters > 10) {
+					makeSpan(block, "One of many sisters.", "lightgreen");
+				} else if (slave.sisters > 5) {
+					makeSpan(block, "Has many sisters.", "lightgreen");
+				} else {
+					makeSpan(block, "Has several sisters.", "lightgreen");
+				}
+			}
+			if (slave.relationship > 0 && handled !== 1) {
+				const _ssj = V.slaves.findIndex(s => s.ID === slave.relationshipTarget);
+				if (_ssj !== -1) {
+					const friendship = relationshipTerm(slave);
+					addText(block, `${SlaveFullName(V.slaves[_ssj])}'s `);
+					makeSpan(block, `${friendship}.`, "lightgreen");
+				}
+			} else if (slave.relationship === -3 && slave.mother !== -1 && slave.father !== -1 && areSisters(V.PC, slave) === 0) {
+				makeSpan(block, `Your ${getPronouns(slave).wife}.`, "lightgreen");
+			} else if (slave.relationship === -2) {
+				makeSpan(block, "Emotionally bonded to you.", "lightgreen");
+			} else if (slave.relationship === -1) {
+				makeSpan(block, "Emotional slut.", "lightgreen");
+			}
+
+			if (block.textContent.length > 0) {
+				c.appendChild(block);
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function long_clone(slave, c) {
+			if (slave.clone !== 0) {
+				makeSpan(c, `Clone of ${slave.clone}.`, "skyblue");
+			}
+		}
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		function long_rival(slave, c) {
+			if (slave.rivalry !== 0) {
+				const block = makeBlock(c);
+				const _ssj = V.slaves.findIndex(s => s.ID === slave.rivalryTarget);
+				if (_ssj !== -1) {
+					if (slave.rivalry <= 1) {
+						makeSpan(block, "Dislikes", "lightsalmon");
+						block.appendChild(document.createTextNode(` ${SlaveFullName(V.slaves[_ssj])}.`));
+					} else if (slave.rivalry <= 2) {
+						block.appendChild(document.createTextNode(`${SlaveFullName(V.slaves[_ssj])}'s `));
+						makeSpan(block, "rival.", "lightsalmon");
+					} else {
+						makeSpan(block, "Hates", "lightsalmon");
+						block.appendChild(document.createTextNode(` ${SlaveFullName(V.slaves[_ssj])}.`));
+					}
+				}
+			}
+		}
+
+		return {
+			long: {
+				health: long_health,
+				illness: long_illness,
+				tired: long_tired,
+				age: long_age,
+				face: long_face,
+				eyes: long_eyes,
+				ears: long_ears,
+				lips: long_lips,
+				teeth: long_teeth,
+				muscles: long_muscles,
+				voice: long_voice,
+				tits_ass: long_tits_ass,
+				hips: long_hips,
+				waist: long_waist,
+				implants: long_implants,
+				lactation: long_lactation,
+				mods: long_mods,
+				intelligence: long_intelligence,
+				skills: long_skills,
+				prestige: long_prestige,
+				porn_prestige: long_porn_prestige,
+				clothes: long_clothes,
+				collar: long_collar,
+				belly: long_belly,
+				arms: long_arms,
+				legs: long_legs,
+				shoes: long_shoes,
+				chastity: long_chastity,
+				vaginal_acc: long_vaginal_acc,
+				dick_acc: long_dick_acc,
+				buttplug: long_buttplug,
+				fetish: long_fetish,
+				attraction: long_attraction,
+				smart_fetish: long_smart_fetish,
+				smart_attraction: long_smart_attraction,
+				behavior_flaw: long_behavior_flaw,
+				sex_flaw: long_sex_flaw,
+				behavior_quirk: long_behavior_quirk,
+				sex_quirk: long_sex_quirk,
+				family: long_family,
+				clone: long_clone,
+				rival: long_rival
+			},
+			short: {
+				health: short_health,
+				illness: short_illness,
+				tired: short_tired,
+				age: short_age,
+				face: short_face,
+				eyes: short_eyes,
+				ears: short_ears,
+				lips: short_lips,
+				teeth: short_teeth,
+				muscles: short_muscles,
+				voice: short_voice,
+				tits_ass: short_tits_ass,
+				hips: short_hips,
+				waist: short_waist,
+				implants: short_implants,
+				lactation: short_lactation,
+				mods: short_mods,
+				intelligence: short_intelligence,
+				skills: short_skills,
+				prestige: short_prestige,
+				porn_prestige: short_porn_prestige,
+/*				clothes: short_clothes,
+				collar: short_collar,
+				belly: short_belly,
+				arms: short_arms,
+				legs: short_legs,
+				shoes: short_shoes,
+				chastity: short_chastity,
+				vaginal_acc: short_vaginal_acc,
+				dick_acc: short_dick_acc,
+				buttplug: short_buttplug,
+*/
+				fetish: short_fetish,
+				attraction: short_attraction,
+				smart_fetish: short_smart_fetish,
+				smart_attraction: short_smart_attraction,
+				behavior_flaw: short_behavior_flaw,
+				sex_flaw: short_sex_flaw,
+				behavior_quirk: short_behavior_quirk,
+				sex_quirk: short_sex_quirk,
+				family: short_family,
+				clone: short_clone,
+				rival: short_rival
+			}
+		};
+	}();
+
+	return {
+		helpers: helpers,
+		bits: bits
+	};
+}();
diff --git a/src/js/slaveSummaryWidgets.js b/src/js/slaveSummaryWidgets.js
index a5b28aa5561a5c738c92c4416a49d313a728868f..8f5bc4fe424a4ad2c79af2223498a87acfa12838 100644
--- a/src/js/slaveSummaryWidgets.js
+++ b/src/js/slaveSummaryWidgets.js
@@ -1,4514 +1,2005 @@
-/* eslint-disable camelcase */
+App.UI.SlaveSummaryRenderers = function() {
 
-window.SlaveSummary = (function() {
-	/** @type {DocumentFragment} */
-	let res;
+	const bits = App.UI.SlaveSummaryImpl.bits;
+	const helpers = App.UI.SlaveSummaryImpl.helpers;
 
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @returns {DocumentFragment} */
-	function SlaveSummary(slave) {
-		res = document.createDocumentFragment();
-		let para = makeParagraph(res);
-
-		if (V.abbreviateDevotion === 1) {
-			short_devotion(slave, para);
-		} else if (V.abbreviateDevotion === 2) {
-			long_devotion(slave, para);
-		}
-		if (slave.fuckdoll === 0) {
-			if (V.abbreviateRules === 1) {
-				short_rules(slave, para);
-			} else if (V.abbreviateRules === 2) {
-				long_rules(slave, para);
-			}
-		}
-		if (V.abbreviateDiet === 1) {
-			short_weight(slave, para);
-		} else if (V.abbreviateDiet === 2) {
-			long_weight(slave, para);
-		}
-		if (V.abbreviateDiet === 1) {
-			short_diet(slave, para);
-		} else if (V.abbreviateDiet === 2) {
-			long_diet(slave, para);
-		}
-		if (V.abbreviateHealth === 1) {
-			short_health(slave, para);
-			short_illness(slave, para);
-			short_tired(slave, para);
-		} else if (V.abbreviateHealth === 2) {
-			long_health(slave, para);
-			long_illness(slave, para);
-			long_tired(slave, para);
-		}
-		if (V.abbreviateDrugs === 1) {
-			short_drugs(slave, para);
-		} else if (V.abbreviateDrugs === 2) {
-			long_drugs(slave, para);
-		}
-
-		para = makeParagraph(res);
-		para.classList.add("pink");
-
-		makeSpan(para, `${capFirstChar(SlaveTitle(slave))}${V.abbreviatePhysicals === 2 ? '.' : ''}`, ["coral", "strong"]);
-		if (V.seeRace === 1 && V.abbreviateRace !== 0) {
-			makeSpan(para, V.abbreviateRace === 1 ? short_race(slave) : long_race(slave), "tan");
-		}
-		if (V.abbreviateNationality !== 0) {
-			makeSpan(para, V.abbreviateNationality === 1 ? short_nationality(slave) : long_nationality(slave), "tan");
-		}
-		makeSpan(para, V.abbreviatePhysicals === 1 ? short_skin(slave) : `${capFirstChar(slave.skin)} skin.`);
-		if (V.abbreviateGenitalia === 1) {
-			short_genitals(slave, para);
-		} else if (V.abbreviateGenitalia === 2) {
-			long_genitals(slave, para);
-		}
-		if (V.abbreviatePhysicals === 1) {
-			short_age(slave, para);
-			short_face(slave, para);
-			short_eyes(slave, para);
-			short_ears(slave, para);
-			if (slave.markings !== "none") {
-				makeSpan(para, "Markings");
-			}
-			short_lips(slave, para);
-			short_teeth(slave, para);
-			short_muscles(slave, para);
-			addText(para, App.Desc.shortLimbs(slave));
-			short_voice(slave, para);
-			short_tits_ass(slave, para);
-			short_hips(slave, para);
-			short_waist(slave, para);
-			short_implants(slave, para);
-			short_lactation(slave, para);
-			short_mods(slave, para);
-		} else if (V.abbreviatePhysicals === 2) {
-			long_age(slave, para);
-			long_face(slave, para);
-			long_eyes(slave, para);
-			long_ears(slave, para);
-			long_lips(slave, para);
-			long_teeth(slave, para);
-			long_muscles(slave, para);
-			makeSpan(para, App.Desc.longLimbs(slave));
-			long_voice(slave, para);
-			long_tits_ass(slave, para);
-			long_hips(slave, para);
-			long_waist(slave, para);
-			long_implants(slave, para);
-			long_lactation(slave, para);
-			long_mods(slave, para);
-			if (!jQuery.isEmptyObject(slave.brand)) {
-				makeSpan(para, `Branded.`);
-			}
-		}
-		if (V.abbreviateHormoneBalance === 1) {
-			if (slave.hormoneBalance <= -21) {
-				makeSpan(para, "HB:M", ["deepskyblue", "strong"]);
-			} else if (slave.hormoneBalance <= 20) {
-				makeSpan(para, "HB:N", ["pink", "strong"]);
-			} else if (slave.hormoneBalance <= 500) {
-				makeSpan(para, "HB:F", ["pink", "strong"]);
-			}
-		} else if (V.abbreviateHormoneBalance === 2) {
-			const colorClass = slave.hormoneBalance <= -21 ? "deepskyblue" : "pink";
-			let desc = "";
-			if (slave.hormoneBalance < -400) {
-				desc = `Overwhelmingly masculine`;
-			} else if (slave.hormoneBalance <= -300) {
-				desc = `Extremely masculine`;
-			} else if (slave.hormoneBalance <= -200) {
-				desc = `Heavily masculine`;
-			} else if (slave.hormoneBalance <= -100) {
-				desc = `Very masculine`;
-			} else if (slave.hormoneBalance <= -21) {
-				desc = `Masculine`;
-			} else if (slave.hormoneBalance <= 20) {
-				desc = `Neutral`;
-			} else if (slave.hormoneBalance <= 99) {
-				desc = `Feminine`;
-			} else if (slave.hormoneBalance <= 199) {
-				desc = `Very feminine`;
-			} else if (slave.hormoneBalance <= 299) {
-				desc = `Heavily feminine`;
-			} else if (slave.hormoneBalance <= 399) {
-				desc = `Extremely feminine`;
-			} else if (slave.hormoneBalance <= 500) {
-				desc = `Overwhelmingly feminine`;
-			}
-			makeSpan(para, desc + " hormone balance.", colorClass);
-		}
-
-		para = makeParagraph(res);
-
-		if (V.abbreviateSkills === 1) {
-			short_intelligence(slave, para);
-			short_skills(slave, para);
-			short_prestige(slave, para);
-			short_porn_prestige(slave, para);
-		} else if (V.abbreviateSkills === 2) {
-			long_intelligence(slave, para);
-			long_skills(slave, para);
-			long_prestige(slave, para);
-			long_porn_prestige(slave, para);
-		}
-		if (V.abbreviateMental === 1) {
-			if (slave.fetish !== "mindbroken") {
-				if (slave.fetishKnown === 1) {
-					short_fetish(slave, para);
-				}
-				if (slave.attrKnown === 1) {
-					short_attraction(slave, para);
-				}
-			}
-			if (slave.clitPiercing === 3) {
-				short_smart_fetish(slave, para);
-				short_smart_attraction(slave, para);
-			}
-			short_behavior_flaw(slave, para);
-			short_sex_flaw(slave, para);
-			short_behavior_quirk(slave, para);
-			short_sex_quirk(slave, para);
-		} else if (V.abbreviateMental === 2) {
-			if (slave.fetish !== "mindbroken") {
-				if (slave.fetishKnown === 1) {
-					long_fetish(slave, para);
-				}
-				if (slave.attrKnown === 1) {
-					long_attraction(slave, para);
-				}
-			}
-			if (slave.clitPiercing === 3) {
-				long_smart_fetish(slave, para);
-				long_smart_attraction(slave, para);
-			}
-			long_behavior_flaw(slave, para);
-			long_sex_flaw(slave, para);
-			long_behavior_quirk(slave, para);
-			long_sex_quirk(slave, para);
-		}
-		if (slave.custom.label) {
-			makeSpan(res, `${capFirstChar(slave.custom.label)}.`, ["yellow", "strong"]);
-		}
-		if ((slave.relationship !== 0) || (V.abbreviateClothes === 2) || (V.abbreviateRulesets === 2)) {
-			para = makeParagraph(res);
-		}
-		if (V.abbreviateMental === 1) {
-			makeSpan(para, short_extended_family(slave), "lightgreen");
-			short_clone(slave, para);
-			short_rival(slave, para);
-		} else if (V.abbreviateMental === 2) {
-			long_extended_family(slave, para);
-			long_clone(slave, para);
-			long_rival(slave, para);
-		}
-		if (slave.fuckdoll === 0) {
-			if (V.abbreviateClothes === 2) {
-				const dressingBlock = makeBlock(para);
-				if (slave.choosesOwnClothes === 1) {
-					makeSpan(dressingBlock, `Dressing ${getPronouns(slave).himself}.`);
-				}
-				long_clothes(slave, dressingBlock);
-				long_collar(slave, dressingBlock);
-				long_belly(slave, dressingBlock);
-				if (hasAnyArms(slave)) {
-					long_arms(slave, dressingBlock);
-				}
-				if (hasAnyLegs(slave)) {
-					long_legs(slave, dressingBlock);
-					long_shoes(slave, dressingBlock);
-				}
-				long_chastity(slave, dressingBlock);
-				long_vaginal_acc(slave, dressingBlock);
-				long_dick_acc(slave, dressingBlock);
-				long_buttplug(slave, dressingBlock);
-			}
-		}
-		const RABlock = makeBlock(para);
-		rules_assistant(slave, RABlock);
-		if (V.abbreviateOrigins === 2 && slave.origin !== 0) {
-			origins(slave, res);
-		}
-		return res;
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 */
-	function short_devotion(slave, c) {
-		if (slave.fetish === "mindbroken") {
-			makeSpan(c, "MB", "mindbroken");
-		} else if (slave.devotion < -95) {
-			makeSpan(c, "Hate", ["devotion", "hateful"], true, slave.devotion);
-		} else if (slave.devotion < -50) {
-			makeSpan(c, "Hate", ["devotion", "hateful"], true, slave.devotion);
-		} else if (slave.devotion < -20) {
-			makeSpan(c, "Res", ["devotion", "resistant"], true, slave.devotion);
-		} else if (slave.devotion <= 20) {
-			makeSpan(c, "Ambiv", ["devotion", "ambivalent"], true, slave.devotion);
-		} else if (slave.devotion <= 50) {
-			makeSpan(c, "Accept", ["devotion", "accept"], true, slave.devotion);
-		} else if (slave.devotion <= 95) {
-			makeSpan(c, "Devo", ["devotion", "devoted"], true, slave.devotion);
-		} else {
-			makeSpan(c, "Wor", ["devotion", "worship"], true, slave.devotion);
-		}
-		if (slave.fetish === "mindbroken") {
-			return;
-		} else if (slave.trust < -95) {
-			makeSpan(c, "ETerr", ["trust", "extremely-terrified"], true, slave.trust);
-		} else if (slave.trust < -50) {
-			makeSpan(c, "Terr", ["trust", "terrified"], true, slave.trust);
-		} else if (slave.trust < -20) {
-			makeSpan(c, "Fright", ["trust", "frightened"], true, slave.trust);
-		} else if (slave.trust <= 20) {
-			makeSpan(c, "Fear", ["trust", "fearful"], true, slave.trust);
-		} else if (slave.trust <= 50) {
-			if (slave.devotion < -20) {
-				makeSpan(c, "Caref", ["defiant", "careful"], true, slave.trust);
-			} else {
-				makeSpan(c, "Caref", ["trust", "careful"], true, slave.trust);
-			}
-		} else if (slave.trust < 95) {
-			if (slave.devotion < -20) {
-				makeSpan(c, "Bold", ["defiant", "bold"], true, slave.trust);
-			} else {
-				makeSpan(c, "Trust", ["trust", "trusting"], true, slave.trust);
-			}
-		} else {
-			if (slave.devotion < -20) {
-				makeSpan(c, "Defiant", ["defiant", "full"], true, slave.trust);
-			} else {
-				makeSpan(c, "VTrust", ["trust", "prof-trusting"], true, slave.trust);
-			}
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function long_devotion(slave, c) {
-		if (slave.fetish === "mindbroken") {
-			makeSpan(c, "Mindbroken.", "mindbroken");
-		} else if (slave.devotion < -95) {
-			makeSpan(c, "Very hateful", ["devotion", "hateful"], true, slave.devotion);
-		} else if (slave.devotion < -50) {
-			makeSpan(c, "Hateful", ["devotion", "hateful"], true, slave.devotion);
-		} else if (slave.devotion < -20) {
-			makeSpan(c, "Resistant", ["devotion", "resistant"], true, slave.devotion);
-		} else if (slave.devotion <= 20) {
-			makeSpan(c, "Ambivalent", ["devotion", "ambivalent"], true, slave.devotion);
-		} else if (slave.devotion <= 50) {
-			makeSpan(c, "Accepting", ["devotion", "accept"], true, slave.devotion);
-		} else if (slave.devotion <= 95) {
-			makeSpan(c, "Devoted", ["devotion", "devoted"], true, slave.devotion);
-		} else {
-			makeSpan(c, "Worshipful", ["devotion", "worship"], true, slave.devotion);
-		}
-		if (slave.fetish === "mindbroken") {
-			return;
-		} else if (slave.trust < -95) {
-			makeSpan(c, "Extremely terrified", ["trust", "extremely-terrified"], true, slave.trust);
-		} else if (slave.trust < -50) {
-			makeSpan(c, "Terrified", ["trust", "terrified"], true, slave.trust);
-		} else if (slave.trust < -20) {
-			makeSpan(c, "Frightened", ["trust", "frightened"], true, slave.trust);
-		} else if (slave.trust <= 20) {
-			makeSpan(c, "Fearful", ["trust", "fearful"], true, slave.trust);
-		} else if (slave.trust <= 50) {
-			if (slave.devotion < -20) {
-				makeSpan(c, "Careful", ["defiant", "careful"], true, slave.trust);
-			} else {
-				makeSpan(c, "Careful", ["trust", "careful"], true, slave.trust);
-			}
-		} else if (slave.trust <= 95) {
-			if (slave.devotion < -20) {
-				makeSpan(c, "Bold", ["defiant", "bold"], true, slave.trust);
-			} else {
-				makeSpan(c, "Trusting", ["trust", "trusting"], true, slave.trust);
-			}
-		} else {
-			if (slave.devotion < -20) {
-				makeSpan(c, "Defiant", ["defiant", "full"], true, slave.trust);
-			} else {
-				makeSpan(c, "Profoundly trusting", ["trust", "prof-trusting"], true, slave.trust);
-			}
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function short_rules(slave, c) {
-		const styles = "strong";
-		switch (slave.rules.living) {
-			case "luxurious":
-				makeSpan(c, "LS:Lux", styles);
-				break;
-			case "normal":
-				makeSpan(c, "LS:Nor", styles);
-				break;
-			default:
-				makeSpan(c, "LS:Spa", styles);
-				break;
-		}
-		if (canTalk(slave, false)) {
-			switch (slave.rules.speech) {
-				case "permissive":
-					makeSpan(c, "SpR:P", styles);
-					break;
-				case "accent elimination":
-					makeSpan(c, "SpR:NoAcc", styles);
-					break;
-				case "language lessons":
-					makeSpan(c, "SpR:LL", styles);
-					break;
-				default:
-					makeSpan(c, "SpR:R", styles);
-					break;
-			}
-		}
-		switch (slave.rules.relationship) {
-			case "permissive":
-				makeSpan(c, "ReR:P", styles);
-				break;
-			case "just friends":
-				makeSpan(c, "ReR:Fr", styles);
-				break;
-			default:
-				makeSpan(c, "ReR:R", styles);
-				break;
-		}
-		switch (slave.rules.punishment) {
-			case "confinement":
-				makeSpan(c, "Pun:Conf", styles);
-				break;
-			case "whipping":
-				makeSpan(c, "Pun:Whip", styles);
-				break;
-			case "chastity":
-				makeSpan(c, "Pun:Chas", styles);
-				break;
-			default:
-				makeSpan(c, "Pun:Situ", styles);
-				break;
-		}
-		switch (slave.rules.reward) {
-			case "relaxation":
-				makeSpan(c, "Rew:Relx", styles);
-				break;
-			case "drugs":
-				makeSpan(c, "Rew:Drug", styles);
-				break;
-			case "orgasm":
-				makeSpan(c, "Rew:Orga", styles);
-				break;
-			default:
-				makeSpan(c, "Rew:Situ", styles);
-				break;
-		}
-		makeSpan(c, "MaR:" + App.Utils.releaseSummaryShort(slave), styles);
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function long_rules(slave, c) {
-		addText(c, `Living standard: ${slave.rules.living}. `);
-		if (canTalk(slave, false)) {
-			addText(c, `Speech rules: ${slave.rules.speech}. `);
-		}
-		addText(c, `Relationship rules: ${slave.rules.relationship}. `);
-		addText(c, `Typical punishment: ${slave.rules.punishment}. `);
-		addText(c, `Typical reward: ${slave.rules.reward}. `);
-		addText(c, `Release rules: ${App.Utils.releaseSummaryLong(slave)}. `);
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function short_weight(slave, c) {
-		if (slave.weight < -95) {
-			makeSpan(c, "W---", ["red", "strong"], true, slave.weight);
-		} else if (slave.weight < -30) {
-			if (slave.hips < -1) {
-				makeSpan(c, "W--", "strong", true, slave.weight);
-			} else {
-				makeSpan(c, "W--", ["red", "strong>"], true, slave.weight);
-			}
-		} else if (slave.weight < -10) {
-			makeSpan(c, "W-", "strong", true, slave.weight);
-		} else if (slave.weight <= 10) {
-			makeSpan(c, "W", "strong", true, slave.weight);
-		} else if (slave.weight <= 30) {
-			makeSpan(c, "W+", "strong", true, slave.weight);
-		} else if (slave.weight <= 95) {
-			if (slave.hips > 1 || V.arcologies[0].FSHedonisticDecadence !== "unset") {
-				makeSpan(c, "W++", "strong", true, slave.weight);
-			} else {
-				makeSpan(c, "W++", ["red", "strong"], true, slave.weight);
-			}
-		} else if (slave.weight <= 130) {
-			if (slave.hips > 2 || V.arcologies[0].FSHedonisticDecadence !== "unset") {
-				makeSpan(c, "W+++", "strong", true, slave.weight);
-			} else {
-				makeSpan(c, "W+++", ["red", "strong"], true, slave.weight);
-			}
-		} else if (slave.weight <= 160) {
-			if (V.arcologies[0].FSHedonisticDecadence !== "unset") {
-				makeSpan(c, "W++++", "strong", true, slave.weight);
-			} else {
-				makeSpan(c, "W++++", ["red", "strong"], true, slave.weight);
-			}
-		} else if (slave.weight <= 190) {
-			if (V.arcologies[0].FSHedonisticDecadence !== "unset") {
-				makeSpan(c, "W+++++", "strong", true, slave.weight);
-			} else {
-				makeSpan(c, "W+++++", ["red", "strong"], true, slave.weight);
-			}
-		} else {
-			if (V.arcologies[0].FSHedonisticDecadence !== "unset") {
-				makeSpan(c, "W++++++", "strong", true, slave.weight);
-			} else {
-				makeSpan(c, "W++++++", ["red", "strong"], true, slave.weight);
-			}
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function long_weight(slave, c) {
-		if (slave.weight < -95) {
-			makeSpan(c, "Emaciated", "red", true, slave.weight);
-		} else if (slave.weight < -30) {
-			if (slave.hips < -1) {
-				makeSpan(c, "Model-thin", null, true, slave.weight);
-			} else {
-				makeSpan(c, "Very thin", "red", true, slave.weight);
-			}
-		} else if (slave.weight < -10) {
-			makeSpan(c, "Thin", null, true, slave.weight);
-		} else if (slave.weight <= 10) {
-			makeSpan(c, "Trim", null, true, slave.weight);
-		} else if (slave.weight <= 30) {
-			makeSpan(c, "Plush", null, true, slave.weight);
-		} else if (slave.weight <= 95) {
-			if (slave.hips > 1 || V.arcologies[0].FSHedonisticDecadence !== "unset") {
-				makeSpan(c, "Nicely chubby", null, true, slave.weight);
-			} else {
-				makeSpan(c, "Overweight", "red", true, slave.weight);
-			}
-		} else if (slave.weight <= 130) {
-			if (slave.hips > 2 || V.arcologies[0].FSHedonisticDecadence !== "unset") {
-				makeSpan(c, "Pleasantly soft and shapely", null, true, slave.weight);
-			} else {
-				makeSpan(c, "Fat", "red", true, slave.weight);
-			}
-		} else if (slave.weight <= 160) {
-			if (V.arcologies[0].FSHedonisticDecadence !== "unset") {
-				makeSpan(c, "Amazingly voluptuous", null, true, slave.weight);
-			} else {
-				makeSpan(c, "Obese", "red", true, slave.weight);
-			}
-		} else if (slave.weight <= 190) {
-			if (V.arcologies[0].FSHedonisticDecadence !== "unset") {
-				makeSpan(c, "SSBBW", null, true, slave.weight);
-			} else {
-				makeSpan(c, "Super Obese", "red", true, slave.weight);
-			}
-		} else {
-			if (V.arcologies[0].FSHedonisticDecadence !== "unset") {
-				makeSpan(c, "Perfectly massive", null, true, slave.weight);
-			} else {
-				makeSpan(c, "Dangerously Obese", "red", true, slave.weight);
-			}
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function short_diet(slave, c) {
-		let diet = makeSpan(null, "", ["teal", "strong"]);
-		switch (slave.diet) {
-			case "restricted":
-				diet.textContent = "Di:W-";
-				break;
-			case "fattening":
-				diet.textContent = "Di:W+";
-				break;
-			case "corrective":
-				diet.textContent = "Di:W=";
-				break;
-			case "XX":
-				diet.textContent = "Di:XX+";
-				break;
-			case "XY":
-				diet.textContent = "Di:XY+";
-				break;
-			case "XXY":
-				diet.textContent = "Di:XXY+";
-				break;
-			case "muscle building":
-				diet.textContent = "Di:M+";
-				break;
-			case "slimming":
-				diet.textContent = "Di:M-";
-				break;
-			case "cum production":
-				diet.textContent = "Di:C+";
-				break;
-			case "cleansing":
-				diet.textContent = "Di:H+";
-				break;
-			case "fertility":
-				diet.textContent = "Di:F+";
-				break;
-		}
-		if (diet.textContent.length > 0) {
-			c.appendChild(diet);
-		}
-		let specialDiet = makeSpan(null, "", ["cyan", "strong"]);
-		if (slave.dietCum === 2) {
-			specialDiet.textContent = "Cum++";
-		} else if (((slave.dietCum === 1) && (slave.dietMilk === 0))) {
-			specialDiet.textContent = "Cum+";
-		} else if (((slave.dietCum === 1) && (slave.dietMilk === 1))) {
-			specialDiet.textContent = "Cum+ Milk+";
-		} else if (((slave.dietCum === 0) && (slave.dietMilk === 1))) {
-			specialDiet.textContent = "Milk+";
-		} else if ((slave.dietMilk === 2)) {
-			specialDiet.textContent = ">Milk++";
-		}
-		if (specialDiet.textContent.length > 0) {
-			c.appendChild(specialDiet);
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function long_diet(slave, c) {
-		let dietDesc = "";
-		switch (slave.diet) {
-			case "restricted":
-				dietDesc = `Dieting.`;
-				break;
-			case "fattening":
-				dietDesc = `Gaining weight.`;
-				break;
-			case "corrective":
-				dietDesc = `Corrective.`;
-				break;
-			case "XX":
-				dietDesc = `Estrogen rich.`;
-				break;
-			case "XY":
-				dietDesc = `Testosterone rich.`;
-				break;
-			case "XXY":
-				dietDesc = `Futanari mix.`;
-				break;
-			case "muscle building":
-				dietDesc = `Pumping iron.`;
-				break;
-			case "slimming":
-				dietDesc = `Slimming down.`;
-				break;
-			case "cum production":
-				dietDesc = `Cum production.`;
-				break;
-			case "cleansing":
-				dietDesc = `Cleansing.`;
-				break;
-			case "fertility":
-				dietDesc = `Fertility.`;
-				break;
-		}
-
-		if (dietDesc) {
-			makeSpan(c, dietDesc, "teal");
-		}
-
-		function specialDiet(text) {
-			addText(c, "Diet base: ");
-			makeSpan(c, text, "cyan");
-		}
-
-		if (slave.dietCum === 2) {
-			specialDiet("Cum Based.");
-		} else if (((slave.dietCum === 1) && (slave.dietMilk === 0))) {
-			specialDiet("Cum Added.");
-		} else if (((slave.dietCum === 1) && (slave.dietMilk === 1))) {
-			specialDiet("Milk & Cum Added.");
-		} else if (((slave.dietCum === 0) && (slave.dietMilk === 1))) {
-			specialDiet("Milk Added.");
-		} else if ((slave.dietMilk === 2)) {
-			specialDiet("Milk Based.");
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function short_health(slave, c) {
-		if (slave.health.health < -20) {
-			makeSpan(c, "H", ["red", "strong"], true, slave.health.health);
-		} else if (slave.health.health <= 20) {
-			makeSpan(c, "H", ["yellow", "strong"], true, slave.health.health);
-		} else if (slave.health.health > 20) {
-			makeSpan(c, "H", ["green", "strong"], true, slave.health.health);
-		}
-		if (passage() === "Clinic" && V.clinicUpgradeScanner) {
-			if (slave.chem > 15) {
-				makeSpan(c, `C${Math.ceil(slave.chem/10)}`, ["cyan", "strong"]);
-			} else if (slave.chem <= 15 && slave.assignment === "get treatment in the clinic") {
-				makeSpan(c, `CSafe`, ["green", "strong"]);
-			}
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function long_health(slave, c) {
-		if (slave.health.health < -90) {
-			makeSpan(c, "On the edge of death", ["red", "strong"], true, slave.health.health);
-		} else if (slave.health.health < -50) {
-			makeSpan(c, "Extremely unhealthy", ["red", "strong"], true, slave.health.health);
-		} else if (slave.health.health < -20) {
-			makeSpan(c, "Unhealthy", ["red", "strong"], true, slave.health.health);
-		} else if (slave.health.health <= 20) {
-			makeSpan(c, "healthy", "yellow", true, slave.health.health);
-		} else if (slave.health.health <= 50) {
-			makeSpan(c, "Very healthy", "green", true, slave.health.health);
-		} else if (slave.health.health <= 90) {
-			makeSpan(c, "Extremely healthy", "green", true, slave.health.health);
-		} else {
-			makeSpan(c, "Unnaturally healthy", "green", true, slave.health.health);
-		}
-		if (passage() === "Clinic" && V.clinicUpgradeScanner) {
-			if (slave.chem > 15) {
-				makeSpan(c, `Carcinogen buildup: ${Math.ceil(slave.chem/10)}.`, "cyan");
-			} else if (slave.chem <= 15 && slave.assignment === "get treatment in the clinic") {
-				makeSpan(c, `Safe chem levels.`, "green");
-			}
-		}
-	}
-
-	function short_illness(slave, c) {
-		if (slave.health.illness > 4) {
-			makeSpan(c, `Ill${slave.health.illness}`, ["red", "strong"], true, slave.health.illness);
-		} else if (slave.health.illness > 3) {
-			makeSpan(c, `Ill${slave.health.illness}`, ["red", "strong"], true, slave.health.illness);
-		} else if (slave.health.illness > 2) {
-			makeSpan(c, `Ill${slave.health.illness}`, ["red", "strong"], true, slave.health.illness);
-		} else if (slave.health.illness > 0) {
-			makeSpan(c, `Ill${slave.health.illness}`, ["yellow", "strong"], true, slave.health.illness);
-		}
-	}
-
-	function long_illness(slave, c) {
-		if (slave.health.illness > 4) {
-			makeSpan(c, "Terribly ill", ["red", "strong"], true, slave.health.illness);
-		} else if (slave.health.illness > 3) {
-			makeSpan(c, "Very ill", ["red", "strong"], true, slave.health.illness);
-		} else if (slave.health.illness > 2) {
-			makeSpan(c, "Ill", ["red", "strong"], true, slave.health.illness);
-		} else if (slave.health.illness > 0) {
-			makeSpan(c, "Sick", "yellow", true, slave.health.illness);
-		}
-	}
-
-	function short_tired(slave, c) {
-		if (slave.health.tired > 90) {
-			makeSpan(c, "Exh", ["red", "strong"], true, slave.health.tired);
-		} else if (slave.health.tired > 60) {
-			makeSpan(c, "Tir+", "orange", true, slave.health.tired);
-		} else if (slave.health.tired > 30) {
-			makeSpan(c, "Tir", "yellow", true, slave.health.tired);
-		} else if (slave.health.tired < 0) {
-			makeSpan(c, "Ene", "green", true, slave.health.tired);
-		}
-	}
-
-	function long_tired(slave, c) {
-		if (slave.health.tired > 90) {
-			makeSpan(c, "Exhausted", ["red", "strong"], true, slave.health.tired);
-		} else if (slave.health.tired > 60) {
-			makeSpan(c, "Fatigued", "orange", true, slave.health.tired);
-		} else if (slave.health.tired > 30) {
-			makeSpan(c, "Tired", "yellow", true, slave.health.tired);
-		} else if (slave.health.tired < 0) {
-			makeSpan(c, "Energetic", "green", true, slave.health.tired);
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function short_drugs(slave, c) {
-		let drugDesc = "";
-		switch (slave.drugs) {
-			case "breast injections":
-				drugDesc = "Boobs+";
-				break;
-			case "intensive breast injections":
-				drugDesc = "Boobs++";
-				break;
-			case "hyper breast injections":
-				drugDesc = "Boobs+++";
-				break;
-			case "nipple enhancers":
-				drugDesc = "Nipple+";
-				break;
-			case "butt injections":
-				drugDesc = "Butt+";
-				break;
-			case "intensive butt injections":
-				drugDesc = "Butt++";
-				break;
-			case "hyper butt injections":
-				drugDesc = "Butt+++";
-				break;
-			case "lip injections":
-				drugDesc = "Lip+";
-				break;
-			case "fertility drugs":
-				drugDesc = "Fert+";
-				break;
-			case "super fertility drugs":
-				drugDesc = "Fert++";
-				break;
-			case "penis enhancement":
-				drugDesc = "Dick+";
-				break;
-			case "intensive penis enhancement":
-				drugDesc = "Dick++";
-				break;
-			case "hyper penis enhancement":
-				drugDesc = "Dick+++";
-				break;
-			case "testicle enhancement":
-				drugDesc = "Balls+";
-				break;
-			case "intensive testicle enhancement":
-				drugDesc = "Balls++";
-				break;
-			case "hyper testicle enhancement":
-				drugDesc = "Balls+++";
-				break;
-			case "psychosuppressants":
-				drugDesc = "Psych-";
-				break;
-			case "psychostimulants":
-				drugDesc = "Psych+";
-				break;
-			case "steroids":
-				drugDesc = "Ster";
-				break;
-			case "female hormone injections":
-				drugDesc = "HormXX++";
-				break;
-			case "male hormone injections":
-				drugDesc = "HormXY++";
-				break;
-			case "hormone enhancers":
-				drugDesc = "Horm+";
-				break;
-			case "hormone blockers":
-				drugDesc = "Horm-";
-				break;
-			case "anti-aging cream":
-				drugDesc = "Age-";
-				break;
-			case "appetite suppressors":
-				drugDesc = "ApSup";
-				break;
-			case "penis atrophiers":
-				drugDesc = "Dick-";
-				break;
-			case "testicle atrophiers":
-				drugDesc = "Balls-";
-				break;
-			case "clitoris atrophiers":
-				drugDesc = "Clit-";
-				break;
-			case "labia atrophiers":
-				drugDesc = "Labia-";
-				break;
-			case "nipple atrophiers":
-				drugDesc = "Nipple-";
-				break;
-			case "lip atrophiers":
-				drugDesc = "Lip-";
-				break;
-			case "breast redistributors":
-				drugDesc = "Breast-";
-				break;
-			case "butt redistributors":
-				drugDesc = "Butt-";
-				break;
-			case "sag-B-gone":
-				drugDesc = "AntiSag";
-				break;
-			case "growth stimulants":
-				drugDesc = "GroStim";
-				break;
-			case "priapism agents":
-				drugDesc = "Erection";
-				break;
-		}
-		if (drugDesc) {
-			makeSpan(c, "Dr:" + drugDesc, ["tan", "strong"]);
-		}
-		if (slave.curatives === 2) {
-			makeSpan(c, "Cura", ["lightgreen", "strong"]);
-		} else if (slave.curatives === 1) {
-			makeSpan(c, "Prev", ["lightgreen", "strong"]);
-		}
-		if (slave.aphrodisiacs !== 0) {
-			if (slave.aphrodisiacs === 1) {
-				makeSpan(c, "Aph", ["lightblue", "strong"]);
-			} else if (slave.aphrodisiacs === 2) {
-				makeSpan(c, "Aph++", ["lightblue", "strong"]);
-			} else {
-				makeSpan(c, "Anaph", ["lightblue", "strong"]);
-			}
-		}
-		if (slave.addict !== 0) {
-			makeSpan(c, "Add", "cyan");
-		}
-		let styles = ["lightsalmon", "strong"];
-		if (slave.hormones > 1) {
-			makeSpan(c, "Ho:F+", styles);
-		} else if (slave.hormones > 0) {
-			makeSpan(c, "Ho:F", styles);
-		} else if (slave.hormones < -1) {
-			makeSpan(c, "Ho:M+", styles);
-		} else if (slave.hormones < 0) {
-			makeSpan(c, "Ho:M", styles);
-		}
-
-		styles = ["mediumseagreen", "strong"];
-		if ((slave.bellyImplant > -1)) {
-			makeSpan(c, "Belly Imp", styles);
-		} else if (((slave.preg <= -2) || (slave.ovaries === 0)) && (slave.vagina !== -1)) {
-			makeSpan(c, "Barr", styles);
-		} else if (slave.pubertyXX === 0 && (slave.ovaries === 1 || slave.mpreg === 1)) {
-			makeSpan(c, "Prepub", styles);
-		} else if (slave.ovaryAge >= 47 && (slave.ovaries === 1 || slave.mpreg === 1)) {
-			makeSpan(c, "Meno", styles);
-		} else if (slave.pregWeek < 0) {
-			makeSpan(c, "Postpartum", styles);
-		} else if (slave.preg === -1) {
-			makeSpan(c, "CC", styles);
-		} else if (slave.preg === 0 && (slave.ovaries === 1 || slave.mpreg === 1)) {
-			makeSpan(c, "Fert+", styles);
-		} else if (((slave.preg < slave.pregData.normalBirth / 10) && (slave.preg > 0) && slave.pregKnown === 0) || slave.pregWeek === 1) {
-			makeSpan(c, "Preg?", styles);
-		} else if ((slave.preg >= 36) && (slave.broodmother > 0)) {
-			makeSpan(c, "Perm preg", styles);
-		} else if (slave.pregKnown === 1) {
-			makeSpan(c, `${slave.pregWeek} wks preg`, styles);
-		}
-		if (slave.induce === 1) {
-			makeSpan(c, "Early Labor", ["orange", "strong"]);
-		}
-		if (slave.pubertyXY === 0 && slave.balls > 0) {
-			makeSpan(c, "Prepub balls", "strong");
-		}
-		if (slave.balls > 0 && slave.vasectomy === 1) {
-			makeSpan(c, "Vasect", "strong");
-		}
-		styles = ["springgreen", "strong"];
-		if (slave.inflation === 3) {
-			makeSpan(c, `8 ltr ${slave.inflationType}`, styles);
-		} else if (slave.inflation === 2) {
-			makeSpan(c, `4 ltr ${slave.inflationType}`, styles);
-		} else if (slave.inflation === 1) {
-			makeSpan(c, `2 ltr ${slave.inflationType}`, styles);
-		} else if (slave.bellyFluid > 0) {
-			makeSpan(c, `${slave.bellyFluid}ccs ${slave.inflationType}`, styles);
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function long_drugs(slave, c) {
-		let swd = WombGetLittersData(slave);
-		if ((slave.drugs !== "no drugs") && (slave.drugs !== "none")) {
-			makeSpan(c, `On ${slave.drugs}.`, "tan");
-		}
-		if (slave.curatives === 2) {
-			makeSpan(c, "On curatives.", "lightgreen");
-		} else if (slave.curatives === 1) {
-			makeSpan(c, "On preventatives.", "lightgreen");
-		}
-		if (slave.aphrodisiacs > 0) {
-			makeSpan(c, `On ${slave.aphrodisiacs > 1 ? 'extreme' : ''} aphrodisiacs.`, "lightblue");
-		} else if (slave.aphrodisiacs === -1) {
-			makeSpan(c, "On anaphrodisiacs.", "lightblue");
-		}
-		if (slave.addict !== 0) {
-			makeSpan(c, "Addict.", "cyan");
-		}
-		if (slave.hormones > 1) {
-			makeSpan(c, "Heavy female hormones.", "lightsalmon");
-		} else if (slave.hormones > 0) {
-			makeSpan(c, "Female hormones.", "lightsalmon");
-		} else if (slave.hormones < -1) {
-			makeSpan(c, "Heavy male hormones.", "lightsalmon");
-		} else if (slave.hormones < 0) {
-			makeSpan(c, "Male hormones.", "lightsalmon");
-		}
-		let styles = "mediumseagreen";
-		if ((slave.bellyImplant > -1)) {
-			makeSpan(c, "Belly Implant.", styles);
-		} else if ((slave.preg <= -2) && (slave.ovaries === 1 || slave.mpreg === 1)) {
-			makeSpan(c, "Barren.", styles);
-		} else if ((slave.ovaries === 0) && (slave.vagina !== -1) && (slave.genes === "XX")) {
-			makeSpan(c, "Barren.", styles);
-		} else if (slave.pubertyXX === 0 && (slave.ovaries === 1 || slave.mpreg === 1)) {
-			makeSpan(c, "Not ovulating yet.", styles);
-		} else if (slave.ovaryAge >= 47 && (slave.ovaries === 1 || slave.mpreg === 1)) {
-			makeSpan(c, "Menopausal.", styles);
-		} else if (slave.pregWeek < 0) {
-			makeSpan(c, "Postpartum.", styles);
-		} else if (slave.preg === -1) {
-			makeSpan(c, "On contraceptives.", styles);
-		} else if (slave.preg === 0 && (slave.ovaries === 1 || slave.mpreg === 1)) {
-			makeSpan(c, "Fertile.", styles);
-		} else if ((slave.preg >= 36) && (slave.broodmother > 0)) {
-			makeSpan(c, "Permanently pregnant.", styles);
-		} else if (swd.litters.length > 1) {
-			let pregTxt = `Concurrent pregnancies: (${swd.litters.length} sets).`;
-			pregTxt += ` Max:${swd.litters[0]} / Min:${swd.litters[swd.litters.length-1]} week(s).`;
-			makeSpan(c, pregTxt, "lime");
-		} else if (((slave.preg < slave.pregData.normalBirth / 10) && (slave.preg > 0) && slave.pregKnown === 0) || slave.pregWeek === 1) {
-			makeSpan(c, "May be pregnant.");
-		} else if (slave.pregKnown === 1) {
-			if (slave.pregType < 2 || slave.broodmother > 0) {
-				makeSpan(c, `${slave.pregWeek} weeks pregnant.`);
-			} else {
-				let desc = `${slave.pregWeek} weeks pregnant with `;
-				if (slave.pregType >= 40) {
-					desc += `a tremendous brood of offspring.`;
-				} else if (slave.pregType >= 20) {
-					desc += `a brood of offspring.`;
-				} else if (slave.pregType >= 10) {
-					desc += `${slave.pregType} babies.`;
-				} else if (slave.pregType === 9) {
-					desc += `nonuplets.`;
-				} else if (slave.pregType === 8) {
-					desc += `octuplets.`;
-				} else if (slave.pregType === 7) {
-					desc += `septuplets.`;
-				} else if (slave.pregType === 6) {
-					desc += `sextuplets.`;
-				} else if (slave.pregType === 5) {
-					desc += `quintuplets.`;
-				} else if (slave.pregType === 4) {
-					desc += `quadruplets.`;
-				} else if (slave.pregType === 3) {
-					desc += `triplets.`;
-				} else {
-					desc += `twins.`;
-				}
-				makeSpan(c, desc);
-			}
-			if (slave.preg > slave.pregData.normalBirth && slave.broodmother === 0) {
-				makeSpan(c, "(Overdue.)");
-			}
-		}
-		if (slave.induce === 1) {
-			makeSpan(c, "Showing signs of early labor.", "orange");
-		}
-		if (slave.pubertyXY === 0 && slave.balls > 0) {
-			makeSpan(c, "Has not had first ejaculation.");
-		}
-		if (slave.balls > 0 && slave.vasectomy === 1) {
-			makeSpan(c, "Vasectomy.");
-		}
-		if (slave.inflation === 3) {
-			makeSpan(c, `Filled with 8 liters of ${slave.inflationType}.`, "springgreen");
-		} else if (slave.inflation === 2) {
-			makeSpan(c, `Filled with 4 liters of ${slave.inflationType}.`, "springgreen");
-		} else if (slave.inflation === 1) {
-			makeSpan(c, `Filled with 2 liters of ${slave.inflationType}.`, "springgreen");
-		} else if (slave.bellyFluid > 0) {
-			makeSpan(c, `Stuffed with ${slave.bellyFluid}ccs of ${slave.inflationType}.`, "springgreen");
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @returns {string}
-	 */
-	function long_race(slave) {
-		switch (slave.race) {
-			case "white":
-				return `Caucasian.`;
-			case "asian":
-				return `Asian.`;
-			case "indo-aryan":
-				return `Indo-aryan.`;
-			case "latina":
-				return `Latina.`;
-			case "middle eastern":
-				return `Middle Eastern.`;
-			case "black":
-				return `Black.`;
-			case "pacific islander":
-				return `Pacific Islander.`;
-			case "malay":
-				return `Malay.`;
-			case "amerindian":
-				return `Amerindian.`;
-			case "semitic":
-				return `Semitic.`;
-			case "southern european":
-				return `Southern European.`;
-			case "mixed race":
-				return `Mixed race.`;
-			default:
-				return `${slave.race.charAt(0).toUpperCase() + slave.race.slice(1)}.`;
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @returns {string}
-	 */
-	function short_race(slave) {
-		switch (slave.race) {
-			case "white":
-				return `C`;
-			case "asian":
-				return `A`;
-			case "indo-aryan":
-				return `I`;
-			case "latina":
-				return `L`;
-			case "middle eastern":
-				return `ME`;
-			case "black":
-				return `B`;
-			case "pacific islander":
-				return `PI`;
-			case "malay":
-				return `M`;
-			case "amerindian":
-				return `AI`;
-			case "semitic":
-				return `S`;
-			case "southern european":
-				return `SE`;
-			case "mixed race":
-				return `MR`;
-			default:
-				return `${slave.race.charAt(0).toUpperCase() + slave.race.charAt(1) + slave.race.charAt(2)}`;
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @returns {string}
-	 */
-	function short_nationality(slave) {
-		switch (slave.nationality) {
-			case "Afghan":
-				return "Afg";
-			case "Albanian":
-				return "Alb";
-			case "Algerian":
-				return "Alg";
-			case "American":
-				return "USA";
-			case "Andorran":
-				return "And";
-			case "Angolan":
-				return "Ang";
-			case "Antiguan":
-				return "AB";
-			case "Argentinian":
-				return "Arg";
-			case "Armenian":
-				return "Arm";
-			case "Aruban":
-				return "Aru";
-			case "Australian":
-				return "Aus";
-			case "Austrian":
-				return "Aut";
-			case "Azerbaijani":
-				return "Aze";
-			case "Bahamian":
-				return "Bah";
-			case "Bahraini":
-				return "Bah";
-			case "Bangladeshi":
-				return "Bgd";
-			case "Barbadian":
-				return "Bar";
-			case "Belarusian":
-				return "Ber";
-			case "Belgian":
-				return "Bel";
-			case "Belizean":
-				return "Blz";
-			case "Beninese":
-				return "Ben";
-			case "Bermudian":
-				return "Bmd";
-			case "Bhutanese":
-				return "Bhu";
-			case "Bissau-Guinean":
-				return "GB";
-			case "Bolivian":
-				return "Bol";
-			case "Bosnian":
-				return "Bos";
-			case "Brazilian":
-				return "Bra";
-			case "British":
-				return "UK";
-			case "Bruneian":
-				return "Bru";
-			case "Bulgarian":
-				return "Bul";
-			case "Burkinabé":
-				return "BF";
-			case "Burmese":
-				return "Bur";
-			case "Burundian":
-				return "Bnd";
-			case "Cambodian":
-				return "Kam";
-			case "Cameroonian":
-				return "Cam";
-			case "Canadian":
-				return "Can";
-			case "Cape Verdean":
-				return "CV";
-			case "Catalan":
-				return "Cat";
-			case "Central African":
-				return "CAR";
-			case "Chadian":
-				return "Cha";
-			case "Chilean":
-				return "Chl";
-			case "Chinese":
-				return "Chi";
-			case "Colombian":
-				return "Col";
-			case "Comorian":
-				return "Com";
-			case "Congolese":
-				return "RC";
-			case "a Cook Islander":
-				return "CI";
-			case "Costa Rican":
-				return "CR";
-			case "Croatian":
-				return "Cro";
-			case "Cuban":
-				return "Cub";
-			case "Curaçaoan":
-				return "Cur";
-			case "Cypriot":
-				return "Cyp";
-			case "Czech":
-				return "Cze";
-			case "Danish":
-				return "Den";
-			case "Djiboutian":
-				return "Dji";
-			case "Dominican":
-				return "DR";
-			case "Dominiquais":
-				return "Dom";
-			case "Dutch":
-				return "Nld";
-			case "East Timorese":
-				return "ET";
-			case "Ecuadorian":
-				return "Ecu";
-			case "Egyptian":
-				return "Egy";
-			case "Emirati":
-				return "UAE";
-			case "Equatoguinean":
-				return "EG";
-			case "Eritrean":
-				return "Eri";
-			case "Estonian":
-				return "Est";
-			case "Ethiopian":
-				return "Eth";
-			case "Fijian":
-				return "Fij";
-			case "Filipina":
-				return "Phl";
-			case "Finnish":
-				return "Fin";
-			case "French":
-				return "Fra";
-			case "French Guianan":
-				return "FG";
-			case "French Polynesian":
-				return "FP";
-			case "Gabonese":
-				return "Gab";
-			case "Gambian":
-				return "Gam";
-			case "Georgian":
-				return "Geo";
-			case "German":
-				return "Ger";
-			case "Ghanan":
-				return "Gha";
-			case "Greek":
-				return "Gre";
-			case "Greenlandic":
-				return "Grn";
-			case "Grenadian":
-				return "Gda";
-			case "Guamanian":
-				return "Gua";
-			case "Guatemalan":
-				return "Gtm";
-			case "Guinean":
-				return "Gui";
-			case "Guyanese":
-				return "Guy";
-			case "Haitian":
-				return "Hai";
-			case "Honduran":
-				return "Hon";
-			case "Hungarian":
-				return "Hun";
-			case "I-Kiribati":
-				return "Kir";
-			case "Icelandic":
-				return "Ice";
-			case "Indian":
-				return "Ind";
-			case "Indonesian":
-				return "Idn";
-			case "Iranian":
-				return "Irn";
-			case "Iraqi":
-				return "Irq";
-			case "Irish":
-				return "Irl";
-			case "Israeli":
-				return "Isr";
-			case "Italian":
-				return "Ita";
-			case "Ivorian":
-				return "IC";
-			case "Jamaican":
-				return "Jam";
-			case "Japanese":
-				return "Jpn";
-			case "Jordanian":
-				return "Jor";
-			case "Kazakh":
-				return "Kaz";
-			case "Kenyan":
-				return "Ken";
-			case "Kittitian":
-				return "SKN";
-			case "Korean":
-				return "Kor";
-			case "Kosovan":
-				return "Kos";
-			case "Kurdish":
-				return "Kur";
-			case "Kuwaiti":
-				return "Kuw";
-			case "Kyrgyz":
-				return "Kyr";
-			case "Laotian":
-				return "Lao";
-			case "Latvian":
-				return "Lat";
-			case "Lebanese":
-				return "Lbn";
-			case "Liberian":
-				return "Lib";
-			case "Libyan":
-				return "Lby";
-			case "a Liechtensteiner":
-				return "Lie";
-			case "Lithuanian":
-				return "Lit";
-			case "Luxembourgian":
-				return "Lux";
-			case "Macedonian":
-				return "Mac";
-			case "Malagasy":
-				return "Mad";
-			case "Malawian":
-				return "Mwi";
-			case "Malaysian":
-				return "Mys";
-			case "Maldivian":
-				return "Mdv";
-			case "Malian":
-				return "Mal";
-			case "Maltese":
-				return "Mlt";
-			case "Marshallese":
-				return "MI";
-			case "Mauritanian":
-				return "Mta";
-			case "Mauritian":
-				return "Mts";
-			case "Mexican":
-				return "Mex";
-			case "Micronesian":
-				return "FSM";
-			case "Moldovan":
-				return "Mol";
-			case "Monégasque":
-				return "Mnc";
-			case "Mongolian":
-				return "Mon";
-			case "Montenegrin":
-				return "Mng";
-			case "Moroccan":
-				return "Mor";
-			case "Mosotho":
-				return "Les";
-			case "Motswana":
-				return "Bot";
-			case "Mozambican":
-				return "Moz";
-			case "Namibian":
-				return "Nam";
-			case "Nauruan":
-				return "Nau";
-			case "Nepalese":
-				return "Npl";
-			case "New Caledonian":
-				return "NC";
-			case "a New Zealander":
-				return "NZ";
-			case "Ni-Vanuatu":
-				return "Van";
-			case "Nicaraguan":
-				return "Nic";
-			case "Nigerian":
-				return "Nga";
-			case "Nigerien":
-				return "Ngr";
-			case "Niuean":
-				return "Niu";
-			case "Norwegian":
-				return "Nor";
-			case "Omani":
-				return "Omn";
-			case "Pakistani":
-				return "Pak";
-			case "Palauan":
-				return "Plu";
-			case "Palestinian":
-				return "Pal";
-			case "Panamanian":
-				return "Pan";
-			case "Papua New Guinean":
-				return "PNG";
-			case "Paraguayan":
-				return "Par";
-			case "Peruvian":
-				return "Per";
-			case "Polish":
-				return "Pol";
-			case "Portuguese":
-				return "Por";
-			case "Puerto Rican":
-				return "PR";
-			case "Qatari":
-				return "Qat";
-			case "Romanian":
-				return "Rom";
-			case "Russian":
-				return "Rus";
-			case "Rwandan":
-				return "Rwa";
-			case "Sahrawi":
-				return "Sah";
-			case "Saint Lucian":
-				return "SL";
-			case "Salvadoran":
-				return "ES";
-			case "Sammarinese":
-				return "SM";
-			case "Samoan":
-				return "Sam";
-			case "São Toméan":
-				return "STP";
-			case "Saudi":
-				return "Sau";
-			case "Scottish":
-				return "Sco";
-			case "Senegalese":
-				return "Sen";
-			case "Serbian":
-				return "Srb";
-			case "Seychellois":
-				return "Sey";
-			case "Sierra Leonean":
-				return "Sie";
-			case "Singaporean":
-				return "Sng";
-			case "Slovak":
-				return "Svk";
-			case "Slovene":
-				return "Svn";
-			case "a Solomon Islander":
-				return "SI";
-			case "Somali":
-				return "Som";
-			case "South African":
-				return "RSA";
-			case "South Sudanese":
-				return "SS";
-			case "Spanish":
-				return "Spa";
-			case "Sri Lankan":
-				return "Sri";
-			case "Sudanese":
-				return "Sud";
-			case "Surinamese":
-				return "Sur";
-			case "Swazi":
-				return "Swa";
-			case "Swedish":
-				return "Swe";
-			case "Swiss":
-				return "Swi";
-			case "Syrian":
-				return "Syr";
-			case "Taiwanese":
-				return "Tai";
-			case "Tajik":
-				return "Taj";
-			case "Tanzanian":
-				return "Tza";
-			case "Thai":
-				return "Tha";
-			case "Tibetan":
-				return "Tib";
-			case "Togolese":
-				return "Tog";
-			case "Tongan":
-				return "Ton";
-			case "Trinidadian":
-				return "TT";
-			case "Tunisian":
-				return "Tun";
-			case "Turkish":
-				return "Tur";
-			case "Turkmen":
-				return "Tkm";
-			case "Tuvaluan":
-				return "Tuv";
-			case "Ugandan":
-				return "Uga";
-			case "Ukrainian":
-				return "Ukr";
-			case "Uruguayan":
-				return "Uru";
-			case "Uzbek":
-				return "Uzb";
-			case "Vatican":
-				return "VC";
-			case "Venezuelan":
-				return "Ven";
-			case "Vietnamese":
-				return "Vnm";
-			case "Vincentian":
-				return "SVG";
-			case "Yemeni":
-				return "Yem";
-			case "Zairian":
-				return "DRC";
-			case "Zambian":
-				return "Zam";
-			case "Zimbabwean":
-				if (slave.race === "white") {
-					return `Rho`;
-				} else {
-					return `Zwe`;
-				}
-			case "Ancient Chinese Revivalist":
-				return `Chi Rev`;
-			case "Ancient Egyptian Revivalist":
-				return `Egy Rev`;
-			case "Arabian Revivalist":
-				return `Ara Rev`;
-			case "Aztec Revivalist":
-				return `Azt Rev`;
-			case "Edo Revivalist":
-				return `Edo Rev`;
-			case "Roman Revivalist":
-				return `Rom Rev`;
-			case "":
-			case "none":
-			case "slave":
-			case "Stateless":
-				return "None";
-			default:
-				return `${slave.nationality.charAt(0) + slave.nationality.charAt(1) + slave.nationality.charAt(2)}`;
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @returns {string}
-	 */
-	function long_nationality(slave) {
-		switch (slave.nationality) {
-			case "a Cook Islander":
-				return `Cook Islander.`;
-			case "a Liechtensteiner":
-				return `Liechtensteiner.`;
-			case "a New Zealander":
-				return `New Zealander.`;
-			case "a Solomon Islander":
-				return `Solomon Islander.`;
-			case "Zimbabwean":
-				if (slave.race === "white") {
-					return `Rhodesian.`;
-				} else {
-					return `${slave.nationality}.`;
-				}
-			case "slave":
-			case "none":
-			case "":
-			case "Stateless":
-				return `Stateless.`;
-			default:
-				return `${slave.nationality}.`;
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @returns {string}
-	 */
-	function short_skin(slave) {
-		switch (slave.skin) {
-			case "pure white":
-				return `P. Whi`;
-			case "extremely fair":
-				return `E. Fai`;
-			case "very fair":
-				return `V. Fai`;
-			case "extremely pale":
-				return `E. Pal`;
-			case "very pale":
-				return `V. Pal`;
-			case "light brown":
-				return `L. Br`;
-			case "dark brown":
-				return `D. Br`;
-			case "light olive":
-				return `L. Oli`;
-			case "dark olive":
-				return `D. Oli`;
-			case "light beige":
-				return `L. Bei`;
-			case "dark beige":
-				return `D. Bei`;
-			case "tan":
-				return `Tan`;
-			case "bronze":
-				return `Bron`;
-			case "ebony":
-				return `Ebon`;
-			case "pure black":
-				return `P. Bla`;
-			case "dark":
-			case "fair":
-			case "pale":
-				return `${slave.skin.charAt(0).toUpperCase() + slave.skin.slice(1)}`;
-			default:
-				return `${slave.skin.charAt(0).toUpperCase() + slave.skin.charAt(1) + slave.skin.charAt(2)}`;
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function short_genitals(slave, c) {
-		if (slave.dick > 0) {
-			let dickDesc = "";
-			if (slave.balls === 0) {
-				dickDesc += `Geld`;
-			}
-			if ((slave.dick > 8) && (slave.balls > 8)) {
-				dickDesc += `Junk+++`;
-			} else if ((slave.dick > 5) && (slave.balls > 5)) {
-				dickDesc += `Junk++`;
-			} else if ((slave.dick > 4) && (slave.balls > 4)) {
-				dickDesc += `Junk+`;
-			} else if ((slave.dick > 3) && (slave.balls > 3)) {
-				dickDesc += `Junk`;
-			} else if (slave.dick > 8) {
-				dickDesc += `Dick+++`;
-			} else if (slave.dick > 5) {
-				dickDesc += `Dick++`;
-			} else if (slave.dick > 4) {
-				dickDesc += `Dick+`;
-			} else if (slave.dick > 3) {
-				dickDesc += `Dick`;
-			} else if (slave.balls > 10) {
-				dickDesc += `Balls+++`;
-			} else if (slave.balls > 5) {
-				dickDesc += `Balls++`;
-			} else if (slave.balls > 4) {
-				dickDesc += `Balls+`;
-			} else if (slave.balls > 3) {
-				dickDesc += `Balls`;
-			}
-			if (dickDesc.length) {
-				makeSpan(c, dickDesc, "pink");
-			}
-		}
-		if (slave.vagina === 0) {
-			makeSpan(c, "VV", "lime");
-		} else if ((slave.pregKnown === 1) && canWalk(slave) && (slave.clothes === "no clothing" || slave.clothes === "body oil") && (slave.shoes === "none")) {
-			makeSpan(c, "NBP", "pink");
-		}
-		if (slave.anus === 0) {
-			makeSpan(c, "AV", "lime");
-		}
-		let holesDesc = "";
-		if ((slave.vagina > 3) && (slave.anus > 3)) {
-			holesDesc += `V++A++`;
-		} else if ((slave.vagina > 2) && (slave.anus > 2)) {
-			holesDesc += `V+A+`;
-		} else if (slave.vagina > 3) {
-			holesDesc += `V++`;
-		} else if (slave.vagina > 2) {
-			holesDesc += `V+`;
-		} else if (slave.anus > 3) {
-			holesDesc += `A++`;
-		} else if (slave.anus > 2) {
-			holesDesc += `A+`;
-		}
-		if (holesDesc.length) {
-			makeSpan(c, holesDesc, "pink");
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function long_genitals(slave, c) {
-		if (slave.dick > 0) {
-			let dickDesc = "";
-			if (slave.balls === 0) {
-				dickDesc += 'Gelded.';
-			}
-			if ((slave.dick > 8) && (slave.balls > 8)) {
-				dickDesc += `Hyper dick & balls.`;
-			} else if ((slave.dick > 5) && (slave.balls > 5)) {
-				dickDesc += `Monster dick & balls.`;
-			} else if ((slave.dick > 4) && (slave.balls > 4)) {
-				dickDesc = `Huge dick & balls.`;
-			} else if ((slave.dick > 3) && (slave.balls > 3)) {
-				dickDesc = `Big dick & balls.`;
-			} else if (slave.dick > 8) {
-				dickDesc = `Hyper dong.`;
-			} else if (slave.dick > 5) {
-				dickDesc = `Monster dong.`;
-			} else if (slave.dick > 4) {
-				dickDesc = `Huge dick.`;
-			} else if (slave.dick > 3) {
-				dickDesc = `Big dick.`;
-			} else if (slave.balls > 8) {
-				dickDesc = `Hyper balls.`;
-			} else if (slave.balls > 5) {
-				dickDesc = `Monstrous balls.`;
-			} else if (slave.balls > 4) {
-				dickDesc = `Huge balls.`;
-			} else if (slave.balls > 3) {
-				dickDesc = `Big balls.`;
-			}
-			if (dickDesc.length) {
-				makeSpan(c, dickDesc, "pink");
-			}
-		}
-		if (slave.vagina === 0) {
-			makeSpan(c, "Virgin.", "lime");
-		} else if ((slave.pregKnown === 1) && canWalk(slave) && (slave.clothes === "no clothing" || slave.clothes === "body oil") && (slave.shoes === "none")) {
-			makeSpan(c, "Naked, barefoot, and pregnant.", "pink");
-		}
-		if (slave.anus === 0) {
-			makeSpan(c, "Anal virgin.", "lime");
-		}
-		let holesDesc = "";
-		if ((slave.vagina > 3) && (slave.anus > 3)) {
-			holesDesc += `Blown out holes.`;
-		} else if ((slave.vagina > 2) && (slave.anus > 2)) {
-			holesDesc += `High mileage.`;
-		} else if (slave.vagina > 3) {
-			holesDesc += `Cavernous pussy.`;
-		} else if (slave.vagina > 2) {
-			holesDesc += `Loose pussy.`;
-		} else if (slave.anus > 3) {
-			holesDesc += `Permagaped anus.`;
-		} else if (slave.anus > 2) {
-			holesDesc += `Gaping anus.`;
-		}
-		if (holesDesc.length) {
-			makeSpan(c, holesDesc, "pink");
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function short_age(slave, c) {
-		let r = makeSpan(c, "", "pink");
-		if (V.showAgeDetail === 1) {
-			r.textContent += slave.actualAge.toString();
-		} else if (slave.actualAge >= 40) {
-			r.textContent += "40s";
-		} else if (slave.actualAge >= 35) {
-			r.textContent += "Lt30s";
-		} else if (slave.actualAge >= 30) {
-			r.textContent += "Ea30s";
-		} else if (slave.actualAge >= 25) {
-			r.textContent += "Lt20s";
-		} else if (slave.actualAge >= 20) {
-			r.textContent += "Ea20s";
-		} else if (slave.actualAge >= 18) {
-			r.textContent += slave.actualAge.toString();
-		}
-		if (slave.actualAge !== slave.physicalAge) {
-			r.textContent += ` w ${slave.physicalAge}y-bdy`;
-		}
-		if (slave.visualAge !== slave.physicalAge) {
-			r.textContent += ` Lks${slave.visualAge}`;
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function short_face(slave, c) {
-		if (slave.face < -95) {
-			makeSpan(c, "Face---", "red", true, slave.face);
-		} else if (slave.face < -40) {
-			makeSpan(c, "Face--", "red", true, slave.face);
-		} else if (slave.face < -10) {
-			makeSpan(c, "Face-", "red", true, slave.face);
-		} else if (slave.face <= 10) {
-			makeSpan(c, "Face", null, true, slave.face);
-		} else if (slave.face <= 40) {
-			makeSpan(c, "Face+", "pink", true, slave.face);
-		} else if (slave.face <= 95) {
-			makeSpan(c, "Face++", "pink", true, slave.face);
-		} else {
-			makeSpan(c, "Face+++", "pink", true, slave.face);
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function short_eyes(slave, c) {
-		if (!canSee(slave)) {
-			makeSpan(c, "Blind", "red");
-		} else if (!canSeePerfectly(slave)) {
-			makeSpan(c, "Sight-", "yellow");
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function short_ears(slave, c) {
-		if (slave.hears === -2) {
-			makeSpan(c, "Deaf", "red");
-		} else if ((slave.hears === -1) && (slave.earwear !== "hearing aids")) {
-			makeSpan(c, "Hearing-", "yellow");
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function short_lips(slave, c) {
-		if (slave.lips > 95) {
-			makeSpan(c, "Facepussy");
-		} else if (slave.lips > 70) {
-			makeSpan(c, "Lips+++", null, true, slave.lips);
-		} else if (slave.lips > 40) {
-			makeSpan(c, "Lips++", null, true, slave.lips);
-		} else if (slave.lips > 20) {
-			makeSpan(c, "Lips+", null, true, slave.lips);
-		} else if (slave.lips > 10) {
-			makeSpan(c, "Lips", null, true, slave.lips);
-		} else {
-			makeSpan(c, "Lips-", "red", true, slave.lips);
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function short_teeth(slave, c) {
-		if (slave.teeth === "crooked") {
-			makeSpan(c, "Cr Teeth", "yellow");
-		} else if (slave.teeth === "gapped") {
-			makeSpan(c, "Gap", "yellow");
-		} else if (slave.teeth === "cosmetic braces") {
-			makeSpan(c, `Cos Braces`);
-		} else if (slave.teeth === "straightening braces") {
-			makeSpan(c, `Braces`);
-		} else if (slave.teeth === "removable") {
-			makeSpan(c, `Rem Teeth`);
-		} else if (slave.teeth === "pointy") {
-			makeSpan(c, `Fangs`);
-		} else if (slave.teeth === "baby") {
-			makeSpan(c, `Baby`);
-		} else if (slave.teeth === "mixed") {
-			makeSpan(c, `Mixed`);
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function short_muscles(slave, c) {
-		if (slave.muscles > 95) {
-			makeSpan(c, "Musc++", undefined, true, slave.muscles);
-		} else if (slave.muscles > 50) {
-			makeSpan(c, "Musc+", undefined, true, slave.muscles);
-		} else if (slave.muscles > 30) {
-			makeSpan(c, "Fit", undefined, true, slave.muscles);
-		} else if (slave.muscles > 5) {
-			makeSpan(c, "Toned", undefined, true, slave.muscles);
-		} else if (slave.muscles > -6) {
-			makeSpan(c, "Soft", undefined, true, slave.muscles);
-		} else if (slave.muscles > -31) {
-			if (V.arcologies[0].FSPhysicalIdealist === "unset") {
-				makeSpan(c, "Weak", "red", true, slave.muscles);
-			} else {
-				makeSpan(c, "Soft", undefined, true, slave.muscles);
-			}
-		} else if (slave.muscles > -96) {
-			if (V.arcologies[0].FSPhysicalIdealist === "unset") {
-				makeSpan(c, "Weak+", "red", true, slave.muscles);
-			} else {
-				makeSpan(c, "Soft+", undefined, true, slave.muscles);
-			}
-		} else {
-			makeSpan(c, "Weak++", "red", true, slave.muscles);
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function short_voice(slave, c) {
-		if (slave.voice === 0) {
-			makeSpan(c, "Mute", "red");
-		} else {
-			if (slave.accent === 3) {
-				makeSpan(c, "Acc--", "red");
-			} else if (slave.accent === 2) {
-				makeSpan(c, "Acc-");
-			} else if (slave.accent === 4) {
-				makeSpan(c, "Acc--");
-			} else if (slave.accent === 1) {
-				makeSpan(c, "Acc", "pink");
-			}
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function short_tits_ass(slave, c) {
-		let styles = "pink";
-		if ((slave.boobs >= 12000) && (slave.butt > 9)) {
-			makeSpan(c, "T&A+++", styles);
-		} else if ((slave.boobs > 4000) && (slave.butt > 8)) {
-			makeSpan(c, "T&A++", styles);
-		} else if ((slave.boobs > 2000) && (slave.butt > 6)) {
-			makeSpan(c, "T&A+", styles);
-		} else if ((slave.boobs > 800) && (slave.butt > 4)) {
-			makeSpan(c, "T&A", styles);
-		} else if ((slave.boobs < 500) && (slave.butt < 3) && (slave.weight <= 10) && (slave.muscles <= 30)) {
-			makeSpan(c, "Girlish", styles);
-		} else if (slave.boobs >= 12000) {
-			makeSpan(c, "Boobs+++", styles);
-		} else if (slave.boobs > 4000) {
-			makeSpan(c, "Boobs++", styles);
-		} else if (slave.boobs > 2000) {
-			makeSpan(c, "Boobs+", styles);
-		} else if (slave.boobs > 800) {
-			makeSpan(c, "Boobs", styles);
-		} else if (slave.butt > 9) {
-			makeSpan(c, "Ass+++", styles);
-		} else if (slave.butt > 8) {
-			makeSpan(c, "Ass++", styles);
-		} else if (slave.butt > 6) {
-			makeSpan(c, "Ass+", styles);
-		} else if (slave.butt > 4) {
-			makeSpan(c, "Ass", styles);
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function short_hips(slave, c) {
-		let desc = "";
-		if (slave.hips < -1) {
-			if (slave.butt > 2 && (V.arcologies[0].FSTransformationFetishist < 20 || V.arcologies[0].FSTransformationFetishist === "unset") && (V.arcologies[0].FSHedonisticDecadence < 20 || V.arcologies[0].FSHedonisticDecadence === "unset")) {
-				desc = `Disp+`;
-			}
-		} else if (slave.hips < 0) {
-			if (slave.butt > 4 && (V.arcologies[0].FSTransformationFetishist < 20 || V.arcologies[0].FSTransformationFetishist === "unset") && (V.arcologies[0].FSHedonisticDecadence < 20 || V.arcologies[0].FSHedonisticDecadence === "unset")) {
-				desc = `Disp+`;
-			}
-		} else if (slave.hips > 2) {
-			if (slave.butt <= 8) {
-				desc = `Disp-`;
-			}
-		} else if (slave.hips > 1) {
-			if (slave.butt <= 3 && (V.arcologies[0].FSSlimnessEnthusiast === "unset" || (slave.boobs >= 500))) {
-				desc = `Disp-`;
-			}
-		} else if (slave.hips > 0) {
-			if (slave.butt > 8) {
-				if ((V.arcologies[0].FSTransformationFetishist < 20 || V.arcologies[0].FSTransformationFetishist === "unset") && (V.arcologies[0].FSHedonisticDecadence < 20 || V.arcologies[0].FSHedonisticDecadence === "unset")) {
-					desc = `Disp+`;
-				}
-			} else if (slave.butt <= 2 && (V.arcologies[0].FSSlimnessEnthusiast === "unset" || (slave.boobs >= 500))) {
-				desc = `Disp-`;
-			}
-		} else {
-			if (slave.butt > 6) {
-				if ((V.arcologies[0].FSTransformationFetishist < 20 || V.arcologies[0].FSTransformationFetishist === "unset") && (V.arcologies[0].FSHedonisticDecadence < 20 || V.arcologies[0].FSHedonisticDecadence === "unset")) {
-					desc = `Disp+`;
-				}
-			} else if (slave.butt <= 1 && (V.arcologies[0].FSSlimnessEnthusiast === "unset" || (slave.boobs >= 500))) {
-				desc = `Disp-`;
-			}
-		}
-		if (desc) {
-			makeSpan(c, desc, "red");
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function short_waist(slave, c) {
-		if (slave.waist > 95) {
-			makeSpan(c, "Wst---", "red", false, slave.waist);
-		} else if (slave.waist > 40) {
-			makeSpan(c, "Wst--", "red", false, slave.waist);
-		} else if (slave.waist > 10) {
-			makeSpan(c, "Wst-", "red", false, slave.waist);
-		} else if (slave.waist >= -10) {
-			makeSpan(c, "Wst", undefined, false, slave.waist);
-		} else if (slave.waist >= -40) {
-			makeSpan(c, "Wst+", "pink", false, slave.waist);
-		} else if (slave.waist >= -95) {
-			makeSpan(c, "Wst++", "pink", false, slave.waist);
-		} else {
-			makeSpan(c, "Wst+++", "pink", false, slave.waist);
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function short_implants(slave, c) {
-		if ((slave.boobsImplant === 0) && (slave.buttImplant === 0) && (slave.waist >= -95) && (slave.lipsImplant === 0) && (slave.faceImplant <= 5) && (slave.bellyImplant === -1)) {
-			makeSpan(c, "Natr", "pink");
-		} else {
-			makeSpan(c, "Impl", "pink");
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function short_lactation(slave, c) {
-		if (slave.lactation === 1) {
-			makeSpan(c, "Lact", "pink");
-		} else if (slave.lactation === 2) {
-			makeSpan(c, "Lact", "pink");
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function short_mods(slave, c) {
-		V.modScore = SlaveStatsChecker.modScore(slave);
-		if (slave.corsetPiercing === 0 && V.piercingScore < 3 && V.tatScore < 2) {
-			return;
-		} else if (V.modScore > 15 || (V.piercingScore > 8 && V.tatScore > 5)) {
-			makeSpan(c, "Mods++");
-		} else if (V.modScore > 7) {
-			makeSpan(c, "Mods+");
-		} else {
-			makeSpan(c, "Mods");
-		}
-		if (!jQuery.isEmptyObject(slave.brand)) {
-			makeSpan(c, "Br");
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function long_age(slave, c) {
-		let r = makeSpan(c, "", "pink");
-		if (V.showAgeDetail === 1) {
-			r.textContent += `Age ` + `${slave.actualAge}` + `.`;
-		} else if (slave.actualAge >= 40) {
-			r.textContent += `Forties.`;
-		} else if (slave.actualAge >= 35) {
-			r.textContent += `Late thirties.`;
-		} else if (slave.actualAge >= 30) {
-			r.textContent += `Early thirties.`;
-		} else if (slave.actualAge >= 25) {
-			r.textContent += `Late twenties.`;
-		} else if (slave.actualAge >= 20) {
-			r.textContent += `Early twenties.`;
-		} else if (slave.actualAge >= 19) {
-			r.textContent += `Nineteen.`;
-		} else if (slave.actualAge >= 18) {
-			r.textContent += `Eighteen.`;
-		} else {
-			r.textContent += `Underage.`;
-		}
-		/*
-		 ** No NCS, then do the standard, However because of the wrinkles of Incubators, as long as visual age is greater
-		 ** than or equal to physical age, we do the old physical body/Looks for fresh out of the can NCS slaves.
-		 */
-		if (((slave.geneMods.NCS === 0) || (slave.visualAge >= slave.physicalAge))) {
-			if (slave.actualAge !== slave.physicalAge) {
-				r.textContent += ` ${slave.physicalAge}` + ` year old body.`;
-			}
-			if (slave.visualAge !== slave.physicalAge) {
-				r.textContent += ` Looks ` + `${slave.visualAge}` + `.`;
-			}
-		} else {
-			/*
-			 ** Now the rub. The use of physical Age for the year old body above, basically conflicts with the changes
-			 ** that NCS introduces, so here to *distinguish* the changes, we use visual age with the 'year old body'
-			 ** and appears, for example: Slave release from incubator at age 10, Her summary would show, 'Age 0. 10
-			 ** year old body.' But if she's given NCS a few weeks after release, while she's still before her first
-			 ** birthday, it'll appear the same. But once her birthday fires, if we ran with the above code it would
-			 ** say: 'Age 1. 11 year old body.' -- this conflicts with the way NCS works though, because she hasn't
-			 ** visually aged, so our change here makes it say 'Age 1. Appears to have a 10 year old body.'
-			 */
-			r.textContent += ` Appears to have a ` + `${slave.visualAge}` + ` year old body.`;
-		}
-		if (slave.geneMods.NCS === 1) {
-			makeSpan(r, "NCS", "orange");
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function long_face(slave, c) {
-		if (slave.face < -95) {
-			makeSpan(c, `Very ugly ${slave.faceShape} face`, "red", true, slave.face);
-		} else if (slave.face < -40) {
-			makeSpan(c, `Ugly ${slave.faceShape} face`, "red", true, slave.face);
-		} else if (slave.face < -10) {
-			makeSpan(c, `Unattractive ${slave.faceShape} face`, "red", true, slave.face);
-		} else if (slave.face <= 10) {
-			makeSpan(c, `Average ${slave.faceShape} face`, null, true, slave.face);
-		} else if (slave.face <= 40) {
-			makeSpan(c, `Attractive ${slave.faceShape} face`, "pink", true, slave.face);
-		} else if (slave.face <= 95) {
-			makeSpan(c, `Beautiful ${slave.faceShape} face`, "pink", true, slave.face);
-		} else {
-			makeSpan(c, `Very beautiful ${slave.faceShape} face`, "pink", true, slave.face);
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function long_eyes(slave, c) {
-		if (!canSee(slave)) {
-			makeSpan(c, "Blind.", "red");
-		} else if (!canSeePerfectly(slave)) {
-			makeSpan(c, "Nearsighted.", "yellow");
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function long_ears(slave, c) {
-		if (slave.hears <= -2) {
-			makeSpan(c, "Deaf.", "red");
-		} else if ((slave.hears === -1) && (slave.earwear !== "hearing aids")) {
-			makeSpan(c, "Hard of hearing.", "yellow");
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function long_lips(slave, c) {
-		if (slave.lips > 95) {
-			makeSpan(c, "Facepussy", undefined, true, slave.lips);
-		} else if (slave.lips > 70) {
-			makeSpan(c, "Huge lips", undefined, true, slave.lips);
-		} else if (slave.lips > 40) {
-			makeSpan(c, "Big lips", undefined, true, slave.lips);
-		} else if (slave.lips > 20) {
-			makeSpan(c, "Pretty lips", undefined, true, slave.lips);
-		} else if (slave.lips > 10) {
-			makeSpan(c, "Normal lips", undefined, true, slave.lips);
-		} else {
-			makeSpan(c, "Thin lips", "red", true, slave.lips);
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function long_teeth(slave, c) {
-		if (slave.teeth === "crooked") {
-			makeSpan(c, "Crooked teeth.", "yellow");
-		} else if (slave.teeth === "gapped") {
-			makeSpan(c, "Tooth gap.", "yellow");
-		} else if (slave.teeth === "cosmetic braces") {
-			makeSpan(c, "Cosmetic braces.");
-		} else if (slave.teeth === "straightening braces") {
-			makeSpan(c, "Braces.");
-		} else if (slave.teeth === "removable") {
-			makeSpan(c, "Removable teeth.");
-		} else if (slave.teeth === "pointy") {
-			makeSpan(c, "Sharp fangs.");
-		} else if (slave.teeth === "baby") {
-			makeSpan(c, "Baby teeth.");
-		} else if (slave.teeth === "mixed") {
-			makeSpan(c, "Mixed teeth.");
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function long_muscles(slave, c) {
-		if (slave.muscles > 95) {
-			makeSpan(c, "Hugely muscular", undefined, true, slave.muscles);
-		} else if (slave.muscles > 50) {
-			makeSpan(c, "Muscular", undefined, true, slave.muscles);
-		} else if (slave.muscles > 30) {
-			makeSpan(c, "Fit", undefined, true, slave.muscles);
-		} else if (slave.muscles > 5) {
-			makeSpan(c, "Toned", undefined, true, slave.muscles);
-		} else if (slave.muscles > -6) {
-			makeSpan(c, "Soft", undefined, true, slave.muscles);
-		} else if (slave.muscles > -31) {
-			if (V.arcologies[0].FSPhysicalIdealist === "unset") {
-				makeSpan(c, "Weak", "red", true, slave.muscles);
-			} else {
-				makeSpan(c, "Weak", undefined, true, slave.muscles);
-			}
-		} else if (slave.muscles > -96) {
-			if (V.arcologies[0].FSPhysicalIdealist === "unset") {
-				makeSpan(c, "Very weak", "red", true, slave.muscles);
-			} else {
-				makeSpan(c, "Very weak", undefined, true, slave.muscles);
-			}
-		} else {
-			makeSpan(c, "Frail", "red", true, slave.muscles);
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function long_voice(slave, c) {
-		if (slave.voice === 0) {
-			makeSpan(c, "Mute.", "red");
-		} else {
-			if (slave.accent === 3) {
-				makeSpan(c, "Bad accent.", "red");
-			} else if (slave.accent === 4) {
-				makeSpan(c, "No language skills.", "red");
-			} else if (slave.accent === 2) {
-				makeSpan(c, "Accent.");
-			} else if (slave.accent === 1) {
-				makeSpan(c, "Cute accent.", "pink");
-			}
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function long_tits_ass(slave, c) {
-		const styles = "pink";
-		if ((slave.boobs >= 12000) && (slave.butt > 9)) {
-			makeSpan(c, "Hyper T&A.", styles);
-		} else if ((slave.boobs > 4000) && (slave.butt > 8)) {
-			makeSpan(c, "Enormous T&A.", styles);
-		} else if ((slave.boobs > 2000) && (slave.butt > 6)) {
-			makeSpan(c, "Huge T&A.", styles);
-		} else if ((slave.boobs > 800) && (slave.butt > 4)) {
-			makeSpan(c, "Big T&A.", styles);
-		} else if ((slave.boobs < 500) && (slave.butt < 3) && (slave.weight <= 10) && (slave.muscles <= 30)) {
-			makeSpan(c, "Girlish figure.", styles);
-		} else if (slave.boobs >= 12000) {
-			makeSpan(c, "Immobilizing tits.", styles);
-		} else if (slave.boobs > 4000) {
-			makeSpan(c, "Monstrous tits.", styles);
-		} else if (slave.boobs > 2000) {
-			makeSpan(c, "Huge tits.", styles);
-		} else if (slave.boobs > 800) {
-			makeSpan(c, "Big tits.", styles);
-		} else if (slave.butt > 9) {
-			makeSpan(c, "Hyper ass.", styles);
-		} else if (slave.butt > 8) {
-			makeSpan(c, "Titanic ass.", styles);
-		} else if (slave.butt > 6) {
-			makeSpan(c, "Huge ass.", styles);
-		} else if (slave.butt > 4) {
-			makeSpan(c, "Big ass.", styles);
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function long_hips(slave, c) {
-		const styles = "red";
-		if (slave.hips < -1) {
-			if (slave.butt > 2 && (V.arcologies[0].FSTransformationFetishist < 20 || V.arcologies[0].FSTransformationFetishist === "unset") && (V.arcologies[0].FSHedonisticDecadence < 20 || V.arcologies[0].FSHedonisticDecadence === "unset") && (V.arcologies[0].FSAssetExpansionist < 20 || V.arcologies[0].FSAssetExpansionist === "unset") && (V.arcologies[0].FSIntellectualDependencyLawBeauty === 0)) {
-				makeSpan(c, "Disproportionately big butt.", styles);
-			}
-		} else if (slave.hips < 0) {
-			if (slave.butt > 4 && (V.arcologies[0].FSTransformationFetishist < 20 || V.arcologies[0].FSTransformationFetishist === "unset") && (V.arcologies[0].FSHedonisticDecadence < 20 || V.arcologies[0].FSHedonisticDecadence === "unset") && (V.arcologies[0].FSAssetExpansionist < 20 || V.arcologies[0].FSAssetExpansionist === "unset") && (V.arcologies[0].FSIntellectualDependencyLawBeauty === 0)) {
-				makeSpan(c, "Disproportionately big butt.", styles);
-			}
-		} else if (slave.hips > 2) {
-			if (slave.butt <= 8) {
-				makeSpan(c, "Disproportionately small butt.", styles);
-			}
-		} else if (slave.hips > 1) {
-			if (slave.butt <= 3 && ((V.arcologies[0].FSSlimnessEnthusiast === "unset") || (slave.boobs >= 500))) {
-				makeSpan(c, "Disproportionately small butt.", styles);
-			}
-		} else if (slave.hips > 0) {
-			if (slave.butt > 8) {
-				if ((V.arcologies[0].FSTransformationFetishist < 20 || V.arcologies[0].FSTransformationFetishist === "unset") && (V.arcologies[0].FSHedonisticDecadence < 20 || V.arcologies[0].FSHedonisticDecadence === "unset") && (V.arcologies[0].FSAssetExpansionist < 20 || V.arcologies[0].FSAssetExpansionist === "unset") && (V.arcologies[0].FSIntellectualDependencyLawBeauty === 0)) {
-					makeSpan(c, "Disproportionately big butt.", styles);
-				}
-			} else if (slave.butt <= 2 && ((V.arcologies[0].FSSlimnessEnthusiast === "unset") || (slave.boobs >= 500))) {
-				makeSpan(c, "Disproportionately small butt.", styles);
-			}
-		} else {
-			if (slave.butt > 6) {
-				if ((V.arcologies[0].FSTransformationFetishist < 20 || V.arcologies[0].FSTransformationFetishist === "unset") && (V.arcologies[0].FSHedonisticDecadence < 20 || V.arcologies[0].FSHedonisticDecadence === "unset") && (V.arcologies[0].FSAssetExpansionist < 20 || V.arcologies[0].FSAssetExpansionist === "unset") && (V.arcologies[0].FSIntellectualDependencyLawBeauty === 0)) {
-					makeSpan(c, "Disproportionately big butt.", styles);
-				}
-			} else if (slave.butt <= 1 && ((V.arcologies[0].FSSlimnessEnthusiast === "unset") || (slave.boobs >= 500))) {
-				makeSpan(c, "Disproportionately small butt.", styles);
-			}
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function long_waist(slave, c) {
-		if (slave.waist > 95) {
-			makeSpan(c, "Masculine waist", "red", true, slave.waist);
-		} else if (slave.waist > 40) {
-			makeSpan(c, "Ugly waist", "red", true, slave.waist);
-		} else if (slave.waist > 10) {
-			makeSpan(c, "Unattractive waist", "red", true, slave.waist);
-		} else if (slave.waist >= -10) {
-			makeSpan(c, "Average waist", null, true, slave.waist);
-		} else if (slave.waist >= -40) {
-			makeSpan(c, "Feminine waist", "pink", true, slave.waist);
-		} else if (slave.waist >= -95) {
-			makeSpan(c, "Hourglass waist", "pink", true, slave.waist);
-		} else {
-			makeSpan(c, "Absurdly narrow waist", "pink", true, slave.waist);
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function long_implants(slave, c) {
-		const styles = "pink";
-		if ((slave.boobsImplant !== 0) || (slave.buttImplant !== 0) || (slave.lipsImplant !== 0) || (slave.bellyImplant !== -1)) {
-			makeSpan(c, "Implants.", styles);
-		} else if ((slave.faceImplant >= 30) || (slave.waist < -95)) {
-			makeSpan(c, "Surgery enhanced.", styles);
-		} else {
-			makeSpan(c, "All natural.", styles);
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function long_lactation(slave, c) {
-		if (slave.lactation === 1) {
-			makeSpan(c, "Lactating naturally.", "pink");
-		} else if (slave.lactation === 2) {
-			makeSpan(c, "Heavy lactation.", "pink");
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function long_mods(slave, c) {
-		V.modScore = SlaveStatsChecker.modScore(slave);
-		if (slave.corsetPiercing === 0 && V.piercingScore < 3 && V.tatScore < 2) {
-			return;
-		} else if (V.modScore > 15 || (V.piercingScore > 8 && V.tatScore > 5)) {
-			makeSpan(c, "Extensive body mods.");
-		} else if (V.modScore > 7) {
-			makeSpan(c, "Noticeable body mods.");
-		} else {
-			makeSpan(c, "Light body mods.");
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function short_intelligence(slave, c) {
-		const intelligence = slave.intelligence + slave.intelligenceImplant;
-		if (slave.fetish === "mindbroken") {
-			return;
-		}
-		let education = "";
-		let naturalIntelligence = "";
-		let styles = undefined;
-		if (slave.intelligenceImplant >= 30) {
-			education = "(e+)";
-		} else if (slave.intelligenceImplant >= 15) {
-			education = "(e)";
-		} else if (slave.intelligenceImplant <= -15) {
-			education = "(e-)";
-		}
-		if (intelligence >= 130) {
-			naturalIntelligence = "I++++";
-			styles = "deepskyblue";
-		} else if (intelligence > 95) {
-			naturalIntelligence = "I+++";
-			styles = "deepskyblue";
-		} else if (intelligence > 50) {
-			naturalIntelligence = "I++";
-			styles = "deepskyblue";
-		} else if (intelligence > 15) {
-			naturalIntelligence = "I+";
-			styles = "deepskyblue";
-		} else if (intelligence >= -15) {
-			naturalIntelligence = "I";
-		} else if (intelligence >= -50) {
-			naturalIntelligence = "I-";
-			styles = "orangered";
-		} else if (intelligence >= -95) {
-			naturalIntelligence = "I--";
-			styles = "orangered";
-		} else {
-			naturalIntelligence = "I---";
-			styles = "orangered";
-		}
-		makeSpan(c, `${naturalIntelligence}${education}`, styles, true, intelligence);
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function short_skills(slave, c) {
-		let _SSkills = slave.skill.anal + slave.skill.oral;
-		let r = makeSpan(c, "", "aquamarine");
-		if (((_SSkills + slave.skill.whoring + slave.skill.entertainment) >= 400) && ((slave.vagina < 0) || (slave.skill.vaginal >= 100))) {
-			r.textContent += `MSS`;
-		} else {
-			_SSkills += slave.skill.vaginal;
-			_SSkills = Math.trunc(_SSkills);
-			if (_SSkills > 180) {
-				r.textContent += `S++`;
-			} else if ((_SSkills > 120) && (slave.vagina < 0)) {
-				r.textContent += `Sh++`;
-			} else if (_SSkills > 90) {
-				r.textContent += `S+`;
-			} else if (_SSkills > 30) {
-				r.textContent += `S`;
-			} else {
-				r.textContent += `S-`;
-			}
-			if (V.summaryStats) {
-				r.textContent += `[${_SSkills}]`;
-			}
-			r.textContent += " ";
-			if (slave.skill.whoring >= 100) {
-				r.textContent += `W+++`;
-			} else if (slave.skill.whoring > 60) {
-				r.textContent += `W++`;
-			} else if (slave.skill.whoring > 30) {
-				r.textContent += `W+`;
-			} else if (slave.skill.whoring > 10) {
-				r.textContent += `W`;
-			}
-			if (slave.skill.whoring > 10) {
-				if (V.summaryStats) {
-					r.textContent += `[${slave.skill.whoring}]`;
-				}
-			}
-			r.textContent += " ";
-			if (slave.skill.entertainment >= 100) {
-				r.textContent += `E+++`;
-			} else if (slave.skill.entertainment > 60) {
-				r.textContent += `E++`;
-			} else if (slave.skill.entertainment > 30) {
-				r.textContent += `E+`;
-			} else if (slave.skill.entertainment > 10) {
-				r.textContent += `E`;
-			}
-			if (slave.skill.entertainment > 10) {
-				if (V.summaryStats) {
-					r.textContent += `[${slave.skill.entertainment}]`;
-				}
-			}
-		}
-		if (slave.skill.combat > 0) {
-			r.textContent += " C";
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function short_prestige(slave, c) {
-		if (slave.prestige > 0) {
-			const styles = "green";
-			if (slave.prestige > 2) {
-				makeSpan(c, "Prest++", styles);
-			} else if (slave.prestige === 2) {
-				makeSpan(c, "Prest+", styles);
-			} else if (slave.prestige === 1) {
-				makeSpan(c, "Prest", styles);
-			}
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function short_porn_prestige(slave, c) {
-		if (slave.porn.prestige > 0) {
-			const styles = "green";
-			if (slave.porn.prestige > 2) {
-				makeSpan(c, "PPrest++", styles);
-			} else if (slave.porn.prestige === 2) {
-				makeSpan(c, "PPrest+", styles);
-			} else if (slave.porn.prestige === 1) {
-				makeSpan(c, "PPrest", styles);
-			}
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function long_intelligence(slave, c) {
-		const intelligence = slave.intelligence + slave.intelligenceImplant;
-		if (slave.fetish === "mindbroken") {
-			return;
-		}
-		let education = "";
-		let naturalIntelligence = "";
-		let styles = undefined;
-		if (slave.intelligenceImplant >= 30) {
-			education = ", well educated";
-		} else if (slave.intelligenceImplant >= 15) {
-			education = ", educated";
-		} else if (slave.intelligenceImplant <= -15) {
-			education = ", hindered";
-		}
-		if (intelligence >= 130) {
-			naturalIntelligence = "Genius";
-			styles = "deepskyblue";
-		} else if (intelligence > 95) {
-			naturalIntelligence = "Brilliant";
-			styles = "deepskyblue";
-		} else if (intelligence > 50) {
-			naturalIntelligence = "Very smart";
-			styles = "deepskyblue";
-		} else if (intelligence > 15) {
-			naturalIntelligence = "Smart";
-			styles = "deepskyblue";
-		} else if (intelligence >= -15) {
-			naturalIntelligence = "Average intelligence";
-		} else if (intelligence >= -50) {
-			naturalIntelligence = "Slow";
-			styles = "orangered";
-		} else if (intelligence >= -95) {
-			naturalIntelligence = "Very slow";
-			styles = "orangered";
-		} else {
-			naturalIntelligence = "Moronic";
-			styles = "orangered";
-		}
-		makeSpan(c, `${naturalIntelligence}${education}`, styles, true, intelligence);
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function long_skills(slave, c) {
-		let _SSkills = (slave.skill.anal + slave.skill.oral);
-		if (((_SSkills + slave.skill.whoring + slave.skill.entertainment) >= 400) && ((slave.vagina < 0) || (slave.skill.vaginal >= 100))) {
-			makeSpan(c, "Masterful Sex Slave.", "aquamarine");
-		} else {
-			let desc;
-			_SSkills += slave.skill.vaginal;
-			if (_SSkills > 180) {
-				desc = "Sex master";
-			} else if ((_SSkills > 120) && (slave.vagina < 0)) {
-				desc = "Masterful shemale";
-			} else if (_SSkills > 90) {
-				desc = "Sexual expert";
-			} else if (_SSkills > 30) {
-				desc = "Sexually skilled";
-			} else {
-				desc = "Sexually unskilled";
-			}
-			if (desc) {
-				makeSpan(c, desc, "aquamarine", true, Math.trunc(_SSkills));
-				desc = "";
-			}
-			if (slave.skill.whoring >= 100) {
-				desc = "Masterful whore";
-			} else if (slave.skill.whoring >= 60) {
-				desc = "Expert whore";
-			} else if (slave.skill.whoring >= 30) {
-				desc = "Skilled whore";
-			} else if (slave.skill.whoring >= 10) {
-				desc = "Basic whore";
-			}
-			if (desc) {
-				makeSpan(c, desc, "aquamarine", true, slave.skill.whoring);
-				desc = "";
-			}
-			if (slave.skill.entertainment >= 100) {
-				desc = "Masterful entertainer";
-			} else if (slave.skill.entertainment >= 60) {
-				desc = "Expert entertainer";
-			} else if (slave.skill.entertainment >= 30) {
-				desc = "Skilled entertainer";
-			} else if (slave.skill.entertainment >= 10) {
-				desc = "Basic entertainer";
-			}
-			if (desc) {
-				makeSpan(c, desc, "aquamarine", true, slave.skill.entertainment);
-				desc = "";
-			}
-		}
-		if (slave.skill.combat > 0) {
-			makeSpan(c, "Trained fighter.", "aquamarine");
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function long_prestige(slave, c) {
-		if (slave.prestige > 0) {
-			const styles = "green";
-			if (slave.prestige > 2) {
-				makeSpan(c, "Extremely prestigious.", styles);
-			} else if (slave.prestige === 2) {
-				makeSpan(c, "Very prestigious.", styles);
-			} else if (slave.prestige === 1) {
-				makeSpan(c, "Prestigious.", styles);
-			}
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function long_porn_prestige(slave, c) {
-		if (slave.porn.prestige > 0) {
-			const styles = "green";
-			if (slave.porn.prestige > 2) {
-				makeSpan(c, "Porn star.", styles);
-			} else if (slave.porn.prestige === 2) {
-				makeSpan(c, "Porn slut.", styles);
-			} else if (slave.porn.prestige === 1) {
-				makeSpan(c, "Porn amateur.", styles);
-			}
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function short_fetish(slave, c) {
-		let descStr = "";
-		switch (slave.fetish) {
-			case "submissive":
-				if (slave.fetishStrength > 95) {
-					descStr = `Sub++`;
-				} else if (slave.fetishStrength > 60) {
-					descStr = `Sub+`;
+	const shortRenderers = {
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 */
+		devotion: function(slave, c) {
+			const makeSpan = helpers.makeSpan;
+			if (slave.fetish === "mindbroken") {
+				makeSpan(c, "MB", "mindbroken");
+			} else if (slave.devotion < -95) {
+				makeSpan(c, "Hate", ["devotion", "hateful"], true, slave.devotion);
+			} else if (slave.devotion < -50) {
+				makeSpan(c, "Hate", ["devotion", "hateful"], true, slave.devotion);
+			} else if (slave.devotion < -20) {
+				makeSpan(c, "Res", ["devotion", "resistant"], true, slave.devotion);
+			} else if (slave.devotion <= 20) {
+				makeSpan(c, "Ambiv", ["devotion", "ambivalent"], true, slave.devotion);
+			} else if (slave.devotion <= 50) {
+				makeSpan(c, "Accept", ["devotion", "accept"], true, slave.devotion);
+			} else if (slave.devotion <= 95) {
+				makeSpan(c, "Devo", ["devotion", "devoted"], true, slave.devotion);
+			} else {
+				makeSpan(c, "Wor", ["devotion", "worship"], true, slave.devotion);
+			}
+			if (slave.fetish === "mindbroken") {
+				return;
+			} else if (slave.trust < -95) {
+				makeSpan(c, "ETerr", ["trust", "extremely-terrified"], true, slave.trust);
+			} else if (slave.trust < -50) {
+				makeSpan(c, "Terr", ["trust", "terrified"], true, slave.trust);
+			} else if (slave.trust < -20) {
+				makeSpan(c, "Fright", ["trust", "frightened"], true, slave.trust);
+			} else if (slave.trust <= 20) {
+				makeSpan(c, "Fear", ["trust", "fearful"], true, slave.trust);
+			} else if (slave.trust <= 50) {
+				if (slave.devotion < -20) {
+					makeSpan(c, "Caref", ["defiant", "careful"], true, slave.trust);
 				} else {
-					descStr = `Sub`;
+					makeSpan(c, "Caref", ["trust", "careful"], true, slave.trust);
 				}
-				break;
-			case "cumslut":
-				if (slave.fetishStrength > 95) {
-					descStr = `Oral++`;
-				} else if (slave.fetishStrength > 60) {
-					descStr = `Oral+`;
+			} else if (slave.trust < 95) {
+				if (slave.devotion < -20) {
+					makeSpan(c, "Bold", ["defiant", "bold"], true, slave.trust);
 				} else {
-					descStr = `Oral`;
+					makeSpan(c, "Trust", ["trust", "trusting"], true, slave.trust);
 				}
-				break;
-			case "humiliation":
-				if (slave.fetishStrength > 95) {
-					descStr = `Humil++`;
-				} else if (slave.fetishStrength > 60) {
-					descStr = `Humil+`;
+			} else {
+				if (slave.devotion < -20) {
+					makeSpan(c, "Defiant", ["defiant", "full"], true, slave.trust);
 				} else {
-					descStr = `Humil`;
+					makeSpan(c, "VTrust", ["trust", "prof-trusting"], true, slave.trust);
 				}
-				break;
-			case "buttslut":
-				if (slave.fetishStrength > 95) {
-					descStr = `Anal++`;
-				} else if (slave.fetishStrength > 60) {
-					descStr = `Anal+`;
-				} else {
-					descStr = `Anal`;
+			}
+		},
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		rules: function(slave, c) {
+			const makeSpan = helpers.makeSpan;
+			const styles = "strong";
+			switch (slave.rules.living) {
+				case "luxurious":
+					makeSpan(c, "LS:Lux", styles);
+					break;
+				case "normal":
+					makeSpan(c, "LS:Nor", styles);
+					break;
+				default:
+					makeSpan(c, "LS:Spa", styles);
+					break;
+			}
+			if (canTalk(slave, false)) {
+				switch (slave.rules.speech) {
+					case "permissive":
+						makeSpan(c, "SpR:P", styles);
+						break;
+					case "accent elimination":
+						makeSpan(c, "SpR:NoAcc", styles);
+						break;
+					case "language lessons":
+						makeSpan(c, "SpR:LL", styles);
+						break;
+					default:
+						makeSpan(c, "SpR:R", styles);
+						break;
 				}
-				break;
-			case "boobs":
-				if (slave.fetishStrength > 95) {
-					descStr = `Boobs++`;
-				} else if (slave.fetishStrength > 60) {
-					descStr = `Boobs+`;
+			}
+			switch (slave.rules.relationship) {
+				case "permissive":
+					makeSpan(c, "ReR:P", styles);
+					break;
+				case "just friends":
+					makeSpan(c, "ReR:Fr", styles);
+					break;
+				default:
+					makeSpan(c, "ReR:R", styles);
+					break;
+			}
+			switch (slave.rules.punishment) {
+				case "confinement":
+					makeSpan(c, "Pun:Conf", styles);
+					break;
+				case "whipping":
+					makeSpan(c, "Pun:Whip", styles);
+					break;
+				case "chastity":
+					makeSpan(c, "Pun:Chas", styles);
+					break;
+				default:
+					makeSpan(c, "Pun:Situ", styles);
+					break;
+			}
+			switch (slave.rules.reward) {
+				case "relaxation":
+					makeSpan(c, "Rew:Relx", styles);
+					break;
+				case "drugs":
+					makeSpan(c, "Rew:Drug", styles);
+					break;
+				case "orgasm":
+					makeSpan(c, "Rew:Orga", styles);
+					break;
+				default:
+					makeSpan(c, "Rew:Situ", styles);
+					break;
+			}
+			makeSpan(c, "MaR:" + App.Utils.releaseSummaryShort(slave), styles);
+		},
+
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		health: function(slave, c) {
+			const b = bits.short;
+			b.health(slave, c);
+			b.illness(slave, c);
+			b.tired(slave, c);
+		},
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		weight: function(slave, c) {
+			const makeSpan = helpers.makeSpan;
+			if (slave.weight < -95) {
+				makeSpan(c, "W---", ["red", "strong"], true, slave.weight);
+			} else if (slave.weight < -30) {
+				if (slave.hips < -1) {
+					makeSpan(c, "W--", "strong", true, slave.weight);
 				} else {
-					descStr = `Boobs`;
+					makeSpan(c, "W--", ["red", "strong>"], true, slave.weight);
 				}
-				break;
-			case "sadist":
-				if (slave.fetishStrength > 95) {
-					descStr = `Sadist++`;
-				} else if (slave.fetishStrength > 60) {
-					descStr = `Sadist+`;
+			} else if (slave.weight < -10) {
+				makeSpan(c, "W-", "strong", true, slave.weight);
+			} else if (slave.weight <= 10) {
+				makeSpan(c, "W", "strong", true, slave.weight);
+			} else if (slave.weight <= 30) {
+				makeSpan(c, "W+", "strong", true, slave.weight);
+			} else if (slave.weight <= 95) {
+				if (slave.hips > 1 || V.arcologies[0].FSHedonisticDecadence !== "unset") {
+					makeSpan(c, "W++", "strong", true, slave.weight);
 				} else {
-					descStr = `Sadist`;
+					makeSpan(c, "W++", ["red", "strong"], true, slave.weight);
 				}
-				break;
-			case "masochist":
-				if (slave.fetishStrength > 95) {
-					descStr = `Pain++`;
-				} else if (slave.fetishStrength > 60) {
-					descStr = `Pain+`;
+			} else if (slave.weight <= 130) {
+				if (slave.hips > 2 || V.arcologies[0].FSHedonisticDecadence !== "unset") {
+					makeSpan(c, "W+++", "strong", true, slave.weight);
 				} else {
-					descStr = `Pain`;
+					makeSpan(c, "W+++", ["red", "strong"], true, slave.weight);
 				}
-				break;
-			case "dom":
-				if (slave.fetishStrength > 95) {
-					descStr = `Dom++`;
-				} else if (slave.fetishStrength > 60) {
-					descStr = `Dom+`;
+			} else if (slave.weight <= 160) {
+				if (V.arcologies[0].FSHedonisticDecadence !== "unset") {
+					makeSpan(c, "W++++", "strong", true, slave.weight);
 				} else {
-					descStr = `Dom`;
+					makeSpan(c, "W++++", ["red", "strong"], true, slave.weight);
 				}
-				break;
-			case "pregnancy":
-				if (slave.fetishStrength > 95) {
-					descStr = `Preg++`;
-				} else if (slave.fetishStrength > 60) {
-					descStr = `Preg+`;
+			} else if (slave.weight <= 190) {
+				if (V.arcologies[0].FSHedonisticDecadence !== "unset") {
+					makeSpan(c, "W+++++", "strong", true, slave.weight);
 				} else {
-					descStr = `Preg`;
-				}
-				break;
-			default:
-				descStr = `Vanilla`;
-				break;
-		}
-		if (V.summaryStats) {
-			descStr += `[${slave.fetishStrength}]`;
-		}
-		makeSpan(c, descStr, "lightcoral");
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function short_attraction(slave, c) {
-		if (slave.attrXY <= 5) {
-			makeSpan(c, "XY---", "red", false, slave.attrXY);
-		} else if (slave.attrXY <= 15) {
-			makeSpan(c, "XY--", "red", false, slave.attrXY);
-		} else if (slave.attrXY <= 35) {
-			makeSpan(c, "XY---", "red", false, slave.attrXY);
-		} else if (slave.attrXY <= 65) {
-			makeSpan(c, "XY", undefined, false, slave.attrXY);
-		} else if (slave.attrXY <= 85) {
-			makeSpan(c, "XY+", "green", false, slave.attrXY);
-		} else if (slave.attrXY <= 95) {
-			makeSpan(c, "XY++", "green", false, slave.attrXY);
-		} else if (slave.attrXX > 95) {
-			if (slave.energy <= 95) {
-				makeSpan(c, "Omni!", "green");
-			} else {
-				makeSpan(c, "Omni+Nympho!!", "green");
-			}
-		} else {
-			makeSpan(c, "XY+++", "green", false, slave.attrXY);
-		}
-		if (slave.attrXX <= 5) {
-			makeSpan(c, "XX---", "red", false, slave.attrXX);
-		} else if (slave.attrXX <= 15) {
-			makeSpan(c, "XX--", "red", false, slave.attrXX);
-		} else if (slave.attrXX <= 35) {
-			makeSpan(c, "XX-", "red", false, slave.attrXX);
-		} else if (slave.attrXX <= 65) {
-			makeSpan(c, "XX", undefined, false, slave.attrXX);
-		} else if (slave.attrXX <= 85) {
-			makeSpan(c, "XX+", "green", false, slave.attrXX);
-		} else if (slave.attrXX <= 95) {
-			makeSpan(c, "XX++", "green", false, slave.attrXX);
-		} else if (slave.attrXY <= 95) {
-			makeSpan(c, "XX+++", "green", false, slave.attrXX);
-		}
-		if (slave.energy > 95) {
-			if ((slave.attrXY <= 95) || (slave.attrXX <= 95)) {
-				makeSpan(c, "Nympho!", "green");
-			}
-		} else if (slave.energy > 80) {
-			makeSpan(c, "SD++", "green", false, slave.energy);
-		} else if (slave.energy > 60) {
-			makeSpan(c, "SD+", "green", false, slave.energy);
-		} else if (slave.energy > 40) {
-			makeSpan(c, "SD", "green", false, slave.energy);
-		} else if (slave.energy > 20) {
-			makeSpan(c, "SD-", "red", false, slave.energy);
-		} else {
-			makeSpan(c, "SD--", "red", false, slave.energy);
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function short_smart_fetish(slave, c) {
-		function settingStr() {
-			if (slave.fetishKnown === 1) {
-				if (slave.clitSetting === "off") {
-					return `SP-`;
-				} else if (((slave.fetish !== "submissive") || (slave.fetishStrength <= 95)) && (slave.clitSetting === "submissive")) {
-					return `SP:sub`;
-				} else if (((slave.fetish !== "cumslut") || (slave.fetishStrength <= 95)) && (slave.clitSetting === "oral")) {
-					return `SP:oral`;
-				} else if (((slave.fetish !== "humiliation") || (slave.fetishStrength <= 95)) && (slave.clitSetting === "humiliation")) {
-					return `SP:humil`;
-				} else if (((slave.fetish !== "buttslut") || (slave.fetishStrength <= 95)) && (slave.clitSetting === "anal")) {
-					return `SP:anal`;
-				} else if (((slave.fetish !== "boobs") || (slave.fetishStrength <= 95)) && (slave.clitSetting === "boobs")) {
-					return `SP:boobs`;
-				} else if (((slave.fetish !== "sadist") || (slave.fetishStrength <= 95)) && (slave.clitSetting === "sadist")) {
-					return `SP:sade`;
-				} else if (((slave.fetish !== "masochist") || (slave.fetishStrength <= 95)) && (slave.clitSetting === "masochist")) {
-					return `SP:pain`;
-				} else if (((slave.fetish !== "dom") || (slave.fetishStrength <= 95)) && (slave.clitSetting === "dom")) {
-					return `SP:dom`;
-				} else if (((slave.fetish !== "pregnancy") || (slave.fetishStrength <= 95)) && (slave.clitSetting === "pregnancy")) {
-					return `SP:preg`;
-				} else if (((slave.fetish !== "none") && (slave.clitSetting === "vanilla"))) {
-					return `SP:vanilla`;
-				} else if ((slave.energy <= 95) && (slave.clitSetting === "all")) {
-					return `SP:all`;
-				} else if ((slave.energy > 5) && (slave.clitSetting === "none")) {
-					return `SP:none`;
-				} else if (!["anti-men", "anti-women", "men", "women"].includes(slave.clitSetting)) {
-					return `SP:monitoring`;
+					makeSpan(c, "W+++++", ["red", "strong"], true, slave.weight);
 				}
 			} else {
-				switch (slave.clitSetting) {
-					case "off":
-						return `SP-`;
-					case "submissive":
-						return `SP:sub`;
-					case "lesbian":
-						return `SP:les`;
-					case "oral":
-						return `SP:oral`;
-					case "humiliation":
-						return `SP:humil`;
-					case "anal":
-						return `SP:anal`;
-					case "boobs":
-						return `SP:boobs`;
-					case "sadist":
-						return `SP:sade`;
-					case "masochist":
-						return `SP:pain`;
-					case "dom":
-						return `SP:dom`;
-					case "pregnancy":
-						return `SP:pregnancy`;
-					case "vanilla":
-						return `SP:vanilla`;
-					case "all":
-						return `SP:all`;
-					case "none":
-						return `SP:none`;
+				if (V.arcologies[0].FSHedonisticDecadence !== "unset") {
+					makeSpan(c, "W++++++", "strong", true, slave.weight);
+				} else {
+					makeSpan(c, "W++++++", ["red", "strong"], true, slave.weight);
 				}
 			}
-			return null;
-		}
-		const s = settingStr();
-		if (s) {
-			makeSpan(c, settingStr());
-		}
-	}
+		},
 
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function short_smart_attraction(slave, c) {
-		function settingStr() {
-			if (slave.attrKnown === 1) {
-				if (slave.clitSetting === "women") {
-					if (slave.attrXX < 95) {
-						return `SP:women`;
-					} else {
-						return `SP:monitoring`;
-					}
-				} else if (slave.clitSetting === "men") {
-					if (slave.attrXY < 95) {
-						return `SP:men`;
-					} else {
-						return `SP:monitoring`;
-					}
-				} else if (slave.clitSetting === "anti-women") {
-					if (slave.attrXX > 0) {
-						return `SP:anti-women`;
-					} else {
-						return `SP:monitoring`;
-					}
-				} else if (slave.clitSetting === "anti-men") {
-					if (slave.attrXY > 0) {
-						return `SP:anti-men`;
-					} else {
-						return `SP:monitoring`;
-					}
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		genitalia: function(slave, c) {
+			const makeSpan = helpers.makeSpan;
+			if (slave.dick > 0) {
+				let dickDesc = "";
+				if (slave.balls === 0) {
+					dickDesc += `Geld`;
 				}
-			} else {
-				if (slave.clitSetting === "women") {
-					return `SP:women`;
-				} else if (slave.clitSetting === "men") {
-					return `SP:men`;
-				} else if (slave.clitSetting === "anti-women") {
-					return `SP:anti-women`;
-				} else if (slave.clitSetting === "anti-men") {
-					return `SP:anti-men`;
+				if ((slave.dick > 8) && (slave.balls > 8)) {
+					dickDesc += `Junk+++`;
+				} else if ((slave.dick > 5) && (slave.balls > 5)) {
+					dickDesc += `Junk++`;
+				} else if ((slave.dick > 4) && (slave.balls > 4)) {
+					dickDesc += `Junk+`;
+				} else if ((slave.dick > 3) && (slave.balls > 3)) {
+					dickDesc += `Junk`;
+				} else if (slave.dick > 8) {
+					dickDesc += `Dick+++`;
+				} else if (slave.dick > 5) {
+					dickDesc += `Dick++`;
+				} else if (slave.dick > 4) {
+					dickDesc += `Dick+`;
+				} else if (slave.dick > 3) {
+					dickDesc += `Dick`;
+				} else if (slave.balls > 10) {
+					dickDesc += `Balls+++`;
+				} else if (slave.balls > 5) {
+					dickDesc += `Balls++`;
+				} else if (slave.balls > 4) {
+					dickDesc += `Balls+`;
+				} else if (slave.balls > 3) {
+					dickDesc += `Balls`;
+				}
+				if (dickDesc.length) {
+					makeSpan(c, dickDesc, "pink");
 				}
 			}
-			return null;
-		}
-		const s = settingStr();
-		if (s) {
-			makeSpan(c, settingStr());
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function short_behavior_flaw(slave, c) {
-		function descStr() {
-			switch (slave.behavioralFlaw) {
-				case "arrogant":
-					return `Arrog`;
-				case "bitchy":
-					return `Bitchy`;
-				case "odd":
-					return `Odd`;
-				case "hates men":
-					return `Men-`;
-				case "hates women":
-					return `Women-`;
-				case "gluttonous":
-					return `Glut`;
-				case "anorexic":
-					return `Ano`;
-				case "devout":
-					return `Dev`;
-				case "liberated":
-					return `Lib`;
-				default:
-					slave.behavioralFlaw = "none";
-					return null;
-			}
-		}
-		const s = descStr();
-		if (s) {
-			makeSpan(c, descStr(), "red");
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function short_sex_flaw(slave, c) {
-		switch (slave.sexualFlaw) {
-			case "hates oral":
-				makeSpan(c, "Oral-", "red");
-				break;
-			case "hates anal":
-				makeSpan(c, "Anal-", "red");
-				break;
-			case "hates penetration":
-				makeSpan(c, "Fuck-", "red");
-				break;
-			case "shamefast":
-				makeSpan(c, "Shame", "red");
-				break;
-			case "idealistic":
-				makeSpan(c, "Ideal", "red");
-				break;
-			case "repressed":
-				makeSpan(c, "Repre", "red");
-				break;
-			case "apathetic":
-				makeSpan(c, "Apath", "red");
-				break;
-			case "crude":
-				makeSpan(c, "Crude", "red");
-				break;
-			case "judgemental":
-				makeSpan(c, "Judge", "red");
-				break;
-			case "cum addict":
-				makeSpan(c, "CumAdd", "yellow");
-				break;
-			case "anal addict":
-				makeSpan(c, "AnalAdd", "yellow");
-				break;
-			case "attention whore":
-				makeSpan(c, "Attention", "yellow");
-				break;
-			case "breast growth":
-				makeSpan(c, "BoobObsess", "yellow");
-				break;
-			case "abusive":
-				makeSpan(c, "Abusive", "yellow");
-				break;
-			case "malicious":
-				makeSpan(c, "Malice", "yellow");
-				break;
-			case "self hating":
-				makeSpan(c, "SelfHatr", "yellow");
-				break;
-			case "neglectful":
-				makeSpan(c, "SelfNeglect", "yellow");
-				break;
-			case "breeder":
-				makeSpan(c, "BreedObsess", "yellow");
-				break;
-			default:
-				slave.sexualFlaw = "none";
-				break;
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function short_behavior_quirk(slave, c) {
-		function descStr() {
-			switch (slave.behavioralQuirk) {
-				case "confident":
-					return `Confid`;
-				case "cutting":
-					return `Cutting`;
-				case "funny":
-					return `Funny`;
-				case "fitness":
-					return `Fit`;
-				case "adores women":
-					return `Women+`;
-				case "adores men":
-					return `Men+`;
-				case "insecure":
-					return `Insec`;
-				case "sinful":
-					return `Sinf`;
-				case "advocate":
-					return `Advoc`;
-				default:
-					slave.behavioralQuirk = "none";
-					return null;
-			}
-		}
-		const s = descStr();
-		if (s) {
-			makeSpan(c, s, "green");
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function short_sex_quirk(slave, c) {
-		function descStr() {
-			switch (slave.sexualQuirk) {
-				case "gagfuck queen":
-					return `Gagfuck`;
-				case "painal queen":
-					return `Painal`;
-				case "strugglefuck queen":
-					return `Struggle`;
-				case "tease":
-					return `Tease`;
-				case "romantic":
-					return `Romantic`;
-				case "perverted":
-					return `Perverted`;
-				case "caring":
-					return `Caring`;
-				case "unflinching":
-					return `Unflinch`;
-				case "size queen":
-					return `SizeQ`;
-				default:
-					slave.sexualQuirk = "none";
-					return null;
+			if (slave.vagina === 0) {
+				makeSpan(c, "VV", "lime");
+			} else if ((slave.pregKnown === 1) && canWalk(slave) && (slave.clothes === "no clothing" || slave.clothes === "body oil") && (slave.shoes === "none")) {
+				makeSpan(c, "NBP", "pink");
+			}
+			if (slave.anus === 0) {
+				makeSpan(c, "AV", "lime");
+			}
+			let holesDesc = "";
+			if ((slave.vagina > 3) && (slave.anus > 3)) {
+				holesDesc += `V++A++`;
+			} else if ((slave.vagina > 2) && (slave.anus > 2)) {
+				holesDesc += `V+A+`;
+			} else if (slave.vagina > 3) {
+				holesDesc += `V++`;
+			} else if (slave.vagina > 2) {
+				holesDesc += `V+`;
+			} else if (slave.anus > 3) {
+				holesDesc += `A++`;
+			} else if (slave.anus > 2) {
+				holesDesc += `A+`;
+			}
+			if (holesDesc.length) {
+				makeSpan(c, holesDesc, "pink");
+			}
+		},
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		diet: function(slave, c) {
+			const makeSpan = helpers.makeSpan;
+			let diet = makeSpan(null, "", ["teal", "strong"]);
+			switch (slave.diet) {
+				case "restricted":
+					diet.textContent = "Di:W-";
+					break;
+				case "fattening":
+					diet.textContent = "Di:W+";
+					break;
+				case "corrective":
+					diet.textContent = "Di:W=";
+					break;
+				case "XX":
+					diet.textContent = "Di:XX+";
+					break;
+				case "XY":
+					diet.textContent = "Di:XY+";
+					break;
+				case "XXY":
+					diet.textContent = "Di:XXY+";
+					break;
+				case "muscle building":
+					diet.textContent = "Di:M+";
+					break;
+				case "slimming":
+					diet.textContent = "Di:M-";
+					break;
+				case "cum production":
+					diet.textContent = "Di:C+";
+					break;
+				case "cleansing":
+					diet.textContent = "Di:H+";
+					break;
+				case "fertility":
+					diet.textContent = "Di:F+";
+					break;
 			}
-		}
-		const s = descStr();
-		if (s) {
-			makeSpan(c, s, "green");
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function long_fetish(slave, c) {
-		function fetishStr() {
-			switch (slave.fetish) {
-				case "submissive":
-					if (slave.fetishStrength > 95) {
-						return "Complete submissive";
-					} else if (slave.fetishStrength > 60) {
-						return "Submissive";
-					} else {
-						return "Submissive tendencies";
-					}
-				case "cumslut":
-					if (slave.fetishStrength > 95) {
-						return "Cumslut";
-					} else if (slave.fetishStrength > 60) {
-						return "Oral fixation";
-					} else {
-						return "Prefers oral";
-					}
-				case "humiliation":
-					if (slave.fetishStrength > 95) {
-						return "Humiliation slut";
-					} else if (slave.fetishStrength > 60) {
-						return "Exhibitionist";
-					} else {
-						return "Interest in humiliation";
-					}
-				case "buttslut":
-					if (slave.fetishStrength > 95) {
-						return "Buttslut";
-					} else if (slave.fetishStrength > 60) {
-						return "Anal fixation";
-					} else {
-						return "Prefers anal";
-					}
-				case "boobs":
-					if (slave.fetishStrength > 95) {
-						return "Boobslut";
-					} else if (slave.fetishStrength > 60) {
-						return "Breast fixation";
-					} else {
-						return "Loves boobs";
-					}
-				case "sadist":
-					if (slave.fetishStrength > 95) {
-						return "Complete sadist";
-					} else if (slave.fetishStrength > 60) {
-						return "Sadist";
-					} else {
-						return "Sadistic tendencies";
-					}
-				case "masochist":
-					if (slave.fetishStrength > 95) {
-						return "Complete masochist";
-					} else if (slave.fetishStrength > 60) {
-						return "Masochist";
-					} else {
-						return "Masochistic tendencies";
-					}
-				case "dom":
-					if (slave.fetishStrength > 95) {
-						return "Complete dom";
-					} else if (slave.fetishStrength > 60) {
-						return "Dominant";
-					} else {
-						return "Dominant tendencies";
-					}
-				case "pregnancy":
-					if (slave.fetishStrength > 95) {
-						return "Pregnancy fetish";
-					} else if (slave.fetishStrength > 60) {
-						return "Pregnancy kink";
-					} else {
-						return "Interest in impregnation";
-					}
-				default:
-					return "Sexually vanilla";
+			if (diet.textContent.length > 0) {
+				c.appendChild(diet);
+			}
+			let specialDiet = makeSpan(null, "", ["cyan", "strong"]);
+			if (slave.dietCum === 2) {
+				specialDiet.textContent = "Cum++";
+			} else if (((slave.dietCum === 1) && (slave.dietMilk === 0))) {
+				specialDiet.textContent = "Cum+";
+			} else if (((slave.dietCum === 1) && (slave.dietMilk === 1))) {
+				specialDiet.textContent = "Cum+ Milk+";
+			} else if (((slave.dietCum === 0) && (slave.dietMilk === 1))) {
+				specialDiet.textContent = "Milk+";
+			} else if ((slave.dietMilk === 2)) {
+				specialDiet.textContent = ">Milk++";
+			}
+			if (specialDiet.textContent.length > 0) {
+				c.appendChild(specialDiet);
+			}
+		},
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		drugs: function(slave, c) {
+			let drugDesc = "";
+			switch (slave.drugs) {
+				case "breast injections":
+					drugDesc = "Boobs+";
+					break;
+				case "intensive breast injections":
+					drugDesc = "Boobs++";
+					break;
+				case "hyper breast injections":
+					drugDesc = "Boobs+++";
+					break;
+				case "nipple enhancers":
+					drugDesc = "Nipple+";
+					break;
+				case "butt injections":
+					drugDesc = "Butt+";
+					break;
+				case "intensive butt injections":
+					drugDesc = "Butt++";
+					break;
+				case "hyper butt injections":
+					drugDesc = "Butt+++";
+					break;
+				case "lip injections":
+					drugDesc = "Lip+";
+					break;
+				case "fertility drugs":
+					drugDesc = "Fert+";
+					break;
+				case "super fertility drugs":
+					drugDesc = "Fert++";
+					break;
+				case "penis enhancement":
+					drugDesc = "Dick+";
+					break;
+				case "intensive penis enhancement":
+					drugDesc = "Dick++";
+					break;
+				case "hyper penis enhancement":
+					drugDesc = "Dick+++";
+					break;
+				case "testicle enhancement":
+					drugDesc = "Balls+";
+					break;
+				case "intensive testicle enhancement":
+					drugDesc = "Balls++";
+					break;
+				case "hyper testicle enhancement":
+					drugDesc = "Balls+++";
+					break;
+				case "psychosuppressants":
+					drugDesc = "Psych-";
+					break;
+				case "psychostimulants":
+					drugDesc = "Psych+";
+					break;
+				case "steroids":
+					drugDesc = "Ster";
+					break;
+				case "female hormone injections":
+					drugDesc = "HormXX++";
+					break;
+				case "male hormone injections":
+					drugDesc = "HormXY++";
+					break;
+				case "hormone enhancers":
+					drugDesc = "Horm+";
+					break;
+				case "hormone blockers":
+					drugDesc = "Horm-";
+					break;
+				case "anti-aging cream":
+					drugDesc = "Age-";
+					break;
+				case "appetite suppressors":
+					drugDesc = "ApSup";
+					break;
+				case "penis atrophiers":
+					drugDesc = "Dick-";
+					break;
+				case "testicle atrophiers":
+					drugDesc = "Balls-";
+					break;
+				case "clitoris atrophiers":
+					drugDesc = "Clit-";
+					break;
+				case "labia atrophiers":
+					drugDesc = "Labia-";
+					break;
+				case "nipple atrophiers":
+					drugDesc = "Nipple-";
+					break;
+				case "lip atrophiers":
+					drugDesc = "Lip-";
+					break;
+				case "breast redistributors":
+					drugDesc = "Breast-";
+					break;
+				case "butt redistributors":
+					drugDesc = "Butt-";
+					break;
+				case "sag-B-gone":
+					drugDesc = "AntiSag";
+					break;
+				case "growth stimulants":
+					drugDesc = "GroStim";
+					break;
+				case "priapism agents":
+					drugDesc = "Erection";
+					break;
 			}
-		}
-		makeSpan(c, fetishStr(), "lightcoral", true, slave.fetishStrength);
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function long_attraction(slave, c) {
-		if (slave.attrXY <= 5) {
-			makeSpan(c, "Disgusted by men", "red", true, slave.attrXY);
-		} else if (slave.attrXY <= 15) {
-			makeSpan(c, "Turned off by men", "red", true, slave.attrXY);
-		} else if (slave.attrXY <= 35) {
-			makeSpan(c, "Not attracted to men", "red", true, slave.attrXY);
-		} else if (slave.attrXY <= 65) {
-			makeSpan(c, "Indifferent to men", undefined, true, slave.attrXY);
-		} else if (slave.attrXY <= 85) {
-			makeSpan(c, "Attracted to men", "green", true, slave.attrXY);
-		} else if (slave.attrXY <= 95) {
-			makeSpan(c, "Aroused by men", "green", true, slave.attrXY);
-		} else if (slave.attrXX > 95) {
-			if (slave.energy <= 95) {
-				makeSpan(c, "Omnisexual!", "green");
-			} else {
-				makeSpan(c, "Omnisexual nymphomaniac!", "green");
+			const makeSpan = helpers.makeSpan;
+			if (drugDesc) {
+				makeSpan(c, "Dr:" + drugDesc, ["tan", "strong"]);
 			}
-		} else {
-			makeSpan(c, "Passionate about men", "green", true, slave.attrXY);
-		}
-		if (slave.attrXX <= 5) {
-			makeSpan(c, "disgusted by women", "red", true, slave.attrXX);
-		} else if (slave.attrXX <= 15) {
-			makeSpan(c, "turned off by women", "red", true, slave.attrXX);
-		} else if (slave.attrXX <= 35) {
-			makeSpan(c, "not attracted to women", "red", true, slave.attrXX);
-		} else if (slave.attrXX <= 65) {
-			makeSpan(c, "indifferent to women", undefined, true, slave.attrXX);
-		} else if (slave.attrXX <= 85) {
-			makeSpan(c, "attracted to women", "green", true, slave.attrXX);
-		} else if (slave.attrXX <= 95) {
-			makeSpan(c, "aroused by women", "green", true, slave.attrXX);
-		} else if (slave.attrXY <= 95) {
-			makeSpan(c, "passionate about women", "green", true, slave.attrXX);
-		}
-		if (slave.energy > 95) {
-			if ((slave.attrXY <= 95) || (slave.attrXX <= 95)) {
-				makeSpan(c, "Nymphomaniac!", "green");
+			if (slave.curatives === 2) {
+				makeSpan(c, "Cura", ["lightgreen", "strong"]);
+			} else if (slave.curatives === 1) {
+				makeSpan(c, "Prev", ["lightgreen", "strong"]);
 			}
-		} else if (slave.energy > 80) {
-			makeSpan(c, "Powerful sex drive", "green", true, slave.energy);
-		} else if (slave.energy > 60) {
-			makeSpan(c, "Good sex drive", "green", true, slave.energy);
-		} else if (slave.energy > 40) {
-			makeSpan(c, "Average sex drive", "yellow", true, slave.energy);
-		} else if (slave.energy > 20) {
-			makeSpan(c, "Poor sex drive", "red", true, slave.energy);
-		} else {
-			makeSpan(c, "No sex drive", "red", true, slave.energy);
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function long_smart_fetish(slave, c) {
-		function descStr() {
-			if (slave.fetishKnown === 1) {
-				if (slave.clitSetting === "off") {
-					return `SP off.`;
-				} else if (((slave.fetish !== "submissive") || (slave.fetishStrength <= 95)) && (slave.clitSetting === "submissive")) {
-					return `SP: submissive.`;
-				} else if (((slave.fetish !== "cumslut") || (slave.fetishStrength <= 95)) && (slave.clitSetting === "oral")) {
-					return `SP: oral.`;
-				} else if (((slave.fetish !== "humiliation") || (slave.fetishStrength <= 95)) && (slave.clitSetting === "humiliation")) {
-					return `SP: humiliation.`;
-				} else if (((slave.fetish !== "buttslut") || (slave.fetishStrength <= 95)) && (slave.clitSetting === "anal")) {
-					return `SP: anal.`;
-				} else if (((slave.fetish !== "boobs") || (slave.fetishStrength <= 95)) && (slave.clitSetting === "boobs")) {
-					return `SP: breasts.`;
-				} else if (((slave.fetish !== "sadist") || (slave.fetishStrength <= 95)) && (slave.clitSetting === "sadist")) {
-					return `SP: sadism.`;
-				} else if (((slave.fetish !== "masochist") || (slave.fetishStrength <= 95)) && (slave.clitSetting === "masochist")) {
-					return `SP: masochism.`;
-				} else if (((slave.fetish !== "dom") || (slave.fetishStrength <= 95)) && (slave.clitSetting === "dom")) {
-					return `SP: dominance.`;
-				} else if (((slave.fetish !== "pregnancy") || (slave.fetishStrength <= 95)) && (slave.clitSetting === "pregnancy")) {
-					return `SP: pregnancy.`;
-				} else if ((slave.fetish !== "none") && (slave.clitSetting === "vanilla")) {
-					return `SP: vanilla.`;
-				} else if ((slave.energy <= 95) && (slave.clitSetting === "all")) {
-					return `SP: all.`;
-				} else if ((slave.energy > 5) && (slave.clitSetting === "none")) {
-					return `SP: none.`;
-				} else if (!["anti-men", "anti-women", "men", "women"].includes(slave.clitSetting)) {
-					return `SP: monitoring.`;
-				}
-			} else {
-				switch (slave.clitSetting) {
-					case "off":
-						return `SP off.`;
-					case "submissive":
-						return `SP: submissive.`;
-					case "oral":
-						return `SP: oral.`;
-					case "humiliation":
-						return `SP: humiliation.`;
-					case "anal":
-						return `SP: anal.`;
-					case "boobs":
-						return `SP: breasts.`;
-					case "sadist":
-						return `SP: sadism.`;
-					case "masochist":
-						return `SP: masochism.`;
-					case "dom":
-						return `SP: dominance.`;
-					case "pregnancy":
-						return `SP: pregnancy.`;
-					case "vanilla":
-						return `SP: vanilla.`;
-					case "all":
-						return `SP: all.`;
-					case "none":
-						return `SP: none.`;
+			if (slave.aphrodisiacs !== 0) {
+				if (slave.aphrodisiacs === 1) {
+					makeSpan(c, "Aph", ["lightblue", "strong"]);
+				} else if (slave.aphrodisiacs === 2) {
+					makeSpan(c, "Aph++", ["lightblue", "strong"]);
+				} else {
+					makeSpan(c, "Anaph", ["lightblue", "strong"]);
 				}
 			}
-			return null;
-		}
-		const s = descStr();
-		if (s) {
-			makeSpan(c, s);
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function long_smart_attraction(slave, c) {
-		if (slave.attrKnown === 1) {
-			if ((slave.attrXX < 100) && (slave.clitSetting === "women")) {
-				makeSpan(c, `SP: women.`);
-			} else if ((slave.attrXY < 100) && (slave.clitSetting === "men")) {
-				makeSpan(c, `SP: men.`);
-			}
-		} else {
-			if (slave.clitSetting === "women") {
-				makeSpan(c, `SP: women.`);
-			} else if (slave.clitSetting === "men") {
-				makeSpan(c, `SP: men.`);
-			}
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function long_behavior_flaw(slave, c) {
-		function descStr() {
-			switch (slave.behavioralFlaw) {
-				case "arrogant":
-					return `Arrogant.`;
-				case "bitchy":
-					return `Bitchy.`;
-				case "odd":
-					return `Odd.`;
-				case "hates men":
-					return `Hates men.`;
-				case "hates women":
-					return `Hates women.`;
-				case "gluttonous":
-					return `Stress eater.`;
-				case "anorexic":
-					return `Anorexic.`;
-				case "devout":
-					return `Devoutly religious.`;
-				case "liberated":
-					return `Mentally liberated.`;
-				default:
-					slave.behavioralFlaw = "none";
-					return null;
+			if (slave.addict !== 0) {
+				makeSpan(c, "Add", "cyan");
+			}
+			let styles = ["lightsalmon", "strong"];
+			if (slave.hormones > 1) {
+				makeSpan(c, "Ho:F+", styles);
+			} else if (slave.hormones > 0) {
+				makeSpan(c, "Ho:F", styles);
+			} else if (slave.hormones < -1) {
+				makeSpan(c, "Ho:M+", styles);
+			} else if (slave.hormones < 0) {
+				makeSpan(c, "Ho:M", styles);
+			}
+
+			styles = ["mediumseagreen", "strong"];
+			if ((slave.bellyImplant > -1)) {
+				makeSpan(c, "Belly Imp", styles);
+			} else if (((slave.preg <= -2) || (slave.ovaries === 0)) && (slave.vagina !== -1)) {
+				makeSpan(c, "Barr", styles);
+			} else if (slave.pubertyXX === 0 && (slave.ovaries === 1 || slave.mpreg === 1)) {
+				makeSpan(c, "Prepub", styles);
+			} else if (slave.ovaryAge >= 47 && (slave.ovaries === 1 || slave.mpreg === 1)) {
+				makeSpan(c, "Meno", styles);
+			} else if (slave.pregWeek < 0) {
+				makeSpan(c, "Postpartum", styles);
+			} else if (slave.preg === -1) {
+				makeSpan(c, "CC", styles);
+			} else if (slave.preg === 0 && (slave.ovaries === 1 || slave.mpreg === 1)) {
+				makeSpan(c, "Fert+", styles);
+			} else if (((slave.preg < slave.pregData.normalBirth / 10) && (slave.preg > 0) && slave.pregKnown === 0) || slave.pregWeek === 1) {
+				makeSpan(c, "Preg?", styles);
+			} else if ((slave.preg >= 36) && (slave.broodmother > 0)) {
+				makeSpan(c, "Perm preg", styles);
+			} else if (slave.pregKnown === 1) {
+				makeSpan(c, `${slave.pregWeek} wks preg`, styles);
+			}
+			if (slave.induce === 1) {
+				makeSpan(c, "Early Labor", ["orange", "strong"]);
+			}
+			if (slave.pubertyXY === 0 && slave.balls > 0) {
+				makeSpan(c, "Prepub balls", "strong");
+			}
+			if (slave.balls > 0 && slave.vasectomy === 1) {
+				makeSpan(c, "Vasect", "strong");
+			}
+			styles = ["springgreen", "strong"];
+			if (slave.inflation === 3) {
+				makeSpan(c, `8 ltr ${slave.inflationType}`, styles);
+			} else if (slave.inflation === 2) {
+				makeSpan(c, `4 ltr ${slave.inflationType}`, styles);
+			} else if (slave.inflation === 1) {
+				makeSpan(c, `2 ltr ${slave.inflationType}`, styles);
+			} else if (slave.bellyFluid > 0) {
+				makeSpan(c, `${slave.bellyFluid}ccs ${slave.inflationType}`, styles);
+			}
+		},
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		physicals: function(slave, c) {
+			const b = bits.short;
+			b.age(slave, c);
+			b.face(slave, c);
+			b.eyes(slave, c);
+			b.ears(slave, c);
+			if (slave.markings !== "none") {
+				helpers.makeSpan(c, "Markings");
+			}
+			b.lips(slave, c);
+			b.teeth(slave, c);
+			b.muscles(slave, c);
+			helpers.addText(c, App.Desc.shortLimbs(slave));
+			b.voice(slave, c);
+			b.tits_ass(slave, c);
+			b.hips(slave, c);
+			b.waist(slave, c);
+			b.implants(slave, c);
+			b.lactation(slave, c);
+			b.mods(slave, c);
+		},
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		hormoneBalance: function(slave, c) {
+			if (slave.hormoneBalance <= -21) {
+				helpers.makeSpan(c, "HB:M", ["deepskyblue", "strong"]);
+			} else if (slave.hormoneBalance <= 20) {
+				helpers.makeSpan(c, "HB:N", ["pink", "strong"]);
+			} else if (slave.hormoneBalance <= 500) {
+				helpers.makeSpan(c, "HB:F", ["pink", "strong"]);
 			}
-		}
-		const s = descStr();
-		if (s) {
-			makeSpan(c, s, "red");
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function long_sex_flaw(slave, c) {
-		switch (slave.sexualFlaw) {
-			case "hates oral":
-			case "hates anal":
-			case "hates penetration":
-			case "shamefast":
-				makeSpan(c, slave.sexualFlaw, "red", true);
-				break;
-			case "idealistic":
-			case "repressed":
-			case "apathetic":
-			case "crude":
-			case "judgemental":
-				makeSpan(c, `Sexually ${slave.sexualFlaw}.`, "red");
-				break;
-			case "cum addict":
-			case "anal addict":
-			case "attention whore":
-				makeSpan(c, slave.sexualFlaw, "yellow", true);
-				break;
-			case "breast growth":
-				makeSpan(c, `Breast obsession.`, "yellow");
-				break;
-			case "abusive":
-			case "malicious":
-				makeSpan(c, `Sexually ${slave.sexualFlaw}.`, "yellow");
-				break;
-			case "self hating":
-				makeSpan(c, `Self hatred.`, "yellow");
-				break;
-			case "neglectful":
-				makeSpan(c, `Self neglectful.`, "yellow");
-				break;
-			case "breeder":
-				makeSpan(c, `Breeding obsession.`, "yellow");
-				break;
-			default:
-				slave.sexualFlaw = "none";
-				break;
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function long_behavior_quirk(slave, c) {
-		switch (slave.behavioralQuirk) {
-			case "confident":
-			case "cutting":
-			case "funny":
-			case "fitness":
-			case "adores women":
-			case "adores men":
-			case "insecure":
-			case "sinful":
-			case "advocate":
-				makeSpan(c, slave.behavioralQuirk, "green", true);
-				break;
-			default:
-				slave.behavioralQuirk = "none";
-				break;
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function long_sex_quirk(slave, c) {
-		switch (slave.sexualQuirk) {
-			case "gagfuck queen":
-			case "painal queen":
-			case "strugglefuck queen":
-			case "tease":
-			case "romantic":
-			case "perverted":
-			case "caring":
-			case "unflinching":
-			case "size queen":
-				makeSpan(c, slave.sexualQuirk, "green", true);
-				break;
-			default:
-				slave.sexualQuirk = "none";
-				break;
-		}
-	}
+		},
 
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @returns {string}
-	 */
-	function short_extended_family(slave) {
-		let res = "";
-		let handled = 0;
-		if (slave.mother > 0) {
-			const _ssj = V.slaves.findIndex(s => s.ID === slave.mother);
-			if (_ssj !== -1) {
-				res += `${SlaveFullName(V.slaves[_ssj])}'s ${getPronouns(slave).daughter}`;
-				if (slave.relationshipTarget === V.slaves[_ssj].ID) {
-					const friendShipShort = relationshipTermShort(slave);
-					res += ` & ${friendShipShort}`;
-					handled = 1;
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		mental: function(slave, c) {
+			const b = bits.short;
+			if (slave.fetish !== "mindbroken") {
+				if (slave.fetishKnown === 1) {
+					b.fetish(slave, c);
 				}
-			}
-			res += " ";
-		} else if (slave.mother === -1) {
-			res += `Your ${getPronouns(slave).daughter}`;
-			if (slave.relationship < -1) {
-				res += ` & ${PCrelationshipTerm(slave)}`;
-				handled = 1;
-			}
-			res += " ";
-		} else if (slave.mother in V.missingTable && V.showMissingSlavesSD && V.showMissingSlaves) {
-			res += `${V.missingTable[slave.mother].fullName}'s ${getPronouns(slave).daughter} `;
-		}
-		if (slave.father > 0 && slave.father !== slave.mother) {
-			const _ssj = V.slaves.findIndex(s => s.ID === slave.father);
-			if (_ssj !== -1) {
-				res += `${SlaveFullName(V.slaves[_ssj])}'s ${getPronouns(slave).daughter}`;
-				if (slave.relationshipTarget === V.slaves[_ssj].ID && handled !== 1) {
-					const friendShipShort = relationshipTermShort(slave);
-					res += ` & ${friendShipShort}`;
-					handled = 1;
+				if (slave.attrKnown === 1) {
+					b.attraction(slave, c);
 				}
 			}
-			res += " ";
-		} else if (slave.father === -1 && slave.mother !== -1) {
-			res += `Your ${getPronouns(slave).daughter}`;
-			if (slave.relationship < -1) {
-				res += ` & ${PCrelationshipTerm(slave)}`;
-				handled = 1;
-			}
-			res += " ";
-		} else if (slave.father in V.missingTable && slave.father !== slave.mother && V.showMissingSlavesSD && V.showMissingSlaves) {
-			res += `${V.missingTable[slave.father].fullName}'s ${getPronouns(slave).daughter}`;
-		}
-		if (slave.daughters === 1) {
-			let _ssj = V.slaves.findIndex(s => s.mother === slave.ID);
-			if (_ssj !== -1) {
-				res += `${SlaveFullName(V.slaves[_ssj])}'s mother`;
-				if (slave.relationshipTarget === V.slaves[_ssj].ID) {
-					const friendShipShort = relationshipTermShort(slave);
-					res += ` & ${friendShipShort}`;
-					handled = 1;
+			if (slave.clitPiercing === 3) {
+				b.smart_fetish(slave, c);
+				b.smart_attraction(slave, c);
+			}
+			b.behavior_flaw(slave, c);
+			b.sex_flaw(slave, c);
+			b.behavior_quirk(slave, c);
+			b.sex_quirk(slave, c);
+		},
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		skills: function(slave, c) {
+			const b = bits.short;
+			b.intelligence(slave, c);
+			b.skills(slave, c);
+			b.prestige(slave, c);
+			b.porn_prestige(slave, c);
+		},
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		race: function(slave, c) {
+			function descStr(slave) {
+				switch (slave.race) {
+					case "white":
+						return `C`;
+					case "asian":
+						return `A`;
+					case "indo-aryan":
+						return `I`;
+					case "latina":
+						return `L`;
+					case "middle eastern":
+						return `ME`;
+					case "black":
+						return `B`;
+					case "pacific islander":
+						return `PI`;
+					case "malay":
+						return `M`;
+					case "amerindian":
+						return `AI`;
+					case "semitic":
+						return `S`;
+					case "southern european":
+						return `SE`;
+					case "mixed race":
+						return `MR`;
+					default:
+						return `${slave.race.charAt(0).toUpperCase() + slave.race.charAt(1) + slave.race.charAt(2)}`;
 				}
 			}
-			res += " ";
-			_ssj = V.slaves.findIndex(s => s.father === slave.ID);
-			if (_ssj !== -1) {
-				res += `${SlaveFullName(V.slaves[_ssj])}'s father`;
-				if (slave.relationshipTarget === V.slaves[_ssj].ID && handled !== 1) {
-					const friendShipShort = relationshipTermShort(slave);
-					res += ` & ${friendShipShort}`;
-					handled = 1;
+			helpers.makeSpan(c, descStr(slave), "tan");
+		},
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		nationality: function(slave, c) {
+			function descStr(slave) {
+				switch (slave.nationality) {
+					case "Afghan":
+						return "Afg";
+					case "Albanian":
+						return "Alb";
+					case "Algerian":
+						return "Alg";
+					case "American":
+						return "USA";
+					case "Andorran":
+						return "And";
+					case "Angolan":
+						return "Ang";
+					case "Antiguan":
+						return "AB";
+					case "Argentinian":
+						return "Arg";
+					case "Armenian":
+						return "Arm";
+					case "Aruban":
+						return "Aru";
+					case "Australian":
+						return "Aus";
+					case "Austrian":
+						return "Aut";
+					case "Azerbaijani":
+						return "Aze";
+					case "Bahamian":
+						return "Bah";
+					case "Bahraini":
+						return "Bah";
+					case "Bangladeshi":
+						return "Bgd";
+					case "Barbadian":
+						return "Bar";
+					case "Belarusian":
+						return "Ber";
+					case "Belgian":
+						return "Bel";
+					case "Belizean":
+						return "Blz";
+					case "Beninese":
+						return "Ben";
+					case "Bermudian":
+						return "Bmd";
+					case "Bhutanese":
+						return "Bhu";
+					case "Bissau-Guinean":
+						return "GB";
+					case "Bolivian":
+						return "Bol";
+					case "Bosnian":
+						return "Bos";
+					case "Brazilian":
+						return "Bra";
+					case "British":
+						return "UK";
+					case "Bruneian":
+						return "Bru";
+					case "Bulgarian":
+						return "Bul";
+					case "Burkinabé":
+						return "BF";
+					case "Burmese":
+						return "Bur";
+					case "Burundian":
+						return "Bnd";
+					case "Cambodian":
+						return "Kam";
+					case "Cameroonian":
+						return "Cam";
+					case "Canadian":
+						return "Can";
+					case "Cape Verdean":
+						return "CV";
+					case "Catalan":
+						return "Cat";
+					case "Central African":
+						return "CAR";
+					case "Chadian":
+						return "Cha";
+					case "Chilean":
+						return "Chl";
+					case "Chinese":
+						return "Chi";
+					case "Colombian":
+						return "Col";
+					case "Comorian":
+						return "Com";
+					case "Congolese":
+						return "RC";
+					case "a Cook Islander":
+						return "CI";
+					case "Costa Rican":
+						return "CR";
+					case "Croatian":
+						return "Cro";
+					case "Cuban":
+						return "Cub";
+					case "Curaçaoan":
+						return "Cur";
+					case "Cypriot":
+						return "Cyp";
+					case "Czech":
+						return "Cze";
+					case "Danish":
+						return "Den";
+					case "Djiboutian":
+						return "Dji";
+					case "Dominican":
+						return "DR";
+					case "Dominiquais":
+						return "Dom";
+					case "Dutch":
+						return "Nld";
+					case "East Timorese":
+						return "ET";
+					case "Ecuadorian":
+						return "Ecu";
+					case "Egyptian":
+						return "Egy";
+					case "Emirati":
+						return "UAE";
+					case "Equatoguinean":
+						return "EG";
+					case "Eritrean":
+						return "Eri";
+					case "Estonian":
+						return "Est";
+					case "Ethiopian":
+						return "Eth";
+					case "Fijian":
+						return "Fij";
+					case "Filipina":
+						return "Phl";
+					case "Finnish":
+						return "Fin";
+					case "French":
+						return "Fra";
+					case "French Guianan":
+						return "FG";
+					case "French Polynesian":
+						return "FP";
+					case "Gabonese":
+						return "Gab";
+					case "Gambian":
+						return "Gam";
+					case "Georgian":
+						return "Geo";
+					case "German":
+						return "Ger";
+					case "Ghanan":
+						return "Gha";
+					case "Greek":
+						return "Gre";
+					case "Greenlandic":
+						return "Grn";
+					case "Grenadian":
+						return "Gda";
+					case "Guamanian":
+						return "Gua";
+					case "Guatemalan":
+						return "Gtm";
+					case "Guinean":
+						return "Gui";
+					case "Guyanese":
+						return "Guy";
+					case "Haitian":
+						return "Hai";
+					case "Honduran":
+						return "Hon";
+					case "Hungarian":
+						return "Hun";
+					case "I-Kiribati":
+						return "Kir";
+					case "Icelandic":
+						return "Ice";
+					case "Indian":
+						return "Ind";
+					case "Indonesian":
+						return "Idn";
+					case "Iranian":
+						return "Irn";
+					case "Iraqi":
+						return "Irq";
+					case "Irish":
+						return "Irl";
+					case "Israeli":
+						return "Isr";
+					case "Italian":
+						return "Ita";
+					case "Ivorian":
+						return "IC";
+					case "Jamaican":
+						return "Jam";
+					case "Japanese":
+						return "Jpn";
+					case "Jordanian":
+						return "Jor";
+					case "Kazakh":
+						return "Kaz";
+					case "Kenyan":
+						return "Ken";
+					case "Kittitian":
+						return "SKN";
+					case "Korean":
+						return "Kor";
+					case "Kosovan":
+						return "Kos";
+					case "Kurdish":
+						return "Kur";
+					case "Kuwaiti":
+						return "Kuw";
+					case "Kyrgyz":
+						return "Kyr";
+					case "Laotian":
+						return "Lao";
+					case "Latvian":
+						return "Lat";
+					case "Lebanese":
+						return "Lbn";
+					case "Liberian":
+						return "Lib";
+					case "Libyan":
+						return "Lby";
+					case "a Liechtensteiner":
+						return "Lie";
+					case "Lithuanian":
+						return "Lit";
+					case "Luxembourgian":
+						return "Lux";
+					case "Macedonian":
+						return "Mac";
+					case "Malagasy":
+						return "Mad";
+					case "Malawian":
+						return "Mwi";
+					case "Malaysian":
+						return "Mys";
+					case "Maldivian":
+						return "Mdv";
+					case "Malian":
+						return "Mal";
+					case "Maltese":
+						return "Mlt";
+					case "Marshallese":
+						return "MI";
+					case "Mauritanian":
+						return "Mta";
+					case "Mauritian":
+						return "Mts";
+					case "Mexican":
+						return "Mex";
+					case "Micronesian":
+						return "FSM";
+					case "Moldovan":
+						return "Mol";
+					case "Monégasque":
+						return "Mnc";
+					case "Mongolian":
+						return "Mon";
+					case "Montenegrin":
+						return "Mng";
+					case "Moroccan":
+						return "Mor";
+					case "Mosotho":
+						return "Les";
+					case "Motswana":
+						return "Bot";
+					case "Mozambican":
+						return "Moz";
+					case "Namibian":
+						return "Nam";
+					case "Nauruan":
+						return "Nau";
+					case "Nepalese":
+						return "Npl";
+					case "New Caledonian":
+						return "NC";
+					case "a New Zealander":
+						return "NZ";
+					case "Ni-Vanuatu":
+						return "Van";
+					case "Nicaraguan":
+						return "Nic";
+					case "Nigerian":
+						return "Nga";
+					case "Nigerien":
+						return "Ngr";
+					case "Niuean":
+						return "Niu";
+					case "Norwegian":
+						return "Nor";
+					case "Omani":
+						return "Omn";
+					case "Pakistani":
+						return "Pak";
+					case "Palauan":
+						return "Plu";
+					case "Palestinian":
+						return "Pal";
+					case "Panamanian":
+						return "Pan";
+					case "Papua New Guinean":
+						return "PNG";
+					case "Paraguayan":
+						return "Par";
+					case "Peruvian":
+						return "Per";
+					case "Polish":
+						return "Pol";
+					case "Portuguese":
+						return "Por";
+					case "Puerto Rican":
+						return "PR";
+					case "Qatari":
+						return "Qat";
+					case "Romanian":
+						return "Rom";
+					case "Russian":
+						return "Rus";
+					case "Rwandan":
+						return "Rwa";
+					case "Sahrawi":
+						return "Sah";
+					case "Saint Lucian":
+						return "SL";
+					case "Salvadoran":
+						return "ES";
+					case "Sammarinese":
+						return "SM";
+					case "Samoan":
+						return "Sam";
+					case "São Toméan":
+						return "STP";
+					case "Saudi":
+						return "Sau";
+					case "Scottish":
+						return "Sco";
+					case "Senegalese":
+						return "Sen";
+					case "Serbian":
+						return "Srb";
+					case "Seychellois":
+						return "Sey";
+					case "Sierra Leonean":
+						return "Sie";
+					case "Singaporean":
+						return "Sng";
+					case "Slovak":
+						return "Svk";
+					case "Slovene":
+						return "Svn";
+					case "a Solomon Islander":
+						return "SI";
+					case "Somali":
+						return "Som";
+					case "South African":
+						return "RSA";
+					case "South Sudanese":
+						return "SS";
+					case "Spanish":
+						return "Spa";
+					case "Sri Lankan":
+						return "Sri";
+					case "Sudanese":
+						return "Sud";
+					case "Surinamese":
+						return "Sur";
+					case "Swazi":
+						return "Swa";
+					case "Swedish":
+						return "Swe";
+					case "Swiss":
+						return "Swi";
+					case "Syrian":
+						return "Syr";
+					case "Taiwanese":
+						return "Tai";
+					case "Tajik":
+						return "Taj";
+					case "Tanzanian":
+						return "Tza";
+					case "Thai":
+						return "Tha";
+					case "Tibetan":
+						return "Tib";
+					case "Togolese":
+						return "Tog";
+					case "Tongan":
+						return "Ton";
+					case "Trinidadian":
+						return "TT";
+					case "Tunisian":
+						return "Tun";
+					case "Turkish":
+						return "Tur";
+					case "Turkmen":
+						return "Tkm";
+					case "Tuvaluan":
+						return "Tuv";
+					case "Ugandan":
+						return "Uga";
+					case "Ukrainian":
+						return "Ukr";
+					case "Uruguayan":
+						return "Uru";
+					case "Uzbek":
+						return "Uzb";
+					case "Vatican":
+						return "VC";
+					case "Venezuelan":
+						return "Ven";
+					case "Vietnamese":
+						return "Vnm";
+					case "Vincentian":
+						return "SVG";
+					case "Yemeni":
+						return "Yem";
+					case "Zairian":
+						return "DRC";
+					case "Zambian":
+						return "Zam";
+					case "Zimbabwean":
+						if (slave.race === "white") {
+							return `Rho`;
+						} else {
+							return `Zwe`;
+						}
+					case "Ancient Chinese Revivalist":
+						return `Chi Rev`;
+					case "Ancient Egyptian Revivalist":
+						return `Egy Rev`;
+					case "Arabian Revivalist":
+						return `Ara Rev`;
+					case "Aztec Revivalist":
+						return `Azt Rev`;
+					case "Edo Revivalist":
+						return `Edo Rev`;
+					case "Roman Revivalist":
+						return `Rom Rev`;
+					case "":
+					case "none":
+					case "slave":
+					case "Stateless":
+						return "None";
+					default:
+						return `${slave.nationality.charAt(0) + slave.nationality.charAt(1) + slave.nationality.charAt(2)}`;
 				}
 			}
-			res += " ";
-		} else if (slave.daughters > 1) {
-			res += `multiple daughters `;
-		}
-		if (slave.sisters === 1) {
-			const _ssj = V.slaves.findIndex(s => areSisters(s, slave) > 0);
-			if (_ssj !== -1) {
-				res += `${SlaveFullName(V.slaves[_ssj])}'s ${getPronouns(slave).sister}`;
-				if (slave.relationshipTarget === V.slaves[_ssj].ID) {
-					const friendShipShort = relationshipTermShort(slave);
-					res += `& ${friendShipShort}`;
-					handled = 1;
+
+			helpers.makeSpan(c, descStr(slave), "tan");
+		},
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		skin: function(slave, c) {
+			function descStr(slave) {
+				switch (slave.skin) {
+					case "pure white":
+						return `P. Whi`;
+					case "extremely fair":
+						return `E. Fai`;
+					case "very fair":
+						return `V. Fai`;
+					case "extremely pale":
+						return `E. Pal`;
+					case "very pale":
+						return `V. Pal`;
+					case "light brown":
+						return `L. Br`;
+					case "dark brown":
+						return `D. Br`;
+					case "light olive":
+						return `L. Oli`;
+					case "dark olive":
+						return `D. Oli`;
+					case "light beige":
+						return `L. Bei`;
+					case "dark beige":
+						return `D. Bei`;
+					case "tan":
+						return `Tan`;
+					case "bronze":
+						return `Bron`;
+					case "ebony":
+						return `Ebon`;
+					case "pure black":
+						return `P. Bla`;
+					case "dark":
+					case "fair":
+					case "pale":
+						return `${slave.skin.charAt(0).toUpperCase() + slave.skin.slice(1)}`;
+					default:
+						return `${slave.skin.charAt(0).toUpperCase() + slave.skin.charAt(1) + slave.skin.charAt(2)}`;
 				}
 			}
-			res += " ";
-		} else if (slave.sisters > 1) {
-			res += `multiple sisters `;
-		}
-		if (slave.relationship > 0 && handled !== 1) {
-			const _ssj = V.slaves.findIndex(s => s.ID === slave.relationshipTarget);
-			if (_ssj !== -1) {
-				res += `${SlaveFullName(V.slaves[_ssj])}'s`;
-				const friendShipShort = relationshipTermShort(slave);
-				res += ` ${friendShipShort}`;
+			helpers.makeSpan(c, descStr(slave));
+		},
+
+		clothes: function() { },
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		rulesets: function(slave, c) {
+			if (slave.useRulesAssistant === 0) {
+				helpers.makeSpan(c, "RA-Exmt", "lightgreen");
 			}
-		} else if (slave.relationship === -3 && slave.mother !== -1 && slave.father !== -1) {
-			res += `Your ${getPronouns(slave).wife}`;
-		} else if (slave.relationship === -2) {
-			res += `E Bonded`;
-		} else if (slave.relationship === -1) {
-			res += `E Slut`;
-		}
-		return res;
-	}
+		},
 
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function short_clone(slave, c) {
-		if (slave.clone !== 0) {
-			makeSpan(c, "Clone");
+		origins: function() { },
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		relations: function(slave, c) {
+			const b = bits.short;
+			b.family(slave, c);
+			b.clone(slave, c);
+			b.rival(slave, c);
 		}
-	}
 
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function short_rival(slave, c) {
-		if (slave.rivalry !== 0) {
-			const block = makeBlock(c, "lightsalmon");
-			const _ssj = V.slaves.findIndex(s => s.ID === slave.rivalryTarget);
-			if (_ssj !== -1) {
-				if (slave.rivalry <= 1) {
-					block.textContent = `Disl ${SlaveFullName(V.slaves[_ssj])}`;
-				} else if (slave.rivalry <= 2) {
-					block.textContent = `${SlaveFullName(V.slaves[_ssj])}'s rival`;
+	};
+
+	const longRenderers = {
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		devotion: function(slave, c) {
+			const makeSpan = helpers.makeSpan;
+			if (slave.fetish === "mindbroken") {
+				makeSpan(c, "Mindbroken.", "mindbroken");
+			} else if (slave.devotion < -95) {
+				makeSpan(c, "Very hateful", ["devotion", "hateful"], true, slave.devotion);
+			} else if (slave.devotion < -50) {
+				makeSpan(c, "Hateful", ["devotion", "hateful"], true, slave.devotion);
+			} else if (slave.devotion < -20) {
+				makeSpan(c, "Resistant", ["devotion", "resistant"], true, slave.devotion);
+			} else if (slave.devotion <= 20) {
+				makeSpan(c, "Ambivalent", ["devotion", "ambivalent"], true, slave.devotion);
+			} else if (slave.devotion <= 50) {
+				makeSpan(c, "Accepting", ["devotion", "accept"], true, slave.devotion);
+			} else if (slave.devotion <= 95) {
+				makeSpan(c, "Devoted", ["devotion", "devoted"], true, slave.devotion);
+			} else {
+				makeSpan(c, "Worshipful", ["devotion", "worship"], true, slave.devotion);
+			}
+			if (slave.fetish === "mindbroken") {
+				return;
+			} else if (slave.trust < -95) {
+				makeSpan(c, "Extremely terrified", ["trust", "extremely-terrified"], true, slave.trust);
+			} else if (slave.trust < -50) {
+				makeSpan(c, "Terrified", ["trust", "terrified"], true, slave.trust);
+			} else if (slave.trust < -20) {
+				makeSpan(c, "Frightened", ["trust", "frightened"], true, slave.trust);
+			} else if (slave.trust <= 20) {
+				makeSpan(c, "Fearful", ["trust", "fearful"], true, slave.trust);
+			} else if (slave.trust <= 50) {
+				if (slave.devotion < -20) {
+					makeSpan(c, "Careful", ["defiant", "careful"], true, slave.trust);
 				} else {
-					block.textContent = `Hates ${SlaveFullName(V.slaves[_ssj])}`;
+					makeSpan(c, "Careful", ["trust", "careful"], true, slave.trust);
 				}
-			}
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function long_extended_family(slave, c) {
-		let handled = 0;
-		const block = makeBlock();
-		if (slave.mother > 0) {
-			const _ssj = V.slaves.findIndex(s => s.ID === slave.mother);
-			if (_ssj !== -1) {
-				addText(block, `${SlaveFullName(V.slaves[_ssj])}'s `);
-				const tmpSpan = makeSpan(block, getPronouns(slave).daughter, "lightgreen");
-				if (slave.relationshipTarget === V.slaves[_ssj].ID) {
-					const friendShipShort = relationshipTerm(slave);
-					tmpSpan.textContent += ` and ${friendShipShort}`;
-					handled = 1;
+			} else if (slave.trust <= 95) {
+				if (slave.devotion < -20) {
+					makeSpan(c, "Bold", ["defiant", "bold"], true, slave.trust);
+				} else {
+					makeSpan(c, "Trusting", ["trust", "trusting"], true, slave.trust);
 				}
-				tmpSpan.textContent += '.';
-			}
-		} else if (slave.mother === -1) {
-			addText(block, `Your `);
-			if (slave.relationship < -1) {
-				makeSpan(block, `${getPronouns(slave).daughter} and ${PCrelationshipTerm(slave)}.`, "lightgreen");
-				handled = 1;
 			} else {
-				makeSpan(block, `${getPronouns(slave).daughter}.`, "lightgreen");
-			}
-		} else if (slave.mother in V.missingTable && V.showMissingSlavesSD && V.showMissingSlaves) {
-			addText(block, `${V.missingTable[slave.mother].fullName}'s `);
-			makeSpan(block, `${getPronouns(slave).daughter}.`, "lightgreen");
-		}
-		if (slave.father > 0 && slave.father !== slave.mother) {
-			const _ssj = V.slaves.findIndex(s => s.ID === slave.father);
-			if (_ssj !== -1) {
-				addText(block, `${SlaveFullName(V.slaves[_ssj])}'s `);
-				const tmpSpan = makeSpan(block, getPronouns(slave).daughter, "lightgreen");
-				if (slave.relationshipTarget === V.slaves[_ssj].ID) {
-					const friendShipShort = relationshipTerm(slave);
-					tmpSpan.textContent += ` and ${friendShipShort}`;
-					handled = 1;
+				if (slave.devotion < -20) {
+					makeSpan(c, "Defiant", ["defiant", "full"], true, slave.trust);
+				} else {
+					makeSpan(c, "Profoundly trusting", ["trust", "prof-trusting"], true, slave.trust);
 				}
-				tmpSpan.textContent += '.';
-			}
-		} else if (slave.father === -1 && slave.father !== slave.mother) {
-			addText(block, `Your `);
-			if (slave.relationship < -1) {
-				makeSpan(block, `${getPronouns(slave).daughter} and ${PCrelationshipTerm(slave)}.`, "lightgreen");
-				handled = 1;
-			} else {
-				makeSpan(block, `${getPronouns(slave).daughter}.`, "lightgreen");
 			}
-		} else if (slave.father in V.missingTable && slave.father !== slave.mother && V.showMissingSlavesSD && V.showMissingSlaves) {
-			addText(block, `${V.missingTable[slave.father].fullName}'s `);
-			makeSpan(block, `${getPronouns(slave).daughter}.`, "lightgreen");
-		}
-		if (areSisters(V.PC, slave) > 0) {
-			addText(block, `Your `);
-			if (slave.relationship < -1) {
-				makeSpan(block, `${relativeTerm(V.PC, slave)} and ${PCrelationshipTerm(slave)}.`, "lightgreen");
-				handled = 1;
-			} else {
-				makeSpan(block, `${relativeTerm(V.PC, slave)}.`, "lightgreen");
-			}
-		}
-		if (slave.daughters === 1) {
-			let _ssj = V.slaves.findIndex(s => s.mother === slave.ID);
-			if (_ssj !== -1) {
-				addText(block, `${SlaveFullName(V.slaves[_ssj])}'s `);
-				const tmpSpan = makeSpan(block, "mother", "lightgreen");
-				if (slave.relationshipTarget === V.slaves[_ssj].ID) {
-					const friendShipShort = relationshipTerm(slave);
-					tmpSpan.textContent += ` and ${friendShipShort}`;
-					handled = 1;
+		},
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		health: function(slave, c) {
+			const b = bits.long;
+			b.health(slave, c);
+			b.illness(slave, c);
+			b.tired(slave, c);
+		},
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		weight: function(slave, c) {
+			const makeSpan = helpers.makeSpan;
+			if (slave.weight < -95) {
+				makeSpan(c, "Emaciated", "red", true, slave.weight);
+			} else if (slave.weight < -30) {
+				if (slave.hips < -1) {
+					makeSpan(c, "Model-thin", null, true, slave.weight);
+				} else {
+					makeSpan(c, "Very thin", "red", true, slave.weight);
 				}
-				tmpSpan.textContent += '.';
-			}
-			_ssj = V.slaves.findIndex(s => s.father === slave.ID);
-			if (_ssj !== -1) {
-				addText(block, `${SlaveFullName(V.slaves[_ssj])}'s `);
-				const tmpSpan = makeSpan(block, "father", "lightgreen");
-				if (slave.relationshipTarget === V.slaves[_ssj].ID) {
-					const friendShipShort = relationshipTerm(slave);
-					tmpSpan.textContent += ` and ${friendShipShort}`;
-					handled = 1;
+			} else if (slave.weight < -10) {
+				makeSpan(c, "Thin", null, true, slave.weight);
+			} else if (slave.weight <= 10) {
+				makeSpan(c, "Trim", null, true, slave.weight);
+			} else if (slave.weight <= 30) {
+				makeSpan(c, "Plush", null, true, slave.weight);
+			} else if (slave.weight <= 95) {
+				if (slave.hips > 1 || V.arcologies[0].FSHedonisticDecadence !== "unset") {
+					makeSpan(c, "Nicely chubby", null, true, slave.weight);
+				} else {
+					makeSpan(c, "Overweight", "red", true, slave.weight);
 				}
-				tmpSpan.textContent += '.';
-			}
-		} else if (slave.daughters > 1) {
-			if (slave.daughters > 10) {
-				makeSpan(block, "Has tons of daughters.", "lightgreen");
-			} else if (slave.daughters > 5) {
-				makeSpan(block, "Has many daughters.", "lightgreen");
-			} else {
-				makeSpan(block, "Has several daughters.", "lightgreen");
-			}
-		}
-		if (slave.sisters === 1) {
-			const _ssj = V.slaves.findIndex(s => areSisters(s, slave) > 0);
-			if (_ssj !== -1) {
-				addText(block, `${SlaveFullName(V.slaves[_ssj])}'s `);
-				const tmpSpan = makeSpan(block, getPronouns(slave).sister, "lightgreen");
-				if (slave.relationshipTarget === V.slaves[_ssj].ID) {
-					const friendShipShort = relationshipTerm(slave);
-					tmpSpan.textContent += ` and ${friendShipShort}`;
-					handled = 1;
+			} else if (slave.weight <= 130) {
+				if (slave.hips > 2 || V.arcologies[0].FSHedonisticDecadence !== "unset") {
+					makeSpan(c, "Pleasantly soft and shapely", null, true, slave.weight);
+				} else {
+					makeSpan(c, "Fat", "red", true, slave.weight);
+				}
+			} else if (slave.weight <= 160) {
+				if (V.arcologies[0].FSHedonisticDecadence !== "unset") {
+					makeSpan(c, "Amazingly voluptuous", null, true, slave.weight);
+				} else {
+					makeSpan(c, "Obese", "red", true, slave.weight);
+				}
+			} else if (slave.weight <= 190) {
+				if (V.arcologies[0].FSHedonisticDecadence !== "unset") {
+					makeSpan(c, "SSBBW", null, true, slave.weight);
+				} else {
+					makeSpan(c, "Super Obese", "red", true, slave.weight);
 				}
-				tmpSpan.textContent += '.';
-			}
-		} else if (slave.sisters > 1) {
-			if (slave.sisters > 10) {
-				makeSpan(block, "One of many sisters.", "lightgreen");
-			} else if (slave.sisters > 5) {
-				makeSpan(block, "Has many sisters.", "lightgreen");
 			} else {
-				makeSpan(block, "Has several sisters.", "lightgreen");
-			}
-		}
-		if (slave.relationship > 0 && handled !== 1) {
-			const _ssj = V.slaves.findIndex(s => s.ID === slave.relationshipTarget);
-			if (_ssj !== -1) {
-				const friendship = relationshipTerm(slave);
-				addText(block, `${SlaveFullName(V.slaves[_ssj])}'s `);
-				makeSpan(block, `${friendship}.`, "lightgreen");
-			}
-		} else if (slave.relationship === -3 && slave.mother !== -1 && slave.father !== -1 && areSisters(V.PC, slave) === 0) {
-			makeSpan(block, `Your ${getPronouns(slave).wife}.`, "lightgreen");
-		} else if (slave.relationship === -2) {
-			makeSpan(block, "Emotionally bonded to you.", "lightgreen");
-		} else if (slave.relationship === -1) {
-			makeSpan(block, "Emotional slut.", "lightgreen");
-		}
-
-		if (block.textContent.length > 0) {
-			c.appendChild(block);
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function long_clone(slave, c) {
-		if (slave.clone !== 0) {
-			makeSpan(c, `Clone of ${slave.clone}.`, "skyblue");
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function long_rival(slave, c) {
-		if (slave.rivalry !== 0) {
-			const block = makeBlock(c);
-			const _ssj = V.slaves.findIndex(s => s.ID === slave.rivalryTarget);
-			if (_ssj !== -1) {
-				if (slave.rivalry <= 1) {
-					makeSpan(block, "Dislikes", "lightsalmon");
-					block.appendChild(document.createTextNode(` ${SlaveFullName(V.slaves[_ssj])}.`));
-				} else if (slave.rivalry <= 2) {
-					block.appendChild(document.createTextNode(`${SlaveFullName(V.slaves[_ssj])}'s `));
-					makeSpan(block, "rival.", "lightsalmon");
+				if (V.arcologies[0].FSHedonisticDecadence !== "unset") {
+					makeSpan(c, "Perfectly massive", null, true, slave.weight);
 				} else {
-					makeSpan(block, "Hates", "lightsalmon");
-					block.appendChild(document.createTextNode(` ${SlaveFullName(V.slaves[_ssj])}.`));
+					makeSpan(c, "Dangerously Obese", "red", true, slave.weight);
 				}
 			}
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function long_clothes(slave, c) {
-		function descStr() {
-			switch (slave.clothes) {
-				case "attractive lingerie":
-					return `Nice lingerie.`;
-				case "a succubus outfit":
-					return `Succubus outfit.`;
-				case "a string bikini":
-					return `String bikini.`;
-				case "a scalemail bikini":
-					return `Scalemail bikini.`;
-				case "striped panties":
-					return `Striped panties.`;
-				case "a monokini":
-					return `Monokini.`;
-				case "an apron":
-					return `Apron.`;
-				case "a cybersuit":
-					return `Cybersuit.`;
-				case "cutoffs and a t-shirt":
-					return `Cutoffs, t-shirt.`;
-				case "a slutty outfit":
-					return `Slutty outfit.`;
-				case "uncomfortable straps":
-					return `Leather straps.`;
-				case "a fallen nuns habit":
-					return `Slutty habit.`;
-				case "a chattel habit":
-					return `Chattel habit.`;
-				case "a penitent nuns habit":
-					return `Cilice.`;
-				case "slutty jewelry":
-					return `Bangles.`;
-				case "attractive lingerie for a pregnant woman":
-					return `Preggo lingerie.`;
-				case "a maternity dress":
-					return `Maternity dress.`;
-				case "stretch pants and a crop-top":
-					return `Stretch pants, crop-top.`;
-				case "harem gauze":
-					return `Harem outfit.`;
-				case "a slave gown":
-					return `Slave gown.`;
-				case "a halter top dress":
-					return `Halter top dress.`;
-				case "a mini dress":
-					return `Mini dress.`;
-				case "a ball gown":
-					return `Ball gown.`;
-				case "slutty business attire":
-					return `Slutty suit.`;
-				case "nice business attire":
-					return `Nice suit.`;
-				case "a comfortable bodysuit":
-					return `Bodysuit.`;
-				case "a military uniform":
-					return `Military uniform.`;
-				case "a schutzstaffel uniform":
-					return `Schutzstaffel uniform.`;
-				case "a slutty schutzstaffel uniform":
-					return `Slutty Schutzstaffel uniform.`;
-				case "a red army uniform":
-					return `Red Army uniform.`;
-				case "a long qipao":
-					return `Long Qipao.`;
-				case "battlearmor":
-					return `Battlearmor.`;
-				case "a mounty outfit":
-					return `Mounty outfit.`;
-				case "a dirndl":
-					return `Dirndl.`;
-				case "lederhosen":
-					return `Lederhosen.`;
-				case "a biyelgee costume":
-					return `Biyelgee costume.`;
-				case "a leotard":
-					return `Leotard.`;
-				case "a bunny outfit":
-					return `Bunny outfit.`;
-				case "a slutty maid outfit":
-					return `Slutty maid.`;
-				case "a nice maid outfit":
-					return `Nice maid.`;
-				case "a slutty nurse outfit":
-					return `Slutty nurse.`;
-				case "a nice nurse outfit":
-					return `Nice nurse.`;
-				case "a schoolgirl outfit":
-					return `Schoolgirl outfit.`;
-				case "a kimono":
-					return `Kimono.`;
-				case "a hijab and abaya":
-					return `Hijab and abaya.`;
-				case "battledress":
-					return `Battledress.`;
-				case "a latex catsuit":
-					return `Nice latex.`;
-				case "restrictive latex":
-					return `Bondage latex.`;
-				case "conservative clothing":
-					return `Conservative clothing.`;
-				case "chains":
-					return `Chains.`;
-				case "overalls":
-					return `Overalls.`;
-				case "a cheerleader outfit":
-					return `Cheerleader.`;
-				case "clubslut netting":
-					return `Netting.`;
-				case "shibari ropes":
-					return `Shibari.`;
-				case "Western clothing":
-					return `Chaps.`;
-				case "body oil":
-					return `Body oil.`;
-				case "a toga":
-					return `Toga.`;
-				case "a huipil":
-					return `Huipil.`;
-				case "a slutty qipao":
-					return `Slutty qipao.`;
-				case "spats and a tank top":
-					return `Spats, tank top.`;
-				case "a burkini":
-					return `Burkini.`;
-				case "a niqab and abaya":
-					return `Niqab and abaya.`;
-				case "a klan robe":
-					return `Klan robe.`;
-				case "a hijab and blouse":
-					return `Hijab and blouse.`;
-				case "a burqa":
-					return `Burqa.`;
-				case "kitty lingerie":
-					return `Kitty lingerie.`;
-				case "a tube top and thong":
-					return `Tube top, thong.`;
-				case "a button-up shirt and panties":
-					return `Button-up shirt, panties.`;
-				case "a gothic lolita dress":
-					return `Gothic lolita dress.`;
-				case "a hanbok":
-					return `Hanbok.`;
-				case "a bra":
-					return `Nice bra.`;
-				case "a button-up shirt":
-					return `Nice button-up shirt.`;
-				case "a nice pony outfit":
-					return `Nice pony outfit.`;
-				case "a sweater":
-					return `Nice sweater.`;
-				case "a tank-top":
-					return `Nice tank-top.`;
-				case "a thong":
-					return `Nice thong.`;
-				case "a tube top":
-					return `Nice tube top.`;
-				case "a one-piece swimsuit":
-					return `Swimsuit.`;
-				case "a police uniform":
-					return `Police uniform.`;
-				case "a striped bra":
-					return `Striped bra.`;
-				case "a skimpy loincloth":
-					return `Skimpy loincloth.`;
-				case "a slutty klan robe":
-					return `Slutty klan robe.`;
-				case "a slutty pony outfit":
-					return `Slutty pony outfit.`;
-				case "a Santa dress":
-					return `Santa dress.`;
-				case "a sports bra":
-					return `Sports bra.`;
-				case "a sweater and panties":
-					return `Sweater, panties.`;
-				case "a t-shirt":
-					return `T-shirt.`;
-				case "a tank-top and panties":
-					return `Tank-top, panties.`;
-				case "a t-shirt and thong":
-					return `Thong, t-shirt.`;
-				case "an oversized t-shirt and boyshorts":
-					return `Over-sized t-shirt, boy shorts.`;
-				case "an oversized t-shirt":
-					return `Nice over-sized t-shirt.`;
-				case "a t-shirt and jeans":
-					return `Blue jeans, t-shirt.`;
-				case "boyshorts":
-					return `Boy shorts.`;
-				case "cutoffs":
-					return `Jean shorts.`;
-				case "leather pants and pasties":
-					return `Leather pants, pasties.`;
-				case "leather pants":
-					return `Nice leather pants.`;
-				case "panties":
-					return `Nice panties.`;
-				case "sport shorts and a t-shirt":
-					return `Nice sport shorts, shirt.`;
-				case "a t-shirt and panties":
-					return `Panties, t-shirt.`;
-				case "panties and pasties":
-					return `Pasties, panties.`;
-				case "pasties":
-					return `Pasties.`;
-				case "striped underwear":
-					return `Striped underwear`;
-				case "sport shorts and a sports bra":
-					return `Shorts, bra.`;
-				case "jeans":
-					return `Tight blue jeans.`;
-				case "a sweater and cutoffs":
-					return `Jean shorts, sweater.`;
-				case "leather pants and a tube top":
-					return `Leather pants, tube top.`;
-				case "sport shorts":
-					return `Shorts.`;
-				case "a bimbo outfit":
-					return `Bimbo outfit.`;
-				case "a courtesan dress":
-					return `Courtesan dress.`;
-				default:
-					return `Naked.`;
-			}
-		}
-		makeSpan(c, descStr());
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function long_collar(slave, c) {
-		function descStr() {
-			switch (slave.collar) {
-				case "uncomfortable leather":
-					return `Leather collar.`;
-				case "tight steel":
-					return `Steel collar.`;
-				case "preg biometrics":
-					return `Pregnancy biometrics collar.`;
-				case "cruel retirement counter":
-					return `Cruel counter collar.`;
-				case "shock punishment":
-					return `Shock collar.`;
-				case "dildo gag":
-					return `Dildo gag.`;
-				case "massive dildo gag":
-					return `Throat-bulging dildo gag.`;
-				case "neck corset":
-					return `Neck corset.`;
-				case "stylish leather":
-					return `Stylish leather collar.`;
-				case "satin choker":
-					return `Satin choker.`;
-				case "silk ribbon":
-					return `Silken ribbon.`;
-				case "heavy gold":
-					return `Gold collar.`;
-				case "bowtie":
-					return `Bowtie collar.`;
-				case "pretty jewelry":
-					return `Pretty collar.`;
-				case "nice retirement counter":
-					return `Nice counter collar.`;
-				case "bell collar":
-					return `Bell collar.`;
-				case "leather with cowbell":
-					return `Cowbell collar.`;
-				case "ancient Egyptian":
-					return `Wesekh.`;
-				case "ball gag":
-					return `Ball gag.`;
-				case "bit gag":
-					return `Bit gag.`;
-				case "porcelain mask":
-					return `Porcelain mask.`;
-				default:
-					return null;
-			}
-		}
-		const s = descStr();
-		if (s) {
-			makeSpan(c, s);
-		}
-	}
+		},
 
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function long_belly(slave, c) {
-		function descStr() {
-			switch (slave.bellyAccessory) {
-				case "shapewear":
-					return `Shapewear.`;
-				case "a small empathy belly":
-					return `Small fake belly.`;
-				case "a medium empathy belly":
-					return `Medium fake belly.`;
-				case "a large empathy belly":
-					return `Large fake belly.`;
-				case "a huge empathy belly":
-					return `Huge fake belly.`;
-				case "a corset":
-					return `Corset.`;
-				case "an extreme corset":
-					return `Extreme corsetage.`;
-				case "a support band":
-					return `Support band.`;
-				default:
-					return null;
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		rules: function(slave, c) {
+			const addText = helpers.addText;
+			addText(c, `Living standard: ${slave.rules.living}. `);
+			if (canTalk(slave, false)) {
+				addText(c, `Speech rules: ${slave.rules.speech}. `);
+			}
+			addText(c, `Relationship rules: ${slave.rules.relationship}. `);
+			addText(c, `Typical punishment: ${slave.rules.punishment}. `);
+			addText(c, `Typical reward: ${slave.rules.reward}. `);
+			addText(c, `Release rules: ${App.Utils.releaseSummaryLong(slave)}. `);
+		},
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		genitalia: function(slave, c) {
+			if (slave.dick > 0) {
+				let dickDesc = "";
+				if (slave.balls === 0) {
+					dickDesc += 'Gelded.';
+				}
+				if ((slave.dick > 8) && (slave.balls > 8)) {
+					dickDesc += `Hyper dick & balls.`;
+				} else if ((slave.dick > 5) && (slave.balls > 5)) {
+					dickDesc += `Monster dick & balls.`;
+				} else if ((slave.dick > 4) && (slave.balls > 4)) {
+					dickDesc = `Huge dick & balls.`;
+				} else if ((slave.dick > 3) && (slave.balls > 3)) {
+					dickDesc = `Big dick & balls.`;
+				} else if (slave.dick > 8) {
+					dickDesc = `Hyper dong.`;
+				} else if (slave.dick > 5) {
+					dickDesc = `Monster dong.`;
+				} else if (slave.dick > 4) {
+					dickDesc = `Huge dick.`;
+				} else if (slave.dick > 3) {
+					dickDesc = `Big dick.`;
+				} else if (slave.balls > 8) {
+					dickDesc = `Hyper balls.`;
+				} else if (slave.balls > 5) {
+					dickDesc = `Monstrous balls.`;
+				} else if (slave.balls > 4) {
+					dickDesc = `Huge balls.`;
+				} else if (slave.balls > 3) {
+					dickDesc = `Big balls.`;
+				}
+				if (dickDesc.length) {
+					helpers.makeSpan(c, dickDesc, "pink");
+				}
 			}
-		}
-		const s = descStr();
-		if (s) {
-			makeSpan(c, s);
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function long_arms(slave, c) {
-		if (["hand gloves", "elbow gloves"].includes(slave.armAccessory)) {
-			makeSpan(c, slave.armAccessory, undefined, true);
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function long_legs(slave, c) {
-		if (slave.legAccessory === "short stockings") {
-			makeSpan(c, "Short stockings.");
-		} else if (slave.legAccessory === "long stockings") {
-			makeSpan(c, "Long stockings.");
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function long_shoes(slave, c) {
-		if (["boots", "extreme heels", "extreme platform heels", "flats", "heels", "platform heels", "platform shoes", "pumps"].includes(slave.shoes)) {
-			makeSpan(c, slave.shoes, undefined, true);
-		} else if (slave.heels === 1) {
-			makeSpan(c, "Crawling.", "yellow");
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function long_chastity(slave, c) {
-		if (slave.chastityAnus === 1 && slave.chastityPenis === 1 && slave.chastityVagina === 1) {
-			makeSpan(c, "Full chastity.");
-		} else if (slave.chastityPenis === 1 && slave.chastityVagina === 1) {
-			makeSpan(c, "Genital chastity.");
-		} else if ((slave.chastityAnus === 1 && slave.chastityVagina === 1) || (slave.chastityAnus === 1 && slave.chastityPenis === 1)) {
-			makeSpan(c, "Combined chastity.");
-		} else if (slave.chastityVagina === 1) {
-			makeSpan(c, "Vaginal chastity.");
-		} else if (slave.chastityPenis === 1) {
-			makeSpan(c, "Chastity cage.");
-		} else if (slave.chastityAnus === 1) {
-			makeSpan(c, "Anal chastity.");
-		}
-	}
-
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function long_vaginal_acc(slave, c) {
-		if (slave.vaginalAttachment !== "vibrator") {
-			switch (slave.vaginalAccessory) {
-				case "bullet vibrator":
-					makeSpan(c, "Attached bullet vibrator.");
+			if (slave.vagina === 0) {
+				helpers.makeSpan(c, "Virgin.", "lime");
+			} else if ((slave.pregKnown === 1) && canWalk(slave) && (slave.clothes === "no clothing" || slave.clothes === "body oil") && (slave.shoes === "none")) {
+				helpers.makeSpan(c, "Naked, barefoot, and pregnant.", "pink");
+			}
+			if (slave.anus === 0) {
+				helpers.makeSpan(c, "Anal virgin.", "lime");
+			}
+			let holesDesc = "";
+			if ((slave.vagina > 3) && (slave.anus > 3)) {
+				holesDesc += `Blown out holes.`;
+			} else if ((slave.vagina > 2) && (slave.anus > 2)) {
+				holesDesc += `High mileage.`;
+			} else if (slave.vagina > 3) {
+				holesDesc += `Cavernous pussy.`;
+			} else if (slave.vagina > 2) {
+				holesDesc += `Loose pussy.`;
+			} else if (slave.anus > 3) {
+				holesDesc += `Permagaped anus.`;
+			} else if (slave.anus > 2) {
+				holesDesc += `Gaping anus.`;
+			}
+			if (holesDesc.length) {
+				helpers.makeSpan(c, holesDesc, "pink");
+			}
+		},
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		diet: function(slave, c) {
+			let dietDesc = "";
+			switch (slave.diet) {
+				case "restricted":
+					dietDesc = `Dieting.`;
 					break;
-				case "smart bullet vibrator":
-					makeSpan(c, "Attached smart bullet vibrator.");
+				case "fattening":
+					dietDesc = `Gaining weight.`;
 					break;
-				case "dildo":
-					makeSpan(c, "Vaginal dildo.");
+				case "corrective":
+					dietDesc = `Corrective.`;
 					break;
-				case "large dildo":
-					makeSpan(c, "Large vaginal dildo.");
+				case "XX":
+					dietDesc = `Estrogen rich.`;
 					break;
-				case "huge dildo":
-					makeSpan(c, "Huge vaginal dildo.");
+				case "XY":
+					dietDesc = `Testosterone rich.`;
 					break;
-				case "long dildo":
-					makeSpan(c, "Long vaginal dildo.");
+				case "XXY":
+					dietDesc = `Futanari mix.`;
 					break;
-				case "long, large dildo":
-					makeSpan(c, "Long and large vaginal dildo.");
+				case "muscle building":
+					dietDesc = `Pumping iron.`;
 					break;
-				case "long, huge dildo":
-					makeSpan(c, "Long and wide vaginal dildo.");
+				case "slimming":
+					dietDesc = `Slimming down.`;
 					break;
-			}
-		}
-		if (slave.vaginalAttachment !== "none") {
-			switch (slave.vaginalAttachment) {
-				case "vibrator":
-					makeSpan(c, "Vibrating dildo.");
+				case "cum production":
+					dietDesc = `Cum production.`;
+					break;
+				case "cleansing":
+					dietDesc = `Cleansing.`;
+					break;
+				case "fertility":
+					dietDesc = `Fertility.`;
 					break;
 			}
-		}
-	}
 
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function long_dick_acc(slave, c) {
-		switch (slave.dickAccessory) {
-			case "sock":
-				makeSpan(c, "Cock sock.");
-				break;
-			case "bullet vibrator":
-				makeSpan(c, "Frenulum bullet vibrator.");
-				break;
-			case "smart bullet vibrator":
-				makeSpan(c, "Smart frenulum bullet vibrator.");
-				break;
-		}
-	}
+			if (dietDesc) {
+				helpers.makeSpan(c, dietDesc, "teal");
+			}
 
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function long_buttplug(slave, c) {
-		switch (slave.buttplug) {
-			case "plug":
-				makeSpan(c, "Buttplug.");
-				break;
-			case "large plug":
-				makeSpan(c, "Large buttplug.");
-				break;
-			case "huge plug":
-				makeSpan(c, "Huge buttplug.");
-				break;
-			case "long plug":
-				makeSpan(c, "Long buttplug.");
-				break;
-			case "long, large plug":
-				makeSpan(c, "Large, long buttplug.");
-				break;
-			case "long, huge plug":
-				makeSpan(c, "Enormous buttplug.");
-				break;
-		}
-		switch (slave.buttplugAttachment) {
-			case "tail":
-				makeSpan(c, "Attached tail.");
-				break;
-			case "cat tail":
-				makeSpan(c, "Attached cat tail.");
-				break;
-			case "fox tail":
-				makeSpan(c, "Attached fox tail.");
-				break;
-			case "cow tail":
-				makeSpan(c, "Attached cow tail.");
-				break;
-		}
-	}
+			function specialDiet(text) {
+				helpers.addText(c, "Diet base: ");
+				helpers.makeSpan(c, text, "cyan");
+			}
 
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function rules_assistant(slave, c) {
-		if (slave.useRulesAssistant === 0) {
-			makeSpan(c, "RA-Exempt", "lightgreen");
-		} else if (V.abbreviateRulesets === 2 && (slave.currentRules !== undefined) && (slave.currentRules.length > 0)) {
-			c.innerHTML = `Rules: ${V.defaultRules.filter(x => ruleApplied(slave, x)).map(x => x.name).join(", ")}`;
-		}
-	}
+			if (slave.dietCum === 2) {
+				specialDiet("Cum Based.");
+			} else if (((slave.dietCum === 1) && (slave.dietMilk === 0))) {
+				specialDiet("Cum Added.");
+			} else if (((slave.dietCum === 1) && (slave.dietMilk === 1))) {
+				specialDiet("Milk & Cum Added.");
+			} else if (((slave.dietCum === 0) && (slave.dietMilk === 1))) {
+				specialDiet("Milk Added.");
+			} else if ((slave.dietMilk === 2)) {
+				specialDiet("Milk Based.");
+			}
+		},
 
-	/**
-	 * @param {App.Entity.SlaveState} slave
-	 * @param {Node} c
-	 * @returns {void}
-	 */
-	function origins(slave, c) {
-		const para = makeParagraph(c);
-		para.classList.add("gray");
-		const pronouns = getPronouns(slave);
-		para.textContent = `${slave.origin.replace(/\$([A-Z]?[a-z]+)/g, (match, cap1) => pronouns[cap1] || match)}`;
-	}
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		drugs: function(slave, c) {
+			const makeSpan = helpers.makeSpan;
+			let swd = WombGetLittersData(slave);
+			if ((slave.drugs !== "no drugs") && (slave.drugs !== "none")) {
+				makeSpan(c, `On ${slave.drugs}.`, "tan");
+			}
+			if (slave.curatives === 2) {
+				makeSpan(c, "On curatives.", "lightgreen");
+			} else if (slave.curatives === 1) {
+				makeSpan(c, "On preventatives.", "lightgreen");
+			}
+			if (slave.aphrodisiacs > 0) {
+				makeSpan(c, `On ${slave.aphrodisiacs > 1 ? 'extreme' : ''} aphrodisiacs.`, "lightblue");
+			} else if (slave.aphrodisiacs === -1) {
+				makeSpan(c, "On anaphrodisiacs.", "lightblue");
+			}
+			if (slave.addict !== 0) {
+				makeSpan(c, "Addict.", "cyan");
+			}
+			if (slave.hormones > 1) {
+				makeSpan(c, "Heavy female hormones.", "lightsalmon");
+			} else if (slave.hormones > 0) {
+				makeSpan(c, "Female hormones.", "lightsalmon");
+			} else if (slave.hormones < -1) {
+				makeSpan(c, "Heavy male hormones.", "lightsalmon");
+			} else if (slave.hormones < 0) {
+				makeSpan(c, "Male hormones.", "lightsalmon");
+			}
+			let styles = "mediumseagreen";
+			if ((slave.bellyImplant > -1)) {
+				makeSpan(c, "Belly Implant.", styles);
+			} else if ((slave.preg <= -2) && (slave.ovaries === 1 || slave.mpreg === 1)) {
+				makeSpan(c, "Barren.", styles);
+			} else if ((slave.ovaries === 0) && (slave.vagina !== -1) && (slave.genes === "XX")) {
+				makeSpan(c, "Barren.", styles);
+			} else if (slave.pubertyXX === 0 && (slave.ovaries === 1 || slave.mpreg === 1)) {
+				makeSpan(c, "Not ovulating yet.", styles);
+			} else if (slave.ovaryAge >= 47 && (slave.ovaries === 1 || slave.mpreg === 1)) {
+				makeSpan(c, "Menopausal.", styles);
+			} else if (slave.pregWeek < 0) {
+				makeSpan(c, "Postpartum.", styles);
+			} else if (slave.preg === -1) {
+				makeSpan(c, "On contraceptives.", styles);
+			} else if (slave.preg === 0 && (slave.ovaries === 1 || slave.mpreg === 1)) {
+				makeSpan(c, "Fertile.", styles);
+			} else if ((slave.preg >= 36) && (slave.broodmother > 0)) {
+				makeSpan(c, "Permanently pregnant.", styles);
+			} else if (swd.litters.length > 1) {
+				let pregTxt = `Concurrent pregnancies: (${swd.litters.length} sets).`;
+				pregTxt += ` Max:${swd.litters[0]} / Min:${swd.litters[swd.litters.length - 1]} week(s).`;
+				makeSpan(c, pregTxt, "lime");
+			} else if (((slave.preg < slave.pregData.normalBirth / 10) && (slave.preg > 0) && slave.pregKnown === 0) || slave.pregWeek === 1) {
+				makeSpan(c, "May be pregnant.");
+			} else if (slave.pregKnown === 1) {
+				if (slave.pregType < 2 || slave.broodmother > 0) {
+					makeSpan(c, `${slave.pregWeek} weeks pregnant.`);
+				} else {
+					let desc = `${slave.pregWeek} weeks pregnant with `;
+					if (slave.pregType >= 40) {
+						desc += `a tremendous brood of offspring.`;
+					} else if (slave.pregType >= 20) {
+						desc += `a brood of offspring.`;
+					} else if (slave.pregType >= 10) {
+						desc += `${slave.pregType} babies.`;
+					} else if (slave.pregType === 9) {
+						desc += `nonuplets.`;
+					} else if (slave.pregType === 8) {
+						desc += `octuplets.`;
+					} else if (slave.pregType === 7) {
+						desc += `septuplets.`;
+					} else if (slave.pregType === 6) {
+						desc += `sextuplets.`;
+					} else if (slave.pregType === 5) {
+						desc += `quintuplets.`;
+					} else if (slave.pregType === 4) {
+						desc += `quadruplets.`;
+					} else if (slave.pregType === 3) {
+						desc += `triplets.`;
+					} else {
+						desc += `twins.`;
+					}
+					makeSpan(c, desc);
+				}
+				if (slave.preg > slave.pregData.normalBirth && slave.broodmother === 0) {
+					makeSpan(c, "(Overdue.)");
+				}
+			}
+			if (slave.induce === 1) {
+				makeSpan(c, "Showing signs of early labor.", "orange");
+			}
+			if (slave.pubertyXY === 0 && slave.balls > 0) {
+				makeSpan(c, "Has not had first ejaculation.");
+			}
+			if (slave.balls > 0 && slave.vasectomy === 1) {
+				makeSpan(c, "Vasectomy.");
+			}
+			if (slave.inflation === 3) {
+				makeSpan(c, `Filled with 8 liters of ${slave.inflationType}.`, "springgreen");
+			} else if (slave.inflation === 2) {
+				makeSpan(c, `Filled with 4 liters of ${slave.inflationType}.`, "springgreen");
+			} else if (slave.inflation === 1) {
+				makeSpan(c, `Filled with 2 liters of ${slave.inflationType}.`, "springgreen");
+			} else if (slave.bellyFluid > 0) {
+				makeSpan(c, `Stuffed with ${slave.bellyFluid}ccs of ${slave.inflationType}.`, "springgreen");
+			}
+		},
 
-	/**
-	 * @param {HTMLElement} element
-	 * @param {string|string[]} [classNames]
-	 */
-	function _addClassNames(element, classNames) {
-		if (classNames != undefined) { /* eslint-disable-line eqeqeq */
-			if (Array.isArray(classNames)) {
-				element.classList.add(...classNames);
-			} else {
-				element.classList.add(classNames);
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		physicals: function(slave, c) {
+			const b = bits.long;
+			b.age(slave, c);
+			b.face(slave, c);
+			b.eyes(slave, c);
+			b.ears(slave, c);
+			b.lips(slave, c);
+			b.teeth(slave, c);
+			b.muscles(slave, c);
+			helpers.makeSpan(c, App.Desc.longLimbs(slave));
+			b.voice(slave, c);
+			b.tits_ass(slave, c);
+			b.hips(slave, c);
+			b.waist(slave, c);
+			b.implants(slave, c);
+			b.lactation(slave, c);
+			b.mods(slave, c);
+			if (!jQuery.isEmptyObject(slave.brand)) {
+				helpers.makeSpan(c, 'Branded.');
 			}
-		}
-	}
+		},
 
-	/**
-	 * @param {Node} container
-	 * @param {string} text
-	 * @param {string|string[]} [classNames]
-	 * @param {boolean} [stdDecor=false]
-	 * @param {number} [value]
-	 */
-	function makeSpan(container, text, classNames, stdDecor = false, value) {
-		let r = document.createElement("span");
-		r.classList.add("ssi");
-		_addClassNames(r, classNames);
-		if (value != undefined && V.summaryStats) { /* eslint-disable-line eqeqeq */
-			text += `[${value}]`;
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		hormoneBalance: function(slave, c) {
+			const colorClass = slave.hormoneBalance <= -21 ? "deepskyblue" : "pink";
+			let desc = "";
+			if (slave.hormoneBalance < -400) {
+				desc = `Overwhelmingly masculine`;
+			} else if (slave.hormoneBalance <= -300) {
+				desc = `Extremely masculine`;
+			} else if (slave.hormoneBalance <= -200) {
+				desc = `Heavily masculine`;
+			} else if (slave.hormoneBalance <= -100) {
+				desc = `Very masculine`;
+			} else if (slave.hormoneBalance <= -21) {
+				desc = `Masculine`;
+			} else if (slave.hormoneBalance <= 20) {
+				desc = `Neutral`;
+			} else if (slave.hormoneBalance <= 99) {
+				desc = `Feminine`;
+			} else if (slave.hormoneBalance <= 199) {
+				desc = `Very feminine`;
+			} else if (slave.hormoneBalance <= 299) {
+				desc = `Heavily feminine`;
+			} else if (slave.hormoneBalance <= 399) {
+				desc = `Extremely feminine`;
+			} else if (slave.hormoneBalance <= 500) {
+				desc = `Overwhelmingly feminine`;
+			}
+			helpers.makeSpan(c, desc + " hormone balance.", colorClass);
+		},
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		skills: function(slave, c) {
+			const b = bits.long;
+			b.intelligence(slave, c);
+			b.skills(slave, c);
+			b.prestige(slave, c);
+			b.porn_prestige(slave, c);
+		},
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		clothes: function(slave, c) {
+			const b = bits.long;
+			const dressingBlock = helpers.makeBlock(c);
+			if (slave.choosesOwnClothes === 1) {
+				helpers.makeSpan(dressingBlock, `Dressing ${getPronouns(slave).himself}.`);
+			}
+			b.clothes(slave, dressingBlock);
+			b.collar(slave, dressingBlock);
+			b.belly(slave, dressingBlock);
+			if (hasAnyArms(slave)) {
+				b.arms(slave, dressingBlock);
+			}
+			if (hasAnyLegs(slave)) {
+				b.legs(slave, dressingBlock);
+				b.shoes(slave, dressingBlock);
+			}
+			b.chastity(slave, dressingBlock);
+			b.vaginal_acc(slave, dressingBlock);
+			b.dick_acc(slave, dressingBlock);
+			b.buttplug(slave, dressingBlock);
+		},
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		mental: function(slave, c) {
+			const b = bits.long;
+			if (slave.fetish !== "mindbroken") {
+				if (slave.fetishKnown === 1) {
+					b.fetish(slave, c);
+				}
+				if (slave.attrKnown === 1) {
+					b.attraction(slave, c);
+				}
+			}
+			if (slave.clitPiercing === 3) {
+				b.smart_fetish(slave, c);
+				b.smart_attraction(slave, c);
+			}
+			b.behavior_flaw(slave, c);
+			b.sex_flaw(slave, c);
+			b.behavior_quirk(slave, c);
+			b.sex_quirk(slave, c);
+		},
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		race: function(slave, c) {
+			function descStr(slave) {
+				switch (slave.race) {
+					case "white":
+						return `Caucasian.`;
+					case "asian":
+						return `Asian.`;
+					case "indo-aryan":
+						return `Indo-aryan.`;
+					case "latina":
+						return `Latina.`;
+					case "middle eastern":
+						return `Middle Eastern.`;
+					case "black":
+						return `Black.`;
+					case "pacific islander":
+						return `Pacific Islander.`;
+					case "malay":
+						return `Malay.`;
+					case "amerindian":
+						return `Amerindian.`;
+					case "semitic":
+						return `Semitic.`;
+					case "southern european":
+						return `Southern European.`;
+					case "mixed race":
+						return `Mixed race.`;
+					default:
+						return `${slave.race.charAt(0).toUpperCase() + slave.race.slice(1)}.`;
+				}
+			}
+			helpers.makeSpan(c, descStr(slave), "tan");
+		},
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		nationality: function(slave, c) {
+			function descStr(slave) {
+				switch (slave.nationality) {
+					case "a Cook Islander":
+						return `Cook Islander.`;
+					case "a Liechtensteiner":
+						return `Liechtensteiner.`;
+					case "a New Zealander":
+						return `New Zealander.`;
+					case "a Solomon Islander":
+						return `Solomon Islander.`;
+					case "Zimbabwean":
+						if (slave.race === "white") {
+							return `Rhodesian.`;
+						} else {
+							return `${slave.nationality}.`;
+						}
+					case "slave":
+					case "none":
+					case "":
+					case "Stateless":
+						return `Stateless.`;
+					default:
+						return `${slave.nationality}.`;
+				}
+			}
+
+			helpers.makeSpan(c, descStr(slave), "tan");
+		},
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		skin: function(slave, c) {
+			helpers.makeSpan(c, `${capFirstChar(slave.skin)} skin.`);
+		},
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		rulesets: function(slave, c) {
+			if (slave.useRulesAssistant === 0) {
+				helpers.makeSpan(c, "RA-Exempt", "lightgreen");
+			} else if ((slave.currentRules !== undefined) && (slave.currentRules.length > 0)) {
+				c.innerHTML = `Rules: ${V.defaultRules.filter(x => ruleApplied(slave, x)).map(x => x.name).join(", ")}`;
+			}
+		},
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		origins: function(slave, c) {
+			const para = helpers.makeParagraph(c);
+			para.classList.add("gray");
+			const pronouns = getPronouns(slave);
+			para.textContent = `${slave.origin.replace(/\$([A-Z]?[a-z]+)/g, (match, cap1) => pronouns[cap1] || match)}`;
+		},
+
+		/**
+		 * @param {App.Entity.SlaveState} slave
+		 * @param {Node} c
+		 * @returns {void}
+		 */
+		relations: function(slave, c) {
+			const b = bits.long;
+			b.family(slave, c);
+			b.clone(slave, c);
+			b.rival(slave, c);
+		}
+	};
+
+	return {
+		short: shortRenderers,
+		long: longRenderers,
+		empty: function(){}
+	};
+}();
+
+App.UI.SlaveSummary = function() {
+	const emptyRenderer = (/** @type {App.Entity.SlaveState} */ slave, /** @type {Node} */ c) => { };
+	const delegates = {
+		clothes: emptyRenderer,
+		devotion: emptyRenderer,
+		rules: emptyRenderer,
+		height: emptyRenderer,
+		diet: emptyRenderer,
+		health: emptyRenderer,
+		drugs: emptyRenderer,
+		race: emptyRenderer,
+		nationality: emptyRenderer,
+		genitalia: emptyRenderer,
+		physicals: emptyRenderer,
+		hormoneBalance: emptyRenderer,
+		skills: emptyRenderer,
+		mental: emptyRenderer,
+		weight: emptyRenderer,
+		skin: emptyRenderer,
+		origins: emptyRenderer,
+		rulesets: emptyRenderer,
+		relations: emptyRenderer
+	};
+
+	let delegatesAreValid = false;
+
+	/**
+	 * @returns {App.UI.SlaveSummary.State}
+	 */
+	function makeNewState() {
+		return {
+			abbreviation: {
+				clothes: 2,
+				devotion: 2,
+				diet: 2,
+				drugs: 2,
+				genitalia: 2,
+				health: 2,
+				mental: 2,
+				nationality: 2,
+				origins: 2,
+				physicals: 2,
+				race: 2,
+				rules: 2,
+				rulesets: 2,
+				skills: 2,
+			}
+		};
+	}
+
+	function delegateForSetting(name, setting) {
+		switch (setting) {
+			case 0: return App.UI.SlaveSummaryRenderers.empty;
+			case 1: return App.UI.SlaveSummaryRenderers.short[name];
+			case 2: return App.UI.SlaveSummaryRenderers.long[name];
+		}
+	}
+
+	function initDelegates(settingsObj) {
+		settingsObj = settingsObj || V.UI.slaveSummary;
+		/** @type {App.UI.SlaveSummary.AbbreviationState} */
+		const abbrSettings = settingsObj.abbreviation;
+		for (const setting in abbrSettings) {
+			delegates[setting] = delegateForSetting(setting, abbrSettings[setting]);
+		}
+		delegates.weight = delegateForSetting("weight", abbrSettings.diet);
+		delegates.skin = delegateForSetting("skin", abbrSettings.physicals);
+		delegates.relations = delegateForSetting("relations", abbrSettings.mental);
+		// special settings
+		if (!V.seeRace) {
+			delegates.race = emptyRenderer;
+		}
+	}
+
+	/**
+	 * @param {App.Entity.SlaveState} slave
+	 * @returns {DocumentFragment}
+	 */
+	function render(slave) {
+		/** @type {App.UI.SlaveSummary.AbbreviationState} */
+		const abbrSettings = V.UI.slaveSummary.abbreviation;
+		initDelegates(); // temporary
+
+		const helpers = App.UI.SlaveSummaryImpl.helpers;
+
+		const res = document.createDocumentFragment();
+		let para = helpers.makeParagraph(res);
+
+		delegates.devotion(slave, para);
+		if (!slave.fuckdoll) {
+			delegates.rules(slave, para);
+		}
+		delegates.weight(slave, para);
+		delegates.diet(slave, para);
+		delegates.health(slave, para);
+		delegates.drugs(slave, para);
+
+		para = helpers.makeParagraph(res);
+		para.classList.add("pink");
+		helpers.makeSpan(para, `${capFirstChar(SlaveTitle(slave))}${abbrSettings.physicals === 2 ? '.' : ''}`, ["coral", "strong"]);
+		delegates.race(slave, para);
+		delegates.nationality(slave, para);
+		delegates.skin(slave, para);
+		delegates.genitalia(slave, para);
+		delegates.physicals(slave, para);
+		delegates.hormoneBalance(slave, para);
+
+		para = helpers.makeParagraph(res);
+		delegates.skills(slave, para);
+		delegates.mental(slave, para);
+		if (slave.custom.label) {
+			helpers.makeSpan(res, `${capFirstChar(slave.custom.label)}.`, ["yellow", "strong"]);
 		}
-		r.textContent = stdDecor ? `${capFirstChar(text)}.` : text;
-		if (container) {
-			container.appendChild(r);
+		if ((slave.relationship !== 0) || (slave.relation !== 0) || (abbrSettings.clothes === 2) || (abbrSettings.rulesets === 2)) {
+			para = helpers.makeParagraph(res);
 		}
-		return r;
-	}
-
-	/**
-	 * @param {Node} container
-	 * @param {string} text
-	 * @returns {Text}
-	 */
-	function addText(container, text) {
-		const r = document.createTextNode(text);
-		if (container) {
-			container.appendChild(r);
+		delegates.relations(slave, para);
+		if (!slave.fuckdoll) {
+			delegates.clothes(slave, para);
 		}
-		return r;
-	}
-
-	/**
-	 * @param {Node} [container]
-	 * @param {string|string[]} [classNames]
-	 */
-	function makeBlock(container, classNames) {
-		let r = document.createElement("span");
-		r.classList.add("ssb");
-		_addClassNames(r, classNames);
-		if (container) {
-			container.appendChild(r);
+		const RABlock = helpers.makeBlock(para);
+		delegates.rulesets(slave, RABlock);
+		if (slave.origin !== 0) {
+			delegates.origins(slave, res);
 		}
-		return r;
+		return res;
 	}
 
-	/**
-	 * @param {Node} container
-	 * @param {string|string[]} [classNames]
-	 * @returns {HTMLParagraphElement}
-	 */
-	function makeParagraph(container, classNames) {
-		let r = document.createElement("p");
-		r.classList.add("si");
-		_addClassNames(r, classNames);
-		if (container) {
-			container.appendChild(r);
-		}
-		return r;
+	function displayOptionsFragment() {
+		const res = document.createDocumentFragment();
+
+		// SAH is "Summarized, Abbreviated, Hidden"
+		const SAHOptions = {
+			"Summarized": 2,
+			"Abbreviated": 1,
+			"Hidden": 0
+		};
+
+		function appendOption(name, desc, options) {
+			res.append(App.UI.DOM.Widgets.optionSelector((value) => {
+				V.UI.slaveSummary.abbreviation[name] = value; Engine.play(passage());
+			},
+			options, V.UI.slaveSummary.abbreviation[name], desc));
+		}
+
+		function appendSAHOption(name, desc) {
+			appendOption(name, desc, SAHOptions);
+		}
+
+		appendSAHOption("devotion", "Mental stats are");
+		appendSAHOption("mental", "Mental attributes are");
+		appendSAHOption("rules", "Rules are");
+		appendSAHOption("health", "Health is");
+		appendSAHOption("diet", "Diet and weight are");
+		appendSAHOption("drugs", "Drugs and addiction are");
+		appendSAHOption("hormoneBalance", "Hormone balance is");
+		appendSAHOption("genitalia", "Genitalia are");
+		appendSAHOption("physicals", "Physical traits are");
+		appendSAHOption("skills", "Skills are");
+		appendSAHOption("nationality", "Nationality is");
+		appendSAHOption("race", "Race is");
+		appendOption("rulesets", "Rules Assistant rulesets are", {
+			"Summarized": 2,
+			"Abbreviated": 1
+		});
+		appendOption("clothes", "Clothes are", {
+			"Summarized": 2,
+			"Hidden": 0
+		});
+		appendOption("origins", "Origins are", {
+			"Summarized": 2,
+			"Hidden": 0
+		});
+
+		return res;
 	}
 
-	return SlaveSummary;
-})();
+	return {
+		makeNewState: makeNewState,
+		initDelegates: initDelegates,
+		empty: function() { },
+		render: render,
+		displayOptionsFragment: displayOptionsFragment
+	};
+}();
diff --git a/src/uncategorized/summaryOptions.tw b/src/uncategorized/summaryOptions.tw
index 507d35f4e91a147484f70da5603a9405cc706033..c839f964e8536e79801fe1106d8c59dcae6a1875 100644
--- a/src/uncategorized/summaryOptions.tw
+++ b/src/uncategorized/summaryOptions.tw
@@ -70,95 +70,7 @@ Sample summary:
 	<<option 2 "Card">>
 <</options>>
 
-<<options $abbreviateDevotion "Summary Options">>
-	Mental stats are
-	<<option 2 "Summarized">>
-	<<option 1 "Abbreviated">>
-	<<option 0 "Hidden">>
-<</options>>
-
-<<options $abbreviateMental "Summary Options">>
-	Mental attributes are
-	<<option 2 "Summarized">>
-	<<option 1 "Abbreviated">>
-	<<option 0 "Hidden">>
-<</options>>
-
-<<options $abbreviateRules "Summary Options">>
-	Rules are
-	<<option 2 "Summarized">>
-	<<option 1 "Abbreviated">>
-	<<option 0 "Hidden">>
-<</options>>
-
-<<options $abbreviateHealth "Summary Options">>
-	Health is
-	<<option 2 "Summarized">>
-	<<option 1 "Abbreviated">>
-	<<option 0 "Hidden">>
-<</options>>
-
-<<options $abbreviateDiet "Summary Options">>
-	Diet and weight are
-	<<option 2 "Summarized">>
-	<<option 1 "Abbreviated">>
-	<<option 0 "Hidden">>
-<</options>>
-
-<<options $abbreviateDrugs "Summary Options">>
-	Drugs and addiction are
-	<<option 2 "Summarized">>
-	<<option 1 "Abbreviated">>
-	<<option 0 "Hidden">>
-<</options>>
-
-<<options $abbreviateHormoneBalance "Summary Options">>
-	Hormone balance is
-	<<option 2 "Summarized">>
-	<<option 1 "Abbreviated">>
-	<<option 0 "Hidden">>
-<</options>>
-
-<<options $abbreviateGenitalia "Summary Options">>
-	Genitalia are
-	<<option 2 "Summarized">>
-	<<option 1 "Abbreviated">>
-	<<option 0 "Hidden">>
-<</options>>
-
-<<options $abbreviatePhysicals "Summary Options">>
-	Physical traits are
-	<<option 2 "Summarized">>
-	<<option 1 "Abbreviated">>
-	<<option 0 "Hidden">>
-<</options>>
-
-<<options $abbreviateSkills "Summary Options">>
-	Skills are
-	<<option 2 "Summarized">>
-	<<option 1 "Abbreviated">>
-	<<option 0 "Hidden">>
-<</options>>
-
-<<options $abbreviateNationality "Summary Options">>
-	Nationality is
-	<<option 2 "Summarized">>
-	<<option 1 "Abbreviated">>
-	<<option 0 "Hidden">>
-<</options>>
-
-<<options $abbreviateRace "Summary Options">>
-	Race is
-	<<option 2 "Summarized">>
-	<<option 1 "Abbreviated">>
-	<<option 0 "Hidden">>
-<</options>>
-
-<<options $abbreviateRulesets "Summary Options">>
-	Rules Assistant rulesets are
-	<<option 2 "Summarized">>
-	<<option 1 "Abbreviated">>
-<</options>>
+<<= App.UI.DOM.includeDOM(App.UI.SlaveSummary.displayOptionsFragment(), "dof") >>
 
 <<options $summaryStats "Summary Options">>
 	Granular slave stat numbers are
@@ -172,12 +84,6 @@ Main menu assignment shortcuts are
 	<<option 0 "Hidden">>
 <</options>>
 
-<<options $abbreviateOrigins "Summary Options">>
-	Origins are
-	<<option 2 "Summarized">>
-	<<option 0 "Hidden">>
-<</options>>
-
 <<if $showMissingSlaves>>
 	<<options $showMissingSlavesSD "Summary Options">>
 		Missing slave parents are
@@ -187,5 +93,5 @@ Main menu assignment shortcuts are
 <</if>>
 
 <p style="font-style:italic">
-	[[FC Dev's preferred options|Summary Options ][$seeDesk = 0, $seeFCNN = 0, $sortSlavesBy = "devotion",$sortSlavesOrder = "descending",$sortSlavesMain = 0,$rulesAssistantMain = 1,$abbreviateDevotion = 1,$abbreviateRules = 1,$abbreviateClothes = 2,$abbreviateHealth = 1,$abbreviateDiet = 1,$abbreviateDrugs = 1,$abbreviateRace = 1,$abbreviateGenitalia = 1,$abbreviatePhysicals = 1,$abbreviateSkills = 1,$abbreviateMental = 1,$abbreviateSidebar = 1]]
+	[[FC Dev's preferred options|Summary Options ][$seeDesk = 0, $seeFCNN = 0, $sortSlavesBy = "devotion",$sortSlavesOrder = "descending",$sortSlavesMain = 0,$rulesAssistantMain = 1, $UI.slaveSummary.abbreviation = {devotion: 1, mental: 1, rules: 1, clothes: 2, health: 1, diet: 1, drugs: 1, hormoneBalance: 1, race: 1, genitalia: 1, physicals: 1, skills: 1, nationality: 1, rulesets: 1, clothes: 0, origins: 0} ,$abbreviateSidebar = 1]]
 </p>