code:
/**
 * Contains a list of the properties the infant object has
 * May need another look-over
 */
App.Facilities.Nursery.InfantState = class InfantState {
	constructor() {
		/** Child's current name */
		this.slaveName = "blank";
		/** Child's current surname
		 * @type {string|number} */
		this.slaveSurname = 0;
		this.genes = "XX";
		this.pronoun = App.Data.Pronouns.Kind.female;
		/** game week child was acquired.
		 *
		 * _0: Obtained prior to game start / at game start_ */
		this.weekAcquired = 0;
		this.father = 0;
		this.mother = 0;
		this.daughters = 0;
		this.sisters = 0;
		/** week she was born (int between 0-51) */
		this.birthWeek = jsRandom(0, 51);
		/** How old she really is. */
		this.actualAge = 18;
		/** child's race */
		this.race = "white";
		/**
		 * child markings
		 * * "beauty mark"
		 * * "birthmark"
		 * * "freckles"
		 * * "heavily freckled"
		 */
		this.markings = "none";
		/** eye color */
		this.eyeColor = "brown";
		/** hair color */
		this.hColor = "brown";
		/** pubic hair color */
		this.pubicHColor = "brown";
		/** armpit hair style */
		this.underArmHColor = "brown";
		/** eyebrowHColor*/
		this.eyebrowHColor = "brown";
		/** skin color */
		this.skin = "light";
		/** pubic hair style */
		this.pubicHStyle = "neat";
		/** armpit hair style */
		this.underArmHStyle = "neat";
		/**
		 * face attractiveness
		 *
		 * * -96 - : very ugly
		 * * -95 - -41: ugly
		 * * -40 - -11: unattractive
		 * * -10 - 10: attractive
		 * * 11 - 40: very pretty
		 * * 41 - 95: gorgeous
		 * * 96+: mind blowing
		 */
		this.face = 0;
		/**
		 * accepts string (will be treated as "normal")
		 * * "normal"
		 * * "masculine"
		 * * "androgynous"
		 * * "cute"
		 * * "sensual"
		 * * "exotic"
		 */
		this.faceShape = "normal";
		/**
		 * child intelligence
		 * * -100 - -96: borderline retarded
		 * * -95 - -51: very slow
		 * * -50 - -16: slow
		 * * -15 - 15: average
		 * * 16 - 50: smart
		 * * 51 - 95: very smart
		 * * 96 - 100: brilliant
		 */
		this.intelligence = 0;
		/**
		 * * "none"
		 * * "mindbroken"
		 * * "submissive"
		 * * "cumslut"
		 * * "humiliation"
		 * * "buttslut"
		 * * "boobs"
		 * * "sadist"
		 * * "masochist"
		 * * "dom"
		 * * "pregnancy"
		 */
		this.fetish = "none";
		/**
		 * * "none"
		 * * "arrogant": clings to her dignity, thinks slavery is beneath her
		 * * "bitchy": can 't keep her opinions to herself
		 * * "odd": says and does odd things
		 * * "hates men": hates men
		 * * "hates women": hates women
		 * * "gluttonous": likes eating, gains weight
		 * * "anorexic": dislikes eating and being forced to eat, loses weight
		 * * "devout": resistance through religious faith
		 * * "liberated": believes slavery is wrong
		 */
		this.behavioralFlaw = "none";
		/**
		 * * "none"
		 * * "hates oral": hates oral sex
		 * * "hates anal": hates anal sex
		 * * "hates penetration": dislikes penetrative sex
		 * * "shamefast": nervous when naked
		 * * "idealistic": believes sex should be based on love and consent
		 * * "repressed": dislikes sex
		 * * "apathetic": inert during sex
		 * * "crude": sexually crude and has little sense of what partners find disgusting during sex
		 * * "judgemental": sexually judgemental and often judges her sexual partners' performance
		 * * "neglectful": disregards herself in sex
		 * * "cum addict": addicted to cum
		 * * "anal addict": addicted to anal
		 * * "attention whore": addicted to being the center of attention
		 * * "breast growth": addicted to her own breasts
		 * * "abusive": sexually abusive
		 * * "malicious": loves causing pain and suffering
		 * * "self hating": hates herself
		 * * "breeder": addicted to being pregnant
		 */
		this.sexualFlaw = "none";
		/** 0: does not have; 1: carrier; 2: active
		 * * heterochromia is an exception. String = active
		 */
		this.geneticQuirks = {
			/** Oversized breasts. Increased growth rate, reduced shrink rate. Breasts try to return to oversized state if reduced. */
			macromastia: 0,
			/** Greatly oversized breasts. Increased growth rate, reduced shrink rate. Breasts try to return to oversized state if reduced.
			 *
			 * **macromastia + gigantomastia** - Breasts never stop growing. Increased growth rate, no shrink rate. */
			gigantomastia: 0,
			/** is prone to having twins, shorter pregnancy recovery rate */
			fertility: 0,
			/** is prone to having multiples, even shorter pregnancy recovery rate
			 *
			 * **fertility + hyperFertility** - will have multiples, even shorter pregnancy recovery rate */
			hyperFertility: 0,
			/** pregnancy does not block ovulation, child can become pregnant even while pregnant */
			superfetation: 0,
			/** is abnormally tall. gigantism + dwarfism - is very average*/
			gigantism: 0,
			/** is abnormally short. gigantism + dwarfism - is very average*/
			dwarfism: 0,
			/** has a flawless face. pFace + uFace - Depends on carrier status, may swing between average and above/below depending on it */
			pFace: 0,
			/** has a hideous face. pFace + uFace - Depends on carrier status, may swing between average and above/below depending on it */
			uFace: 0,
			/** has pale skin, white hair and red eyes */
			albinism: 0,
			/** may have mismatched eyes */
			heterochromia: 0,
			/** ass never stops growing. Increased growth rate, reduced shrink rate. */
			rearLipedema: 0,
			/** has (or will have) a huge dong */
			wellHung: 0,
			/** constantly gains weight unless dieting, easier to gain weight. wGain + wLoss - weight gain/loss fluctuates randomly */
			wGain: 0,
			/** constantly loses weight unless gaining, easier to lose weight. wGain + wLoss - weight gain/loss fluctuates randomly */
			wLoss: 0,
			/** body attempts to normalize to an androgynous state */
			androgyny: 0,
			/** child can only ever birth girls */
			girlsOnly: 0
		};
		/** how many weeks until the child is ready for release */
		this.growTime = 156;
	}
};

repo_name: KnightBoulegard/fc

license: mit


code:
/**
 * Displays a summary of the infant
 * @param {App.Entity.InfantState} child
 * @returns {string}
 */
App.Facilities.Nursery.InfantSummary = function(child) {
	"use strict";
	const
		weeksOwned = V.week - child.weekAcquired;

	let
		r = ``;

	function InfantSummaryUncached(child) {
		/** @type {App.UI.SlaveSummary.AbbreviationState} */
		const abbreviate = V.UI.slaveSummary.abbreviation;
		if (abbreviate.health === 1) {
			// shortHealth(child);
		} else if (abbreviate.health === 2) {
			// longHealth(child);
		}
		if (abbreviate.nationality + abbreviate.genitalia + abbreviate.physicals + abbreviate.skills + abbreviate.mental !== 0) {
			r += `<br> `;
			if (V.seeImages !== 1 || V.seeSummaryImages !== 1 || V.imageChoice === 1) {
				r += "    ";
			}
		}
		if (child.actualAge > 0) {
			if (child.actualAge > 1) {
				V.desc = `toddler`;
			} else {
				V.desc = `baby`;
			}
		} else {
			if (weeksOwned <= 1) {
				V.desc = `newborn`;
			} else {
				V.desc = `baby`;
			}
		}
		const firstLetter = V.desc.substring(0, 1).toUpperCase();
		V.desc = firstLetter + V.desc.substring(1);
		r += `<strong><span class="coral">${V.desc}${abbreviate.physicals === 2? '.' : ''}</span></strong> `;
		if (V.seeRace) {
			r += `<span class="tan">`;
			if (abbreviate.race === 1) {
				shortRace(child);
			} else if (abbreviate.race === 2) {
				longRace(child);
			}
			r += `</span> `;
		}
		if (abbreviate.nationality === 1) {
			shortNationality(child);
		} else if (abbreviate.nationality === 2) {
			longNationality(child);
		}
		if (abbreviate.physicals === 1) {
			shortSkin(child);
		} else {
			r += `<span class="pink">${child.skin.charAt(0).toUpperCase() + child.skin.slice(1)} skin.</span> `;
		}
		if (abbreviate.physicals === 1) {
			shortAge(child);
			shortFace(child);
			r += `</span> `;
		} else if (abbreviate.physicals === 2) {
			longAge(child);
			longFace(child);
			r += `</span> `;
		}
		r += `<br>`;
		if (V.seeImages !== 1 || V.seeSummaryImages !== 1 || V.imageChoice === 1) {
			r += "    ";
		}
		if (abbreviate.skills === 1) {
			shortIntelligence(child);
			shortPrestige(child);
			shortPornPrestige(child);
		} else if (abbreviate.skills === 2) {
			longIntelligence(child);
			longPrestige(child);
			longPornPrestige(child);
		}
		if (abbreviate.mental === 1) {
			shortBehaviorFlaw(child);
			shortSexFlaw(child);
		} else if (abbreviate.mental === 2) {
			longBehaviorFlaw(child);
			longSexFlaw(child);
		}
		if ((child.relationship !== 0) || (abbreviate.clothes === 2) || (abbreviate.rulesets === 2)) {
			r += `<br> `;
			if (V.seeImages !== 1 || V.seeSummaryImages !== 1 || V.imageChoice === 1) {
				r += `    `;
			}
		}
		if (abbreviate.mental === 1) {
			r += `<span class="lightgreen">`;
			shortExtendedFamily(child);
			r += `</span> `;
			shortRival(child);
		} else if (abbreviate.mental === 2) {
			longExtendedFamily(child);
			longRival(child);
		}
		r += `    `;
		if (abbreviate.origins === 2 && child.origin !== 0) {
			origins(child);
		}
		return r;
	}

	// /**	TODO: add health to infants
	//  * @param {App.Entity.InfantState} child
	//  */
	// function shortHealth(child) {
	// 	if (child.health.condition < -20) {
	// 		r += `<strong><span class="red">H ${V.summaryStats ? `[${child.health.condition}]` : ''}</span></strong> `;
	// 	} else if (child.health.condition <= 20) {
	// 		r += `<strong><span class="yellow">H ${V.summaryStats ? `[${child.health.condition}]` : ''}</span></strong> `;
	// 	} else if (child.health.condition > 20) {
	// 		r += `<strong><span class="green">H ${V.summaryStats ? `[${child.health.condition}]` : ''}</span></strong> `;
	// 	}
	// 	r += " ";
	// }

	// /**
	//  * @param {App.Entity.InfantState} child
	//  */
	// function longHealth(child) {
	// 	if (child.health.condition < -90) {
	// 		r += `<span class="red">On the edge of death ${V.summaryStats ? `[${child.health.condition}]` : ''}.</span> `;
	// 	} else if (child.health.condition < -50) {
	// 		r += `<span class="red">Extremely unhealthy${V.summaryStats ? `[${child.health.condition}]` : ''}.</span> `;
	// 	} else if (child.health.condition < -20) {
	// 		r += `<span class="red">Unhealthy${V.summaryStats ? `[${child.health.condition}]` : ''}.</span> `;
	// 	} else if (child.health.condition <= 20) {
	// 		r += `<span class="yellow">Healthy${V.summaryStats ? `[${child.health.condition}]` : ''}.</span> `;
	// 	} else if (child.health.condition <= 50) {
	// 		r += `<span class="green">Very healthy${V.summaryStats ? `[${child.health.condition}]` : ''}.</span> `;
	// 	} else if (child.health.condition <= 90) {
	// 		r += `<span class="green">Extremely healthy${V.summaryStats ? `[${child.health.condition}]` : ''}.</span> `;
	// 	} else {
	// 		r += `<span class="green">Unnaturally healthy${V.summaryStats ? `[${child.health.condition}]` : ''}.</span> `;
	// 	}
	// 	r += " ";
	// }

	/**
	 * @param {App.Entity.InfantState} child
	 */
	function shortRace(child) {
		switch (child.race) {
			case "white":
				r += `C`;
				break;
			case "asian":
				r += `A`;
				break;
			case "indo-aryan":
				r += `I`;
				break;
			case "latina":
				r += `L`;
				break;
			case "middle eastern":
				r += `ME`;
				break;
			case "black":
				r += `B`;
				break;
			case "pacific islander":
				r += `PI`;
				break;
			case "malay":
				r += `M`;
				break;
			case "amerindian":
				r += `AI`;
				break;
			case "semitic":
				r += `S`;
				break;
			case "southern european":
				r += `SE`;
				break;
			case "mixed race":
				r += `MR`;
				break;
			default:
				r += `${child.race.charAt(0).toUpperCase() + child.race.charAt(1) + child.race.charAt(2)}`;
				break;
		}
	}

	/**
	 * @param {App.Entity.InfantState} child
	 */
	function longRace(child) {
		switch (child.race) {
			case "white":
				r += `Caucasian. `;
				break;
			case "asian":
				r += `Asian. `;
				break;
			case "indo-aryan":
				r += `Indo-aryan. `;
				break;
			case "latina":
				r += `Latina. `;
				break;
			case "middle eastern":
				r += `Middle Eastern. `;
				break;
			case "black":
				r += `Black. `;
				break;
			case "pacific islander":
				r += `Pacific Islander. `;
				break;
			case "malay":
				r += `Malay. `;
				break;
			case "amerindian":
				r += `Amerindian. `;
				break;
			case "semitic":
				r += `Semitic. `;
				break;
			case "southern european":
				r += `Southern European. `;
				break;
			case "mixed race":
				r += `Mixed race. `;
				break;
			default:
				r += `${child.race.charAt(0).toUpperCase() + child.race.slice(1)}. `;
				break;
		}
	}

	/**
	 * @param {App.Entity.InfantState} child
	 */
	function shortNationality(child) {
		r += `<span class="tan">`;
		switch (child.nationality) {
			case "Afghan":
				r += `Afg`;
				break;
			case "Albanian":
				r += `Alb`;
				break;
			case "Algerian":
				r += `Alg`;
				break;
			case "American":
				r += `USA`;
				break;
			case "Andorran":
				r += `And`;
				break;
			case "Angolan":
				r += `Ang`;
				break;
			case "Antiguan":
				r += `AB`;
				break;
			case "Argentinian":
				r += `Arg`;
				break;
			case "Armenian":
				r += `Arm`;
				break;
			case "Aruban":
				r += `Aru`;
				break;
			case "Australian":
				r += `Aus`;
				break;
			case "Austrian":
				r += `Aut`;
				break;
			case "Azerbaijani":
				r += `Aze`;
				break;
			case "Bahamian":
				r += `Bah`;
				break;
			case "Bahraini":
				r += `Bah`;
				break;
			case "Bangladeshi":
				r += `Bgd`;
				break;
			case "Barbadian":
				r += `Bar`;
				break;
			case "Belarusian":
				r += `Ber`;
				break;
			case "Belgian":
				r += `Bel`;
				break;
			case "Belizean":
				r += `Blz`;
				break;
			case "Beninese":
				r += `Ben`;
				break;
			case "Bermudian":
				r += `Bmd`;
				break;
			case "Bhutanese":
				r += `Bhu`;
				break;
			case "Bissau-Guinean":
				r += `GB`;
				break;
			case "Bolivian":
				r += `Bol`;
				break;
			case "Bosnian":
				r += `Bos`;
				break;
			case "Brazilian":
				r += `Bra`;
				break;
			case "British":
				r += `UK`;
				break;
			case "Bruneian":
				r += `Bru`;
				break;
			case "Bulgarian":
				r += `Bul`;
				break;
			case "Burkinabé":
				r += `BF`;
				break;
			case "Burmese":
				r += `Bur`;
				break;
			case "Burundian":
				r += `Bnd`;
				break;
			case "Cambodian":
				r += `Kam`;
				break;
			case "Cameroonian":
				r += `Cam`;
				break;
			case "Canadian":
				r += `Can`;
				break;
			case "Cape Verdean":
				r += `CV`;
				break;
			case "Catalan":
				r += `Cat`;
				break;
			case "Central African":
				r += `CAR`;
				break;
			case "Chadian":
				r += `Cha`;
				break;
			case "Chilean":
				r += `Chl`;
				break;
			case "Chinese":
				r += `Chi`;
				break;
			case "Colombian":
				r += `Col`;
				break;
			case "Comorian":
				r += `Com`;
				break;
			case "Congolese":
				r += `RC`;
				break;
			case "a Cook Islander":
				r += `CI`;
				break;
			case "Costa Rican":
				r += `CR`;
				break;
			case "Croatian":
				r += `Cro`;
				break;
			case "Cuban":
				r += `Cub`;
				break;
			case "Curaçaoan":
				r += `Cur`;
				break;
			case "Cypriot":
				r += `Cyp`;
				break;
			case "Czech":
				r += `Cze`;
				break;
			case "Danish":
				r += `Den`;
				break;
			case "Djiboutian":
				r += `Dji`;
				break;
			case "Dominican":
				r += `DR`;
				break;
			case "Dominiquais":
				r += `Dom`;
				break;
			case "Dutch":
				r += `Nld`;
				break;
			case "East Timorese":
				r += `ET`;
				break;
			case "Ecuadorian":
				r += `Ecu`;
				break;
			case "Egyptian":
				r += `Egy`;
				break;
			case "Emirati":
				r += `UAE`;
				break;
			case "Equatoguinean":
				r += `EG`;
				break;
			case "Eritrean":
				r += `Eri`;
				break;
			case "Estonian":
				r += `Est`;
				break;
			case "Ethiopian":
				r += `Eth`;
				break;
			case "Fijian":
				r += `Fij`;
				break;
			case "Filipina":
				r += `Phl`;
				break;
			case "Finnish":
				r += `Fin`;
				break;
			case "French":
				r += `Fra`;
				break;
			case "French Guianan":
				r += `FG`;
				break;
			case "French Polynesian":
				r += `FP`;
				break;
			case "Gabonese":
				r += `Gab`;
				break;
			case "Gambian":
				r += `Gam`;
				break;
			case "Georgian":
				r += `Geo`;
				break;
			case "German":
				r += `Ger`;
				break;
			case "Ghanan":
				r += `Gha`;
				break;
			case "Greek":
				r += `Gre`;
				break;
			case "Greenlandic":
				r += `Grn`;
				break;
			case "Grenadian":
				r += `Gda`;
				break;
			case "Guamanian":
				r += `Gua`;
				break;
			case "Guatemalan":
				r += `Gtm`;
				break;
			case "Guinean":
				r += `Gui`;
				break;
			case "Guyanese":
				r += `Guy`;
				break;
			case "Haitian":
				r += `Hai`;
				break;
			case "Honduran":
				r += `Hon`;
				break;
			case "Hungarian":
				r += `Hun`;
				break;
			case "I-Kiribati":
				r += `Kir`;
				break;
			case "Icelandic":
				r += `Ice`;
				break;
			case "Indian":
				r += `Ind`;
				break;
			case "Indonesian":
				r += `Idn`;
				break;
			case "Iranian":
				r += `Irn`;
				break;
			case "Iraqi":
				r += `Irq`;
				break;
			case "Irish":
				r += `Irl`;
				break;
			case "Israeli":
				r += `Isr`;
				break;
			case "Italian":
				r += `Ita`;
				break;
			case "Ivorian":
				r += `IC`;
				break;
			case "Jamaican":
				r += `Jam`;
				break;
			case "Japanese":
				r += `Jpn`;
				break;
			case "Jordanian":
				r += `Jor`;
				break;
			case "Kazakh":
				r += `Kaz`;
				break;
			case "Kenyan":
				r += `Ken`;
				break;
			case "Kittitian":
				r += `SKN`;
				break;
			case "Korean":
				r += `Kor`;
				break;
			case "Kosovan":
				r += `Kos`;
				break;
			case "Kurdish":
				r += `Kur`;
				break;
			case "Kuwaiti":
				r += `Kuw`;
				break;
			case "Kyrgyz":
				r += `Kyr`;
				break;
			case "Laotian":
				r += `Lao`;
				break;
			case "Latvian":
				r += `Lat`;
				break;
			case "Lebanese":
				r += `Lbn`;
				break;
			case "Liberian":
				r += `Lib`;
				break;
			case "Libyan":
				r += `Lby`;
				break;
			case "a Liechtensteiner":
				r += `Lie`;
				break;
			case "Lithuanian":
				r += `Lit`;
				break;
			case "Luxembourgian":
				r += `Lux`;
				break;
			case "Macedonian":
				r += `Mac`;
				break;
			case "Malagasy":
				r += `Mad`;
				break;
			case "Malawian":
				r += `Mwi`;
				break;
			case "Malaysian":
				r += `Mys`;
				break;
			case "Maldivian":
				r += `Mdv`;
				break;
			case "Malian":
				r += `Mal`;
				break;
			case "Maltese":
				r += `Mlt`;
				break;
			case "Marshallese":
				r += `MI`;
				break;
			case "Mauritanian":
				r += `Mta`;
				break;
			case "Mauritian":
				r += `Mts`;
				break;
			case "Mexican":
				r += `Mex`;
				break;
			case "Micronesian":
				r += `FSM`;
				break;
			case "Moldovan":
				r += `Mol`;
				break;
			case "Monégasque":
				r += `Mnc`;
				break;
			case "Mongolian":
				r += `Mon`;
				break;
			case "Montenegrin":
				r += `Mng`;
				break;
			case "Moroccan":
				r += `Mor`;
				break;
			case "Mosotho":
				r += `Les`;
				break;
			case "Motswana":
				r += `Bot`;
				break;
			case "Mozambican":
				r += `Moz`;
				break;
			case "Namibian":
				r += `Nam`;
				break;
			case "Nauruan":
				r += `Nau`;
				break;
			case "Nepalese":
				r += `Npl`;
				break;
			case "New Caledonian":
				r += `NC`;
				break;
			case "a New Zealander":
				r += `NZ`;
				break;
			case "Ni-Vanuatu":
				r += `Van`;
				break;
			case "Nicaraguan":
				r += `Nic`;
				break;
			case "Nigerian":
				r += `Nga`;
				break;
			case "Nigerien":
				r += `Ngr`;
				break;
			case "Niuean":
				r += `Niu`;
				break;
			case "Norwegian":
				r += `Nor`;
				break;
			case "Omani":
				r += `Omn`;
				break;
			case "Pakistani":
				r += `Pak`;
				break;
			case "Palauan":
				r += `Plu`;
				break;
			case "Palestinian":
				r += `Pal`;
				break;
			case "Panamanian":
				r += `Pan`;
				break;
			case "Papua New Guinean":
				r += `PNG`;
				break;
			case "Paraguayan":
				r += `Par`;
				break;
			case "Peruvian":
				r += `Per`;
				break;
			case "Polish":
				r += `Pol`;
				break;
			case "Portuguese":
				r += `Por`;
				break;
			case "Puerto Rican":
				r += `PR`;
				break;
			case "Qatari":
				r += `Qat`;
				break;
			case "Romanian":
				r += `Rom`;
				break;
			case "Russian":
				r += `Rus`;
				break;
			case "Rwandan":
				r += `Rwa`;
				break;
			case "Sahrawi":
				r += `Sah`;
				break;
			case "Saint Lucian":
				r += `SL`;
				break;
			case "Salvadoran":
				r += `ES`;
				break;
			case "Sammarinese":
				r += `SM`;
				break;
			case "Samoan":
				r += `Sam`;
				break;
			case "São Toméan":
				r += `STP`;
				break;
			case "Saudi":
				r += `Sau`;
				break;
			case "Scottish":
				r += `Sco`;
				break;
			case "Senegalese":
				r += `Sen`;
				break;
			case "Serbian":
				r += `Srb`;
				break;
			case "Seychellois":
				r += `Sey`;
				break;
			case "Sierra Leonean":
				r += `Sie`;
				break;
			case "Singaporean":
				r += `Sng`;
				break;
			case "Slovak":
				r += `Svk`;
				break;
			case "Slovene":
				r += `Svn`;
				break;
			case "a Solomon Islander":
				r += `SI`;
				break;
			case "Somali":
				r += `Som`;
				break;
			case "South African":
				r += `RSA`;
				break;
			case "South Sudanese":
				r += `SS`;
				break;
			case "Spanish":
				r += `Spa`;
				break;
			case "Sri Lankan":
				r += `Sri`;
				break;
			case "Sudanese":
				r += `Sud`;
				break;
			case "Surinamese":
				r += `Sur`;
				break;
			case "Swazi":
				r += `Swa`;
				break;
			case "Swedish":
				r += `Swe`;
				break;
			case "Swiss":
				r += `Swi`;
				break;
			case "Syrian":
				r += `Syr`;
				break;
			case "Taiwanese":
				r += `Tai`;
				break;
			case "Tajik":
				r += `Taj`;
				break;
			case "Tanzanian":
				r += `Tza`;
				break;
			case "Thai":
				r += `Tha`;
				break;
			case "Tibetan":
				r += `Tib`;
				break;
			case "Togolese":
				r += `Tog`;
				break;
			case "Tongan":
				r += `Ton`;
				break;
			case "Trinidadian":
				r += `TT`;
				break;
			case "Tunisian":
				r += `Tun`;
				break;
			case "Turkish":
				r += `Tur`;
				break;
			case "Turkmen":
				r += `Tkm`;
				break;
			case "Tuvaluan":
				r += `Tuv`;
				break;
			case "Ugandan":
				r += `Uga`;
				break;
			case "Ukrainian":
				r += `Ukr`;
				break;
			case "Uruguayan":
				r += `Uru`;
				break;
			case "Uzbek":
				r += `Uzb`;
				break;
			case "Vatican":
				r += `VC`;
				break;
			case "Venezuelan":
				r += `Ven`;
				break;
			case "Vietnamese":
				r += `Vnm`;
				break;
			case "Vincentian":
				r += `SVG`;
				break;
			case "Yemeni":
				r += `Yem`;
				break;
			case "Zairian":
				r += `DRC`;
				break;
			case "Zambian":
				r += `Zam`;
				break;
			case "Zimbabwean":
				if (child.race === "white") {
					r += `Rho`;
				} else {
					r += `Zwe`;
				}
				break;
			case "Ancient Chinese Revivalist":
				r += `Chi Rev`;
				break;
			case "Ancient Egyptian Revivalist":
				r += `Egy Rev`;
				break;
			case "Arabian Revivalist":
				r += `Ara Rev`;
				break;
			case "Aztec Revivalist":
				r += `Azt Rev`;
				break;
			case "Edo Revivalist":
				r += `Edo Rev`;
				break;
			case "Roman Revivalist":
				r += `Rom Rev`;
				break;
			case "":
			case "none":
			case "child":
			case "Stateless":
				r += `None`;
				break;
			default:
				r += `${child.nationality.charAt(0) + child.nationality.charAt(1) + child.nationality.charAt(2)}`;
				break;
		}
		r += `</span> `;
	}

	/**
	 * @param {App.Entity.InfantState} child
	 */
	function longNationality(child) {
		r += `<span class="tan">`;
		switch (child.nationality) {
			case "a Cook Islander":
				r += `Cook Islander. `;
				break;
			case "a Liechtensteiner":
				r += `Liechtensteiner. `;
				break;
			case "a New Zealander":
				r += `New Zealander. `;
				break;
			case "a Solomon Islander":
				r += `Solomon Islander. `;
				break;
			case "Zimbabwean":
				if (child.race === "white") {
					r += `Rhodesian. `;
				} else {
					r += `${child.nationality}. `;
				}
				break;
			case "child":
			case "none":
			case "":
			case "Stateless":
				r += `Stateless. `;
				break;
			default:
				r += `${child.nationality}. `;
				break;
		}
		r += `</span> `;
	}

	/**
	 * @param {App.Entity.InfantState} child
	 */
	function shortSkin(child) {
		r += `<span class="pink">`;
		switch (child.skin) {
			case "pure white":
				r += `P. Whi`;
				break;
			case "extremely fair":
				r += `E. Fai`;
				break;
			case "very fair":
				r += `V. Fai`;
				break;
			case "extremely pale":
				r += `E. Pal`;
				break;
			case "very pale":
				r += `V. Pal`;
				break;
			case "light brown":
				r += `L. Br`;
				break;
			case "dark brown":
				r += `D. Br`;
				break;
			case "light olive":
				r += `L. Oli`;
				break;
			case "dark olive":
				r += `D. Oli`;
				break;
			case "light beige":
				r += `L. Bei`;
				break;
			case "dark beige":
				r += `D. Bei`;
				break;
			case "tan":
				r += `Tan`;
				break;
			case "bronze":
				r += `Bron`;
				break;
			case "ebony":
				r += `Ebon`;
				break;
			case "pure black":
				r += `P. Bla`;
				break;
			case "dark":
			case "fair":
			case "pale":
				r += `${child.skin.charAt(0).toUpperCase() + child.skin.slice(1)}`;
				break;
			default:
				r += `${child.skin.charAt(0).toUpperCase() + child.skin.charAt(1) + child.skin.charAt(2)}`;
				break;
		}
		r += `</span> `;
	}

	/**
	 * @param {App.Entity.InfantState} child
	 */
	function shortAge(child) {
		r += `<span class="pink">`;
		if (V.showAgeDetail === 1) {
			if (child.actualAge > 0) {
				r += `${capFirstChar(num(child.actualAge))}yrs. `;
			} else {
				if (weeksOwned > 4) {
					r += `${capFirstChar(num(Math.trunc(weeksOwned / 4)))}mos. `;
				} else {
					if (weeksOwned <= 1) {
						r += `Nwbrn. `;
					} else {
						r += `${capFirstChar(num(weeksOwned))}wks. `;
					}
				}
			}
		}
	}

	/**
	 * @param {App.Entity.InfantState} child
	 */
	function shortFace(child) {
		if (child.face < -95) {
			r += `<span class="red">Face---${V.summaryStats ? `[${child.face}]` : ''}</span> `;
		} else if (child.face < -40) {
			r += `<span class="red">Face--${V.summaryStats ? `[${child.face}]` : ''}</span> `;
		} else if (child.face < -10) {
			r += `<span class="red">Face-${V.summaryStats ? `[${child.face}]` : ''}</span> `;
		} else if (child.face <= 10) {
			r += `Face${V.summaryStats ? `[${child.face}]` : ''}`;
		} else if (child.face <= 40) {
			r += `<span class="pink">Face+${V.summaryStats ? `[${child.face}]` : ''}</span> `;
		} else if (child.face <= 95) {
			r += `<span class="pink">Face++${V.summaryStats ? `[${child.face}]` : ''}</span> `;
		} else {
			r += `<span class="pink">Face+++${V.summaryStats ? `[${child.face}]` : ''}</span> `;
		}
	}

	/**
	 * @param {App.Entity.InfantState} child
	 */
	function longAge(child) {
		r += `<span class="pink">`;
		if (V.showAgeDetail) {
			if (child.actualAge > 0) {
				r += `${capFirstChar(num(child.actualAge))}-year-old `;
				if (child.actualAge > 1) {
					r += `toddler. `;
				} else {
					r += `baby. `;
				}
			} else {
				if (weeksOwned > 4) {
					r += `${capFirstChar(num(Math.trunc(weeksOwned / 4)))} months old. `;
				} else {
					if (weeksOwned <= 1) {
						r += `Newborn. `;
					} else {
						r += `${capFirstChar(num(weeksOwned))} weeks old. `;
					}
				}
			}
		}
	}

	/**
	 * @param {App.Entity.InfantState} child
	 */
	function longFace(child) {
		r += `Likely to have a `;
		if (child.face < -95) {
			r += `<span class="red">very ugly${V.summaryStats ? `[${child.face}]`: ''}</span>`;
		} else if (child.face < -40) {
			r += `<span class="red">ugly${V.summaryStats ? `[${child.face}]`: ''}</span>`;
		} else if (child.face < -10) {
			r += `<span class="red">unattractive${V.summaryStats ? `[${child.face}]`: ''}</span>`;
		} else if (child.face <= 10) {
			r += `Average${V.summaryStats ? `[${child.face}]`: ''}`;
		} else if (child.face <= 40) {
			r += `<span class="pink">attractive${V.summaryStats ? `[${child.face}]`: ''}</span>`;
		} else if (child.face <= 95) {
			r += `<span class="pink">beautiful${V.summaryStats ? `[${child.face}]`: ''}</span>`;
		} else {
			r += `<span class="pink">very beautiful${V.summaryStats ? `[${child.face}]`: ''}</span>`;
		}
		r += `, ${child.faceShape} face. `;
	}

	/**
	 * @param {App.Entity.InfantState} child
	 */
	function shortIntelligence(child) {
		let intelligence = child.intelligence;
		if (child.hasOwnProperty("intelligenceImplant")) {
			intelligence += child.intelligenceImplant;
		}
		if (child.fetish === "mindbroken") {
			return;
		} else if (child.hasOwnProperty("intelligenceImplant") && child.intelligenceImplant >= 30) {
			if (intelligence >= 130) {
				r += `<span class="deepskyblue">I++++(e+)${V.summaryStats ? `[${intelligence}]` : ''}</span> `;
			} else if (intelligence > 95) {
				r += `<span class="deepskyblue">I+++(e+)${V.summaryStats ? `[${intelligence}]` : ''}</span> `;
			} else if (intelligence > 50) {
				r += `<span class="deepskyblue">I++(e+)${V.summaryStats ? `[${intelligence}]` : ''}</span> `;
			} else if (intelligence > 15) {
				r += `<span class="deepskyblue">I+(e+)${V.summaryStats ? `[${intelligence}]` : ''}</span> `;
			} else if (intelligence >= -15) {
				r += `I(e+)${V.summaryStats ? `[${intelligence}]` : ''}`;
			} else if (intelligence >= -50) {
				r += `<span class="orangered">I-(e+)${V.summaryStats ? `[${intelligence}]` : ''}</span> `;
			} else if (intelligence >= -95) {
				r += `<span class="orangered">I--(e+)${V.summaryStats ? `[${intelligence}]` : ''}</span> `;
			} else {
				r += `<span class="orangered">I---(e+)${V.summaryStats ? `[${intelligence}]` : ''}</span> `;
			}
		} else if (child.hasOwnProperty("intelligenceImplant") && child.intelligenceImplant >= 15) {
			if (intelligence > 95) {
				r += `<span class="deepskyblue">I+++(e)${V.summaryStats ? `[${intelligence}]` : ''}</span> `;
			} else if (intelligence > 50) {
				r += `<span class="deepskyblue">I++(e)${V.summaryStats ? `[${intelligence}]` : ''}</span> `;
			} else if (intelligence > 15) {
				r += `<span class="deepskyblue">I+(e)${V.summaryStats ? `[${intelligence}]` : ''}</span> `;
			} else if (intelligence >= -15) {
				r += `I(e)${V.summaryStats ? `[${intelligence}]` : ''}`;
			} else if (intelligence >= -50) {
				r += `<span class="orangered">I-(e)${V.summaryStats ? `[${intelligence}]` : ''}</span> `;
			} else if (intelligence >= -95) {
				r += `<span class="orangered">I--(e)${V.summaryStats ? `[${intelligence}]` : ''}</span> `;
			} else {
				r += `<span class="orangered">I---(e)${V.summaryStats ? `[${intelligence}]` : ''}</span> `;
			}
		} else {
			if (intelligence > 95) {
				r += `<span class="deepskyblue">I+++${V.summaryStats ? `[${intelligence}]` : ''}</span> `;
			} else if (intelligence > 50) {
				r += `<span class="deepskyblue">I++${V.summaryStats ? `[${intelligence}]` : ''}</span> `;
			} else if (intelligence > 15) {
				r += `<span class="deepskyblue">I+${V.summaryStats ? `[${intelligence}]` : ''}</span> `;
			} else if (intelligence >= -15) {
				r += `I${V.summaryStats ? `[${intelligence}]` : ''}`;
			} else if (intelligence >= -50) {
				r += `<span class="orangered">I-${V.summaryStats ? `[${intelligence}]` : ''}</span> `;
			} else if (intelligence >= -95) {
				r += `<span class="orangered">I--${V.summaryStats ? `[${intelligence}]` : ''}</span> `;
			} else {
				r += `<span class="orangered">I---${V.summaryStats ? `[${intelligence}]` : ''}</span> `;
			}
		}
	}

	/**
	 * @param {App.Entity.InfantState} child
	 */
	function shortPrestige(child) {
		if (child.prestige > 0) {
			r += `<span class="green">`;
			if (child.prestige > 2) {
				r += `Prest++`;
			} else if (child.prestige === 2) {
				r += `Prest+`;
			} else if (child.prestige === 1) {
				r += `Prest`;
			}
			r += `</span> `;
		}
	}

	/**
	 * @param {App.Entity.InfantState} child
	 */
	function shortPornPrestige(child) {
		if (child.pornPrestige > 0) {
			r += `<span class="green">`;
			if (child.pornPrestige > 2) {
				r += `PPrest++`;
			} else if (child.pornPrestige === 2) {
				r += `PPrest+`;
			} else if (child.pornPrestige === 1) {
				r += `PPrest`;
			}
			r += `</span> `;
		}
	}

	/**
	 * @param {App.Entity.InfantState} child
	 */
	function longIntelligence(child) {
		let intelligence = child.intelligence;
		if (child.hasOwnProperty("intelligenceImplant")) {
			intelligence += child.intelligenceImplant;
		}
		if (child.intelligence > 95) {
			r += `<span class="deepskyblue">Likely to be brilliant${V.summaryStats ? `[${intelligence}]` : ''}.</span> `;
		} else if (intelligence > 50) {
			r += `<span class="deepskyblue">Likely to be very smart${V.summaryStats ? `[${intelligence}]` : ''}.</span> `;
		} else if (intelligence > 15) {
			r += `<span class="deepskyblue">Likely to be smart${V.summaryStats ? `[${intelligence}]` : ''}.</span> `;
		} else if (intelligence >= -15) {
			r += `Average intelligence${V.summaryStats ? `[${intelligence}]` : ''}. `;
		} else if (intelligence >= -50) {
			r += `<span class="orangered">Likely to be slow${V.summaryStats ? `[${intelligence}]` : ''}.</span> `;
		} else if (intelligence >= -95) {
			r += `<span class="orangered">Likely to be very slow${V.summaryStats ? `[${intelligence}]` : ''}.</span> `;
		} else {
			r += `<span class="orangered">Likely to be moronic${V.summaryStats ? `[${intelligence}]` : ''}.</span> `;
		}
	}

	/**
	 * @param {App.Entity.InfantState} child
	 */
	function longPrestige(child) {
		if (child.prestige > 0) {
			r += `<span class="green">`;
			if (child.prestige > 2) {
				r += `Extremely prestigious. `;
			} else if (child.prestige === 2) {
				r += `Very prestigious. `;
			} else if (child.prestige === 1) {
				r += `Prestigious. `;
			}
			r += `</span> `;
		}
	}

	/**
	 * @param {App.Entity.InfantState} child
	 */
	function longPornPrestige(child) {
		if (child.pornPrestige > 0) {
			r += `<span class="green">`;
			if (child.pornPrestige > 2) {
				r += `Porn star. `;
			} else if (child.pornPrestige === 2) {
				r += `Porn slut. `;
			} else if (child.pornPrestige === 1) {
				r += `Porn amateur. `;
			}
			r += `</span> `;
		}
	}

	/**
	 * @param {App.Entity.InfantState} child
	 */
	function shortBehaviorFlaw(child) {
		r += `<span class="red">`;
		switch (child.behavioralFlaw) {
			case "arrogant":
				r += `Arrog`;
				break;
			case "bitchy":
				r += `Bitchy`;
				break;
			case "odd":
				r += `Odd`;
				break;
			case "hates men":
				r += `Men-`;
				break;
			case "hates women":
				r += `Women-`;
				break;
			case "gluttonous":
				r += `Glut`;
				break;
			case "anorexic":
				r += `Ano`;
				break;
			case "devout":
				r += `Dev`;
				break;
			case "liberated":
				r += `Lib`;
				break;
			default:
				child.behavioralFlaw = "none";
				break;
		}
		r += `</span> `;
	}

	/**
	 * @param {App.Entity.InfantState} child
	 */
	function shortSexFlaw(child) {
		switch (child.sexualFlaw) {
			case "hates oral":
				r += `<span class="red">Oral-</span> `;
				break;
			case "hates anal":
				r += `<span class="red">Anal-</span> `;
				break;
			case "hates penetration":
				r += `<span class="red">Fuck-</span> `;
				break;
			case "shamefast":
				r += `<span class="red">Shame</span> `;
				break;
			case "idealistic":
				r += `<span class="red">Ideal</span> `;
				break;
			case "repressed":
				r += `<span class="red">Repre</span> `;
				break;
			case "apathetic":
				r += `<span class="red">Apath</span> `;
				break;
			case "crude":
				r += `<span class="red">Crude</span> `;
				break;
			case "judgemental":
				r += `<span class="red">Judge</span> `;
				break;
			case "cum addict":
				r += `<span class="yellow">CumAdd</span> `;
				break;
			case "anal addict":
				r += `<span class="yellow">AnalAdd</span> `;
				break;
			case "attention whore":
				r += `<span class="yellow">Attention</span> `;
				break;
			case "breast growth":
				r += `<span class="yellow">BoobObsess</span> `;
				break;
			case "abusive":
				r += `<span class="yellow">Abusive</span> `;
				break;
			case "malicious":
				r += `<span class="yellow">Malice</span> `;
				break;
			case "self hating":
				r += `<span class="yellow">SelfHatr</span> `;
				break;
			case "neglectful":
				r += `<span class="yellow">SelfNeglect</span> `;
				break;
			case "breeder":
				r += `<span class="yellow">BreedObsess</span> `;
				break;
			default:
				child.sexualFlaw = "none";
				break;
		}
	}

	/**
	 * @param {App.Entity.InfantState} child
	 */
	function longBehaviorFlaw(child) {
		r += `<span class="red">`;
		switch (child.behavioralFlaw) {
			case "arrogant":
				r += `Arrogant. `;
				break;
			case "bitchy":
				r += `Bitchy. `;
				break;
			case "odd":
				r += `Odd. `;
				break;
			case "hates men":
				r += `Hates men. `;
				break;
			case "hates women":
				r += `Hates women. `;
				break;
			case "gluttonous":
				r += `Stress eater. `;
				break;
			case "anorexic":
				r += `Anorexic. `;
				break;
			case "devout":
				r += `Devoutly religious. `;
				break;
			case "liberated":
				r += `Mentally liberated. `;
				break;
			default:
				child.behavioralFlaw = "none";
				break;
		}
		r += `</span> `;
	}

	/**
	 * @param {App.Entity.InfantState} child
	 */
	function longSexFlaw(child) {
		switch (child.sexualFlaw) {
			case "hates oral":
				r += `<span class="red">Hates oral.</span> `;
				break;
			case "hates anal":
				r += `<span class="red">Hates anal.</span> `;
				break;
			case "hates penetration":
				r += `<span class="red">Hates penetration.</span> `;
				break;
			case "shamefast":
				r += `<span class="red">Shamefast.</span> `;
				break;
			case "idealistic":
				r += `<span class="red">Sexually idealistic.</span> `;
				break;
			case "repressed":
				r += `<span class="red">Sexually repressed.</span> `;
				break;
			case "apathetic":
				r += `<span class="red">Sexually apathetic.</span> `;
				break;
			case "crude":
				r += `<span class="red">Sexually crude.</span> `;
				break;
			case "judgemental":
				r += `<span class="red">Sexually judgemental.</span> `;
				break;
			case "cum addict":
				r += `<span class="yellow">Cum addict.</span> `;
				break;
			case "anal addict":
				r += `<span class="yellow">Anal addict.</span> `;
				break;
			case "attention whore":
				r += `<span class="yellow">Attention whore.</span> `;
				break;
			case "breast growth":
				r += `<span class="yellow">Breast obsession.</span> `;
				break;
			case "abusive":
				r += `<span class="yellow">Sexually abusive.</span> `;
				break;
			case "malicious":
				r += `<span class="yellow">Sexually malicious.</span> `;
				break;
			case "self hating":
				r += `<span class="yellow">Self hatred.</span> `;
				break;
			case "neglectful":
				r += `<span class="yellow">Self neglectful.</span> `;
				break;
			case "breeder":
				r += `<span class="yellow">Breeding obsession.</span> `;
				break;
			default:
				child.sexualFlaw = "none";
				break;
		}
	}

	/**
	 * @param {App.Entity.InfantState} child
	 */
	function shortExtendedFamily(child) {
		let handled = 0;
		if (child.mother > 0) {
			const _ssj = V.slaves.findIndex(function(s) {
				return s.ID === child.mother;
			});
			if (_ssj !== -1) {
				r += `${SlaveFullName(V.slaves[_ssj])}'s daughter`;
				if (child.relationshipTarget === V.slaves[_ssj].ID) {
					const friendShipShort = relationshipTermShort(child);
					r += ` & ${friendShipShort}`;
					handled = 1;
				}
			}
			r += " ";
		} else if (child.mother === -1) {
			r += `Your daughter`;
			if (child.relationship < -1) {
				res += ` & ${PCrelationshipTerm(child)}`;
				handled = 1;
			}
			r += " ";
		} else if (child.mother in V.missingTable && V.showMissingSlavesSD && V.showMissingSlaves) {
			r += `${V.missingTable[child.mother].fullName}'s daughter `;
		}
		if (child.father > 0 && child.father !== child.mother) {
			const _ssj = V.slaves.findIndex(function(s) {
				return s.ID === child.father;
			});
			if (_ssj !== -1) {
				r += `${SlaveFullName(V.slaves[_ssj])}'s daughter`;
				if (child.relationshipTarget === V.slaves[_ssj].ID && handled !== 1) {
					const friendShipShort = relationshipTermShort(child);
					r += ` & ${friendShipShort}`;
					handled = 1;
				}
			}
			r += " ";
		} else if (child.father === -1 && child.mother !== -1) {
			r += `Your daughter`;
			if (child.relationship < -1) {
				res += ` & ${PCrelationshipTerm(child)}`;
				handled = 1;
			}
			r += " ";
		} else if (child.father in V.missingTable && child.father !== child.mother && V.showMissingSlavesSD && V.showMissingSlaves) {
			r += `${V.missingTable[child.father].fullName}'s daughter`;
		}
		if (child.daughters === 1) {
			let _ssj = V.slaves.findIndex(function(s) {
				return s.mother === child.ID;
			});
			if (_ssj !== -1) {
				r += `${SlaveFullName(V.slaves[_ssj])}'s mother`;
				if (child.relationshipTarget === V.slaves[_ssj].ID) {
					const friendShipShort = relationshipTermShort(child);
					r += ` & ${friendShipShort}`;
					handled = 1;
				}
			}
			r += " ";
			_ssj = V.slaves.findIndex(function(s) {
				return s.father === child.ID;
			});
			if (_ssj !== -1) {
				r += `${SlaveFullName(V.slaves[_ssj])}'s father`;
				if (child.relationshipTarget === V.slaves[_ssj].ID && handled !== 1) {
					const friendShipShort = relationshipTermShort(child);
					r += ` & ${friendShipShort}`;
					handled = 1;
				}
			}
			r += " ";
		} else if (child.daughters > 1) {
			r += `multiple daughters `;
		}
		if (child.sisters === 1) {
			const _ssj = V.slaves.findIndex(function(s) {
				return areSisters(s, child) > 0;
			});
			if (_ssj !== -1) {
				r += `${SlaveFullName(V.slaves[_ssj])}'s sister`;
				if (child.relationshipTarget === V.slaves[_ssj].ID) {
					const friendShipShort = relationshipTermShort(child);
					r += `& ${friendShipShort}`;
					handled = 1;
				}
			}
			r += " ";
		} else if (child.sisters > 1) {
			r += `multiple sisters `;
		}
		if (child.relationship > 0 && handled !== 1) {
			const _ssj = V.slaves.findIndex(function(s) {
				return s.ID === child.relationshipTarget;
			});
			if (_ssj !== -1) {
				r += `${SlaveFullName(V.slaves[_ssj])}'s`;
				const friendShipShort = relationshipTermShort(child);
				r += ` ${friendShipShort}`;
			}
		} else if (child.relationship === -3 && child.mother !== -1 && child.father !== -1) {
			r += `Your wife`;
		} else if (child.relationship === -2) {
			r += `E Bonded`;
		} else if (child.relationship === -1) {
			r += `E Slut`;
		}
	}

	/**
	 * @param {App.Entity.InfantState} child
	 */
	function shortRival(child) {
		if (child.rivalry !== 0) {
			r += `    `;
			const _ssj = V.slaves.findIndex(function(s) {
				return s.ID === child.rivalryTarget;
			});
			if (_ssj !== -1) {
				r += `<span class="lightsalmon">`;
				if (child.rivalry <= 1) {
					r += `Disl ${SlaveFullName(V.slaves[_ssj])}`;
				} else if (child.rivalry <= 2) {
					r += `${SlaveFullName(V.slaves[_ssj])}'s rival`;
				} else {
					r += `Hates ${SlaveFullName(V.slaves[_ssj])}`;
				}
				r += `</span> `;
			}
		}
	}

	/**
	 * @param {App.Entity.InfantState} child
	 */
	function longExtendedFamily(child) {
		let handled = 0;
		if (child.mother > 0) {
			const _ssj = V.slaves.findIndex(function(s) {
				return s.ID === child.mother;
			});
			if (_ssj !== -1) {
				r += `${SlaveFullName(V.slaves[_ssj])}'s <span class="lightgreen">daughter`;
				if (child.relationshipTarget === V.slaves[_ssj].ID) {
					const friendShipShort = relationshipTerm(child);
					r += ` and ${friendShipShort}`;
					handled = 1;
				}
				r += `.</span> `;
			}
		} else if (child.mother === -1) {
			r += `Your `;

			if (child.relationship < -1) {
				r += `<span class="lightgreen">daughter and ${PCrelationshipTerm(child)}.</span> `;
				handled = 1;
			} else {
				r += `<span class="lightgreen">daughter.</span> `;
			}
		} else if (child.mother in V.missingTable && V.showMissingSlavesSD && V.showMissingSlaves) {
			r += `${V.missingTable[child.mother].fullName}'s <span class="lightgreen">daughter.</span> `;
		}
		if (child.father > 0 && child.father !== child.mother) {
			const _ssj = V.slaves.findIndex(function(s) {
				return s.ID === child.father;
			});
			if (_ssj !== -1) {
				r += `${SlaveFullName(V.slaves[_ssj])}'s <span class="lightgreen">daughter`;
				if (child.relationshipTarget === V.slaves[_ssj].ID) {
					const friendShipShort = relationshipTerm(child);
					r += ` and ${friendShipShort}`;
					handled = 1;
				}
				r += `.</span> `;
			}
		} else if (child.father === -1 && child.father !== child.mother) {
			r += `Your `;
			if (child.relationship < -1) {
				r += `<span class="lightgreen">daughter and ${PCrelationshipTerm(child)}.</span> `;
				handled = 1;
			} else {
				r += `<span class="lightgreen">daughter.</span> `;
			}
		} else if (child.father in V.missingTable && child.father !== child.mother && V.showMissingSlavesSD && V.showMissingSlaves) {
			r += `${V.missingTable[child.father].fullName}'s <span class="lightgreen">daughter.</span> `;
		}
		if (child.daughters === 1) {
			let _ssj = V.slaves.findIndex(function(s) {
				return s.mother === child.ID;
			});
			if (_ssj !== -1) {
				r += `${SlaveFullName(V.slaves[_ssj])}'s <span class="lightgreen">mother`;
				if (child.relationshipTarget === V.slaves[_ssj].ID) {
					const friendShipShort = relationshipTerm(child);
					r += ` and ${friendShipShort}`;
					handled = 1;
				}
				r += `.</span> `;
			}
			_ssj = V.slaves.findIndex(function(s) {
				return s.father === child.ID;
			});
			if (_ssj !== -1) {
				r += `${SlaveFullName(V.slaves[_ssj])}'s <span class="lightgreen">father`;
				if (child.relationshipTarget === V.slaves[_ssj].ID) {
					const friendShipShort = relationshipTerm(child);
					r += ` and ${friendShipShort}`;
					handled = 1;
				}
				r += `.</span> `;
			}
		} else if (child.daughters > 1) {
			if (child.daughters > 10) {
				r += `<span class="lightgreen">Has tons of daughters.</span> `;
			} else if (child.daughters > 5) {
				r += `<span class="lightgreen">Has many daughters.</span> `;
			} else {
				r += `<span class="lightgreen">Has several daughters.</span> `;
			}
		}
		if (child.sisters === 1) {
			const _ssj = V.slaves.findIndex(function(s) {
				return areSisters(s, child) > 0;
			});
			if (_ssj !== -1) {
				r += `${SlaveFullName(V.slaves[_ssj])}'s <span class="lightgreen">sister`;
				if (child.relationshipTarget === V.slaves[_ssj].ID) {
					const friendShipShort = relationshipTerm(child);
					r += ` and ${friendShipShort}`;
					handled = 1;
				}
				r += `.</span> `;
			}
		} else if (child.sisters > 1) {
			if (child.sisters > 10) {
				r += `<span class="lightgreen">One of many sisters.</span> `;
			} else if (child.sisters > 5) {
				r += `<span class="lightgreen">Has many sisters.</span> `;
			} else {
				r += `<span class="lightgreen">Has several sisters.</span> `;
			}
		}
		if (child.relationship > 0 && handled !== 1) {
			const _ssj = V.slaves.findIndex(function(s) {
				return s.ID === child.relationshipTarget;
			});
			if (_ssj !== -1) {
				const friendship = relationshipTerm(child);
				r += `${SlaveFullName(V.slaves[_ssj])}'s `;
				r += `<span class="lightgreen">${friendship}.</span> `;
			}
		} else if (child.relationship === -3 && child.mother !== -1 && child.father !== -1) {
			r += `<span class="lightgreen">Your wife.</span> `;
		} else if (child.relationship === -2) {
			r += `<span class="lightgreen">Emotionally bonded to you.</span> `;
		} else if (child.relationship === -1) {
			r += `<span class="lightgreen">Emotional slut.</span> `;
		}
	}

	/**
	 * @param {App.Entity.InfantState} child
	 */
	function longRival(child) {
		if (child.rivalry !== 0) {
			r += `    `;
			const _ssj = V.slaves.findIndex(function(s) {
				return s.ID === child.rivalryTarget;
			});
			if (_ssj !== -1) {
				if (child.rivalry <= 1) {
					r += `<span class="lightsalmon">Dislikes</span> ${SlaveFullName(V.slaves[_ssj])}. `;
				} else if (child.rivalry <= 2) {
					r += `${SlaveFullName(V.slaves[_ssj])}'s <span class="lightsalmon">rival.</span> `;
				} else {
					r += `<span class="lightsalmon">Hates</span> ${SlaveFullName(V.slaves[_ssj])}. `;
				}
			}
			r += " ";
		}
	}

	/**
	 * @param {App.Entity.InfantState} child
	 */
	function origins(child) {
		r += `<br> `;
		if (V.seeImages !== 1 || V.seeSummaryImages !== 1 || V.imageChoice === 1) {
			r += `    `;
		}
		r += `<span class="gray">${child.origin}</span> `;
	}

	return InfantSummaryUncached(child);
};


code:
/**
 * Displays a detailed description of the infant
 * @param {App.Entity.InfantState} child
 * @returns {string}
 */
App.Facilities.Nursery.LongInfantDescription = function(child) {
	"use strict";
	const
		PC = V.PC,
		arcology = V.arcologies[0],
		weeksOwned = V.week - child.weekAcquired;

	let
		r = ``,
		age,
		title,
		father = 0,
		fatherPC = 0,
		mother = 0,
		motherPC = 0;

	const
		{
			he, him, his, He, His
		} = getPronouns(child);

	if (child.father === -1 && child.mother === -1) {
		father = PC;
		fatherPC = 1;
		mother = PC;
		motherPC = 1;
	} else {
		if (child.father === -1) {
			father = PC;
			fatherPC = 1;
			mother = getSlave(child.mother);
		} else if (child.mother === -1) {
			father = getSlave(child.father);
			mother = PC;
			motherPC = 1;
		} else {
			if (child.father > 0) { /* Fathered by a current slave */
				father = getSlave(child.father);
			} else if (child.father < 0) { /* Fathered by a missing slave */
				father = -1;
			}
			if (child.father > 0) { /* Mothered by a current slave */
				mother = getSlave(child.mother);
			} else if (child.mother < 0) { /* Mothered by a missing slave */
				mother = -1;
			}
		}
	}

	// TODO: add infant art here

	r += `     `;

	r += `<span id="childName"><strong><span class="pink">${SlaveFullName(child)}</span></strong></span> `;

	if (jsDef(child.custom)) {
		if (child.custom.label) {
			r += ` (<strong><span class="yellow">${child.custom.label}</span></strong>) `;
		}
	}

	if (child.actualAge > 0) {
		age = `${num(child.actualAge)}-year-old`;
		if (child.actualAge > 1) {
			title = `toddler`;
		} else {
			title = `baby`;
		}
	} else {
		if (weeksOwned > 4) {
			age = `${num(Math.trunc(weeksOwned / 4))}-month-old`;
			title = `baby`;
		} else {
			if (weeksOwned <= 1) {
				age = ``;
				title = `newborn`;
			} else {
				age = `${num(weeksOwned)}-week-old`;
				title = `baby`;
			}
		}
	}

	r += ` is a ${age} <strong><span class="coral">${title}.</span></strong> ${He} was born in ${arcology.name} ${weeksOwned > 4 ? weeksOwned < 9 ? `about a month` : `${num(weeksOwned)} months` : weeksOwned <= 1 ? `last week` : `${num(weeksOwned)} weeks`}${weeksOwned > 1 ? ` ago` : ``}`;

	if (jsDef(child.counter)) {
		const
			oral = child.counter.oral,
			vaginal = child.counter.vaginal,
			anal = child.counter.oral,
			mammary = child.counter.mammary,
			penetrative = child.counter.penetrative,
			total = oral + vaginal + anal + mammary + penetrative;

		if (total > 0) {
			r += ` and has been fucked about ${num(total)} times, including `;
			if ((vaginal + anal + mammary + penetrative) > 0) {
				if (vaginal > 0) {
					r += `${num(vaginal)} vanilla, `;
				}
				if (anal > 0) {
					r += `${num(anal)} anal, `;
				}
				if (mammary > 0) {
					r += `${num(mammary)} mammary `;
				}
				if (penetrative > 0) {
					r += `${num(penetrative)} penetrating, `;
				}
				r += ` and `;
			}
			r += `${num(oral)} oral sexual encounters. `;
		} else {
			if (weeksOwned >= 1) {
				r += ` and `;
			} else {
				r += `. ${He} `;
			}

			r += `has had little or no sexual experience `;
			if (child.weekAcquired !== 0) {
				r += `as your slave `;
			} else {
				r += `in your new arcology `;
			}
			r += `yet. `;

			let sortedCounts = [];
			sortedCounts.push(
				{type: "oral", value: oral},
				{type: "vaginal", value: vaginal},
				{type: "anal", value: anal},
				{type: "mammary", value: mammary},
				{type: "penetrative", value: penetrative}
			);
			sortedCounts = sortedCounts.sort(function(a, b) {	// sorts the counts from largest to smallest
				return b.value - a.value;
			});

			if (sortedCounts[0].type === "oral") {
				if (((weeksOwned * 112) / oral) < 4) {
					r += `Remarkably, this means that ${he}'s sucked something off `;
					if (((weeksOwned * 112) / oral) < 1) {
						r += `more than once every hour `;
					} else if (((weeksOwned * 112) / oral) < 1.5) {
						r += `about once every hour `;
					} else if (((weeksOwned * 112) / oral) < 2.5) {
						r += `about once every two hours `;
					} else if (((weeksOwned * 112) / oral) < 3.5) {
						r += `about once every three hours `;
					} else {
						r += `about once every four hours `;
					}
					r += ` ${he}'s spent awake. `;
				}
			} else if (sortedCounts[0].type === "vaginal") {
				if (((weeksOwned * 112) / oral) < 4) {
					r += `Remarkably, this means that ${his} pussy has been fucked `;
					if (((weeksOwned * 112) / oral) < 1) {
						r += `more than once every hour `;
					} else if (((weeksOwned * 112) / oral) < 1.5) {
						r += `about once every hour `;
					} else if (((weeksOwned * 112) / oral) < 2.5) {
						r += `about once every two hours `;
					} else if (((weeksOwned * 112) / oral) < 3.5) {
						r += `about once every three hours `;
					} else {
						r += `about once every four hours `;
					}
					r += ` ${he}'s spent awake. `;
				}
			} else if (sortedCounts[0].type === "anal") {
				if (((weeksOwned * 112) / oral) < 4) {
					r += `Remarkably, this means that ${he}'s been buttfucked `;
					if (((weeksOwned * 112) / oral) < 1) {
						r += `more than once every hour `;
					} else if (((weeksOwned * 112) / oral) < 1.5) {
						r += `about once every hour `;
					} else if (((weeksOwned * 112) / oral) < 2.5) {
						r += `about once every two hours `;
					} else if (((weeksOwned * 112) / oral) < 3.5) {
						r += `about once every three hours `;
					} else {
						r += `about once every four hours `;
					}
					r += ` ${he}'s spent awake. `;
				}
			} else if (sortedCounts[0].type === "mammary") {
				if (((weeksOwned * 112) / oral) < 4) {
					r += `Remarkably, this means that ${he}'s put ${his} tits to work `;
					if (((weeksOwned * 112) / oral) < 1) {
						r += `more than once every hour `;
					} else if (((weeksOwned * 112) / oral) < 1.5) {
						r += `about once every hour `;
					} else if (((weeksOwned * 112) / oral) < 2.5) {
						r += `about once every two hours `;
					} else if (((weeksOwned * 112) / oral) < 3.5) {
						r += `about once every three hours `;
					} else {
						r += `about once every four hours `;
					}
					r += ` ${he}'s spent awake. `;
				}
			} else if (sortedCounts[0].type === "penetrative") {
				if (((weeksOwned * 112) / oral) < 4) {
					r += `Remarkably, this means that ${he}'s pounded a hole `;
					if (((weeksOwned * 112) / oral) < 1) {
						r += `more than once every hour `;
					} else if (((weeksOwned * 112) / oral) < 1.5) {
						r += `about once every hour `;
					} else if (((weeksOwned * 112) / oral) < 2.5) {
						r += `about once every two hours `;
					} else if (((weeksOwned * 112) / oral) < 3.5) {
						r += `about once every three hours `;
					} else {
						r += `about once every four hours `;
					}
					r += ` ${he}'s spent awake. `;
				}
			}
		}
	} else {
		r += `. `;
	}

	r += App.Desc.family(child) + ' ';

	if (father && fatherPC) {
		if (child.eyeColor === PC.eye.origColor) {
			r += `${He} has your ${child.eyeColor} eyes, `;
		} else if (mother) {
			r += `${He} has ${his} mother ${mother.slaveName}'s ${child.eyeColor} eyes, `;
		}
	} else {
		if (father && child.eyeColor === father.eyeColor) {
			r += `${He} has ${his} father ${father.slaveName}'s ${child.eyeColor} eyes, `;
		} else if (mother) {
			r += `${He} has ${his} mother ${mother.slaveName}'s ${child.eyeColor} eyes, `;
		} else {
			r += `${He} has ${child.eyeColor} eyes, `;
		}
	}
	r += ` and ${he} will most likely have ${child.hColor} hair when ${he}'s older. `;

	r += `${He} ${V.seeRace ? `is ${child.race} and ${child.nationality}, and` : ``} has ${child.skin} skin. `;

	return r;
};


code:
/**
 * Details week-to-week changes in children in the Nursery
 * @returns {string}
 */
App.Facilities.Nursery.childrenReport = function childrenReport() {
	"use strict";

	const
		Matron = V.Matron,
		NL = App.Entity.facilities.nursery.employeesIDs().size,
		CL = V.cribs.length;

	let
		r = ``;

	for (let i = 0; i < CL; i++) {
		const
			child = V.cribs[i];
			// {
			// he, him, his, He, His
			// } = getPronouns(child);

		let
			he,
			his,
			him,
			He,
			His;

		// FIXME: get pronoun system to work with child objects
		if (child.genes === "XX") {
			he = "she",
			him = "her",
			his = "her";
		} else {
			he = "he",
			him = "him",
			his = "his";
		}
		He = capFirstChar(he), His = capFirstChar(his);

		if (child.growTime > 0) {
			r += `<br><span class="pink">${child.slaveName}</span> is growing steadily. ${He} will be ready for release in about ${years(child.growTime)}. `;
		} else {
			r += `<span class="pink">${child.slaveName}</span> is <span class="lime">ready for release.</span> ${He} will be removed from ${V.nurseryName} upon your approach.`;
		}

		// TODO: add Matron and nanny effects
		if (child.actualAge >= 3) {
			if (Matron || NL) {
				let
					chance = jsRandom(1, 100);

				if (jsDef(Matron)) {
					if (Matron.fetish !== "none") {
						if (chance > 90) {
							if (child.fetish === "none") {
								// TODO: clean up the following blocks
								r += `${child.slaveName} has taken a few cues from ${Matron.slaveName}, and `;
								switch (child.fetish) {
									case "submissive":
										r += `is now a submissive`;
										break;
									case "cumslut":
										r += `is now a cumslut`;
										break;
									case "humiliation":
										r += `now has a fetish for humiliation`;
										break;
									case "buttslut":
										r += `is now a buttslut`;
										break;
									case "boobs":
										r += `now has a fetish for boobs and breastplay`;	// TODO: not happy with this wording
										break;
									case "sadist":
										r += `now gets off on causing pain`;
										break;
									case "masochist":
										r += `now gets off on pain`;
										break;
									case "dom":
										r += `is now very sexually dominant`;
										break;
									case "pregnancy":
										r += `has developed a facination for all things pregnancy-related`;
										break;
								}
								r += `. `;
								child.fetish = Matron.fetish;
							} else {
								if (chance > 95) {
									r += `${Matron.slaveName} has rubbed off on ${child.slaveName}, in more ways than one. ${He} `;
									switch (child.fetish) {
										case "submissive":
											r += `is now a submissive`;
											break;
										case "cumslut":
											r += `is now a cumslut`;
											break;
										case "humiliation":
											r += `now has a fetish for humiliation`;
											break;
										case "buttslut":
											r += `is now a buttslut`;
											break;
										case "boobs":
											r += `now has a fetish for boobs and breastplay`;	// TODO: not happy with this wording
											break;
										case "sadist":
											r += `now gets off on causing pain`;
											break;
										case "masochist":
											r += `now gets off on pain`;
											break;
										case "dom":
											r += `is now very sexually dominant`;
											break;
										case "pregnancy":
											r += `has developed a facination for all things pregnancy-related`;
											break;
									}
									r += `. `;
									child.fetish = Matron.fetish;
								}
							}
						}
					}
				}

				if (NL > 0) {
					for (const slave of App.Utils.sortedEmployees(App.Entity.facilities.nursery)) {
						if (slave.fetish !== "none") {
							if (chance > 85) {
								if (child.fetish === "none") {
									r += `${slave.slaveName} has left quite an impression on ${child.slaveName}, and ${he} `;
									switch (child.fetish) {
										case "submissive":
											r += `is now a submissive`;
											break;
										case "cumslut":
											r += `is now a cumslut`;
											break;
										case "humiliation":
											r += `now has a fetish for humiliation`;
											break;
										case "buttslut":
											r += `is now a buttslut`;
											break;
										case "boobs":
											r += `now has a fetish for boobs and breastplay`;	// TODO: not happy with this wording
											break;
										case "sadist":
											r += `now gets off on causing pain`;
											break;
										case "masochist":
											r += `now gets off on pain`;
											break;
										case "dom":
											r += `is now very sexually dominant`;
											break;
										case "pregnancy":
											r += `has developed a facination for all things pregnancy-related`;
											break;
									}
									r += `. `;
									child.fetish = slave.fetish;
								} else {
									if (chance > 90) {
										r += `${child.slaveName} seems to have taken to ${slave.slaveName}'s example, and `;
										switch (child.fetish) {
										case "submissive":
											r += `is now a submissive`;
											break;
										case "cumslut":
											r += `is now a cumslut`;
											break;
										case "humiliation":
											r += `now has a fetish for humiliation`;
											break;
										case "buttslut":
											r += `is now a buttslut`;
											break;
										case "boobs":
											r += `now has a fetish for boobs and breastplay`;	// TODO: not happy with this wording
											break;
										case "sadist":
											r += `now gets off on causing pain`;
											break;
										case "masochist":
											r += `now gets off on pain`;
											break;
										case "dom":
											r += `is now very sexually dominant`;
											break;
										case "pregnancy":
											r += `has developed a facination for all things pregnancy-related`;
											break;
									}
									r += `. `;
										child.fetish = slave.fetish;
									}
								}
							}
						}
					}
				}

				// TODO: add education system
				if (jsDef(Matron) && Matron) {
					const {
						// eslint-disable-next-line no-unused-vars
						he2, him2, his2, hers2, himself2, boy2, He2, His2
					} = getPronouns(Matron).appendSuffix('2');

					if (Matron.intelligence + Matron.intelligenceImplant > 65) {
						r += `${Matron.slaveName} is so intelligent and well-educated that ${he2} is able to teach ${CL > 1 ? `the children` : `${child.slaveName}`} very effectively, and so ${CL > 1 ? child.slaveName : `${he}`} gradually grows smarter. `;	// TODO: not happy with this
						child.intelligenceImplant += 3;	// TODO: should this raise intelligence instead?
					} else if (Matron.intelligenceImplant > 30) {
						r += `${Matron.slaveName}'s education makes up for the fact that ${CL > 1 ? child.slaveName : `${he}`} isn't the brightest and allows ${him2} to teach ${CL > 1 ? `the children` : `${child.slaveName}`} quite effectively, and so ${CL > 1 ? child.slaveName : `${he}`} grows a bit smarter. `;	// TODO:
						child.intelligenceImplant += 2;
					} else if (Matron.intelligence > 50) {
						r += `Though ${Matron.slaveName} has had little to no formal education, ${his2} natural brilliance allows ${him2} to teach ${CL > 1 ? `the children` : `${child.slaveName}`} quite effectively, and so ${CL > 1 ? child.slaveName : `${he}`} grows a bit smarter. `;	// TODO:
						child.intelligenceImplant += 2;
					} else {
						r += `${Matron.slaveName} isn't the brightest, and isn't as effective at teaching as ${he2} otherwise could be. ${He2} is only somewhat effective at teaching ${CL > 1 ? `the children` : `${child.slaveName}`}, and so ${CL > 1 ? child.slaveName : `${he}`} grows just a little bit smarter. `;	// TODO:
						child.intelligenceImplant++;
					}
				}

				if (NL > 0) {
					let
						averageIntelligence = 0,
						averageIntelligenceImplant = 0;

					const nannies = App.Entity.facilities.nursery.employees();
					for (const nanny of nannies) {
						averageIntelligence += nanny.intelligence;
						averageIntelligenceImplant += nanny.intelligenceImplant;
					}

					const firstNanny = nannies[0];

					averageIntelligence = averageIntelligence / NL;
					averageIntelligenceImplant = averageIntelligenceImplant / NL;

					if (averageIntelligence + averageIntelligenceImplant > 65) {
						r += `${NL > 1 ? `The nannies are mostly` : `${firstNanny.slaveName} is`} very intelligent and well educated and are able to teach ${CL > 1 ? `the children` : child.slaveName} very effectively. `;
						child.intelligenceImplant += 3;
					} else if (averageIntelligence > 50) {
						r += `${NL > 1 ? `The nannies are mostly` : `${firstNanny.slaveName} is`} very intelligent and able to teach ${CL > 1 ? `the children` : child.slaveName} quite effectively. `;
						child.intelligenceImplant += 2;
					} else if (averageIntelligenceImplant > 25) {
						r += `${NL > 1 ? `The nannies are mostly` : `${firstNanny.slaveName} is`} very well educated and able to teach ${CL > 1 ? `the children` : child.slaveName} quite effectively. `;
						child.intelligenceImplant += 2;
					} else if (averageIntelligenceImplant > 15) {
						r += `${NL > 1 ? `The nannies are mostly` : `${firstNanny.slaveName} is`} well educated and able to teach ${CL > 1 ? `the children` : child.slaveName} fairly effectively. `;
						child.intelligenceImplant++;
					}
				}

				// TODO: add fitness system
				if (jsDef(Matron) && Matron) {
					// TODO:
				}

				if (NL > 0) {
					// TODO:
				}
			}

			// TODO: add friend / rivalry system
			// TODO: add relations to friend system
			for (let j = 0; j < CL; j++) {
				const
					c = V.cribs[j];

				let
					friend = 0,
					rival = 0,
					chance = jsRandom(1, 100);

				if (c.actualAge >= 3) {
					if (c.fetish === child.fetish) {
						r += ``; // TODO:
						friend++;
					}

					if (c.sexualQuirk === child.sexualQuirk || c.behavioralQuirk === child.behavioralQuirk) {
						r += ``; // TODO:
						friend++;
					}

					if (c.fetish === "sadist" || c.fetish === "dom") {
						r += ``; // TODO:
						rival++;
					} else if (child.fetish === "sadist" || child.fetish === "dom") {
						r += ``; // TODO:
						rival++;
					}

					if (friend) {
						if (rival) {
							if (friend > rival) {
								if (chance > 75) {
									r += ``;	// TODO:
									child.relationship = 1, child.relationshipTarget = c.ID;
									c.relationship = 1, c.relationshipTarget = child.ID;
								}
							}
						} else {
							if (chance > 60) {
								r += ``;	// TODO:
								child.relationship = 1, child.relationshipTarget = c.ID;
								c.relationship = 1, c.relationshipTarget = child.ID;
							}
						}
					}

					if (rival) {
						if (friend) {
							if (rival > friend) {
								if (chance > 75) {
									r += ``;	// TODO:
								}
							}
						} else {
							if (chance > 60) {
								r += ``;	// TODO:
							}
						}
					}
				}
			}

			// TODO: rework these entirely
			if (Matron || NL) {
				if (V.nurseryWeight) {
					const firstNanny = NL > 0 ? App.Entity.facilities.nursery.employees()[0] : null;
					r += `<br>`;
					if (V.nurseryWeightSetting === 1) {
						if (child.weight < 200) {
							child.weight += 5;
						}
						r += `${He} is being fed an excessive amount of food, causing <span class="red">rapid weight gain.</span> `;
					} else if (V.nurseryWeightSetting === 2) {
						if (child.weight > 10) {
							child.weight--;
							r += `${Matron ? Matron.slaveName : NL > 1 ? `A nanny` : firstNanny.slaveName} notices ${he} is overweight and <span class="green">decreases the amount of food ${he} eats.</span> `;
						} else if (child.weight <= -10) {
							child.weight++;
							r += `${Matron ? Matron.slaveName : NL > 1 ? `A nanny` : firstNanny.slaveName} notices ${he} is underweight and <span class="green">increases the amount of food ${he} eats.</span> `;
						} else {
							r += `${He} is <span class="lime">currently a healthy weight;</span> efforts will be made to maintain it. `;
						}
					} else if (V.nurseryWeightSetting === 0) {
						if (child.weight > -20) {
							r += `${His} developing body <span class="red">quickly sheds its gained weight.</span> `;
							child.weight -= 40;
						}
					}
				} else {
					if (child.weight > -20) {
						child.weight -= 40;
						r += `${His} developing body <span class="red">quickly sheds its gained weight.</span>`;
					}
				}

				// TODO: rewrite these
				if (V.nurseryMuscles) {
					r += `${He} is being given anabolic steroids causing <span class="green">rapid muscle development.</span> `;	// TODO: not happy with this
					if (V.nurseryMusclesSetting === 2) {
						if (child.muscles < 100) {
							child.muscles += 5;
						}
						r += `${Matron ? Matron : NL > 1 ? `A nanny` : firstNanny.slaveName} notices ${he} is overly muscular and <span class="green">decreases ${his} steroid dosage.</span> `;
					} else if (V.nurseryMusclesSetting === 1) {
						if (child.muscles > 10) {
							child.muscles--;
							r += `${Matron ? Matron : NL > 1 ? `A nanny` : firstNanny.slaveName} notices ${he} is weak and <span class="green">increases ${his} steroid dosage.</span> `;
						} else if (child.muscles < -10) {
							child.muscles++;
							r += `${He} has <span class="lime">a healthy musculature;</span> efforts will be made to maintain it. `;
						} else {
							r += `${His} developing body <span class="red">quickly loses its gained muscle.</span> `;
						}
					} else if (V.nurseryMusclesSetting === 0) {
						if (child.muscles > -100) {
							child.muscles -= 40;
							r += `${His} developing body <span class="red">quickly loses its gained muscle.</span> `;
						}
					}
				}
			}
		} else {
			// TODO:
		}
		r += `<br>`;
	}

	return r;
};


code:
/**
 * Creates a full report of the Nursery
 * @returns {string}
 */
// TODO: refactor this
App.Facilities.Nursery.nurseryReport = function nurseryReport() {
	"use strict";

	let r = ``;

	const
		Matron = getSlave(V.Matron.ID),
		arcology = V.arcologies[0];

	let
		NL = App.Utils.jobForAssignment(Job.NURSERY).employeesIDs().size,
		healthBonus = 0,
		trustBonus = 0,
		idleBonus = 0,
		devBonus = 0;

	if (V.nurseryDecoration !== "standard") {
		devBonus = 1;
	}

	if (Matron) {
		const
			{
				he, him, his, himself, He, His
			} = getPronouns(Matron);

		if (Matron.health.condition < 100) {
			improveCondition(Matron, 20);
		}
		if (Matron.devotion <= 60) {
			Matron.devotion++;
		}
		if (Matron.trust <= 60) {
			Matron.trust++;
		}
		if (Matron.rules.living !== "luxurious") {
			Matron.rules.living = "luxurious";
		}

		let FLsFetish = 0;
		/*
		if (Matron.fetishStrength <= 95) {
			if (Matron.fetish !== "caring") {
				if (fetishChangeChance(Matron) > jsRandom(0, 100)) {
					FLsFetish = 1, Matron.fetishKnown = 1, Matron.fetish = "caring";
				}
			} else if (!Matron.fetishKnown) {
				FLsFetish = 1, Matron.fetishKnown = 1;
			} else {
				FLsFetish = 2, Matron.fetishStrength += 4;
			}
		}
		*/
		if (Matron.fetish === "none" || Matron.fetish === "caring") {
			devBonus++;
		}

		Matron.devotion += devBonus;

		if (V.Matron !== Matron) {
			V.Matron = Matron;
		}

		r += `    ${SlaveFullName(Matron)} is serving as ${V.nurseryName} matron. `;

		if (Matron.relationship === -3 && Matron.devotion > 50) {
			r += `${He} tries ${his} best to ${V.nurseryChildren ? `properly take care of and raise the children` : `look after ${V.nurseryName} and keep it tidy and running smoothly`}. `;
		}

		if (FLsFetish === 1) {
			r += `${He} ${V.nurseryChildren ? `seems to have a real soft spot for children, and enjoys working with the child${V.nurseryChildren > 1 ? `ren` : ``} in ${V.nurseryName} and raising ${V.nurseryChildren > 1 ? `them` : V.cribs[0].genes === "XX" ? `her` : `him`} to be ${V.nurseryChildren > 1 ? `good slaves` : `a good slave`}` : ``/* TODO: */}. ${He} finds real satisfaction in helping your slaves find sexual gratification, and becomes more caring. `;
		} else if (FLsFetish === 2) {
			r += `Every new slave in the nursery is a new person ${he} gets to connect with and serve. Sexually. <span class='lightsalmon'>${He} becomes more caring.</span>`;	// TODO:
		}

		// TODO:
		if (setup.matronCareers.includes(Matron.career)) {
			r += `${He} has experience with childcare from ${his} life before ${he} was a slave, making ${him} better at properly raising children, and giving ${him} a better chance of softening flaws into beneficial quirks. `;
			idleBonus++;
		} else if (Matron.skill.matron >= V.masteredXP) {
			r += `${He} has experience with childcare from working for you, making ${him} better at properly raising children, and giving ${him} a better chance of softening flaws into beneficial quirks. `;
			idleBonus++;
		} else {
			Matron.skill.matron += jsRandom(1, (Matron.intelligence + 4) * 2);
		}

		// TODO:
		if (Matron.fetish === "none") {
			r += `${Matron.slaveName} respects the slaves working in the nursery, allowing them to care for the children more effectively. `;
			idleBonus++;
		} else if (Matron.fetish === "dom") {
			r += `${Matron.slaveName} enjoys being able to have control over the nannies. `;
			idleBonus++;
		} else if (Matron.fetishKnown) {
			r += `${Matron.slaveName} can't keep ${his} hands to ${himself}, preventing the slaves in the nursery from relaxing completely. `;
		}

		// TODO:
		if (Matron.visualAge > 35) {
			r += `${His} apparent maturity encourages the slaves in the nursery to relax and pour out their troubles to ${him}. `;
		}

		// TODO:
		if (Matron.intelligence > 0) {
			r += `${He}'s so intelligent ${he} can suss out the cause of slaves' emotional issues and counsel them effectively. `;
		}

		// TODO: write more

		if (NL < V.nursery) {
			let seed = jsRandom(1, 10) + ((V.nursery - NL) * (jsRandom(150, 170) + (idleBonus * 10)));
			cashX(seed, "nursery", Matron);
			r += `
    Since ${he} doesn't have enough children to occupy all ${his} time, ${V.nurseryName} takes in citizens' children on a contract basis and ${he} cares for them too, earning ${cashFormat(seed)}. `;
		}

		if (arcology.FSRepopulationFocus > 0 && V.nurseryBabies > 0) {
			r += `Society <span class='green'>loves</span> the way you are raising more children for ${arcology.name}. `;
			FSChange("Repopulationist", 2);
		}

		if (NL > 0) {
			r += `<br><br>`;
		}
	}

	if (NL > 0) {
		r += `    <strong>${NL > 1 ? `There are ${NL} slaves` : `There is one slave`} working in ${V.nurseryName}.</strong> `;
		if (arcology.FSRepopulationFocus > 0 && V.nurseryBabies > 0) {
			r += `Society <span class="green">approves</span> of your bringing more children into this world. `;
		} else if (arcology.FSGenderFundamentalist > 0) {
			r += `Society <span class="green">approves</span> of your assigning slaves to a traditionally feminine role. `;
		}
	}

	if (Matron) {
		V.i = V.slaveIndices[Matron.ID];
		if (V.showEWD) {
			// TODO: all this
			r += `<br><br>`;
			/* 000-250-006 */
			if (V.seeImages && V.seeReportImages) {
				r += `<div class="imageRef medImg">${SlaveArt(Matron, 2, 0)}</div>`;
			}
			/* 000-250-006 */
			r += `<strong><u><span class="pink">${SlaveFullName(Matron)}</span></u></strong> is serving as the Matron in ${V.nurseryName}.`;
			r += `${App.SlaveAssignment.choosesOwnClothes(Matron)}`;
			r += `<<include "SA rules">>`;
			r += `<<include "SA diet">>`;
			r += `<<include "SA long term effects">>`;
			r += `${App.SlaveAssignment.drugs(Matron)}`;
			r += `<<include "SA relationships">>`;
			r += `<<include "SA rivalries">>`;
			r += `<br><<include "SA devotion">>`;
		} else {
			r += `<<silently>>
			${App.SlaveAssignment.choosesOwnClothes(Matron)};
			<<include "SA rules">>
			<<include "SA diet">>
			<<include "SA long term effects">>
			${App.SlaveAssignment.drugs(Matron)};
			<<include "SA relationships">>
			<<include "SA rivalries">>
			<<include "SA devotion">>
			<</silently>>`;
		}
	}

	for (const slave of App.Utils.sortedEmployees(App.Utils.jobForAssignment(Job.NURSERY))) {
		V.i = V.slaveIndices[slave.ID];

		slave.devotion += devBonus, slave.trust += trustBonus;
		improveCondition(slave, healthBonus);

		// TODO: rework these
		if (slave.devotion < 60 && slave.trust < 60) {
			slave.devotion++, slave.trust++;
		} else if (slave.devotion < 40) {
			slave.devotion += 10;
		} else if (slave.trust < 40) {
			slave.trust += 10;
		}

		// TODO: rework this
		if (V.nurseryUpgrade === 1 && slave.health.condition < 20) {
			improveCondition(slave, 3);
		}

		// TODO:
		switch (V.nurseryDecoration) {
			case "Repopulationist":
				slave.rules.living = "luxurious";
				break;
			case "Degradationist":
				slave.rules.living = "spare";
				break;
			default:
				slave.rules.living = "normal";
				break;
		}

		// TODO:
		if (V.showEWD) {
			const
				He = slave.genes === "XX" ? `She` : `He`;

			r += `<br><br>`;
			/* 000-250-006 */
			if (V.seeImages && V.seeReportImages) {
				r += `<div class="imageRef smlImg">${SlaveArt(slave, 0, 0)}</div>`;
			}
			/* 000-250-006 */
			r += `<strong><u><span class="pink">${SlaveFullName(slave)}</span></u></strong>`;
			if (slave.choosesOwnAssignment === 2) {
				r += `${choosesOwnJob(slave)}`;
			} else {
				r += ` is working in ${V.nurseryName}. `;
			}
			// TODO: clean this mess up
			r += `<br>    ${He} ${App.SlaveAssignment.nanny(slave)}<br>   `;
			r += `${App.SlaveAssignment.choosesOwnClothes(slave)} ${saRules(slave)}`;
			r += `<<include "SA diet">>`;					// TODO:
			r += `<<include "SA long term effects">>`;		// TODO:
			r += `${App.SlaveAssignment.drugs(slave)}`;						// TODO:
			r += `<<include "SA relationships">>`;			// TODO:
			r += `<<include "SA rivalries">>`;				// TODO:
			r += `<br><<include "SA devotion">>`;			// TODO:
		} else {
			r += `<<silently>>`;
			r += `${choosesOwnJob(slave)} ${App.SlaveAssignment.nanny(slave)} ${App.SlaveAssignment.choosesOwnClothes(slave)} ${saRules(slave)}`;
			r += `<<include "SA diet">>`;
			r += `<<include "SA long term effects">>`;
			r += `${App.SlaveAssignment.drugs(slave)}`;
			r += `<<include "SA relationships">>`;
			r += `<<include "SA rivalries">>`;
			r += `<<include "SA devotion">>`;
			r += `<</silently>>`;
		}
	}

	if (NL > 0 || Matron) {
		r += `<br><br>`;
	}

	function choosesOwnJob(slave) {
		let r = ``;

		if (V.universalRulesAssignsSelfFacility && slave.devotion > 50 && canWalk(slave) && canSee(slave) && slave.sexualQuirk === "caring" && V.nurseryNannies > NL) {
			slave.choosesOwnAssignmentText += ` enjoys taking care of children, so ${he} decides to work in ${V.nurseryName}. `;
			r = slave.choosesOwnAssignmentText;
			assignJob(slave, Job.NURSERY);
		}

		return r;
	}

	// function diet(slave) {
	// 	let r = ``;

	// 	return r;
	// }

	// function longTermEffects(slave) {
	// 	let r = ``;

	// 	return r;
	// }

	// function drugs(slave) {
	// 	let r = ``;

	// 	return r;
	// }

	// function relationships(slave) {
	// 	let r = ``;

	// 	return r;
	// }

	// function rivalries(slave) {
	// 	let r = ``;

	// 	return r;
	// }

	// function devotion(slave) {
	// 	let r = ``;

	// 	return r;
	// }

	return r;
};