Re: Re: sdk.js

From disqus.com, 1 Month ago, written in JavaScript, viewed 3 times. This paste is a reply to Re: sdk.js from disqus.com - view diff
URL https://pastebin.freepbx.org/view/de67770b Embed
Download Paste or View Raw
  1. ! function(a, b) {
  2.     function c(a) {
  3.         if (Array.isArray(a)) {
  4.             for (var b = 0, c = Array(a.length); b < a.length; b++) c[b] = a[b];
  5.             return c
  6.         }
  7.         return Array.from(a)
  8.     }
  9.  
  10.     function d(a, b) {
  11.         if (!(a instanceof b)) throw new TypeError("Cannot call a class as a function")
  12.     }
  13.  
  14.     function d(a, b) {
  15.         if (!(a instanceof b)) throw new TypeError("Cannot call a class as a function")
  16.     }
  17.     var e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z, $, _, aa, ba, ca, da, ea, fa, ga, ha = {},
  18.         ia = {},
  19.         ja = {},
  20.         ka = {},
  21.         la = {},a
  22.         ma = {},
  23.         na = {},
  24.         oa = {},
  25.         pa = {};
  26.     e = function(a, b) {
  27.         return Object.prototype.hasOwnProperty.call(a, b)
  28.     }, f = function(a) {a
  29.         return function(b, c) {
  30.             var d = b.length,
  31.                 e = Array.prototype.forEach;
  32.             if (isNaN(d))
  33.                 for (var f in b) a(b, f) && c(b[f], f, b);
  34.             else if (e) e.call(b, c);
  35.             else
  36.                 for (var g = 0; g < d; g++) c(b[g], g, b)
  37.         }
  38.     }(e), ha = function(a) {
  39.         var c = f;
  40.         return a = function(a) {
  41.             var d = [];
  42.             return c(a, function(a, c) {
  43.                 a !== b && d.push(encodeURIComponent(c) + (null === a ? "" : "=" + encodeURIComponent(a)))
  44.             }), d.join("&")
  45.         }
  46.     }(ha), ia = function(a) {
  47.         var b = ha;
  48.         return a = function c(a, d, e) {
  49.             if (d && (a.indexOf("?") === -1 ? a += "?" : "&" !== a.charAt(a.length - 1) && (a += "&"), a += b(d)), e) {
  50.                 var f = {};
  51.                 return f[(new Date).getTime()] = null, c(a, f)
  52.             }
  53.             var g = a.length;
  54.             return "&" === a.charAt(g - 1) ? a.slice(0, g - 1) : a
  55.         }
  56.     }(ia), ja = function(b) {
  57.         var c = ia,
  58.             d = a.document,
  59.             e = d.head || d.getElementsByTagName("head")[0] || d.body;
  60.         return b = function(a, b, f, g) {
  61.             var h = d.createElement("script");
  62.             h.src = c(a, b, f), h.async = !0, h.charset = "UTF-8", h.onload = g, e.appendChild(h)
  63.         }
  64.     }(ja), g = function(b) {
  65.         function c(a) {
  66.             return f.getElementById(a) || f.body || f.documentElement
  67.         }
  68.  
  69.         function d(a) {
  70.             return g.href = a, g.hostname
  71.         }
  72.  
  73.         function e(a, b) {
  74.             b = b || f.documentElement;
  75.             for (var c = a, d = 0, e = 0; c && c !== b;) d += c.offsetLeft, e += c.offsetTop, c = c.offsetParent;
  76.             return {
  77.                 top: e,
  78.                 left: d,
  79.                 height: a.offsetHeight,
  80.                 width: a.offsetWidth
  81.             }
  82.         }
  83.         var f = a.document,
  84.             g = f.createElement("a");
  85.         return {
  86.             getContainer: c,
  87.             getHost: d,
  88.             getOffset: e
  89.         }
  90.     }({}), h = function() {
  91.         var b = "adsbox",
  92.             c = 100,
  93.             d = a.document;
  94.         return function(a) {
  95.             if (a) {
  96.                 var e = d.createElement("div");
  97.                 e.innerHTML = "&nbsp;", e.className = b, d.body.appendChild(e), setTimeout(function() {
  98.                     a(0 === e.offsetHeight), d.body.removeChild(e)
  99.                 }, c)
  100.             }
  101.         }
  102.     }(), i = function(a) {
  103.         try {
  104.             return a.self !== a.top
  105.         } catch (b) {
  106.             return !0
  107.         }
  108.     }, j = function(b) {
  109.         return b = b || a, /Mobile|iP(hone|od|ad)|Android|BlackBerry|IEMobile|Kindle|NetFront|Silk-Accelerated|(hpw|web)OS|Fennec|Minimo|Opera M(obi|ini)|Blazer|Dolfin|Dolphin|Skyfire|Zune/i.test(b.navigator.userAgent || b.navigator.vendor || b.opera)
  110.     }, k = function(a, b) {
  111.         return function(c) {
  112.             return a(Array.prototype.slice.call(arguments, 1), function(a) {
  113.                 for (var d in a) b(a, d) && (c[d] = a[d])
  114.             }), c
  115.         }
  116.     }(f, e), l = function(b) {
  117.         var c = "https:" === a.location.protocol,
  118.             d = {
  119.                 root: "https://disqus.com",
  120.                 shortener: "http://disq.us",
  121.                 logger: "https://x.disq.us",
  122.                 media: "https://c.disquscdn.com/next/current/embed",
  123.                 realertime: "//realtime.services.disqus.com",
  124.                 jester: "https://referrer.disqus.com/juggler",
  125.                 glitter: "https://glitter.services.disqus.com/urls/",
  126.                 login: "https://disqus.com/next/login/",
  127.                 dotcomLogin: "https://disqus.com/profile/login/",
  128.                 api: "https://disqus.com/api/3.0/",
  129.                 logout: "http://disqus.com/logout/",
  130.                 editProfile: "https://disqus.com/home/settings/account/",
  131.                 verifyEmail: "https://disqus.com/next/verify/",
  132.                 authorize: "https://disqus.com/api/oauth/2.0/authorize/",
  133.                 home: "https://disqus.com/home/",
  134.                 homeInbox: "https://disqus.com/home/inbox/",
  135.                 moderate: "https://disqus.com/admin/moderate/",
  136.                 oauth: {
  137.                     twitter: "https://disqus.com/_ax/twitter/begin/",
  138.                     google: "https://disqus.com/_ax/google/begin/",
  139.                     facebook: "https://disqus.com/_ax/facebook/begin/"
  140.                 },
  141.                 avatar: {
  142.                     generic: "https://c.disquscdn.com/next/embed/assets/img/noavatar92.7b2fde640943965cc88df0cdee365907.png"
  143.                 },
  144.                 linkAffiliatorClientV4: "https://c.disquscdn.com/next/embed/alfie_v4.63f1ab6d6b9d5807dc0c94ef3fe0b851.js",
  145.                 linkAffiliatorClientV5: "https://c.disquscdn.com/next/embed/alfie_v5.c2cfb63e352676d3870fc7a1c5d2bd0b.js",
  146.                 linkAffiliatorAPI: "https://links.services.disqus.com/api",
  147.                 zyncPixelImage: "https://live.rezync.com/pixel.gif?c=4656c20ee35215f78e9273796625d90b"
  148.             };
  149.         return c && (d = b(d, {
  150.             logout: "https://disqus.com/logout/",
  151.             editProfile: "https://disqus.com/home/settings/account/",
  152.             moderate: "https://disqus.com/admin/moderate/"
  153.         })), d
  154.     }(k), m = function(a) {
  155.         return a
  156.     }(l), n = function(c) {
  157.         function d(a) {
  158.             var b = a.split("."),
  159.                 c = b.length > 2 ? b[b.length - 2] : "";
  160.             return c.match(/^[0-9a-f]{32}$/i) && c
  161.         }
  162.  
  163.         function e(b) {
  164.             (new a.Image).src = j(l + "/stat.gif", {
  165.                 event: b
  166.             })
  167.         }
  168.  
  169.         function g(b) {
  170.             (new a.Image).src = j(l + "/event.gif", b)
  171.         }
  172.  
  173.         function h(c) {
  174.             var d = new a.URLSearchParams;
  175.             i(c, function(a, c) {
  176.                 a !== b && d.append(c, a)
  177.             });
  178.             var e = new a.XMLHttpRequest;
  179.             e.open("POST", l + "/event.json", !0), e.withCredentials = !0, e.send(d)
  180.         }
  181.         var i = f,
  182.             j = ia,
  183.             k = m,
  184.             l = k.jester;
  185.         return {
  186.             getLoaderVersionFromUrl: d,
  187.             logStat: e,
  188.             reportJester: g,
  189.             reportJesterPOST: h
  190.         }
  191.     }({}), o = function() {
  192.         function b(b) {
  193.             b = b || {};
  194.             var c = b.Math || a.Math,
  195.                 d = b.Date || a.Date;
  196.             try {
  197.                 var e = (new d).getTimezoneOffset(),
  198.                     f = 1,
  199.                     g = a.screen;
  200.                 g && g.availWidth ? f = g.availWidth * g.availHeight + g.colorDepth : g && g.width && (f = g.width * g.height);
  201.                 var h = a.document.documentElement,
  202.                     i = h.clientWidth * h.clientHeight;
  203.                 return c.abs(17 * e + 25 * f - i)
  204.             } catch (j) {
  205.                 return 1
  206.             }
  207.         }
  208.         return {
  209.             get: b
  210.         }
  211.     }(), p = function(b) {
  212.         function c(b) {
  213.             b = b || {};
  214.             var c = b.Uint32Array || a.Uint32Array,
  215.                 d = b.crypto || a.crypto,
  216.                 e = b.Math || a.Math;
  217.             try {
  218.                 var f = new c(1);
  219.                 return d.getRandomValues(f), f[0]
  220.             } catch (g) {
  221.                 return e.floor(1e9 * e.random())
  222.             }
  223.         }
  224.  
  225.         function d() {
  226.             var b = a.performance,
  227.                 c = b && b.timing;
  228.             if (!c) return 1e5;
  229.             var d = c.domainLookupEnd - c.domainLookupStart,
  230.                 e = c.connectEnd - c.connectStart,
  231.                 f = c.responseStart - c.navigationStart;
  232.             return 11 * d + 13 * e + 17 * f
  233.         }
  234.  
  235.         function e(e) {
  236.             e = e || {};
  237.             var f = e.Math || a.Math,
  238.                 g = Number((new Date).getTime().toString().substring(3)),
  239.                 h = f.abs(g + d() - b.get()).toString(32);
  240.             return h += c(e).toString(32)
  241.         }
  242.         return {
  243.             generate: e
  244.         }
  245.     }(o), q = function(b) {
  246.         var c = a.document,
  247.             d = c.createElement("iframe");
  248.         return d.style.display = "none",
  249.             function(a, b) {
  250.                 var e = b && b[a] || null;
  251.                 try {
  252.                     return d.parentNode !== c.body && c.body.appendChild(d), d.contentWindow[a] || e
  253.                 } catch (f) {
  254.                     return e
  255.                 }
  256.             }
  257.     }({}), r = function() {
  258.         var c = {
  259.             isIE: function() {
  260.                 return Boolean(a.document.documentMode)
  261.             },
  262.             isSafari: function() {
  263.                 var b = a.navigator.userAgent.toLowerCase();
  264.                 return b.indexOf("safari") > -1 && b.indexOf("chrome") === -1
  265.             },
  266.             isFirefox: function() {
  267.                 var b = a.navigator.userAgent.toLowerCase();
  268.                 return b.indexOf("firefox") > -1 && b.indexOf("chrome") === -1
  269.             },
  270.             isChrome: function() {
  271.                 var c = a.navigator.userAgent.toLowerCase();
  272.                 return c.indexOf("crios") > -1 || Boolean(a.chrome) && "Google Inc." === a.navigator.vendor && a.opr === b && c.indexOf("edge") === -1
  273.             },
  274.             isEdge: function() {
  275.                 var b = a.navigator.userAgent.toLowerCase();
  276.                 return b.indexOf("edge") > -1
  277.             },
  278.             isOpera: function() {
  279.                 var b = a.navigator.userAgent.toLowerCase();
  280.                 return b.indexOf("opera") > -1 || b.indexOf("opr") > -1
  281.             },
  282.             isCrawler: function(c) {
  283.                 c === b && (c = a);
  284.                 var d = c.navigator.userAgent;
  285.                 return /bot|crawl|slurp|spider|facebookexternalhit|embedly|feedly|pinterest/i.test(d)
  286.             }
  287.         };
  288.         return c
  289.     }(), s = function(a) {
  290.         return "[object String]" === Object.prototype.toString.call(a)
  291.     }, t = function() {
  292.         return a.getComputedStyle ? function(b, c, d) {
  293.             try {
  294.                 return a.document.defaultView.getComputedStyle(b, null).getPropertyValue(c)
  295.             } catch (e) {
  296.                 return null
  297.             }
  298.         } : function(a, b, c) {
  299.             return a.currentStyle[b] || a.currentStyle[c]
  300.         }
  301.     }(), u = function(a) {
  302.         function b(a) {
  303.             return a.replace(/\s+/g, "").toLowerCase()
  304.         }
  305.         var c = f,
  306.             d = s,
  307.             e = k;
  308.         return function(a, f, g) {
  309.             var h = {};
  310.             d(f) ? h[f] = g : h = f;
  311.             var i = e({}, h);
  312.             c(i, function(a, c) {
  313.                 var d = b(c);
  314.                 d !== c && (delete i[c], i[d] = a), null === a && (i[d] = ""), void 0 === a && delete i[d]
  315.             });
  316.             var j = a.style;
  317.             c(i, function(a, b) {
  318.                 j.setProperty(b, String(a), "important")
  319.             })
  320.         }
  321.     }({}), v = function(b) {
  322.         function c(a) {
  323.             return a.replace(/\s+/g, "").toLowerCase()
  324.         }
  325.  
  326.         function d(a) {
  327.             return a = a.replace(/^#([a-f0-9])([a-f0-9])([a-f0-9])$/, "#$1$1$2$2$3$3"), a = a.slice(1), {
  328.                 red: parseInt(a.slice(0, 2), 16),
  329.                 green: parseInt(a.slice(2, 4), 16),
  330.                 blue: parseInt(a.slice(4, 6), 16)
  331.             }
  332.         }
  333.  
  334.         function e(a) {
  335.             var b = a.match(/^rgb\((\d+),(\d+),(\d+)\)$/);
  336.             return {
  337.                 red: parseInt(b[1], 10),
  338.                 green: parseInt(b[2], 10),
  339.                 blue: parseInt(b[3], 10)
  340.             }
  341.         }
  342.  
  343.         function f(a) {
  344.             var b = a.match(/^rgba\((\d+),(\d+),(\d+),([\d.]+)\)$/);
  345.             return {
  346.                 red: parseInt(b[1], 10),
  347.                 green: parseInt(b[2], 10),
  348.                 blue: parseInt(b[3], 10),
  349.                 alpha: parseFloat(b[4])
  350.             }
  351.         }
  352.  
  353.         function g(b, c, d, e) {
  354.             return c = a.document.createElement(c), i(c, {
  355.                 visibility: "hidden",
  356.                 color: d
  357.             }), b.appendChild(c), d = e(c), b.removeChild(c), d
  358.         }
  359.  
  360.         function h(b, d) {
  361.             d = d || {};
  362.             var f = d.container || a.document.body;
  363.             return a.getComputedStyle ? (b = g(f, "span", b, function(b) {
  364.                 return a.getComputedStyle(b, null).getPropertyValue("color")
  365.             }), e(c(b))) : (b = g(f, "textarea", b, function(a) {
  366.                 return a.createTextRange().queryCommandValue("ForeColor")
  367.             }), {
  368.                 red: 255 & b,
  369.                 blue: b >>> 16,
  370.                 green: (65280 & b) >>> 8
  371.             })
  372.         }
  373.         var i = u;
  374.         return function(a, b) {
  375.             a = c(a);
  376.             var g;
  377.             if ("transparent" === a) return {
  378.                 red: 0,
  379.                 green: 0,
  380.                 blue: 0,
  381.                 alpha: 0
  382.             };
  383.             if ("#" === a.charAt(0)) g = d;
  384.             else if ("rgba(" === a.slice(0, 5)) g = f;
  385.             else if ("rgb(" === a.slice(0, 4)) g = e;
  386.             else {
  387.                 if (!/^[a-z]+$/.test(a)) throw new Error("parseColor received unparseable color: " + a);
  388.                 g = h
  389.             }
  390.             return g(a, b)
  391.         }
  392.     }({}), w = function(c) {
  393.         function d(a) {
  394.             for (var b = [/(https?:)?\/\/(www\.)?disqus\.com\/forums\/([\w_-]+)/i, /(https?:)?\/\/(www\.)?([\w_-]+)\.disqus\.com/i, /(https?:)?\/\/(www\.)?dev\.disqus\.org\/forums\/([\w_-]+)/i, /(https?:)?\/\/(www\.)?([\w_-]+)\.dev\.disqus\.org/i], c = 0; c < b.length; c++) {
  395.                 var d = a.match(b[c]);
  396.                 if (d && d.length && 4 === d.length) return d[3]
  397.             }
  398.             return null
  399.         }
  400.  
  401.         function e(a, b, c) {
  402.             var e = a.querySelector('script[src*="disqus"][src$="' + b + '"]');
  403.             if (e) {
  404.                 var f = e.getAttribute ? e.getAttribute("src") : e.src;
  405.                 c = c || d;
  406.                 var g = c(f);
  407.                 return g ? g.toLowerCase() : null
  408.             }
  409.             return null
  410.         }
  411.  
  412.         function f(a, b) {
  413.             var c, d, e = 0,
  414.                 f = new Array(a.length);
  415.             for (c = 0; c <= a.length; c++)
  416.                 for (f[c] = new Array(b.length), d = 0; d <= b.length; d++) f[c][d] = 0;
  417.             for (c = 0; c < a.length; c++)
  418.                 for (d = 0; d < b.length; d++) a[c] === b[d] && (f[c + 1][d + 1] = f[c][d] + 1, f[c + 1][d + 1] > e && (e = f[c + 1][d + 1]));
  419.             return e
  420.         }
  421.  
  422.         function g() {
  423.             for (var a = z.getElementsByTagName("h1"), c = z.title, d = c.length, e = c, g = .6, h = function(a) {
  424.                     var h, i = a.textContent || a.innerText;
  425.                     null !== i && i !== b && (h = f(c, i) / d, h > g && (g = h, e = i))
  426.                 }, i = 0; i < a.length; i++) h(a[i]);
  427.             return e
  428.         }
  429.  
  430.         function h(a) {
  431.             return a.toLowerCase().replace(/^\s+|\s+$/g, "").replace(/['"]/g, "")
  432.         }
  433.  
  434.         function i(a) {
  435.             var b = 0,
  436.                 c = 1,
  437.                 d = 2;
  438.             if (!y("atob") || !y("requestAnimationFrame")) return c;
  439.             try {
  440.                 a.postMessage("ping", "*")
  441.             } catch (e) {
  442.                 return d
  443.             }
  444.             return b
  445.         }
  446.  
  447.         function j(a, b, c) {
  448.             c = c || b;
  449.             var d = w(a, b, c);
  450.             return !d || /color/i.test(b) && 0 === x(d).alpha ? a && j(a.parentNode, b, c) || d : d || null
  451.         }
  452.  
  453.         function k(a, b, c, d) {
  454.             u(b) && (b = z.createElement(b));
  455.             var e = null;
  456.             return b.style.visibility = "hidden", a.appendChild(b), e = j(b, c, d), a.removeChild(b), e
  457.         }
  458.  
  459.         function l(a) {
  460.             for (var b, c = k(a, "span", "font-family", "fontFamily"), d = c.split(","), e = {
  461.                     courier: 1,
  462.                     times: 1,
  463.                     "times new roman": 1,
  464.                     georgia: 1,
  465.                     palatino: 1,
  466.                     serif: 1
  467.                 }, f = 0; f < d.length; f++)
  468.                 if (b = h(d[f]), e.hasOwnProperty(b)) return !0;
  469.             return !1
  470.         }
  471.  
  472.         function m(a) {
  473.             var b = z.createElement("a");
  474.             return b.href = Number(new Date), x(k(a, b, "color"), {
  475.                 container: a
  476.             })
  477.         }
  478.  
  479.         function n(a) {
  480.             var b = a.red,
  481.                 c = a.green,
  482.                 d = a.blue;
  483.             if (a.hasOwnProperty("alpha")) {
  484.                 var e = a.alpha,
  485.                     f = function(a) {
  486.                         return Math.round(a * e + 255 * (1 - e))
  487.                     };
  488.                 b = f(b), c = f(c), d = f(d)
  489.             }
  490.             return (299 * b + 587 * c + 114 * d) / 1e3
  491.         }
  492.  
  493.         function o(a) {
  494.             var b = k(a, "span", "background-color", "backgroundColor"),
  495.                 c = x(b, {
  496.                     container: a
  497.                 });
  498.             return 0 === c.alpha ? "light" : n(c) < 128 ? "dark" : "light"
  499.         }
  500.         var p = r,
  501.             u = s,
  502.             w = t,
  503.             x = v,
  504.             y = q,
  505.             z = a.document,
  506.             A = function() {
  507.                 var a, b, c = function() {
  508.                     return !1
  509.                 };
  510.                 if ("hidden" in z) a = "hidden", b = "visibilitychange";
  511.                 else {
  512.                     if (!("webkitHidden" in z)) return {
  513.                         isHidden: c,
  514.                         listen: c,
  515.                         stopListening: c
  516.                     };
  517.                     a = "webkitHidden", b = "webkitvisibilitychange"
  518.                 }
  519.                 return {
  520.                     isHidden: function() {
  521.                         return z[a]
  522.                     },
  523.                     listen: function(a) {
  524.                         return z.addEventListener(b, a)
  525.                     },
  526.                     stopListening: function(a) {
  527.                         return z.removeEventListener(b, a)
  528.                     }
  529.                 }
  530.             }(),
  531.             B = function() {
  532.                 var a = z.createElement("div");
  533.                 a.style.visibility = "hidden", a.style.width = "100px", a.style.msOverflowStyle = "scrollbar", z.body.appendChild(a);
  534.                 var b = a.offsetWidth;
  535.                 a.style.overflow = "scroll";
  536.                 var c = z.createElement("div");
  537.                 c.style.width = "100%", a.appendChild(c);
  538.                 var d = c.offsetWidth;
  539.                 return a.parentNode.removeChild(a), b - d
  540.             },
  541.             C = {
  542.                 getItem: function(b) {
  543.                     try {
  544.                         return a.localStorage.getItem(b)
  545.                     } catch (c) {}
  546.                 },
  547.                 setItem: function(b, c) {
  548.                     try {
  549.                         return a.localStorage.setItem(b, c)
  550.                     } catch (d) {}
  551.                 }
  552.             },
  553.             D = 1,
  554.             E = function(a) {
  555.                 if (a.nodeType === D) {
  556.                     var b = w(a, "max-height", "maxHeight"),
  557.                         c = w(a, "overflow-y", "overflowY");
  558.                     return b && "none" !== b && c && "visible" !== c
  559.                 }
  560.             },
  561.             F = 4,
  562.             G = function(a) {
  563.                 if (a.nodeType === D) return a.scrollHeight - a.clientHeight > F
  564.             },
  565.             H = function() {
  566.                 if (z.querySelector) {
  567.                     var a = z.querySelector("link[rel=canonical]");
  568.                     if (a) return a.href
  569.                 }
  570.             };
  571.         return {
  572.             MAX_Z_INDEX: 2147483647,
  573.             getShortnameFromUrl: d,
  574.             getForum: e,
  575.             guessThreadTitle: g,
  576.             getContrastYIQ: n,
  577.             getColorScheme: o,
  578.             getElementStyle: k,
  579.             getAnchorColor: m,
  580.             normalizeFontValue: h,
  581.             isSerif: l,
  582.             getBrowserSupport: i,
  583.             pageVisibility: A,
  584.             getScrollbarWidth: B,
  585.             browser: p,
  586.             storage: C,
  587.             appearsToHideContent: E,
  588.             hasOverflow: G,
  589.             getCanonicalUrl: H
  590.         }
  591.     }({}), x = function(a) {
  592.         var c = f,
  593.             d = p,
  594.             e = q,
  595.             g = w,
  596.             h = function(a, c) {
  597.                 this.win = a, this.configurator = c, this.config = {
  598.                     page: {
  599.                         url: b,
  600.                         title: b,
  601.                         slug: b,
  602.                         category_id: b,
  603.                         identifier: b,
  604.                         language: b,
  605.                         integration: b,
  606.                         api_key: b,
  607.                         remote_auth_s3: b,
  608.                         author_s3: b
  609.                     },
  610.                     experiment: {
  611.                         enable_scroll_container: !0,
  612.                         force_auto_styles: b,
  613.                         sort_order: b,
  614.                         force_mobile: b
  615.                     },
  616.                     server_side: {
  617.                         service: "static",
  618.                         experiment: "default",
  619.                         variant: "control",
  620.                         top_placement_url: b,
  621.                         bottom_placement_url: b,
  622.                         inthread_placement_url: b,
  623.                         recommendations_placement_url: b,
  624.                         lightbox_url: b,
  625.                         sidebar_placement_url: b,
  626.                         default_placement_url: b,
  627.                         inthread_leading_comment_count: b,
  628.                         inthread_repeat_comment_count: b,
  629.                         inthread_trailing_comment_count: b,
  630.                         inthread_count_children: b,
  631.                         inthread_multiple_ads: b,
  632.                         sandbox_ads: b,
  633.                         can_disable_ads: b,
  634.                         forum_id: b,
  635.                         is_private: b,
  636.                         forum: {
  637.                             id: b,
  638.                             disable_disqus_branding: b,
  639.                             recommendation_placement: b
  640.                         },
  641.                         recs_outside_embed_enabled: b,
  642.                         lazyload_viewports: b,
  643.                         quintesse_enabled: b,
  644.                         forceSwitch: b,
  645.                         forceRecommendationsOutside: b,
  646.                         forceLocalHome: b
  647.                     },
  648.                     disable_ads: b,
  649.                     strings: b,
  650.                     sso: {},
  651.                     callbacks: {
  652.                         preData: [],
  653.                         preInit: [],
  654.                         onInit: [],
  655.                         afterRender: [],
  656.                         onReady: [],
  657.                         onNewComment: [],
  658.                         preReset: [],
  659.                         onPaginate: [],
  660.                         onIdentify: [],
  661.                         beforeComment: []
  662.                     }
  663.                 }
  664.             };
  665.         h.DISQUS_GLOBALS = ["shortname", "identifier", "url", "title", "integration", "slug", "category_id"];
  666.         var i = h.prototype;
  667.         return i.getContainer = function() {
  668.             var a = this.win;
  669.             return a.document.getElementById(a.disqus_container_id || "disqus_thread")
  670.         }, i.runConfigurator = function() {
  671.             var a = this.configurator || this.win.disqus_config;
  672.             if ("function" == typeof a) try {
  673.                 a.call(this.config)
  674.             } catch (b) {}
  675.         }, i.getValuesFromGlobals = function() {
  676.             var a, b = this.win,
  677.                 d = this.config,
  678.                 e = d.page;
  679.             c(h.DISQUS_GLOBALS, function(a) {
  680.                 var c = b["disqus_" + a];
  681.                 "undefined" != typeof c && (e[a] = c)
  682.             }), this.runConfigurator(), d.forum || (a = e.shortname, d.forum = a ? a.toLowerCase() : g.getForum(b.document, "embed.js"))
  683.         }, i.toJSON = function() {
  684.             var a, c = this.win,
  685.                 f = this.config,
  686.                 h = f.page,
  687.                 i = this.getContainer(),
  688.                 j = g.getBrowserSupport(c);
  689.             return this.getValuesFromGlobals(), (f.server_side.top_placement_url || f.server_side.inthread_placement_url || f.server_side.bottom_placement_url || f.server_side.recommendations_placement_url || f.server_side.lightbox_url) && (a = d.generate({
  690.                 Math: e("Math", c),
  691.                 crypto: e("crypto", c),
  692.                 Uint32Array: e("Uint32Array", c),
  693.                 Date: e("Date", c)
  694.             })), {
  695.                 impressionId: a || null,
  696.                 container: i,
  697.                 forum: f.forum,
  698.                 sortOrder: f.experiment.sort_order || g.storage.getItem("disqus.sort") || "default",
  699.                 language: f.language,
  700.                 typeface: g.isSerif(i) ? "serif" : "sans-serif",
  701.                 anchorColor: g.getAnchorColor(i),
  702.                 colorScheme: g.getColorScheme(i),
  703.                 canonicalUrl: g.getCanonicalUrl(),
  704.                 url: h.url || c.location.href.replace(/#.*$/, ""),
  705.                 title: h.title,
  706.                 documentTitle: g.guessThreadTitle(),
  707.                 slug: h.slug,
  708.                 category: h.category_id,
  709.                 identifier: h.identifier,
  710.                 integration: h.integration,
  711.                 experimentName: f.server_side.experiment,
  712.                 experimentVariant: f.server_side.variant,
  713.                 experimentService: f.server_side.service,
  714.                 forumId: f.server_side.forum_id,
  715.                 disableAds: f.disable_ads,
  716.                 topPlacementUrl: f.server_side.top_placement_url,
  717.                 bottomPlacementUrl: f.server_side.bottom_placement_url,
  718.                 inthreadPlacementUrl: f.server_side.inthread_placement_url,
  719.                 recommendationsPlacementUrl: f.server_side.recommendations_placement_url,
  720.                 lightboxPlacementUrl: f.server_side.lightbox_url,
  721.                 sidebarPlacementUrl: f.server_side.sidebar_placement_url,
  722.                 defaultPlacementUrl: f.server_side.default_placement_url,
  723.                 inthreadLeadingCommentCount: f.server_side.inthread_leading_comment_count,
  724.                 inthreadRepeatCommentCount: f.server_side.inthread_repeat_comment_count,
  725.                 inthreadTrailingCommentCount: f.server_side.inthread_trailing_comment_count,
  726.                 inthreadCountChildren: f.server_side.inthread_count_children,
  727.                 inthreadMultipleAds: f.server_side.inthread_multiple_ads,
  728.                 sandboxAds: f.server_side.sandbox_ads,
  729.                 canDisableAds: f.server_side.can_disable_ads,
  730.                 apiKey: h.api_key,
  731.                 remoteAuthS3: h.remote_auth_s3,
  732.                 sso: f.sso,
  733.                 unsupported: j,
  734.                 degraded: Boolean(j) || g.browser.isCrawler(),
  735.                 callbacks: f.callbacks,
  736.                 enableScrollContainer: f.experiment.enable_scroll_container,
  737.                 forceAutoStyles: f.experiment.force_auto_styles,
  738.                 forceMobile: f.experiment.force_mobile,
  739.                 isPrivate: f.server_side.is_private,
  740.                 forumDetails: {
  741.                     id: f.server_side.forum && f.server_side.forum.id,
  742.                     disableDisqusBranding: Boolean(f.server_side.forum && f.server_side.forum.disable_disqus_branding),
  743.                     recommendationsEnabled: Boolean(f.server_side.forum && f.server_side.forum.recommendations_feature_enabled),
  744.                     recommendationsPlacement: f.server_side.forum && f.server_side.forum.recommendation_placement
  745.                 },
  746.                 recsOutsideEmbedEnabled: Boolean(f.server_side.recs_outside_embed_enabled),
  747.                 lazyloadViewports: f.server_side.lazyload_viewports,
  748.                 quintesseEnabled: f.server_side.quintesse_enabled,
  749.                 forceSwitch: b,
  750.                 forceRecommendationsOutside: b,
  751.                 forceLocalHome: b
  752.             }
  753.         }, {
  754.             HostConfig: h
  755.         }
  756.     }({}), y = function() {
  757.         var a;
  758.         return a = "undefined" == typeof console ? function() {} : "function" == typeof console.log ? function() {
  759.             return console.log(Array.prototype.slice.call(arguments, 0).join(" "))
  760.         } : function() {
  761.             return console.log.apply(console, arguments)
  762.         }, {
  763.             log: a
  764.         }
  765.     }(), z = function(a) {
  766.         return function(b) {
  767.             return Boolean(b && (b.offsetWidth || b.offsetHeight || b.getClientRects().length) && "hidden" !== a(b, "visibility"))
  768.         }
  769.     }(t), A = function(a, b, c) {
  770.         var d = function() {
  771.             var e = a();
  772.             return e ? void b(e) : void setTimeout(d, c)
  773.         };
  774.         d()
  775.     }, B = function() {
  776.         var a = 1e4,
  777.             b = Math.floor(Math.random() * a + 1);
  778.         return function(a) {
  779.             b += 1;
  780.             var c = String(b);
  781.             return a ? a + c : c
  782.         }
  783.     }(), C = function(a) {
  784.         var b = f,
  785.             c = e,
  786.             d = B,
  787.             g = function(a) {
  788.                 var b, c = !1;
  789.                 return function() {
  790.                     return c ? b : (c = !0, b = a.apply(this, arguments), a = null, b)
  791.                 }
  792.             },
  793.             h = Object.keys || function(a) {
  794.                 if (a !== Object(a)) throw new TypeError("Invalid object");
  795.                 var b = [];
  796.                 for (var d in a) c(a, d) && (b[b.length] = d);
  797.                 return b
  798.             },
  799.             i = [].slice,
  800.             j = {
  801.                 on: function(a, b, c) {
  802.                     if (!l(this, "on", a, [b, c]) || !b) return this;
  803.                     this._events = this._events || {};
  804.                     var d = this._events[a] || (this._events[a] = []);
  805.                     return d.push({
  806.                         callback: b,
  807.                         context: c,
  808.                         ctx: c || this
  809.                     }), this
  810.                 },
  811.                 once: function(a, b, c) {
  812.                     if (!l(this, "once", a, [b, c]) || !b) return this;
  813.                     var d = this,
  814.                         e = g(function() {
  815.                             d.off(a, e), b.apply(this, arguments)
  816.                         });
  817.                     return e._callback = b, this.on(a, e, c)
  818.                 },
  819.                 off: function(a, b, c) {
  820.                     var d, e, f, g, i, j, k, m;
  821.                     if (!this._events || !l(this, "off", a, [b, c])) return this;
  822.                     if (!a && !b && !c) return this._events = {}, this;
  823.                     for (g = a ? [a] : h(this._events), i = 0, j = g.length; i < j; i++)
  824.                         if (a = g[i], f = this._events[a]) {
  825.                             if (this._events[a] = d = [], b || c)
  826.                                 for (k = 0, m = f.length; k < m; k++) e = f[k], (c && c !== e.context || b && b !== e.callback && b !== e.callback._callback) && d.push(e);
  827.                             d.length || delete this._events[a]
  828.                         }
  829.                     return this
  830.                 },
  831.                 trigger: function(a) {
  832.                     if (!this._events) return this;
  833.                     var b = i.call(arguments, 1);
  834.                     if (!l(this, "trigger", a, b)) return this;
  835.                     var c = this._events[a],
  836.                         d = this._events.all;
  837.                     return c && m(c, b), d && m(d, arguments), this
  838.                 },
  839.                 stopListening: function(a, b, c) {
  840.                     var d = this._listeners;
  841.                     if (!d) return this;
  842.                     var e = !b && !c;
  843.                     "object" == typeof b && (c = this), a && ((d = {})[a._listenerId] = a);
  844.                     for (var f in d) d[f].off(b, c, this), e && delete this._listeners[f];
  845.                     return this
  846.                 }
  847.             },
  848.             k = /\s+/,
  849.             l = function(a, b, c, d) {
  850.                 if (!c) return !0;
  851.                 if ("object" == typeof c) {
  852.                     for (var e in c) a[b].apply(a, [e, c[e]].concat(d));
  853.                     return !1
  854.                 }
  855.                 if (k.test(c)) {
  856.                     for (var f = c.split(k), g = 0, h = f.length; g < h; g++) a[b].apply(a, [f[g]].concat(d));
  857.                     return !1
  858.                 }
  859.                 return !0
  860.             },
  861.             m = function(a, b) {
  862.                 var c, d, e = a.length,
  863.                     f = b[0],
  864.                     g = b[1],
  865.                     h = b[2];
  866.                 switch (b.length) {
  867.                     case 0:
  868.                         for (d = 0; d < e; d++)(c = a[d]).callback.call(c.ctx);
  869.                         return;
  870.                     case 1:
  871.                         for (d = 0; d < e; d++)(c = a[d]).callback.call(c.ctx, f);
  872.                         return;
  873.                     case 2:
  874.                         for (d = 0; d < e; d++)(c = a[d]).callback.call(c.ctx, f, g);
  875.                         return;
  876.                     case 3:
  877.                         for (d = 0; d < e; d++)(c = a[d]).callback.call(c.ctx, f, g, h);
  878.                         return;
  879.                     default:
  880.                         for (d = 0; d < e; d++)(c = a[d]).callback.apply(c.ctx, b)
  881.                 }
  882.             },
  883.             n = {
  884.                 listenTo: "on",
  885.                 listenToOnce: "once"
  886.             };
  887.         return b(n, function(a, b) {
  888.             j[b] = function(b, c, e) {
  889.                 var f = this._listeners || (this._listeners = {}),
  890.                     g = b._listenerId || (b._listenerId = d("l"));
  891.                 return f[g] = b, "object" == typeof c && (e = this), b[a](c, e, this), this
  892.             }
  893.         }), j.bind = j.on, j.unbind = j.off, j
  894.     }({}), D = function(b) {
  895.         var c, d = a,
  896.             e = q;
  897.         return c = "[object JSON]" === d.Object.prototype.toString.call(d.JSON) ? d.JSON : e("JSON", d), c ? c : {}
  898.     }({}), E = function(a) {
  899.         var b = C,
  900.             c = k,
  901.             d = B,
  902.             e = g,
  903.             f = D,
  904.             h = function(a) {
  905.                 a = a || {}, this.state = h.INIT, this.uid = a.uid || d("dsq-frame"), this.origin = a.origin, this.host = e.getHost(this.origin), this.target = a.target, this.sandbox = a.sandbox, this.window = null, h.windows[this.uid] = this, this.on("ready", function() {
  906.                     this.state = h.READY
  907.                 }, this), this.on("die", function() {
  908.                     this.state = h.KILLED
  909.                 }, this)
  910.             };
  911.         return c(h, {
  912.             INIT: 0,
  913.             READY: 1,
  914.             KILLED: 2,
  915.             windows: {},
  916.             postMessage: function(a, b, c) {
  917.                 return a.postMessage(b, c)
  918.             }
  919.         }), c(h.prototype, b), h.prototype.requiresWindow = function(a) {
  920.             var b = this;
  921.             return function() {
  922.                 var c = Array.prototype.slice.call(arguments),
  923.                     d = function() {
  924.                         var e = b.window;
  925.                         e ? a.apply(b, c) : setTimeout(d, 500)
  926.                     };
  927.                 b.isReady() ? d() : b.on("ready", d)
  928.             }
  929.         }, h.prototype.sendMessage = function(a, b) {
  930.             var c = f.stringify({
  931.                 scope: "client",
  932.                 name: a,
  933.                 data: b
  934.             });
  935.             this.requiresWindow(function(a) {
  936.                 h.postMessage(this.window, a, this.origin)
  937.             })(c)
  938.         }, h.prototype.hide = function() {}, h.prototype.show = function() {}, h.prototype.url = function() {
  939.             return this.target
  940.         }, h.prototype.destroy = function() {
  941.             this.state = h.KILLED, this.off()
  942.         }, h.prototype.isReady = function() {
  943.             return this.state === h.READY
  944.         }, h.prototype.isKilled = function() {
  945.             return this.state === h.KILLED
  946.         }, h
  947.     }({}), F = function(b) {
  948.         var c = u,
  949.             d = k,
  950.             e = E,
  951.             f = g,
  952.             h = a.document,
  953.             i = function(a) {
  954.                 e.call(this, a), this.styles = a.styles || {}, this.tabIndex = a.tabIndex || 0, this.title = a.title || "Disqus", this.sandbox = a.sandbox, this.container = a.container, this.elem = null
  955.             };
  956.         return d(i.prototype, e.prototype), i.prototype.load = function() {
  957.             var a = this.elem = h.createElement("iframe");
  958.             a.setAttribute("id", this.uid), a.setAttribute("name", this.uid), a.setAttribute("allowTransparency", "true"), a.setAttribute("frameBorder", "0"), a.setAttribute("scrolling", "no"), this.role && a.setAttribute("role", this.role), a.setAttribute("tabindex", this.tabIndex), a.setAttribute("title", this.title), "string" == typeof this.sandbox && a.setAttribute("sandbox", this.sandbox), this.setInlineStyle(this.styles)
  959.         }, i.prototype.getOffset = function(a) {
  960.             return f.getOffset(this.elem, a)
  961.         }, i.prototype.setInlineStyle = function(a, b) {
  962.             return c(this.elem, a, b)
  963.         }, i.prototype.removeInlineStyle = function(a) {
  964.             var b = this.elem.style;
  965.             return "removeProperty" in b ? void b.removeProperty(a) : void(b[a] = "")
  966.         }, i.prototype.hide = function() {
  967.             this.setInlineStyle("display", "none")
  968.         }, i.prototype.show = function() {
  969.             this.removeInlineStyle("display")
  970.         }, i.prototype.destroy = function() {
  971.             return this.elem && this.elem.parentNode && (this.elem.parentNode.removeChild(this.elem), this.elem = null), e.prototype.destroy.call(this)
  972.         }, i
  973.     }({}), G = function(b) {
  974.         var c = s,
  975.             d = k,
  976.             e = g,
  977.             f = F,
  978.             h = a.document,
  979.             i = function(a) {
  980.                 f.call(this, a), this.contents = a.contents || "", this.styles = d({
  981.                     width: "100%",
  982.                     border: "none",
  983.                     overflow: "hidden"
  984.                 }, a.styles || {})
  985.             };
  986.         return d(i.prototype, f.prototype), i.prototype.load = function(a) {
  987.             f.prototype.load.call(this);
  988.             var b = this.elem,
  989.                 d = c(this.container) ? e.getContainer(this.container) : this.container;
  990.             d.appendChild(b), this.window = b.contentWindow;
  991.             try {
  992.                 this.window.document.open()
  993.             } catch (g) {
  994.                 b.src = 'javascript:var d=document.open();d.domain="' + h.domain + '";void(0);'
  995.             }
  996.             return this.document = this.window.document, this.document.write(this.contents), this.document.close(), this.updateHeight(), a && setTimeout(a, 0), this
  997.         }, i.prototype.updateHeight = function() {
  998.             var a = this.document.body;
  999.             if (a) {
  1000.                 var b = a.offsetHeight + "px";
  1001.                 this.setInlineStyle({
  1002.                     height: b,
  1003.                     "min-height": b,
  1004.                     "max-height": b
  1005.                 })
  1006.             }
  1007.         }, i.prototype.show = function() {
  1008.             this.setInlineStyle("display", "block"), this.updateHeight()
  1009.         }, i.prototype.click = function(a) {
  1010.             var b = this,
  1011.                 c = b.document.body;
  1012.             c.addEventListener("click", function(c) {
  1013.                 a.call(b, c)
  1014.             })
  1015.         }, i
  1016.     }({}), H = function(b) {
  1017.         var c = t,
  1018.             d = a.document.body;
  1019.         return function() {
  1020.             var a = d.offsetHeight,
  1021.                 b = parseInt(c(d, "margin-top", "marginTop"), 10);
  1022.             b && (a += b);
  1023.             var e = parseInt(c(d, "margin-bottom", "marginBottom"), 10);
  1024.             return e && (a += e), a
  1025.         }
  1026.     }({}), I = function(a) {
  1027.         var b = k,
  1028.             c = ia,
  1029.             d = ha,
  1030.             e = "default",
  1031.             f = {
  1032.                 lounge: "http://disqus.com/embed/comments/",
  1033.                 home: "https://disqus.com/home/".replace("home/", ""),
  1034.                 recommendations: "http://disqus.com/recommendations/"
  1035.             },
  1036.             g = function(a) {
  1037.                 return "https://" + a.replace(/^\s*(\w+:)?\/\//, "")
  1038.             },
  1039.             h = function(a, h, i) {
  1040.                 var j = f[a];
  1041.                 if (!j) throw new Error("Unknown app: " + a);
  1042.                 var k = g(j),
  1043.                     l = b({
  1044.                         base: e
  1045.                     }, h || {}),
  1046.                     m = i ? "#" + d(i) : "";
  1047.                 return c(k, l) + m
  1048.             };
  1049.         return {
  1050.             BASE: e,
  1051.             apps: f,
  1052.             get: h,
  1053.             ensureHTTPSProtocol: g
  1054.         }
  1055.     }({}), J = function(a) {
  1056.         var b = C,
  1057.             c = k,
  1058.             d = e,
  1059.             f = B,
  1060.             g = function(a) {
  1061.                 this.uid = f("dsq-app"), this.settings = a || {};
  1062.                 var b = [],
  1063.                     c = this.constructor.prototype;
  1064.                 do b.unshift(c), c = c.constructor.__super__; while (c);
  1065.                 for (var e = 0, g = b.length; e < g; e++) c = b[e], d(c, "events") && this.on(c.events, this), d(c, "onceEvents") && this.once(c.onceEvents, this)
  1066.             };
  1067.         return c(g.prototype, b), g.prototype.destroy = function() {
  1068.             this.off(), this.stopListening()
  1069.         }, g.extend = function(a, b) {
  1070.             var e, f = this;
  1071.             e = a && d(a, "constructor") ? a.constructor : function() {
  1072.                 return f.apply(this, arguments)
  1073.             }, c(e, f, b);
  1074.             var g = function() {
  1075.                 this.constructor = e
  1076.             };
  1077.             return g.prototype = f.prototype, e.prototype = new g, a && c(e.prototype, a), e.__super__ = f.prototype, e
  1078.         }, g
  1079.     }({}), K = function(a, b, c) {
  1080.         c || (c = 0);
  1081.         var d, e, f, g, h = 0,
  1082.             i = function() {
  1083.                 h = new Date, f = null, g = a.apply(d, e)
  1084.             };
  1085.         return function() {
  1086.             var j = new Date,
  1087.                 k = b - (j - h);
  1088.             return d = this, e = arguments, k <= 0 ? (clearTimeout(f), f = null, h = j, g = a.apply(d, e)) : f || (f = setTimeout(i, k + c)), g
  1089.         }
  1090.     }, ka = function(b) {
  1091.         var c = C,
  1092.             d = s,
  1093.             f = e,
  1094.             h = k,
  1095.             i = F,
  1096.             j = g,
  1097.             l = E,
  1098.             m = D,
  1099.             n = a.document;
  1100.         b.throttle = K, a.addEventListener("message", function(a) {
  1101.             var c;
  1102.             try {
  1103.                 c = m.parse(a.data)
  1104.             } catch (d) {
  1105.                 return
  1106.             }
  1107.             var e = c.sender,
  1108.                 g = f(l.windows, e) && l.windows[e];
  1109.             g && j.getHost(a.origin) === g.host && (a.origin !== g.origin && (g.origin = a.origin), "host" === c.scope && g.trigger(c.name, c.data), "error" === c.name && b.trigger("error", c.data))
  1110.         }), a.addEventListener("hashchange", function() {
  1111.             b.trigger("window.hashchange", {
  1112.                 hash: a.location.hash
  1113.             })
  1114.         }), a.addEventListener("resize", b.throttle(function() {
  1115.             b.trigger("window.resize")
  1116.         }, 250, 50)), n.addEventListener("mousemove", b.throttle(function() {
  1117.             b.trigger("window.mousemove")
  1118.         }, 250, 50));
  1119.         var o = function() {
  1120.             b.trigger("window.scroll")
  1121.         };
  1122.         a.addEventListener("scroll", b.throttle(o, 250, 50), !1), n.addEventListener("click", function() {
  1123.             b.trigger("window.click")
  1124.         });
  1125.         var p = b.Popup = function(a) {
  1126.             a.uid = a.windowName, l.call(this, a)
  1127.         };
  1128.         h(p.prototype, l.prototype), p.prototype.load = function() {
  1129.             var b = this.window = a.open("", this.uid || "_blank");
  1130.             b.location = this.url()
  1131.         }, p.prototype.isKilled = function() {
  1132.             return l.prototype.isKilled() || this.window.closed
  1133.         };
  1134.         var q = b.Channel = function(a) {
  1135.             var b = this;
  1136.             b.window = null, i.call(b, a), this.insertBeforeEl = a.insertBeforeEl, this.insertAfterEl = a.insertAfterEl, b.styles = h({
  1137.                 width: "1px",
  1138.                 "min-width": "100%",
  1139.                 border: "none",
  1140.                 overflow: "hidden",
  1141.                 height: "0"
  1142.             }, a.styles || {})
  1143.         };
  1144.         return h(q.prototype, i.prototype), q.prototype.load = function(a) {
  1145.             var b = this;
  1146.             i.prototype.load.call(b);
  1147.             var c = b.elem;
  1148.             c.setAttribute("width", "100%"), c.setAttribute("src", b.url()), c.addEventListener("load", function() {
  1149.                 b.window = c.contentWindow, a && a()
  1150.             });
  1151.             var e = d(b.container) ? j.getContainer(b.container) : b.container,
  1152.                 f = (b.insertAfterEl ? b.insertAfterEl.nextSibling : b.insertBeforeEl) || null;
  1153.             e.insertBefore(c, f)
  1154.         }, q.prototype.destroy = function() {
  1155.             return this.window = null, i.prototype.destroy.call(this)
  1156.         }, b.on = c.on, b.off = c.off, b.trigger = c.trigger, b
  1157.     }(ka), L = function(b) {
  1158.         var c = k,
  1159.             d = I,
  1160.             e = J,
  1161.             f = ka,
  1162.             g = a.document,
  1163.             h = e.extend({
  1164.                 name: null,
  1165.                 loaderVersion: null,
  1166.                 frame: null,
  1167.                 origin: d.ensureHTTPSProtocol("https://disqus.com"),
  1168.                 state: null,
  1169.                 getUrl: function(a, b) {
  1170.                     return this.loaderVersion && (b = c({
  1171.                         version: this.loaderVersion
  1172.                     }, b)), d.ensureHTTPSProtocol(d.get(this.name, a, b))
  1173.                 },
  1174.                 getFrameSettings: function() {
  1175.                     var a = {
  1176.                             target: this.getUrl(),
  1177.                             origin: this.origin,
  1178.                             uid: this.uid,
  1179.                             sandbox: this.sandbox
  1180.                         },
  1181.                         b = this.settings;
  1182.                     return b.windowName ? a.windowName = b.windowName : a.container = b.container || g.body, b.styles && (a.styles = b.styles), a
  1183.                 },
  1184.                 getFrame: function() {
  1185.                     var a = this.getFrameSettings(),
  1186.                         b = a.windowName ? f.Popup : f.Channel;
  1187.                     return new b(a)
  1188.                 },
  1189.                 setState: function(a) {
  1190.                     var b = this.constructor;
  1191.                     return a in b.states && (this.state = b.states[a], void this.trigger("state:" + a))
  1192.                 },
  1193.                 init: function() {
  1194.                     var a, b = this;
  1195.                     b.frame = a = this.getFrame(), b.listenTo(a, "all", function(c, d) {
  1196.                         b.trigger("frame:" + c, d, a)
  1197.                     }), b.listenTo(a, "resize", function(a) {
  1198.                         b.lastResizedHeight = a.height
  1199.                     }), b.trigger("change:frame", a), b.frame.load(function() {
  1200.                         b.setState("LOADED")
  1201.                     }), b.setState("INIT")
  1202.                 },
  1203.                 destroy: function() {
  1204.                     var a = this.frame;
  1205.                     a && (this.stopListening(a), a.destroy()), this.setState("KILLED"), this.frame = null, e.prototype.destroy.call(this)
  1206.                 },
  1207.                 events: {
  1208.                     "frame:ready": function() {
  1209.                         this.setState("READY")
  1210.                     }
  1211.                 }
  1212.             }, {
  1213.                 states: {
  1214.                     INIT: 0,
  1215.                     LOADED: 1,
  1216.                     READY: 2,
  1217.                     RUNNING: 3,
  1218.                     KILLED: 4
  1219.                 }
  1220.             });
  1221.         return h
  1222.     }({}), M = function(b) {
  1223.         var c = t,
  1224.             d = H,
  1225.             e = z,
  1226.             f = L,
  1227.             g = ka,
  1228.             h = w,
  1229.             i = a.document,
  1230.             j = i.querySelector("html"),
  1231.             k = {
  1232.                 lounge: "embed",
  1233.                 recommendations: "recommendations"
  1234.             },
  1235.             l = f.extend({
  1236.                 getUrl: function() {
  1237.                     var b = this.settings,
  1238.                         c = {
  1239.                             f: b.forum,
  1240.                             t_i: b.identifier,
  1241.                             t_u: b.url || a.location.href,
  1242.                             t_s: b.slug,
  1243.                             t_e: b.title,
  1244.                             t_d: b.documentTitle,
  1245.                             t_t: b.title || b.documentTitle,
  1246.                             t_c: b.category,
  1247.                             s_o: b.sortOrder,
  1248.                             l: b.language
  1249.                         };
  1250.                     return b.unsupported && (c.n_s = b.unsupported), f.prototype.getUrl.call(this, c)
  1251.                 },
  1252.                 getFrameInitParams: function(b) {
  1253.                     var c = this.settings,
  1254.                         d = {
  1255.                             permalink: c.permalink,
  1256.                             anchorColor: c.anchorColor,
  1257.                             referrer: a.location.href,
  1258.                             hostReferrer: i.referrer,
  1259.                             canonicalUrl: c.canonicalUrl,
  1260.                             colorScheme: c.colorScheme,
  1261.                             typeface: c.typeface,
  1262.                             remoteAuthS3: c.remoteAuthS3,
  1263.                             apiKey: c.apiKey,
  1264.                             sso: c.sso,
  1265.                             parentWindowHash: a.location.hash,
  1266.                             forceAutoStyles: c.forceAutoStyles,
  1267.                             forceMobile: c.forceMobile,
  1268.                             layout: c.layout,
  1269.                             integration: c.integration,
  1270.                             version: c.version,
  1271.                             isPrivate: c.isPrivate,
  1272.                             timestamp: this.timestamp,
  1273.                             loadTime: this.getBootloaderTimingInfo(),
  1274.                             isHeightRestricted: this.isHeightRestricted()
  1275.                         };
  1276.                     return d.initialPosition = this.getViewportAndScrollStatus(), d
  1277.                 },
  1278.                 listenToScrollEvent: function(a) {
  1279.                     var b = this,
  1280.                         c = b.getScrollContainer();
  1281.                     if (c === j) return b.listenTo(g, "window.scroll", a),
  1282.                         function() {
  1283.                             b.stopListening(g, "window.scroll", a)
  1284.                         };
  1285.                     var d = g.throttle(function() {
  1286.                         a.call(b)
  1287.                     }, 250, 50);
  1288.                     return c.addEventListener("scroll", d),
  1289.                         function() {
  1290.                             c.removeEventListener("scroll", d)
  1291.                         }
  1292.                 },
  1293.                 storeScrollContainer: function() {
  1294.                     if (!this.settings.enableScrollContainer) return void(this.scrollContainer = j);
  1295.                     var a, b, d = [];
  1296.                     if (this.potentialScrollContainers)
  1297.                         for (b = 0; b < this.potentialScrollContainers.length && (a = this.potentialScrollContainers[b], !(a.clientHeight < a.scrollHeight)); b++) a = null;
  1298.                     else {
  1299.                         a = this.settings.container;
  1300.                         do {
  1301.                             var e = c(a, "overflow-y", "overflowY");
  1302.                             if (("scroll" === e || "auto" === e) && (d.push(a), a.clientHeight < a.scrollHeight)) break;
  1303.                             a = a.parentNode
  1304.                         } while (a && a !== j)
  1305.                     }
  1306.                     a && a !== i.body || (a = j), this.potentialScrollContainers || (this.potentialScrollContainers = d);
  1307.                     var f = this.scrollContainer && this.scrollContainer !== a;
  1308.                     this.scrollContainer = a, f && (this.stopListeningToScrollEvent && this.stopListeningToScrollEvent(), this.stopListeningToScrollEvent = this.listenToScrollEvent(this.communicateViewportAndScrollStatus))
  1309.                 },
  1310.                 getScrollContainer: function() {
  1311.                     return this.scrollContainer || this.storeScrollContainer(), this.scrollContainer
  1312.                 },
  1313.                 getViewportCoords: function() {
  1314.                     return this.getScrollContainer() === j ? this.getWindowCoords() : this.getScrollContainerCoords()
  1315.                 },
  1316.                 getWindowCoords: function() {
  1317.                     if ("number" == typeof a.pageYOffset) this.getWindowScroll = function() {
  1318.                         return a.pageYOffset
  1319.                     }, this.getWindowHeight = function() {
  1320.                         return a.innerHeight
  1321.                     };
  1322.                     else {
  1323.                         var b = j.clientHeight || j.clientWidth ? j : i.body;
  1324.                         this.getWindowScroll = function() {
  1325.                             return b.scrollTop
  1326.                         }, this.getWindowHeight = function() {
  1327.                             return b.clientHeight
  1328.                         }
  1329.                     }
  1330.                     return this.getWindowCoords = function() {
  1331.                         return {
  1332.                             top: this.getWindowScroll(),
  1333.                             height: this.getWindowHeight()
  1334.                         }
  1335.                     }, this.getWindowCoords()
  1336.                 },
  1337.                 getScrollContainerCoords: function() {
  1338.                     var a = this.getScrollContainer();
  1339.                     return {
  1340.                         top: a.scrollTop,
  1341.                         height: a.clientHeight
  1342.                     }
  1343.                 },
  1344.                 getBootloaderTimingInfo: function() {
  1345.                     if (a.performance && a.performance.getEntriesByName) {
  1346.                         var b = i.currentScript ? i.currentScript.src : "https://" + this.settings.forum + ".disqus.com/" + k[this.name] + ".js",
  1347.                             c = a.performance.getEntriesByName(b)[0];
  1348.                         return c && c.duration
  1349.                     }
  1350.                 },
  1351.                 getViewportAndScrollStatus: function() {
  1352.                     var a = this.frame;
  1353.                     if (!a || !a.getOffset) return null;
  1354.                     if (!e(a.elem)) return null;
  1355.                     var b = this.getViewportCoords();
  1356.                     return {
  1357.                         frameOffset: a.getOffset(this.getScrollContainer()),
  1358.                         pageOffset: b.top,
  1359.                         height: b.height
  1360.                     }
  1361.                 },
  1362.                 communicateViewportAndScrollStatus: function() {
  1363.                     var a = this.getViewportAndScrollStatus();
  1364.                     if (a) {
  1365.                         var b = a.frameOffset,
  1366.                             c = b.top,
  1367.                             d = c + b.height,
  1368.                             e = a.pageOffset,
  1369.                             f = a.height,
  1370.                             g = e + f,
  1371.                             h = !1,
  1372.                             i = !1;
  1373.                         c <= g + f && (h = d >= e, i = h && c <= g);
  1374.                         var j = this.frame;
  1375.                         j.sendMessage("window.scroll.always", a), h && j.sendMessage("window.scroll", a), i !== this.wasInViewport && (j.sendMessage(i ? "window.inViewport" : "window.scrollOffViewport"), this.wasInViewport = i)
  1376.                     }
  1377.                 },
  1378.                 getBestNextFrameHeight: function(a) {
  1379.                     var b = this.getViewportAndScrollStatus();
  1380.                     if (!b || this.settings.enableScrollContainer || !this.getScrollContainer()) return a;
  1381.                     var c = b.frameOffset;
  1382.                     if (a >= c.height) return a;
  1383.                     var e = d(),
  1384.                         f = e - (c.height + c.top),
  1385.                         g = b.pageOffset + b.height - (c.top + f);
  1386.                     return g > a ? g + 1 : a
  1387.                 },
  1388.                 isHeightRestricted: function(a) {
  1389.                     function b() {
  1390.                         return h.appearsToHideContent(d) || f && h.appearsToHideContent(e)
  1391.                     }
  1392.  
  1393.                     function c() {
  1394.                         return h.appearsToHideContent(d) && h.hasOverflow(d) || f && h.appearsToHideContent(e) && h.hasOverflow(e)
  1395.                     }
  1396.                     a = a || {};
  1397.                     var d = this.settings.container,
  1398.                         e = d.parentNode,
  1399.                         f = e !== j && e !== i.body;
  1400.                     return a.checkScrollHeight ? c() : b()
  1401.                 },
  1402.                 events: {
  1403.                     "state:INIT": function() {
  1404.                         this.settings.degraded || (this.settings.windowName || (this.stopListeningToScrollEvent = this.listenToScrollEvent(this.communicateViewportAndScrollStatus), this.listenTo(g, "window.resize", this.communicateViewportAndScrollStatus)), this.timestamp = Number(new Date))
  1405.                     },
  1406.                     "state:LOADED": function() {
  1407.                         var a = this.frame,
  1408.                             b = a.elem;
  1409.                         this.settings.degraded ? (a.setInlineStyle("height", "500px"), b.setAttribute("scrolling", "yes"), b.setAttribute("horizontalscrolling", "no"), b.setAttribute("verticalscrolling", "yes"), a.show()) : this.settings.windowName || (this.rendered = !1, a.setInlineStyle("height", "0"), b.setAttribute("scrolling", "no"), b.setAttribute("horizontalscrolling", "no"), b.setAttribute("verticalscrolling", "no"))
  1410.                     },
  1411.                     "frame:ready": function(a, b) {
  1412.                         var c = this.getFrameInitParams(a, b);
  1413.                         b.sendMessage("init", c)
  1414.                     },
  1415.                     "frame:resize": function(a, b) {
  1416.                         var c = a.height;
  1417.                         b.elem && this.rendered && (c = this.getBestNextFrameHeight(c), b.setInlineStyle("height", c + "px"), b.sendMessage(k[this.name] + ".resized")), this.storeScrollContainer(), this.communicateViewportAndScrollStatus()
  1418.                     },
  1419.                     "frame:rendered": function(a, b) {
  1420.                         this.rendered = !0, this.wasInViewport = !1, b.trigger("resize", a), b.sendMessage(k[this.name] + ".rendered")
  1421.                     },
  1422.                     "frame:fail": function(a, b) {
  1423.                         b.elem && b.setInlineStyle("height", a && a.height || "75px")
  1424.                     },
  1425.                     "frame:scrollTo": function(b, c) {
  1426.                         if (c.elem && c.getOffset) {
  1427.                             var d = this.getScrollContainer(),
  1428.                                 e = c.getOffset(d),
  1429.                                 f = "window" === b.relative ? b.top : e.top + b.top,
  1430.                                 g = this.getViewportCoords();
  1431.                             !b.force && f > g.top && f < g.top + g.height || (d === j ? a.scrollTo(0, f) : d.scrollTop = f)
  1432.                         }
  1433.                     }
  1434.                 }
  1435.             });
  1436.         return l
  1437.     }({}), N = function(b) {
  1438.         var c = t,
  1439.             d = ia,
  1440.             e = w,
  1441.             f = I,
  1442.             g = L,
  1443.             h = a.document,
  1444.             i = /^calc\((.+)\)$/,
  1445.             j = g.extend({
  1446.                 name: "home",
  1447.                 events: {
  1448.                     "frame:close": function(b, c) {
  1449.                         c.hide(), a.focus()
  1450.                     },
  1451.                     "frame:openReady": function() {
  1452.                         this.frame.show(), this.frame.sendMessage("open"), (e.browser.isIE() || e.browser.isSafari()) && this.preventScrolling(), this.frame.elem && this.frame.elem.focus()
  1453.                     },
  1454.                     "state:LOADED": function() {
  1455.                         this.frame.removeInlineStyle("visibility")
  1456.                     },
  1457.                     "frame:after:render": function() {
  1458.                         e.browser.isSafari() && this.triggerHostReflow()
  1459.                     }
  1460.                 },
  1461.                 preventScrolling: function() {
  1462.                     var a = this.getBodyOverflow(),
  1463.                         b = h.body.style.marginRight,
  1464.                         d = h.documentElement.style,
  1465.                         e = d.overflow;
  1466.                     this.listenToOnce(this, "frame:close", function() {
  1467.                         this.setBodyStyles({
  1468.                             overflow: a,
  1469.                             marginRight: b
  1470.                         }), d.overflow = e
  1471.                     }), this.setBodyStyles({
  1472.                         overflow: "hidden",
  1473.                         marginRight: this.calcMargin(c(h.body, "margin-right", "marginRight") || b)
  1474.                     }), d.overflow = "hidden"
  1475.                 },
  1476.                 triggerHostReflow: function() {
  1477.                     var a = h.createElement("style");
  1478.                     h.body.appendChild(a), h.body.removeChild(a)
  1479.                 },
  1480.                 calcMargin: function(a) {
  1481.                     var b = a.match(i);
  1482.                     return b && (a = b[1]), a ? "calc(" + a + " + " + e.getScrollbarWidth() + "px)" : e.getScrollbarWidth() + "px"
  1483.                 },
  1484.                 setBodyStyles: function(a) {
  1485.                     for (var b in a) h.body.style[b] = a[b]
  1486.                 },
  1487.                 getBodyOverflow: function() {
  1488.                     return h.body.style.overflow
  1489.                 },
  1490.                 getSecureOrigin: function() {
  1491.                     return f.ensureHTTPSProtocol(j.SECURE_HOME_URL).split("/").slice(0, 3).join("/")
  1492.                 },
  1493.                 getFrameSettings: function() {
  1494.                     var a = g.prototype.getFrameSettings.call(this);
  1495.                     return a.role = "dialog", a.origin = this.getSecureOrigin(), a.styles = {
  1496.                         height: "100%",
  1497.                         position: "fixed",
  1498.                         top: 0,
  1499.                         right: 0,
  1500.                         left: "auto",
  1501.                         bottom: "auto",
  1502.                         "z-index": e.MAX_Z_INDEX,
  1503.                         visibility: "hidden"
  1504.                     }, a
  1505.                 },
  1506.                 getUrl: function() {
  1507.                     var a = this.settings.path || "",
  1508.                         b = this.settings.language,
  1509.                         c = {
  1510.                             utm_source: "disqus_embed"
  1511.                         };
  1512.                     return b && "en" !== b && (c.l = b), this.settings.config && this.settings.config.forceLocalHome && (c.base = "dev"), d(f.apps[this.name] + a, c)
  1513.                 },
  1514.                 show: function(a) {
  1515.                     if (!this.frame.isReady()) return void this.once("frame:ready", function() {
  1516.                         this.show(a)
  1517.                     }, this);
  1518.                     var b = {
  1519.                         disableMOTD: this.settings.disableMOTD,
  1520.                         path: a
  1521.                     };
  1522.                     this.settings.sso && (b.sso = this.settings.sso), this.settings.config && this.settings.config.sidebarPlacementUrl && this.frame.sendMessage("showAd"), this.frame.sendMessage("showPath", b)
  1523.                 }
  1524.             }, {
  1525.                 SECURE_HOME_URL: "https://disqus.com/home/",
  1526.                 READY_TIMEOUT: 1e4,
  1527.                 getInstanceOrLoad: function(a) {
  1528.                     var b = j.instance;
  1529.                     if (b) return b;
  1530.                     if (b = j.instance = new j(a), a.preload && b.listenToOnce(b, "state:INIT", function() {
  1531.                             b.frame.hide()
  1532.                         }), j.setHomeTimeout(b), b.init(), a.config) {
  1533.                         var c = {};
  1534.                         for (var d in a.config) "container" !== d && (c[d] = a.config[d]);
  1535.                         b.once("frame:ready", function() {
  1536.                             b.frame.sendMessage("setConfig", c)
  1537.                         })
  1538.                     }
  1539.                     return a.forum && b.listenToOnce(b, "frame:ready", function() {
  1540.                         b.frame.sendMessage("setForum", a.forum)
  1541.                     }), b
  1542.                 },
  1543.                 setHomeTimeout: function(a) {
  1544.                     if (!(a.settings && a.settings.config && a.settings.config.forceLocalHome)) {
  1545.                         j.homeTimeoutId && clearTimeout(j.homeTimeoutId);
  1546.                         var b = j.homeTimeoutId = setTimeout(function() {
  1547.                             a.frame.destroy(), a.trigger("timeout")
  1548.                         }, j.READY_TIMEOUT);
  1549.                         a.listenToOnce(a, "state:READY", function() {
  1550.                             clearTimeout(b)
  1551.                         })
  1552.                     }
  1553.                 },
  1554.                 preload: function(a) {
  1555.                     return a.preload = !0, j.getInstanceOrLoad(a)
  1556.                 },
  1557.                 destroy: function() {
  1558.                     var a = j.instance;
  1559.                     a && (a.destroy(), j.instance = null)
  1560.                 },
  1561.                 show: function(a) {
  1562.                     var b = j.getInstanceOrLoad(a);
  1563.                     return b.show(a.path), b
  1564.                 }
  1565.             });
  1566.         return {
  1567.             show: j.show,
  1568.             preload: j.preload,
  1569.             destroy: j.destroy,
  1570.             HomeApp: j
  1571.         }
  1572.     }({}), O = function(a) {
  1573.         var b = k,
  1574.             c = {
  1575.                 height: "52px",
  1576.                 width: "54px",
  1577.                 margin: "0 auto",
  1578.                 overflow: "hidden",
  1579.                 position: "relative",
  1580.                 boxingSize: "border-box"
  1581.             },
  1582.             d = function(a) {
  1583.                 var d = a ? "0 -52px " : "";
  1584.                 return b({
  1585.                     background: "url(https://c.disquscdn.com/next/embed/assets/img/loader-bg.173909e4737a7481df14d5492b5eeb48.png) " + d + "no-repeat"
  1586.                 }, c)
  1587.             },
  1588.             e = "https://c.disquscdn.com/next/embed/assets/img/disqus-social-icon-light.5a4245eaed6988115d6bd53f20074f71.svg",
  1589.             f = "https://c.disquscdn.com/next/embed/assets/img/disqus-social-icon-dark.a621bea3e02c9fa04fd3965a3d6f424d.svg",
  1590.             g = {
  1591.                 display: "block",
  1592.                 margin: "auto",
  1593.                 width: "80px",
  1594.                 height: "80px"
  1595.             },
  1596.             h = function(a) {
  1597.                 var c = a ? e : f;
  1598.                 return b({
  1599.                     background: "url(" + c + ") center center / contain no-repeat"
  1600.                 }, g)
  1601.             };
  1602.         return {
  1603.             getBubbleStyle: d,
  1604.             getIconStyle: h
  1605.         }
  1606.     }({}), P = function() {
  1607.         var b = {
  1608.             _doc: a.document,
  1609.             create: function(a, c, d) {
  1610.                 d || (d = {});
  1611.                 var e = a + "=" + c + "; path=" + (d.path || "/"),
  1612.                     f = d.domain,
  1613.                     g = d.expiresIn;
  1614.                 if (f && (e += "; domain=." + f), "[object Number]" === Object.prototype.toString.call(g)) {
  1615.                     var h = new Date((new Date).getTime() + g);
  1616.                     e += "; expires=" + h.toGMTString()
  1617.                 }
  1618.                 "https:" === b._doc.location.protocol && (e += "; secure"), e += "; SameSite=None", b._doc.cookie = e
  1619.             },
  1620.             read: function(a) {
  1621.                 for (var c, d = a + "=", e = b._doc.cookie.split(";"), f = 0; f < e.length; f++)
  1622.                     if (c = e[f].replace(/^\s+/, ""), 0 === c.indexOf(d)) return c.substring(d.length);
  1623.                 return null
  1624.             },
  1625.             erase: function(a, c) {
  1626.                 var d = {};
  1627.                 for (var e in c) c.hasOwnProperty(e) && (d[e] = c[e]);
  1628.                 return d.expiresIn = -1, b.create(a, "", d)
  1629.             },
  1630.             supported: function() {
  1631.                 return b.create("cookie_support", "1"), "1" === b.read("cookie_support") && (b.erase("cookie_support"), !0)
  1632.             }
  1633.         };
  1634.         return b
  1635.     }(), la = function(b) {
  1636.         var c = P,
  1637.             d = p,
  1638.             e = n,
  1639.             f = q,
  1640.             g = "dsq__",
  1641.             h = !1;
  1642.         return b.setHostIdentity = function(b, e) {
  1643.             var h = c.read(g),
  1644.                 i = a.location.host.split(":")[0];
  1645.             return h && !e.shouldTrack ? void c.erase(g) : void(e.shouldTrack && e.isMobile && e.hostIdentityActive && (h || (h = d.generate({
  1646.                 Math: f("Math", a),
  1647.                 crypto: f("crypto", a),
  1648.                 Uint32Array: f("Uint32Array", a),
  1649.                 Date: f("Date", a)
  1650.             }), c.create(g, h, {
  1651.                 domain: i,
  1652.                 expiresIn: 31536e6
  1653.             })), b.frame.sendMessage("tracking.hostIdentity", {
  1654.                 domain: i,
  1655.                 id: h
  1656.             })))
  1657.         }, b.checkCmp = function(b) {
  1658.             var c = 833,
  1659.                 d = 2;
  1660.             if (b.settings.isPrivate) {
  1661.                 var f = function(a, d) {
  1662.                     h || d && (a.vendor.consents[c] && a.purpose.consents[1] && a.purpose.consents[2] && a.purpose.consents[3] && a.purpose.consents[4] && a.purpose.consents[5] && a.purpose.consents[6] && a.purpose.consents[7] && a.purpose.consents[8] && a.purpose.consents[9] && a.purpose.consents[10] ? (h = !0, e.logStat("cmp.consent"), b.frame.sendMessage("cmp.consent", {
  1663.                         tcString: a.tcString
  1664.                     })) : (h = !1, e.logStat("cmp.no_consent")))
  1665.                 };
  1666.                 if (a.__tcfapi) {
  1667.                     e.logStat("cmp.present"), a.__tcfapi("getTCData", d, f);
  1668.                     try {
  1669.                         a.__tcfapi("addEventListener", d, f)
  1670.                     } catch (g) {}
  1671.                 }
  1672.             }
  1673.         }, b
  1674.     }(la), Q = function(c) {
  1675.         var d = a.document,
  1676.             e = f,
  1677.             i = h,
  1678.             j = ja,
  1679.             l = k,
  1680.             m = z,
  1681.             o = A,
  1682.             p = n,
  1683.             q = G,
  1684.             r = g,
  1685.             s = M,
  1686.             t = ka,
  1687.             u = y,
  1688.             v = w,
  1689.             x = N,
  1690.             B = O,
  1691.             C = la,
  1692.             D = s.extend({
  1693.                 name: "lounge",
  1694.                 loaderVersion: p.getLoaderVersionFromUrl("https://c.disquscdn.com/next/embed/lounge.load.a658a7c16140d8728cc859daf581cbbc.js"),
  1695.                 indicators: null,
  1696.                 wasInViewport: !1,
  1697.                 triggeredSlowEvent: !1,
  1698.                 events: {
  1699.                     "state:INIT": function() {
  1700.                         var b = this.settings,
  1701.                             c = b.server_side;
  1702.                         return c && "fallback" === c.service && p.logStat("embed.fallback"), b.degraded ? void p.reportJester({
  1703.                             imp: b.impressionId,
  1704.                             experiment: b.experimentName,
  1705.                             variant: b.experimentVariant,
  1706.                             service: b.experimentService,
  1707.                             forum: b.forum,
  1708.                             version: this.loaderVersion,
  1709.                             page_url: a.location.href,
  1710.                             page_referrer: d.referrer,
  1711.                             event: "activity",
  1712.                             verb: "load",
  1713.                             product: "embed",
  1714.                             zone: "thread",
  1715.                             section: "degraded",
  1716.                             adjective: b.unsupported,
  1717.                             object_type: "thread",
  1718.                             object_id: b.identifier
  1719.                         }) : (this.indicators = {}, this.isContainerVisible() ? this.addLoadingAnim() : this.addLoadingAnimOnContainerVisible(), this.bindPublisherCallbacks(), void this.forwardGlobalEvents())
  1720.                     },
  1721.                     "state:LOADED": function() {
  1722.                         this.isContainerVisible() && this.addLoadingAnim()
  1723.                     },
  1724.                     "frame:reload": function() {
  1725.                         a.location.reload()
  1726.                     },
  1727.                     "frame:navigate": function(b) {
  1728.                         a.location.href = b
  1729.                     },
  1730.                     "frame:session.identify": function(a) {
  1731.                         this.trigger("session.identify", a)
  1732.                     },
  1733.                     "frame:posts.paginate": function() {
  1734.                         this.trigger("posts.paginate")
  1735.                     },
  1736.                     "frame:posts.count": function(a) {
  1737.                         this.trigger("posts.count", a)
  1738.                     },
  1739.                     "frame:posts.create": function(a) {
  1740.                         this.trigger("posts.create", {
  1741.                             id: a.id,
  1742.                             text: a.raw_message
  1743.                         })
  1744.                     },
  1745.                     "frame:posts.beforeCreate": function(a) {
  1746.                         this.onBeforePostCreate(a)
  1747.                     },
  1748.                     "frame:home.destroy": function() {
  1749.                         this.destroyHome()
  1750.                     },
  1751.                     "frame:home.preload": function(a) {
  1752.                         this.preloadHome(a)
  1753.                     },
  1754.                     "frame:home.show": function(a) {
  1755.                         this.showHome(a)
  1756.                     },
  1757.                     "frame:home.open": function(b) {
  1758.                         a.location = b
  1759.                     },
  1760.                     "frame:indicator:init": function(a, b) {
  1761.                         if (b.getOffset) {
  1762.                             for (var c, d, e = ["north", "south"], f = this.indicators, g = b.getOffset().width + "px", h = {
  1763.                                     width: g,
  1764.                                     "min-width": g,
  1765.                                     "max-width": g,
  1766.                                     position: "fixed",
  1767.                                     "z-index": v.MAX_Z_INDEX - 1
  1768.                                 }, i = {
  1769.                                     north: {
  1770.                                         top: "0"
  1771.                                     },
  1772.                                     south: {
  1773.                                         bottom: "0"
  1774.                                     }
  1775.                                 }, j = function() {
  1776.                                     b.sendMessage("indicator:click", this.uid.split("-")[1])
  1777.                                 }, k = 0; k < e.length; k++) {
  1778.                                 d = e[k], c = new q({
  1779.                                     uid: "indicator-" + d,
  1780.                                     container: this.settings.container,
  1781.                                     contents: a[d].contents,
  1782.                                     styles: l(i[d], h),
  1783.                                     role: "alert",
  1784.                                     type: d
  1785.                                 });
  1786.                                 try {
  1787.                                     c.load()
  1788.                                 } catch (m) {
  1789.                                     continue
  1790.                                 }
  1791.                                 c.hide(), c.click(j), f[d] = c
  1792.                             }
  1793.                             this.on({
  1794.                                 "frame:indicator:show": function(a) {
  1795.                                     var b = f[a.type];
  1796.                                     b && (b.document.getElementById("message").innerHTML = a.content, b.show())
  1797.                                 },
  1798.                                 "frame:indicator:hide": function(a) {
  1799.                                     var b = a && a.type,
  1800.                                         c = b && f[b];
  1801.                                     if (c) c.hide();
  1802.                                     else if (!b)
  1803.                                         for (var d = 0; d < e.length; d++) b = e[d], c = f[b], c && c.hide()
  1804.                                 }
  1805.                             })
  1806.                         }
  1807.                     },
  1808.                     "frame:change:sort": function(a) {
  1809.                         v.storage.setItem("disqus.sort", a)
  1810.                     },
  1811.                     "frame:fail frame:rendered": function() {
  1812.                         this.removeLoadingAnim(), this.setState("RUNNING")
  1813.                     },
  1814.                     "frame:fail": function(a) {
  1815.                         p.logStat("failed_embed.server." + a.code)
  1816.                     },
  1817.                     "frame:rendered": function() {
  1818.                         this.triggeredSlowEvent && p.logStat("rendered_embed.slow")
  1819.                     },
  1820.                     "frame:tracking:init": function(a) {
  1821.                         a = a || {}, C.checkCmp(this), C.setHostIdentity(this, a)
  1822.                     }
  1823.                 },
  1824.                 onceEvents: {
  1825.                     "frame:viglink:init": function(b) {
  1826.                         var c = function() {
  1827.                             for (var b in a)
  1828.                                 if (0 === b.indexOf("skimlinks") || 0 === b.indexOf("skimwords")) return !0;
  1829.                             return !1
  1830.                         };
  1831.                         if (!(a.vglnk_self || a.vglnk || c())) {
  1832.                             var d = b.apiUrl,
  1833.                                 e = b.key,
  1834.                                 f = String(b.id);
  1835.                             null != b.clientUrl && null != d && null != e && null != b.id && (DISQUS.vglnk = {
  1836.                                 api_url: d,
  1837.                                 key: e,
  1838.                                 sub_id: f
  1839.                             }, a.vglnk_self = "DISQUS.vglnk", j(b.clientUrl))
  1840.                         }
  1841.                     },
  1842.                     "frame:quintesse:init": function() {
  1843.                         j("https://q.quintesse.io/api/is?st=8122b31f-cef4-46aa-99c1-8092729a014d")
  1844.                     }
  1845.                 },
  1846.                 getFrameInitParams: function(a, c) {
  1847.                     var d = s.prototype.getFrameInitParams.call(this, a, c);
  1848.                     return d.experiment = {
  1849.                         experiment: this.settings.experimentName,
  1850.                         variant: this.settings.experimentVariant,
  1851.                         service: this.settings.experimentService
  1852.                     }, d.isBehindClick = this.isHeightRestricted() || !m(c.elem), d.startedFullyVisible = !1, this.whenFullyVisible(function() {
  1853.                         d.startedFullyVisible = !0, c.sendMessage("frame.visible", {})
  1854.                     }), d.disableAds = this.settings.disableAds, d.isHostIframed = this.settings.isHostIframed, d.sandboxAds = this.settings.sandboxAds, d.canDisableAds = this.settings.canDisableAds, d.inthreadPlacementUrl = this.settings.inthreadPlacementUrl, d.inthreadLeadingCommentCount = this.settings.inthreadLeadingCommentCount, d.inthreadRepeatCommentCount = this.settings.inthreadRepeatCommentCount, d.inthreadTrailingCommentCount = this.settings.inthreadTrailingCommentCount, d.inthreadCountChildren = this.settings.inthreadCountChildren, d.inthreadMultipleAds = this.settings.inthreadMultipleAds, d.recommendationsPlacementUrl = this.settings.recommendationsPlacementUrl, d.lightboxPlacementUrl = this.settings.lightboxPlacementUrl, d.sidebarPlacementUrl = this.settings.sidebarPlacementUrl, d.quintesseEnabled = this.settings.quintesseEnabled, d.recsOutsideEmbedEnabled = this.settings.recsOutsideEmbedEnabled, this.settings.impressionId && (d.impressionId = this.settings.impressionId), this.settings.adBlockEnabled === b ? i(function(a) {
  1855.                         d.adBlockEnabled = a
  1856.                     }) : d.adBlockEnabled = this.settings.adBlockEnabled, d
  1857.                 },
  1858.                 onBeforePostCreate: function(a) {
  1859.                     var b = {
  1860.                         text: a.raw_message
  1861.                     };
  1862.                     try {
  1863.                         var c = this.settings.callbacks.beforeComment;
  1864.                         if (c)
  1865.                             for (var d = 0; d < c.length; d++) b = c[d](b)
  1866.                     } catch (e) {
  1867.                         u.log("Error processing Disqus callback: ", e.toString())
  1868.                     } finally {
  1869.                         this.frame.sendMessage("posts.beforeCreate.response", b && b.text)
  1870.                     }
  1871.                 },
  1872.                 destroyHome: function() {
  1873.                     x.destroy()
  1874.                 },
  1875.                 preloadHome: function(a) {
  1876.                     a.path = "home/preload/";
  1877.                     var b = this.home = x.preload(this.getHomeData(a));
  1878.                     this.listenToOnce(b, "frame:ready", function() {
  1879.                         this.frame.sendMessage("home.ready")
  1880.                     }), this.handleHomeTimeout(b)
  1881.                 },
  1882.                 handleHomeTimeout: function(a) {
  1883.                     this.listenTo(a, "timeout", function() {
  1884.                         this.frame.sendMessage("home.timeout")
  1885.                     })
  1886.                 },
  1887.                 showHome: function(a) {
  1888.                     var b = this.home = x.show(this.getHomeData(a));
  1889.                     this.listenToOnce(b, "frame:openReady", function() {
  1890.                         this.frame.sendMessage("home.opened")
  1891.                     }), this.handleHomeTimeout(b)
  1892.                 },
  1893.                 getHomeData: function(a) {
  1894.                     var b = this.settings;
  1895.                     return a.config = b, a.language || (a.language = b.language), b.apiKey && b.remoteAuthS3 && (a.sso = {
  1896.                         apiKey: b.apiKey,
  1897.                         remoteAuthS3: b.remoteAuthS3
  1898.                     }), a
  1899.                 },
  1900.                 forwardGlobalEvents: function() {
  1901.                     var a = this;
  1902.                     a.settings.windowName || (a.listenTo(t, "window.resize", function() {
  1903.                         a.frame.sendMessage("window.resize")
  1904.                     }), a.listenTo(t, "window.click", function() {
  1905.                         a.frame.sendMessage("window.click")
  1906.                     }), a.listenTo(t, "window.mousemove", function() {
  1907.                         a.frame.sendMessage("window.mousemove")
  1908.                     }), a.listenTo(t, "error", function(b) {
  1909.                         a.on("frame:rendered", function() {
  1910.                             a.frame.sendMessage("error", b)
  1911.                         })
  1912.                     })), a.listenTo(t, "window.hashchange", function(b) {
  1913.                         a.frame.sendMessage("window.hashchange", b.hash)
  1914.                     })
  1915.                 },
  1916.                 bindPublisherCallbacks: function() {
  1917.                     var a = this,
  1918.                         b = a.settings,
  1919.                         c = D.LEGACY_EVENTS_MAPPING,
  1920.                         d = b.callbacks;
  1921.                     d && e(d, function(b, d) {
  1922.                         c[d] && e(b, function(b) {
  1923.                             a.on(c[d], b)
  1924.                         })
  1925.                     })
  1926.                 },
  1927.                 isContainerVisible: function() {
  1928.                     var a = this.getViewportCoords(),
  1929.                         b = r.getOffset(this.settings.container, this.getScrollContainer()),
  1930.                         c = b.top + b.height - a.top;
  1931.                     return c > 0 && c <= a.height
  1932.                 },
  1933.                 pollFullyVisible: function() {
  1934.                     var a = this;
  1935.                     if (!a.pollingFullVisibility) {
  1936.                         a.pollingFullVisibility = !0;
  1937.                         var b = a.isHeightRestricted(),
  1938.                             c = {};
  1939.                         o(function() {
  1940.                             return a.frame && a.frame.elem ? !(b && !a.rendered) && (m(a.frame.elem) && !a.isHeightRestricted({
  1941.                                 checkScrollHeight: !0
  1942.                             })) : c
  1943.                         }, function(b) {
  1944.                             b !== c && (a.fullyVisible = !0, a.trigger("fullyVisible"))
  1945.                         }, a.constructor.VISIBILITY_POLL_INTERVAL)
  1946.                     }
  1947.                 },
  1948.                 whenFullyVisible: function(a) {
  1949.                     this.pollFullyVisible(), this.fullyVisible ? a() : this.once("fullyVisible", a)
  1950.                 },
  1951.                 showSlowLoadingMessage: function() {
  1952.                     var a, b = this;
  1953.                     if (b.loadingElem) {
  1954.                         if (v.pageVisibility.isHidden()) return a = function() {
  1955.                             v.pageVisibility.stopListening(a), b.setSlowLoadingMessageTimer(2e3)
  1956.                         }, void v.pageVisibility.listen(a);
  1957.                         b.triggeredSlowEvent = !0, b.state === b.constructor.states.READY ? p.logStat("slow_embed.got_ready") : b.state === b.constructor.states.LOADED ? p.logStat("slow_embed.loaded") : p.logStat("slow_embed.no_ready"), b.loadingElem.firstChild.insertAdjacentHTML("afterend", '<p align="center">Disqus seems to be taking longer than usual. <a href="#" onclick="DISQUS.reset({reload: true}); return false;">Reload</a>?</p>')
  1958.                     }
  1959.                 },
  1960.                 clearSlowLoadingMessageTimer: function() {
  1961.                     this.timeout && (clearTimeout(this.timeout), this.timeout = null)
  1962.                 },
  1963.                 setSlowLoadingMessageTimer: function(a) {
  1964.                     var b = this;
  1965.                     b.clearSlowLoadingMessageTimer(), b.timeout = setTimeout(function() {
  1966.                         b.showSlowLoadingMessage()
  1967.                     }, a)
  1968.                 },
  1969.                 addLoadingAnimOnContainerVisible: function() {
  1970.                     var a, b = this;
  1971.                     a = b.listenToScrollEvent(function() {
  1972.                         var c = b.isContainerVisible();
  1973.                         (c || b.state >= b.constructor.states.RUNNING) && a(), c && b.addLoadingAnim()
  1974.                     })
  1975.                 },
  1976.                 addLoadingAnim: function() {
  1977.                     var a, b, c, e = this,
  1978.                         f = e.settings.container;
  1979.                     if (e.loadingElem) return e.loadingElem;
  1980.                     if (!(e.state >= e.constructor.states.RUNNING || this.settings.degraded)) {
  1981.                         a = d.createElement("div"), a.dir = "ltr", a.style.overflow = "hidden";
  1982.                         var g = "dark" === e.settings.colorScheme;
  1983.                         if (e.settings.forumDetails && e.settings.forumDetails.disableDisqusBranding) {
  1984.                             b = d.createElement("div"), a.appendChild(b);
  1985.                             var h = b.style;
  1986.                             l(h, B.getBubbleStyle(g)), f.appendChild(a)
  1987.                         } else {
  1988.                             c = d.createElement("svg"), a.appendChild(c);
  1989.                             var i = c.style;
  1990.                             l(i, B.getIconStyle(g)), f.appendChild(a)
  1991.                         }
  1992.                         return e.loadingElem = a, e.setSlowLoadingMessageTimer(15e3), p.logStat("lounge.loading.view"), e.loadingElem
  1993.                     }
  1994.                 },
  1995.                 removeLoadingAnim: function() {
  1996.                     var a = this.loadingElem,
  1997.                         b = this.settings.container;
  1998.                     this.clearSlowLoadingMessageTimer(), a && a.parentNode === b && (b.removeChild(a), this.loadingElem = null)
  1999.                 },
  2000.                 destroy: function() {
  2001.                     var a = this.indicators;
  2002.                     this.removeLoadingAnim(), a && a.north && (a.north.destroy(), a.north = null), a && a.south && (a.south.destroy(), a.south = null), s.prototype.destroy.call(this)
  2003.                 }
  2004.             }, {
  2005.                 LEGACY_EVENTS_MAPPING: {
  2006.                     onReady: "frame:rendered",
  2007.                     onNewComment: "posts.create",
  2008.                     onPaginate: "posts.paginate",
  2009.                     onCommentCountChange: "posts.count",
  2010.                     onIdentify: "session.identify"
  2011.                 },
  2012.                 VISIBILITY_POLL_INTERVAL: 500
  2013.             }),
  2014.             E = function(a) {
  2015.                 return new D(a)
  2016.             };
  2017.         return {
  2018.             Lounge: E
  2019.         }
  2020.     }({}), R = function(a, b, c) {
  2021.         var d, e, f, g, h, i = function() {
  2022.             var j = (new Date).getTime() - g;
  2023.             j < b && j >= 0 ? d = setTimeout(i, b - j) : (d = null, c || (h = a.apply(f, e), d || (f = e = null)))
  2024.         };
  2025.         return function() {
  2026.             f = this, e = arguments, g = (new Date).getTime();
  2027.             var j = c && !d;
  2028.             return d || (d = setTimeout(i, b)), j && (h = a.apply(f, e), f = e = null), h
  2029.         }
  2030.     }, S = function(a, b) {
  2031.         for (var c = 0; c < a.length; ++c)
  2032.             if (a[c] === b) return c;
  2033.         return -1
  2034.     }, T = function(a, b, c) {
  2035.         for (var d = 0; d < a.length; ++d)
  2036.             if (b.call(c, a[d], d, a)) return !0;
  2037.         return !1
  2038.     }, U = function(a) {
  2039.         return "[object Function]" === Object.prototype.toString.call(a)
  2040.     }, V = function(a) {
  2041.         return function(b, c, d) {
  2042.             var e = null === b || void 0 === b ? void 0 : b[c];
  2043.             return void 0 === e && (e = d), a(e) ? e.call(b) : e
  2044.         }
  2045.     }(U), W = function(a) {
  2046.         return Boolean(a && 1 === a.nodeType)
  2047.     }, ma = function(a, b, c) {
  2048.         return a.getElement = function(a) {
  2049.             return b(a) ? a : a && a.el
  2050.         }, a.EL_ID_ATTR = "data-visibility-id", a.OBJ_ID_PROP = "_visibility_id", a.getId = function(d) {
  2051.             var e = null;
  2052.             return b(d) ? (e = d.getAttribute(a.EL_ID_ATTR) || null, e || (e = c(), d.setAttribute(a.EL_ID_ATTR, e))) : d && (e = d[a.OBJ_ID_PROP] || null, e || (e = d[a.OBJ_ID_PROP] = c())), e
  2053.         }, a.visiblePercent = function(a, b) {
  2054.             var c = 0;
  2055.