(function () {
// 1) Basic bot filter (extend if you like)
function isBot() {
return /(bot|crawl|spider|google|bing|slurp|yandex|facebook|linkedin|pinterest|preview|whatsapp|discord|telegram|headless|puppeteer)/i
.test(navigator.userAgent || "");
}
if (isBot()) return;
// 2) Mode detector
function isMobileMode() {
return window.matchMedia("(max-width: 767px)").matches ||
/Mobi|Android|iPhone|iPad|iPod/i.test(navigator.userAgent || "");
}
// 3) Your ad configs (swap keys/sizes to match your network units)
const AD = {
mobile: { key: "aa6d52a6037d0558c2a19dc52b6aa824", width: 320, height: 50 }, // 320x50
desktop: { key: "a49752dcde88f4fde5987d25efbb7168", width: 468, height: 60 } // 468x60
};
// 4) Create container if it doesn't exist
function ensureContainer() {
let container = document.getElementById("ad-container");
if (!container) {
container = document.createElement("div");
container.id = "ad-container";
container.style.display = "none";
document.body.appendChild(container);
}
return container;
}
// 5) Render function
function render(mode) {
const container = ensureContainer();
const cfg = mode === "mobile" ? AD.mobile : AD.desktop;
// Set global atOptions for ad network
window.atOptions = {
key: cfg.key,
format: "iframe",
height: cfg.height,
width: cfg.width,
params: {}
};
// Clear previous ad/script then inject
container.innerHTML = "";
container.style.display = "block";
const s = document.createElement("script");
s.src = `//selfportraitproved.com/${cfg.key}/invoke.js`;
s.async = true;
container.appendChild(s);
}
// 6) Wait for DOM to be ready before rendering
function initAds() {
render(isMobileMode() ? "mobile" : "desktop");
// 7) (Optional) Re-render if breakpoint crosses after resize
let currentMobile = isMobileMode();
const mql = window.matchMedia("(max-width: 767px)");
if (mql.addEventListener) {
mql.addEventListener("change", (e) => {
const nowMobile = e.matches;
if (nowMobile !== currentMobile) {
currentMobile = nowMobile;
render(currentMobile ? "mobile" : "desktop");
}
});
} else if (mql.addListener) { // older browsers
mql.addListener((e) => {
const nowMobile = e.matches;
if (nowMobile !== currentMobile) {
currentMobile = nowMobile;
render(currentMobile ? "mobile" : "desktop");
}
});
}
}
// 8) Execute when DOM is ready
if (document.readyState === "loading") {
document.addEventListener("DOMContentLoaded", initAds);
} else {
initAds();
}
})();
All the best fantasy stories begin with an ominous prologue, and the Arthurian legends are no exception. Basically, according to Hero of Camelot, this whole shebang begins when the mighty king Uther Pendragon is busy doing a great job ruling over his subjects, but having problems with the whole "heir" thing. Adoption wasn't an option, apparently. Because soap opera triangles were just as popular in the Dark Ages as they are now, Uther's situation is further complicated by the fact that he has the hots for a woman named Ygraine ... who is, unfortunately, the Duke of Tintagel's wife. Off limits, dude. Anyhow, King Pendragon decides to vent these adolescent frustrations to his trusted adviser, a dusty old fella named Merlin.
Now, if Merlin were a good friend, he would've offered to be Uther's wingman on a tour through Camelot's local dive bars. Instead, the wizard casts a spell that transforms Uther into the duke for a night, thereby allowing him to secretly sleep with Ygraine — without telling her, mind you — and conceive a son. Uh, sketchy ethics? No kidding. Some versions of the story try to clean up the overall griminess a bit by having Ygraine secretly in love with Uther, as well, but the whole situation is rather icky.
Following Arthur's birth, according to PBS, Merlin whisks the cursed (or prophesied?) baby away, to have him raised as a peasant.