{"release_id":"01a1998d-9802-0000-b0f7-33a23307f4ed","chunk_id":"01a1998d-992a-7d93-a209-e74b09ee2fcb","file":"DAv1U-Mn.mjs","mappings":"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","names":["SEO_BY_LOCALE","sizePageSeoEntries","SITE_URL","SITE_NAME","DEFAULT_OG_IMAGE","seoByPath","RATED_COUNT_LABEL","PRO_MONTHLY_LABEL","PRO_MONTHLY_TOKENS","path","seo","FALLBACK_SEO","robotsNoindex","state","getSeo","pathname","override","locale","clean","base","local","canonical","origin","ORGANIZATION_SCHEMA","WEBSITE_SCHEMA","EXPLICIT_UGC_PATH","jsonLdScript","data","breadcrumbList","items","it","i"],"sources":["../../../../../../src/lib/i18n/seo-locales.ts","../../../../../../src/lib/seo.ts"],"sourcesContent":["import type { Locale } from './locales';\nimport { sizePageSeoEntries } from '$lib/tools/size-pages';\n\n/**\n * Titles and descriptions of the translated pages (RAT-579), per language.\n * Written for what people search in that language (Semrush, 2026-10-11) —\n * \"wahrheit oder pflicht online\", \"obbligo o verità online\" — rather than\n * translated from the English line; Hungarian from the HU database, 2026-10-12\n * (\"felelsz vagy mersz\" 4.4K a month, \"óvszer méret\" 1.6K, \"átlagos\n * péniszméret\" 880). Every path in LOCALIZED_PATHS needs an\n * entry in every language (i18n.test.ts).\n */\nexport type LocalSeo = { title: string; description: string };\n\nexport const SEO_BY_LOCALE: Partial<Record<Locale, Record<string, LocalSeo>>> = {\n\tde: {\n\t\t'/games': {\n\t\t\ttitle: 'Sexspiele online — Strip Poker & Wahrheit oder Pflicht | RateMyD',\n\t\t\tdescription:\n\t\t\t\t'Strip Poker, Porno-Quiz und versautes Wahrheit oder Pflicht – live mit echten Menschen, dazu Partyspiele für zu zweit oder die Gruppe. Kostenlos, ab 18.'\n\t\t},\n\t\t'/games/tod/generator': {\n\t\t\ttitle: 'Wahrheit oder Pflicht Generator — versaute Fragen ab 18 | RateMyD',\n\t\t\tdescription:\n\t\t\t\t'Zufällige versaute Wahrheit-oder-Pflicht-Fragen und Aufgaben ab 18: Wahrheit, Pflicht oder Zufall, spicy oder x-rated, mit Spielernamen reihum. Kostenlos.'\n\t\t},\n\t\t'/games/would-you-rather': {\n\t\t\ttitle: 'Würdest du eher Fragen — versaut, ab 18 | RateMyD',\n\t\t\tdescription:\n\t\t\t\t'100 versaute „Würdest du eher“-Fragen für Erwachsene, spicy oder x-rated, eine nach der anderen. Für Freunde oder ein Date. Kostenlos, ohne Anmeldung.'\n\t\t},\n\t\t'/games/never-have-i-ever': {\n\t\t\ttitle: 'Ich hab noch nie Fragen — versaut, ab 18 | RateMyD',\n\t\t\tdescription:\n\t\t\t\t'100 versaute „Ich hab noch nie“-Fragen für Erwachsene, spicy oder x-rated, eine nach der anderen. Zehn Finger hoch, wer zuletzt übrig ist, gewinnt.'\n\t\t},\n\t\t'/tools/penis-size-calculator': {\n\t\t\ttitle: 'Penisgröße Rechner — dein Perzentil & wie selten das ist | RateMyD',\n\t\t\tdescription:\n\t\t\t\t'Penisgröße berechnen: Länge und Umfang eingeben und dein Perzentil unter 15.521 gemessenen Männern sehen, wie selten das ist und deine Kondomgröße.'\n\t\t},\n\t\t'/tools/penis-size-visualizer': {\n\t\t\ttitle: 'Penis Vergleich maßstabsgetreu — Größe visualisieren | RateMyD',\n\t\t\tdescription:\n\t\t\t\t'Penisgröße im Vergleich: deine Länge und dein Umfang maßstabsgetreu neben dem Durchschnitt, einem Handy und einer Dose. Zu zweit vergleichen, Bild teilen.'\n\t\t},\n\t\t'/tools/penis-size-chart': {\n\t\t\ttitle: 'Penisgröße Tabelle: 8–25 cm mit Perzentil | RateMyD',\n\t\t\tdescription:\n\t\t\t\t'Jede erigierte Länge von 8 bis 25 cm: 15 cm, 18 cm und mehr mit Perzentil, Seltenheit und ob sie als groß gilt. Aus 15.521 gemessenen Männern.'\n\t\t},\n\t\t'/tools/condom-size-calculator': {\n\t\t\ttitle: 'Kondomgröße berechnen — Rechner & Größentabelle | RateMyD',\n\t\t\tdescription:\n\t\t\t\t'Kondomgröße berechnen aus deinem Umfang: die Nennbreite, die passt, und eine Tabelle mit Magnum, Durex, SKYN und MyONE mit Quellen. Kostenlos.'\n\t\t},\n\t\t'/games/tod': {\n\t\t\ttitle: 'Wahrheit oder Pflicht online — 18+ Fragen & Live-Tische | RateMyD',\n\t\t\tdescription:\n\t\t\t\t'Wahrheit oder Pflicht online mit echten Menschen: Die Flasche wählt, der Tisch stimmt ab. Mit versauten Beispielfragen. Kostenlos, ab 18.'\n\t\t},\n\t\t// RAT-610: the cm size pages, titled for the local search\n\t\t...sizePageSeoEntries('de')\n\t},\n\tes: {\n\t\t'/games': {\n\t\t\ttitle: 'Juegos eróticos online: strip poker y verdad o reto | RateMyD',\n\t\t\tdescription:\n\t\t\t\t'Strip poker, trivia porno y verdad o reto picante en vivo con gente real, más juegos para fiestas en pareja o en grupo. Gratis, +18.'\n\t\t},\n\t\t'/games/tod/generator': {\n\t\t\ttitle: 'Generador de verdad o reto — preguntas picantes +18 | RateMyD',\n\t\t\tdescription:\n\t\t\t\t'Preguntas y retos picantes de verdad o reto al azar, +18: verdad, reto o al azar, picante o X, con nombres que van rotando. Gratis y sin registro.'\n\t\t},\n\t\t'/games/would-you-rather': {\n\t\t\ttitle: 'Preguntas de ¿qué prefieres? picantes, +18 | RateMyD',\n\t\t\tdescription:\n\t\t\t\t'100 preguntas picantes de «¿qué prefieres?» para adultos, picante o X, una a la vez. Para jugar con amigos o en una cita. Gratis y sin registro.'\n\t\t},\n\t\t'/games/never-have-i-ever': {\n\t\t\ttitle: 'Preguntas de yo nunca picantes, +18 | RateMyD',\n\t\t\tdescription:\n\t\t\t\t'100 preguntas picantes de «yo nunca» para adultos, picante o X, una a la vez. Diez dedos arriba, gana el último con dedos levantados. Gratis.'\n\t\t},\n\t\t'/tools/penis-size-calculator': {\n\t\t\ttitle: 'Calculadora de tamaño de pene — tu percentil real | RateMyD',\n\t\t\tdescription:\n\t\t\t\t'Calculadora de pene: ingresa largo y grosor y mira tu percentil entre 15.521 hombres medidos, qué tan raro es y tu talla de condón. Gratis.'\n\t\t},\n\t\t'/tools/penis-size-visualizer': {\n\t\t\ttitle: 'Comparador de tamaño de pene a escala | RateMyD',\n\t\t\tdescription:\n\t\t\t\t'Comparación de tamaño de pene: tu largo y grosor a escala junto al promedio, un celular y una lata. Compara dos tamaños y comparte la imagen. Gratis.'\n\t\t},\n\t\t'/tools/penis-size-chart': {\n\t\t\ttitle: 'Tabla de tamaño de pene: de 8 a 25 cm | RateMyD',\n\t\t\tdescription:\n\t\t\t\t'Cada largo en erección de 8 a 25 cm: un pene de 15 cm, de 18 cm y más, con percentil, rareza y si se considera grande. De 15.521 hombres medidos.'\n\t\t},\n\t\t'/tools/condom-size-calculator': {\n\t\t\ttitle: 'Tallas de condones: calculadora y tabla por marca | RateMyD',\n\t\t\tdescription:\n\t\t\t\t'Calcula tu talla de condón según tu grosor: el ancho nominal que te queda y una tabla de Magnum, Durex, SKYN y MyONE con fuentes. Gratis.'\n\t\t},\n\t\t'/games/tod': {\n\t\t\ttitle: 'Verdad o reto online — Preguntas picantes 18+ | RateMyD',\n\t\t\tdescription:\n\t\t\t\t'Verdad o reto online con gente real: la botella elige, respondes la verdad o subes el reto y la mesa vota. Con ejemplos de preguntas picantes. 18+.'\n\t\t},\n\t\t// RAT-610: the cm size pages, titled for the local search\n\t\t...sizePageSeoEntries('es')\n\t},\n\tit: {\n\t\t'/games': {\n\t\t\ttitle: 'Giochi erotici online: strip poker e obbligo o verità | RateMyD',\n\t\t\tdescription:\n\t\t\t\t'Strip poker, quiz porno e obbligo o verità hot dal vivo con persone vere, più giochi per feste in coppia o in gruppo. Gratis, 18+.'\n\t\t},\n\t\t'/games/tod/generator': {\n\t\t\ttitle: 'Generatore di obbligo o verità — domande hot 18+ | RateMyD',\n\t\t\tdescription:\n\t\t\t\t'Domande e obblighi hot a caso per obbligo o verità, 18+: verità, obbligo o a caso, piccante o vietato ai minori, con i nomi a turno. Gratis.'\n\t\t},\n\t\t'/games/would-you-rather': {\n\t\t\ttitle: 'Domande preferiresti hot, per adulti 18+ | RateMyD',\n\t\t\tdescription:\n\t\t\t\t'100 domande hot di «preferiresti» per adulti, piccanti o vietate ai minori, una alla volta. Da giocare con gli amici o a un appuntamento. Gratis.'\n\t\t},\n\t\t'/games/never-have-i-ever': {\n\t\t\ttitle: 'Domande non ho mai hot, per adulti 18+ | RateMyD',\n\t\t\tdescription:\n\t\t\t\t'100 domande hot di «non ho mai» per adulti, piccanti o vietate ai minori, una alla volta. Dieci dita alzate, vince l’ultimo. Gratis.'\n\t\t},\n\t\t'/tools/penis-size-calculator': {\n\t\t\ttitle: 'Calcolatore dimensioni pene — il tuo percentile | RateMyD',\n\t\t\tdescription:\n\t\t\t\t'Calcola le dimensioni del pene: inserisci lunghezza e circonferenza e scopri il tuo percentile su 15.521 uomini misurati e la taglia di preservativo.'\n\t\t},\n\t\t'/tools/penis-size-visualizer': {\n\t\t\ttitle: 'Confronto pene in scala — visualizza le misure | RateMyD',\n\t\t\tdescription:\n\t\t\t\t'Confronta le dimensioni del pene: lunghezza e circonferenza in scala accanto alla media, a un telefono e a una lattina. Confronto a due e immagine.'\n\t\t},\n\t\t'/tools/penis-size-chart': {\n\t\t\ttitle: 'Tabella misure pene: da 8 a 25 cm | RateMyD',\n\t\t\tdescription:\n\t\t\t\t'Ogni lunghezza in erezione da 8 a 25 cm: pene di 15 cm, 18 cm e oltre, con percentile, rarità e se conta come grande. Da 15.521 uomini misurati.'\n\t\t},\n\t\t'/tools/condom-size-calculator': {\n\t\t\ttitle: 'Taglie preservativi: calcolatore e tabella misure | RateMyD',\n\t\t\tdescription:\n\t\t\t\t'Calcola la taglia del preservativo dalla circonferenza: la larghezza nominale giusta e le misure di Magnum, Durex, SKYN e MyONE con fonti. Gratis.'\n\t\t},\n\t\t'/games/tod': {\n\t\t\ttitle: 'Obbligo o verità online — Domande hot 18+ | RateMyD',\n\t\t\tdescription:\n\t\t\t\t'Obbligo o verità online con persone vere: la bottiglia sceglie, rispondi o fai l’obbligo e il tavolo vota. Con esempi di domande piccanti. 18+.'\n\t\t},\n\t\t// RAT-610: the cm size pages, titled for the local search\n\t\t...sizePageSeoEntries('it')\n\t},\n\tfr: {\n\t\t'/games': {\n\t\t\ttitle: 'Jeux coquins en ligne : strip poker et action ou vérité | RateMyD',\n\t\t\tdescription:\n\t\t\t\t'Strip poker, quiz porno et action ou vérité coquin en direct avec de vraies personnes, plus des jeux de soirée à deux ou en groupe. Gratuit, 18+.'\n\t\t},\n\t\t'/games/tod/generator': {\n\t\t\ttitle: 'Générateur action ou vérité — questions coquines 18+ | RateMyD',\n\t\t\tdescription:\n\t\t\t\t'Questions et actions coquines au hasard pour action ou vérité, 18+ : vérité, action ou hasard, épicé ou classé X, avec les prénoms à tour de rôle.'\n\t\t},\n\t\t'/games/would-you-rather': {\n\t\t\ttitle: 'Questions tu préfères coquines, 18+ | RateMyD',\n\t\t\tdescription:\n\t\t\t\t'100 questions « tu préfères » coquines pour adultes, épicées ou classées X, une à la fois. Entre potes ou en rencard. Gratuit, sans inscription.'\n\t\t},\n\t\t'/games/never-have-i-ever': {\n\t\t\ttitle: 'Questions je n’ai jamais coquines, 18+ | RateMyD',\n\t\t\tdescription:\n\t\t\t\t'100 questions « je n’ai jamais » coquines pour adultes, épicées ou classées X, une à la fois. Dix doigts levés, le dernier gagne. Gratuit.'\n\t\t},\n\t\t'/tools/penis-size-calculator': {\n\t\t\ttitle: 'Calculateur de taille de pénis — ton percentile | RateMyD',\n\t\t\tdescription:\n\t\t\t\t'Calcule ta taille de pénis : longueur et circonférence, ton percentile parmi 15 521 hommes mesurés, ta rareté et ta taille de préservatif. Gratuit.'\n\t\t},\n\t\t'/tools/penis-size-visualizer': {\n\t\t\ttitle: 'Comparateur de pénis à l’échelle — visualise ta taille | RateMyD',\n\t\t\tdescription:\n\t\t\t\t'Compare la taille de ton pénis : longueur et circonférence à l’échelle, à côté de la moyenne, d’un téléphone et d’une canette. À deux, image à partager.'\n\t\t},\n\t\t'/tools/penis-size-chart': {\n\t\t\ttitle: 'Tableau des tailles de pénis : de 8 à 25 cm | RateMyD',\n\t\t\tdescription:\n\t\t\t\t'Chaque longueur en érection de 8 à 25 cm : pénis de 15 cm, 18 cm et plus, avec percentile, rareté et s’il compte comme grand. 15 521 hommes mesurés.'\n\t\t},\n\t\t'/tools/condom-size-calculator': {\n\t\t\ttitle: 'Taille préservatif : calculateur et tableau des marques | RateMyD',\n\t\t\tdescription:\n\t\t\t\t'Trouve ta taille de préservatif selon ta circonférence : la largeur nominale qui te va et un tableau Magnum, Durex, SKYN et MyONE sourcé. Gratuit.'\n\t\t},\n\t\t'/games/tod': {\n\t\t\ttitle: 'Action ou vérité en ligne — Questions coquines 18+ | RateMyD',\n\t\t\tdescription:\n\t\t\t\t'Action ou vérité en ligne avec de vraies personnes : la bouteille choisit, tu réponds ou tu relèves l’action, la table vote. Avec des questions coquines. 18+.'\n\t\t},\n\t\t// RAT-610: the cm size pages, titled for the local search\n\t\t...sizePageSeoEntries('fr')\n\t},\n\tpt: {\n\t\t'/games': {\n\t\t\ttitle: 'Jogos eróticos online: strip poker e verdade ou desafio | RateMyD',\n\t\t\tdescription:\n\t\t\t\t'Strip poker, quiz pornô e verdade ou desafio picante ao vivo com pessoas reais, mais jogos de festa a dois ou em grupo. Grátis, +18.'\n\t\t},\n\t\t'/games/tod/generator': {\n\t\t\ttitle: 'Gerador de verdade ou desafio — perguntas picantes +18 | RateMyD',\n\t\t\tdescription:\n\t\t\t\t'Perguntas e desafios picantes aleatórios de verdade ou desafio, +18: verdade, desafio ou aleatório, picante ou pesado, com nomes na roda. Grátis.'\n\t\t},\n\t\t'/games/would-you-rather': {\n\t\t\ttitle: 'Perguntas de o que você prefere picantes, +18 | RateMyD',\n\t\t\tdescription:\n\t\t\t\t'100 perguntas picantes de “o que você prefere” para adultos, picantes ou pesadas, uma por vez. Pra jogar com amigos ou num encontro. Grátis.'\n\t\t},\n\t\t'/games/never-have-i-ever': {\n\t\t\ttitle: 'Perguntas de eu nunca picantes, +18 | RateMyD',\n\t\t\tdescription:\n\t\t\t\t'100 perguntas picantes de “eu nunca” para adultos, picantes ou pesadas, uma por vez. Dez dedos levantados, ganha o último. Grátis, sem cadastro.'\n\t\t},\n\t\t'/tools/penis-size-calculator': {\n\t\t\ttitle: 'Calculadora de tamanho do pênis — seu percentil | RateMyD',\n\t\t\tdescription:\n\t\t\t\t'Calculadora de pênis: digite comprimento e grossura e veja seu percentil entre 15.521 homens medidos, o quanto é raro e seu tamanho de camisinha.'\n\t\t},\n\t\t'/tools/penis-size-visualizer': {\n\t\t\ttitle: 'Comparador de tamanho de pênis em escala | RateMyD',\n\t\t\tdescription:\n\t\t\t\t'Comparação de tamanho do pênis: comprimento e grossura em escala ao lado da média, de um celular e de uma lata. Compare dois tamanhos e compartilhe.'\n\t\t},\n\t\t'/tools/penis-size-chart': {\n\t\t\ttitle: 'Tabela de tamanho do pênis: de 8 a 25 cm | RateMyD',\n\t\t\tdescription:\n\t\t\t\t'Cada comprimento ereto de 8 a 25 cm: pênis de 15 cm, 18 cm e mais, com percentil, raridade e se conta como grande. De 15.521 homens medidos.'\n\t\t},\n\t\t'/tools/condom-size-calculator': {\n\t\t\ttitle: 'Tamanho de camisinha: calculadora e tabela | RateMyD',\n\t\t\tdescription:\n\t\t\t\t'Descubra seu tamanho de camisinha pela grossura: a largura nominal que serve e uma tabela de Magnum, Durex, SKYN e MyONE com fontes. Grátis.'\n\t\t},\n\t\t'/games/tod': {\n\t\t\ttitle: 'Verdade ou desafio online — Perguntas picantes +18 | RateMyD',\n\t\t\tdescription:\n\t\t\t\t'Verdade ou desafio online com pessoas reais: a garrafa escolhe, você responde ou cumpre o desafio e a mesa vota. Com perguntas picantes de exemplo. +18.'\n\t\t},\n\t\t// RAT-610: the cm size pages, titled for the local search\n\t\t...sizePageSeoEntries('pt')\n\t},\n\thu: {\n\t\t'/games': {\n\t\t\ttitle: 'Szex játékok online — vetkőzős póker, felelsz vagy mersz | RateMyD',\n\t\t\tdescription:\n\t\t\t\t'Vetkőzős póker, pornókvíz és pikáns felelsz vagy mersz élőben, valódi emberekkel, plusz partijátékok kettesben vagy társaságban. Ingyenes, 18 éven felülieknek.'\n\t\t},\n\t\t'/games/tod/generator': {\n\t\t\ttitle: 'Felelsz vagy mersz kérdések 18+ — pikáns generátor | RateMyD',\n\t\t\tdescription:\n\t\t\t\t'Véletlen pikáns felelsz vagy mersz kérdések és feladatok 18 éven felülieknek: felelsz, mersz vagy véletlen, pikáns vagy durva, játékosnevekkel körbe. Ingyenes.'\n\t\t},\n\t\t'/games/would-you-rather': {\n\t\t\ttitle: 'Mit választanál? Pikáns kérdések, 18+ | RateMyD',\n\t\t\tdescription:\n\t\t\t\t'100 pikáns „mit választanál?” kérdés felnőtteknek, pikáns vagy durva fokozatban, egymás után. Barátokkal vagy randin. Ingyenes, regisztráció nélkül.'\n\t\t},\n\t\t'/games/never-have-i-ever': {\n\t\t\ttitle: 'Én még soha kérdések — pikáns, 18+ | RateMyD',\n\t\t\tdescription:\n\t\t\t\t'100 pikáns „én még soha” kérdés felnőtteknek, pikáns vagy durva fokozatban, egymás után. Tíz ujj a magasban: aki utoljára marad, nyer.'\n\t\t},\n\t\t'/tools/penis-size-calculator': {\n\t\t\ttitle: 'Péniszméret kalkulátor — átlagos péniszméret, percentilis | RateMyD',\n\t\t\tdescription:\n\t\t\t\t'Mekkora az átlagos péniszméret? Add meg a hosszt és a kerületet: megmutatjuk a percentilised 15 521 megmért férfi között, a ritkaságát és az óvszerméreted.'\n\t\t},\n\t\t'/tools/penis-size-visualizer': {\n\t\t\ttitle: 'Pénisz méret összehasonlítás — méretarányosan | RateMyD',\n\t\t\tdescription:\n\t\t\t\t'Pénisz méret összehasonlítás: a hosszad és a kerületed méretarányosan az átlag, egy telefon és egy üdítős doboz mellett. Kettesben is, a kép megosztható.'\n\t\t},\n\t\t'/tools/penis-size-chart': {\n\t\t\ttitle: 'Pénisz méret táblázat: 8–25 cm percentilissel | RateMyD',\n\t\t\tdescription:\n\t\t\t\t'Minden merevedett hossz 8 és 25 cm között: 15 cm, 18 cm és afelett percentilissel, ritkasággal, és hogy nagynak számít-e. 15 521 megmért férfi alapján.'\n\t\t},\n\t\t'/tools/condom-size-calculator': {\n\t\t\ttitle: 'Óvszer méret kalkulátor és óvszer méretek táblázat | RateMyD',\n\t\t\tdescription:\n\t\t\t\t'Óvszer méret a kerületedből: a névleges szélesség, ami passzol, és egy táblázat Magnum, Durex, SKYN és MyONE méretekkel, forrásokkal. Ingyenes.'\n\t\t},\n\t\t'/games/tod': {\n\t\t\ttitle: 'Felelsz vagy mersz online — 18+ kérdések, élő asztalok | RateMyD',\n\t\t\tdescription:\n\t\t\t\t'Felelsz vagy mersz online, valódi emberekkel: az üveg dönt, az asztal szavaz. Pikáns példakérdésekkel. Ingyenes, 18 éven felülieknek.'\n\t\t},\n\t\t// RAT-610: the cm size pages, titled for the local search\n\t\t...sizePageSeoEntries('hu')\n\t}\n};\n","import { PRO_MONTHLY_LABEL } from '$lib/pricing';\nimport { PRO_MONTHLY_TOKENS } from '$lib/pro-plan';\nimport { RATED_COUNT_LABEL } from '$lib/proof';\nimport type { Locale } from '$lib/i18n/locales';\nimport { SEO_BY_LOCALE } from '$lib/i18n/seo-locales';\nimport { sizePageSeoEntries } from '$lib/tools/size-pages';\n\nexport const SITE_URL = 'https://www.ratemyd.app';\nexport const SITE_NAME = 'ratemyd.';\nexport const DEFAULT_OG_IMAGE = '/og-image.png';\n\n/** A profile is indexed, and listed in the sitemap, when it has a bio, a photo\n *  and either an active rater storefront or at least this many completed\n *  ratings (u/[nickname]/+page.server.ts, lib/server/sitemap.ts). */\nexport const PROFILE_INDEX_MIN_RATES = 3;\n\nexport interface SeoMeta {\n\ttitle: string;\n\t/** Empty renders no description tag, which leaves the snippet to the search\n\t *  engine rather than repeating another page's text. */\n\tdescription: string;\n\t/** Link-preview copy when it should differ from the search title/description\n\t *  (a duel invite reads differently from the duel's search result). */\n\togTitle?: string;\n\togDescription?: string;\n\togImage?: string;\n\t/** Intrinsic og:image dimensions. Default 1200×630 (the static OG assets).\n\t *  Set per-page when the share image is a different size (e.g. 1080×1350\n\t *  duel/beat share cards, or a post's own media) so scrapers don't reject\n\t *  the preview on a declared-vs-actual mismatch. */\n\togImageWidth?: number;\n\togImageHeight?: number;\n\togType?: 'website' | 'article';\n\tnoindex?: boolean;\n}\n\n/**\n * Pages with their meta keyed by path. Titles carry the phrase people search\n * for, uncensored: \"d*ck\" in a title matched nobody's query, and every page\n * ranking for \"rate my dick\" or \"dick rating\" says it in the title.\n */\nexport const seoByPath: Record<string, SeoMeta> = {\n\t'/': {\n\t\t// \"Rate my cock\" is searched twice as often as \"rate my dick\" and sat at 9\n\t\t// on this page while \"rate my dick\" was 2–5 (RAT-591): the title names both.\n\t\ttitle: 'Rate My Dick or Cock — Free AI Rating in 10 Seconds | RateMyD',\n\t\t// Names the synonyms people search with (cock, penis) and what a searcher\n\t\t// weighs before clicking: free, instant, anonymous, 18+.\n\t\tdescription: `Rate my dick, cock or penis: one pic, an honest 0–10 AI rating in 10 seconds. ${RATED_COUNT_LABEL} rated. First one free, anonymous, photo deleted. 18+.`,\n\t\togImage: '/og-image.png'\n\t},\n\t'/pricing': {\n\t\ttitle: 'Pricing — RateMyD Pro & Token Packs',\n\t\tdescription: `Go Pro for ${PRO_MONTHLY_LABEL}/month: unlimited AI roleplay and duels, ${PRO_MONTHLY_TOKENS} tokens a month, every rating unblurred, unlimited swipes. Or top up tokens for tips, unlocks and boosts.`,\n\t\togImage: '/og/pricing.png'\n\t},\n\t'/a': {\n\t\ttitle: 'The Arena — Vote on AI-Rated Submissions | RateMyD',\n\t\tdescription:\n\t\t\t'Swipe, vote, and rank AI-rated submissions in the Arena. Battle it out, climb the weekly leaderboard. 50 free swipes per day, no signup needed.',\n\t\togImage: '/og/arena.png'\n\t},\n\t'/l': {\n\t\t// The board ranks XP from duels and beat me, not AI scores; the title says so.\n\t\ttitle: 'Leaderboard — Top Players by XP in Duels & Beat Me | RateMyD',\n\t\tdescription:\n\t\t\t\"Who's grinding hardest on RateMyD: the XP leaderboard for duels and beat me, ranked today, this week, this month and all-time.\",\n\t\togImage: '/og/leaderboard.png'\n\t},\n\t'/r': {\n\t\ttitle: 'Dick Rating by Real Raters — Honest, SPH or Praise | RateMyD',\n\t\t// RAT-594: \"sph chat\" and \"live dick rating\" are what this page sells\n\t\tdescription:\n\t\t\t'Dick rating by real people: honest, SPH or praise. A private 1:1 chat, SPH chat included, or live dick rating in a group. Pick a rater, check the price, send one pic.'\n\t},\n\t'/rate': {\n\t\t// The upload page is the tool itself, so it carries the tool's name: \"AI\n\t\t// dick rater\" and its variants sat on page 2 while the homepage ranked for\n\t\t// \"rate my dick\" (RAT-552). \"Dick pic rating\" stays in.\n\t\ttitle: 'AI Dick Rater — Dick Pic Rating in 10 Seconds | RateMyD',\n\t\tdescription:\n\t\t\t'AI dick rater and penis analyzer: upload one dick pic for an honest 0–10 score across 6 dimensions, from proportions to lighting, in 10 seconds. First one free. 18+.'\n\t},\n\t// Epic R: an AI rater per subject, each titled for its own searches (Semrush\n\t// US, 2026-11-01): rate my boobs 6.6K, rate my tits 6.6K, rate my rack 1.6K;\n\t// rate my ass 1.3K, rate my butt 210; rate my nudes 720, rate my body 590.\n\t'/rate-my-boobs': {\n\t\ttitle: 'Rate My Boobs or Tits — Free AI Boob Rater | RateMyD',\n\t\tdescription:\n\t\t\t'Rate my boobs, tits or rack: one pic, an honest 0–10 AI score for shape, proportions and nipples in 10 seconds. First one free, anonymous, photo deleted. 18+.',\n\t\togImage: '/og/rate-my-boobs.png'\n\t},\n\t'/rate-my-ass': {\n\t\ttitle: 'Rate My Ass — Free AI Butt & Booty Rater | RateMyD',\n\t\tdescription:\n\t\t\t'Rate my ass, butt or booty: one pic, an honest 0–10 AI score for shape, tone and pose in 10 seconds. Guys and girls. First one free, photo deleted. 18+.',\n\t\togImage: '/og/rate-my-ass.png'\n\t},\n\t'/rate-my-nudes': {\n\t\ttitle: 'Rate My Nudes & Body Pics — Free AI Nude Rater | RateMyD',\n\t\tdescription:\n\t\t\t'Rate my nudes before you send them: an honest 0–10 AI score for body, pose and lighting in 10 seconds. Any body, any gender. First one free, photo deleted. 18+.',\n\t\togImage: '/og/rate-my-nudes.png'\n\t},\n\t'/d': {\n\t\t// RAT-577: \"dick size comparison\" is a visualizer search; this page is the duel\n\t\ttitle: 'AI Dick Duels — 1v1, the AI Picks the Winner | RateMyD',\n\t\tdescription:\n\t\t\t'Challenge anyone to a 1v1 dick duel. The AI scores both pics across 6 dimensions and names the winner. Two enter, one wins.'\n\t},\n\t'/b': {\n\t\ttitle: \"Who's Bigger? Public Dick Duels Voted by Everyone | RateMyD\",\n\t\tdescription:\n\t\t\t'Anonymous dick size comparison: post your pic against a challenger and let the crowd vote for 24 hours. One vote per device, one winner.'\n\t},\n\t'/sph': {\n\t\t// RAT-595, RAT-613: \"sph\" 18.1K a month, \"small penis humiliation\" 4.4K,\n\t\t// \"humiliation kink\" 2.4K, \"sph kink\" 1.6K; page one is explainers, so\n\t\t// this page explains, then hands each format to its page under /sph.\n\t\ttitle: 'SPH Kink: Small Penis Humiliation Explained | RateMyD',\n\t\tdescription:\n\t\t\t'What SPH means in slang, why people are into it and how to keep it safe, plus SPH ratings from 100+ verified raters, SPH captions, JOI and clips. 18+.'\n\t},\n\t'/dick-rating-sites': {\n\t\t// RAT-596: \"dick rating site / website / sites\" sat at 5–8 on the homepage;\n\t\t// the searcher wants the sites side by side, so this page lists them.\n\t\ttitle: 'Dick Rating Sites Compared — AI, Real Raters, Free | RateMyD',\n\t\tdescription:\n\t\t\t'Nine dick rating sites side by side: who rates (AI, women, the crowd), what it costs, whether you need an account and what happens to your photo. Checked Oct 2026.'\n\t},\n\t'/apply': {\n\t\ttitle: 'Get Paid to Rate Dicks — Become a Rater | RateMyD',\n\t\tdescription:\n\t\t\t'Rate dicks for tokens on RateMyD: set your own price, rate in private chat or live, keep your tips. What active raters charge today, and how to start.'\n\t},\n\t'/n': {\n\t\ttitle: 'Niches — Cock Compare, Uncut, SPH & More | RateMyD',\n\t\tdescription:\n\t\t\t'Every RateMyD niche in one place: cock compare, uncut, SPH, curved cocks, bulges and more. Communities where members post, compare and rate each other. 18+.'\n\t},\n\t'/k': {\n\t\ttitle: 'Clans — Join a Crew | RateMyD',\n\t\tdescription:\n\t\t\t'Clans on RateMyD: join a crew, earn XP together and take on other clans in AI-judged clan wars.'\n\t},\n\t'/roleplay': {\n\t\ttitle: 'AI Roleplay — Private NSFW Chats with AI Characters | RateMyD',\n\t\tdescription: 'Private roleplay with an AI character. Pick who you want to talk to and start.',\n\t\t// The listing shows the taglines of characters still waiting for review,\n\t\t// whose own pages are noindex until approved (RAT-496). It brought 16\n\t\t// search visits in 30 days; index it again once the listing only shows\n\t\t// reviewed characters.\n\t\tnoindex: true\n\t},\n\t'/albums': {\n\t\t// RAT-602: \"buy nudes\" and \"nudes for sale\" are the buying searches; the\n\t\t// picture searches go to the hubs under /albums/.\n\t\ttitle: 'Buy Nudes — Dick Pics & Nude Albums from Real Creators | RateMyD',\n\t\tdescription:\n\t\t\t'Nudes for sale from real creators: photo and video albums with free previews and one price per album. Dick pics, uncut, hairy, big and more. 18+.'\n\t},\n\t'/sell-nudes': {\n\t\t// RAT-604: sell nudes 1.3K (KD 18), onlyfans alternative(s) ~2K, male\n\t\t// onlyfans 720, where to sell nudes 390 (Semrush US, 2026-10-16)\n\t\ttitle: 'Sell Nudes Online — Get Paid for Every Album Sale | RateMyD',\n\t\tdescription:\n\t\t\t'Sell your nudes and dick pics as photo and video albums: set your price, pick free previews, get paid for every unlock and cash out by bank transfer. 18+.'\n\t},\n\t// The lobby is the app; /games/tod is the page that answers the search\n\t// (RAT-566). Two indexable pages for one query split it, and this one\n\t// never earned an impression.\n\t'/tod': {\n\t\ttitle: 'Truth or Dare — Live Tables | RateMyD',\n\t\tdescription:\n\t\t\t'Truth or dare with other RateMyD users: join a live public table or start your own.',\n\t\tnoindex: true\n\t},\n\t// RAT-564: the games had no meta of their own, so FALLBACK_SEO kept all four\n\t// out of the index. The descriptions stay static: a live count read\n\t// \"0 playing now\" in the snippet whenever the crawler came by at night.\n\t'/games': {\n\t\ttitle: 'Adult Games Online — Strip Poker, Porn Trivia, Truth or Dare | RateMyD',\n\t\tdescription:\n\t\t\t'Free 18+ games with real people: strip poker, a porn trivia map battle and dirty truth or dare at live tables. Pick one and play in your browser.'\n\t},\n\t'/games/poker': {\n\t\ttitle: 'Strip Poker Online — Live, With Real People | RateMyD',\n\t\tdescription:\n\t\t\t\"Strip poker online with real people: Texas Hold'em for 2–6 players where the hand's biggest loser takes a layer off. Free chips, moderated photos. 18+.\"\n\t},\n\t'/games/conquest': {\n\t\ttitle: 'Porn Trivia Game — Conquest: Filthy Trivia Map Battle | RateMyD',\n\t\tdescription:\n\t\t\t'A porn trivia game you play live: beat a rival to filthy questions on porn history, lingo, kink and sex, and take their land. 1v1 or 3 players. 18+.'\n\t},\n\t'/games/would-you-rather': {\n\t\ttitle: 'Dirty Would You Rather Questions — 18+ Generator | RateMyD',\n\t\tdescription:\n\t\t\t'100 dirty would you rather questions for adults, spicy or x-rated, one at a time. Play with friends or a date, then take it to a live truth or dare table.'\n\t},\n\t'/games/never-have-i-ever': {\n\t\ttitle: 'Dirty Never Have I Ever Questions — 18+ Generator | RateMyD',\n\t\tdescription:\n\t\t\t'100 dirty never have I ever questions for adults, spicy or x-rated, one at a time. Ten fingers up, last one standing wins. Free, no signup.'\n\t},\n\t'/games/tod/generator': {\n\t\ttitle: 'Truth or Dare Generator — Dirty Questions & Dares 18+ | RateMyD',\n\t\tdescription:\n\t\t\t'Random dirty truth or dare questions and dares, 18+. Pick truth, dare or random, spicy or x-rated, add players and pass it round. Free, no signup.'\n\t},\n\t'/games/tod': {\n\t\ttitle: 'Dirty Truth or Dare Online — 18+ Live Tables | RateMyD',\n\t\tdescription:\n\t\t\t'Dirty truth or dare online with real people: the bottle picks who is up, you type the truth or upload the dare, and the table votes. 3–8 players. 18+.'\n\t},\n\t'/contest': {\n\t\ttitle: \"Weekly Contest — Vote for This Week's Winner | RateMyD\",\n\t\tdescription:\n\t\t\t\"RateMyD's weekly contest: rater of the week or most beautiful. One vote per member; real activity decides the rest.\"\n\t},\n\t'/changelog': {\n\t\ttitle: \"Changelog — What's New on RateMyD\",\n\t\tdescription: \"What's new on RateMyD: features, fixes and changes, newest first.\"\n\t},\n\t'/partners': {\n\t\ttitle: 'Work With Us — Partnerships & Jobs | RateMyD',\n\t\tdescription:\n\t\t\t\"Partner with RateMyD: $50 for every business deal you bring in that closes. Plus we're hiring a social media / community manager (NSFW experience required).\"\n\t},\n\t'/feedback': {\n\t\ttitle: 'Roadmap — Vote on Features | RateMyD',\n\t\tdescription: 'Vote on features, report bugs, share ideas. Shape what gets built next.'\n\t},\n\t'/tokens': {\n\t\ttitle: 'Tokens — How They Work | RateMyD',\n\t\tdescription:\n\t\t\t'Tokens are the currency of RateMyD. Buy them or earn them by selling albums, roleplay scenarios and going live, then spend them on ratings, unlocks and more.'\n\t},\n\t'/privacy': {\n\t\ttitle: 'Privacy Policy — RateMyD AI Rating Service',\n\t\tdescription:\n\t\t\t'How RateMyD protects your privacy. Photos deleted instantly after AI analysis. No storage, no training data, zero data selling. Read the full policy.',\n\t\togImage: '/og-image.png'\n\t},\n\t'/terms': {\n\t\ttitle: 'Terms of Service — RateMyD AI Dick Rating',\n\t\tdescription:\n\t\t\t'Terms of service for RateMyD. Usage rules, content policy, subscription terms, refund policy, and your rights. Please read before using the service.',\n\t\togImage: '/og-image.png'\n\t},\n\t'/affiliate': {\n\t\ttitle: 'Affiliate Program — Earn 30% Recurring | RateMyD',\n\t\tdescription:\n\t\t\t\"Earn 30% recurring revenue promoting the world's most unhinged AI rating tool. Free to join, monthly payouts via Stripe. Apply to the RateMyD affiliate program.\",\n\t\togImage: '/og-image.png'\n\t},\n\t'/install': {\n\t\ttitle: 'Install the App — RateMyD on Your Home Screen',\n\t\tdescription:\n\t\t\t'Add RateMyD to your home screen — full-screen, one tap, no app store. Works on iPhone (Safari), Android, and desktop Chrome. Here’s how.',\n\t\togImage: '/og-image.png'\n\t},\n\t'/about': {\n\t\ttitle: 'About RateMyD — How the AI Rating & Size Stats Work',\n\t\tdescription:\n\t\t\t'What RateMyD is, how the 6-dimension AI photo rating works, the peer-reviewed data behind our size statistics, and our privacy stance. Photos deleted instantly.',\n\t\togImage: '/og-image.png'\n\t},\n\t'/tools/condom-size-calculator': {\n\t\ttitle: 'Condom Size Calculator & Chart: Magnum, Trojan, Durex | RateMyD',\n\t\tdescription:\n\t\t\t'Find your condom size from your girth: the nominal width that fits, plus a size chart for Magnum, Trojan, Durex, SKYN and MyONE with sources. Free, nothing stored.',\n\t\togImage: '/og-image.png'\n\t},\n\t'/tools/penis-size-chart': {\n\t\ttitle: 'Penis Size Chart: Inches & cm, Percentile & Rarity | RateMyD',\n\t\tdescription:\n\t\t\t'Every erect length from 3 to 10 inches (8–25 cm): the percentile, how rare it is and whether it counts as big, from 15,521 men measured by clinicians.',\n\t\togImage: '/og-image.png'\n\t},\n\t'/tools/penis-size-visualizer': {\n\t\t// RAT-597: \"penis comparison\" and \"cock comparison\" (1.9K a month each) are\n\t\t// this page's searches as much as \"penis size visualizer\" is.\n\t\ttitle: 'Penis Size Visualizer — Penis & Cock Size Comparison | RateMyD',\n\t\tdescription:\n\t\t\t'Penis and cock size comparison to scale: you next to the average, a phone or a soda can, or two sizes side by side. Erect or flaccid. Free, nothing stored.',\n\t\togImage: '/og-image.png'\n\t},\n\t'/tools/penis-size-calculator': {\n\t\ttitle: 'Penis Size Calculator: Your Percentile vs 15,521 Men | RateMyD',\n\t\t// RAT-598: the description carries the page's own search, as the\n\t\t// localized ones already do (\"Penisgröße berechnen: …\").\n\t\tdescription:\n\t\t\t'Penis size calculator: enter length or girth in inches or cm to see your percentile from the Veale 2015 study of 15,521 men. Free, instant, nothing stored.',\n\t\togImage: '/og-image.png'\n\t},\n\t// RAT-609, RAT-610: one page per erect length, titled for \"7 inch penis\",\n\t// \"18 cm penis\"; the numbers in each come from the size chart's row\n\t...Object.fromEntries(\n\t\tObject.entries(sizePageSeoEntries('en')).map(([path, seo]) => [\n\t\t\tpath,\n\t\t\t{ ...seo, ogImage: '/og-image.png' }\n\t\t])\n\t)\n};\n\n/**\n * A member's profile title. Bing flagged 152 profiles as \"title too short\":\n * \"@Dean — RateMyD\" says nothing about the page (RAT-578). The title names\n * what is on it, and stays 30+ characters for a one-letter nickname.\n */\nexport function profileSeoTitle(nickname: string, isRater: boolean, sellsAlbums = false): string {\n\t// RAT-603: a creator is searched by name for their albums.\n\tif (sellsAlbums)\n\t\treturn isRater\n\t\t\t? `${nickname} — Dick Rater & Photo Albums | RateMyD`\n\t\t\t: `${nickname} — Photo & Video Albums | RateMyD`;\n\treturn isRater\n\t\t? `${nickname} — Dick Rater: Ratings, Reviews & Prices | RateMyD`\n\t\t: `${nickname} — Profile, Ratings & Posts | RateMyD`;\n}\n\nexport function profileSeoDescription(nickname: string, isRater: boolean, albums = 0): string {\n\tif (albums > 0)\n\t\treturn `${nickname}'s photo and video albums on RateMyD: ${albums} ${albums === 1 ? 'set' : 'sets'} with free previews and one price per album${isRater ? ', plus dick ratings in private chat' : ''}. 18+.`;\n\treturn isRater\n\t\t? `${nickname} rates dicks on RateMyD: honest, SPH or praise ratings in private chat. See reviews, prices and recent ratings. 18+.`\n\t\t: `${nickname} on RateMyD: AI dick ratings, duels, posts and badges. 18+.`;\n}\n\n/**\n * What a route with no SEO data of its own gets. It used to be the homepage's\n * title and description, which ~290 app pages then repeated in search results.\n * Now it is a bare site title that the page's own <title> overrides, no\n * description, and noindex: a route has to declare its meta to be indexed.\n */\nexport const FALLBACK_SEO: SeoMeta = { title: SITE_NAME, description: '', noindex: true };\n\n/**\n * Whether the page carries `<meta name=\"robots\" content=\"noindex\">`.\n *\n * Google skips rendering a page whose server HTML already says noindex, and\n * obeys a noindex the browser adds to one it renders. So the server's answer is\n * the one that counts: a 5xx only the browser hit (the root error page shown\n * over a URL the server served) has no seo of its own, and FALLBACK_SEO's\n * noindex must not land on a page the server called indexable (RAT-551).\n */\nexport function robotsNoindex(\n\tseo: SeoMeta,\n\tstate: { browser: boolean; error: boolean; status: number }\n): boolean {\n\tif (state.browser && state.error && state.status >= 500) return false;\n\treturn !!seo.noindex;\n}\n\nexport function getSeo(\n\tpathname: string,\n\toverride?: Partial<SeoMeta> | null,\n\tlocale: Locale = 'en'\n): SeoMeta {\n\tif (override?.title) {\n\t\treturn {\n\t\t\togImage: DEFAULT_OG_IMAGE,\n\t\t\t...override,\n\t\t\tdescription: override.description ?? ''\n\t\t} as SeoMeta;\n\t}\n\tconst clean = pathname.replace(/\\/$/, '') || '/';\n\tconst base = seoByPath[clean] ?? FALLBACK_SEO;\n\t// RAT-573: a translated page's title and description are written for the\n\t// searches in that language, not translated word for word.\n\tconst local = locale === 'en' ? undefined : SEO_BY_LOCALE[locale]?.[clean];\n\treturn local ? { ...base, ...local } : base;\n}\n\n/** `origin` is the site the page belongs to — ratemyd, or the studio's own\n *  domain for pages served there. */\nexport function canonical(pathname: string, origin: string = SITE_URL): string {\n\tconst clean = pathname.replace(/\\/$/, '') || '/';\n\treturn clean === '/' ? origin : `${origin}${clean}`;\n}\n\nexport const ORGANIZATION_SCHEMA = {\n\t'@context': 'https://schema.org',\n\t'@type': 'Organization',\n\t// Canonical entity name = 'RateMyD' (no trailing period). The stylised\n\t// 'ratemyd.' stays the display brand (og:site_name / SITE_NAME), but a\n\t// trailing period is an entity-matching liability for the Knowledge Graph,\n\t// so the schema declares the clean name + the stylised forms as alternateName.\n\tname: 'RateMyD',\n\talternateName: ['ratemyd.', 'ratemyd'],\n\turl: SITE_URL,\n\tlogo: `${SITE_URL}/favicon-512x512.png`,\n\tdescription:\n\t\t'AI dick rating app: honest 0–10 scores across 6 dimensions, plus real human raters.',\n\tsameAs: ['https://www.reddit.com/r/AIDickRating']\n};\n\n/** Google takes the site name shown in results from this; it matches the\n *  Organization name and the \"| RateMyD\" title suffix, with the stylised forms\n *  as alternates. */\nexport const WEBSITE_SCHEMA = {\n\t'@context': 'https://schema.org',\n\t'@type': 'WebSite',\n\tname: 'RateMyD',\n\talternateName: ['ratemyd', SITE_NAME],\n\turl: SITE_URL\n};\n\n/**\n * Pages that show members' explicit photos: feeds, posts, niches, profiles,\n * battles, albums, and the SPH format pages that list them (/sph/…, RAT-617;\n * /sph itself is an explainer and stays unlabelled). They carry Google's\n * SafeSearch label; the product pages (/, /rate, /r, /apply) and the SFW\n * stats and tools cluster do not, so a label never decides what those rank for.\n * Epic R: /rate-my-boobs and /rate-my-ass carry their beat lobby's photos, so\n * they're labelled; /rate-my-nudes shows none.\n */\nexport const EXPLICIT_UGC_PATH =\n\t/^\\/(f|a|b|n|u|post|albums?|c|roleplay|tod|contest|floor|livecam|rc|match)(\\/|$)|^\\/(d|k\\/war|sph)\\/|^\\/rate-my-(boobs|ass)$/;\n\n/** Wrap a JSON-LD object in a script tag. The split `sc${''}ript` keeps the\n *  Svelte compiler from seeing a literal closing tag inside the markup, and\n *  `<` goes out as < so text a member wrote (a profile bio) can't close\n *  the tag and run as markup. */\nexport function jsonLdScript(data: unknown): string {\n\tconst json = JSON.stringify(data).replace(/</g, '\\\\u003c');\n\treturn `<sc${''}ript type=\"application/ld+json\">${json}</sc${''}ript>`;\n}\n\n/** schema.org BreadcrumbList from an ordered list of {name, url}. Breadcrumb is\n *  one of the few structured-data types that still renders in the SERP (2026). */\nexport function breadcrumbList(items: { name: string; url: string }[]) {\n\treturn {\n\t\t'@context': 'https://schema.org',\n\t\t'@type': 'BreadcrumbList',\n\t\titemListElement: items.map((it, i) => ({\n\t\t\t'@type': 'ListItem',\n\t\t\tposition: i + 1,\n\t\t\tname: it.name,\n\t\t\titem: it.url\n\t\t}))\n\t};\n}\n"],"version":3}