self.AMP_CONFIG = { "v": "012309181453000", "type": "production", "allow-doc-opt-in": ["amp-next-page"], "allow-url-opt-in": [], "canary": 0, "a4aProfilingRate": 0.01, "doubleclickSraExp": 0.01, "doubleclickSraReportExcludedBlock": 0.1, "flexAdSlots": 0.05, "flexible-bitrate": 0.1, "ios-fixed-no-transfer": 0, "story-ad-placements": 0.01, "story-disable-animations-first-page": 1, "story-load-inactive-outside-viewport": 1, "amp-sticky-ad-to-amp-ad-v4": 0, "story-video-cache-apply-audio": 0, "amp-story-subscriptions": 1, "esm": 1 };/*AMP_CONFIG*/self.AMP_EXP = { "flexible-bitrate": 0.1, "amp-story-first-page-max-bitrate": 0.3, "story-disable-animations-first-page": 1, "story-load-first-page-only": 1, "story-load-inactive-outside-viewport": 1, "story-ad-page-outlink": 0.02, "amp-geo-ssr": 1, "story-remote-localization": 1, "amp-story-subscriptions": 1, "attribution-reporting": 0.04 };/*AMP_EXP*/; self, self.AMP = self.AMP || []; try { AMP._ = AMP._ || {}, self.AMP && !Array.isArray(self.AMP) || (() => { var t, i = class { constructor() { this.bt = new s } abort() { if (!this.bt.jt && (this.bt.jt = !0, this.bt.xt)) { const t = { "type": "abort", "bubbles": !1, "cancelable": !1, "target": this.bt, "currentTarget": this.bt }; this.bt.xt(t) } } get signal() { return this.bt } }, s = class { constructor() { this.jt = !1, this.xt = null } get aborted() { return this.jt } get onabort() { return this.xt } set onabort(t) { this.xt = t } }; function e() { return t || (t = Promise.resolve(void 0)) } var n = class { constructor() { this.promise = new Promise(((t, i) => { this.resolve = t, this.reject = i })) } }; function r(t) { return new Promise((i => { i(t()) })) } function h(t) { const i = Object.getOwnPropertyDescriptor(t, "message"); if (null != i && i.writable) return t; const { message: s, stack: e } = t, n = new Error(s); for (const i in t) n[i] = t[i]; return n.stack = e, n } function o(t) { let i = null, s = ""; for (const t of arguments) t instanceof Error && !i ? i = h(t) : (s && (s += " "), s += t); return i ? s && (i.message = s + ": " + i.message) : i = new Error(s), i } function u(t) { var i, s; null === (i = (s = self).__AMP_REPORT_ERROR) || void 0 === i || i.call(s, t) } function l(t) { const i = o.apply(null, arguments); setTimeout((() => { throw u(i), i })) } function c(t) { const i = o.apply(null, arguments); return i.expected = !0, i } var { hasOwnProperty: a, toString: d } = Object.prototype; function f(t) { return "[object Object]" === d.call(t) } function p(t) { const i = Object.create(null); return t && Object.assign(i, t), i } function m(t, i) { return a.call(t, i) } function _(t) { const i = p(); for (const s in t) { if (!m(t, s)) continue; const e = t[s]; i[s] = f(e) ? _(e) : e } return i } function A(t, i, s) { return i in t ? Object.defineProperty(t, i, { value: s, enumerable: !0, configurable: !0, writable: !0 }) : t[i] = s, t } function P(t, i) { var s = Object.keys(t); if (Object.getOwnPropertySymbols) { var e = Object.getOwnPropertySymbols(t); i && (e = e.filter((function (i) { return Object.getOwnPropertyDescriptor(t, i).enumerable }))), s.push.apply(s, e) } return s } function g(t) { for (var i = 1; i < arguments.length; i++) { var s = null != arguments[i] ? arguments[i] : {}; i % 2 ? P(Object(s), !0).forEach((function (i) { A(t, i, s[i]) })) : Object.getOwnPropertyDescriptors ? Object.defineProperties(t, Object.getOwnPropertyDescriptors(s)) : P(Object(s)).forEach((function (i) { Object.defineProperty(t, i, Object.getOwnPropertyDescriptor(s, i)) })) } return t } var { isArray: v } = Array; function E(t) { return v(t) ? t : [t] } function T(t, i) { const s = []; let e = 0; for (let n = 0; n < t.length; n++) { const r = t[n]; i(r, n, t) ? s.push(r) : (e < n && (t[e] = r), e++) } return e < t.length && (t.length = e), s } function I(t, i) { for (let s = 0; s < t.length; s++)if (i(t[s], s, t)) return s; return -1 } function M(t, i) { const s = t.indexOf(i); return -1 != s && (t.splice(s, 1), !0) } function R(t, i) { const s = t.length - i.length; return s >= 0 && t.indexOf(i, s) == s } function y(t) { return "string" == typeof t } function b(t) { return 1 == (null == t ? void 0 : t.nodeType) } function w(t) { return "number" == typeof t && isFinite(t) } var V = "​​​", S = "​​​​"; function x(t) { return b(t) ? t.tagName.toLowerCase() + (t.id ? `#${t.id}` : "") : t } function O(t) { return t.indexOf(V) >= 0 } function C(t) { return t.replace(V, "") } function k(t, i, s = "Assertion failed", e) { var n, r; if (i) return i; t && -1 == s.indexOf(t) && (s += t); let h = 3; const o = s.split("%s"); let u = o.shift(); const l = [u]; for (; o.length;) { const t = arguments[h++], i = o.shift(); u += x(t) + i, l.push(t, i.trim()) } const c = new Error(u); throw c.messageArray = T(l, (t => "" !== t)), null === (n = (r = self).__AMP_REPORT_ERROR) || void 0 === n || n.call(r, c), c } function N(t, i, s, e, n) { return v(n) ? t(s, n.concat([i])) : t(s, `${n || e}: %s`, i), i } function D(t, i, s, e, n, r, h, o, u, l, c) { return t } function L(t, i) { return t } function U(t, i) { return t } function $(t, i) { return t } function F(t, i, s, e, n, r, h, o, u, l, c) { return k(V, t, i, s, e, n, r, h, o, u, l, c) } function B(t) { return JSON.parse(t) } function H(t) { const i = new Uint8Array(t.length); for (let s = 0; s < t.length; s++) { const e = t.charCodeAt(s); D(e <= 255), i[s] = e } return i } function j(t, i) { let { crypto: s } = t; const e = new Uint8Array(i); return s.getRandomValues(e), e } function z(t, i, s) { let e = 0, n = null; function r(r) { n = null, e = t.setTimeout(h, s), i.apply(null, r) } function h() { e = 0, n && r(n) } return function (...t) { e ? n = t : r(t) } } function G(t, i, s) { let e = 0, n = 0, r = null; function h() { e = 0; const o = s - (t.Date.now() - n); var u; o > 0 ? e = t.setTimeout(h, o) : (u = r, r = null, i.apply(null, u)) } return function (...i) { n = t.Date.now(), r = i, e || (e = t.setTimeout(h, s)) } } var q = ["javascript:", "data:", "vbscript:"], W = /(?:^[#?]?|&)([^=&]+)(?:=([^&]*))?/g; function K(t, i = "") { try { return decodeURIComponent(t) } catch (t) { return i } } function Y(t) { const i = p(); if (!t) return i; let s; for (; s = W.exec(t);) { const t = K(s[1], s[1]), e = s[2] ? K(s[2].replace(/\+/g, " "), s[2]) : ""; i[t] = e } return i } function Q(t) { const { location: i } = t || self; return Y(i.originalHash || i.hash) } var J = t => self.AMP_CONFIG ? self.AMP_CONFIG[t] : null, X = ("string" == typeof J("cdnProxyRegex") ? new RegExp(J("cdnProxyRegex")) : J("cdnProxyRegex")) || /^https:\/\/([a-zA-Z0-9_-]+\.)?cdn\.ampproject\.org$/; function Z(t) { if (!self.document || !self.document.head) return null; if (self.location && X.test(self.location.origin)) return null; const i = self.document.head.querySelector(`meta[name="${t}"]`); return i && i.getAttribute("content") || null } var tt = J("thirdPartyUrl") || "https://3p.ampproject.net", it = J("thirdPartyFrameHost") || "ampproject.net", st = ("string" == typeof J("thirdPartyFrameRegex") ? new RegExp(J("thirdPartyFrameRegex")) : J("thirdPartyFrameRegex")) || /^d-\d+\.ampproject\.net$/, et = J("cdnUrl") || Z("runtime-host") || "https://cdn.ampproject.org", nt = /^https?:\/\/localhost(:\d+)?$/, rt = J("errorReportingUrl") || "https://us-central1-amp-error-reporting.cloudfunctions.net/r", ht = J("betaErrorReportingUrl") || "https://us-central1-amp-error-reporting.cloudfunctions.net/r-beta", ot = J("localDev") || !1, ut = [/(^|\.)google\.(com?|[a-z]{2}|com?\.[a-z]{2}|cat)$/, /(^|\.)gmail\.(com|dev)$/], lt = J("geoApiUrl") || Z("amp-geo-api"), ct = ""; function at(t) { const i = t || self; return i.__AMP_MODE ? i.__AMP_MODE : i.__AMP_MODE = function (t) { return { localDev: !1, development: ft(t, Q(t)), esm: !0, test: !1, rtvVersion: dt(t), ssrReady: !1 } }(i) } function dt(t) { var i; return ct || (ct = (null === (i = t.AMP_CONFIG) || void 0 === i ? void 0 : i.v) || "012309181453000"), ct } function ft(t, i) { const s = i || Q(t); return ["1", "actions", "amp", "amp4ads", "amp4email"].includes(s.development) || !!t.AMP_DEV_MODE } var pt = () => { }, mt = void 0; function _t(t) { mt = t } var At = (t, i) => i.reduce(((t, i) => `${t}&s[]=${Pt(i)}`), `https://log.amp.dev/?v=012309181453000&id=${encodeURIComponent(t)}`), Pt = t => encodeURIComponent(String(x(t))), gt = t => parseInt(Q(t).log, 10); self.__AMP_LOG = self.__AMP_LOG || { user: null, dev: null, userForEmbed: null }; var vt = self.__AMP_LOG, Et = null; function Tt(t, i) { if (!Et) throw new Error("failed to call initLogConstructor"); return new Et(self, t, i) } function It(t) { return vt.user || (vt.user = Mt(V)), function (t, i) { return i && i.ownerDocument.defaultView != t }(vt.user.win, t) ? vt.userForEmbed || (vt.userForEmbed = Mt(S)) : vt.user } function Mt(t) { return Tt(((t, i) => i || t >= 1 ? 4 : 2), t) } function Rt() { return vt.dev || (vt.dev = Tt((t => t >= 3 ? 4 : t >= 2 ? 3 : 0))) } function yt(t, i, s, e, n, r, h, o, u, l, c) { return t } function bt(t, i, s, e, n, r, h, o, u, l, c) { return It().assert(t, i, s, e, n, r, h, o, u, l, c) } function wt(t) { return (t.ownerDocument || t).defaultView } function Vt(t, i) { return t.replace(/^|,/g, `$&${i} `) } function St(t) { return CSS.escape(t) } function xt(t) { D(/^[\w-]+$/.test(t)) } function Ot(t, i) { return t.querySelector(Vt(i, ":scope")) } function Ct(t, i) { return t.closest(i) } function kt(t, i) { for (let s = t.lastElementChild; s; s = s.previousElementSibling)if (i(s)) return s; return null } function Nt(t, i) { return xt(i), Ot(t, `> [${i}]`) } function Dt(t) { return !!function (t) { let i; return y(t) ? i = t : b(t) && (i = t.tagName), !!i && i.toLowerCase().startsWith("i-") }(t) || t.nodeType === Node.ELEMENT_NODE && (L(t), t.hasAttribute("placeholder") || t.hasAttribute("fallback") || t.hasAttribute("overflow")) } var Lt = { bubbles: !0, cancelable: !0 }; function Ut(t, i, s) { if (i(t)) s(); else { const e = new (wt(t).MutationObserver)((() => { i(t) && (e.disconnect(), s()) })); e.observe(t, { childList: !0 }) } } function $t(t, i) { Ut(t.documentElement, (() => !!t.body), i) } function Ft(t) { return new Promise((i => $t(t, i))) } function Bt(t) { var i; null === (i = t.parentElement) || void 0 === i || i.removeChild(t) } function Ht(t) { const i = t.isConnected; if (void 0 !== i) return i; let s = t; for (; s = jt(s), s.host;)s = s.host; return s.nodeType === Node.DOCUMENT_NODE } function jt(t) { if (Node.prototype.getRootNode) return t.getRootNode(); let i; for (i = t; i.parentNode && (!(s = i) || "I-AMPHTML-SHADOW-ROOT" != s.tagName && (11 != s.nodeType || "[object ShadowRoot]" !== Object.prototype.toString.call(s))); i = i.parentNode); var s; return i } function zt(t, i) { let s = t; do { if (s.nextSibling) return !0 } while ((s = s.parentNode) && s != i); return !1 } function Gt(t) { try { t.focus() } catch (t) { } } function qt(t) { return t.parent && t.parent != t } function Wt(t, i, s, e) { const n = s || {}; D(t.ownerDocument); const { bubbles: r, cancelable: h } = e || Lt, o = new MessageEvent(i, { data: n, bubbles: r, cancelable: h }); t.dispatchEvent(o) } function Kt(t, i) { return i !== t && t.contains(i) } function Yt(t) { return t.hasAttribute("i-amphtml-ssr") } function Qt(t, i) { const s = t.head.querySelector("script[nonce]"); if (s) { const t = s.nonce || s.getAttribute("nonce"); i.setAttribute("nonce", null != t ? t : "") } } function Jt(t, i, s, e) { return { left: t, top: i, width: s, height: e, bottom: i + e, right: t + s, x: t, y: i } } function Xt(t, i, s) { return Jt(t.left - t.width * i, t.top - t.height * s, t.width * (1 + 2 * i), t.height * (1 + 2 * s)) } function Zt(t, i, s) { return 0 == i && 0 == s || 0 == t.width && 0 == t.height ? t : Jt(t.left + i, t.top + s, t.width, t.height) } function ti(t) { return !t.IntersectionObserver || !t.IntersectionObserverEntry || !!t.IntersectionObserver._stub || !function (t) { try { return new t.IntersectionObserver((() => { }), { root: t.document }), !0 } catch (t) { return !1 } }(t) || function (t) { return /apple/i.test(t.navigator.vendor) }(t) } var ii = class t { constructor(i, s) { this.It = i, this.Ot = g({ root: null, rootMargin: "0px 0px 0px 0px" }, s), this.kt = [], this.St = null, t._upgraders.push(this.Ct.bind(this)) } get root() { return this.St ? this.St.root : this.Ot.root || null } get rootMargin() { return this.St ? this.St.rootMargin : this.Ot.rootMargin } get thresholds() { return this.St ? this.St.thresholds : [].concat(this.Ot.threshold || 0) } disconnect() { this.St ? this.St.disconnect() : this.kt.length = 0 } takeRecords() { return this.St ? this.St.takeRecords() : [] } observe(t) { this.St ? this.St.observe(t) : -1 == this.kt.indexOf(t) && this.kt.push(t) } unobserve(t) { if (this.St) this.St.unobserve(t); else { const i = this.kt.indexOf(t); -1 != i && this.kt.splice(i, 1) } } Ct(t) { const i = new t(this.It, this.Ot); this.St = i; for (const t of this.kt) i.observe(t); this.kt.length = 0 } }; ii._upgraders = []; var { hasOwnProperty: si } = Object.prototype; function ei(t) { return !t.ResizeObserver || !!t.ResizeObserver._stub } var ni, ri = class t { constructor(i) { this.It = i, this.kt = [], this.St = null, t._upgraders.push(this.Ct.bind(this)) } disconnect() { this.St ? this.St.disconnect() : this.kt.length = 0 } observe(t) { this.St ? this.St.observe(t) : -1 == this.kt.indexOf(t) && this.kt.push(t) } unobserve(t) { if (this.St) this.St.unobserve(t); else { const i = this.kt.indexOf(t); -1 != i && this.kt.splice(i, 1) } } Ct(t) { const i = new t(this.It); this.St = i; for (const t of this.kt) i.observe(t); this.kt.length = 0 } }; ri._upgraders = [], self.document && (ti(ni = self) && function (t) { if (!t.IntersectionObserver) return t.IntersectionObserver = ii, void (t.IntersectionObserver._stub = ii); const i = t.IntersectionObserver; t.IntersectionObserver = function (t, i) { return function (s, e) { var n; return 9 === (null == e || null === (n = e.root) || void 0 === n ? void 0 : n.nodeType) ? new i(s, e) : new t(s, e) } }(t.IntersectionObserver, ii), t.IntersectionObserver._stub = ii, t.IntersectionObserver._native = i }(ni), function (t) { t.IntersectionObserverEntry && !("isIntersecting" in t.IntersectionObserverEntry.prototype) && Object.defineProperty(t.IntersectionObserverEntry.prototype, "isIntersecting", { enumerable: !0, configurable: !0, get() { return this.intersectionRatio > 0 } }) }(ni), function (t) { ei(t) && function (t) { t.ResizeObserver || (t.ResizeObserver = ri, t.ResizeObserver._stub = ri) }(t) }(self), function (t) { t.AbortController || (Object.defineProperty(t, "AbortController", { configurable: !0, enumerable: !1, writable: !0, value: i }), Object.defineProperty(t, "AbortSignal", { configurable: !0, enumerable: !1, writable: !0, value: s })) }(self)); var hi = "cls", oi = "clstu", ui = "cls-1", li = "pc", ci = "inp", ai = "building", di = "mounting", fi = "loading", pi = "complete", mi = "error"; function _i(t) { return t.readyState != fi && "uninitialized" != t.readyState } function Ai(t) { return t.readyState == pi } function Pi(t, i) { gi(t, _i, i) } function gi(t, i, s) { let e = i(t); if (e) s(t); else { const n = () => { i(t) && (e || (e = !0, s(t)), t.removeEventListener("readystatechange", n)) }; t.addEventListener("readystatechange", n) } } function vi(t) { return new Promise((i => { Pi(t, i) })) } function Ei(t) { return new Promise((i => { gi(t, Ai, i) })) } var Ti = ["amp-mustache"], Ii = /^https:\/\/([a-zA-Z0-9_-]+\.)?cdn\.ampproject\.org(\/.*)?$/; function Mi(t) { if (!t) return null; const i = t.match(/^(.*)\/(.*)-([0-9.]+|latest)(\.max)?\.(?:js|mjs)(?:\?ssr-css=[0|1])?$/i), s = i ? i[2] : void 0, e = i ? i[3] : void 0; return s && e ? { extensionId: s, extensionVersion: e } : null } function Ri(t, i, s) { const e = t.document.createElement("script"); e.async = !0, bi(i) ? s = "" : e.setAttribute(Ti.indexOf(i) >= 0 ? "custom-template" : "custom-element", i), e.setAttribute("data-script", i), e.setAttribute("i-amphtml-inserted", ""), e.setAttribute("type", "module"), Qt(t.document, e), e.setAttribute("crossorigin", "anonymous"); const n = function (t, i, s, e) { return `${et}/rtv/${at().rtvVersion}/v0/${i}${s ? "-" + s : ""}.mjs` }(t.location, i, s); let r = { createScriptURL: function (t) { return Ii.test(t) || "fonts.googleapis.com" === new URL(t).host ? t : "" } }; return self.trustedTypes && self.trustedTypes.createPolicy && (r = self.trustedTypes.createPolicy("extension-script#createExtensionScript", r)), e.src = r.createScriptURL(n), e } function yi(t, i, s, e, n = !0) { const r = ":not([i-amphtml-loaded-new-version])" + (n ? "" : ":not([i-amphtml-inserted])"), h = t.document.head.querySelectorAll(`script[src*="/${i}-"]${r}`), o = []; for (let t = 0; t < h.length; t++) { const n = h[t], r = Mi(n.src); if (!r) continue; const { extensionId: u, extensionVersion: l } = r; u == i && (bi(i) || l == s || "latest" == l && e) && o.push(n) } return o } function bi(t) { return t.startsWith("_") } function wi(t, i, s, e) { Fi(t = Ni(t), t, i, s), e && $i(t, i) } function Vi(t, i, s, e) { const n = Li(t), r = Ui(n); Fi(r, n, i, s), e && $i(r, i) } function Si(t, i) { return $i(t = Ni(t), i) } function xi(t, i) { return $i(Ui(Li(t)), i) } function Oi(t, i) { const s = Ui(Li(t)); return qi(s, i) ? $i(s, i) : null } function Ci(t, i) { return Bi(Ui(t), i) } function ki(t, i) { return Hi(Ui(t), i) } function Ni(t) { return t.__AMP_TOP || (t.__AMP_TOP = t) } function Di(t, i) { const s = (t.ownerDocument || t).defaultView, e = i || Ni(s); if (s && s != e && Ni(s) == e) try { return s.frameElement } catch (t) { } return null } function Li(t) { return t.nodeType ? function (t) { return Si(t, "ampdoc") }(wt(t)).getAmpDoc(t) : t } function Ui(t) { const i = Li(t); return i.isSingleDoc() ? i.win : i } function $i(t, i) { yt(qi(t, i)); const s = ji(t)[i]; return s.obj || (yt(s.ctor), yt(s.context), s.obj = new s.ctor(s.context), yt(s.obj), s.context = null, s.resolve && s.resolve(s.obj)), s.obj } function Fi(t, i, s, e, n, r) { const h = ji(t); let o = h[s]; o || (o = h[s] = { obj: null, promise: null, resolve: null, reject: null, context: null, ctor: null, sharedInstance: r || !1 }), !n && o.ctor || (o.ctor = e, o.context = i, o.sharedInstance = r || !1, o.resolve && $i(t, s)) } function Bi(t, i) { const s = Hi(t, i); if (s) return s; const e = ji(t); return e[i] = function () { const t = new n, { promise: i, reject: s, resolve: e } = t; return i.catch((() => { })), { obj: null, promise: i, resolve: e, reject: s, context: null, ctor: null } }(), e[i].promise } function Hi(t, i) { const s = ji(t)[i]; return s ? s.promise ? s.promise : ($i(t, i), s.promise = Promise.resolve(s.obj)) : null } function ji(t) { let i = t.__AMP_SERVICES; return i || (i = t.__AMP_SERVICES = {}), i } function zi(t) { return "function" == typeof t.dispose } function Gi(t, i) { if (zi(i)) try { (function (t) { return yt(zi(t)), t })(i).dispose() } catch (i) { Rt().error("SERVICE", "failed to dispose service", t, i) } } function qi(t, i) { const s = t.__AMP_SERVICES && t.__AMP_SERVICES[i]; return !(!s || !s.ctor) } function Wi(t, i, s, e) { return Ki(t, i, s, e).then((t => function (t, i, s) { return bt(t, "Service %s was requested to be provided through %s, but %s is not loaded in the current page. To fix this problem load the JavaScript file for %s in this page.", i, s, s, s) }(t, i, s))) } function Ki(t, i, s, e) { const n = ki(t, i); if (n) return n; const r = Li(t); return r.whenExtensionsKnown().then((() => { const t = r.getExtensionVersion(s); return t ? Si(r.win, "extensions").waitForExtension(s, t) : null })).then((s => s ? e ? ki(t, i) : Ci(t, i) : null)) } var Yi, Qi = t => Ki(t, "access", "amp-access"), Ji = t => Ki(t, "subscriptions", "amp-subscriptions"), Xi = t => Oi(t, "action"), Zi = t => Wi(t, "activity", "amp-analytics"), ts = t => Li(t), is = t => Si(t, "ampdoc"), ss = t => function (t, i, s) { const e = Oi(t, i); return e ? Promise.resolve(e) : Ki(t, i, "amp-bind") }(t, "bind"), es = t => Ci(t, "cid"), ns = t => Si(t, "crypto"), rs = t => xi(t, "documentInfo").get(), hs = t => Si(t, "extensions"), os = t => xi(t, "history"), us = t => xi(t, "mutator"), ls = t => Si(t, "performance"), cs = t => Si(t, "platform"), as = t => Si(t, "preconnect"), ds = t => xi(t, "resources"), fs = t => Ci(t, "storage"), ps = t => function (t, i) { return $i(t, "timer") }(t), ms = t => Oi(t, "url-replace"), _s = t => Ki(t, "geo", "amp-geo", !0), As = t => Oi(t, "url"), Ps = t => xi(t, "viewer"), gs = t => Si(t, "vsync"), vs = t => xi(t, "viewport"), Es = t => Si(t, "xhr"), Ts = { PRERENDER: "prerender", PREVIEW: "preview", VISIBLE: "visible", HIDDEN: "hidden", PAUSED: "paused", INACTIVE: "inactive" }, Is = class { constructor() { this.un = null } add(t) { return this.un || (this.un = []), this.un.push(t), () => { this.remove(t) } } remove(t) { this.un && M(this.un, t) } removeAll() { this.un && (this.un.length = 0) } fire(t) { if (this.un) for (const i of this.un.slice()) i(t) } getHandlerCount() { var t, i; return null !== (t = null === (i = this.un) || void 0 === i ? void 0 : i.length) && void 0 !== t ? t : 0 } }, Ms = class { constructor() { this.hn = p(), this.ti = null } get(t) { const i = this.hn[t]; return null == i ? null : i } whenSignal(t) { var i; let s = null === (i = this.ti) || void 0 === i ? void 0 : i[t]; if (!s) { const i = this.hn[t]; s = null != i ? { promise: "number" == typeof i ? Promise.resolve(i) : Promise.reject(i) } : new n, this.ti || (this.ti = p()), this.ti[t] = s } return s.promise } signal(t, i) { var s; if (null != this.hn[t]) return; const e = null != i ? i : Date.now(); this.hn[t] = e; const n = null === (s = this.ti) || void 0 === s ? void 0 : s[t]; null != n && n.resolve && (n.resolve(e), n.resolve = void 0, n.reject = void 0) } rejectSignal(t, i) { var s; if (null != this.hn[t]) return; this.hn[t] = i; const e = null === (s = this.ti) || void 0 === s ? void 0 : s[t]; null != e && e.reject && (e.reject(i), e.promise.catch((() => { })), e.resolve = void 0, e.reject = void 0) } reset(t) { var i; this.hn[t] && delete this.hn[t]; const s = null === (i = this.ti) || void 0 === i ? void 0 : i[t]; s && !s.resolve && delete this.ti[t] } }, Rs = ["Webkit", "webkit", "Moz", "moz", "ms", "O", "o"], ys = { "getPropertyPriority": () => "", "getPropertyValue": () => "" }; function bs(t) { const i = t.replace(/[A-Z]/g, (t => "-" + t.toLowerCase())); return Rs.some((t => i.startsWith(t + "-"))) ? `-${i}` : i } function ws(t, i, s) { if (i.startsWith("--")) return i; Yi || (Yi = p()); let e = Yi[i]; if (!e || s) { if (e = i, void 0 === t[i]) { const s = function (t) { return t.charAt(0).toUpperCase() + t.slice(1) }(i), n = function (t, i) { for (let s = 0; s < Rs.length; s++) { const e = Rs[s] + i; if (void 0 !== t[e]) return e } return "" }(t, s); void 0 !== t[n] && (e = n) } s || (Yi[i] = e) } return e } function Vs(t, i) { const { style: s } = t; for (const t in i) s.setProperty(bs(ws(s, t)), String(i[t]), "important") } function Ss(t, i, s, e, n) { const r = ws(t.style, i, n); if (!r) return; const h = e ? s + e : s; t.style.setProperty(bs(r), h) } function xs(t, i) { for (const s in i) Ss(t, s, i[s]) } function Os(t, i) { void 0 === i && (i = t.hasAttribute("hidden")), i ? t.removeAttribute("hidden") : t.setAttribute("hidden", "") } function Cs(t) { return `${t}px` } function ks(t, i) { return t.getComputedStyle(i) || ys } function Ns(t) { const i = t[ws(t, "visibilityState", !0)]; if (i) return i; const s = ws(t, "hidden", !0); return s in t && t[s] ? Ts.HIDDEN : Ts.VISIBLE } function Ds(t, i) { if (!t.addEventListener) return; const s = Us(t); s && t.addEventListener(s, i) } function Ls(t, i) { if (!t.removeEventListener) return; const s = Us(t); s && t.removeEventListener(s, i) } function Us(t) { const i = ws(t, "hidden", !0), s = i.indexOf("Hidden"); return -1 != s ? i.substring(0, s) + "Visibilitychange" : "visibilitychange" } var $s = class { static getTop(t) { return t.top } static getLocation(t) { return t.location } static getDocumentReferrer(t) { return t.document.referrer } static getHostname(t) { return t.location.hostname } static getUserAgent(t) { return t.navigator.userAgent } static getUserLanguage(t) { return t.navigator.userLanguage || t.navigator.language } static getDevicePixelRatio() { return self.devicePixelRatio || 1 } static getSendBeacon(t) { if (t.navigator.sendBeacon) return t.navigator.sendBeacon.bind(t.navigator) } static getXMLHttpRequest(t) { return t.XMLHttpRequest } static getImage(t) { return t.Image } }, Fs = "__AMP__", Bs = "-ampdoc-ext-known", Hs = "-ampdoc-first-visible", js = "-ampdoc-next-visible", zs = "-ampdoc-first-previewed", Gs = class { constructor(t, i, s) { this.win = t, this.ii = p(), this.si = i, this.ei = s && s.signals || new Ms, this.ni = s && s.params || p(), this.ri = null, this.hi = {}; const e = this.ni.visibilityState; var n; yt(!e || "prerender" === (n = e) || "preview" === n || "visible" === n || "hidden" === n || "paused" === n || "inactive" === n), this.oi = s && s.visibilityState || e || null, this.D = null, this.ui = new Is, this.li = null, this.ci = []; const r = this.ai.bind(this); this.si && this.ci.push(this.si.onVisibilityChanged(r)), Ds(this.win.document, r), this.ci.push((() => Ls(this.win.document, r))), this.ai() } dispose() { (function (t) { const i = ji(t); for (const t in i) { if (!Object.prototype.hasOwnProperty.call(i, t)) continue; const s = i[t]; s.sharedInstance || (s.obj ? Gi(t, s.obj) : s.promise && s.promise.then((i => Gi(t, i)))) } })(this), this.ci.forEach((t => t())) } isSingleDoc() { return yt(null) } getParent() { return this.si } signals() { return this.ei } getParam(t) { const i = this.ni[t]; return null == i ? null : i } getMeta() { return this.ri || (this.ri = p(), this.win.document.head.querySelectorAll("meta[name]").forEach((t => { const i = t.getAttribute("name"), s = t.getAttribute("content"); i && null !== s && void 0 === this.ri[i] && (this.ri[i] = s) }))), p(this.ri) } getMetaByName(t) { if (!t) return null; const i = this.getMeta()[t]; return void 0 !== i ? i : null } setMetaByName(t, i) { yt(null) } declaresExtension(t, i) { const s = this.hi[t]; return !(!s || i && s !== i) } declareExtension(t, i) { yt(!this.hi[t] || this.hi[t] === i), this.hi[t] = i } getExtensionVersion(t) { return this.hi[t] || null } setExtensionsKnown() { this.ei.signal(Bs) } whenExtensionsKnown() { return this.ei.whenSignal(Bs) } getRootNode() { return yt(null) } getHeadNode() { } isBodyAvailable() { return yt(!1) } getBody() { return yt(null) } waitForBodyOpen() { return yt(null) } isReady() { return yt(null) } whenReady() { return yt(null) } getUrl() { return yt(null) } getElementById(t) { return this.getRootNode().getElementById(t) } contains(t) { return this.getRootNode().contains(t) } overrideVisibilityState(t) { this.oi != t && (this.oi = t, this.ai()) } ai() { const t = Ns(this.win.document); let i, s = Ts.VISIBLE; for (let t = this.si; t; t = t.getParent())if (t.getVisibilityState() != Ts.VISIBLE) { s = t.getVisibilityState(); break } const e = this.oi || Ts.VISIBLE; if (i = e == Ts.VISIBLE && s == Ts.VISIBLE && t == Ts.VISIBLE ? Ts.VISIBLE : t == Ts.HIDDEN && e == Ts.PAUSED ? t : e == Ts.PAUSED || e == Ts.INACTIVE ? e : s == Ts.PAUSED || s == Ts.INACTIVE ? s : e == Ts.PREVIEW || t == Ts.PREVIEW || s == Ts.PREVIEW ? Ts.PREVIEW : e == Ts.PRERENDER || t == Ts.PRERENDER || s == Ts.PRERENDER ? Ts.PRERENDER : Ts.HIDDEN, this.D != i) { if (i == Ts.VISIBLE) { var n; const { performance: t } = this.win; let i = Math.floor(null !== (n = t.timeOrigin) && void 0 !== n ? n : t.timing.navigationStart); null != this.D && (i += Math.floor(t.now())), this.li = i, this.ei.signal(Hs, i), this.ei.signal(js, i) } else this.ei.reset(js); i == Ts.PREVIEW && this.ei.signal(zs), this.D = i, this.ui.fire() } } whenFirstPreviewedOrVisible() { return Promise.race([this.whenFirstPreviewed(), this.whenFirstVisible()]) } whenFirstPreviewed() { return this.ei.whenSignal(zs).then((() => { })) } whenFirstVisible() { return this.ei.whenSignal(Hs).then((() => { })) } whenNextVisible() { return this.ei.whenSignal(js).then((() => { })) } getFirstVisibleTime() { return this.ei.get(Hs) } getLastVisibleTime() { return this.li } getVisibilityState() { return yt(this.D) } isPreview() { return this.D == Ts.PREVIEW } isVisible() { return this.D == Ts.VISIBLE } hasBeenVisible() { return null != this.getLastVisibleTime() } onVisibilityChanged(t) { return this.ui.add(t) } registerSingleton(t) { return !this.ii[t] && (this.ii[t] = !0, !0) } }, qs = class extends Gs { constructor(t, i) { super(t, null, i), this.di = this.win.document.body ? Promise.resolve(this.win.document.body) : Ft(this.win.document).then((() => this.getBody())), this.fi = vi(this.win.document) } isSingleDoc() { return !0 } getRootNode() { return this.win.document } getUrl() { return $s.getLocation(this.win).href } getHeadNode() { return this.win.document.head } isBodyAvailable() { return !!this.win.document.body } getBody() { return this.win.document.body } waitForBodyOpen() { return this.di } isReady() { return _i(this.win.document) } whenReady() { return this.fi } }, Ws = class extends Gs { constructor(t, i, s, e) { super(t, null, e), this.pi = i, this.mi = s, this._i = null; const r = new n; this.di = r.promise, this.Ai = r.resolve, this.gi = !1; const h = new n; this.fi = h.promise, this.Pi = h.resolve } isSingleDoc() { return !1 } getRootNode() { return this.mi } getUrl() { return this.pi } getHeadNode() { return this.mi } isBodyAvailable() { return !!this._i } getBody() { return this._i } setBody(t) { yt(!this._i), this._i = t, this.Ai(t), this.Ai = void 0 } waitForBodyOpen() { return this.di } isReady() { return this.gi } setReady() { yt(!this.gi), this.gi = !0, this.Pi(), this.Pi = void 0 } whenReady() { return this.fi } getMeta() { return p(this.ri) } setMetaByName(t, i) { yt(t), this.ri || (this.ri = p()), this.ri[t] = i } }, Ks = class extends Gs { constructor(t, i, s, e) { super(t, s, e), this.pi = i, this.di = this.win.document.body ? Promise.resolve(this.win.document.body) : Ft(this.win.document).then((() => this.getBody())), this.gi = !1; const r = new n; this.fi = r.promise, this.Pi = r.resolve } isSingleDoc() { return !1 } getRootNode() { return this.win.document } getUrl() { return this.pi } getHeadNode() { return this.win.document.head } isBodyAvailable() { return !!this.win.document.body } getBody() { return this.win.document.body } waitForBodyOpen() { return this.di } isReady() { return this.gi } whenReady() { return this.fi } setReady() { yt(!this.gi), this.gi = !0, this.Pi(), this.Pi = void 0 } }; function Ys(t, i) { const s = p(); return i ? Object.assign(s, i) : (t.name && 0 == t.name.indexOf(Fs) && Object.assign(s, Y(t.name.substring(Fs.length))), t.location && t.location.hash && Object.assign(s, Y(t.location.hash))), s } var Qs = "nodisplay", Js = "fixed", Xs = "fixed-height", Zs = "responsive", te = "container", ie = "fill", se = "flex-item", ee = "fluid", ne = "intrinsic", re = /^amp\-(video|.+player)|AMP-BRIGHTCOVE|AMP-DAILYMOTION|AMP-YOUTUBE|AMP-VIMEO|AMP-IMA-VIDEO/i; function he(t) { if ("nodisplay" === (i = t) || "fixed" === i || "fixed-height" === i || "responsive" === i || "container" === i || "fill" === i || "flex-item" === i || "fluid" === i || "intrinsic" === i) return t; var i } function oe(t) { return "i-amphtml-layout-" + t } function ue(t) { return t == Js || t == Xs || t == Zs || t == ie || t == se || t == ee || t == ne } function le(t) { return "number" == typeof t ? t + "px" : t && /^\d+(\.\d+)?(px|em|rem|vh|vw|vmin|vmax|cm|mm|q|in|pc|pt)?$/.test(t) ? /^\d+(\.\d+)?$/.test(t) ? t + "px" : t : void 0 } function ce(t) { !function (t) { F(/^\d+(\.\d+)?(px|em|rem|vh|vw|vmin|vmax|cm|mm|q|in|pc|pt)$/.test(null != t ? t : ""), "Invalid length value: %s", t) }(t); const i = /[a-z]+/i.exec(null != t ? t : ""); return F(i, "Failed to read units from %s", t), i[0] } function ae(t) { const i = parseFloat(t); return w(i) ? i : void 0 } function de(t, i) { t.classList.add("i-amphtml-fill-content"), i && t.classList.add("i-amphtml-replaced-content") } function fe(t, i, s, e) { const n = E(t); for (const t of n) { const n = i.getAttribute(t); null !== n ? s.setAttribute(t, n) : e && s.removeAttribute(t) } } var pe, me = "amp:attached", _e = "amp:load-start", Ae = "amp:load-end", Pe = "ready-upgrade", ge = "upgraded", ve = "built", Ee = "mounted", Te = "load-start", Ie = "render-start", Me = "load-end", Re = "unload"; function ye(t, i) { return [{ query: t.matchMedia(i), value: "1" }, { query: null, value: "" }] } function be(t, i) { return i.split(",").map((i => { if (0 == (i = i.replace(/\s+/g, " ").trim()).length) return; let s, e, n; if (")" == i.charAt(i.length - 1)) { let t = 1; for (n = i.length - 2; n >= 0; n--) { const s = i.charAt(n); if ("(" == s ? t-- : ")" == s && t++, 0 == t) break } const s = n - 1; if (n > 0) for (n--; n >= 0; n--) { const t = i.charAt(n); if (!("%" == t || "-" == t || "_" == t || t >= "a" && t <= "z" || t >= "A" && t <= "Z" || t >= "0" && t <= "9")) break } if (n >= s) return null } else for (n = i.length - 2; n >= 0; n--) { const t = i.charAt(n); if (!("%" == t || "." == t || t >= "a" && t <= "z" || t >= "A" && t <= "Z" || t >= "0" && t <= "9")) break } return n >= 0 ? (s = i.substring(0, n + 1).trim(), e = i.substring(n + 1).trim()) : (e = i, s = void 0), e ? { query: s ? t.matchMedia(s) : null, value: e } : null })).filter(Boolean) } function we(t, i, s) { for (let e = 0; e < t.length; e++) { const { query: n } = t[e]; n && (void 0 !== n.onchange ? n.onchange = s ? i : null : s ? n.addListener(i) : n.removeListener(i)) } } function Ve(t) { const i = t.ownerDocument || t; return pe && pe.ownerDocument === i || (pe = i.createElement("div")), Se } function Se(t) { return function (t, i) { if (D(1 === i.length), D(Array.isArray(i) || m(i, "raw")), self.trustedTypes && self.trustedTypes.createPolicy) { const s = self.trustedTypes.createPolicy("static-template#createNode", { createHTML: function (t) { return i[0] } }); t.innerHTML = s.createHTML("ignored") } else t.innerHTML = i[0]; const s = t.firstElementChild; return D(s), D(!s.nextElementSibling), t.removeChild(s), s }(pe, t) } var xe = [''], Oe = { "AMP-PIXEL": { width: "0px", height: "0px" }, "AMP-ANALYTICS": { width: "1px", height: "1px" }, "AMP-AUDIO": null, "AMP-SOCIAL-SHARE": { width: "60px", height: "44px" } }; function Ce(t) { const i = t.getAttribute("layout"), s = t.getAttribute("width"), e = t.getAttribute("height"), n = t.getAttribute("sizes"), r = t.getAttribute("heights"), h = i ? he(i) : null; F(void 0 !== h, 'Invalid "layout" value: %s, %s', i, t); const o = s && "auto" != s ? le(s) : s; F(void 0 !== o, 'Invalid "width" value: %s, %s', s, t); const u = e && "fluid" != e ? le(e) : e; let l, c, a; if (F(void 0 !== u, 'Invalid "height" value: %s, %s', e, t), h && h != Js && h != Xs || o && u || (d = (d = t.tagName).toUpperCase(), void 0 === Oe[d])) l = o, c = u; else { const i = function (t) { const i = t.tagName.toUpperCase(); if (D(void 0 !== Oe[i]), !Oe[i]) { const s = t.ownerDocument, e = i.replace(/^AMP\-/, ""), n = s.createElement(e); n.controls = !0, xs(n, { position: "absolute", visibility: "hidden" }), s.body.appendChild(n), Oe[i] = { width: (n.offsetWidth || 1) + "px", height: (n.offsetHeight || 1) + "px" }, s.body.removeChild(n) } return Oe[i] }(t); l = o || h == Xs ? o : i.width, c = u || i.height } var d; return a = h || (l || c ? "fluid" == c ? ee : !c || l && "auto" != l ? c && l && (n || r) ? Zs : Js : Xs : te), a != Js && a != Xs && a != Zs && a != ne || F(c, 'The "height" attribute is missing: %s', t), a == Xs && F(!l || "auto" == l, 'The "width" attribute must be missing or "auto": %s', t), a != Js && a != Zs && a != ne || F(l && "auto" != l, 'The "width" attribute must be present and not "auto": %s', t), a == Zs || a == ne ? F(ce(l) == ce(c), 'Length units should be the same for "width" and "height": %s, %s, %s', s, e, t) : F(null === r, '"heights" attribute must be missing: %s', t), { layout: a, width: l, height: c } } var ke, Ne = "amp-experiment-toggles", De = "__AMP__EXPERIMENT_TOGGLES"; function Le(t, i) { return !!$e(t)[i] } function Ue(t, i, s, e) { const n = Le(t, i), r = null != s ? s : !n; if (r != n && ($e(t)[i] = r, !e)) { const s = Fe(t); s[i] = r, function (t, i) { const s = []; for (const t in i) s.push((!1 === i[t] ? "-" : "") + t); try { var e; null === (e = t.localStorage) || void 0 === e || e.setItem(Ne, s.join(",")) } catch (t) { It().error("EXPERIMENTS", "Failed to save experiments to localStorage.") } }(t, s) } return r } function $e(t) { var i, s, e, n, r; if (t[De]) return t[De]; t[De] = p(); const h = t[De]; D(h); const o = g(g({}, null !== (i = t.AMP_CONFIG) && void 0 !== i ? i : {}), null !== (s = t.AMP_EXP) && void 0 !== s ? s : B((null === (e = t.__AMP_EXP) || void 0 === e ? void 0 : e.textContent) || "{}")); for (const t in o) { const i = o[t]; "number" == typeof i && i >= 0 && i <= 1 && (h[t] = Math.random() < i) } const u = null === (n = t.AMP_CONFIG) || void 0 === n ? void 0 : n["allow-doc-opt-in"]; if (v(u) && u.length) { const i = t.document.head.querySelector('meta[name="amp-experiments-opt-in"]'); if (i) { var l; const t = (null === (l = i.getAttribute("content")) || void 0 === l ? void 0 : l.split(",")) || []; for (const i of t) u.includes(i) && (h[i] = !0) } } Object.assign(h, Fe(t)); const c = null === (r = t.AMP_CONFIG) || void 0 === r ? void 0 : r["allow-url-opt-in"]; if (v(c) && c.length) { const i = Y(t.location.originalHash || t.location.hash); for (const t of c) { const s = i[`e-${t}`]; "1" == s && (h[t] = !0), "0" == s && (h[t] = !1) } } return h } function Fe(t) { var i; let s = ""; try { var e; "localStorage" in t && (s = null !== (e = t.localStorage.getItem(Ne)) && void 0 !== e ? e : "") } catch (t) { } const n = (null === (i = s) || void 0 === i ? void 0 : i.split(/\s*,\s*/g)) || [], r = p(); for (const t of n) t && ("-" == t[0] ? r[t.substr(1)] = !1 : r[t] = !0); return r } function Be(t, i, s, e) { let n = t, r = s, h = t => { try { return r(t) } catch (t) { var i, s; throw null === (i = (s = self).__AMP_REPORT_ERROR) || void 0 === i || i.call(s, t), t } }; const o = function () { if (void 0 !== ke) return ke; ke = !1; try { const t = { get capture() { return ke = !0, !1 } }; self.addEventListener("test-options", null, t), self.removeEventListener("test-options", null, t) } catch (t) { } return ke }(), u = !(null == e || !e.capture); return n.addEventListener(i, h, o ? e : u), () => { null == n || n.removeEventListener(i, h, o ? e : u), r = null, n = null, h = null } } var He = "Failed to load:"; function je(t, i, s, e) { const n = { detail: s }; return Object.assign(n, e), new t.CustomEvent(i, n) } function ze(t, i, s, e) { return Be(t, i, s, e) } function Ge(t) { return t.data } function qe(t, i, s, e) { let n = s; const r = Be(t, i, (t => { try { n(t) } finally { n = null, r() } }), e); return r } function We(t) { let i, s; if (function (t) { return !!(t.complete || "complete" == t.readyState || Ke(t) && t.readyState > 0 || t.document && "complete" == t.document.readyState) }(t)) return Promise.resolve(t); const e = Ke(t); return e && t.__AMP_MEDIA_LOAD_FAILURE_SRC === t.currentSrc ? Promise.reject(t) : new Promise(((n, r) => { if (i = e ? qe(t, "loadedmetadata", n, { capture: !0 }) : qe(t, "load", n), !t.tagName) return; let h = t; if (e && !t.hasAttribute("src") && (h = kt(t, (t => "SOURCE" === t.tagName)), !h)) return r(new Error("Media has no source.")); s = qe(h, "error", r) })).then((() => (s && s(), t)), (() => { i && i(), function (t) { Ke(t) && (t.__AMP_MEDIA_LOAD_FAILURE_SRC = t.currentSrc || !0); let i = t; throw i && i.src && (i = i.src), It().createError(He, i) }(t) })) } function Ke(t) { return "AUDIO" === t.tagName || "VIDEO" === t.tagName } var Ye = { "amp-dynamic-css-classes": "[custom-element=amp-dynamic-css-classes]", "variant": "amp-experiment" }; function Qe(t) { const i = t.document; return yt(i.body), Object.keys(Ye).filter((t => i.querySelector(Ye[t]))) } function Je(t, i, s) { if (i[s]) return i[s]; const e = t.querySelector(`style[${s}], link[${s}]`); return e ? (i[s] = e, e) : null } var Xe = !1; function Ze(t) { yt(t.defaultView), Xe || (Xe = !0, tn(t)) } function tn(t) { xs(t.body, { opacity: 1, visibility: "visible", "animation": "none" }) } function sn(t, i) { const s = t.styleSheets; for (let t = 0; t < s.length; t++)if (s[t].ownerNode == i) return !0; return !1 } var en, nn = new Set(["c", "v", "a", "ad"]), rn = "__amp_source_origin", hn = t => "string" == typeof t ? on(t) : t; function on(t, i) { return en || (en = self.document.createElement("a")), un(en, t) } function un(t, i, s) { return t.href = "", new URL(i, t.href) } function ln(t, i, s) { if (!i) return t; const e = t.split("#", 2), n = e[0].split("?", 2); let r = n[0] + (n[1] ? s ? `?${i}&${n[1]}` : `?${n[1]}&${i}` : `?${i}`); return r += e[1] ? `#${e[1]}` : "", r } function cn(t, i) { return `${encodeURIComponent(t)}=${encodeURIComponent(i)}` } function an(t, i) { return ln(t, dn(i)) } function dn(t) { const i = []; for (const s in t) { let e = t[s]; if (null != e) { e = E(e); for (let t = 0; t < e.length; t++)i.push(cn(s, e[t])) } } return i.join("&") } function fn(t) { return "https:" == (t = hn(t)).protocol || "localhost" == t.hostname || "127.0.0.1" == t.hostname || R(t.hostname, ".localhost") } function pn(t, i, s = "source") { return bt(null != t, "%s %s must be available", i, s), bt(fn(t) || /^\/\//.test(t), '%s %s must start with "https://" or "//" or be relative and served from either https or from localhost. Invalid value: %s', i, s, t), t } function mn(t) { const i = t.indexOf("#"); return -1 == i ? t : t.substring(0, i) } function _n(t) { return X.test(hn(t).origin) } function An(t) { return !(t && q.includes(hn(t).protocol)) } function Pn(t) { const { hash: i, origin: s, pathname: e, search: n } = on(t); return s + e + gn(n) + i } function gn(t) { return function (t, i) { if (!t || "?" == t) return ""; const s = new RegExp("[?&](amp_(js[^&=]*|gsa|r|kit)|usqp)\\b[^&]*", "g"), e = t.replace(s, "").replace(/^[?&]/, ""); return e ? "?" + e : "" }(t) } function vn(t) { if (!_n(t = hn(t))) return t.href; const i = t.pathname.split("/"), s = i[1]; bt(nn.has(s), "Unknown path prefix in url %s", t.href); const e = i[2], n = "s" == e ? "https://" + decodeURIComponent(i[3]) : "http://" + decodeURIComponent(e); return bt(n.indexOf(".") > 0, "Expected a . in origin %s", n), i.splice(1, "s" == e ? 3 : 2), n + i.join("/") + gn(t.search) + (t.hash || "") } function En(t) { return on(vn(t)).origin } function Tn(t, i) { return i = hn(i), new URL(t, i.href).toString() } function In(t, i) { return Mn(i), function (t, i, s, e) { return ln(t, cn("__amp_source_origin", s), void 0) }(i, 0, En(t.location.href)) } function Mn(t) { const i = Y(on(t).search); bt(!(rn in i), "Source origin is not allowed in %s", t) } var Rn = "CANCELLED", yn = "BLOCK_BY_CONSENT", bn = self.__AMP_ERRORS || []; self.__AMP_ERRORS = bn; var wn = function (t) { return (wn = function (t) { const i = function (t) { let i = 0; return () => { let t = Math.pow(1.5, i++); return t += function (t, i) { let s = t * (i = i || .3) * Math.random(); return Math.random() > .5 && (s *= -1), s }(t), 1e3 * t } }(); return t => setTimeout(t, i()) }())(t) }; function Vn(t, i) { try { let s; if (t) if (void 0 !== t.message) t = h(t), s = !0; else { const i = t; (t = new Error(function (t) { try { return JSON.stringify(t) } catch (i) { return String(t) } }(i))).origError = i } else t = new Error("Unknown error"); if (t.reported) return t; if (t.reported = !0, t.messageArray) { const i = I(t.messageArray, (t => null == t ? void 0 : t.tagName)); i > -1 && (t.associatedElement = t.messageArray[i]) } const e = i || t.associatedElement; if (e && e.classList && e.classList.add("i-amphtml-error"), self.console && (O(t.message) || !t.expected)) { const i = console.error || console.log; t.messageArray ? i.apply(console, t.messageArray) : e ? i.call(console, t.message, e) : i.call(console, t.message) } e && e.dispatchCustomEventForTesting && e.dispatchCustomEventForTesting("amp:error", t.message), On.call(self, void 0, void 0, void 0, void 0, t) } catch (t) { setTimeout((function () { throw t })) } return t } function Sn() { return new Error(Rn) } function xn(t) { return !!t && ("string" == typeof t ? t.startsWith(yn) : "string" == typeof t.message && t.message.startsWith(yn)) } function On(t, i, s, n, r) { !this || !this.document || r && r.expected || Ze(this.document); let h = !1; try { h = function (t) { if (!t.document) return !1; const i = t.document.querySelectorAll("script[src]"); for (let t = 0; t < i.length; t++)if (!_n(i[t].src.toLowerCase())) return !0; return !1 }(self) } catch (t) { } if (h && Math.random() > .01) return; const o = function (t, i, s, e, n, r) { t = function (t, i) { return i && (t = i.message ? i.message : String(i)), t || (t = "Unknown error"), t }(t, n); let h = !(!n || !n.expected); if (/_reported_/.test(t)) return; if (t == Rn) return; const o = !(self && self.window), u = Math.random(); if ((function (t) { return -1 != t.indexOf(He) }(t) || "Script error." == t || o) && (h = !0, u > .001)) return; const l = O(t); if (l && u > .1) return; const c = Object.create(null); c.v = at().rtvVersion, c.noAmp = r ? "1" : "0", c.m = t.replace(V, ""), c.a = l ? "1" : "0", c.ex = h ? "1" : "0", c.dw = o ? "1" : "0"; let a = "1p"; if (a = "esm", c.esm = "1", c.rt = "esm", c.ca = null !== (f = self.AMP_CONFIG) && void 0 !== f && f.canary ? "1" : "0", c.bt = (null === (d = self.AMP_CONFIG) || void 0 === d ? void 0 : d.type) || "unknown", self.location.ancestorOrigins && self.location.ancestorOrigins[0] && (c.or = self.location.ancestorOrigins[0]), self.viewerState && (c.vs = self.viewerState), self.parent && self.parent != self && (c.iem = "1"), self.AMP && self.AMP.viewer) { const t = self.AMP.viewer.getResolvedViewerUrl(), i = self.AMP.viewer.maybeGetMessagingOrigin(); t && (c.rvu = t), i && (c.mso = i) } var d, f; const p = [], m = self[De] || null; for (const t in m) { const i = m[t]; p.push(`${t}=${i ? "1" : "0"}`) } var _, A, P; return c.exps = p.join(","), n ? (c.el = (null === (_ = n.associatedElement) || void 0 === _ ? void 0 : _.tagName) || "u", n.args && (c.args = JSON.stringify(n.args)), l || n.ignoreStack || !n.stack || (c.s = n.stack), n.message && (n.message += " _reported_")) : (c.f = i || "", c.l = s || "", c.c = e || ""), c.r = self.document ? self.document.referrer : "", c.ae = bn.join(","), c.fr = self.location.originalHash || self.location.hash, "production" === c.bt && (c.pt = "1"), P = t, (A = bn).length >= 25 && A.splice(0, A.length - 25 + 1), A.push(P), c }(t, i, s, n, r, h); o && wn((() => { try { return function (t, i) { return i.pt && Math.random() < .9 ? e() : function (t, i) { const s = is(t); if (!s.isSingleDoc()) return Promise.resolve(!1); const e = s.getSingleDoc(); if (!e.getRootNode().documentElement.hasAttribute("report-errors-to-viewer")) return Promise.resolve(!1); const n = Ps(e); return n.hasCapability("errorReporter") ? n.isTrustedViewer().then((t => { return !!t && (n.sendMessage("error", { "m": (s = i).m, "a": s.a, "s": s.s, "el": s.el, "ex": s.ex, "v": s.v, "pt": s.pt }), !0); var s })) : Promise.resolve(!1) }(t, i).then((t => { if (!t) { const t = new XMLHttpRequest; t.open("POST", Math.random() < .1 ? ht : rt, !0), t.send(JSON.stringify(i)) } })) }(this, o).catch((() => { })) } catch (t) { } })) } var Cn = "Resource", kn = class t { static forElement(i) { return yt(t.forElementOptional(i)) } static forElementOptional(t) { return t.__AMP__RESOURCE } static setOwner(i, s) { yt(s.contains(i)), t.forElementOptional(i) && t.forElementOptional(i).updateOwner(s), i.__AMP__OWNER = s; const e = i.getElementsByClassName("i-amphtml-element"); for (let i = 0; i < e.length; i++) { const s = e[i]; t.forElementOptional(s) && t.forElementOptional(s).updateOwner(void 0) } } constructor(t, i, s) { i.__AMP__RESOURCE = this, this.vi = t, this.element = i, this.debugid = i.tagName.toLowerCase() + "#" + t, this.hostWin = i.ownerDocument.defaultView, this.Ei = s, this.Ti = i.hasAttribute("placeholder"), this.Ri = !1, this.Ii = void 0, this.Mi = i.isBuilt() ? 1 : 0, 0 == this.Mi && i.isBuilding() && this.build(), this.yi = -1, this.wi = 0, this.bi = null, this.Vi = null, this.Si = !1, this.xi = Jt(-1e4, -1e4, 0, 0), this.Oi = null, this.Ci = !1, this.ki = null, this.Ni = null, this.Di = void 0; const e = new n; this.Li = e.promise, this.Ui = e.resolve, this.$i = !1 } getId() { return this.vi } updateOwner(t) { this.Ii = t } getOwner() { if (void 0 === this.Ii) { for (let t = this.element; t; t = t.parentElement)if (t.__AMP__OWNER) { this.Ii = t.__AMP__OWNER; break } void 0 === this.Ii && (this.Ii = null) } return this.Ii } hasOwner() { return !!this.getOwner() } getLayoutPriority() { return -1 != this.yi ? this.yi : this.element.getLayoutPriority() } updateLayoutPriority(t) { this.yi = t } getState() { return this.Mi } isBuilt() { return this.element.isBuilt() } isBuilding() { return this.Ri } whenBuilt() { return this.element.signals().whenSignal("res-built") } build() { return this.Ri || !this.element.isUpgraded() ? null : (this.Ri = !0, this.element.buildInternal().then((() => { this.Ri = !1, this.Mi = 1, this.element.signals().signal("res-built") }), (t => { throw this.maybeReportErrorOnBuildFailure(t), this.Ri = !1, this.element.signals().rejectSignal("res-built", t), t }))) } maybeReportErrorOnBuildFailure(t) { xn(t) || Rt().error(Cn, "failed to build:", this.debugid, t) } changeSize(t, i, s) { this.element.applySize(t, i, s), this.requestMeasure() } overflowCallback(t, i, s, e) { t && (this.Di = { height: i, width: s, margins: e }), this.element.overflowCallback(t, i, s, e) } resetPendingChangeSize() { this.Di = void 0 } getPendingChangeSize() { return this.Di } getUpgradeDelayMs() { return this.element.getUpgradeDelayMs() } measure() { if (this.Ti && this.element.parentElement && this.element.parentElement.tagName.startsWith("AMP-") && !("__AMP__RESOURCE" in this.element.parentElement)) return; if (!this.element.ownerDocument || !this.element.ownerDocument.defaultView) return void (this.Mi = 1); this.Ci = !1; const t = this.xi; this.Fi(); const i = this.xi, s = (n = i, !((e = t).width == n.width && e.height === n.height)); var e, n; (1 == this.Mi || t.top != i.top || s) && this.element.isUpgraded() && (1 == this.Mi ? this.Mi = 2 : 4 != this.Mi && 5 != this.Mi || !this.element.isRelayoutNeeded() || (this.Mi = 2)), this.hasBeenMeasured() || (this.Oi = i), this.element.updateLayoutBox(i, s) } ensureMeasured() { return this.hasBeenMeasured() ? e() : gs(this.hostWin).measure((() => this.measure())) } Fi() { const t = vs(this.element); this.xi = t.getLayoutRect(this.element); let i = !1; if (t.supportsPositionFixed() && this.isDisplayed()) { const { win: s } = this.Ei.getAmpdoc(), { body: e } = s.document; for (let n = this.element; n && n != e; n = n.offsetParent) { if (n.isAlwaysFixed && n.isAlwaysFixed()) { i = !0; break } if (t.isDeclaredFixed(n) && "fixed" == ks(s, n).position) { i = !0; break } } } this.Si = i, i && (this.xi = Zt(this.xi, -t.getScrollLeft(), -t.getScrollTop())) } completeCollapse() { Os(this.element, !1), this.xi = Jt(this.xi.left, this.xi.top, 0, 0), this.Si = !1, this.element.updateLayoutBox(this.getLayoutBox()); const t = this.getOwner(); t && t.collapsedCallback(this.element) } completeExpand() { Os(this.element, !0), this.requestMeasure() } isMeasureRequested() { return this.Ci } hasBeenMeasured() { return !!this.Oi } requestMeasure() { this.Ci = !0 } getLayoutSize() { return function (t) { const { height: i, width: s } = t; return { width: s, height: i } }(this.xi) } getLayoutBox() { if (!this.Si) return this.xi; const t = vs(this.element); return Zt(this.xi, t.getScrollLeft(), t.getScrollTop()) } getInitialLayoutBox() { return this.Oi || this.xi } isDisplayed() { if (!this.element.ownerDocument || !this.element.ownerDocument.defaultView) return !1; const t = this.element.getLayout() == ee, i = this.getLayoutBox(), s = i.height > 0 && i.width > 0; return t || s } isFixed() { return this.Si } overlaps(t) { return s = t, (i = this.getLayoutBox()).top <= s.bottom && s.top <= i.bottom && i.left <= s.right && s.left <= i.right; var i, s } prerenderAllowed() { return this.element.prerenderAllowed() } previewAllowed() { return this.element.previewAllowed() } isBuildRenderBlocking() { return this.element.isBuildRenderBlocking() } whenWithinViewport(t) { if (yt(!1 !== t), !this.isLayoutPending() || !0 === t) return e(); const i = t, s = String(i); return this.ki && this.ki[s] ? this.ki[s].promise : this.isWithinViewportRatio(i) ? e() : (this.ki = this.ki || {}, this.ki[s] = new n, this.ki[s].promise) } Bi() { if (!this.ki) return; const t = this.getDistanceViewportRatio(); for (const i in this.ki) this.isWithinViewportRatio(parseFloat(i), t) && (this.ki[i].resolve(), delete this.ki[i]) } getDistanceViewportRatio() { const t = vs(this.element).getRect(), i = this.getLayoutBox(), s = this.Ei.getScrollDirection(); let e = 1, n = 0; if (t.right < i.left || t.left > i.right) return { distance: !1 }; if (t.bottom < i.top) n = i.top - t.bottom, -1 == s && (e = 2); else { if (!(t.top > i.bottom)) return { distance: !0 }; n = t.top - i.bottom, 1 == s && (e = 2) } return { distance: n, scrollPenalty: e, viewportHeight: t.height } } isWithinViewportRatio(t, i) { if ("boolean" == typeof t) return t; const { distance: s, scrollPenalty: e, viewportHeight: n } = i || this.getDistanceViewportRatio(); return "boolean" == typeof s ? s : s < n * t / e } renderOutsideViewport() { return this.Bi(), this.hasOwner() || this.isWithinViewportRatio(this.element.renderOutsideViewport()) } idleRenderOutsideViewport() { return this.isWithinViewportRatio(this.element.idleRenderOutsideViewport()) } layoutScheduled(t) { this.Mi = 3, this.element.layoutScheduleTime = t } layoutCanceled() { this.Mi = this.hasBeenMeasured() ? 2 : 1 } startLayout() { if (this.Ni) return this.Ni; if (4 == this.Mi) return e(); if (5 == this.Mi) return Promise.reject(this.Vi); if (yt(0 != this.Mi), yt(this.isDisplayed()), 3 != this.Mi) { const t = Rt().createExpectedError("startLayout called but not LAYOUT_SCHEDULED", "currently: ", this.Mi); return Vn(t, this.element), Promise.reject(t) } if (this.wi > 0 && !this.element.isRelayoutNeeded()) return this.Mi = 4, e(); this.wi++, this.Mi = 3, this.bi = new AbortController; const { signal: t } = this.bi, i = new Promise(((i, s) => { gs(this.hostWin).mutate((() => { let e; try { e = this.element.layoutCallback(t) } catch (t) { s(t) } Promise.resolve(e).then(i, s) })), t.onabort = () => s(Sn()) })).then((() => this.Hi(!0, t)), (i => this.Hi(!1, t, i))); return this.Ni = i } Hi(t, i, s) { if (this.bi = null, i.aborted) { const t = Rt().createError("layoutComplete race"); throw t.associatedElement = this.element, Rt().expectedError(Cn, t), Sn() } if (this.Ui && (this.Ui(), this.Ui = null), this.Ni = null, this.Mi = t ? 4 : 5, this.Vi = s, !t) return Promise.reject(s) } isLayoutPending() { return 4 != this.Mi && 5 != this.Mi } loadedOnce() { return this.element.R1() ? this.element.whenLoaded() : this.Li } isInViewport() { return this.$i && this.Bi(), this.$i } setInViewport(t) { this.$i = t } unlayout() { 0 != this.Mi && 1 != this.Mi && 2 != this.Mi && (this.bi && (this.bi.abort(), this.bi = null), this.setInViewport(!1), this.element.unlayoutCallback() && (this.element.togglePlaceholder(!0), this.Mi = 1, this.wi = 0, this.Ni = null)) } getTaskId(t) { return this.debugid + "#" + t } pause() { this.element.pause() } pauseOnRemove() { this.element.pause() } resume() { this.element.resume() } unload() { this.element.unmount() } disconnect() { delete this.element.__AMP__RESOURCE, this.element.disconnect(!0) } }, Nn = "ready-scan", Dn = "scheduler", Ln = "250% 31.25%"; function Un(t) { return Vi(t, Dn, class { constructor(t) { this.ji = t; const { win: i } = t; this.zi = new i.IntersectionObserver((t => this.Gi(t)), { root: qt(i) ? i.document : null, rootMargin: Ln }), this.qi = new Map, this.Wi = new Map, this.Ki = [], this.Yi = !1, t.whenReady().then((() => this.Ji())), this.Qi = t.onVisibilityChanged((() => this.Xi())) } dispose() { this.zi.disconnect(), this.Wi.clear(), this.Qi && (this.Qi(), this.Qi = null) } scheduleAsap(t) { this.Wi.set(t, { asap: !0, isIntersecting: !1 }), this.Zi(t) } schedule(t) { this.Wi.has(t) || (t.deferredMount() ? (this.Wi.set(t, { asap: !1, isIntersecting: !1 }), this.zi.observe(t), this.qi.size > 0 && this.qi.forEach(((i, s) => { Kt(s, t) && i.observe(t) }))) : this.Wi.set(t, { asap: !1, isIntersecting: !0 }), this.Zi(t)) } unschedule(t) { this.Wi.has(t) && (this.Wi.delete(t), this.zi.unobserve(t), this.qi.size > 0 && this.qi.forEach((i => { i.unobserve(t) })), this.Ki && (M(this.Ki, t), this.Ji())) } setContainer(t, i) { if (this.qi.has(t)) return; const { win: s } = this.ji, e = new s.IntersectionObserver((t => this.Gi(t)), { root: i || t, rootMargin: Ln }); this.qi.set(t, e), this.Wi.forEach((({ asap: i }, s) => { !i && Kt(t, s) && e.observe(s) })) } removeContainer(t) { const i = this.qi.get(t); i && (i.disconnect(), this.qi.delete(t)) } ts() { if (this.ji.isReady() && !this.Yi) { this.Yi = !0; const { win: t } = this.ji; t.setTimeout((() => { this.ji.signals().signal(Nn) }), 50) } } Xi() { const t = this.ji.getVisibilityState(); t != Ts.VISIBLE && t != Ts.HIDDEN && t != Ts.PRERENDER && t != Ts.PREVIEW || this.Wi.forEach(((t, i) => this.ss(i))) } Zi(t) { const i = this.Ki; i ? (i.includes(t) || i.push(t), this.Ji()) : this.ss(t) } Ji() { const t = this.ji.isReady(), i = this.Ki; if (i) for (let s = 0; s < i.length; s++) { const e = i[s]; (t || zt(e, this.ji.getRootNode())) && (i.splice(s--, 1), this.ss(e)) } t && (this.Ki = null, this.ts()) } Gi(t) { for (let i = 0; i < t.length; i++) { const { isIntersecting: s, target: e } = t[i], n = e, r = this.Wi.get(n); if (!r) continue; const h = s || r.isIntersecting; h !== r.isIntersecting && this.Wi.set(n, { asap: r.asap, isIntersecting: h }), h && this.ss(n) } } ss(t) { const i = this.Ki, s = !(i && i.includes(t)), { asap: e, isIntersecting: n } = this.Wi.get(t) || { asap: !1, isIntersecting: !1 }, r = this.ji.getVisibilityState(); if (!s || !e && !n || !(r == Ts.VISIBLE || r == Ts.HIDDEN || r == Ts.PRERENDER && t.prerenderAllowed() || r == Ts.PREVIEW && t.previewAllowed())) return; this.unschedule(t); const { win: h } = this.ji; (e || t.getBuildPriority() <= 0 ? h.setTimeout : h.requestIdleCallback || h.setTimeout)((() => t.mountInternal())) } }), xi(t, Dn) } var $n = class { constructor() { this.es = [] } peek() { const t = this.length; return t ? this.es[t - 1].item : null } enqueue(t, i) { if (isNaN(i)) throw new Error("Priority must not be NaN."); const s = this.ns(i); this.es.splice(s, 0, { item: t, priority: i }) } ns(t) { let i = -1, s = 0, e = this.length; for (; s <= e && (i = Math.floor((s + e) / 2), i !== this.length);)if (this.es[i].priority < t) s = i + 1; else { if (!(i > 0 && this.es[i - 1].priority >= t)) break; e = i - 1 } return i } forEach(t) { let i = this.length; for (; i--;)t(this.es[i].item) } dequeue() { const t = this.es.pop(); return t ? t.item : null } get length() { return this.es.length } }, Fn = /nochunking=1/.test(self.location.hash), Bn = e(); function Hn(t) { return Vi(t, "chunk", Kn), xi(t, "chunk") } function jn(t, i, s) { if (Fn) return void Bn.then(i); const e = Hn(t.documentElement || t); e.runForStartup(i), s && e.runForStartup((() => { e.rs = !0 })) } function zn(t, i, s) { Fn ? Bn.then(i) : Hn(t).run(i, s) } var Gn = "not_run", qn = class { constructor(t) { this.state = Gn, this.hs = t } os(t) { if ("run" != this.state) { this.state = "run"; try { this.hs(t) } catch (t) { throw this.us(t), t } } } ls() { return this.hs.displayName || this.hs.name } us(t) { } cs() { return !1 } ds() { return !1 } }, Wn = class extends qn { constructor(t, i, s) { super(t), this.fs = s } us(t) { Ze(self.document) } cs() { return this.ps() } ds() { return this.fs._s } ps() { return this.fs.ampdoc.isVisible() } }, Kn = class { constructor(t) { var i; this.ampdoc = t, this.i = t.win, this.As = new $n, this.gs = this.Ps.bind(this), this.vs = 0, this.Es = !(!this.i.navigator.scheduling || !this.i.navigator.scheduling.isInputPending), this.Ts = !1, this.rs = this.i.document.documentElement.hasAttribute("i-amphtml-no-boilerplate"), this.i.addEventListener("message", (t => { "amp-macro-task" == Ge(t) && this.Ps(null) })), this._s = !1, (i = t, Ci(i, "viewer")).then((() => { this._s = !0 })), t.onVisibilityChanged((() => { t.isVisible() && this.Rs() })) } run(t, i) { const s = new qn(t); this.Is(s, i) } runForStartup(t) { const i = new Wn(t, this.i, this); this.Is(i, Number.POSITIVE_INFINITY) } Is(t, i) { this.As.enqueue(t, i), this.Rs() } Ms(t) { let i = this.As.peek(); for (; i && i.state !== Gn;)this.As.dequeue(), i = this.As.peek(); return i && t && this.As.dequeue(), i } Ps(t) { const i = this.Ms(!0); if (!i) return this.Ts = !1, this.vs = 0, !1; let s; try { s = Date.now(), i.os(t) } finally { Bn.then().then().then().then().then().then().then().then().then((() => { this.Ts = !1, this.vs += Date.now() - s, this.Rs() })) } return !0 } ys(t) { if (this.rs && (this.Es ? this.i.navigator.scheduling.isInputPending() : this.vs > 5)) return this.vs = 0, void this.ws(); Bn.then((() => { this.gs(t) })) } Rs() { if (this.Ts) return; const t = this.Ms(); return t ? t.cs() ? (this.Ts = !0, void this.ys(null)) : void (t.ds() && this.i.requestIdleCallback ? function (t, i, s, e) { const n = Date.now(); t.requestIdleCallback((function i(s) { if (s.timeRemaining() < 15) { const r = 2e3 - (Date.now() - n); r <= 0 || s.didTimeout ? e(s) : t.requestIdleCallback(i, { timeout: r }) } else e(s) }), { timeout: 2e3 }) }(this.i, 0, 0, this.gs) : this.ws()) : void 0 } ws() { this.i.postMessage("amp-macro-task", "*") } }, Yn = "activate", Qn = class { static R1() { return !1 } static deferredMount(t) { return !0 } static prerenderAllowed(t) { return !1 } static previewAllowed(t) { return this.prerenderAllowed(t) } static usesLoading(t) { return !1 } static createLoaderLogoCallback(t) { return {} } static getBuildPriority(t) { return 0 } static getPreconnects(t) { return null } static requiresShadowDom() { return !1 } constructor(t) { this.element = t, this.win = wt(t), this.actionMap_ = null, this.defaultActionAlias_ = null } signals() { return this.element.signals() } getDefaultActionAlias() { return this.defaultActionAlias_ } getLayoutPriority() { return 0 } updateLayoutPriority(t) { this.element.getResources().updateLayoutPriority(this.element, t) } getLayout() { return this.element.getLayout() } getLayoutBox() { return this.element.getLayoutBox() } getLayoutSize() { return this.element.getLayoutSize() } getAmpDoc() { return this.element.getAmpDoc() } getVsync() { return gs(this.win) } getConsentPolicy() { let t = null; return this.element.hasAttribute("data-block-on-consent") && (t = this.element.getAttribute("data-block-on-consent") || "default"), t } isLayoutSupported(t) { return t == Qs } isAlwaysFixed() { return !1 } upgradeCallback() { return null } buildCallback() { } preconnectCallback(t) { } attachedCallback() { } detachedCallback() { } setAsContainer(t) { this.element.setAsContainerInternal(t) } removeAsContainer() { this.element.removeAsContainerInternal() } isBuildRenderBlocking() { return !1 } createPlaceholderCallback() { return null } renderOutsideViewport() { return "inabox" == at(this.win).runtime || 3 } idleRenderOutsideViewport() { return !1 } ensureLoaded() { } setReadyState(t, i) { this.element.setReadyStateInternal(t, i) } mountCallback(t) { } unmountCallback() { } isRelayoutNeeded() { return !1 } layoutCallback() { return e() } firstLayoutCompleted() { this.togglePlaceholder(!1) } pauseCallback() { } resumeCallback() { } unlayoutCallback() { return !1 } unlayoutOnPause() { return !1 } reconstructWhenReparented() { return !0 } loadPromise(t) { return We(t) } registerAction(t, i, s = 2) { Jn(this), this.actionMap_[t] = { handler: i, minTrust: s } } registerDefaultAction(t, i = "activate", s = 2) { yt(!this.defaultActionAlias_), this.registerAction(i, t, s), this.defaultActionAlias_ = i } executeAction(t, i) { let { method: s } = t; s === Yn && (s = this.defaultActionAlias_ || s), Jn(this); const e = this.actionMap_[s], { tagName: n } = this.element; bt(e, `Method not found: ${s} in ${n}`); const { handler: r, minTrust: h } = e; if (t.satisfiesTrust(h)) return r(t) } forwardEvents(t, i) { const s = (v(t) ? t : [t]).map((t => ze(i, t, (i => { Wt(this.element, t, Ge(i) || {}) })))); return () => s.forEach((t => t())) } getPlaceholder() { return this.element.getPlaceholder() } togglePlaceholder(t) { this.element.togglePlaceholder(t) } getFallback() { return this.element.getFallback() } toggleFallback(t) { this.element.toggleFallback(t) } toggleLoading(t, i = !1) { this.element.toggleLoading(t, i) } getOverflowElement() { return this.element.getOverflowElement() } renderStarted() { this.element.renderStarted() } getViewport() { return vs(this.getAmpDoc()) } getIntersectionElementLayoutBox() { return this.getLayoutBox() } collapse() { us(this.getAmpDoc()).collapseElement(this.element) } attemptCollapse() { return us(this.getAmpDoc()).attemptCollapse(this.element) } forceChangeHeight(t) { us(this.getAmpDoc()).forceChangeSize(this.element, t, void 0) } attemptChangeHeight(t) { return us(this.getAmpDoc()).requestChangeSize(this.element, t, void 0) } attemptChangeSize(t, i, s) { return us(this.getAmpDoc()).requestChangeSize(this.element, t, i, void 0, s) } measureElement(t) { return us(this.getAmpDoc()).measureElement(t) } mutateElement(t, i) { return this.measureMutateElement(null, t, i) } measureMutateElement(t, i, s) { return us(this.getAmpDoc()).measureMutateElement(s || this.element, t, i) } mutateElementSkipRemeasure(t) { return us(this.getAmpDoc()).mutateElement(this.element, t, !0) } collapsedCallback(t) { } expand() { us(this.getAmpDoc()).expandElement(this.element) } mutatedAttributesCallback(t) { } onLayoutMeasure() { } user() { return It(this.element) } getApi() { return this } }; function Jn(t) { t.actionMap_ || (t.actionMap_ = t.win.Object.create(null)) } var Xn, Zn = class extends Qn { }, tr = Date.now(), ir = { bubbles: !1 }, sr = () => !0, er = [], nr = new Set; function rr(t, i) { const s = function (t, i) { if (t.__AMP_BASE_CE_CLASS) return t.__AMP_BASE_CE_CLASS; const s = t.HTMLElement; return t.__AMP_BASE_CE_CLASS = class extends s { constructor() { super(), this.createdCallback() } createdCallback() { this.bs = !1, this.Vs = !1, this.Ss = null, this.xs = !1, this.Os = null, this.Cs = null, this.ks = "upgrading", this.everAttached = !1, this.ji = null, this.Ei = null, this.Ns = Qs, this.wi = 0, this.Ds = !1, this.warnOnMissingOverflow = !0, this.sizerElement = void 0, this.Ls = void 0, this.layoutScheduleTime = void 0; const i = this; let s = t.__AMP_EXTENDED_ELEMENTS && t.__AMP_EXTENDED_ELEMENTS[this.localName]; this.Us = s === Zn ? null : s || null, this.Us || er.push(this), this.$s = null, this.Fs = 1, this.Bs = 0, this.Hs = void 0, this.js = void 0, this.ei = new Ms, this.Us && this.ei.signal(Pe); const e = function (t, i) { return qi(t = Ni(t), i) ? $i(t, i) : null }(t, "performance"); this.zs = e && e.isPerformanceTrackingOn(), this.Gs = null, i.__AMP_UPG_RES && (i.__AMP_UPG_RES(i), delete i.__AMP_UPG_RES, delete i.__AMP_UPG_PRM) } get readyState() { return this.ks } signals() { return this.ei } getAmpDoc() { return yt(this.ji), this.ji } getResources() { return yt(this.Ei), this.Ei } isUpgraded() { return 2 == this.Fs } whenUpgraded() { return this.ei.whenSignal(ge) } upgrade(t) { this.js || 1 == this.Fs && (this.Us = t, this.ei.signal(Pe), this.everAttached && this.qs()) } markUnresolved() { this.Us || this.classList.add("amp-unresolved", "i-amphtml-unresolved") } getUpgradeDelayMs() { return this.Bs } Ws(i, s) { this.$s = i, this.Bs = t.Date.now() - s, this.Fs = 2, this.setReadyStateInternal(ai), this.classList.remove("amp-unresolved", "i-amphtml-unresolved"), this.Ks(), this.dispatchCustomEventForTesting(me), this.R1() || this.getResources().upgraded(this), this.ei.signal(ge) } Ks() { this.Ns != Qs && this.$s && !this.$s.isLayoutSupported(this.Ns) && (bt(this.getAttribute("layout"), "The element did not specify a layout attribute. Check https://amp.dev/documentation/guides-and-tutorials/develop/style_and_layout/control_layout and the respective element documentation for details."), bt(!1, `Layout not supported: ${this.Ns}`)) } getBuildPriority() { return this.Us ? this.Us.getBuildPriority(this) : 3 } getLayoutPriority() { return this.$s ? this.$s.getLayoutPriority() : 3 } getDefaultActionAlias() { return yt(this.isUpgraded()), this.$s.getDefaultActionAlias() } isBuilding() { return !!this.Ss } isBuilt() { return this.bs } whenBuilt() { return this.ei.whenSignal(ve) } buildInternal() { if (or(this), yt(this.Us), this.Ss) return this.Ss; this.setReadyStateInternal(ai); const t = this.Ys(); this.Js(); const i = t.then((() => { const t = this.Qs(), i = t ? null : this.Xs(); if (t || i) return (this, Ki(this, "consentPolicyManager", "amp-consent")).then((s => !s || (t ? s.whenPolicyUnblock(t) : s.whenPurposesUnblock(i)))).then((t => { if (!t) throw new Error(yn) })) })).then((() => yt(this.$s).buildCallback())); return this.Ss = i.then((() => { if (this.bs = !0, this.classList.add("i-amphtml-built"), this.classList.remove("i-amphtml-notbuilt", "amp-notbuilt"), this.ei.signal(ve), this.R1() ? this.setReadyStateInternal(this.ks != ai ? this.ks : di) : (this.setReadyStateInternal(fi), this.preconnect(!1)), this.Vs && this.L(), this.Hs && ps(wt(this)).delay(this.Zs.bind(this), 1), !this.getPlaceholder()) { const t = this.createPlaceholder(); t && this.appendChild(t) } }), (t => { throw this.ei.rejectSignal(ve, t), this.R1() && this.setReadyStateInternal(mi, t), xn(t) || Vn(t, this), t })) } build() { return this.Ss ? this.Ss : this.ei.whenSignal(Pe).then((() => (this.R1() && Un(this.getAmpDoc()).scheduleAsap(this), this.whenBuilt()))) } mountInternal() { if (this.Os) return this.Os; this.Cs = this.Cs || new AbortController; const { signal: t } = this.Cs; return this.Os = this.buildInternal().then((() => { if (yt(this.R1()), t.aborted) return; this.setReadyStateInternal(this.ks != di ? this.ks : this.Us.usesLoading(this) ? fi : di), this.xs = !0; const i = this.$s.mountCallback(t); return !!i && i.then(sr) })).then((i => { if (this.Cs = null, t.aborted) throw Sn(); this.ei.signal(Ee), this.Us.usesLoading(this) && !i || this.setReadyStateInternal(pi) })).catch((t => { var i; throw this.Cs = null, (i = t) && ("string" == typeof i ? i.startsWith(Rn) : "string" == typeof i.message && i.message.startsWith(Rn)) ? this.Os = null : (this.ei.rejectSignal(Ee, t), this.setReadyStateInternal(mi, t)), t })) } mount() { if (this.Os) return this.Os; this.Cs = this.Cs || new AbortController; const { signal: t } = this.Cs; return this.ei.whenSignal(Pe).then((() => { if (!this.R1()) return this.whenBuilt(); if (t.aborted) throw Sn(); return Un(this.getAmpDoc()).scheduleAsap(this), this.whenMounted() })) } unmount() { this.Vs && this.pause(), this.R1() ? (this.Cs && (this.Cs.abort(), this.Cs = null), Un(this.getAmpDoc()).unschedule(this), this.xs && this.$s.unmountCallback(), this.xs = !1, this.Os = null, this.ie(), this.Vs && this.qs(!0)) : this.re() } whenMounted() { return this.ei.whenSignal(Ee) } whenLoaded() { return this.ei.whenSignal(Me) } ensureLoaded(t) { return this.mount().then((() => { if (this.R1()) return this.Us.usesLoading(this) && this.$s.ensureLoaded(), this.whenLoaded(); const i = this.he(); return i.whenBuilt().then((() => { if (4 != i.getState() && ((3 != i.getState() || i.isMeasureRequested()) && i.measure(), i.isDisplayed())) return this.getResources().scheduleLayoutOrPreload(i, !0, t, !0), this.whenLoaded() })) })) } setAsContainerInternal(t) { Un(this.getAmpDoc()).setContainer(this, t) } removeAsContainerInternal() { Un(this.getAmpDoc()).removeContainer(this) } setReadyStateInternal(t, i) { if (t !== this.ks && (this.ks = t, this.R1())) switch (t) { case fi: return this.ei.signal(Te), this.ei.reset(Re), this.ei.reset(Me), this.classList.add("i-amphtml-layout"), this.toggleLoading(!0), void this.dispatchCustomEventForTesting(_e); case pi: return this.ei.signal(Te), this.ei.signal(Me), this.ei.reset(Re), this.classList.add("i-amphtml-layout"), this.toggleLoading(!1), Wt(this, "load", null, ir), void this.dispatchCustomEventForTesting(Ae); case mi: return this.ei.rejectSignal(Me, i), this.toggleLoading(!1), void Wt(this, "error", i, ir) } } preconnect(t) { yt(this.isUpgraded()), t ? this.$s.preconnectCallback(t) : jn(this.getAmpDoc(), (() => { this.ownerDocument && this.ownerDocument.defaultView && this.$s.preconnectCallback(t) })) } R1() { return !!this.Us && this.Us.R1() } deferredMount() { return !!this.Us && this.Us.deferredMount(this) } isAlwaysFixed() { return !!this.$s && this.$s.isAlwaysFixed() } updateLayoutBox(t, i = !1) { this.isBuilt() && this.onMeasure(i) } onMeasure() { yt(this.isBuilt()); try { this.$s.onLayoutMeasure() } catch (t) { Vn(t, this) } } Js() { var t; return void 0 !== this.sizerElement || this.Ns !== Zs && this.Ns !== ne || (this.sizerElement = this.querySelector("i-amphtml-sizer"), null === (t = this.sizerElement) || void 0 === t || t.setAttribute("slot", "i-amphtml-svc")), this.sizerElement || null } oe(t) { if (this.Ns !== Zs) if (this.Ns !== ne); else { const i = t.querySelector(".i-amphtml-intrinsic-sizer"); if (!i) return; i.setAttribute("src", "") } else Ss(t, "paddingTop", "0") } ue() { const t = this.hasAttribute("media") || this.hasAttribute("sizes") && !this.hasAttribute("disable-inline-width") || this.hasAttribute("heights"), i = !!this.Gs, s = this.ownerDocument.defaultView; t != i && s && (t ? (this.Gs = new class { constructor(t, i) { this.i = t, this.It = i, this.le = {}, this.ce = null } start() { this.ce = this.le, this.le = {} } resolveMatchQuery(t) { return "1" === this.ae(t, ye, "1") } resolveListQuery(t) { return this.ae(t, be, "") } complete() { for (const t in this.ce) t in this.le || we(this.ce[t], this.It, !1); this.ce = null } dispose() { for (const t in this.le) we(this.le[t], this.It, !1); this.le = {} } ae(t, i, s) { if (!t.trim()) return s; let e = this.le[t]; return e || (D(this.ce), e = this.ce[t]), e || (e = i(this.i, t), we(e, this.It, !0)), this.le[t] = e, function (t) { for (let i = 0; i < t.length; i++) { const { query: s, value: e } = t[i]; if (!s || s.matches) return e } return "" }(e) } }(s, (() => this.de())), this.de()) : this.fe()) } fe() { this.Gs && (this.Gs.dispose(), this.Gs = null) } de() { const t = this.Gs; if (!t) return; t.start(); const i = this.getAttribute("media") || null, s = !i || t.resolveMatchQuery(i); this.classList.toggle("i-amphtml-hidden-by-media-query", !s); const e = this.hasAttribute("disable-inline-width") ? null : this.getAttribute("sizes"); e && Ss(this, "width", t.resolveListQuery(e)); const n = this.Ns === Zs ? this.getAttribute("heights") : null; if (n) { const i = this.Js(); i && Ss(i, "paddingTop", t.resolveListQuery(n)) } t.complete(), this.he().requestMeasure() } applySize(t, i, s) { const e = this.Js(); e && (this.sizerElement = null, this.oe(e), this.pe((() => { e && Bt(e) }))), void 0 !== t && Ss(this, "height", t, "px"), void 0 !== i && Ss(this, "width", i, "px"), s && (null != s.top && Ss(this, "marginTop", s.top, "px"), null != s.right && Ss(this, "marginRight", s.right, "px"), null != s.bottom && Ss(this, "marginBottom", s.bottom, "px"), null != s.left && Ss(this, "marginLeft", s.left, "px")), this.me() && this._e(), Wt(this, "amp:size-changed") } connectedCallback() { if (function () { if (void 0 === Xn) { const t = self.document.createElement("template"); Xn = "content" in t } return Xn }() || void 0 !== this.js || (this.js = !!Ct(this, "template")), !this.js && !this.Vs && Ht(this)) { if (this.Vs = !0, this.everAttached || this.classList.add("i-amphtml-element", "i-amphtml-notbuilt", "amp-notbuilt"), !this.ji) { const t = wt(this), s = is(t).getAmpDoc(this); this.ji = s, i(s, this, this.Us) } if (this.Ei || (this.Ei = ds(this.ji)), this.getResources().add(this), this.everAttached) { const t = this.reconstructWhenReparented(); t && this.ie(), this.isUpgraded() && (t && !this.R1() && this.getResources().upgraded(this), this.L(), this.dispatchCustomEventForTesting(me)), this.Us && this.R1() && this.qs() } else { this.everAttached = !0; try { this.Ns = function (t) { const i = t.getAttribute("i-amphtml-layout"); if (i) { const e = he(i); var s; return D(e), e != Zs && e != ne || !t.firstElementChild ? e == Qs && Os(t, !1) : (t.sizerElement = t.querySelector("i-amphtml-sizer") || void 0, null === (s = t.sizerElement) || void 0 === s || s.setAttribute("slot", "i-amphtml-svc")), e } const { height: e, layout: n, width: r } = Ce(t); if (t.classList.add(oe(n)), ue(n) && t.classList.add("i-amphtml-layout-size-defined"), n == Qs) Os(t, !1); else if (n == Js) xs(t, { width: U(r), height: U(e) }); else if (n == Xs) Ss(t, "height", U(e)); else if (n == Zs) { const i = t.ownerDocument.createElement("i-amphtml-sizer"); i.setAttribute("slot", "i-amphtml-svc"); const s = ae(e), n = ae(r); $(s), $(n), xs(i, { paddingTop: s / n * 100 + "%" }), t.insertBefore(i, t.firstChild), t.sizerElement = i } else if (n == ne) { const i = Ve(t)(xe), s = i.firstElementChild; L(s), s.setAttribute("src", `data:image/svg+xml;charset=utf-8,`), t.insertBefore(i, t.firstChild), t.sizerElement = i } else n == ie || n == te || (n == se ? (r && Ss(t, "width", r), e && Ss(t, "height", e)) : n == ee && (t.classList.add("i-amphtml-layout-awaiting-size"), r && Ss(t, "width", r), Ss(t, "height", 0))); return t.setAttribute("i-amphtml-layout", n), n }(this), this.ue() } catch (t) { Vn(t, this) } this.Us ? this.qs() : (nr.has("*") || nr.has(this.tagName.toLowerCase())) && this.markUnresolved(), this.isUpgraded() || this.dispatchCustomEventForTesting("amp:stubbed") } this.toggleLoading(!0) } } me() { return this.classList.contains("i-amphtml-layout-awaiting-size") } _e() { this.classList.remove("i-amphtml-layout-awaiting-size") } qs(t) { if (this.R1()) { if (!this.Os) if (Un(this.getAmpDoc()).schedule(this), this.classList.remove("amp-unresolved", "i-amphtml-unresolved"), this.Ss) this.setReadyStateInternal(this.Us && this.Us.usesLoading(this) ? fi : di); else if (this.setReadyStateInternal(ai), !t) { const t = this.Us.getPreconnects(this); if (t && t.length > 0) { const i = this.getAmpDoc(); jn(i, (() => { const { win: s } = i; if (!s) return; const e = as(s); t.forEach((t => e.url(i, t, !1))) })) } } } else this.Ae() } Ae() { if (this.js) return; if (1 != this.Fs) return; const i = new (yt(this.Us))(this); this.Fs = 4; const s = t.Date.now(), e = i.upgradeCallback(); if (e) { if ("function" == typeof e.then) return e.then((t => { this.Ws(t || i, s) })).catch((t => { this.Fs = 3, l(t) })); this.Ws(e, s) } else this.Ws(i, s) } disconnectedCallback() { this.disconnect(!1) } L() { this.bs && this.$s.attachedCallback() } disconnect(t) { !this.js && this.Vs && (!t && Ht(this) || (t && this.classList.remove("i-amphtml-element"), this.Vs = !1, this.getResources().remove(this), this.$s && this.$s.detachedCallback(), this.R1() && this.unmount(), this.toggleLoading(!1), this.fe())) } dispatchCustomEventForTesting(t, i) { } prerenderAllowed() { return !this.hasAttribute("noprerender") && !!this.Us && this.Us.prerenderAllowed(this) } previewAllowed() { return !!this.Us && this.Us.previewAllowed(this) } isBuildRenderBlocking() { return !!this.$s && this.$s.isBuildRenderBlocking() } createPlaceholder() { return this.$s ? this.$s.createPlaceholderCallback() : null } createLoaderLogo() { return this.Us ? this.Us.createLoaderLogoCallback(this) : {} } renderOutsideViewport() { return !!this.$s && this.$s.renderOutsideViewport() } idleRenderOutsideViewport() { return !!this.$s && this.$s.idleRenderOutsideViewport() } getLayoutBox() { return this.he().getLayoutBox() } getLayoutSize() { return this.he().getLayoutSize() } getOwner() { return this.he().getOwner() } getIntersectionChangeEntry() { const t = this.$s ? this.$s.getIntersectionElementLayoutBox() : this.getLayoutBox(), i = this.getOwner(), s = vs(this.getAmpDoc()).getRect(); return function (t, i, s) { const e = function (t) { let i = -1 / 0, s = 1 / 0, e = -1 / 0, n = 1 / 0; for (let t = 0; t < arguments.length; t++) { const r = arguments[t]; if (r && (i = Math.max(i, r.left), s = Math.min(s, r.left + r.width), e = Math.max(e, r.top), n = Math.min(n, r.top + r.height), s < i || n < e)) return null } return s == 1 / 0 ? null : Jt(i, e, s - i, n - e) }(t, i, s) || Jt(0, 0, 0, 0); return function (t, i, s, e) { let n = t, r = i; return i && (s = Zt(s, -i.left, -i.top), n = Zt(n, -i.left, -i.top), r = Zt(r, -i.left, -i.top)), { time: "undefined" != typeof performance && performance.now ? performance.now() : Date.now() - tr, rootBounds: r, boundingClientRect: n, intersectionRect: s, intersectionRatio: e } }(t, s, e, function (t, i) { const s = t.width * t.height, e = i.width * i.height; return 0 === e ? 0 : s / e }(e, t)) }(t, i && i.getLayoutBox(), s) } he() { return this.getResources().getResourceForElement(this) } getResourceId() { return this.he().getId() } isRelayoutNeeded() { return !!this.$s && this.$s.isRelayoutNeeded() } getImpl(t = !0) { return (t ? this.build() : this.Ys()).then((() => this.$s)) } Ys() { return this.ei.whenSignal(Pe).then((() => (this.Ae(), this.whenUpgraded()))) } getApi() { return this.getImpl().then((t => t.getApi())) } getLayout() { return this.Ns } layoutCallback(t) { if (or(this), yt(this.isBuilt()), t.aborted) return Promise.reject(Sn()); this.dispatchCustomEventForTesting(_e); const i = 0 == this.wi; this.ei.reset(Re), i && this.ei.signal(Te), this.toggleLoading(!0); const s = r((() => this.$s.layoutCallback())); return this.preconnect(!0), this.classList.add("i-amphtml-layout"), s.then((() => { if (t.aborted) throw Sn(); i && this.ei.signal(Me), this.setReadyStateInternal(pi), this.wi++, this.toggleLoading(!1), this.Ds || (this.$s.firstLayoutCompleted(), this.Ds = !0, this.dispatchCustomEventForTesting(Ae)) }), (s => { if (t.aborted) throw Sn(); throw i && this.ei.rejectSignal(Me, s), this.setReadyStateInternal(mi, s), this.wi++, this.toggleLoading(!1), s })) } pause() { this.isBuilt() && (this.$s.pauseCallback(), !this.R1() && this.$s.unlayoutOnPause() && this.re()) } resume() { this.isBuilt() && this.$s.resumeCallback() } unlayoutCallback() { if (or(this), !this.isBuilt()) return !1; this.ei.signal(Re); const t = this.$s.unlayoutCallback(); return t && this.ie(), this.dispatchCustomEventForTesting("amp:unload"), t } re() { this.he().unlayout(), this.Vs && this.Ei && this.Ei.schedulePass() } ie() { this.wi = 0, this.Ds = !1, this.ei.reset(Ee), this.ei.reset(Ie), this.ei.reset(Te), this.ei.reset(Me), this.ei.reset("ini-load") } reconstructWhenReparented() { return !!this.$s && this.$s.reconstructWhenReparented() } collapse() { this.$s && this.$s.collapse() } collapsedCallback(t) { this.$s && this.$s.collapsedCallback(t) } expand() { this.$s && this.$s.expand() } mutatedAttributesCallback(t) { this.$s ? this.$s.mutatedAttributesCallback(t) : this.R1() && Un(this).scheduleAsap(this) } enqueAction(t) { or(this), this.isBuilt() ? this.ge(t, !1) : (void 0 === this.Hs && (this.Hs = []), yt(this.Hs).push(t), this.build()) } Zs() { if (!this.Hs) return; const t = yt(this.Hs); this.Hs = null, t.forEach((t => { this.ge(t, !0) })) } ge(t, i) { try { this.$s.executeAction(t, i) } catch (i) { l("Action execution failed:", i, t.node.tagName, t.method) } } Qs() { let t = this.getAttribute("data-block-on-consent"); if (null === t) { if (!function (t) { let i = t.getAmpDoc().getMetaByName("amp-consent-blocking"); return !!i && (i = i.toUpperCase().replace(/\s+/g, ""), i.split(",").includes(t.tagName)) }(this)) return null; t = "default", this.setAttribute("data-block-on-consent", t) } return "" == t || "default" == t ? yt(this.$s).getConsentPolicy() : t } Xs() { var t; const i = this.getAttribute("data-block-on-consent-purposes") || null; return null == i || null === (t = i.replace(/\s+/g, "")) || void 0 === t ? void 0 : t.split(",") } getPlaceholder() { return kt(this, (t => t.hasAttribute("placeholder") && !hr(t))) } togglePlaceholder(t) { if (or(this), t) { const t = this.getPlaceholder(); t && t.classList.remove("amp-hidden") } else { const t = (this, xt("placeholder"), "> [placeholder]", this.querySelectorAll(Vt("> [placeholder]", ":scope"))); for (let i = 0; i < t.length; i++)hr(t[i]) || t[i].classList.add("amp-hidden") } } getFallback() { return Nt(this, "fallback") } toggleFallback(t) { or(this); const i = this.he().getState(); if ((this.R1() || !t || 0 != i && 1 != i && 2 != i) && (this.classList.toggle("amp-notsupported", t), 1 == t)) { const t = this.getFallback(); t && (s = this.getAmpDoc(), xi(s, "owners")).scheduleLayout(this, t) } var s } renderStarted() { this.ei.signal(Ie), this.togglePlaceholder(!1), this.toggleLoading(!1) } Pe(t) { const i = this.wi > 0 || this.ei.get(Ie); return !(this.Ns == Qs || this.hasAttribute("noloading") || i && !t || !function (t) { const i = t.tagName.toUpperCase(); return "AMP-AD" === (s = i) || "AMP-ANIM" === s || "AMP-EMBED" === s || "AMP-FACEBOOK" === s || "AMP-FACEBOOK-COMMENTS" === s || "AMP-FACEBOOK-PAGE" === s || "AMP-GOOGLE-DOCUMENT-EMBED" === s || "AMP-IFRAME" === s || "AMP-IMG" === s || "AMP-INSTAGRAM" === s || "AMP-LIST" === s || "AMP-PINTEREST" === s || "AMP-PLAYBUZZ" === s || "AMP-RENDER" === s || "AMP-TIKTOK" === s || "AMP-TWITTER" === s || function (t) { return "AMP-VIDEO" != t && re.test(t) }(i); var s }(this) || Dt(this)) } toggleLoading(t, i = !1) { if (!this.ownerDocument || !this.ownerDocument.defaultView) return; const s = Oi(this.getAmpDoc(), "loadingIndicator"); s && ((t = t && this.Pe(i)) ? s.track(this) : s.untrack(this)) } getOverflowElement() { return void 0 === this.Ls && (this.Ls = Nt(this, "overflow"), this.Ls && (this.Ls.hasAttribute("tabindex") || this.Ls.setAttribute("tabindex", "0"), this.Ls.hasAttribute("role") || this.Ls.setAttribute("role", "button"))), this.Ls } overflowCallback(t, i, s) { this.getOverflowElement(), this.Ls ? (this.Ls.classList.toggle("amp-visible", t), this.Ls.onclick = t ? () => { const t = us(this.getAmpDoc()); t.forceChangeSize(this, i, s), t.mutateElement(this, (() => { this.overflowCallback(!1, i, s) })) } : null) : t && this.warnOnMissingOverflow } pe(t, i, s = !1) { this.ji ? us(this.getAmpDoc()).mutateElement(i || this, t, s) : t() } }, t.__AMP_BASE_CE_CLASS }(t, i); class e extends s { adoptedCallback() { Object.getPrototypeOf(this) !== n && Object.setPrototypeOf(this, n) } } const n = e.prototype; return e } function hr(t) { return "placeholder" in t } function or(t) { yt(!t.js) } function ur(t) { nr.add(t || "*"); for (const i of er) null != t && i.tagName.toLowerCase() !== t || i.markUnresolved() } var lr = new WeakMap; function cr(t) { return t.__AMP_EXTENDED_ELEMENTS || (t.__AMP_EXTENDED_ELEMENTS = {}), t.__AMP_EXTENDED_ELEMENTS } function ar(t, i, s) { const e = cr(t); if (e[i]) { if (e[i] != s) { bt(e[i] == Zn, "%s is already registered. The script tag for %s is likely included twice in the page.", i, i), e[i] = s; for (let e = 0; e < er.length; e++) { const n = er[e]; n.tagName.toLowerCase() == i && n.ownerDocument.defaultView == t && (dr(n, s), er.splice(e--, 1)) } } } else _r(t, i, s) } function dr(t, i) { try { t.upgrade(i) } catch (i) { Vn(i, t) } } function fr(t) { (function (t) { if (!t) return []; const i = t.querySelectorAll("script[custom-element],script[custom-template]"), s = []; for (let t = 0; t < i.length; t++) { const e = i[t], n = e.getAttribute("custom-element") || e.getAttribute("custom-template"), r = Mi(e.src); n && r && s.push({ script: e, extensionId: n, extensionVersion: r.extensionVersion }) } return s })(t.getHeadNode()).forEach((({ extensionId: i, extensionVersion: s, script: e }) => { t.declareExtension(i, s), e.addEventListener("error", (() => ur(i))), pr(t.win, i) })), t.isBodyAvailable() && t.setExtensionsKnown() } function pr(t, i) { cr(t)[i] || _r(t, i, Zn) } function mr(t, i, s) { _r(i, s, cr(t)[s] || Zn) } function _r(t, i, s) { cr(t)[i] = s; const e = rr(t, Ar); t.customElements.define(i, e) } function Ar(t, i, s) { lr.has(t) || (lr.set(t, !0), fr(t)); const e = i.localName; s || t.declaresExtension(e) || hs(t.win).installExtensionForDoc(t, e, "0.1") } var Pr = "amp-img", gr = ["alt", "aria-describedby", "aria-label", "aria-labelledby", "crossorigin", "referrerpolicy", "title", "importance", "sizes", "srcset", "src"], vr = class t extends Qn { static R1() { return !1 } static prerenderAllowed() { return !0 } static usesLoading() { return !0 } static getPreconnects(t) { const i = t.getAttribute("src"); if (i) return [i]; const s = t.getAttribute("srcset"); if (s) { const t = /\S+/.exec(s); if (t) return [t[0]] } return null } constructor(t) { super(t), this.ve = !0, this.Ee = null, this.Te = null, this.Re = null, this.Ie = 0 } mutatedAttributesCallback(i) { if (this.Ee) { const s = gr.filter((t => void 0 !== i[t])); i.src && !i.srcset && this.element.hasAttribute("srcset") && (this.element.removeAttribute("srcset"), s.push("srcset"), this.user().warn(Pr, "Removed [srcset] since [src] was mutated. Recommend adding a [srcset] binding to support responsive images.", this.element)), fe(s, this.element, this.Ee, !0), this.propagateDataset(this.Ee), t.R1() && !this.Ee.complete && this.setReadyState(fi) } } preconnectCallback(t) { const i = this.element.getAttribute("src"); if (i) as(this.win).url(this.getAmpDoc(), i, t); else { const i = this.element.getAttribute("srcset"); if (!i) return; const s = /\S+/.exec(i); s && as(this.win).url(this.getAmpDoc(), s[0], t) } } isLayoutSupported(t) { return ue(t) } Me() { if (this.Ee) return this.Ee; this.ve = !this.element.hasAttribute("fallback"); const t = Yt(this.element); var i, s; return t && (this.Ee = Ot(this.element, "> img:not([placeholder])")), this.Ee = this.Ee || new Image, this.Ee.setAttribute("decoding", "async"), this.element.id && this.Ee.setAttribute("amp-img-id", this.element.id), "img" == this.element.getAttribute("role") && (this.element.removeAttribute("role"), this.user().error(Pr, "Setting role=img on amp-img elements breaks screen readers please just set alt or ARIA attributes, they will be correctly propagated for the underlying element.")), this.ye(!0), fe(gr, this.element, this.Ee), this.propagateDataset(this.Ee), de(this.Ee, !0), i = this.element, s = this.Ee, i.hasAttribute("object-fit") && Ss(s, "object-fit", i.getAttribute("object-fit")), i.hasAttribute("object-position") && Ss(s, "object-position", i.getAttribute("object-position")), t || this.element.appendChild(this.Ee), this.Ee } ye(t) { if (!this.Ee) return; if (this.element.hasAttribute("i-amphtml-ssr")) return; if (this.element.hasAttribute("sizes") || this.Ee.hasAttribute("sizes")) return; const i = this.element.getAttribute("srcset"); if (!i || /[0-9]+x(?:,|$)/.test(i)) return; const { width: s } = this.element.getLayoutSize(); if (!this.we(s)) return; const e = this.getViewport().getWidth(), n = `(max-width: ${e}px) ${s}px, `; let r = s + "px"; if (this.getLayout() !== Js) { const t = Math.round(100 * s / e); r = Math.max(t, 100) + "vw" } const h = n + r; t ? this.Ee.setAttribute("sizes", h) : this.mutateElement((() => { this.Ee.setAttribute("sizes", h) })), this.Ie = s } we(t) { return !this.Ee.hasAttribute("sizes") || t > this.Ie } reconstructWhenReparented() { return !1 } mountCallback() { const t = !!this.Ee, i = this.Me(); t || (ze(i, "load", (() => { this.setReadyState(pi), this.firstLayoutCompleted(), this.be() })), ze(i, "error", (t => { this.setReadyState(mi, t), this.Ve() }))), i.complete ? (this.setReadyState(pi), this.firstLayoutCompleted(), this.be()) : this.setReadyState(fi) } unmountCallback() { const t = this.Ee; t && !t.complete && (t.src = "data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=", Bt(t), this.Ee = null) } ensureLoaded() { this.Ee.loading = "eager" } layoutCallback() { this.Me(); const t = this.Ee; this.Te = ze(t, "load", (() => this.be())), this.Re = ze(t, "error", (() => this.Ve())); const { width: i } = this.element.getLayoutSize(); return i <= 0 ? e() : this.loadPromise(t) } unlayoutCallback() { if (t.R1()) return; this.Re && (this.Re(), this.Re = null), this.Te && (this.Te(), this.Te = null); const i = this.Ee; return i && !i.complete && (i.src = "data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=", Bt(i), this.Ee = null), !0 } firstLayoutCompleted() { const t = this.getPlaceholder(); t && t.classList.contains("i-amphtml-blurry-placeholder") ? Vs(t, { "opacity": 0 }) : this.togglePlaceholder(!1) } be() { !this.ve && this.Ee.classList.contains("i-amphtml-ghost") && (this.Ee.classList.remove("i-amphtml-ghost"), this.toggleFallback(!1)) } Ve() { this.ve && (this.Ee.classList.add("i-amphtml-ghost"), this.toggleFallback(!0), this.togglePlaceholder(!1), this.ve = !1) } propagateDataset(t) { for (const i in t.dataset) i in this.element.dataset || delete t.dataset[i]; for (const i in this.element.dataset) i.startsWith("ampBind") && "ampBind" !== i || t.dataset[i] !== this.element.dataset[i] && (t.dataset[i] = this.element.dataset[i]) } }, Er = class extends Qn { static prerenderAllowed() { return !0 } isLayoutSupported(t) { return t == te || ue(t) } buildCallback() { !function (t) { if (Yt(t)) return; const i = function (t) { var i; return he(null !== (i = t.getAttribute("layout")) && void 0 !== i ? i : "") || Ce(t).layout }(t); if (i == te) return; const s = t.ownerDocument.createElement("div"); de(s), function (t) { return function (t, i) { const s = []; for (let i = t.firstChild; i; i = i.nextSibling)!Dt(i) && s.push(i); return s }(t) }(t).forEach((t => { s.appendChild(t) })), t.appendChild(s) }(this.element) } }; function Tr(t, i, s = !1, e) { const n = new ($s.getImage(t)); s && (n.referrerPolicy = "no-referrer"); let r = 0; var h; return null != e && ((null === (h = t.document.featurePolicy) || void 0 === h ? void 0 : h.allowedFeatures().includes("attribution-reporting")) ? (r = 6, e = Ir(t, r)(e), n.attributionSrc = e) : r = 5), i = Ir(t, r)(i), n.src = i, n } function Ir(t, i) { const s = { "ATTRIBUTION_REPORTING_STATUS": () => i }, e = ms(t.document), n = { "ATTRIBUTION_REPORTING_STATUS": !0 }; return t => e.expandUrlSync(t, s, n) } var Mr = "amp-pixel", Rr = class extends Qn { constructor(t) { super(t), this.Se = null } isLayoutSupported(t) { return !0 } buildCallback() { this.element.setAttribute("aria-hidden", "true"), this.xe = this.element.getAttribute("referrerpolicy"), this.xe && bt("no-referrer" == this.xe, `${Mr}: invalid "referrerpolicy" value "${this.xe}". Only "no-referrer" is supported`), this.element.hasAttribute("i-amphtml-ssr") && this.element.querySelector("img") || this.getAmpDoc().whenFirstVisible().then(this.Oe.bind(this)) } Oe() { if (this.Se) return Rt().error(Mr, "duplicate pixel"), this.Se; this.Se = ps(this.win).promise(1).then((() => { const t = this.element.getAttribute("src"); if (t) return ms(this.element).expandUrlAsync(this.Ce(t)).then((t => { if (this.win) return function (t, i, s, e) { return s && "no-referrer" !== s && It().error("pixel", "Unsupported referrerPolicy: %s", s), "no-referrer" === s ? function (t, i, s) { if ("referrerPolicy" in Image.prototype) return Tr(t, i, !0, s); { const s = (e = { "src": "about:blank", "style": "display:none" }, function (t, i) { for (const s in i) t.setAttribute(s, i[s]); return t }(t.document.createElement("iframe"), e)); return s.onload = () => { Tr(s.contentWindow, i) }, t.document.body.appendChild(s), s } var e }(t, i, e) : Tr(t, i, !1, e) }(this.win, t, this.xe, this.element.getAttribute("attributionsrc")) })) })) } Ce(t) { return bt(/^(https\:\/\/|\/\/)/i.test(t), 'The src attribute must start with "https://" or "//". Invalid value: ' + t), t } }, yr = class { constructor(t, i, s) { this.ke = ps(t), this.Ne = i, this.De = s || 0, this.Le = -1, this.Ue = 0, this.$e = !1, this.Fe = () => { this.Be() } } isPending() { return -1 != this.Le } schedule(t) { let i = t || this.De; this.$e && i < 10 && (i = 10); const s = Date.now() + i; return (!this.isPending() || s - this.Ue < -10) && (this.cancel(), this.Ue = s, this.Le = this.ke.delay(this.Fe, i), !0) } Be() { this.Le = -1, this.Ue = 0, this.$e = !0, this.Ne(), this.$e = !1 } cancel() { this.isPending() && (this.ke.cancel(this.Le), this.Le = -1) } }; function br(t, i) { const s = i.documentElement; return t.some((t => s.hasAttribute(t))) } function wr(t) { return br(["⚡4email", "amp4email"], t) } function Vr(t) { return br(["⚡", "amp"], t) } var Sr = "Action", xr = "__AMP_ACTION_MAP__" + Math.random(), Or = "__AMP_ACTION_QUEUE__", Cr = "__AMP_ACTION_HANDLER__", kr = { "form": ["submit", "clear"] }, Nr = [{ tagOrTarget: "AMP", method: "setState" }, { tagOrTarget: "*", method: "focus" }, { tagOrTarget: "*", method: "hide" }, { tagOrTarget: "*", method: "show" }, { tagOrTarget: "*", method: "toggleClass" }, { tagOrTarget: "*", method: "toggleChecked" }, { tagOrTarget: "*", method: "toggleVisibility" }], Dr = { "button": !0, "checkbox": !0, "link": !0, "listbox": !0, "menuitem": !0, "menuitemcheckbox": !0, "menuitemradio": !0, "option": !0, "radio": !0, "scrollbar": !0, "slider": !0, "spinbutton": !0, "switch": !0, "tab": !0, "treeitem": !0 }, Lr = class { constructor(t, i, s, e, n, r, h, o = "?", u = null, l = Math.random()) { this.node = t, this.method = i, this.args = s, this.source = e, this.caller = n, this.event = r, this.trust = h, this.actionEventType = o, this.tagOrTarget = u || t.tagName, this.sequenceId = l } satisfiesTrust(t) { if (!w(this.trust)) return Rt().error(Sr, `Invalid trust for '${this.method}': ${this.trust}`), !1; if (this.trust < t) { const t = function (t) { switch (t) { case 1: return "low"; case 3: return "high"; default: return D(2 === t), "default" } }(this.trust); return It().error(Sr, `"${this.actionEventType}" event with "${t}" trust is not allowed to invoke "${this.tagOrTarget.toLowerCase()}.${this.method}".`), !1 } return !0 } }; function Ur(t) { return "amp-" === t.substring(0, 4) } var $r = class { constructor(t) { this.detail = null, function (t, i) { const s = i || p(); for (const i in t) { const e = t[i]; s[i] = "function" == typeof e ? Fr : t[i] } }(t, this) } }; function Fr() { yt(null) } function Br(t, i) { const s = jr.bind(null, t, i), e = zr.bind(null, t, i); let n = null; const r = new Wr(t); let h, o; do { if (h = r.next(), h.type == Gr.EOF || h.type == Gr.SEPARATOR && ";" == h.value); else if (h.type == Gr.LITERAL || h.type == Gr.ID) { const i = h.value; e(r.next(), [Gr.SEPARATOR], ":"); const u = []; do { const n = e(r.next(), [Gr.LITERAL, Gr.ID]).value; let h = Yn, l = null; o = r.peek(), o.type == Gr.SEPARATOR && "." == o.value && (r.next(), h = e(r.next(), [Gr.LITERAL, Gr.ID]).value || h, o = r.peek(), o.type == Gr.SEPARATOR && "(" == o.value && (r.next(), l = Hr(r, e, s))), u.push({ event: i, target: n, method: h, args: l, str: t }), o = r.peek() } while (o.type == Gr.SEPARATOR && "," == o.value && r.next()); n || (n = p()), n[i] = u } else s(!1, `; unexpected token [${h.value || ""}]`) } while (h.type != Gr.EOF); return n } function Hr(t, i, s) { let e, n = t.peek(), r = null; if (n.type == Gr.OBJECT) { r = p(); const { value: s } = t.next(); r.__AMP_OBJECT_STRING__ = s, i(t.next(), [Gr.SEPARATOR], ")") } else do { e = t.next(); const { type: o, value: u } = e; if (o != Gr.SEPARATOR || "," != u && ")" != u) if (o == Gr.LITERAL || o == Gr.ID) { i(t.next(), [Gr.SEPARATOR], "="), e = i(t.next(!0), [Gr.LITERAL, Gr.ID]); const o = [e]; if (e.type == Gr.ID) for (n = t.peek(); n.type == Gr.SEPARATOR && "." == n.value; n = t.peek())t.next(), e = i(t.next(!1), [Gr.ID]), o.push(e); const l = 0 == (h = o).length ? null : 1 == h.length ? h[0].value : { expression: h.map((t => t.value)).join(".") }; r || (r = p()), r[u] = l, n = t.peek(), s(n.type == Gr.SEPARATOR && ("," == n.value || ")" == n.value), "Expected either [,] or [)]") } else s(!1, `; unexpected token [${e.value || ""}]`) } while (e.type != Gr.SEPARATOR || ")" != e.value); var h; return r } function jr(t, i, s, e) { return bt(s, "Invalid action definition in %s: [%s] %s", i, t, e || "") } function zr(t, i, s, e, n) { return void 0 !== n ? jr(t, i, e.includes(s.type) && s.value == n, `; expected [${n}]`) : jr(t, i, e.includes(s.type)), s } var Gr = { INVALID: 0, EOF: 1, SEPARATOR: 2, LITERAL: 3, ID: 4, OBJECT: 5 }, qr = " \t\n\r\f\v \u2028\u2029", Wr = class { constructor(t) { this.He = t, this.je = -1 } next(t) { const i = this.ze(t || !1); return this.je = i.index, i } peek(t) { return this.ze(t || !1) } ze(t) { let i = this.je + 1; if (i >= this.He.length) return { type: Gr.EOF, index: this.je }; let s = this.He.charAt(i); if (-1 != qr.indexOf(s)) { for (i++; i < this.He.length && -1 != qr.indexOf(this.He.charAt(i)); i++); if (i >= this.He.length) return { type: Gr.EOF, index: i }; s = this.He.charAt(i) } if (t && (Kr(s) || "." == s && i + 1 < this.He.length && Kr(this.He[i + 1]))) { let t = "." == s, e = i + 1; for (; e < this.He.length; e++) { const i = this.He.charAt(e); if ("." != i) { if (!Kr(i)) break } else t = !0 } const n = this.He.substring(i, e), r = t ? parseFloat(n) : parseInt(n, 10); return i = e - 1, { type: Gr.LITERAL, value: r, index: i } } if (-1 != ";:.()=,|!".indexOf(s)) return { type: Gr.SEPARATOR, value: s, index: i }; if (-1 != "\"'".indexOf(s)) { let t = -1; for (let e = i + 1; e < this.He.length; e++)if (this.He.charAt(e) == s) { t = e; break } if (-1 == t) return { type: Gr.INVALID, index: i }; const e = this.He.substring(i + 1, t); return i = t, { type: Gr.LITERAL, value: e, index: i } } if ("{" == s) { let t = 1, s = -1; for (let e = i + 1; e < this.He.length; e++) { const i = this.He[e]; if ("{" == i ? t++ : "}" == i && t--, t <= 0) { s = e; break } } if (-1 == s) return { type: Gr.INVALID, index: i }; const e = this.He.substring(i, s + 1); return i = s, { type: Gr.OBJECT, value: e, index: i } } let e = i + 1; for (; e < this.He.length && -1 == " \t\n\r\f\v \u2028\u2029;:.()=,|!\"'{}".indexOf(this.He.charAt(e)); e++); const n = this.He.substring(i, e); if (i = e - 1, t && ("true" == n || "false" == n)) { const t = "true" == n; return { type: Gr.LITERAL, value: t, index: i } } return Kr(n.charAt(0)) ? { type: Gr.LITERAL, value: n, index: i } : { type: Gr.ID, value: n, index: i } } }; function Kr(t) { return t >= "0" && t <= "9" } function Yr(t) { return !!t && "function" == typeof t.getFormData } var Qr = ["GET", "POST"], Jr = [v, f]; function Xr(t, i) { const s = g({}, i); if (Yr(i.body)) { const t = i.body; s.headers["Content-Type"] = "multipart/form-data;charset=utf-8", s.body = function (t) { const i = []; for (let s = t.next(); !s.done; s = t.next())i.push(s.value); return i }(t.entries()) } return { input: t, init: s } } function Zr(t, i) { const s = t || {}, e = s.credentials; return D(void 0 === e || "include" == e || "omit" == e), s.method = void 0 === (n = s.method) ? "GET" : (n = n.toUpperCase(), D(Qr.includes(n)), n), s.headers = s.headers || {}, i && (s.headers.Accept = i), D(null !== s.body), s; var n } function th(t) { return new Promise((i => { if (t.ok) return i(t); const { status: s } = t, e = It().createError(`HTTP error ${s}`); throw e.retriable = function (t) { return 415 == t || t >= 500 && t < 600 }(s), e.response = t, e })) } var ih = class { constructor(t) { this.win = t; const i = is(t); this.Ge = i.isSingleDoc() ? i.getSingleDoc() : null } qe(t, i) { return function (t, i, s, n) { if (!i) return e(); const r = n.prerenderSafe ? e() : i.whenFirstVisible(), h = Ps(i), o = _n(s), u = h.hasCapability("xhrInterceptor"), l = n.bypassInterceptorForDev && !1; return o || !u || l ? r : i.getRootNode().documentElement.hasAttribute("allow-xhr-interception") ? r.then((() => h.isTrustedViewer())).then((i => { if (!i && !Le(t, "untrusted-xhr-interception")) return; const e = { "originalRequest": Xr(s, n) }; return h.sendMessageAwaitResponse("xhr", e).then((t => function (t, i) { if (F(f(t), "Object expected: %s", t), "document" != i) return new Response(t.body, t.init); const s = p(), e = { status: 200, statusText: "OK", getResponseHeader: t => s[String(t).toLowerCase()] || null }; if (t.init) { const i = t.init; v(i.headers) && i.headers.forEach((t => { const i = t[0], e = t[1]; s[String(i).toLowerCase()] = String(e) })), i.status && (e.status = parseInt(i.status, 10)), i.statusText && (e.statusText = String(i.statusText)) } return new Response(t.body ? String(t.body) : "", e) }(t, n.responseType))) })) : r }(this.win, this.Ge, t, i).then((t => { if (t) return t; if (Yr(i.body)) { const t = i.body; i.body = t.getFormData() } return this.win.fetch.apply(null, arguments) })) } We(t, i = {}) { return t = function (t, i, s) { return D("string" == typeof i), !1 !== s.ampCors && (i = In(t, i)), i }(this.win, t, i), i = function (t, i, s) { s = s || {}; const e = function (t) { return t.origin || on(t.location.href).origin }(t); return e == on(i).origin && (s.headers = s.headers || {}, s.headers["AMP-Same-Origin"] = "true"), s }(this.win, t, i), this.qe(t, i).then((t => t), (i => { const s = on(t).origin; throw It().createExpectedError("XHR", `Failed fetching (${s}/...):`, i && i.message) })) } fetchJson(t, i) { return this.fetch(t, function (t) { const i = Zr(t, "application/json"); if ("POST" == i.method && !Yr(i.body)) { D(Jr.some((t => t(i.body)))), i.headers["Content-Type"] = i.headers["Content-Type"] || "text/plain;charset=utf-8"; const t = i.headers["Content-Type"]; i.body = "application/x-www-form-urlencoded" === t ? dn(i.body) : JSON.stringify(i.body) } return i }(i)) } fetchText(t, i) { return this.fetch(t, Zr(i, "text/plain")) } xssiJson(t, i) { return i ? t.text().then((t => t.startsWith(i) ? B(t.slice(i.length)) : B(t))) : t.json() } fetch(t, i) { const s = Zr(i); return this.We(t, s).then((t => th(t))) } sendSignal(t, i) { return this.We(t, i).then((t => th(t))) } getCorsUrl(t, i) { return In(t, i) } }, sh = class extends ih { constructor(t) { super(t), this.Ke = p() } fetch(t, i) { const s = i && i.headers && i.headers.Accept || "", e = !i || !i.method || "GET" === i.method, n = this.Ye(t, s), r = !!this.Ke[n]; if (e && r) return this.Ke[n].then((t => t.clone())); const h = super.fetch(t, i); return e && (this.Ke[n] = h.then((t => (delete this.Ke[n], t.clone())), (t => { throw delete this.Ke[n], t }))), h } Ye(t, i) { return mn(Tn(t, En(this.win.location))) + i } }, eh = { "+": "-", "/": "_", "=": "." }; function nh(t) { const i = function (t) { const i = new Array(t.length); for (let s = 0; s < t.length; s++)i[s] = String.fromCharCode(t[s]); return i.join("") }(t); return btoa(i).replace(/[+/=]/g, (t => eh[t])) } var rh = "AIzaSyDKtqGxnoeIqVM33Uf7hRSa3GJxuzR7mLc", hh = "CacheCidApi", oh = "-test-amp-cookie-tmp"; function uh(t, i) { const s = function (t) { try { return t.document.cookie } catch (t) { return "" } }(t); if (!s) return null; const e = s.split(";"); for (let t = 0; t < e.length; t++) { const s = e[t].trim(), n = s.indexOf("="); if (-1 != n && K(s.substring(0, n).trim()) == i) { const t = s.substring(n + 1).trim(); return K(t, t) } } return null } function lh(t, i, s, e, n = {}) { let r; !function (t, i, s) { if (i.allowOnProxyOrigin) return void bt(!i.highestAvailableDomain, "Could not support highestAvailable Domain on proxy origin, specify domain explicitly"); bt(!_n(t.location.href), `Should never attempt to set cookie on proxy origin: ${s}`); const e = on(t.location.href).hostname.toLowerCase(), n = on(et).hostname.toLowerCase(); bt(!(e == n || R(e, "." + n)), "Should never attempt to set cookie on proxy origin. (in depth check): " + s) }(t, n, i), n.domain ? r = n.domain : n.highestAvailableDomain && (r = function (t) { const i = t.document.head && t.document.head.querySelector("meta[name='amp-cookie-scope']"); if (i) { const s = i.getAttribute("content") || "", e = En(t.location.href); return R(e, "." + s) ? s : e.split("://")[1] } if (!_n(t.location.href)) { const i = t.location.hostname.split("."); let s = i[i.length - 1]; const e = function (t) { let i = oh; for (; uh(t, i);)i = oh + 0; return i }(t); for (let n = i.length - 2; n >= 0; n--)if (s = i[n] + "." + s, ch(t, e, "delete", Date.now() + 1e3, s), "delete" == uh(t, e)) return ch(t, e, "delete", Date.now() - 1e3, s), s } return null }(t)), ch(t, i, s, e, r, n.sameSite, n.secure) } function ch(t, i, s, e, n, r, h) { "ampproject.org" == n && (s = "delete", e = 0); const o = encodeURIComponent(i) + "=" + encodeURIComponent(s) + "; path=/" + (n ? "; domain=" + n : "") + "; expires=" + new Date(e).toUTCString() + function (t, i) { return i ? `; SameSite=${i}` : "" }(0, r) + (h ? "; Secure" : ""); try { t.document.cookie = o } catch (t) { } } var ah = "GoogleCidApi", dh = "AMP_TOKEN", fh = "$RETRIEVING", ph = "$OPT_OUT", mh = "$NOT_FOUND", _h = 3e4, Ah = 31536e6, Ph = 31536e6, gh = /^[a-zA-Z0-9-_.]+$/, vh = "amp-cid-optout", Eh = { "googleanalytics": "AMP_ECID_GOOGLE" }, Th = { "googleanalytics": "AIzaSyA65lEHUEizIsNtlbNo-l2K18dT680nsaM" }; function Ih(t, i, s) { lh(t, i, s, Date.now() + Ph, { highestAvailableDomain: !0 }) } function Mh(t, i, s) { fs(t).then((t => { if (!t.isViewerStorage()) { const e = Rh(i); t.setNonBoolean(e, s) } })) } function Rh(t) { return "amp-cid:" + t } function yh(t, i, s) { const { ampdoc: e } = t, { win: n } = e, { disableBackup: r, scope: h } = i, o = i.cookieName || h; return function (t, i) { const { ampdoc: s } = t, { win: e } = s, { disableBackup: n, scope: r } = i, h = i.cookieName || r, o = uh(e, h); return o ? Promise.resolve(o) : n ? Promise.resolve(null) : fs(s).then((t => { const i = Rh(h); return t.get(i, Ph) })).then((t => t && "string" == typeof t ? t : null)) }(t, i).then((u => { if (!u && !i.createCookieIfNotPresent) return Promise.resolve(null); if (u) return /^amp-/.test(u) && (Ih(n, o, u), r || Mh(e, o, u)), Promise.resolve(u); if (t.Je[h]) return t.Je[h]; const l = Sh(n).then((t => "amp-" + t)); return Promise.all([l, s]).then((t => { const i = t[0]; uh(n, o) || (Ih(n, o, i), r || Mh(e, o, i)) })), t.Je[h] = l })) } function bh(t, i) { const s = Ps(t); return s.isTrustedViewer().then((t => { if (t) return Rt().expectedError("CID", "Viewer does not provide cap=cid"), s.sendMessageAwaitResponse("cid", i).then((t => t && !function (t, i) { try { return B(t) } catch (t) { return null } }(t) ? (Rt().expectedError("CID", "invalid cid format"), JSON.stringify({ "time": Date.now(), "cid": t })) : t)) })) } function wh(t) { return JSON.stringify({ "time": Date.now(), "cid": t }) } function Vh(t) { return j(t, 16) || String(t.location.href + Date.now() + t.Math.random() + t.screen.width + t.screen.height) } function Sh(t) { const i = Vh(t); if ("string" == typeof i) return ns(t).sha384Base64(i); { const t = i; return r((() => nh(t).replace(/\.+$/, ""))) } } var xh = "Crypto"; var Oh = ["prefetch", "preload", "preconnect", "dns-prefetch"], Ch = { attributes: !0, attributeFilter: ["hidden"], subtree: !0 }; function kh(t) { try { return t.state } catch (t) { return null } } var Nh = "History", Dh = "AMP.History"; function Lh(t) { const i = Ps(t); let s; return i.isOvertakeHistory() || t.win.__AMP_TEST_IFRAME ? s = new class { constructor(t, i) { this.win = t, this.Qe = i, this.Xe = 0, this.Ze = null, this.Tn = this.Qe.onMessage("historyPopped", (t => this.Vn(t))) } replaceStateForTarget(t) { yt("#" == t[0]), this.win.location.replace(t) } cleanup() { this.Tn() } setOnStateUpdated(t) { this.Ze = t } Sn(t, i, s) { return this.On(t) ? t : i } On(t) { return !!t && void 0 !== t.stackIndex } push(t) { const i = g({ "stackIndex": this.Xe + 1 }, t || {}), s = "pushHistory"; return this.Qe.sendMessageAwaitResponse(s, i).then((t => { const e = i, n = this.Sn(t, e, s); return this.Nn(n), n })) } pop(t) { if (t > this.Xe) return this.get(); const i = { "stackIndex": this.Xe }, s = "popHistory"; return this.Qe.sendMessageAwaitResponse(s, i).then((t => { const i = { "stackIndex": this.Xe - 1 }, e = this.Sn(t, i, s); return this.Nn(e), e })) } replace(t) { if (t && t.url) { if (!this.Qe.hasCapability("fullReplaceHistory")) { const t = { "stackIndex": this.Xe }; return Promise.resolve(t) } const i = t.url.replace(/#.*/, ""); t.url = i } const i = g({ "stackIndex": this.Xe }, t || {}), s = "replaceHistory"; return this.Qe.sendMessageAwaitResponse(s, i, !0).then((t => { const e = i, n = this.Sn(t, e, s); return this.Nn(n), n })) } get() { return Promise.resolve({ data: void 0, fragment: "", stackIndex: this.Xe, title: "" }) } Vn(t) { void 0 !== t.newStackIndex && (t.stackIndex = t.newStackIndex), this.On(t) && this.Nn(t) } Nn(t) { const { stackIndex: i } = t; this.Xe != i && (this.Xe = i, this.Ze && this.Ze(t)) } getFragment() { return this.Qe.hasCapability("fragment") ? this.Qe.sendMessageAwaitResponse("getFragment", void 0, !0).then((t => { if (!t) return ""; let i = t; return "#" == i[0] && (i = i.substr(1)), i })) : Promise.resolve("") } updateFragment(t) { return this.Qe.hasCapability("fragment") ? this.Qe.sendMessageAwaitResponse("replaceHistory", { "fragment": t }, !0) : e() } }(t.win, i) : (wi(t.win, "global-history-binding", class { constructor(t) { this.win = t, this.ke = ps(t); const { history: i } = this.win; this.Dn = i.length - 1; const s = kh(i); let e, n; s && void 0 !== s[Dh] && (this.Dn = Math.min(s[Dh], this.Dn)), this.Xe = this.Dn, this.Ln, this.Ze = null, this.Un = "state" in i, this.$n = this.Fn(this.Xe), i.pushState && i.replaceState ? (this.Bn = i.originalPushState || i.pushState.bind(i), this.Hn = i.originalReplaceState || i.replaceState.bind(i), e = (t, i, s) => { this.$n = t; try { this.Bn(t, i, s || null) } catch (t) { Rt().error(Nh, "pushState failed: " + t.message) } }, n = (t, i, s) => { this.$n = t; try { void 0 !== s ? this.Hn(t, i, s) : this.Hn(t, i) } catch (t) { Rt().error(Nh, "replaceState failed: " + t.message) } }, i.originalPushState || (i.originalPushState = this.Bn), i.originalReplaceState || (i.originalReplaceState = this.Hn)) : (e = (t, i, s) => { this.$n = t }, n = (t, i, s) => { this.$n = t }), this.Gn = e, this.qn = n; try { this.qn(this.Fn(this.Xe, !0)) } catch (t) { Rt().error(Nh, "Initial replaceState failed: " + t.message) } i.pushState = this.Wn.bind(this), i.replaceState = this.Kn.bind(this), this.Yn = t => { t.state, this.Jn() }, this.win.addEventListener("popstate", this.Yn) } cleanup() { this.Bn && (this.win.history.pushState = this.Bn), this.Hn && (this.win.history.replaceState = this.Hn), this.win.removeEventListener("popstate", this.Yn) } Fn(t, i) { const s = p(i ? this.Qn() : void 0); return s[Dh] = t, s } setOnStateUpdated(t) { this.Ze = t } push(t) { return this.Xn((() => { const i = this.Zn(this.Qn(), t || {}); return this.Wn(i, void 0, i.fragment ? "#" + i.fragment : void 0), r((() => this.Zn(i, { stackIndex: this.Xe }))) })) } pop(t) { return t = Math.max(t, this.Dn), this.Xn((() => this.tr(this.Xe - t + 1))).then((t => this.Zn(this.Qn(), { stackIndex: t }))) } replace(t = {}) { return this.Xn((() => { const i = this.Zn(this.Qn(), t || {}), s = (i.url || "").replace(/#.*/, ""), e = i.fragment ? "#" + i.fragment : ""; return this.Kn(i, i.title, s || e ? s + e : void 0), r((() => this.Zn(i, { stackIndex: this.Xe }))) })) } get() { return r((() => this.Zn(this.Qn(), { stackIndex: this.Xe }))) } backTo(t) { return t = Math.max(t, this.Dn), this.Xn((() => this.tr(this.Xe - t))) } Jn() { let t = this.Qn(); const i = t ? t[Dh] : void 0; let s = this.Xe; const e = this.Ln; this.Ln = void 0, s > this.win.history.length - 2 && (s = this.win.history.length - 2, this.Nn(this.Zn(t, { stackIndex: s }))), null == i ? s += 1 : s = i < this.win.history.length ? i : this.win.history.length - 1, t || (t = {}), t[Dh] = s, this.qn(t, void 0, void 0), s != this.Xe && this.Nn(this.Zn(t, { stackIndex: s })), s < this.Dn && (this.Dn = s), e && e.resolve() } Qn() { return this.Un ? kh(this.win.history) : this.$n } ir() { yt(!this.Ln) } Xn(t) { return this.Ln ? this.Ln.promise.then(t, t) : t() } sr() { this.ir(); const t = new n, { reject: i, resolve: s } = t, e = this.ke.timeoutPromise(500, t.promise); return this.Ln = { promise: e, resolve: s, reject: i }, e } tr(t) { if (this.ir(), t <= 0) return Promise.resolve(this.Xe); this.$n = this.Fn(this.Xe - t); const i = this.sr(); return this.win.history.go(-t), i.then((() => Promise.resolve(this.Xe))) } Wn(t, i, s) { this.ir(), t || (t = {}); let e = this.Xe + 1; t[Dh] = e, this.Gn(t, i, s), e != this.win.history.length - 1 && (e = this.win.history.length - 1, t[Dh] = e, this.qn(t)); const n = this.Zn(t, { stackIndex: e }); this.Nn(n) } replaceStateForTarget(t) { yt("#" == t[0]), this.Xn((() => { this.win.removeEventListener("popstate", this.Yn); try { this.win.location.replace(t) } finally { this.win.addEventListener("popstate", this.Yn) } return this.Kn(), e() })) } Kn(t, i, s) { this.ir(), t || (t = {}); const e = Math.min(this.Xe, this.win.history.length - 1); t[Dh] = e, this.qn(t, i, s); const n = this.Zn(t, { stackIndex: e }); this.Nn(n) } Nn(t) { this.ir(), t.stackIndex = Math.min(t.stackIndex, this.win.history.length - 1), this.Xe != t.stackIndex && (this.Xe = t.stackIndex, this.Ze && this.Ze(t)) } getFragment() { let { hash: t } = this.win.location; return t = t.substr(1), Promise.resolve(t) } updateFragment(t) { return this.replace({ fragment: t }) } Zn(t, i) { const s = g(g({}, t && t.data || {}), i.data || {}); return g(g(g({}, t || {}), i), {}, { data: s }) } }), s = Si(t.win, "global-history-binding")), new class { constructor(t, i) { this.ji = t, this.ke = ps(t.win), this.er = i, this.Xe = 0, this.nr = [], this.es = [], this.er.setOnStateUpdated(this.Ze.bind(this)) } cleanup() { this.er.cleanup() } push(t, i) { return this.rr((() => this.er.push(i).then((i => (this.Ze(i), t && (this.nr[i.stackIndex] = t), i.stackIndex)))), "push") } pop(t) { return this.rr((() => this.er.pop(t).then((t => { this.Ze(t) }))), "pop") } replace(t) { return this.rr((() => this.er.replace(t)), "replace") } get() { return this.rr((() => this.er.get()), "get") } goBack(t) { return this.rr((() => this.Xe <= 0 && !t ? e() : this.er.pop(this.Xe).then((t => { this.Ze(t) }))), "goBack") } replaceStateForTarget(t) { yt("#" == t[0]); const i = this.ji.win.location.hash; return this.push((() => { this.ji.win.location.replace(i || "#") })).then((() => { this.er.replaceStateForTarget(t) })) } getFragment() { return this.er.getFragment() } updateFragment(t) { return "#" == t[0] && (t = t.substr(1)), this.er.updateFragment(t) } Ze(t) { this.Xe = t.stackIndex, this.hr(t) } hr(t) { if (this.Xe >= this.nr.length - 1) return; const i = []; for (let t = this.nr.length - 1; t > this.Xe; t--)this.nr[t] && (i.push(this.nr[t]), this.nr[t] = void 0); if (this.nr.splice(this.Xe + 1), i.length > 0) for (let s = 0; s < i.length; s++)this.ke.delay((() => i[s](t)), 1) } rr(t, i) { const s = new n, { promise: e, reject: r, resolve: h } = s, o = new Error("history trace for " + i + ": "); return this.es.push({ callback: t, resolve: h, reject: r, trace: o }), 1 == this.es.length && this.ur(), e } ur() { if (0 == this.es.length) return; const t = this.es[0]; let i; try { i = t.callback() } catch (t) { i = Promise.reject(t) } i.then((i => { t.resolve(i) }), (i => { Rt().error(Nh, "failed to execute a task:", i), t.trace && (t.trace.message += i, Rt().error(Nh, t.trace)), t.reject(i) })).then((() => { this.es.splice(0, 1), this.ur() })) } }(t, s) } var Uh = ['
'], $h = class { constructor(t, i) { this.win = t, this.lr = i, this.cr = [], this.ar = new Is, this.dr = t => { b(t.target) && this.pr(t.target) }, this.mr = i => { ps(t).delay((() => { this.win.document.activeElement && this.pr(this.win.document.activeElement) }), 500) }, this.win.document.addEventListener("focus", this.dr, !0), this.win.addEventListener("blur", this.mr) } _r() { this.win.document.removeEventListener("focus", this.dr, !0), this.win.removeEventListener("blur", this.mr) } onFocus(t) { return this.ar.add(t) } pr(t) { const i = Date.now(); 0 == this.cr.length || this.cr[this.cr.length - 1].el != t ? this.cr.push({ el: t, time: i }) : this.cr[this.cr.length - 1].time = i, this.purgeBefore(i - this.lr), this.ar.fire(t) } getLast() { return 0 == this.cr.length ? null : this.cr[this.cr.length - 1].el } purgeBefore(t) { let i = this.cr.length - 1; for (let s = 0; s < this.cr.length; s++)if (this.cr[s].time >= t) { i = s - 1; break } -1 != i && this.cr.splice(0, i + 1) } hasDescendantsOf(t) { this.win.document.activeElement && this.pr(this.win.document.activeElement); for (let i = 0; i < this.cr.length; i++)if (t.contains(this.cr[i].el)) return !0; return !1 } }, Fh = null, Bh = ["gclid", "gclsrc"], Hh = [/^t.co$/]; function jh() { return bt(Fh, "E#19457 trackImpressionPromise") } function zh(t, i, s, e) { let n; try { n = t.open(i, s, e) } catch (t) { Rt().error("DOM", "Failed to open url on target: ", s, t) } var r, h; return !n && "_top" != s && ("number" != typeof h && (h = 0), h + "noopener".length > (r = e || "").length || -1 === r.indexOf("noopener", h)) && (n = t.open(i, "_top")), n } var Gh = "navigation", qh = "click", Wh = "contextmenu", Kh = ["_top", "_blank"], Yh = "data-a4a-orig-href"; function Qh(t, i) { const s = Ct(i.target, "A"); if (!s || !s.href) return; const e = s.getAttribute(Yh) || s.getAttribute("href"); if (!e) return; const n = { "CLICK_X": () => i.pageX, "CLICK_Y": () => i.pageY }, r = ms(s).expandUrlSync(e, n, { "CLICK_X": !0, "CLICK_Y": !0 }); r != e && (s.getAttribute(Yh) || s.setAttribute(Yh, e), s.setAttribute("href", r)) } function Jh(t) { return `${t.origin}${t.pathname}${t.search}` } function Xh(t) { return v(t) ? t : [t] } function Zh(t) { wi(t, "platform", class { constructor(t) { this.oo = t.navigator, this.i = t } isAndroid() { return /Android/i.test(this.oo.userAgent) } isIos() { return /iPhone|iPad|iPod/i.test(this.oo.userAgent) } isSafari() { return /Safari/i.test(this.oo.userAgent) && !this.isChrome() && !this.isEdge() && !this.isFirefox() && !this.isOpera() } isChrome() { return /Chrome|CriOS/i.test(this.oo.userAgent) && !this.isEdge() && !this.isOpera() } isFirefox() { return /Firefox|FxiOS/i.test(this.oo.userAgent) && !this.isEdge() } isOpera() { return /OPR\/|Opera|OPiOS/i.test(this.oo.userAgent) } isEdge() { return /Edge/i.test(this.oo.userAgent) } isWebKit() { return /WebKit/i.test(this.oo.userAgent) && !this.isEdge() } isWindows() { return /Windows/i.test(this.oo.userAgent) } isStandalone() { return this.isIos() && this.oo.standalone || this.isChrome() && this.i.matchMedia("(display-mode: standalone)").matches } isBot() { return /bot/i.test(this.oo.userAgent) } getMajorVersion() { return this.isSafari() ? this.isIos() ? this.getIosMajorVersion() || 0 : this.uo(/\sVersion\/(\d+)/, 1) : this.isChrome() ? this.uo(/(Chrome|CriOS)\/(\d+)/, 2) : this.isFirefox() ? this.uo(/(Firefox|FxiOS)\/(\d+)/, 2) : this.isOpera() ? this.uo(/(OPR|Opera|OPiOS)\/(\d+)/, 2) : this.isEdge() ? this.uo(/Edge\/(\d+)/, 1) : 0 } uo(t, i) { if (!this.oo.userAgent) return 0; const s = this.oo.userAgent.match(t); return !s || i >= s.length ? 0 : parseInt(s[i], 10) } getIosVersionString() { var t, i, s; return this.isIos() && (null === (t = this.oo.userAgent) || void 0 === t || null === (i = t.match(/OS ([0-9]+[_.][0-9]+([_.][0-9]+)?)\b/)) || void 0 === i || null === (s = i[1]) || void 0 === s ? void 0 : s.replace(/_/g, ".")) || "" } getIosMajorVersion() { const t = this.getIosVersionString(); return "" == t ? null : Number(t.split(".")[0]) } }) } var to = class { constructor() { this.As = [], this.Ar = {}, this.gr = 0, this.Pr = 0 } getSize() { return this.As.length } getLastEnqueueTime() { return this.gr } getLastDequeueTime() { return this.Pr } getTaskById(t) { return this.Ar[t] || null } enqueue(t) { yt(!this.Ar[t.id]), this.As.push(t), this.Ar[t.id] = t, this.gr = Date.now() } dequeue(t) { const i = this.Ar[t.id]; return !!this.removeAtIndex(t, this.As.indexOf(i)) && (this.Pr = Date.now(), !0) } peek(t) { let i = 1e6, s = null; for (let e = 0; e < this.As.length; e++) { const n = this.As[e], r = t(n); r < i && (i = r, s = n) } return s } forEach(t) { this.As.forEach(t) } removeAtIndex(t, i) { const s = this.Ar[t.id]; return !(!s || this.As[i] != s || (this.As.splice(i, 1), delete this.Ar[t.id], 0)) } purge(t) { let i = this.As.length; for (; i--;)t(this.As[i]) && this.removeAtIndex(this.As[i], i) } }; function io(t) { return t.queryCommandSupported("copy") } function so(t) { return t.hasAttribute("hidden") } var eo = "STANDARD-ACTIONS", no = /^i-amphtml-/; var ro = "Storage", ho = class { constructor(t) { this.Qe = t } loadBlob(t) { return this.Qe.sendMessageAwaitResponse("loadStore", { "origin": t }).then((t => t.blob)) } saveBlob(t, i) { return this.Qe.sendMessageAwaitResponse("saveStore", { "origin": t, "blob": i }).catch((t => { throw Rt().createExpectedError(ro, "Failed to save store: ", t) })) } }; function oo(t) { Vi(t, "storage", (function () { const i = Ps(t), s = parseInt(i.getParam("storage"), 10) ? new ho(i) : new class { constructor(t) { if (this.win = t, this.vr = this.Er(), !this.vr) { const t = new Error("localStorage not supported."); Rt().expectedError(ro, t) } } Er() { try { return "localStorage" in this.win && (this.win.localStorage.getItem("test"), !0) } catch (t) { return !1 } } Tr(t) { return `amp-store:${t}` } loadBlob(t) { return new Promise((i => { this.vr ? i(this.win.localStorage.getItem(this.Tr(t))) : i(null) })) } saveBlob(t, i) { return new Promise((s => { this.vr ? (this.win.localStorage.setItem(this.Tr(t), i), s()) : s() })) } }(t.win); return new class { constructor(t, i, s) { this.ampdoc = t, this.Qe = i, this.er = s, this.Ir = s instanceof ho, this.h = En(this.ampdoc.win.location), this.Mr = null } Rr() { return this.yr(), this } get(t, i) { return this.wr().then((s => s.get(t, i))) } set(t, i, s) { return yt("boolean" == typeof i), this.setNonBoolean(t, i, s) } setNonBoolean(t, i, s) { return this.br((e => e.set(t, i, s))) } remove(t) { return this.br((i => i.remove(t))) } isViewerStorage() { return this.Ir } wr() { return this.Mr || (this.Mr = this.er.loadBlob(this.h).then((t => t ? B(atob(t)) : {})).catch((t => (Rt().expectedError(ro, "Failed to load store: ", t), {}))).then((t => new class { constructor(t, i) { this.obj = _(t), this.Vr = i || 8, this.Sr = this.obj.vv || Object.create(null), this.obj.vv || (this.obj.vv = this.Sr) } get(t, i) { const s = this.Sr[t], e = s ? s.t : void 0, n = !i || null == e || e + i > Date.now(); return s && n ? s.v : void 0 } set(t, i, s) { if (yt("__proto__" != t && "prototype" != t), void 0 !== this.Sr[t]) { const e = this.Sr[t]; let n = Date.now(); s && (n = e.t), e.v = i, e.t = n } else this.Sr[t] = { "v": i, "t": Date.now() }; const e = Object.keys(this.Sr); if (e.length > this.Vr) { let t = 1 / 0, i = null; for (let s = 0; s < e.length; s++) { const n = this.Sr[e[s]]; n.t < t && (i = e[s], t = n.t) } i && delete this.Sr[i] } } remove(t) { delete this.Sr[t] } }(t)))), this.Mr } br(t) { return this.wr().then((i => { t(i); const s = btoa(JSON.stringify(i.obj)); return this.er.saveBlob(this.h, s) })).then(this.Or.bind(this)) } yr() { this.Qe.onBroadcast((t => { "amp-storage-reset" == t.type && t.origin == this.h && (this.Mr = null) })) } Or() { this.Qe.broadcast({ "type": "amp-storage-reset", "origin": this.h }) } }(t, i, s).Rr() }), !0) } var uo = "__AMP_IMPL_", lo = () => { }; function co(t) { wi(t, "timer", class { constructor(t) { this.win = t, this.Cr = this.win.Promise.resolve(), this.kr = 0, this.Nr = {}, this.Dr = Date.now() } timeSinceStart() { return Date.now() - this.Dr } delay(t, i) { if (!i) { const i = "p" + this.kr++; return this.Cr.then((() => { this.Nr[i] ? delete this.Nr[i] : t() })).catch(Vn), i } return this.win.setTimeout((() => { try { t() } catch (t) { throw Vn(t), t } }), i) } cancel(t) { "string" != typeof t ? this.win.clearTimeout(t) : this.Nr[t] = !0 } promise(t) { return new this.win.Promise((i => { if (-1 == this.delay(i, t)) throw new Error("Failed to schedule timer.") })) } timeoutPromise(t, i, s) { let e; const n = new this.win.Promise(((i, n) => { if (e = this.delay((() => { n(It().createError(s || "timeout")) }), t), -1 == e) throw new Error("Failed to schedule timer.") })); if (!i) return n; const r = () => { this.cancel(e) }; return i.then(r, r), this.win.Promise.race([n, i]) } poll(t, i) { return new this.win.Promise((s => { const e = this.win.setInterval((() => { i() && (this.win.clearInterval(e), s()) }), t) })) } }) } var ao = "Expander", fo = class { constructor(t, i, s, e, n, r) { this.Lr = t, this.Ur = i, this.$r = s, this.Fr = e, this.Br = n, this.Hr = !r } expand(t) { if (!t.length) return this.Fr ? t : Promise.resolve(t); const i = this.Lr.getExpr(this.Ur, this.Br), s = this.jr(t, i); return s.length ? this.zr(t, s) : this.Fr ? t : Promise.resolve(t) } getMacroNames(t) { const i = this.Lr.getExpr(this.Ur, this.Br); return t.match(i) || [] } jr(t, i) { const s = []; return t.replace(i, ((t, i, e) => { const { length: n } = t, r = { start: e, stop: n + e - 1, name: i, length: n }; s.push(r) })), s } zr(t, i) { const s = []; let e = 0, n = 0, r = i[n], h = 0, o = !1; const u = c => { let a = "", d = []; const f = []; for (; e < t.length && n <= i.length;) { const l = a.trim(); if (r && e === r.start) { let o; l && d.push(h ? (p = a).trimStart ? p.trimStart() : (p + "_").trim().slice(0, -1) : a), o = this.Ur && m(this.Ur, r.name) ? { name: r.name, prioritized: this.Ur[r.name], encode: c } : g(g({}, this.Lr.get(r.name)), {}, { name: r.name, encode: c }), e = r.stop + 1, r = i[++n], "(" === t[e] ? (e++, h++, s.push(o), d.push(u(!1))) : d.push(this.Gr(o)), a = "" } else if ("`" === t[e]) o ? (o = !1, a.length && d.push(a)) : (o = !0, l && d.push(l)), a = "", e++; else if (h && "," === t[e] && !o) l && d.push(l), f.push(d), d = [], "," === t[e + 1] && (f.push([""]), e++), a = "", e++; else { if (h && ")" === t[e] && !o) { e++, h--; const t = s.pop(); return l && d.push(l), f.push(d), this.Gr(t, f) } a += t[e], e++ } e === t.length && a.length && d.push(a) } var p; return this.Fr ? d.join("") : Promise.all(d).then((t => t.join(""))).catch((t => (l(t), ""))) }; return u(this.Hr) } Gr(t, i) { const { encode: s, name: e } = t; let n; if (null != t.prioritized ? n = t.prioritized : this.Fr && null != t.sync ? n = t.sync : this.Fr ? (It().error(ao, "ignoring async replacement key: ", t.name), n = "") : n = t.async || t.sync, this.Fr) { const t = this.qr(n, e, i); return s ? encodeURIComponent(t) : t } return this.Wr(n, e, i).then((t => s ? encodeURIComponent(t) : t)) } Wr(t, i, s) { let e; try { if ("function" == typeof t) { const i = t; e = s ? this.Kr(s).then((t => i.apply(null, t))) : r(i) } else e = Promise.resolve(t); return e.then((t => { let e; return this.Yr(i, t, s), e = null == t ? "" : t, e })).catch((t => (l(t), this.Yr(i, "", s), Promise.resolve("")))) } catch (t) { return l(t), this.Yr(i, "", s), Promise.resolve("") } } Kr(t) { return Promise.all(t.map((t => Promise.all(t).then((t => t.join("")))))) } qr(t, i, s) { try { let e, n = t; return "function" == typeof t && (n = t.apply(null, this.Jr(s))), n && "function" == typeof n.then ? (It().error(ao, "ignoring async macro resolution"), e = "") : "string" == typeof n || "number" == typeof n || "boolean" == typeof n ? (this.Yr(i, n, s), e = n.toString()) : (this.Yr(i, "", s), e = ""), e } catch (t) { return l(t), this.Yr(i, "", s), "" } } Jr(t) { return t ? t.map((t => t.join(""))) : t } Yr(t, i, s) { if (!this.$r) return; let e = ""; s && (e = `(${s.filter((t => "" !== t)).join(",")})`), this.$r[`${t}${e}`] = i || "" } }, po = { "navigationStart": 1, "redirectStart": 1, "redirectEnd": 1, "fetchStart": 1, "domainLookupStart": 1, "domainLookupEnd": 1, "connectStart": 1, "secureConnectionStart": 1, "connectEnd": 1, "requestStart": 1, "responseStart": 1, "responseEnd": 1, "domLoading": 2, "domInteractive": 2, "domContentLoaded": 2, "domComplete": 2, "loadEventStart": 3, "loadEventEnd": 4 }; function mo(t, i, s) { const n = po[i] || 3, r = s ? po[s] || 3 : n, h = Math.max(n, r); let o; if (1 === h) o = e(); else if (2 === h) o = Ei(t.document); else if (3 === h) o = We(t); else if (4 === h) { const i = ps(t); o = We(t).then((() => i.promise(1))) } return yt(o), o.then((() => _o(t, i, s))) } function _o(t, i, s) { const e = t.performance && t.performance.timing; if (!e || 0 == e.navigationStart) return; const n = void 0 === s ? e[i] : e[s] - e[i]; return !w(n) || n < 0 ? void 0 : n } function Ao(t, i) { const s = t.performance && t.performance.navigation; if (s && void 0 !== s[i]) return s[i] } var Po = "UrlReplacements"; function go(t) { return () => (new Date)[t]() } function vo(t, i) { return () => t[i] } function Eo(t, i) { return i ? (bt("ISOCountry" === i, "The value passed to AMP_GEO() is not valid name:" + i), t && t[i] || "unknown") : (null == t ? void 0 : t.matchedISOCountryGroups.join(",")) || "unknown" } var To = "Viewer", Io = /^(https?:\/\/)((www[0-9]*|web|ftp|wap|home|mobile|amp|m)\.)+/i; function Mo(t) { let i; return t instanceof Error ? ((t = h(t)).message = "No messaging channel: " + t.message, i = t) : i = new Error("No messaging channel: " + t), i.message = C(i.message), i } var Ro = class t { static solveYValueFromXValue(i, s, e, n, r, h, o, u, l) { return t.Qr(t.Xr(i, s, n, h, u), e, r, o, l) } static Xr(i, s, e, n, r) { const h = 1e-6; let o = (i - s) / (r - s); if (o <= 0) return 0; if (o >= 1) return 1; let u = 0, l = 1, c = 0; for (let a = 0; a < 8; a++) { c = t.Zr(o, s, e, n, r); const a = (t.Zr(o + h, s, e, n, r) - c) / h; if (Math.abs(c - i) < h) return o; if (Math.abs(a) < h) break; c < i ? u = o : l = o, o -= (c - i) / a } for (let a = 0; Math.abs(c - i) > h && a < 8; a++)c < i ? (u = o, o = (o + l) / 2) : (l = o, o = (o + u) / 2), c = t.Zr(o, s, e, n, r); return o } static Zr(i, s, e, n, r) { if (0 == i) return s; if (1 == i) return r; let h = t.th(s, e, i), o = t.th(e, n, i); const u = t.th(n, r, i); return h = t.th(h, o, i), o = t.th(o, u, i), t.th(h, o, i) } static Qr(i, s, e, n, r) { if (0 == i) return s; if (1 == i) return r; let h = t.th(s, e, i), o = t.th(e, n, i); const u = t.th(n, r, i); return h = t.th(h, o, i), o = t.th(o, u, i), t.th(h, o, i) } static th(t, i, s) { return t + s * (i - t) } }, yo = { LINEAR: t => t, EASE: t => Ro.solveYValueFromXValue(t, 0, 0, .25, .1, .25, 1, 1, 1), EASE_IN: t => Ro.solveYValueFromXValue(t, 0, 0, .42, 0, 1, 1, 1, 1), EASE_OUT: t => Ro.solveYValueFromXValue(t, 0, 0, 0, 0, .58, 1, 1, 1), EASE_IN_OUT: t => Ro.solveYValueFromXValue(t, 0, 0, .42, 0, .58, 1, 1, 1) }, bo = { "linear": yo.LINEAR, "ease": yo.EASE, "ease-in": yo.EASE_IN, "ease-out": yo.EASE_OUT, "ease-in-out": yo.EASE_IN_OUT }; function wo(t) { if (!t) return null; if (y(t)) { if (-1 != t.indexOf("cubic-bezier")) { const r = t.match(/cubic-bezier\((.+)\)/); if (r) { const t = r[1].split(",").map(parseFloat); if (4 == t.length) { for (let i = 0; i < 4; i++)if (isNaN(t[i])) return null; return i = t[0], s = t[1], e = t[2], n = t[3], t => Ro.solveYValueFromXValue(t, 0, 0, i, s, e, n, 1, 1) } } return null } return bo[t] } var i, s, e, n; return t } var Vo = "Animation", So = function () { }, xo = class t { static animate(i, s, e, n) { return new t(i).setCurve(n).add(0, s, 1).start(e) } constructor(t, i) { this.ih = t, this.sh = i || gs(self), this.eh = null, this.nh = [] } setCurve(t) { return t && (this.eh = wo(t)), this } add(t, i, s, e) { return this.nh.push({ delay: t, func: i, duration: s, curve: wo(e) }), this } start(t) { return new Oo(this.sh, this.ih, this.nh, this.eh, t) } }, Oo = class { constructor(t, i, s, e, r) { this.sh = t, this.ih = i, this.nh = []; for (let t = 0; t < s.length; t++) { const i = s[t]; this.nh.push({ delay: i.delay, func: i.func, duration: i.duration, curve: i.curve || e, started: !1, completed: !1 }) } this.rh = r, this.Dr = Date.now(), this.$e = !0, this.Mi = {}; const h = new n; this.hh = h.promise, this.ae = h.resolve, this.oh = h.reject, this.uh = this.sh.createAnimTask(this.ih, { mutate: this.lh.bind(this) }), this.sh.canAnimate(this.ih) ? this.uh(this.Mi) : this.ah(!1, 0) } then(t, i) { return t || i ? this.hh.then(t, i) : this.hh } thenAlways(t) { const i = t || So; return this.then(i, i) } halt(t) { this.ah(!1, t || 0) } ah(t, i) { if (this.$e) { if (this.$e = !1, 0 != i) { this.nh.length > 1 && this.nh.sort(((t, i) => t.delay + t.duration - (i.delay + i.duration))); try { if (i > 0) for (let t = 0; t < this.nh.length; t++)this.nh[t].func(1, !0); else for (let t = this.nh.length - 1; t >= 0; t--)this.nh[t].func(0, !1) } catch (i) { Rt().error(Vo, "completion failed: " + i, i), t = !1 } } t ? this.ae() : this.oh() } } lh(t) { if (!this.$e) return; const i = Date.now(), s = Math.min((i - this.Dr) / this.rh, 1); for (let t = 0; t < this.nh.length; t++) { const i = this.nh[t]; !i.started && s >= i.delay && (i.started = !0) } for (let t = 0; t < this.nh.length; t++) { const i = this.nh[t]; i.started && !i.completed && this.dh(i, s) } 1 == s ? this.ah(!0, 0) : this.sh.canAnimate(this.ih) ? this.uh(this.Mi) : this.ah(!1, 0) } dh(t, i) { let s, e; if (t.duration > 0) { if (s = Math.min((i - t.delay) / t.duration, 1), e = s, t.curve && 1 != e) try { e = t.curve(s) } catch (t) { return Rt().error(Vo, "step curve failed: " + t, t), void this.ah(!1, 0) } } else s = 1, e = 1; 1 == s && (t.completed = !0); try { t.func(e, t.completed) } catch (t) { return Rt().error(Vo, "step mutate failed: " + t, t), void this.ah(!1, 0) } } }; function Co(t, i) { let s; for (let e = i.lastElementChild; e; e = e.previousElementSibling)if (e.getBoundingClientRect().height > 0) { const i = ks(t, e); if ("static" == i.position || "relative" == i.position) { s = i; break } } return s ? parseInt(s.marginBottom, 10) : 0 } function ko(t, i, s) { return function (t, i, s) { const e = parseInt(ks(t, i)[s], 10); return isNaN(e) ? 0 : e }(t, i === t.document.body ? t.document.documentElement : i, s) } function No(t, i) { return ko(t, i, "scrollPaddingTop") } function Do(t) { const i = Ps(t), { win: s } = t; let n; return n = t.isSingleDoc() && function (t, i) { return cs(t).isIos() && qt(t) && i.isEmbedded() && !i.hasCapability("iframeScroll") ? Lo.NATURAL_IOS_EMBED : Lo.NATURAL }(s, i) == Lo.NATURAL_IOS_EMBED ? new class { constructor(t) { this.win = t, this.sh = gs(t); const i = this.win.document, { documentElement: s } = i, e = s.className; s.classList.add("i-amphtml-ios-embed"); const n = i.createElement("html"); this.fh = n, n.id = "i-amphtml-wrapper", n.className = e, this.ph = new Is, this.mh = new Is, this._h = this.Ah.bind(this), this.gh = () => this.mh.fire(), this.Ph = 0, this.Eh = !1, $t(i, this.Th.bind(this)), vi(i).then((() => { s.classList.add("i-amphtml-ios-overscroll") })) } ensureReadyForElements() { this.Th() } Th() { if (this.Eh) return; this.Eh = !0; const t = this.win.document, i = t.body; t.documentElement.appendChild(this.fh), this.fh.appendChild(i), Object.defineProperty(t, "body", { get: () => i }), this.Ah() } connect() { this.win.addEventListener("resize", this.gh), this.fh.addEventListener("scroll", this._h) } disconnect() { this.win.removeEventListener("resize", this.gh), this.fh.removeEventListener("scroll", this._h) } getBorderTop() { return 1 } requiresFixedLayerTransfer() { return !Le(this.win, "ios-fixed-no-transfer") || parseFloat(cs(this.win).getIosVersionString()) < 12.2 } overrideGlobalScrollTo() { return !0 } supportsPositionFixed() { return !0 } onScroll(t) { this.ph.add(t) } onResize(t) { this.mh.add(t) } updatePaddingTop(t) { this.Ph = t, Vs(this.fh, { "padding-top": Cs(t) }) } hideViewerHeader(t, i) { t || this.updatePaddingTop(0) } showViewerHeader(t, i) { t || this.updatePaddingTop(i) } disableScroll() { this.fh.classList.add("i-amphtml-scroll-disabled") } resetScroll() { this.fh.classList.remove("i-amphtml-scroll-disabled") } updateLightboxMode(t) { return e() } getSize() { return { width: this.win.innerWidth, height: this.win.innerHeight } } getScrollTop() { return this.fh.scrollTop } getScrollLeft() { return 0 } getScrollWidth() { return this.fh.scrollWidth } getScrollHeight() { return this.fh.scrollHeight } getContentHeight() { const t = this.win.document.body, { height: i } = t.getBoundingClientRect(), s = Co(this.win, t), e = ks(this.win, t); return parseInt(e.marginTop, 10) + this.Ph + i + s + parseInt(e.marginBottom, 10) } contentHeightChanged() { } getLayoutRect(t, i, s) { const e = t.getBoundingClientRect(), n = null != s ? s : this.getScrollTop(), r = null != i ? i : this.getScrollLeft(); return Jt(Math.round(e.left + r), Math.round(e.top + n), Math.round(e.width), Math.round(e.height)) } getRootClientRectAsync() { return Promise.resolve(null) } setScrollTop(t) { this.fh.scrollTop = t || 1 } Ah(t) { 0 == this.fh.scrollTop && (this.fh.scrollTop = 1, t && t.preventDefault()), t && this.ph.fire() } getScrollingElement() { return this.fh } getScrollingElementScrollsLikeViewport() { return !1 } }(s) : new class { constructor(t) { this.ampdoc = t, this.win = t.win, this.Rh = cs(this.win), this.ph = new Is, this.mh = new Is, this._h = this.Ih.bind(this), this.gh = () => this.mh.fire() } Ih() { this.ph.fire() } connect() { this.win.addEventListener("scroll", this._h), this.win.addEventListener("resize", this.gh) } disconnect() { this.win.removeEventListener("scroll", this._h), this.win.removeEventListener("resize", this.gh) } ensureReadyForElements() { } getBorderTop() { return 0 } requiresFixedLayerTransfer() { return !1 } overrideGlobalScrollTo() { return !1 } supportsPositionFixed() { return !0 } onScroll(t) { this.ph.add(t) } onResize(t) { this.mh.add(t) } updatePaddingTop(t) { Vs(this.win.document.documentElement, { "padding-top": Cs(t) }) } hideViewerHeader(t, i) { t || this.updatePaddingTop(0) } showViewerHeader(t, i) { t || this.updatePaddingTop(i) } disableScroll() { this.win.document.documentElement.classList.add("i-amphtml-scroll-disabled") } resetScroll() { this.win.document.documentElement.classList.remove("i-amphtml-scroll-disabled") } updateLightboxMode(t) { return e() } getSize() { const t = this.win.innerWidth, i = this.win.innerHeight; if (t && i) return { width: t, height: i }; const s = this.win.document.documentElement; return { width: s.clientWidth, height: s.clientHeight } } getScrollTop() { const t = this.getScrollingElement().scrollTop || this.win.pageYOffset, { host: i } = this.ampdoc.getRootNode(); return i ? t - i.offsetTop : t } getScrollLeft() { return 0 } getScrollWidth() { return this.getScrollingElement().scrollWidth } getScrollHeight() { return this.getScrollingElement().scrollHeight } getContentHeight() { const t = this.getScrollingElement(), i = t.getBoundingClientRect(), s = i.top + this.getScrollTop(), e = cs(this.win).isSafari() ? Co(this.win, t) : 0, n = ks(this.win, t); return s + parseInt(n.marginTop, 10) + i.height + e + parseInt(n.marginBottom, 10) } contentHeightChanged() { } getLayoutRect(t, i, s) { const e = t.getBoundingClientRect(), n = null != s ? s : this.getScrollTop(), r = null != i ? i : this.getScrollLeft(); return Jt(Math.round(e.left + r), Math.round(e.top + n), Math.round(e.width), Math.round(e.height)) } getRootClientRectAsync() { return Promise.resolve(null) } setScrollTop(t) { this.getScrollingElement().scrollTop = t } getScrollingElement() { const t = this.win.document; return t.scrollingElement ? t.scrollingElement : t.body && this.Rh.isWebKit() ? t.body : t.documentElement } getScrollingElementScrollsLikeViewport() { return !0 } }(t), new class { constructor(t, i, s) { const { win: e } = t; this.ampdoc = t, this.Mh = this.ampdoc.win.document, this.er = i, this.Qe = s, this.yh = null, this.wh = null, this.bh = null, this.Vh = !1, this.Sh = null, this.Ph = Number(s.getParam("paddingTop") || 0), this.xh = 0, this.ke = ps(e), this.sh = gs(e), this.Oh = !1, this.sn = null, this.Ch = 0, this.kh = new Is, this.ph = new Is, this.mh = new Is, this.Nh = void 0, this.Dh = void 0, this.Lh = null, this.Qe.onMessage("viewport", this.Uh.bind(this)), this.Qe.onMessage("scroll", this.$h.bind(this)), this.Qe.onMessage("disableScroll", this.Fh.bind(this)), this.Qe.isEmbedded() && this.er.updatePaddingTop(this.Ph), this.er.onScroll(this.Bh.bind(this)), this.er.onResize(this.Hh.bind(this)), this.onScroll(this.jh.bind(this)), this.zh = !1, this.ampdoc.onVisibilityChanged(this.Gh.bind(this)), this.Gh(); const n = this.Mh.documentElement; if (t.isSingleDoc() && n.classList.add("i-amphtml-singledoc"), s.isEmbedded() ? n.classList.add("i-amphtml-embedded") : n.classList.add("i-amphtml-standalone"), qt(e) && n.classList.add("i-amphtml-iframed"), "1" === s.getParam("webview") && n.classList.add("i-amphtml-webview"), qt(e) && "scrollRestoration" in e.history && (e.history.scrollRestoration = "manual"), this.er.overrideGlobalScrollTo()) try { Object.defineProperty(e, "scrollTo", { value: (t, i) => this.setScrollTop(i) }), ["pageYOffset", "scrollY"].forEach((t => { Object.defineProperty(e, t, { get: () => this.getScrollTop() }) })) } catch (t) { } cs(e).isIos() && qt(e) && this.ampdoc.isSingleDoc() && this.ampdoc.whenReady().then((() => { e.scrollTo(-.1, 0) })) } dispose() { this.er.disconnect() } ensureReadyForElements() { this.er.ensureReadyForElements() } Gh() { const t = this.ampdoc.isVisible(); t != this.zh && (this.zh = t, t ? (this.er.connect(), this.wh && this.Hh(), this.bh && (this.bh = null, this.getScrollTop())) : this.er.disconnect()) } getPaddingTop() { return this.Ph } getScrollTop() { return null == this.bh && (this.bh = this.er.getScrollTop()), this.bh } getScrollLeft() { return null == this.Sh && (this.Sh = this.er.getScrollLeft()), this.Sh } setScrollTop(t) { this.bh = null, this.er.setScrollTop(t) } updatePaddingBottom(t) { this.ampdoc.waitForBodyOpen().then((i => { Ss(i, "borderBottom", `${t}px solid transparent`) })) } getSize() { if (this.wh) return this.wh; if (this.wh = this.er.getSize(), 0 == this.wh.width || 0 == this.wh.height) { const t = this.ampdoc.getVisibilityState(); t != Ts.PRERENDER && t != Ts.VISIBLE || Math.random() < .01 && Rt().error("Viewport", "viewport has zero dimensions") } return this.wh } getHeight() { return this.getSize().height } getWidth() { return this.getSize().width } getScrollWidth() { return this.er.getScrollWidth() } getScrollHeight() { return this.er.getScrollHeight() } getContentHeight() { return this.er.getContentHeight() } contentHeightChanged() { this.er.contentHeightChanged() } getRect() { if (null == this.yh) { const t = this.getScrollTop(), i = this.getScrollLeft(), s = this.getSize(); this.yh = Jt(i, t, s.width, s.height) } return this.yh } getLayoutRect(t) { const i = this.getScrollLeft(), s = this.getScrollTop(), e = Di(t, this.ampdoc.win); if (e) { const n = this.er.getLayoutRect(t, 0, 0), r = this.er.getLayoutRect(e, i, s); return Jt(Math.round(n.left + r.left), Math.round(n.top + r.top), Math.round(n.width), Math.round(n.height)) } return this.er.getLayoutRect(t, i, s) } getClientRectAsync(t) { const i = this.sh.measurePromise((() => t.getBoundingClientRect())); let s = this.er.getRootClientRectAsync(); const e = Di(t, this.ampdoc.win); return e && (s = this.sh.measurePromise((() => e.getBoundingClientRect()))), Promise.all([i, s]).then((t => { const i = t[0], s = t[1]; return s ? Zt(i, s.left, s.top) : (e = i, Jt(Number(e.left), Number(e.top), Number(e.width), Number(e.height))); var e })) } supportsPositionFixed() { return this.er.supportsPositionFixed() } isDeclaredFixed(t) { return !!this.Lh && this.Lh.isDeclaredFixed(t) } scrollIntoView(t) { return this.qh(t).then((i => this.Wh(t, i))) } Wh(t, i) { const s = this.er.getLayoutRect(t).top, e = No(this.ampdoc.win, i); r((() => Math.max(0, s - this.Ph - e))).then((t => this.Kh(i, t))) } animateScrollIntoView(t, i = "top", s, e) { return yt(!e || void 0 !== s), this.qh(t).then((n => this.animateScrollWithinParent(t, n, i, s, e))) } animateScrollWithinParent(t, i, s, e, n) { yt(!n || void 0 !== e); const r = this.er.getLayoutRect(t), { height: h } = this.Yh(i) ? this.getSize() : this.getLayoutRect(i), { win: o } = this.ampdoc, u = No(o, i), l = function (t, i) { return ko(t, i, "scrollPaddingBottom") }(o, i); let c = -u; return "bottom" === s ? c = -h + l + r.height : "center" === s && (c = -(h - u - l) / 2 + r.height / 2), this.Jh(i).then((t => { const s = r.top - this.Ph + c, h = Math.max(0, s); if (h != t) return this.Qh(i, t, h, e, n) })) } Qh(t, i, s, e, n = "ease-in") { const r = void 0 !== e ? e : function (t, i, s = 500) { return Math.floor(function (t, i, s) { return D(0 <= s), Math.min(Math.max(t, 0), s) }(.65 * Math.abs(t - i), 0, s)) }(i, s), h = (o = i, u = s, t => o + (u - o) * t); var o, u; return xo.animate(t, (i => { this.Kh(t, h(i)) }), r, n).thenAlways((() => { this.Kh(t, s) })) } qh(t) { return this.sh.measurePromise((() => Ct(t, ".i-amphtml-scrollable") || this.er.getScrollingElement())) } Kh(t, i) { this.Yh(t) ? this.er.setScrollTop(i) : this.sh.mutate((() => { t.scrollTop = i })) } Jh(t) { return this.Yh(t) ? r((() => this.getScrollTop())) : this.sh.measurePromise((() => t.scrollTop)) } Yh(t) { return t == this.er.getScrollingElement() } getScrollingElement() { return this.sn ? this.sn : this.sn = this.er.getScrollingElement() } onChanged(t) { return this.kh.add(t) } onScroll(t) { return this.ph.add(t) } onResize(t) { return this.mh.add(t) } enterLightboxMode(t, i) { return this.Qe.sendMessage("requestFullOverlay", {}, !0), this.enterOverlayMode(), this.Lh && this.Lh.enterLightbox(t, i), t && this.maybeEnterFieLightboxMode(t), this.er.updateLightboxMode(!0) } leaveLightboxMode(t) { return this.Qe.sendMessage("cancelFullOverlay", {}, !0), this.Lh && this.Lh.leaveLightbox(), this.leaveOverlayMode(), t && this.maybeLeaveFieLightboxMode(t), this.er.updateLightboxMode(!1) } isLightboxExperimentOn() { return Le(this.ampdoc.win, "amp-lightbox-a4a-proto") } maybeEnterFieLightboxMode(t) { const i = this.Xh(t); i && (yt(this.isLightboxExperimentOn()), i.enterFullOverlayMode()) } maybeLeaveFieLightboxMode(t) { const i = this.Xh(t); i && yt(i).leaveFullOverlayMode() } Xh(t) { const i = Di(t, this.ampdoc.win); return i && i.__AMP_EMBED__ } enterOverlayMode() { this.disableTouchZoom(), this.disableScroll() } leaveOverlayMode() { this.resetScroll(), this.restoreOriginalTouchZoom() } disableScroll() { const { win: t } = this.ampdoc, { documentElement: i } = t.document; let s; this.sh.measure((() => { const e = ks(t, i).marginRight, n = function (t) { const { documentElement: i } = t.document; return t.innerWidth - i.clientWidth }(this.ampdoc.win); s = parseInt(e, 10) + n })), this.sh.mutate((() => { Ss(i, "margin-right", s, "px"), this.er.disableScroll() })) } resetScroll() { const { win: t } = this.ampdoc, { documentElement: i } = t.document; this.sh.mutate((() => { Ss(i, "margin-right", ""), this.er.resetScroll() })) } resetTouchZoom() { const t = this.ampdoc.win.innerHeight, i = this.Mh.documentElement.clientHeight; t && i && t === i || this.disableTouchZoom() && this.ke.delay((() => { this.restoreOriginalTouchZoom() }), 50) } disableTouchZoom() { const t = this.Zh(); if (!t) return !1; const i = function (t, i) { const s = function (t) { const i = Object.create(null); if (!t) return i; const s = t.split(/,|;/); for (let t = 0; t < s.length; t++) { const e = s[t].split("="), n = e[0].trim(); let r = e[1]; r = (r || "").trim(), n && (i[n] = r) } return i }(t); let e = !1; for (const t in i) s[t] !== i[t] && (e = !0, void 0 !== i[t] ? s[t] = i[t] : delete s[t]); return e ? function (t) { let i = ""; for (const s in t) i.length > 0 && (i += ","), t[s] ? i += s + "=" + t[s] : i += s; return i }(s) : t }(t.content, { "maximum-scale": "1", "user-scalable": "no" }); return this.io(i) } restoreOriginalTouchZoom() { return void 0 !== this.Dh && this.io(this.Dh) } updateFixedLayer() { return this.Lh ? this.Lh.update() : e() } addToFixedLayer(t, i) { return this.Lh ? this.Lh.addElement(t, i) : e() } removeFromFixedLayer(t) { this.Lh && this.Lh.removeElement(t) } createFixedLayer(t) { this.Lh = new t(this.ampdoc, this.sh, this.er.getBorderTop(), this.Ph, this.er.requiresFixedLayerTransfer()), this.ampdoc.whenReady().then((() => this.Lh.setup())) } io(t) { const i = this.Zh(); return !(!i || i.content == t || (i.content = t, 0)) } Zh() { return qt(this.ampdoc.win) ? null : (void 0 === this.Nh && (this.Nh = this.Mh.querySelector("meta[name=viewport]"), this.Nh && (this.Dh = this.Nh.content)), this.Nh) } $h(t) { const i = t.scrollTop; this.setScrollTop(i) } Uh(t) { const i = t.paddingTop, s = t.duration || 0, e = t.curve, n = t.transient; if (null != i && i != this.Ph && (this.xh = this.Ph, this.Ph = i, this.Lh)) { const t = this.Lh.animateFixedElements(this.Ph, this.xh, s, e, n); i < this.xh ? this.er.hideViewerHeader(n, this.xh) : t.then((() => { this.er.showViewerHeader(n, i) })) } } Fh(t) { t ? this.disableScroll() : this.resetScroll() } so(t, i) { const s = this.getSize(), e = this.getScrollTop(), n = this.getScrollLeft(); this.kh.fire({ relayoutAll: t, top: e, left: n, width: s.width, height: s.height, velocity: i }) } Bh() { this.yh = null, this.Ch++, this.Sh = this.er.getScrollLeft(); const t = this.er.getScrollTop(); if (!(t < 0)) { if (this.bh = t, !this.Oh) { this.Oh = !0; const i = Date.now(); this.ke.delay((() => { this.sh.measure((() => { this.eo(i, t) })) }), 36) } this.ph.fire() } } eo(t, i) { this.bh = this.er.getScrollTop(); const s = this.bh, e = Date.now(); let n = 0; e != t && (n = (s - i) / (e - t)), Math.abs(n) < .03 ? (this.so(!1, n), this.Oh = !1) : this.ke.delay((() => this.sh.measure(this.eo.bind(this, e, s))), 20) } jh() { this.Vh || (this.Vh = !0, this.sh.measure((() => { this.Vh = !1, this.Qe.sendMessage("scroll", { "scrollTop": this.getScrollTop() }, !0) }))) } Hh() { this.yh = null; const t = this.wh; this.wh = null; const i = this.getSize(); this.updateFixedLayer().then((() => { const s = !t || t.width != i.width; this.so(s, 0), (s || t.height != i.height) && this.mh.fire({ relayoutAll: s, width: i.width, height: i.height }) })) } }(t, n, i) } var Lo = { NATURAL: "natural", NATURAL_IOS_EMBED: "natural-ios-embed" }; function Uo(t, i) { yt(t); try { void 0 !== t(i) && Rt().error("VSYNC", "callback returned a value but vsync cannot propogate it: %s", t.toString()) } catch (t) { return l(t), !1 } return !0 } function $o(t) { if (t.defaultPrevented) return; const i = t.target; if (!i || "FORM" != i.tagName) return; let s; s = i.classList.contains("i-amphtml-form") ? !i.hasAttribute("amp-novalidate") : !i.hasAttribute("novalidate"), s && i.checkValidity && !i.checkValidity() && t.preventDefault(); const e = i.elements; for (let t = 0; t < e.length; t++)bt(!e[t].name || e[t].name != rn, "Illegal input name, %s found: %s", rn, e[t]); const n = i.getAttribute("action"), r = i.getAttribute("action-xhr"), h = (i.getAttribute("method") || "GET").toUpperCase(); if (r && (pn(r, i, "action-xhr"), bt(!_n(r), "form action-xhr should not be on AMP CDN: %s", i), Mn(r)), n && (pn(n, i, "action"), bt(!_n(n), "form action should not be on AMP CDN: %s", i), Mn(n)), "GET" == h) bt(r || n, "form action-xhr or action attribute is required for method=GET: %s", i); else if ("POST" == h) { if (n) { const t = "form"; It().error(t, "action attribute is invalid for method=POST: %s", i) } r || (t.preventDefault(), bt(!1, "Only XHR based (via action-xhr attribute) submissions are support for POST requests. %s", i)) } const o = i.getAttribute("target"); o ? bt("_blank" == o || "_top" == o, "form target=%s is invalid can only be _blank or _top: %s", o, i) : i.setAttribute("target", "_top"), r && (t.preventDefault(), t.stopImmediatePropagation(), Xi(i).execute(i, "submit", null, i, i, t, 3)) } var Fo = [""], Bo = 18e4, Ho = null; function jo(t) { var i; (function (t) { wi(t, "crypto", class { constructor(t) { this.i = t; let i = null, s = !1; t.crypto && (t.crypto.subtle ? i = t.crypto.subtle : t.crypto.webkitSubtle && (i = t.crypto.webkitSubtle, s = !0)), this.pkcsAlgo = { name: "RSASSA-PKCS1-v1_5", hash: { name: "SHA-256" } }, this.subtle = i, this.no = s, this.ro = null } sha384(t) { if ("string" == typeof t && (t = H(t)), !this.subtle || this.ro) return (this.ro || this.ho()).then((i => i(t))); try { return this.subtle.digest({ name: "SHA-384" }, t).then((t => new Uint8Array(t)), (i => (i.message && i.message.indexOf("secure origin") < 0 && It().error(xh, "SubtleCrypto failed, fallback to closure lib.", i), this.ho().then((() => this.sha384(t)))))) } catch (i) { return Rt().error(xh, "SubtleCrypto failed, fallback to closure lib.", i), this.ho().then((() => this.sha384(t))) } } sha384Base64(t) { return this.sha384(t).then((t => nh(t))) } uniform(t) { return this.sha384(t).then((t => { let i = 0; for (let s = 2; s >= 0; s--)i = (i + t[s]) / 256; return i })) } ho() { return this.ro ? this.ro : this.ro = hs(this.i).preloadExtension("amp-crypto-polyfill").then((() => Si(this.i, "crypto-polyfill"))) } isPkcsAvailable() { return Boolean(this.subtle) && !1 !== this.i.isSecureContext } importPkcsKey(t) { yt(this.isPkcsAvailable()); const i = this.no ? (s = JSON.stringify(t), "undefined" != typeof TextEncoder ? (new TextEncoder).encode(s) : H(unescape(encodeURIComponent(s)))) : t; var s; return this.subtle.importKey("jwk", i, this.pkcsAlgo, !0, ["verify"]) } verifyPkcs(t, i, s) { return yt(this.isPkcsAvailable()), this.subtle.verify(this.pkcsAlgo, t, i, s) } }) })(t), wi(t, "batched-xhr", sh), Zh(t), co(t), co(i = t), wi(i, "vsync", class { constructor(t) { this.win = t, this.lo = is(this.win), this.co = this.ao(), this.As = [], this.do = [], this.fo = [], this.po = [], this.Le = !1, this.mo = null, this._o = null, this.Ao = this.Po.bind(this), this.vo = new yr(this.win, this.Ao, 16), this.Eo = new yr(this.win, this.Ao, 40), this.To = this.Ro.bind(this), this.lo.isSingleDoc() ? this.lo.getSingleDoc().onVisibilityChanged(this.To) : Ds(this.win.document, this.To) } dispose() { Ls(this.win.document, this.To) } Ro() { this.Le && this.Io() } run(t, i) { this.As.push(t), this.fo.push(i || void 0), this.Rs() } runPromise(t, i) { if (this.run(t, i), this.mo) return this.mo; const s = new n; return this._o = s.resolve, this.mo = s.promise } createTask(t) { return i => { this.run(t, i) } } mutate(t) { this.run({ measure: void 0, mutate: t }) } mutatePromise(t) { return this.runPromise({ measure: void 0, mutate: t }) } measure(t) { this.run({ measure: t, mutate: void 0 }) } measurePromise(t) { return new Promise((i => { this.measure((() => { i(t()) })) })) } canAnimate(t) { return this.Mo(yt(t)) } Mo(t) { if (Ns(this.win.document) != Ts.VISIBLE) return !1; if (this.lo.isSingleDoc()) return this.lo.getSingleDoc().isVisible(); if (t) { const i = this.lo.getAmpDocIfAvailable(t); return !i || i.isVisible() } return !0 } runAnim(t, i, s) { return !!this.Mo(t) && (this.run(i, s), !0) } createAnimTask(t, i) { return s => this.runAnim(t, i, s) } runAnimMutateSeries(t, i, s) { return this.Mo(t) ? new Promise(((e, n) => { const r = Date.now(); let h = 0; const o = this.createAnimTask(t, { mutate: t => { const u = Date.now() - r; i(u, u - h, t) ? s && u > s ? n(new Error("timeout")) : (h = u, o(t)) : e() } }); o({}) })) : Promise.reject(Sn()) } Rs() { this.Le || (this.Le = !0, this.Io()) } Io() { this.Mo() ? (this.co(this.Ao), this.Eo.schedule()) : this.vo.schedule() } Po() { this.Eo.cancel(), this.Le = !1; const { _o: t, fo: i, As: s } = this; this._o = null, this.mo = null, this.As = this.do, this.fo = this.po; for (let t = 0; t < s.length; t++)s[t].measure && (Uo(s[t].measure, i[t]) || (s[t].mutate = void 0)); for (let t = 0; t < s.length; t++)s[t].mutate && Uo(s[t].mutate, i[t]); this.do = s, this.po = i, this.do.length = 0, this.po.length = 0, t && t() } ao() { const t = this.win.requestAnimationFrame || this.win.webkitRequestAnimationFrame; if (t) return t.bind(this.win); let i = 0; return t => { const s = Date.now(), e = Math.max(0, 16 - (s - i)); i = s + e, this.win.setTimeout(t, e) } } }), function (t) { wi(t, "xhr", ih) }(t), function (t) { wi(t, "input", class { constructor(t) { this.win = t, this.yo = this.wo.bind(this), this.bo = this.Vo.bind(this), this.So = null, this.xo = null, this.Oo = null, this.Co = "ontouchstart" in t || void 0 !== t.navigator.maxTouchPoints && t.navigator.maxTouchPoints > 0 || void 0 !== t.DocumentTouch, this.ko = !1, this.win.document.addEventListener("keydown", this.yo), this.win.document.addEventListener("mousedown", this.bo), this.No = !0, this.Do = 0, this.Lo = new Is, this.Uo = new Is, this.$o = new Is, this.Co && (this.No = !this.Co, this.So = this.Fo.bind(this), qe(t.document, "mousemove", this.So)) } setupInputModeClasses(t) { this.onTouchDetected((i => { this.Bo(t, "amp-mode-touch", i) }), !0), this.onMouseDetected((i => { this.Bo(t, "amp-mode-mouse", i) }), !0), this.onKeyboardStateChanged((i => { this.Bo(t, "amp-mode-keyboard-active", i) }), !0) } isTouchDetected() { return this.Co } onTouchDetected(t, i) { return i && t(this.isTouchDetected()), this.Lo.add(t) } isMouseDetected() { return this.No } onMouseDetected(t, i) { return i && t(this.isMouseDetected()), this.Uo.add(t) } isKeyboardActive() { return this.ko } onKeyboardStateChanged(t, i) { return i && t(this.isKeyboardActive()), this.$o.add(t) } Bo(t, i, s) { t.waitForBodyOpen().then((t => { gs(this.win).mutate((() => { t.classList.toggle(i, s) })) })) } wo(t) { if (this.ko) return; if (t.defaultPrevented) return; const { target: i } = t; i && ("INPUT" == i.tagName || "TEXTAREA" == i.tagName || "SELECT" == i.tagName || "OPTION" == i.tagName || i.hasAttribute("contenteditable")) || (this.ko = !0, this.$o.fire(!0)) } Vo() { this.ko && (this.ko = !1, this.$o.fire(!1)) } Fo(t) { if (t.sourceCapabilities && t.sourceCapabilities.firesTouchEvents) return void this.Ho(); let i; this.Oo || (this.Oo = this.jo.bind(this), this.xo = this.Ho.bind(this)); const s = function (t, i, s, e) { let n; const r = new Promise((i => { n = qe(t, "click", i, void 0) })); return r.then(n, n), e && e(n), r }(this.win.document, 0, 0, (t => { i = t })); return ps(this.win).timeoutPromise(300, s).then(this.xo, (() => { i && i(), this.Oo() })) } jo() { this.No = !0, this.Uo.fire(!0) } Ho() { this.Do++, this.Do <= 3 && qe(this.win.document, "mousemove", this.So) } }) }(t), function (t) { wi(t, "preconnect", class { constructor(t) { this.zo = t.document, this.Go = t.document.head, this.qo = {}, this.Wo = {}, this.Rh = cs(t), this.qo[on(t.location.href).origin] = !0, this.Ko = function (t) { if (!Ho) { const i = t.document.createElement("link"), s = i.relList; if (i.as = "invalid-value", !s || !s.supports) return {}; Ho = { preconnect: s.supports("preconnect"), preload: s.supports("preload"), onlyValidAs: "invalid-value" != i.as } } return Ho }(t), this.ke = ps(t) } url(t, i, s) { t.whenFirstVisible().then((() => { this.pi(t, i, s) })) } pi(t, i, s) { if (!this.Yo(i)) return; const { origin: e } = on(i), n = Date.now(), r = this.qo[e]; if (r && n < r) return void (s && (this.qo[e] = n + Bo)); const h = s ? Bo : 1e4; let o; this.qo[e] = n + h, this.Ko.preconnect || (o = this.zo.createElement("link"), o.setAttribute("rel", "dns-prefetch"), o.setAttribute("href", e), this.Go.appendChild(o)); const u = this.zo.createElement("link"); u.setAttribute("rel", "preconnect"), u.setAttribute("href", e), u.setAttribute("referrerpolicy", "origin"), this.Go.appendChild(u), this.ke.delay((() => { o && o.parentNode && o.parentNode.removeChild(o), u.parentNode && u.parentNode.removeChild(u) }), 1e4), this.Jo(t, e) } preload(t, i, s) { this.Yo(i) && (this.Wo[i] || (this.Wo[i] = !0, this.url(t, i, !0), this.Ko.preload && ("document" == s && this.Rh.isSafari() || t.whenFirstVisible().then((() => { this.Qo(i) }))))) } Qo(t) { const i = Ve(this.zo)(Fo); i.setAttribute("href", t), this.Ko.onlyValidAs ? i.as = "fetch" : i.as = "", this.Go.appendChild(i) } Yo(t) { return !(!t.startsWith("https:") && !t.startsWith("http:")) } Jo(t, i) { if (this.Ko.preconnect || !this.Rh.isSafari() && !this.Rh.isIos()) return; const s = Date.now(); this.qo[i] = s + Bo; const e = i + "/robots.txt?_AMP_safari_preconnect_polyfill_cachebust=" + (s - s % Bo), n = new XMLHttpRequest; n.open("HEAD", e, !0), n.withCredentials = !0, n.send() } }) }(t) } function zo(t) { yt(!t.getParent()), function (t, i) { (function (t) { Vi(t, "url", class { constructor(t) { const i = t.getRootNode(), s = i.ownerDocument || i; this.Xo = s.createElement("a"), this.Zo = null } parse(t, i) { return un(this.Xo, t) } tu(t) { return "string" != typeof t ? t : this.parse(t) } isProtocolValid(t) { return An(t) } getSourceOrigin(t) { return En(this.tu(t)) } getSourceUrl(t) { return vn(this.tu(t)) } resolveRelativeUrl(t, i) { return Tn(t, this.tu(i)) } assertHttpsUrl(t, i, s = "source") { return pn(t, i, s) } assertAbsoluteHttpOrHttpsUrl(t) { return function (t) { return bt(/^https?\:/i.test(t), 'URL must start with "http://" or "https://". Invalid value: %s', t), on(t).href }(t) } isProxyOrigin(t) { return _n(this.tu(t)) } isSecure(t) { return fn(this.tu(t)) } getWinOrigin(t) { return t.origin || this.tu(t.location.href).origin } getCdnUrlOnOrigin(t) { if (_n(t)) return t; const { hash: i, host: s, pathname: e, search: n } = this.tu(t), r = encodeURIComponent(s); return `${et}/c/${r}${e}${n}${i}` } }, !0) })(t), function (t) { Vi(t, "templates", class { constructor(t) { this.ji = t, this.iu = {}, this.su = {} } whenReady(t) { return this.eu(t).then(lo) } setHtmlForTemplate(t, i) { return this.eu(t).then((t => this.nu(t, i))) } renderTemplate(t, i) { return this.eu(t).then((t => this.ru(t, i))) } renderTemplateAsString(t, i) { return this.eu(t).then((t => t.renderAsString(i))) } getTemplateRenderer(t) { return this.eu(t).then((t => ({ renderAsString: i => t.renderAsString(i) }))) } renderTemplateArray(t, i) { return 0 == i.length ? Promise.resolve([]) : this.eu(t).then((t => i.map((i => this.ru(t, i))))) } findAndRenderTemplate(t, i, s) { return this.renderTemplate(this.findTemplate(t, s), i) } findAndSetHtmlForTemplate(t, i, s) { return this.setHtmlForTemplate(this.findTemplate(t, s), i) } findAndRenderTemplateArray(t, i, s) { return this.renderTemplateArray(this.findTemplate(t, s), i) } hasTemplate(t, i) { return !!this.maybeFindTemplate(t, i) } findTemplate(t, i) { const s = this.maybeFindTemplate(t, i); bt(s, "Template not found for %s", t); const e = s.tagName; return bt("TEMPLATE" == e || "SCRIPT" == e && "text/plain" === s.getAttribute("type"), 'Template must be defined in a