From var, 1 Week ago, written in Plain Text.
- view diff
Embed
  1. function _toConsumableArray(a) {
  2.   if (Array.isArray(a)) {
  3.     for (var b = 0, c = Array(a.length); b < a.length; b++) c[b] = a[b];
  4.     return c
  5.   }
  6.   return Array.from(a)
  7. }
  8. function _classCallCheck(a, b) {
  9.   if (!(a instanceof b)) throw new TypeError('Cannot call a class as a function')
  10. }
  11. function _classCallCheck(a, b) {
  12.   if (!(a instanceof b)) throw new TypeError('Cannot call a class as a function')
  13. }
  14. function _toConsumableArray(a) {
  15.   if (Array.isArray(a)) {
  16.     for (var b = 0, c = Array(a.length); b < a.length; b++) c[b] = a[b];
  17.     return c
  18.   }
  19.   return Array.from(a)
  20. }
  21. function _objectWithoutProperties(a, b) {
  22.   var c = {
  23.   };
  24.   for (var d in a) b.indexOf(d) >= 0 || Object.prototype.hasOwnProperty.call(a, d) && (c[d] = a[d]);
  25.   return c
  26. }
  27. define('core/utils/getEmbeddedData', [
  28. ], function () {
  29.   'use strict';
  30.   return function (a) {
  31.     var b = window.document.getElementById('disqus-' + a);
  32.     try {
  33.       return b && JSON.parse(b.textContent || b.innerHTML)
  34.     } catch (c) {
  35.       return null
  36.     }
  37.   }
  38. }),
  39. define('core/utils/cookies', [
  40. ], function () {
  41.   'use strict';
  42.   var a = {
  43.     _doc: window.document,
  44.     create: function (b, c, d) {
  45.       d || (d = {
  46.       });
  47.       var e = b + '=' + c + '; path=' + (d.path || '/'),
  48.       f = d.domain,
  49.       g = d.expiresIn;
  50.       if (f && (e += '; domain=.' + f), '[object Number]' === Object.prototype.toString.call(g)) {
  51.         var h = new Date((new Date).getTime() + g);
  52.         e += '; expires=' + h.toGMTString()
  53.       }
  54.       'https:' === a._doc.location.protocol && (e += '; secure'),
  55.       e += '; SameSite=None',
  56.       a._doc.cookie = e
  57.     },
  58.     read: function (b) {
  59.       for (var c, d = b + '=', e = a._doc.cookie.split(';'), f = 0; f < e.length; f++) if (c = e[f].replace(/^\s+/, ''), 0 === c.indexOf(d)) return c.substring(d.length);
  60.       return null
  61.     },
  62.     erase: function (b, c) {
  63.       var d = {
  64.       };
  65.       for (var e in c) c.hasOwnProperty(e) && (d[e] = c[e]);
  66.       return d.expiresIn = - 1,
  67.       a.create(b, '', d)
  68.     },
  69.     supported: function () {
  70.       return a.create('cookie_support', '1'),
  71.       '1' === a.read('cookie_support') && (a.erase('cookie_support'), !0)
  72.     }
  73.   };
  74.   return a
  75. }),
  76. define('core/utils/fingerprint', [
  77. ], function () {
  78.   'use strict';
  79.   function a(a) {
  80.     a = a || {
  81.     };
  82.     var b = a.Math || window.Math,
  83.     c = a.Date || window.Date;
  84.     try {
  85.       var d = (new c).getTimezoneOffset(),
  86.       e = 1,
  87.       f = window.screen;
  88.       f && f.availWidth ? e = f.availWidth * f.availHeight + f.colorDepth : f && f.width && (e = f.width * f.height);
  89.       var g = window.document.documentElement,
  90.       h = g.clientWidth * g.clientHeight;
  91.       return b.abs(17 * d + 25 * e - h)
  92.     } catch (i) {
  93.       return 1
  94.     }
  95.   }
  96.   return {
  97.     get: a
  98.   }
  99. }),
  100. define('core/utils/guid', [
  101.   'core/utils/fingerprint'
  102. ], function (a) {
  103.   'use strict';
  104.   function b(a) {
  105.     a = a || {
  106.     };
  107.     var b = a.Uint32Array || window.Uint32Array,
  108.     c = a.crypto || window.crypto,
  109.     d = a.Math || window.Math;
  110.     try {
  111.       var e = new b(1);
  112.       return c.getRandomValues(e),
  113.       e[0]
  114.     } catch (f) {
  115.       return d.floor(1000000000 * d.random())
  116.     }
  117.   }
  118.   function c() {
  119.     var a = window.performance,
  120.     b = a && a.timing;
  121.     if (!b) return 100000;
  122.     var c = b.domainLookupEnd - b.domainLookupStart,
  123.     d = b.connectEnd - b.connectStart,
  124.     e = b.responseStart - b.navigationStart;
  125.     return 11 * c + 13 * d + 17 * e
  126.   }
  127.   function d(d) {
  128.     d = d || {
  129.     };
  130.     var e = d.Math || window.Math,
  131.     f = Number((new Date).getTime().toString().substring(3)),
  132.     g = e.abs(f + c() - a.get()).toString(32);
  133.     return g += b(d).toString(32)
  134.   }
  135.   return {
  136.     generate: d
  137.   }
  138. }),
  139. define('core/utils/hash', [
  140. ], function () {
  141.   'use strict';
  142.   var a = function (a) {
  143.     var b,
  144.     c,
  145.     d,
  146.     e = 0;
  147.     if (0 === a.length) return e;
  148.     for (b = 0, c = a.length; b < c; b++) d = a.charCodeAt(b),
  149.     e = (e << 5) - e + d,
  150.     e |= 0;
  151.     return e
  152.   };
  153.   return {
  154.     calculate: a
  155.   }
  156. }),
  157. define('core/analytics/identity', [
  158.   'exports',
  159.   'core/utils/cookies',
  160.   'core/utils/guid',
  161.   'core/utils/hash',
  162.   'core/utils/fingerprint'
  163. ], function (a, b, c, d, e) {
  164.   'use strict';
  165.   var f = !1,
  166.   g = a.ImpressionManager = function () {
  167.     this.isPrivate = !0,
  168.     this.impId = c.generate()
  169.   };
  170.   g.prototype.COOKIE_NAME = '__jid',
  171.   g.prototype.TTL = 1800000,
  172.   g.prototype.init = function (a) {
  173.     this.isPrivate = a && a.isPrivate,
  174.     this.isPrivate || (this.prevImp = b.read(this.COOKIE_NAME)),
  175.     this.persist()
  176.   },
  177.   g.prototype.setImpressionId = function (a) {
  178.     this.impId = a,
  179.     this.persist()
  180.   },
  181.   g.prototype.persist = function () {
  182.     return this.isPrivate ? void b.erase(this.COOKIE_NAME) : void b.create(this.COOKIE_NAME, this.impId, {
  183.       expiresIn: this.TTL
  184.     })
  185.   };
  186.   var h = a.UniqueManager = function () {
  187.     this.isPrivate = !0
  188.   };
  189.   h.prototype.COOKIE_NAME = 'disqus_unique',
  190.   h.prototype.TTL = 31536000000,
  191.   h.prototype.init = function (a) {
  192.     return this.isPrivate = a && a.isPrivate,
  193.     this.isPrivate ? void b.erase(this.COOKIE_NAME, {
  194.       domain: window.location.host.split(':') [0]
  195.     }) : (this.value = b.read(this.COOKIE_NAME) || c.generate(), void b.create(this.COOKIE_NAME, this.value, {
  196.       domain: window.location.host.split(':') [0],
  197.       expiresIn: this.TTL
  198.     }))
  199.   },
  200.   h.prototype.isPersistent = function () {
  201.     return !this.isPrivate && b.read(this.COOKIE_NAME) === this.value
  202.   },
  203.   a.init = function (b, c) {
  204.     f && !c || (a.impression.init(b), a.unique.init(b), f = !0)
  205.   },
  206.   a.reset = function () {
  207.     f = !1,
  208.     a.impression = new g,
  209.     a.unique = new h
  210.   },
  211.   a.reset(),
  212.   a.clientId = function () {
  213.     var b,
  214.     c = a.unique;
  215.     return c.isPersistent() && (b = c.value),
  216.     b || e.get().toString()
  217.   },
  218.   a.getPercentBucketForString = function (a, b) {
  219.     var c = 100,
  220.     e = Math.abs(d.calculate(a));
  221.     if (b) {
  222.       var f = Math.pow(10, b);
  223.       return e % (c * f) / f
  224.     }
  225.     return e % c
  226.   },
  227.   a.clientPercent = function () {
  228.     return a.getPercentBucketForString(a.clientId())
  229.   }
  230. }),
  231. define('core/config/urls', [
  232.   'common/urls'
  233. ], function (a) {
  234.   'use strict';
  235.   return a
  236. }),
  237. define('core/analytics/jester', [
  238.   'jquery',
  239.   'underscore',
  240.   'backbone',
  241.   'core/analytics/identity',
  242.   'core/config/urls'
  243. ], function (a, b, c, d, e) {
  244.   'use strict';
  245.   var f = c.Model.extend({
  246.     url: e.jester + '/event.js',
  247.     defaults: {
  248.       experiment: 'default',
  249.       variant: 'control'
  250.     },
  251.     setHostReferrer: function (a) {
  252.       a ? a.indexOf('http') === - 1 || this.set('page_referrer', a) : this.set('page_referrer', 'direct')
  253.     },
  254.     decoratePayload: function (c) {
  255.       c.event || (c.event = 'activity'),
  256.       c = b.extend(this.toJSON(), c),
  257.       b.extend(c, {
  258.         imp: d.impression.impId,
  259.         prev_imp: d.impression.prevImp
  260.       }),
  261.       c.section || (c.section = 'default'),
  262.       c.area || (c.area = 'n/a');
  263.       var e = a.param(c).length;
  264.       if (e > 2048 && this.has('page_referrer')) {
  265.         var f = window.document.createElement('a');
  266.         f.href = this.get('page_referrer');
  267.         var g = f.hostname;
  268.         g && (c.page_referrer_domain = g),
  269.         delete c.page_referrer
  270.       }
  271.       return c
  272.     },
  273.     emit: function (c) {
  274.       return a.ajax({
  275.         url: b.result(this, 'url'),
  276.         data: this.decoratePayload(c),
  277.         dataType: 'script',
  278.         cache: !0
  279.       })
  280.     }
  281.   }),
  282.   g = function (b) {
  283.     var c = new window.Image;
  284.     return c.src = e.jester + '/stat.gif?' + a.param({
  285.       event: b
  286.     }),
  287.     c
  288.   },
  289.   h = function (c, d) {
  290.     if (!b.any(d, function (a) {
  291.       return a < 0
  292.     })) {
  293.       b.each(d, function (a, b) {
  294.         d[b] = Math.round(a)
  295.       });
  296.       var f = new window.Image;
  297.       return f.src = e.jester + '/telemetry/' + c + '.gif?' + a.param(d),
  298.       f
  299.     }
  300.   },
  301.   i = new f;
  302.   return i.setHostReferrer(window.document.referrer),
  303.   {
  304.     ActivityClient: f,
  305.     client: i,
  306.     logStat: g,
  307.     telemetry: h
  308.   }
  309. }),
  310. define('core/utils/urls', [
  311. ], function () {
  312.   'use strict';
  313.   var a = {
  314.   },
  315.   b = window.document.createElement('a');
  316.   return a.getOrigin = function (a) {
  317.     b.href = a;
  318.     var c = b.href.split('/');
  319.     return c[0] + '//' + c[2]
  320.   },
  321.   a.getHostName = function (a) {
  322.     return b.href = a,
  323.     b.hostname
  324.   },
  325.   a.getDomainPart = function (b, c) {
  326.     'undefined' == typeof c && (c = 0);
  327.     var d = a.getHostName(b),
  328.     e = d.split('.').reverse();
  329.     return e[c]
  330.   },
  331.   a.getQuery = function (a) {
  332.     return b.href = a,
  333.     b.search
  334.   },
  335.   a.getPathname = function (a) {
  336.     return b.href = a,
  337.     b.pathname
  338.   },
  339.   a
  340. }),
  341. define('core/frameBus', [
  342.   'jquery',
  343.   'underscore',
  344.   'backbone',
  345.   'core/utils/urls'
  346. ], function (a, b, c, d) {
  347.   'use strict';
  348.   var e = window.opener || window.parent,
  349.   f = window.name,
  350.   g = window.document.referrer,
  351.   h = {
  352.   };
  353.   h.client = d.getOrigin(window.document.location.href),
  354.   h.secureClient = h.client.replace(/^\w+:\/\//, 'https://'),
  355.   h.host = g ? d.getOrigin(g) : h.client;
  356.   var i = {
  357.     origins: h,
  358.     messageHandler: function (a) {
  359.       a = a.originalEvent;
  360.       var b;
  361.       try {
  362.         b = JSON.parse(a.data)
  363.       } catch (c) {
  364.         return
  365.       }
  366.       b.name && '!' === b.name[0] && a.origin !== h.client && a.origin !== h.secureClient || 'client' === b.scope && i.trigger(b.name, b.data)
  367.     },
  368.     postMessage: function (a) {
  369.       a = JSON.stringify(a),
  370.       e.postMessage(a, '*')
  371.     },
  372.     sendHostMessage: function (a, b) {
  373.       b = b || [
  374.       ],
  375.       i.postMessage({
  376.         scope: 'host',
  377.         sender: f,
  378.         name: a,
  379.         data: b
  380.       })
  381.     }
  382.   };
  383.   return b.extend(i, c.Events),
  384.   a(window).on('message', i.messageHandler),
  385.   a(window).on('unload', function () {
  386.     i.sendHostMessage('die')
  387.   }),
  388.   window.DISQUS = window.DISQUS || {
  389.   },
  390.   window.DISQUS.Bus = i,
  391.   i
  392. }),
  393. define('core/bus', [
  394.   'backbone',
  395.   'underscore',
  396.   'core/frameBus'
  397. ], function (a, b, c) {
  398.   'use strict';
  399.   var d = b.extend({
  400.   }, a.Events);
  401.   return d.frame = c,
  402.   d
  403. }),
  404. define('core/utils/storage', [
  405. ], function () {
  406.   'use strict';
  407.   var a = function (a) {
  408.     var b = '_dsqstorage_';
  409.     try {
  410.       return a.localStorage.setItem(b, b),
  411.       a.localStorage.getItem(b),
  412.       a.localStorage.removeItem(b),
  413.       !0
  414.     } catch (c) {
  415.       return !1
  416.     }
  417.   }(window),
  418.   b = function () {
  419.     var a = {
  420.     };
  421.     return {
  422.       getItem: function (b) {
  423.         return a.hasOwnProperty(b) ? a[b] : null
  424.       },
  425.       setItem: function (b, c) {
  426.         a[b] = String(c)
  427.       },
  428.       removeItem: function (b) {
  429.         delete a[b]
  430.       },
  431.       clear: function () {
  432.         a = {
  433.         }
  434.       }
  435.     }
  436.   }();
  437.   return {
  438.     get: function (a) {
  439.       var b = null;
  440.       try {
  441.         return b = this.backend.getItem(a),
  442.         JSON.parse(b)
  443.       } catch (c) {
  444.         return b
  445.       }
  446.     },
  447.     set: function (a, b) {
  448.       try {
  449.         this.backend.setItem(a, JSON.stringify(b))
  450.       } catch (c) {
  451.       }
  452.     },
  453.     remove: function (a) {
  454.       try {
  455.         this.backend.removeItem(a)
  456.       } catch (b) {
  457.       }
  458.     },
  459.     clear: function () {
  460.       try {
  461.         this.backend.clear()
  462.       } catch (a) {
  463.       }
  464.     },
  465.     backend: a ? window.localStorage : b,
  466.     isPersistent: a
  467.   }
  468. }),
  469. define('core/utils/auth', [
  470.   'core/utils/cookies'
  471. ], function (a) {
  472.   'use strict';
  473.   var b = {
  474.   },
  475.   c = 'disqusauth';
  476.   return b.getFromCookie = function () {
  477.     var b = (a.read(c) || '').replace(/"/g, '').split('|');
  478.     !b || b[1] && b[6] || (b = [
  479.     ], a.erase(c, {
  480.     }));
  481.     var d = parseInt(b[6] || '0', 10);
  482.     return {
  483.       avatarUrl: b[7] ? decodeURIComponent(b[7]) : void 0,
  484.       datetimeFormatting: parseInt(b[4], 10) ? 'absolute' : 'relative',
  485.       id: d,
  486.       isModerator: parseInt(b[8], 10) > 0,
  487.       staff: Boolean(parseInt(b[2], 10)),
  488.       tzOffset: b[5],
  489.       username: b[1],
  490.       isAuthenticated: Boolean(d && '0' !== d)
  491.     }
  492.   },
  493.   b
  494. }),
  495. define('core/switches', [
  496.   'underscore',
  497.   'remote/config',
  498.   'core/analytics/identity',
  499.   'core/utils/storage',
  500.   'core/utils/auth'
  501. ], function (a, b, c, d, e) {
  502.   'use strict';
  503.   var f = 'switch:',
  504.   g = {
  505.   },
  506.   h = {
  507.   };
  508.   return h._getKey = function (a) {
  509.     return f + a
  510.   },
  511.   h.disableFeature = function (a) {
  512.     g[a] = !1
  513.   },
  514.   h.resetFeature = function (a) {
  515.     g[a] = null
  516.   },
  517.   h.forceFeature = function (a) {
  518.     g[a] = !0
  519.   },
  520.   h.getSwitchContext = function (a) {
  521.     var c = d.get(this._getKey(a));
  522.     if (null !== c) return c;
  523.     var e = g[a];
  524.     return null != e ? e : (b.lounge && b.lounge.switches || {
  525.     }) [a]
  526.   },
  527.   h.isFeatureActive = function (b, d) {
  528.     var f = h.getSwitchContext(b);
  529.     if (a.isBoolean(f)) return f;
  530.     if (!f) return !1;
  531.     var g = e.getFromCookie(),
  532.     i = {
  533.       percent: c.clientPercent(),
  534.       user_id: g.id,
  535.       username: g.username,
  536.       is_staff: g.staff,
  537.       is_moderator: g.isModerator
  538.     },
  539.     j = a.defaults(d || {
  540.     }, i);
  541.     return a.any(f, function (b, d) {
  542.       var e = j[d];
  543.       if (/percent$/.test(d) && a.isNumber(b)) {
  544.         if (a.isNumber(e)) return b > e;
  545.         if (a.isString(e)) {
  546.           var f = 0;
  547.           return b !== Math.round(b) && (f = b.toString().split('.').pop().length),
  548.           b > c.getPercentBucketForString(e, f)
  549.         }
  550.         return !1
  551.       }
  552.       return a.isArray(b) ? a.contains(b, e) : b === e
  553.     })
  554.   },
  555.   h
  556. }),
  557. define('core/utils/url/serializeArgs', [
  558.   'require',
  559.   'exports',
  560.   'module',
  561.   'core/utils/collection/each'
  562. ], function (a, b, c) {
  563.   'use strict';
  564.   var d = a('core/utils/collection/each');
  565.   c.exports = function (a) {
  566.     var b = [
  567.     ];
  568.     return d(a, function (a, c) {
  569.       void 0 !== a && b.push(encodeURIComponent(c) + (null === a ? '' : '=' + encodeURIComponent(a)))
  570.     }),
  571.     b.join('&')
  572.   }
  573. }),
  574. define('core/utils/url/serialize', [
  575.   'require',
  576.   'exports',
  577.   'module',
  578.   'core/utils/url/serializeArgs'
  579. ], function (a, b, c) {
  580.   'use strict';
  581.   var d = a('core/utils/url/serializeArgs');
  582.   c.exports = function e(a, b, c) {
  583.     if (b && (a.indexOf('?') === - 1 ? a += '?' : '&' !== a.charAt(a.length - 1) && (a += '&'), a += d(b)), c) {
  584.       var f = {
  585.       };
  586.       return f[(new Date).getTime()] = null,
  587.       e(a, f)
  588.     }
  589.     var g = a.length;
  590.     return '&' === a.charAt(g - 1) ? a.slice(0, g - 1) : a
  591.   }
  592. }),
  593. define('core/utils/isAdBlockEnabled', [
  594. ], function () {
  595.   'use strict';
  596.   function a() {
  597.     var a = d.createElement('div');
  598.     return a.setAttribute('class', 'pub_300x250 pub_300x250m pub_728x90 text-ad textAd text_ad text_ads text-ads text-ad-links ad-text adSense adBlock adContent adBanner'),
  599.     a.setAttribute('style', 'width: 1px !important; height: 1px !important; position: absolute !important; left: -10000px !important; top: -1000px !important;'),
  600.     a
  601.   }
  602.   function b(a) {
  603.     if (null === a.offsetParent || 0 === a.offsetHeight || 0 === a.offsetLeft || 0 === a.offsetTop || 0 === a.offsetWidth || 0 === a.clientHeight || 0 === a.clientWidth) return !0;
  604.     if (void 0 !== window.getComputedStyle) {
  605.       var b = window.getComputedStyle(a, null);
  606.       if (b && ('none' === b.getPropertyValue('display') || 'hidden' === b.getPropertyValue('visibility'))) return !0
  607.     }
  608.     return !1
  609.   }
  610.   var c = 100,
  611.   d = window.document;
  612.   return function (e) {
  613.     var f = a();
  614.     d.body.appendChild(f),
  615.     setTimeout(function () {
  616.       var a = b(f);
  617.       d.body.removeChild(f),
  618.       e(a)
  619.     }, c)
  620.   }
  621. }),
  622. define('core/utils/html/toRGBColorString', [
  623. ], function () {
  624.   'use strict';
  625.   var a = 'Color components should be numbers.';
  626.   return function (b) {
  627.     var c = Number(b.red),
  628.     d = Number(b.green),
  629.     e = Number(b.blue);
  630.     if (isNaN(c) || isNaN(d) || isNaN(e)) throw new Error(a);
  631.     var f = 'rgb',
  632.     g = [
  633.       c,
  634.       d,
  635.       e
  636.     ],
  637.     h = b.alpha;
  638.     if (h) {
  639.       if (h = Number(h), isNaN(h)) throw new Error(a);
  640.       f += 'a',
  641.       g.push(h)
  642.     }
  643.     return f + '(' + g + ')'
  644.   }
  645. }),
  646. define('core/utils/lang/isString', [
  647. ], function () {
  648.   'use strict';
  649.   return function (a) {
  650.     return '[object String]' === Object.prototype.toString.call(a)
  651.   }
  652. }),
  653. define('core/utils/html/setInlineStyle', [
  654.   'require',
  655.   'core/utils/collection/each',
  656.   'core/utils/lang/isString',
  657.   'core/utils/object/extend'
  658. ], function (a) {
  659.   'use strict';
  660.   function b(a) {
  661.     return a.replace(/\s+/g, '').toLowerCase()
  662.   }
  663.   var c = a('core/utils/collection/each'),
  664.   d = a('core/utils/lang/isString'),
  665.   e = a('core/utils/object/extend');
  666.   return function (a, f, g) {
  667.     var h = {
  668.     };
  669.     d(f) ? h[f] = g : h = f;
  670.     var i = e({
  671.     }, h);
  672.     c(i, function (a, c) {
  673.       var d = b(c);
  674.       d !== c && (delete i[c], i[d] = a),
  675.       null === a && (i[d] = ''),
  676.       void 0 === a && delete i[d]
  677.     });
  678.     var j = a.style;
  679.     c(i, function (a, b) {
  680.       j.setProperty(b, String(a), 'important')
  681.     })
  682.   }
  683. }),
  684. define('core/utils/html/parseColor', [
  685.   'require',
  686.   'core/utils/html/setInlineStyle'
  687. ], function (a) {
  688.   'use strict';
  689.   function b(a) {
  690.     return a.replace(/\s+/g, '').toLowerCase()
  691.   }
  692.   function c(a) {
  693.     return a = a.replace(/^#([a-f0-9])([a-f0-9])([a-f0-9])$/, '#$1$1$2$2$3$3'),
  694.     a = a.slice(1),
  695.     {
  696.       red: parseInt(a.slice(0, 2), 16),
  697.       green: parseInt(a.slice(2, 4), 16),
  698.       blue: parseInt(a.slice(4, 6), 16)
  699.     }
  700.   }
  701.   function d(a) {
  702.     var b = a.match(/^rgb\((\d+),(\d+),(\d+)\)$/);
  703.     return {
  704.       red: parseInt(b[1], 10),
  705.       green: parseInt(b[2], 10),
  706.       blue: parseInt(b[3], 10)
  707.     }
  708.   }
  709.   function e(a) {
  710.     var b = a.match(/^rgba\((\d+),(\d+),(\d+),([\d.]+)\)$/);
  711.     return {
  712.       red: parseInt(b[1], 10),
  713.       green: parseInt(b[2], 10),
  714.       blue: parseInt(b[3], 10),
  715.       alpha: parseFloat(b[4])
  716.     }
  717.   }
  718.   function f(a, b, c, d) {
  719.     return b = window.document.createElement(b),
  720.     h(b, {
  721.       visibility: 'hidden',
  722.       color: c
  723.     }),
  724.     a.appendChild(b),
  725.     c = d(b),
  726.     a.removeChild(b),
  727.     c
  728.   }
  729.   function g(a, c) {
  730.     c = c || {
  731.     };
  732.     var e = c.container || window.document.body;
  733.     return window.getComputedStyle ? (a = f(e, 'span', a, function (a) {
  734.       return window.getComputedStyle(a, null).getPropertyValue('color')
  735.     }), d(b(a))) : (a = f(e, 'textarea', a, function (a) {
  736.       return a.createTextRange().queryCommandValue('ForeColor')
  737.     }), {
  738.       red: 255 & a,
  739.       blue: a >>> 16,
  740.       green: (65280 & a) >>> 8
  741.     })
  742.   }
  743.   var h = a('core/utils/html/setInlineStyle');
  744.   return function (a, f) {
  745.     a = b(a);
  746.     var h;
  747.     if ('transparent' === a) return {
  748.       red: 0,
  749.       green: 0,
  750.       blue: 0,
  751.       alpha: 0
  752.     };
  753.     if ('#' === a.charAt(0)) h = c;
  754.      else if ('rgba(' === a.slice(0, 5)) h = e;
  755.      else if ('rgb(' === a.slice(0, 4)) h = d;
  756.      else {
  757.       if (!/^[a-z]+$/.test(a)) throw new Error('parseColor received unparseable color: ' + a);
  758.       h = g
  759.     }
  760.     return h(a, f)
  761.   }
  762. }),
  763. define('core/host/globalFromSandbox', [
  764.   'require'
  765. ], function (a) {
  766.   'use strict';
  767.   var b = window.document,
  768.   c = b.createElement('iframe');
  769.   return c.style.display = 'none',
  770.   function (a, d) {
  771.     var e = d && d[a] || null;
  772.     try {
  773.       return c.parentNode !== b.body && b.body.appendChild(c),
  774.       c.contentWindow[a] || e
  775.     } catch (f) {
  776.       return e
  777.     }
  778.   }
  779. }),
  780. define('core/host/utils', [
  781.   'require',
  782.   'core/utils/browser',
  783.   'core/utils/lang/isString',
  784.   'core/utils/html/getCurrentStyle',
  785.   'core/utils/html/parseColor',
  786.   'core/host/globalFromSandbox'
  787. ], function (a) {
  788.   'use strict';
  789.   function b(a) {
  790.     for (var b = [
  791.       /(https?:)?\/\/(www\.)?disqus\.com\/forums\/([\w_-]+)/i,
  792.       /(https?:)?\/\/(www\.)?([\w_-]+)\.disqus\.com/i,
  793.       /(https?:)?\/\/(www\.)?dev\.disqus\.org\/forums\/([\w_-]+)/i,
  794.       /(https?:)?\/\/(www\.)?([\w_-]+)\.dev\.disqus\.org/i
  795.     ], c = 0; c < b.length; c++) {
  796.       var d = a.match(b[c]);
  797.       if (d && d.length && 4 === d.length) return d[3]
  798.     }
  799.     return null
  800.   }
  801.   function c(a, c, d) {
  802.     var e = a.querySelector('script[src*="disqus"][src$="' + c + '"]');
  803.     if (e) {
  804.       var f = e.getAttribute ? e.getAttribute('src') : e.src;
  805.       d = d || b;
  806.       var g = d(f);
  807.       return g ? g.toLowerCase() : null
  808.     }
  809.     return null
  810.   }
  811.   function d(a, b) {
  812.     var c,
  813.     d,
  814.     e = 0,
  815.     f = new Array(a.length);
  816.     for (c = 0; c <= a.length; c++) for (f[c] = new Array(b.length), d = 0; d <= b.length; d++) f[c][d] = 0;
  817.     for (c = 0; c < a.length; c++) 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]));
  818.     return e
  819.   }
  820.   function e() {
  821.     for (var a = t.getElementsByTagName('h1'), b = t.title, c = b.length, e = b, f = 0.6, g = function (a) {
  822.       var g,
  823.       h = a.textContent || a.innerText;
  824.       null !== h && void 0 !== h && (g = d(b, h) / c, g > f && (f = g, e = h))
  825.     }, h = 0; h < a.length; h++) g(a[h]);
  826.     return e
  827.   }
  828.   function f(a) {
  829.     return a.toLowerCase().replace(/^\s+|\s+$/g, '').replace(/['"]/g, '')
  830.   }
  831.   function g(a) {
  832.     var b = 0,
  833.     c = 1,
  834.     d = 2;
  835.     if (!s('atob') || !s('requestAnimationFrame')) return c;
  836.     try {
  837.       a.postMessage('ping', '*')
  838.     } catch (e) {
  839.       return d
  840.     }
  841.     return b
  842.   }
  843.   function h(a, b, c) {
  844.     c = c || b;
  845.     var d = q(a, b, c);
  846.     return !d || /color/i.test(b) && 0 === r(d).alpha ? a && h(a.parentNode, b, c) || d : d || null
  847.   }
  848.   function i(a, b, c, d) {
  849.     p(b) && (b = t.createElement(b));
  850.     var e = null;
  851.     return b.style.visibility = 'hidden',
  852.     a.appendChild(b),
  853.     e = h(b, c, d),
  854.     a.removeChild(b),
  855.     e
  856.   }
  857.   function j(a) {
  858.     for (var b, c = i(a, 'span', 'font-family', 'fontFamily'), d = c.split(','), e = {
  859.       courier: 1,
  860.       times: 1,
  861.       'times new roman': 1,
  862.       georgia: 1,
  863.       palatino: 1,
  864.       serif: 1
  865.     }, g = 0; g < d.length; g++) if (b = f(d[g]), e.hasOwnProperty(b)) return !0;
  866.     return !1
  867.   }
  868.   function k(a) {
  869.     var b = t.createElement('a');
  870.     return b.href = Number(new Date),
  871.     r(i(a, b, 'color'), {
  872.       container: a
  873.     })
  874.   }
  875.   function l(a) {
  876.     var b = a.red,
  877.     c = a.green,
  878.     d = a.blue;
  879.     if (a.hasOwnProperty('alpha')) {
  880.       var e = a.alpha,
  881.       f = function (a) {
  882.         return Math.round(a * e + 255 * (1 - e))
  883.       };
  884.       b = f(b),
  885.       c = f(c),
  886.       d = f(d)
  887.     }
  888.     return (299 * b + 587 * c + 114 * d) / 1000
  889.   }
  890.   function m(a) {
  891.     var b = i(a, 'span', 'background-color', 'backgroundColor'),
  892.     c = r(b, {
  893.       container: a
  894.     });
  895.     return 0 === c.alpha ? 'light' : l(c) < 128 ? 'dark' : 'light'
  896.   }
  897.   function n(a) {
  898.     var b = k(a);
  899.     return 0 === b.alpha ? 'light' : l(b) < 128 ? 'dark' : 'light'
  900.   }
  901.   var o = a('core/utils/browser'),
  902.   p = a('core/utils/lang/isString'),
  903.   q = a('core/utils/html/getCurrentStyle'),
  904.   r = a('core/utils/html/parseColor'),
  905.   s = a('core/host/globalFromSandbox'),
  906.   t = window.document,
  907.   u = function () {
  908.     var a,
  909.     b,
  910.     c = function () {
  911.       return !1
  912.     };
  913.     if ('hidden' in t) a = 'hidden',
  914.     b = 'visibilitychange';
  915.      else {
  916.       if (!('webkitHidden' in t)) return {
  917.         isHidden: c,
  918.         listen: c,
  919.         stopListening: c
  920.       };
  921.       a = 'webkitHidden',
  922.       b = 'webkitvisibilitychange'
  923.     }
  924.     return {
  925.       isHidden: function () {
  926.         return t[a]
  927.       },
  928.       listen: function (a) {
  929.         return t.addEventListener(b, a)
  930.       },
  931.       stopListening: function (a) {
  932.         return t.removeEventListener(b, a)
  933.       }
  934.     }
  935.   }(),
  936.   v = function () {
  937.     var a = t.createElement('div');
  938.     a.style.visibility = 'hidden',
  939.     a.style.width = '100px',
  940.     a.style.msOverflowStyle = 'scrollbar',
  941.     t.body.appendChild(a);
  942.     var b = a.offsetWidth;
  943.     a.style.overflow = 'scroll';
  944.     var c = t.createElement('div');
  945.     c.style.width = '100%',
  946.     a.appendChild(c);
  947.     var d = c.offsetWidth;
  948.     return a.parentNode.removeChild(a),
  949.     b - d
  950.   },
  951.   w = {
  952.     getItem: function (a) {
  953.       try {
  954.         return window.localStorage.getItem(a)
  955.       } catch (b) {
  956.       }
  957.     },
  958.     setItem: function (a, b) {
  959.       try {
  960.         return window.localStorage.setItem(a, b)
  961.       } catch (c) {
  962.       }
  963.     }
  964.   },
  965.   x = 1,
  966.   y = function (a) {
  967.     if (a.nodeType === x) {
  968.       var b = q(a, 'max-height', 'maxHeight'),
  969.       c = q(a, 'overflow-y', 'overflowY');
  970.       return b && 'none' !== b && c && 'visible' !== c
  971.     }
  972.   },
  973.   z = 4,
  974.   A = function (a) {
  975.     if (a.nodeType === x) return a.scrollHeight - a.clientHeight > z
  976.   },
  977.   B = function () {
  978.     if (t.querySelector) {
  979.       var a = t.querySelector('link[rel=canonical]');
  980.       if (a) return a.href
  981.     }
  982.   };
  983.   return {
  984.     MAX_Z_INDEX: 2147483647,
  985.     getShortnameFromUrl: b,
  986.     getForum: c,
  987.     guessThreadTitle: e,
  988.     getContrastYIQ: l,
  989.     getColorScheme: m,
  990.     getElementStyle: i,
  991.     getAnchorColor: k,
  992.     getAnchorColorScheme: n,
  993.     normalizeFontValue: f,
  994.     isSerif: j,
  995.     getBrowserSupport: g,
  996.     pageVisibility: u,
  997.     getScrollbarWidth: v,
  998.     browser: o,
  999.     storage: w,
  1000.     appearsToHideContent: y,
  1001.     hasOverflow: A,
  1002.     getCanonicalUrl: B
  1003.   }
  1004. }),
  1005. define('common/utils', [
  1006.   'jquery',
  1007.   'underscore',
  1008.   'loglevel',
  1009.   'common/main',
  1010.   'common/urls',
  1011.   'core/host/utils',
  1012.   'core/utils/cookies',
  1013.   'core/utils/html/parseColor'
  1014. ], function (a, b, c, d, e, f, g, h) {
  1015.   'use strict';
  1016.   var i = window.document,
  1017.   j = {
  1018.   };
  1019.   j.globalUniqueId = function (a) {
  1020.     return b.uniqueId(a) + '_' + Number(new Date)
  1021.   },
  1022.   j.setPublisherColor = function (a) {
  1023.     i.documentElement.style.setProperty('--publisher-color', a);
  1024.     var b = f.getContrastYIQ(h(a));
  1025.     b > 5 && b < 250 && i.documentElement.style.setProperty('--publisher-color-safe', a)
  1026.   },
  1027.   j.addStylesheetRules = function (a) {
  1028.     function c() {
  1029.       var e = b.find(i.styleSheets, function (a) {
  1030.         var b = a.ownerNode || a.owningElement;
  1031.         return b.id === d
  1032.       });
  1033.       if (!e) return void setTimeout(c, 50);
  1034.       for (var f = 0, g = a.length; f < g; f++) {
  1035.         var h = 1,
  1036.         j = a[f],
  1037.         k = j[0],
  1038.         l = '';
  1039.         '[object Array]' === Object.prototype.toString.call(j[1][0]) && (j = j[1], h = 0);
  1040.         for (var m = j.length; h < m; h++) {
  1041.           var n = j[h];
  1042.           l += n[0] + ':' + n[1] + (n[2] ? ' !important' : '') + ';\n'
  1043.         }
  1044.         e.insertRule ? e.insertRule(k + '{' + l + '}', e.cssRules.length) : e.addRule(k, l, - 1)
  1045.       }
  1046.     }
  1047.     var d = 'css_' + (new Date).getTime(),
  1048.     e = i.createElement('style');
  1049.     e.id = d,
  1050.     i.getElementsByTagName('head') [0].appendChild(e),
  1051.     window.createPopup || e.appendChild(i.createTextNode('')),
  1052.     c()
  1053.   };
  1054.   var k = j.CORS = {
  1055.     handler: function (a, b, c) {
  1056.       a && c >= 200 && c < 300 ? a() : b && (c < 200 || c >= 300) && b()
  1057.     },
  1058.     XHR2: function (a, b, c, d) {
  1059.       var e = k.handler,
  1060.       f = new window.XMLHttpRequest;
  1061.       return f.open(a, b, !0),
  1062.       f.onreadystatechange = function () {
  1063.         f.readyState === window.XMLHttpRequest.DONE && e(c, d, f.status)
  1064.       },
  1065.       f
  1066.     }
  1067.   };
  1068.   k.request = function () {
  1069.     return 'withCredentials' in new window.XMLHttpRequest ? k.XHR2 : function () {
  1070.       return null
  1071.     }
  1072.   }(),
  1073.   j.isWindowClosed = function (a) {
  1074.     if (!a) return !0;
  1075.     try {
  1076.       return a.closed || void 0 === a.closed
  1077.     } catch (b) {
  1078.       return !0
  1079.     }
  1080.   },
  1081.   j.truncate = function (a, b, c) {
  1082.     return c = c || '...',
  1083.     a.length > b ? a.slice(0, b) + c : a
  1084.   },
  1085.   j.extractDomainForCookies = function (a) {
  1086.     return a.split('/') [2].replace(/:[0-9]+/, '')
  1087.   },
  1088.   j.cookies = {
  1089.     domain: j.extractDomainForCookies(e.root),
  1090.     create: function (a, b) {
  1091.       var c = 31536000000;
  1092.       g.create(a, b, {
  1093.         domain: j.cookies.domain,
  1094.         expiresIn: c
  1095.       })
  1096.     },
  1097.     read: g.read,
  1098.     erase: function (a) {
  1099.       g.erase(a, {
  1100.         domain: j.cookies.domain
  1101.       })
  1102.     }
  1103.   },
  1104.   j.updateURL = function (a, c) {
  1105.     var d,
  1106.     e = i.createElement('a');
  1107.     return c = c || {
  1108.     },
  1109.     e.href = a,
  1110.     c.hostname && c.hostname.match(/\.$/) && (c.hostname += e.hostname),
  1111.     d = b.extend({
  1112.       protocol: e.protocol,
  1113.       hostname: e.hostname,
  1114.       pathname: e.pathname,
  1115.       search: e.search
  1116.     }, c),
  1117.     d.pathname.match(/^\//) || (d.pathname = '/' + d.pathname),
  1118.     d.protocol + '//' + d.hostname + d.pathname + d.search
  1119.   },
  1120.   j.injectBaseElement = function (a, b) {
  1121.     b = b || i;
  1122.     var c = b.getElementsByTagName('base') [0] || b.createElement('base');
  1123.     c.target = '_parent',
  1124.     a ? c.href = a : c.removeAttribute('href'),
  1125.     c.parentNode || (b.head || b.getElementsByTagName('head') [0]).appendChild(c)
  1126.   },
  1127.   j.syntaxHighlighter = function () {
  1128.     var c = 1,
  1129.     e = 2,
  1130.     f = null,
  1131.     g = null,
  1132.     h = [
  1133.     ],
  1134.     i = {
  1135.       highlight: function (a) {
  1136.         null === g && i._load(),
  1137.         h.push(a),
  1138.         g === e && i.scheduleHighlight()
  1139.       },
  1140.       _highlight: function (b) {
  1141.         var c = a(b).html();
  1142.         a(b).html(c.replace(/^<br>/, '')),
  1143.         f.highlightBlock(b),
  1144.         i.scheduleHighlight()
  1145.       },
  1146.       scheduleHighlight: function () {
  1147.         var a = h.shift();
  1148.         a && window.requestAnimationFrame(b.bind(i._highlight, i, a))
  1149.       },
  1150.       _load: function () {
  1151.         g = c,
  1152.         d.loadCss('https://c.disquscdn.com/next/embed/styles/highlight.3128dd90ecaebd8542ac3442033f3f00.css'),
  1153.         require(['common/vendor_extensions/highlight'], function (a) {
  1154.           g = e,
  1155.           f = a,
  1156.           i.scheduleHighlight()
  1157.         })
  1158.       }
  1159.     };
  1160.     return i
  1161.   }();
  1162.   var l = a('html');
  1163.   j.getPageHeight = function () {
  1164.     var b = a('#tos__message'),
  1165.     c = b.outerHeight();
  1166.     return c && (c += b.offset().top),
  1167.     Math.max(c, l.height())
  1168.   },
  1169.   j.calculatePositionFullscreen = function () {
  1170.     return {
  1171.       pageOffset: a(window).scrollTop(),
  1172.       height: i.documentElement.clientHeight,
  1173.       frameOffset: {
  1174.         left: 0,
  1175.         top: 0
  1176.       }
  1177.     }
  1178.   },
  1179.   j.triggerClick = function (a, b) {
  1180.     var c,
  1181.     d,
  1182.     e = a[0],
  1183.     f = {
  1184.       altKey: !1,
  1185.       button: 0,
  1186.       ctrlKey: !1,
  1187.       metaKey: !1,
  1188.       shiftKey: !1
  1189.     };
  1190.     if (i.createEvent) {
  1191.       if (c = i.createEvent('MouseEvents'), b) for (d in f) f.hasOwnProperty(d) && b.hasOwnProperty(d) && (f[d] = b[d]);
  1192.       c.initMouseEvent('click', !0, !0, window, 0, 0, 0, 0, 0, f.ctrlKey, f.altKey, f.shiftKey, f.metaKey, 0, null),
  1193.       e.dispatchEvent && e.dispatchEvent(c)
  1194.     } else if (i.createEventObject) {
  1195.       if (c = i.createEventObject(), c.eventType = 'click', b) for (d in f) f.hasOwnProperty(d) && b.hasOwnProperty(d) && (c[d] = b[d]);
  1196.       e.fireEvent('onclick', c)
  1197.     }
  1198.   },
  1199.   j.delayLinkClick = function (a, c) {
  1200.     a.preventDefault(),
  1201.     b.delay(b.bind(j.triggerClick, this, c, a.originalEvent), 100)
  1202.   },
  1203.   j.mixin = function (a, c, d) {
  1204.     var e = a.prototype,
  1205.     f = b.extend({
  1206.     }, c, d);
  1207.     if (b.defaults(e, f), b.defaults(e.events, f.events), void 0 !== e.initialize && void 0 !== f.initialize) {
  1208.       var g = e.initialize;
  1209.       e.initialize = function () {
  1210.         var a = g.apply(this, arguments);
  1211.         return f.initialize.apply(this, arguments),
  1212.         a
  1213.       }
  1214.     }
  1215.     return a
  1216.   },
  1217.   j.extractService = function (b, c) {
  1218.     var d = '[data-action^=' + c + ']',
  1219.     e = a(b);
  1220.     e = e.is(d) && e || e.closest(d);
  1221.     var f = e.attr('data-action') || ':',
  1222.     g = f.split(':') [1];
  1223.     return g
  1224.   },
  1225.   j.getConfigFromHash = function (a) {
  1226.     var d,
  1227.     e = a.location.hash;
  1228.     try {
  1229.       d = JSON.parse(decodeURIComponent(String(e).substr(1)))
  1230.     } catch (f) {
  1231.       c.debug('Failed to parse config from URL hash', f)
  1232.     }
  1233.     return b.isObject(d) ? d : {
  1234.     }
  1235.   };
  1236.   var m = /[<>]|:\/\//;
  1237.   return j.isPlainText = function (a) {
  1238.     return !a.match(m)
  1239.   },
  1240.   j.isDNTEnabled = function (a) {
  1241.     return a || (a = window),
  1242.     '1' === a.navigator.doNotTrack || 'yes' === a.navigator.doNotTrack || '1' === a.navigator.msDoNotTrack
  1243.   },
  1244.   j.shouldSample = function (a) {
  1245.     var b = parseInt(a, 10);
  1246.     return !!b && (!(b > 100) && Math.random() < b / 100)
  1247.   },
  1248.   j.decorate = function () {
  1249.     var a,
  1250.     c = b.toArray(arguments),
  1251.     d = c.pop();
  1252.     return b.isFunction(d) || (a = d, d = c.pop()),
  1253.     b.reduceRight(c, function (b, c) {
  1254.       return c.call(a || this, b)
  1255.     }, function () {
  1256.       return d.apply(a || this, arguments)
  1257.     })
  1258.   },
  1259.   j
  1260. }),
  1261. define('lounge/common', [
  1262. ], function () {
  1263.   'use strict';
  1264.   var a,
  1265.   b = function (b) {
  1266.     a = b
  1267.   },
  1268.   c = function () {
  1269.     return a
  1270.   };
  1271.   return {
  1272.     setLounge: b,
  1273.     getLounge: c
  1274.   }
  1275. });
  1276. var _extends = Object.assign || function (a) {
  1277.   for (var b = 1; b < arguments.length; b++) {
  1278.     var c = arguments[b];
  1279.     for (var d in c) Object.prototype.hasOwnProperty.call(c, d) && (a[d] = c[d])
  1280.   }
  1281.   return a
  1282. };
  1283. define('lounge/tracking', [
  1284.   'jquery',
  1285.   'underscore',
  1286.   'raven',
  1287.   'core/analytics/identity',
  1288.   'core/analytics/jester',
  1289.   'core/bus',
  1290.   'common/urls',
  1291.   'core/switches',
  1292.   'core/utils',
  1293.   'core/utils/hash',
  1294.   'core/utils/url/serialize',
  1295.   'core/utils/isAdBlockEnabled',
  1296.   'core/utils/html/toRGBColorString',
  1297.   'remote/config',
  1298.   'common/utils',
  1299.   'common/main',
  1300.   'lounge/common'
  1301. ], function (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q) {
  1302.   'use strict';
  1303.   function r(n, q) {
  1304.     function r(a, c, f) {
  1305.       var i = {
  1306.         abe: f ? '1' : '0',
  1307.         embed_hidden: q.config.isBehindClick ? '1' : '0',
  1308.         integration: q.config.integration,
  1309.         load_time: Number(new Date) - p.timings.initStart - (p.timings.renderStart && p.timings.bootstrapStart ? p.timings.renderStart - p.timings.bootstrapStart : 0)
  1310.       };
  1311.       if (h.isFeatureActive('init_embed_activity')) b.extend(i, {
  1312.         verb: 'load',
  1313.         object_type: 'product',
  1314.         object_id: 'embed'
  1315.       }),
  1316.       e.client.emit(i);
  1317.        else {
  1318.         var j = a.user.id,
  1319.         l = o.isDNTEnabled();
  1320.         b.extend(i, {
  1321.           event: 'init_embed',
  1322.           thread: C,
  1323.           forum: z,
  1324.           forum_id: A,
  1325.           imp: d.impression.impId,
  1326.           prev_imp: d.impression.prevImp,
  1327.           thread_slug: B.get('slug'),
  1328.           user_type: a.user.get('user_type') || 'anon',
  1329.           referrer: n.document.referrer,
  1330.           theme: 'next',
  1331.           dnt: l ? '1' : '0',
  1332.           tracking_enabled: c ? '1' : '0'
  1333.         }, q.config.experiment),
  1334.         j && '0' !== j && (i.user_id = j);
  1335.         var m = y.get('settings');
  1336.         m && b.has(m, 'adsProductLinksEnabled') && b.extend(i, {
  1337.           promoted_enabled: m.adsProductLinksEnabled,
  1338.           max_enabled: m.adsPositionTopEnabled
  1339.         }),
  1340.         (new n.Image).src = k(g.jester + '/event.gif', i, !1)
  1341.       }
  1342.       if (B.isModerator(a.user)) {
  1343.         var r = n.document.createElement('iframe');
  1344.         r.src = 'https://disqusads.com/enable-logging',
  1345.         r.style.display = 'none',
  1346.         n.document.body.appendChild(r)
  1347.       }
  1348.     }
  1349.     function t(a) {
  1350.       w = !0,
  1351.       x = a,
  1352.       s.shouldTrack(y, q.session.user) && (d.init({
  1353.       }, !0), s.load3rdParties(B, q))
  1354.     }
  1355.     var y = q.forum,
  1356.     z = y.id,
  1357.     A = y.get('pk'),
  1358.     B = q.thread,
  1359.     C = B.id;
  1360.     q.session.on('change:id', function (a) {
  1361.       e.client.set('user_id', a.id)
  1362.     }),
  1363.     q.session.once('change:id', function () {
  1364.       var b = this,
  1365.       c = s.shouldTrack(y, this.user),
  1366.       e = s.shouldTrack(y, this.user, !0);
  1367.       if (q.config.isPrivate && this.user && this.user.get('hasAcceptedGdprTerms') && d.init({
  1368.         isPrivate: !1
  1369.       }, !0), c && s.load3rdParties(B, q), !v && y.get('settings').adsEnabled && h.isFeatureActive('zyncOnly') && e) {
  1370.         var j = (new Date).getTime();
  1371.         a('body').append(a('<img>').hide().attr('src', g.zyncPixelImage + '&cid=c' + d.unique.value + '&cache_buster=' + j)),
  1372.         v = !0
  1373.       }
  1374.       l(function (a) {
  1375.         r(b, c, a)
  1376.       }),
  1377.       f.frame.sendHostMessage('tracking:init', {
  1378.         shouldTrack: c,
  1379.         isMobile: i.isMobileUserAgent(n),
  1380.         hostIdentityActive: h.isFeatureActive('hostIdentityActive', {
  1381.           forum: y.id,
  1382.           forum_percent: y.id
  1383.         }),
  1384.         liveConnectActive: e && h.isFeatureActive('liveConnectActive', {
  1385.           forum: y.id,
  1386.           forum_percent: y.id
  1387.         }),
  1388.         unique: d.unique.value
  1389.       })
  1390.     }),
  1391.     e.client.set({
  1392.       product: 'embed',
  1393.       thread: C,
  1394.       thread_id: C,
  1395.       forum: z,
  1396.       forum_id: A,
  1397.       zone: 'thread',
  1398.       version: p.version
  1399.     }),
  1400.     q.once('bootstrap:complete', function () {
  1401.       e.client.set({
  1402.         page_url: q.config.referrer
  1403.       });
  1404.       var a = q.config.experiment;
  1405.       a && e.client.set({
  1406.         experiment: a.experiment,
  1407.         variant: a.variant,
  1408.         service: a.service
  1409.       }),
  1410.       e.client.setHostReferrer(q.config.hostReferrer)
  1411.     });
  1412.     var D = {
  1413.       inViewport: function () {
  1414.         var c = q.config,
  1415.         d = {
  1416.           color_scheme: c.colorScheme,
  1417.           anchor_color: m(c.anchorColor),
  1418.           typeface: c.typeface,
  1419.           width: a(n.document).width()
  1420.         },
  1421.         f = {
  1422.           gpc: window.navigator.globalPrivacyControl ? 1 : 0
  1423.         };
  1424.         q.meta.topics && (f.topics = q.meta.topics.map(function (a) {
  1425.           return a.topic.toString()
  1426.         }).join(',')),
  1427.         d = b.pick(d, function (a, c) {
  1428.           switch (c) {
  1429.             case 'width':
  1430.               return b.isNumber(a);
  1431.             default:
  1432.               return b.isString(a) && '' !== a
  1433.           }
  1434.         }),
  1435.         e.client.emit({
  1436.           verb: 'view',
  1437.           object_type: 'product',
  1438.           object_id: 'embed',
  1439.           extra_data: JSON.stringify(_extends({
  1440.           }, d, f))
  1441.         }),
  1442.         q.off('inViewport')
  1443.       },
  1444.       'uiCallback:postCreated': function (a, c) {
  1445.         c = c || {
  1446.         },
  1447.         b.extend(c, {
  1448.           object_type: 'post',
  1449.           object_id: a.id,
  1450.           verb: 'post'
  1451.         }),
  1452.         a.has('parent') && (c.target_type = 'post', c.target_id = a.get('parent')),
  1453.         e.client.emit(c)
  1454.       },
  1455.       'uiCallback:postUpdated': function (a, c) {
  1456.         c = c || {
  1457.         },
  1458.         b.extend(c, {
  1459.           object_type: 'post',
  1460.           object_id: a.id,
  1461.           verb: 'update'
  1462.         }),
  1463.         e.client.emit(c)
  1464.       },
  1465.       'uiAction:postStartUpdate': function (a, c) {
  1466.         c = c || {
  1467.         },
  1468.         b.extend(c, {
  1469.           verb: 'click',
  1470.           adjective: 'edit',
  1471.           object_type: 'link',
  1472.           object_id: a.id
  1473.         }),
  1474.         e.client.emit(c)
  1475.       },
  1476.       'uiAction:seeMore': function (a) {
  1477.         e.client.emit({
  1478.           verb: 'open',
  1479.           object_type: 'section',
  1480.           object_id: 'thread/page-' + a
  1481.         })
  1482.       },
  1483.       'uiAction:seeMoreChildren': function (a) {
  1484.         e.client.emit({
  1485.           verb: 'click',
  1486.           object_type: 'link',
  1487.           object_id: 'show_more_comments',
  1488.           area: s.getEventTrackingArea(a)
  1489.         })
  1490.       },
  1491.       'uiAction:postUpvote': function (a, b) {
  1492.         e.client.emit({
  1493.           verb: 'like',
  1494.           object_type: 'post',
  1495.           object_id: a.id,
  1496.           area: s.getEventTrackingArea(b)
  1497.         })
  1498.       },
  1499.       'uiAction:postUnvote': function (a, b) {
  1500.         e.client.emit({
  1501.           verb: 'unlike',
  1502.           object_type: 'post',
  1503.           object_id: a.id,
  1504.           area: s.getEventTrackingArea(b)
  1505.         })
  1506.       },
  1507.       'uiAction:postDownvote': function (a, b) {
  1508.         e.client.emit({
  1509.           verb: 'dislike',
  1510.           object_type: 'post',
  1511.           object_id: a.id,
  1512.           area: s.getEventTrackingArea(b)
  1513.         })
  1514.       },
  1515.       'uiAction:threadUnlike': function () {
  1516.         e.client.emit({
  1517.           verb: 'unlike',
  1518.           object_type: 'thread',
  1519.           zone: 'thread'
  1520.         })
  1521.       },
  1522.       'uiAction:threadLike': function () {
  1523.         e.client.emit({
  1524.           verb: 'like',
  1525.           object_type: 'thread'
  1526.         })
  1527.       },
  1528.       'uiAction:postShare': function (a, b) {
  1529.         e.client.emit({
  1530.           verb: 'share',
  1531.           object_type: 'post',
  1532.           object_id: a.id,
  1533.           target_type: 'service',
  1534.           target_id: b
  1535.         })
  1536.       },
  1537.       'uiAction:threadShare': function (a) {
  1538.         e.client.emit({
  1539.           verb: 'share',
  1540.           object_type: 'thread',
  1541.           target_type: 'service',
  1542.           target_id: a
  1543.         })
  1544.       },
  1545.       'uiAction:clickLink': function (a, b) {
  1546.         e.client.emit({
  1547.           verb: 'click',
  1548.           object_type: 'link',
  1549.           object_id: a[0].href,
  1550.           area: s.getEventTrackingArea(b)
  1551.         })
  1552.       },
  1553.       'uiAction:followUser': function (a) {
  1554.         e.client.emit({
  1555.           verb: 'follow',
  1556.           object_type: 'user',
  1557.           object_id: a.id
  1558.         })
  1559.       },
  1560.       'uiAction:unfollowUser': function (a) {
  1561.         e.client.emit({
  1562.           verb: 'stop-following',
  1563.           object_type: 'user',
  1564.           object_id: a.id
  1565.         })
  1566.       },
  1567.       'uiAction:openLogin': function (a) {
  1568.         e.client.emit({
  1569.           verb: 'open',
  1570.           object_type: 'login',
  1571.           object_id: a
  1572.         })
  1573.       },
  1574.       'uiAction:onboardAlertShow': function () {
  1575.         e.client.emit({
  1576.           verb: 'view',
  1577.           object_type: 'area',
  1578.           object_id: 'onboard_alert'
  1579.         })
  1580.       },
  1581.       'uiAction:onboardAlertDismiss': function () {
  1582.         e.client.emit({
  1583.           verb: 'close',
  1584.           object_type: 'area',
  1585.           object_id: 'onboard_alert'
  1586.         })
  1587.       },
  1588.       'uiAction:openHome': function (a, b) {
  1589.         e.client.emit({
  1590.           verb: 'open',
  1591.           object_type: 'product',
  1592.           object_id: b ? 'bridge' : 'home',
  1593.           section: a
  1594.         })
  1595.       },
  1596.       'uiAction:viewBanUser': function () {
  1597.         e.client.emit({
  1598.           verb: 'view',
  1599.           object_type: 'area',
  1600.           object_id: 'ban_user'
  1601.         })
  1602.       },
  1603.       'uiAction:clickBanUser': function (a) {
  1604.         e.client.emit({
  1605.           verb: 'click',
  1606.           object_type: 'button',
  1607.           object_id: 'ban_user',
  1608.           extra_data: a
  1609.         })
  1610.       },
  1611.       'uiAction:viewFlagPost': function () {
  1612.         e.client.emit({
  1613.           verb: 'view',
  1614.           object_type: 'area',
  1615.           object_id: 'flag_post'
  1616.         })
  1617.       },
  1618.       'uiAction:clickFlagPost': function () {
  1619.         e.client.emit({
  1620.           verb: 'click',
  1621.           object_type: 'button',
  1622.           object_id: 'flag_post'
  1623.         })
  1624.       },
  1625.       'uiAction:viewBlockUser': function () {
  1626.         e.client.emit({
  1627.           verb: 'view',
  1628.           object_type: 'area',
  1629.           object_id: 'block_user'
  1630.         })
  1631.       },
  1632.       'uiAction:clickBlockUser': function () {
  1633.         e.client.emit({
  1634.           verb: 'click',
  1635.           object_type: 'button',
  1636.           object_id: 'block_user'
  1637.         })
  1638.       },
  1639.       'uiAction:viewUpgradeCard': function () {
  1640.         e.client.emit({
  1641.           verb: 'hover',
  1642.           object_type: 'icon',
  1643.           object_id: 'disqus_pro',
  1644.           organization_id: y.get('organizationId')
  1645.         })
  1646.       },
  1647.       'uiAction:clickUpgrade': function () {
  1648.         e.client.emit({
  1649.           verb: 'click',
  1650.           object_type: 'button',
  1651.           object_id: 'subscriptions',
  1652.           organization_id: y.get('organizationId')
  1653.         })
  1654.       },
  1655.       'uiAction:clickCommentPolicy': function (a) {
  1656.         e.client.emit({
  1657.           verb: 'click',
  1658.           object_type: 'link',
  1659.           section: 'comment_policy',
  1660.           object_id: a
  1661.         })
  1662.       },
  1663.       'uiAction:clickThreadPremoderate': function () {
  1664.         e.client.emit({
  1665.           verb: 'click',
  1666.           object_type: 'button',
  1667.           object_id: 'premoderate_thread'
  1668.         })
  1669.       },
  1670.       viewActivity: function (a, b) {
  1671.         var c = {
  1672.           verb: 'view',
  1673.           object_type: a,
  1674.           object_id: b
  1675.         };
  1676.         e.client.emit(c)
  1677.       },
  1678.       'uiAction:loadEmailSubscriptionPrompt': function (a) {
  1679.         e.client.emit({
  1680.           verb: 'load',
  1681.           object_type: 'section',
  1682.           object_id: 'email_subscriptions',
  1683.           section: 'email_subscriptions',
  1684.           extra_data: JSON.stringify({
  1685.             user_verified: Boolean(q.session.user && q.session.user.get('isVerified')),
  1686.             email_subscription_prompt: a
  1687.           })
  1688.         })
  1689.       },
  1690.       'uiAction:viewEmailSubscriptionPrompt': function (a) {
  1691.         e.client.emit({
  1692.           verb: 'view',
  1693.           object_type: 'section',
  1694.           object_id: 'email_subscriptions',
  1695.           section: 'email_subscriptions',
  1696.           extra_data: JSON.stringify({
  1697.             user_verified: Boolean(q.session.user && q.session.user.get('isVerified')),
  1698.             email_subscription_prompt: a
  1699.           })
  1700.         })
  1701.       },
  1702.       'uiAction:clickEmailSubscriptionPromptSubscribe': function (a) {
  1703.         e.client.emit({
  1704.           verb: 'click',
  1705.           object_type: 'button',
  1706.           object_id: 'subscribe',
  1707.           section: 'email_subscriptions',
  1708.           extra_data: JSON.stringify({
  1709.             user_verified: Boolean(q.session.user && q.session.user.get('isVerified')),
  1710.             email_subscription_prompt: a
  1711.           })
  1712.         })
  1713.       },
  1714.       'uiAction:clickEmailSubscriptionPromptDismiss': function (a) {
  1715.         e.client.emit({
  1716.           verb: 'click',
  1717.           object_type: 'button',
  1718.           object_id: 'hide_this_message',
  1719.           section: 'email_subscriptions',
  1720.           extra_data: JSON.stringify({
  1721.             user_verified: Boolean(q.session.user && q.session.user.get('isVerified')),
  1722.             email_subscription_prompt: a
  1723.           })
  1724.         })
  1725.       },
  1726.       'uiAction:viewReactionsPromotion': function () {
  1727.         e.client.emit({
  1728.           verb: 'view',
  1729.           object_type: 'section',
  1730.           object_id: 'reactions_onboarding',
  1731.           zone: 'thread',
  1732.           section: 'reactions_onboarding'
  1733.         })
  1734.       },
  1735.       'uiAction:reactionsEnable': function () {
  1736.         e.client.emit({
  1737.           verb: 'click',
  1738.           object_type: 'button',
  1739.           object_id: 'enable_reactions',
  1740.           zone: 'thread',
  1741.           section: 'reactions_onboarding'
  1742.         })
  1743.       },
  1744.       'uiAction:reactionsDefer': function () {
  1745.         e.client.emit({
  1746.           verb: 'click',
  1747.           object_type: 'button',
  1748.           object_id: 'maybe_later',
  1749.           zone: 'thread',
  1750.           section: 'reactions_onboarding'
  1751.         })
  1752.       },
  1753.       'uiAction:reactionsVote': function (a) {
  1754.         e.client.emit({
  1755.           verb: 'vote',
  1756.           object_type: 'thread',
  1757.           adjective: a.get('text'),
  1758.           zone: 'thread',
  1759.           section: 'reactions',
  1760.           extra_data: JSON.stringify({
  1761.             reaction_id: a.id
  1762.           })
  1763.         })
  1764.       },
  1765.       'uiAction:gifsClickButton': function () {
  1766.         e.client.emit({
  1767.           verb: 'click',
  1768.           object_type: 'button',
  1769.           adjective: 'gif_picker',
  1770.           object_id: 'thread',
  1771.           zone: 'thread'
  1772.         })
  1773.       },
  1774.       'uiAction:gifsScrollToBottom': function () {
  1775.         e.client.emit({
  1776.           verb: 'view',
  1777.           adverb: 'results',
  1778.           object_type: 'zone',
  1779.           adjective: 'end',
  1780.           object_id: 'thread',
  1781.           zone: 'thread'
  1782.         })
  1783.       },
  1784.       'uiAction:loadLiveComments': function () {
  1785.         e.client.emit({
  1786.           verb: 'click',
  1787.           adverb: 'comments',
  1788.           object_type: 'notification',
  1789.           adjective: 'realtime',
  1790.           object_id: 'thread',
  1791.           zone: 'thread'
  1792.         })
  1793.       },
  1794.       'uiAction:loadLiveReplies': function () {
  1795.         e.client.emit({
  1796.           verb: 'click',
  1797.           adverb: 'replies',
  1798.           object_type: 'notification',
  1799.           adjective: 'realtime',
  1800.           object_id: 'thread',
  1801.           zone: 'thread'
  1802.         })
  1803.       },
  1804.       'uiAction:clickBadge': function (a, b) {
  1805.         e.client.emit({
  1806.           verb: 'click',
  1807.           object_type: 'badge',
  1808.           object_id: b,
  1809.           section: 'profile/badges',
  1810.           zone: 'thread',
  1811.           area: s.getEventTrackingArea(a)
  1812.         })
  1813.       },
  1814.       'uiAction:viewBadgeModal': function () {
  1815.         e.client.emit({
  1816.           verb: 'view',
  1817.           object_type: 'modal',
  1818.           object_id: 'badge',
  1819.           section: 'manage_badges',
  1820.           zone: 'thread'
  1821.         })
  1822.       },
  1823.       'uiAction:awardBadge': function (a) {
  1824.         e.client.emit({
  1825.           verb: 'award',
  1826.           object_type: 'badge',
  1827.           object_id: a,
  1828.           section: 'manage_badges',
  1829.           zone: 'thread'
  1830.         })
  1831.       },
  1832.       'uiAction:removeBadge': function (a) {
  1833.         e.client.emit({
  1834.           verb: 'remove',
  1835.           object_type: 'badge',
  1836.           object_id: a,
  1837.           section: 'manage_badges',
  1838.           zone: 'thread'
  1839.         })
  1840.       },
  1841.       'uiAction:behindClickButton': function () {
  1842.         e.client.emit({
  1843.           verb: 'click',
  1844.           object_type: 'button',
  1845.           adjective: 'behind_click',
  1846.           object_id: 'thread',
  1847.           zone: 'thread'
  1848.         })
  1849.       },
  1850.       'uiAction:toggleClassicDisqus': function (a) {
  1851.         e.client.emit({
  1852.           verb: 'click',
  1853.           object_type: 'button',
  1854.           adjective: a,
  1855.           object_id: 'toggle_classic_disqus',
  1856.           zone: 'thread'
  1857.         })
  1858.       }
  1859.     };
  1860.     q.on(D),
  1861.     f.on(D),
  1862.     f.frame.once('cmp.consent', t),
  1863.     f.frame.once('tracking.hostIdentity', function (b) {
  1864.       if (!u) {
  1865.         var e = [
  1866.           j.calculate(b.domain),
  1867.           b.id,
  1868.           d.unique.value
  1869.         ],
  1870.         f = a('body'),
  1871.         h = g.logger + '/1/' + n.btoa(JSON.stringify(e));
  1872.         try {
  1873.           f.append(a('<img>').hide().attr('src', h))
  1874.         } catch (i) {
  1875.           c.captureException(i)
  1876.         }
  1877.         u = !0
  1878.       }
  1879.     })
  1880.   }
  1881.   var s = {
  1882.   },
  1883.   t = !1,
  1884.   u = !1,
  1885.   v = !1,
  1886.   w = !1,
  1887.   x = {
  1888.   };
  1889.   return s.init = function (a) {
  1890.     r(window, a)
  1891.   },
  1892.   s.getEventTrackingArea = function (b) {
  1893.     return a(b.currentTarget).closest('[data-tracking-area]').attr('data-tracking-area')
  1894.   },
  1895.   s.load3rdParties = function (d, f) {
  1896.     if (g.glitter && !t) {
  1897.       var h = n.lounge.tracking || {
  1898.       },
  1899.       i = h.iframe_limit || 0,
  1900.       j = {
  1901.         postCount: d.get('posts') || 0,
  1902.         likeCount: d.get('likes') || 0,
  1903.         postVoteCount: b.reduce(d.posts.pluck('likes'), function (a, b) {
  1904.           return a + b
  1905.         }, 0),
  1906.         referrer: encodeURIComponent(f.config.referrer),
  1907.         tcString: x.tcString || ''
  1908.       };
  1909.       a.ajax({
  1910.         dataType: 'jsonp',
  1911.         cache: !0,
  1912.         url: g.glitter,
  1913.         data: {
  1914.           forum_shortname: d.forum.id,
  1915.           thread_id: d.id,
  1916.           referer: f.config.hostReferrer,
  1917.           tc: x.tcString || ''
  1918.         },
  1919.         jsonpCallback: 'dsqGlitterResponseHandler',
  1920.         success: function (d) {
  1921.           var f = a('body');
  1922.           b.each(d, function (d) {
  1923.             if (!('img' !== d.type && 'iframe' !== d.type || 'iframe' === d.type && (i -= 1, i < 0))) {
  1924.               var g;
  1925.               try {
  1926.                 g = d.url.replace(/\{\{(.+?)\}\}/g, function (a, c) {
  1927.                   var d = c.trim();
  1928.                   if (!j.hasOwnProperty(d)) throw new Error('Unknown template variable in tracker URL: ' + d);
  1929.                   return b.escape(j[d])
  1930.                 });
  1931.                 var h = a('<' + d.type + '>').hide().attr('src', g);
  1932.                 d.logging && h.on('load', function () {
  1933.                   e.logStat('glitter.loaded.' + d.logging)
  1934.                 }),
  1935.                 f.append(h)
  1936.               } catch (k) {
  1937.                 c.captureException(k)
  1938.               }
  1939.             }
  1940.           })
  1941.         },
  1942.         error: function () {
  1943.           e.logStat('glitter.error')
  1944.         }
  1945.       }),
  1946.       t = !0
  1947.     }
  1948.   },
  1949.   s.shouldTrack = function (a, b) {
  1950.     var c = arguments.length > 2 && void 0 !== arguments[2] && arguments[2];
  1951.     return !(Boolean(a && a.get('settings').disable3rdPartyTrackers ^ c) || b && b.get('disable3rdPartyTrackers') || '1' === o.cookies.read('disqus_tracking_optout') || o.isDNTEnabled() || s.isPrivate(b))
  1952.   },
  1953.   s.isPrivate = function (a) {
  1954.     return q.getLounge().config.isPrivate && (!a || !a.get('hasAcceptedGdprTerms')) && !w
  1955.   },
  1956.   s.reset = function () {
  1957.     t = !1,
  1958.     u = !1,
  1959.     v = !1,
  1960.     w = !1,
  1961.     x = {
  1962.     }
  1963.   },
  1964.   s
  1965. }),
  1966. define('common/jsxUtils', [
  1967.   'underscore'
  1968. ], function (a) {
  1969.   'use strict';
  1970.   return {
  1971.     append: function (b, c) {
  1972.       var d = function e(c) {
  1973.         if (null !== c) return a.isArray(c) ? void c.forEach(e) : a.isElement(c) || c && c.nodeType === window.Node.DOCUMENT_FRAGMENT_NODE ? void b.appendChild(c) : void b.appendChild(window.document.createTextNode(c))
  1974.       };
  1975.       d(c)
  1976.     }
  1977.   }
  1978. });
  1979. var _extends = Object.assign || function (a) {
  1980.   for (var b = 1; b < arguments.length; b++) {
  1981.     var c = arguments[b];
  1982.     for (var d in c) Object.prototype.hasOwnProperty.call(c, d) && (a[d] = c[d])
  1983.   }
  1984.   return a
  1985. };
  1986. define('react', [
  1987.   'jquery',
  1988.   'underscore',
  1989.   'common/jsxUtils'
  1990. ], function (a, b, c) {
  1991.   'use strict';
  1992.   var d = window.document;
  1993.   return {
  1994.     createElement: function (e, f) {
  1995.       for (var g = arguments.length, h = Array(g > 2 ? g - 2 : 0), i = 2; i < g; i++) h[i - 2] = arguments[i];
  1996.       if ('function' == typeof e) {
  1997.         h.length > 0 && (f = _extends({
  1998.           children: 1 === h.length ? h[0] : h
  1999.         }, f));
  2000.         var j = e(f);
  2001.         if (b.isArray(j)) {
  2002.           var k = d.createDocumentFragment();
  2003.           return c.append(k, j),
  2004.           k
  2005.         }
  2006.         return j
  2007.       }
  2008.       if ('string' != typeof e) throw new Error('Unknown type');
  2009.       var l = d.createElement(e),
  2010.       m = !1;
  2011.       return f && Object.keys(f).forEach(function (b) {
  2012.         var c = f[b];
  2013.         if (/^(?:data-|aria-|role$)/.test(b)) null !== c && l.setAttribute(b, c);
  2014.          else if ('dangerouslySetInnerHTML' === b) m = !0,
  2015.         l.innerHTML = c && c.__html || '';
  2016.          else if ('style' === b) Object.keys(c).forEach(function (a) {
  2017.           l.style[a] = c[a]
  2018.         });
  2019.          else if (/^on[A-Z]/.test(b)) c && a(l).on(b.slice(2).toLowerCase(), c);
  2020.          else if ('key' === b);
  2021.          else try {
  2022.           l[b] = c
  2023.         } catch (d) {
  2024.         }
  2025.       }),
  2026.       m || c.append(l, h),
  2027.       l
  2028.     }
  2029.   }
  2030. }),
  2031. define('react-dom', [
  2032.   'common/jsxUtils'
  2033. ], function (a) {
  2034.   'use strict';
  2035.   return {
  2036.     render: function (b, c, d) {
  2037.       return c && (c.innerHTML = '', a.append(c, b)),
  2038.       d && d(),
  2039.       null
  2040.     }
  2041.   }
  2042. }),
  2043. define('core/shared/urls', [
  2044.   'require',
  2045.   'core/utils/object/extend',
  2046.   'core/utils/url/serialize',
  2047.   'core/utils/url/serializeArgs'
  2048. ], function (a) {
  2049.   'use strict';
  2050.   var b = a('core/utils/object/extend'),
  2051.   c = a('core/utils/url/serialize'),
  2052.   d = a('core/utils/url/serializeArgs'),
  2053.   e = 'default',
  2054.   f = {
  2055.     lounge: 'http://disqus.com/embed/comments/',
  2056.     home: 'https://disqus.com/home/'.replace('home/', ''),
  2057.     recommendations: 'http://disqus.com/recommendations/'
  2058.   },
  2059.   g = function (a) {
  2060.     return 'https://' + a.replace(/^\s*(\w+:)?\/\//, '')
  2061.   },
  2062.   h = function (a, h, i, j) {
  2063.     var k = f[a];
  2064.     if (!k) throw new Error('Unknown app: ' + a);
  2065.     'preview' === e && j && (e += '-' + j);
  2066.     var l = g(k),
  2067.     m = b({
  2068.       base: e
  2069.     }, h || {
  2070.     }),
  2071.     n = i ? '#' + d(i) : '';
  2072.     return c(l, m) + n
  2073.   };
  2074.   return {
  2075.     BASE: e,
  2076.     apps: f,
  2077.     get: h,
  2078.     ensureHTTPSProtocol: g
  2079.   }
  2080. }),
  2081. define('core/apps/BaseApp', [
  2082.   'require',
  2083.   'core/Events',
  2084.   'core/utils/object/extend',
  2085.   'core/utils/object/has',
  2086.   'core/utils/uniqueId'
  2087. ], function (a) {
  2088.   'use strict';
  2089.   var b = a('core/Events'),
  2090.   c = a('core/utils/object/extend'),
  2091.   d = a('core/utils/object/has'),
  2092.   e = a('core/utils/uniqueId'),
  2093.   f = function (a) {
  2094.     this.uid = e('dsq-app'),
  2095.     this.settings = a || {
  2096.     };
  2097.     var b = [
  2098.     ],
  2099.     c = this.constructor.prototype;
  2100.     do b.unshift(c),
  2101.     c = c.constructor.__super__;
  2102.     while (c);
  2103.     for (var f = 0, g = b.length; f < g; f++) c = b[f],
  2104.     d(c, 'events') && this.on(c.events, this),
  2105.     d(c, 'onceEvents') && this.once(c.onceEvents, this)
  2106.   };
  2107.   return c(f.prototype, b),
  2108.   f.prototype.destroy = function () {
  2109.     this.off(),
  2110.     this.stopListening()
  2111.   },
  2112.   f.extend = function (a, b) {
  2113.     var e,
  2114.     f = this;
  2115.     e = a && d(a, 'constructor') ? a.constructor : function () {
  2116.       return f.apply(this, arguments)
  2117.     },
  2118.     c(e, f, b);
  2119.     var g = function () {
  2120.       this.constructor = e
  2121.     };
  2122.     return g.prototype = f.prototype,
  2123.     e.prototype = new g,
  2124.     a && c(e.prototype, a),
  2125.     e.__super__ = f.prototype,
  2126.     e
  2127.   },
  2128.   f
  2129. }),
  2130. define('core/common/kernel/utils', [
  2131.   'require'
  2132. ], function (a) {
  2133.   'use strict';
  2134.   function b(a) {
  2135.     return e.getElementById(a) || e.body || e.documentElement
  2136.   }
  2137.   function c(a) {
  2138.     return f.href = a,
  2139.     f.hostname
  2140.   }
  2141.   function d(a, b) {
  2142.     b = b || e.documentElement;
  2143.     for (var c = a, d = 0, f = 0; c && c !== b; ) d += c.offsetLeft,
  2144.     f += c.offsetTop,
  2145.     c = c.offsetParent;
  2146.     return {
  2147.       top: f,
  2148.       left: d,
  2149.       height: a.offsetHeight,
  2150.       width: a.offsetWidth
  2151.     }
  2152.   }
  2153.   var e = window.document,
  2154.   f = e.createElement('a');
  2155.   return {
  2156.     getContainer: b,
  2157.     getHost: c,
  2158.     getOffset: d
  2159.   }
  2160. }),
  2161. define('core/host/json', [
  2162.   'require',
  2163.   'core/host/globalFromSandbox'
  2164. ], function (a) {
  2165.   'use strict';
  2166.   var b,
  2167.   c = window,
  2168.   d = a('core/host/globalFromSandbox');
  2169.   return b = '[object JSON]' === c.Object.prototype.toString.call(c.JSON) ? c.JSON : d('JSON', c),
  2170.   b ? b : {
  2171.   }
  2172. }),
  2173. define('core/common/kernel/WindowBase', [
  2174.   'require',
  2175.   'core/Events',
  2176.   'core/utils/object/extend',
  2177.   'core/utils/uniqueId',
  2178.   'core/common/kernel/utils',
  2179.   'core/host/json'
  2180. ], function (a) {
  2181.   'use strict';
  2182.   var b = a('core/Events'),
  2183.   c = a('core/utils/object/extend'),
  2184.   d = a('core/utils/uniqueId'),
  2185.   e = a('core/common/kernel/utils'),
  2186.   f = a('core/host/json'),
  2187.   g = function (a) {
  2188.     a = a || {
  2189.     },
  2190.     this.state = g.INIT,
  2191.     this.uid = a.uid || d('dsq-frame'),
  2192.     this.origin = a.origin,
  2193.     a.useSourcelessFrame ? this.host = e.getHost(window.location.href) : this.host = e.getHost(this.origin),
  2194.     this.target = a.target,
  2195.     this.sandbox = a.sandbox,
  2196.     this.window = null,
  2197.     g.windows[this.uid] = this,
  2198.     this.on('ready', function () {
  2199.       this.state = g.READY
  2200.     }, this),
  2201.     this.on('die', function () {
  2202.       this.state = g.KILLED
  2203.     }, this)
  2204.   };
  2205.   return c(g, {
  2206.     INIT: 0,
  2207.     READY: 1,
  2208.     KILLED: 2,
  2209.     windows: {
  2210.     },
  2211.     postMessage: function (a, b, c) {
  2212.       return a.postMessage(b, c)
  2213.     }
  2214.   }),
  2215.   c(g.prototype, b),
  2216.   g.prototype.requiresWindow = function (a) {
  2217.     var b = this;
  2218.     return function () {
  2219.       var c = Array.prototype.slice.call(arguments),
  2220.       d = function () {
  2221.         var e = b.window;
  2222.         e ? a.apply(b, c) : setTimeout(d, 500)
  2223.       };
  2224.       b.isReady() ? d() : b.on('ready', d)
  2225.     }
  2226.   },
  2227.   g.prototype.sendMessage = function (a, b) {
  2228.     var c = f.stringify({
  2229.       scope: 'client',
  2230.       name: a,
  2231.       data: b
  2232.     });
  2233.     this.requiresWindow(function (a) {
  2234.       g.postMessage(this.window, a, this.origin)
  2235.     }) (c)
  2236.   },
  2237.   g.prototype.hide = function () {
  2238.   },
  2239.   g.prototype.show = function () {
  2240.   },
  2241.   g.prototype.url = function () {
  2242.     return this.target
  2243.   },
  2244.   g.prototype.destroy = function () {
  2245.     this.state = g.KILLED,
  2246.     this.off()
  2247.   },
  2248.   g.prototype.isReady = function () {
  2249.     return this.state === g.READY
  2250.   },
  2251.   g.prototype.isKilled = function () {
  2252.     return this.state === g.KILLED
  2253.   },
  2254.   g
  2255. }),
  2256. define('core/common/kernel/Iframe', [
  2257.   'require',
  2258.   'core/utils/html/setInlineStyle',
  2259.   'core/utils/object/extend',
  2260.   'core/common/kernel/WindowBase',
  2261.   'core/common/kernel/utils'
  2262. ], function (a) {
  2263.   'use strict';
  2264.   var b = a('core/utils/html/setInlineStyle'),
  2265.   c = a('core/utils/object/extend'),
  2266.   d = a('core/common/kernel/WindowBase'),
  2267.   e = a('core/common/kernel/utils'),
  2268.   f = window.document,
  2269.   g = function (a) {
  2270.     d.call(this, a),
  2271.     this.styles = a.styles || {
  2272.     },
  2273.     this.tabIndex = a.tabIndex || 0,
  2274.     this.title = a.title || 'Disqus',
  2275.     this.sandbox = a.sandbox,
  2276.     this.container = a.container,
  2277.     this.elem = null
  2278.   };
  2279.   return c(g.prototype, d.prototype),
  2280.   g.prototype.load = function () {
  2281.     var a = this.elem = f.createElement('iframe');
  2282.     a.setAttribute('id', this.uid),
  2283.     a.setAttribute('name', this.uid),
  2284.     a.setAttribute('allowTransparency', 'true'),
  2285.     a.setAttribute('frameBorder', '0'),
  2286.     a.setAttribute('scrolling', 'no'),
  2287.     this.role && a.setAttribute('role', this.role),
  2288.     a.setAttribute('tabindex', this.tabIndex),
  2289.     a.setAttribute('title', this.title),
  2290.     'string' == typeof this.sandbox && a.setAttribute('sandbox', this.sandbox),
  2291.     this.setInlineStyle(this.styles)
  2292.   },
  2293.   g.prototype.getOffset = function (a) {
  2294.     return e.getOffset(this.elem, a)
  2295.   },
  2296.   g.prototype.setInlineStyle = function (a, c) {
  2297.     return b(this.elem, a, c)
  2298.   },
  2299.   g.prototype.removeInlineStyle = function (a) {
  2300.     var b = this.elem.style;
  2301.     return 'removeProperty' in b ? void b.removeProperty(a) : void (b[a] = '')
  2302.   },
  2303.   g.prototype.hide = function () {
  2304.     this.setInlineStyle('display', 'none')
  2305.   },
  2306.   g.prototype.show = function () {
  2307.     this.removeInlineStyle('display')
  2308.   },
  2309.   g.prototype.destroy = function () {
  2310.     return this.elem && this.elem.parentNode && (this.elem.parentNode.removeChild(this.elem), this.elem = null),
  2311.     d.prototype.destroy.call(this)
  2312.   },
  2313.   g
  2314. }),
  2315. define('core/host/kernel', [
  2316.   'require',
  2317.   'exports',
  2318.   'module',
  2319.   'core/Events',
  2320.   'core/utils/lang/isString',
  2321.   'core/utils/object/has',
  2322.   'core/utils/object/extend',
  2323.   'core/common/kernel/Iframe',
  2324.   'core/common/kernel/utils',
  2325.   'core/common/kernel/WindowBase',
  2326.   'core/host/json',
  2327.   'core/utils/function/throttle'
  2328. ], function (a, b) {
  2329.   'use strict';
  2330.   var c = a('core/Events'),
  2331.   d = a('core/utils/lang/isString'),
  2332.   e = a('core/utils/object/has'),
  2333.   f = a('core/utils/object/extend'),
  2334.   g = a('core/common/kernel/Iframe'),
  2335.   h = a('core/common/kernel/utils'),
  2336.   i = a('core/common/kernel/WindowBase'),
  2337.   j = a('core/host/json'),
  2338.   k = window.document;
  2339.   b.throttle = a('core/utils/function/throttle'),
  2340.   window.addEventListener('message', function (a) {
  2341.     var c;
  2342.     try {
  2343.       c = j.parse(a.data)
  2344.     } catch (d) {
  2345.       return
  2346.     }
  2347.     var f = c.sender,
  2348.     g = e(i.windows, f) && i.windows[f];
  2349.     g && h.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))
  2350.   }),
  2351.   window.addEventListener('hashchange', function () {
  2352.     b.trigger('window.hashchange', {
  2353.       hash: window.location.hash
  2354.     })
  2355.   }),
  2356.   window.addEventListener('resize', b.throttle(function () {
  2357.     b.trigger('window.resize')
  2358.   }, 250, 50)),
  2359.   k.addEventListener('mousemove', b.throttle(function () {
  2360.     b.trigger('window.mousemove')
  2361.   }, 250, 50));
  2362.   var l = function () {
  2363.     b.trigger('window.scroll')
  2364.   };
  2365.   window.addEventListener('scroll', b.throttle(l, 250, 50), !1),
  2366.   k.addEventListener('click', function () {
  2367.     b.trigger('window.click')
  2368.   });
  2369.   var m = b.Popup = function (a) {
  2370.     a.uid = a.windowName,
  2371.     i.call(this, a)
  2372.   };
  2373.   f(m.prototype, i.prototype),
  2374.   m.prototype.load = function () {
  2375.     var a = this.window = window.open('', this.uid || '_blank');
  2376.     a.location = this.url()
  2377.   },
  2378.   m.prototype.isKilled = function () {
  2379.     return i.prototype.isKilled() || this.window.closed
  2380.   };
  2381.   var n = b.Channel = function (a) {
  2382.     var b = this;
  2383.     b.window = null,
  2384.     g.call(b, a),
  2385.     this.insertBeforeEl = a.insertBeforeEl,
  2386.     this.insertAfterEl = a.insertAfterEl,
  2387.     b.useSourcelessFrame = a.useSourcelessFrame,
  2388.     b.styles = f({
  2389.       width: '1px',
  2390.       'min-width': '100%',
  2391.       border: 'none',
  2392.       overflow: 'hidden',
  2393.       height: '0'
  2394.     }, a.styles || {
  2395.     })
  2396.   };
  2397.   f(n.prototype, g.prototype),
  2398.   n.prototype.load = function (a) {
  2399.     var b = this;
  2400.     g.prototype.load.call(b);
  2401.     var c = b.elem;
  2402.     if (c.setAttribute('width', '100%'), b.useSourcelessFrame) {
  2403.       var e = function () {
  2404.         var a = new window.XMLHttpRequest;
  2405.         a.open('GET', b.url()),
  2406.         a.onreadystatechange = function () {
  2407.           c.contentWindow && a.readyState === c.contentWindow.XMLHttpRequest.DONE && 200 === a.status && (c.contentWindow.document.open(), c.contentWindow.document.write(a.responseText), c.contentWindow.document.close())
  2408.         },
  2409.         a.send()
  2410.       };
  2411.       b.on('redirect', function (a) {
  2412.         b.target = a,
  2413.         e()
  2414.       }),
  2415.       e()
  2416.     } else c.setAttribute('src', b.url());
  2417.     c.addEventListener('load', function () {
  2418.       b.window = c.contentWindow,
  2419.       a && a()
  2420.     });
  2421.     var f = d(b.container) ? h.getContainer(b.container) : b.container,
  2422.     i = (b.insertAfterEl ? b.insertAfterEl.nextSibling : b.insertBeforeEl) || null;
  2423.     f.insertBefore(c, i)
  2424.   },
  2425.   n.prototype.destroy = function () {
  2426.     return this.window = null,
  2427.     g.prototype.destroy.call(this)
  2428.   },
  2429.   b.on = c.on,
  2430.   b.off = c.off,
  2431.   b.trigger = c.trigger
  2432. }),
  2433. define('core/apps/WindowedApp', [
  2434.   'require',
  2435.   'core/utils/object/extend',
  2436.   'core/shared/urls',
  2437.   'core/apps/BaseApp',
  2438.   'core/host/kernel'
  2439. ], function (a) {
  2440.   'use strict';
  2441.   var b = a('core/utils/object/extend'),
  2442.   c = a('core/shared/urls'),
  2443.   d = a('core/apps/BaseApp'),
  2444.   e = a('core/host/kernel'),
  2445.   f = window.document,
  2446.   g = d.extend({
  2447.     name: null,
  2448.     loaderVersion: null,
  2449.     frame: null,
  2450.     origin: c.ensureHTTPSProtocol('https://disqus.com'),
  2451.     state: null,
  2452.     getUrl: function (a, d) {
  2453.       return this.loaderVersion && (d = b({
  2454.         version: this.loaderVersion
  2455.       }, d)),
  2456.       c.ensureHTTPSProtocol(c.get(this.name, a, d, this.settings.previewVersion))
  2457.     },
  2458.     getFrameSettings: function () {
  2459.       var a = {
  2460.         target: this.getUrl(),
  2461.         origin: this.origin,
  2462.         uid: this.uid,
  2463.         sandbox: this.sandbox
  2464.       },
  2465.       b = this.settings;
  2466.       return b.windowName ? a.windowName = b.windowName : a.container = b.container || f.body,
  2467.       b.styles && (a.styles = b.styles),
  2468.       a.useSourcelessFrame = b.useSourcelessFrame,
  2469.       a
  2470.     },
  2471.     getFrame: function () {
  2472.       var a = this.getFrameSettings(),
  2473.       b = a.windowName ? e.Popup : e.Channel;
  2474.       return new b(a)
  2475.     },
  2476.     setState: function (a) {
  2477.       var b = this.constructor;
  2478.       return a in b.states && (this.state = b.states[a], void this.trigger('state:' + a))
  2479.     },
  2480.     init: function () {
  2481.       var a,
  2482.       b = this;
  2483.       b.frame = a = this.getFrame(),
  2484.       b.listenTo(a, 'all', function (c, d) {
  2485.         b.trigger('frame:' + c, d, a)
  2486.       }),
  2487.       b.listenTo(a, 'resize', function (a) {
  2488.         b.lastResizedHeight = a.height
  2489.       }),
  2490.       b.trigger('change:frame', a),
  2491.       b.frame.load(function () {
  2492.         b.setState('LOADED')
  2493.       }),
  2494.       b.setState('INIT')
  2495.     },
  2496.     destroy: function () {
  2497.       var a = this.frame;
  2498.       a && (this.stopListening(a), a.destroy()),
  2499.       this.setState('KILLED'),
  2500.       this.frame = null,
  2501.       d.prototype.destroy.call(this)
  2502.     },
  2503.     events: {
  2504.       'frame:ready': function () {
  2505.         this.setState('READY')
  2506.       }
  2507.     }
  2508.   }, {
  2509.     states: {
  2510.       INIT: 0,
  2511.       LOADED: 1,
  2512.       READY: 2,
  2513.       RUNNING: 3,
  2514.       KILLED: 4
  2515.     }
  2516.   });
  2517.   return g
  2518. }),
  2519. define('core/utils/OnceTimer', [
  2520.   'require',
  2521.   'exports',
  2522.   'module'
  2523. ], function (a, b, c) {
  2524.   'use strict';
  2525.   c.exports = function (a, b) {
  2526.     var c = null,
  2527.     d = !1;
  2528.     this.start = function () {
  2529.       d || (c = setTimeout(function () {
  2530.         d = !0,
  2531.         a()
  2532.       }, b))
  2533.     },
  2534.     this.clear = function () {
  2535.       clearTimeout(c)
  2536.     }
  2537.   }
  2538. }),
  2539. define('core/utils/html/toHexColorString', [
  2540. ], function () {
  2541.   'use strict';
  2542.   function a(a) {
  2543.     if (a = Number(a), isNaN(a) || a > 255) throw new Error('Color components should be numbers less than 256');
  2544.     return a = a.toString(16),
  2545.     1 === a.length ? '0' + a : String(a)
  2546.   }
  2547.   return function (b) {
  2548.     return '#' + a(b.red) + a(b.green) + a(b.blue)
  2549.   }
  2550. }),
  2551. define('core/utils/sandbox', [
  2552. ], function () {
  2553.   'use strict';
  2554.   var a = [
  2555.     'allow-forms',
  2556.     'allow-pointer-lock',
  2557.     'allow-popups',
  2558.     'allow-same-origin',
  2559.     'allow-scripts',
  2560.     'allow-top-navigation'
  2561.   ],
  2562.   b = function (b) {
  2563.     return b ? a.reduce(function (a, c) {
  2564.       return b[c] && (a += c + ' '),
  2565.       a
  2566.     }, '').trim() : ''
  2567.   };
  2568.   return {
  2569.     getAttribute: b
  2570.   }
  2571. }),
  2572. define('core/utils/url/parseQueryString', [
  2573.   'core/utils/collection/each'
  2574. ], function (a) {
  2575.   'use strict';
  2576.   return function (b) {
  2577.     'undefined' == typeof b && (b = window.location.search);
  2578.     var c = {
  2579.     };
  2580.     return a(b.substr(1).split('&'), function (a) {
  2581.       var b = a.split('=').map(function (a) {
  2582.         return decodeURIComponent(a.replace(/\+/g, '%20'))
  2583.       });
  2584.       b[0] && (c[b[0]] = b[1])
  2585.     }),
  2586.     c
  2587.   }
  2588. }),
  2589. define('core/analytics/reporting', [
  2590.   'require',
  2591.   'core/utils/collection/each',
  2592.   'core/utils/url/serialize',
  2593.   'core/config/urls'
  2594. ], function (a) {
  2595.   'use strict';
  2596.   function b(a) {
  2597.     var b = a.split('.'),
  2598.     c = b.length > 2 ? b[b.length - 2] : '';
  2599.     return c.match(/^[0-9a-f]{32}$/i) && c
  2600.   }
  2601.   function c(a) {
  2602.     (new window.Image).src = g(i + '/stat.gif', {
  2603.       event: a
  2604.     })
  2605.   }
  2606.   function d(a) {
  2607.     (new window.Image).src = g(i + '/event.gif', a)
  2608.   }
  2609.   function e(a) {
  2610.     var b = new window.URLSearchParams;
  2611.     f(a, function (a, c) {
  2612.       void 0 !== a && b.append(c, a)
  2613.     });
  2614.     var c = new window.XMLHttpRequest;
  2615.     c.open('POST', i + '/event.json', !0),
  2616.     c.withCredentials = !0,
  2617.     c.send(b)
  2618.   }
  2619.   var f = a('core/utils/collection/each'),
  2620.   g = a('core/utils/url/serialize'),
  2621.   h = a('core/config/urls'),
  2622.   i = h.jester;
  2623.   return {
  2624.     getLoaderVersionFromUrl: b,
  2625.     logStat: c,
  2626.     reportJester: d,
  2627.     reportJesterPOST: e
  2628.   }
  2629. }),
  2630. define('core/ads/safeFrameUtils', [
  2631. ], function () {
  2632.   'use strict';
  2633.   var a = function (a) {
  2634.     return null !== a && !isNaN(Number(a)) && isFinite(a)
  2635.   },
  2636.   b = function (a) {
  2637.     return Math.min.apply(Math, _toConsumableArray(a)) || 0
  2638.   },
  2639.   c = function (a) {
  2640.     return Math.max.apply(Math, _toConsumableArray(a)) || 0
  2641.   };
  2642.   return {
  2643.     min: b,
  2644.     max: c,
  2645.     isNumeric: a
  2646.   }
  2647. });
  2648. var _createClass = function () {
  2649.   function a(a, b) {
  2650.     for (var c = 0; c < b.length; c++) {
  2651.       var d = b[c];
  2652.       d.enumerable = d.enumerable || !1,
  2653.       d.configurable = !0,
  2654.       'value' in d && (d.writable = !0),
  2655.       Object.defineProperty(a, d.key, d)
  2656.     }
  2657.   }
  2658.   return function (b, c, d) {
  2659.     return c && a(b.prototype, c),
  2660.     d && a(b, d),
  2661.     b
  2662.   }
  2663. }();
  2664. define('core/ads/NodeRect', [
  2665.   'core/ads/safeFrameUtils'
  2666. ], function (a) {
  2667.   'use strict';
  2668.   var b = function () {
  2669.     function b() {
  2670.       return _classCallCheck(this, b),
  2671.       1 !== arguments.length || a.isNumeric(arguments[0]) ? void this.fromArray(arguments) : Array.isArray(arguments[0]) ? this.fromArray(arguments[0]) : this.fromObject(arguments[0])
  2672.     }
  2673.     return _createClass(b, [
  2674.       {
  2675.         key: 'fromArray',
  2676.         value: function (a) {
  2677.           this.reset(),
  2678.           a.length >= 6 ? (this.top = a[0], this.right = a[1], this.bottom = a[2], this.left = a[3], this.width = a[4], this.height = a[5]) : a.length >= 4 ? (this.top = a[0], this.right = a[1], this.bottom = a[2], this.left = a[3]) : 3 === a.length ? (this.top = a[0], this.right = a[1], this.bottom = a[2], this.left = 0) : 2 === a.length ? (this.top = a[0], this.right = a[1], this.bottom = a[0], this.left = a[1]) : (this.top = a[0], this.right = a[0], this.bottom = a[0], this.left = a[0]),
  2679.           this.update()
  2680.         }
  2681.       },
  2682.       {
  2683.         key: 'fromObject',
  2684.         value: function (a) {
  2685.           return this.fromArray([a.top,
  2686.           a.right,
  2687.           a.bottom,
  2688.           a.left,
  2689.           a.width,
  2690.           a.height])
  2691.         }
  2692.       },
  2693.       {
  2694.         key: 'update',
  2695.         value: function () {
  2696.           this.width || (this.width = this.right - this.left),
  2697.           this.height || (this.height = this.bottom - this.top)
  2698.         }
  2699.       },
  2700.       {
  2701.         key: 'reset',
  2702.         value: function (a) {
  2703.           a = a || 0,
  2704.           this.top = a,
  2705.           this.right = a,
  2706.           this.bottom = a,
  2707.           this.left = a,
  2708.           this.width = a,
  2709.           this.height = a
  2710.         }
  2711.       },
  2712.       {
  2713.         key: 'getArea',
  2714.         value: function () {
  2715.           return (this.right - this.left) * (this.bottom - this.top)
  2716.         }
  2717.       }
  2718.     ]),
  2719.     b
  2720.   }();
  2721.   return b.getOverlapRect = function (c, d) {
  2722.     var e = a.max([c.left,
  2723.     d.left]),
  2724.     f = a.min([c.left + c.width,
  2725.     d.left + d.width]),
  2726.     g = a.max([c.top,
  2727.     d.top]),
  2728.     h = a.min([c.top + c.height,
  2729.     d.top + d.height]);
  2730.     return f >= e && h >= g && new b(g, f, h, e, f - e, h - g)
  2731.   },
  2732.   b.getOverlapArea = function (b, c) {
  2733.     var d = a.max([0,
  2734.     a.min([b.right,
  2735.     c.right]) - a.max([b.left,
  2736.     c.left])]),
  2737.     e = a.max([0,
  2738.     a.min([b.bottom,
  2739.     c.bottom]) - a.max([b.top,
  2740.     c.top])]);
  2741.     return d * e
  2742.   },
  2743.   b
  2744. }),
  2745. define('core/ads/domUtils', [
  2746.   'core/ads/NodeRect'
  2747. ], function (a) {
  2748.   'use strict';
  2749.   var b = 9,
  2750.   c = function (a) {
  2751.     return a && a.parentNode
  2752.   },
  2753.   d = function (a, b) {
  2754.     if (!a) return null;
  2755.     var c = window.document.defaultView.getComputedStyle(a);
  2756.     return b && c.hasOwnProperty(b) ? c[b] : c
  2757.   },
  2758.   e = function () {
  2759.     return {
  2760.       x: window.pageXOffset,
  2761.       y: window.pageYOffset
  2762.     }
  2763.   },
  2764.   f = function (b) {
  2765.     var c = void 0;
  2766.     if (b && b.style) {
  2767.       var d = b.style.display;
  2768.       b.style.display = 'block',
  2769.       c = b.getBoundingClientRect(),
  2770.       b.style.display = d,
  2771.       c = new a(c);
  2772.       var f = e();
  2773.       c.left += f.x,
  2774.       c.right += f.x,
  2775.       c.top += f.y,
  2776.       c.bottom += f.y
  2777.     } else c = new a(0);
  2778.     return c
  2779.   },
  2780.   g = function (a, b) {
  2781.     var c = f(a);
  2782.     if (b) {
  2783.       var d = f(b);
  2784.       c.top = d.top - d.top + b.scrollTop,
  2785.       c.bottom = c.top + c.height + b.scrollTop,
  2786.       c.left = c.left - d.left + b.scrollLeft,
  2787.       c.right = c.left + c.width + b.scrollLeft
  2788.     }
  2789.     return c
  2790.   },
  2791.   h = function () {
  2792.     var b = e(),
  2793.     c = b.y,
  2794.     d = b.x + window.innerWidth,
  2795.     f = b.y + window.innerHeight,
  2796.     g = b.x,
  2797.     h = window.innerWidth,
  2798.     i = window.innerHeight;
  2799.     return new a(c, d, f, g, h, i)
  2800.   },
  2801.   i = function (a) {
  2802.     try {
  2803.       return a.nodeType === b ? a : a.ownerDocument
  2804.     } catch (c) {
  2805.       return null
  2806.     }
  2807.   },
  2808.   j = function (a) {
  2809.     var b = i(a),
  2810.     c = void 0;
  2811.     try {
  2812.       b && (c = b.parentWindow || b.defaultView || window)
  2813.     } catch (d) {
  2814.       c = window
  2815.     }
  2816.     return c
  2817.   },
  2818.   k = function (b) {
  2819.     var c = j(b),
  2820.     d = new a(0, c.innerWidth, c.innerHeight, 0, c.innerWidth, c.innerHeight),
  2821.     f = e();
  2822.     return d.left += f.x,
  2823.     d.right += f.x,
  2824.     d.top += f.y,
  2825.     d.bottom += f.y,
  2826.     d
  2827.   },
  2828.   l = function (a) {
  2829.     var b = i(a);
  2830.     if (b) return b.documentElement || b.body
  2831.   },
  2832.   m = function (b) {
  2833.     var c = l(b) || {
  2834.     },
  2835.     d = new a;
  2836.     return d.right = d.width = c.scrollWidth || 0,
  2837.     d.bottom = d.height = c.scrollHeight || 0,
  2838.     d
  2839.   },
  2840.   n = function (a, b) {
  2841.     for (; b; ) {
  2842.       if (b === a) return !0;
  2843.       b = b.parentNode
  2844.     }
  2845.     return !1
  2846.   },
  2847.   o = function (a) {
  2848.     var b = d(a);
  2849.     return 'inline-block' === b.display || 'none' !== b['float'] || 'absolute' === b.position || 'fixed' === b.position || 'auto' !== b.width || 'auto' !== b.height
  2850.   },
  2851.   p = function (a) {
  2852.     var b = d(a),
  2853.     c = {
  2854.     };
  2855.     return 'scroll' === b.overflowX || 'auto' === b.overflowX ? c.xscroll = a.offsetWidth - a.clientWidth : c.xscroll = 0,
  2856.     'scroll' === b.overflowY || 'auto' === b.overflowY ? c.yscroll = a.offsetHeight - a.clientHeight : c.yscroll = 0,
  2857.     c.xhidden = 'hidden' === b.overflowX,
  2858.     c.yhidden = 'hidden' === b.overflowY,
  2859.     c
  2860.   },
  2861.   q = function (a) {
  2862.     var b = d(a);
  2863.     return !!(b.clip && 'auto' !== b.clip || b.clipPath && 'none' !== b.clipPath)
  2864.   };
  2865.   return {
  2866.     getParentNode: c,
  2867.     getWindow: j,
  2868.     getScroll: e,
  2869.     getRect: f,
  2870.     getRectRelativeTo: g,
  2871.     getViewportRect: h,
  2872.     getDocument: i,
  2873.     getWindowRect: k,
  2874.     getRootNode: l,
  2875.     getRootRect: m,
  2876.     getNodeStyle: d,
  2877.     isParentOf: n,
  2878.     hasLayout: o,
  2879.     getNodeOverflow: p,
  2880.     isNodeClipped: q
  2881.   }
  2882. });
  2883. var _createClass = function () {
  2884.   function a(a, b) {
  2885.     for (var c = 0; c < b.length; c++) {
  2886.       var d = b[c];
  2887.       d.enumerable = d.enumerable || !1,
  2888.       d.configurable = !0,
  2889.       'value' in d && (d.writable = !0),
  2890.       Object.defineProperty(a, d.key, d)
  2891.     }
  2892.   }
  2893.   return function (b, c, d) {
  2894.     return c && a(b.prototype, c),
  2895.     d && a(b, d),
  2896.     b
  2897.   }
  2898. }();
  2899. define('core/ads/Geom', [
  2900.   'core/ads/domUtils',
  2901.   'core/ads/safeFrameUtils'
  2902. ], function (a, b) {
  2903.   'use strict';
  2904.   var c = 1,
  2905.   d = function () {
  2906.     function d(b) {
  2907.       _classCallCheck(this, d),
  2908.       this.node = b,
  2909.       this.document = a.getDocument(b),
  2910.       this.window = a.getWindow(b),
  2911.       this.root = a.getRootNode(b),
  2912.       this.ref = this.getRefNode(b.parentNode)
  2913.     }
  2914.     return _createClass(d, [
  2915.       {
  2916.         key: 'getRefNode',
  2917.         value: function (b) {
  2918.           for (; b && b.nodeType === c; ) {
  2919.             var d = a.getNodeStyle(b);
  2920.             if (a.hasLayout(b) || 'block' === d.display || 'none' !== d.clear) {
  2921.               var e = a.getNodeOverflow(b);
  2922.               if (e.xscroll || e.yscroll || e.xhidden || e.yhidden) return b;
  2923.               if (a.isNodeClipped(b)) return b
  2924.             }
  2925.             b = b.parentNode
  2926.           }
  2927.           return this.root
  2928.         }
  2929.       },
  2930.       {
  2931.         key: 'getNodesOver',
  2932.         value: function (d, e) {
  2933.           e = e || 1;
  2934.           var f = [
  2935.           ],
  2936.           g = a.getRect(d),
  2937.           h = a.getRect(this.ref),
  2938.           i = a.getViewportRect(d);
  2939.           if (!window.document.elementFromPoint) return f;
  2940.           for (var j = {
  2941.             top: b.max([g.top,
  2942.             h.top]) - i.top,
  2943.             right: b.min([g.right,
  2944.             h.right]) - i.left,
  2945.             bottom: b.min([g.bottom,
  2946.             h.bottom]) - i.top,
  2947.             left: b.max([g.left,
  2948.             h.left]) - i.left
  2949.           }, k = (j.right - j.left) / 10, l = (j.bottom - j.top) / 10, m = j.left; m < j.right; m += k) for (var n = j.top; n < j.bottom; n += l) {
  2950.             for (var o = window.document.elementFromPoint(m, n); o && o.nodeType === c; ) {
  2951.               var p = a.getNodeStyle(o);
  2952.               if (a.hasLayout(o) || 'block' === p.display || 'none' !== p.clear) break;
  2953.               o = o.parentNode
  2954.             }
  2955.             o && o.nodeType === c && o !== this.node && o !== this.root && !a.isParentOf(o, this.node) && (f.push(o), f.length >= e && (m = j.right, n = j.bottom))
  2956.           }
  2957.           return f
  2958.         }
  2959.       },
  2960.       {
  2961.         key: 'getWindowGeom',
  2962.         value: function () {
  2963.           var a = this.window.innerHeight || 0,
  2964.           b = this.window.innerWidth || 0,
  2965.           c = this.window.screenY || this.window.screenTop || 0,
  2966.           d = c + a,
  2967.           e = this.window.screenX || this.window.screenLeft || 0,
  2968.           f = e + b;
  2969.           return {
  2970.             t: c,
  2971.             r: f,
  2972.             b: d,
  2973.             l: e,
  2974.             w: b,
  2975.             h: a
  2976.           }
  2977.         }
  2978.       },
  2979.       {
  2980.         key: 'getSelfGeom',
  2981.         value: function () {
  2982.           var c = a.getRect(this.node),
  2983.           d = a.getRect(this.ref),
  2984.           e = a.getNodeStyle(this.node),
  2985.           f = a.getWindowRect(this.node),
  2986.           g = c.width,
  2987.           h = c.height;
  2988.           this.ref !== this.root && (g = b.max([0,
  2989.           b.min([c.right,
  2990.           d.right]) - b.max([c.left,
  2991.           d.left])]), h = b.max([0,
  2992.           b.min([c.bottom,
  2993.           d.bottom]) - b.max([c.top,
  2994.           d.top])]));
  2995.           var i = b.max([0,
  2996.           b.min(c.right, f.right) - b.max([c.left,
  2997.           f.left])]),
  2998.           j = b.max([0,
  2999.           b.min([c.bottom,
  3000.           f.bottom]) - b.max([c.top,
  3001.           f.top])]),
  3002.           k = b.min([g,
  3003.           i]),
  3004.           l = b.min([h,
  3005.           j]),
  3006.           m = c.width ? k / c.width : 0,
  3007.           n = c.height ? l / c.height : 0,
  3008.           o = k * l / (c.width * c.height),
  3009.           p = 1,
  3010.           q = this.getNodesOver(this.node, p);
  3011.           if (q.length) {
  3012.             var r = a.getRect(q[0]),
  3013.             s = b.max([0,
  3014.             b.min([r.right,
  3015.             c.right]) - b.max([r.left,
  3016.             c.left])]),
  3017.             t = b.max([0,
  3018.             b.min([r.bottom,
  3019.             c.bottom]) - b.max([r.top,
  3020.             c.top])]);
  3021.             o = b.max([0,
  3022.             (k * l - s * t) / (c.width * c.height)])
  3023.           }
  3024.           var u = a.getScroll();
  3025.           return {
  3026.             t: c.top - u.y,
  3027.             r: c.right - u.x,
  3028.             b: c.bottom - u.y,
  3029.             l: c.left - u.x,
  3030.             z: e.zIndex,
  3031.             w: c.width,
  3032.             h: c.height,
  3033.             xiv: 1 === m ? '1' : Number(m).toFixed(2),
  3034.             yiv: 1 === n ? '1' : Number(n).toFixed(2),
  3035.             iv: 1 === o ? '1' : Number(o).toFixed(2)
  3036.           }
  3037.         }
  3038.       },
  3039.       {
  3040.         key: 'getExpandGeom',
  3041.         value: function () {
  3042.           var c = a.getRect(this.ref),
  3043.           d = a.getRect(this.node),
  3044.           e = a.getWindowRect(this.node),
  3045.           f = {
  3046.             top: b.max([c.top,
  3047.             e.top]),
  3048.             right: b.min([c.right,
  3049.             e.right]),
  3050.             bottom: b.min([c.bottom,
  3051.             e.bottom]),
  3052.             left: b.max([c.left,
  3053.             e.left])
  3054.           },
  3055.           g = a.getNodeOverflow(this.ref);
  3056.           return {
  3057.             t: b.max([0,
  3058.             d.top - f.top]),
  3059.             r: b.max([0,
  3060.             f.right - d.right]),
  3061.             b: b.max([0,
  3062.             f.bottom - d.bottom]),
  3063.             l: b.max([0,
  3064.             d.left - f.left]),
  3065.             xs: Boolean(g.yscroll),
  3066.             yx: Boolean(g.xscroll)
  3067.           }
  3068.         }
  3069.       },
  3070.       {
  3071.         key: 'getGeom',
  3072.         value: function () {
  3073.           return {
  3074.             win: this.getWindowGeom(),
  3075.             self: this.getSelfGeom(),
  3076.             exp: this.getExpandGeom()
  3077.           }
  3078.         }
  3079.       }
  3080.     ]),
  3081.     d
  3082.   }(),
  3083.   e = {
  3084.     get: function (a) {
  3085.       var b = new d(a);
  3086.       return b.getGeom()
  3087.     }
  3088.   };
  3089.   return e
  3090. }),
  3091. define('core/ads/ads', [
  3092.   'require',
  3093.   'core/shared/urls',
  3094.   'core/apps/WindowedApp',
  3095.   'core/host/json',
  3096.   'stance/main',
  3097.   'stance/utils',
  3098.   'core/common/kernel/WindowBase',
  3099.   'core/utils/OnceTimer',
  3100.   'core/utils/html/toHexColorString',
  3101.   'core/utils/object/extend',
  3102.   'core/utils/sandbox',
  3103.   'core/utils/url/parseQueryString',
  3104.   'core/utils/url/serialize',
  3105.   'core/utils/urls',
  3106.   'core/utils/urls',
  3107.   'core/analytics/reporting',
  3108.   'core/ads/Geom'
  3109. ], function (a) {
  3110.   'use strict';
  3111.   var b = a('core/shared/urls'),
  3112.   c = a('core/apps/WindowedApp'),
  3113.   d = a('core/host/json'),
  3114.   e = a('stance/main'),
  3115.   f = a('stance/utils'),
  3116.   g = a('core/common/kernel/WindowBase'),
  3117.   h = a('core/utils/OnceTimer'),
  3118.   i = a('core/utils/html/toHexColorString'),
  3119.   j = a('core/utils/object/extend'),
  3120.   k = a('core/utils/sandbox'),
  3121.   l = a('core/utils/url/parseQueryString'),
  3122.   m = a('core/utils/url/serialize'),
  3123.   n = a('core/utils/urls').getOrigin,
  3124.   o = a('core/utils/urls').getQuery,
  3125.   p = a('core/analytics/reporting'),
  3126.   q = a('core/ads/Geom'),
  3127.   r = c.extend({
  3128.     name: 'ads',
  3129.     origin: void 0,
  3130.     onceEvents: {
  3131.       'view:enter': function () {
  3132.         this._reportLegacy({
  3133.           verb: 'view',
  3134.           adverb: '0ms-no50perc'
  3135.         })
  3136.       },
  3137.       'view:iab': function () {
  3138.         this._reportLegacy({
  3139.           verb: 'view',
  3140.           adverb: 'iab-scroll'
  3141.         })
  3142.       }
  3143.     },
  3144.     events: {
  3145.       'frame:ready': function (a) {
  3146.         this.forumId = a.forumId,
  3147.         this._reportLegacy({
  3148.           verb: 'load',
  3149.           extra_data: a.extraData,
  3150.           advertisement_id: a.advertisement_id,
  3151.           provider: a.provider
  3152.         }),
  3153.         this.bindViewEvents(),
  3154.         this.triggerGeomUpdate()
  3155.       },
  3156.       'frame:resize': function (a) {
  3157.         this.frame.setInlineStyle('height', a.height + 'px'),
  3158.         0 === a.height ? this.trigger('ad-placement-empty') : (a.adWidth && this.frame.setInlineStyle('width', a.adWidth + 'px'), this.trigger('ad-placement-filled')),
  3159.         this.triggerGeomUpdate()
  3160.       },
  3161.       'frame:click': function () {
  3162.         this._reportOnce({
  3163.           verb: 'click'
  3164.         }, 'click')
  3165.       },
  3166.       'frame:hover': function () {
  3167.         this._reportOnce({
  3168.           verb: 'hover'
  3169.         }, 'hover')
  3170.       },
  3171.       'frame:error-provider-not-ready': function (a) {
  3172.         this._reportLegacy({
  3173.           verb: 'fail',
  3174.           object_type: 'provider',
  3175.           object_id: a.provider || this.getProvider(),
  3176.           adverb: 'provider_not_ready'
  3177.         })
  3178.       },
  3179.       'frame:error-no-height': function (a) {
  3180.         this._reportLegacy({
  3181.           verb: 'fail',
  3182.           object_type: 'provider',
  3183.           object_id: a.provider || this.getProvider(),
  3184.           adverb: 'no_height'
  3185.         })
  3186.       },
  3187.       'frame:clearSandbox': function () {
  3188.         this.frame.elem.hasAttribute('sandbox') && this.frame.elem.removeAttribute('sandbox')
  3189.       },
  3190.       'frame:$sf-init': function () {
  3191.         this.settings.isOnHostPage && (this.isSafeframe = !0)
  3192.       },
  3193.       'frame:error': function (a) {
  3194.         this.settings.isOnHostPage && this.postMessageDirect({
  3195.           event: 'error',
  3196.           data: {
  3197.             error: a
  3198.           }
  3199.         })
  3200.       }
  3201.     },
  3202.     constructor: function () {
  3203.       c.apply(this, arguments),
  3204.       this.origin = n(this.settings.adUrl),
  3205.       this._reportOnceHistory = {
  3206.       },
  3207.       this.settings.isOnHostPage && (this.detectLazyload = this.detectLazyload.bind(this), window.addEventListener('scroll', this.detectLazyload));
  3208.       var a = this.settings.adUrl.indexOf('/ads-iframe/taboola/') >= 0;
  3209.       this.settings.useSourcelessFrame = this.settings.sourcelessIframe && this.settings.isOnHostPage && (!this.settings.defaultPlacementUrl || !this.settings.adBlockEnabled) && !a
  3210.     },
  3211.     init: function () {
  3212.       if (this.settings.forum = l(o(this.settings.adUrl)).shortname, this.settings.forum) {
  3213.         var a = window.navigator && window.navigator.userAgent || window.navigator && window.navigator.vendor || window.opera,
  3214.         d = this.settings.disableAdsIos && /iP(hone|od|ad)/.test(a) || this.settings.disableAdsAndroid && /Android/.test(a),
  3215.         e = this.settings.disableAds,
  3216.         f = this.settings.isInHome || this.settings.isOnHostPage && 0 === window.location.href.indexOf(b.apps.home);
  3217.         if (!f && e && this.settings.canDisableAds || d) return void this.trigger('prevented-ad-load');
  3218.         this._reportOnce({
  3219.           verb: 'call',
  3220.           object_type: 'provider',
  3221.           object_id: this.getProvider(),
  3222.           adjective: 1
  3223.         }, 'call'),
  3224.         this.settings.sandboxAds && (this.sandbox = k.getAttribute({
  3225.           'allow-scripts': !0,
  3226.           'allow-same-origin': !0,
  3227.           'allow-forms': !0,
  3228.           'allow-popups': !0
  3229.         })),
  3230.         c.prototype.init.call(this)
  3231.       }
  3232.     },
  3233.     detectLazyload: function () {
  3234.       if (this.frame && this.settings.isOnHostPage) {
  3235.         var a = this.frame.elem.getBoundingClientRect().top,
  3236.         b = a - window.innerHeight,
  3237.         c = window.innerHeight * this.settings.lazyloadViewports;
  3238.         b < c && (this.postMessageDirect({
  3239.           event: 'lazyload'
  3240.         }), window.removeEventListener('scroll', this.detectLazyload))
  3241.       }
  3242.     },
  3243.     getProvider: function () {
  3244.       if (this._provider) return this._provider;
  3245.       var a = this.settings.adUrl.match(/provider=(\w+)/);
  3246.       return a && (this._provider = a[1]),
  3247.       this._provider
  3248.     },
  3249.     getUrl: function () {
  3250.       var a,
  3251.       b = this.settings;
  3252.       return a = 'inthreaddisqusadstxt' === b.experiment.experiment && 'active' === b.experiment.variant && 'inthread' === b.placement ? window.document.location.href : b.isOnHostPage ? b.url || window.document.location.href : b.url || b.referrer,
  3253.       m(b.adUrl, {
  3254.         anchorColor: i(b.anchorColor),
  3255.         colorScheme: b.colorScheme,
  3256.         sourceUrl: a,
  3257.         typeface: b.typeface,
  3258.         canonicalUrl: b.canonicalUrl,
  3259.         disqus_version: b.version,
  3260.         deviceWidth: b.deviceWidth,
  3261.         maxWidth: b.maxWidth
  3262.       })
  3263.     },
  3264.     triggerGeomUpdate: function () {
  3265.       if (this.frame.elem && this.isSafeframe && this.settings.isOnHostPage) {
  3266.         var a = q.get(this.frame.elem);
  3267.         this.postMessageDirect({
  3268.           event: 'geom-update',
  3269.           data: {
  3270.             geom: a
  3271.           }
  3272.         })
  3273.       }
  3274.     },
  3275.     bindViewEvents: function () {
  3276.       if (!this._viewEventsBound) {
  3277.         this._viewEventsBound = !0,
  3278.         e.bindWindowEvents(!0);
  3279.         var a = this,
  3280.         b = function (b, c) {
  3281.           a.postMessageDirect({
  3282.             event: b,
  3283.             percentViewable: c
  3284.           })
  3285.         },
  3286.         c = 1000,
  3287.         d = new h(function () {
  3288.           a.trigger('view:iab'),
  3289.           b('view:iab')
  3290.         }, c),
  3291.         g = !1;
  3292.         this.listenTo(e({
  3293.           el: this.frame.elem
  3294.         }), {
  3295.           enter: function () {
  3296.             a.trigger('view:enter'),
  3297.             b('view:enter'),
  3298.             a.triggerGeomUpdate()
  3299.           },
  3300.           exit: function () {
  3301.             b('view:exit'),
  3302.             g && (g = !1, b('view:50out'), d.clear()),
  3303.             a.triggerGeomUpdate()
  3304.           },
  3305.           visible: function (c, e) {
  3306.             var h = f.visiblePercent(e, c.offset()),
  3307.             i = 50;
  3308.             h >= i && !g ? (g = !0, b('view:50in'), d.start()) : h < i && g && (g = !1, b('view:50out'), d.clear()),
  3309.             b('view', h),
  3310.             a.triggerGeomUpdate()
  3311.           }
  3312.         })
  3313.       }
  3314.     },
  3315.     postMessageDirect: function (a) {
  3316.       this.frame.requiresWindow(function (a) {
  3317.         var b = d.stringify(j({
  3318.         }, a, {
  3319.           space: 'disqus'
  3320.         }));
  3321.         g.postMessage(this.window, b, this.origin),
  3322.         g.postMessage(this.window, 'disqus.' + a.event, this.origin)
  3323.       }) (a)
  3324.     },
  3325.     _report: function (a) {
  3326.       var b = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {
  3327.       },
  3328.       c = this.settings,
  3329.       d = b.provider || this.getProvider();
  3330.       a.forum_id = c.forumId || this.forumId;
  3331.       var e;
  3332.       e = c.placement && c.placement.indexOf('timeline') > - 1 ? 'home' : 'recommendations' === c.placement ? 'recommendations' : 'embed';
  3333.       var f = b.usePOST ? 'reportJesterPOST' : 'reportJester';
  3334.       p[f](j({
  3335.         imp: c.impressionId,
  3336.         experiment: c.experiment.experiment,
  3337.         variant: c.experiment.variant,
  3338.         service: c.experiment.service,
  3339.         area: c.placement,
  3340.         product: e,
  3341.         forum: c.forum,
  3342.         zone: 'thread',
  3343.         version: c.loaderVersion,
  3344.         page_url: c.referrer || window.document.location.href,
  3345.         page_referrer: c.hostReferrer || window.document.referrer,
  3346.         object_type: 'advertisement',
  3347.         provider: d,
  3348.         event: 'activity'
  3349.       }, a))
  3350.     },
  3351.     _reportLegacy: function (a) {
  3352.       var b = this.settings;
  3353.       this._report(j({
  3354.         ad_product_name: 'iab_display',
  3355.         ad_product_layout: 'iab_display',
  3356.         bin: 'embed:promoted_discovery:' + b.experiment.service + ':' + b.experiment.experiment + ':' + b.experiment.variant,
  3357.         object_id: a.advertisement_id ? '[' + a.advertisement_id + ']' : '',
  3358.         section: 'default'
  3359.       }, a))
  3360.     },
  3361.     _reportOnce: function (a, b) {
  3362.       this._reportOnceHistory[b] || (this._reportLegacy(a), this._reportOnceHistory[b] = !0);
  3363.     },
  3364.     getFrameSettings: function () {
  3365.       var a = c.prototype.getFrameSettings.call(this);
  3366.       return a.insertBeforeEl = this.settings.insertBeforeEl,
  3367.       a.insertAfterEl = this.settings.insertAfterEl,
  3368.       a
  3369.     }
  3370.   }),
  3371.   s = function (a) {
  3372.     return a = a || {
  3373.     },
  3374.     a.experiment || (a.experiment = {
  3375.       experiment: a.experimentName,
  3376.       variant: a.experimentVariant,
  3377.       service: a.experimentService
  3378.     }),
  3379.     new r(a)
  3380.   };
  3381.   return {
  3382.     Ads: s
  3383.   }
  3384. }),
  3385. define('core/api', [
  3386.   'jquery',
  3387.   'underscore',
  3388.   'backbone',
  3389.   'core/config',
  3390.   'core/utils'
  3391. ], function (a, b, c, d, e) {
  3392.   'use strict';
  3393.   function f(a) {
  3394.     return l.href = a,
  3395.     l.origin || l.protocol + '//' + l.hostname + (l.port ? ':' + l.port : '')
  3396.   }
  3397.   function g(a) {
  3398.     return a.replace(/^(http:)?\/\//, 'https://')
  3399.   }
  3400.   function h(c) {
  3401.     c = b.defaults(c, m),
  3402.     c.traditional = !0,
  3403.     f(window.location.href) !== f(c.url) && (c.xhrFields = {
  3404.       withCredentials: !0
  3405.     }),
  3406.     c.omitDisqusApiKey || (c.data = c.data || {
  3407.     }, window.FormData && c.data instanceof window.FormData ? c.url = e.serialize(c.url, {
  3408.       api_key: d.keys.api
  3409.     }) : c.data.api_key = d.keys.api);
  3410.     var g = c.error;
  3411.     return c.error = function (a) {
  3412.       n.trigger('error', a),
  3413.       b.isFunction(g) && g(a)
  3414.     },
  3415.     a.ajax(c)
  3416.   }
  3417.   function i(a) {
  3418.     return /(https?:)?\/\//.test(a) ? g(a) : d.urls.api + a
  3419.   }
  3420.   function j(a, c) {
  3421.     return c = c || {
  3422.     },
  3423.     c.url = i(a),
  3424.     c.omitDisqusApiKey || (c.data = b.extend(c.data || {
  3425.     }, {
  3426.       api_key: d.keys.api
  3427.     })),
  3428.     n.trigger('call', c),
  3429.     h(c).always(b.bind(this.trigger, this, 'complete', c))
  3430.   }
  3431.   var k = window.document,
  3432.   l = k.createElement('a'),
  3433.   m = {
  3434.   },
  3435.   n = {
  3436.     ERROR_CODES: {
  3437.       OBJ_NOT_FOUND: 8,
  3438.       MAX_ITEMS_REACHED: 24
  3439.     },
  3440.     ajax: h,
  3441.     call: j,
  3442.     getURL: i,
  3443.     defaults: function (a) {
  3444.       Object.keys(a).forEach(function (c) {
  3445.         var d = a[c],
  3446.         e = m[c];
  3447.         b.isObject(d) && b.isObject(e) ? b.extend(e, d) : m[c] = d
  3448.       })
  3449.     },
  3450.     headers: function (a) {
  3451.       var c = b.extend({
  3452.       }, m.headers, a);
  3453.       return m.headers = b.pick(c, Boolean),
  3454.       m.headers
  3455.     },
  3456.     makeHttps: g
  3457.   };
  3458.   return b.extend(n, c.Events),
  3459.   n
  3460. }),
  3461. define('core/mediaConfig', [
  3462.   'underscore',
  3463.   'backbone'
  3464. ], function (a, b) {
  3465.   'use strict';
  3466.   function c() {
  3467.     var b = window.document.body.offsetWidth,
  3468.     c = d,
  3469.     e = c.length;
  3470.     return a.find(c, function (a, d) {
  3471.       return d + 1 === e || Math.abs(c[d + 1] - b) > Math.abs(c[d] - b)
  3472.     })
  3473.   }
  3474.   var d = [
  3475.     320,
  3476.     480,
  3477.     600,
  3478.     800
  3479.   ],
  3480.   e = new b.Model({
  3481.     collapsed: !1,
  3482.     defaultIframeHeight: 300,
  3483.     mediaPersistedWidths: d,
  3484.     loadedThumbnailWidth: c()
  3485.   });
  3486.   return e.findClosestThumbnailSize = c,
  3487.   e
  3488. }),
  3489. define('core/mixins/appliesPublisherClasses', [
  3490.   'jquery',
  3491.   'underscore',
  3492.   'core/switches',
  3493.   'remote/config'
  3494. ], function (a, b, c, d) {
  3495.   'use strict';
  3496.   function e() {
  3497.     this._getStyleProperty = function (a) {
  3498.       var b = this.forum.get(a);
  3499.       return this.config.forceAutoStyles || 'auto' === b ? this.config[a] : b
  3500.     },
  3501.     this.getTypeface = function () {
  3502.       return this._getStyleProperty('typeface')
  3503.     },
  3504.     this.getColorScheme = function () {
  3505.       return this._getStyleProperty('colorScheme')
  3506.     },
  3507.     this.getAnchorColorScheme = function () {
  3508.       return this.config.anchorColorScheme
  3509.     },
  3510.     this.getFont = function () {
  3511.       return this.forum.get('customFont')
  3512.     },
  3513.     this.convertFontToClass = function (a) {
  3514.       return a ? a.toLowerCase().replace(/\+/g, '-') : ''
  3515.     },
  3516.     this.convertFontToStyle = function (a) {
  3517.       return a ? a.replace(/\+/g, ' ') : ''
  3518.     },
  3519.     this.isFontAllowed = function (a) {
  3520.       return !(!a || !d.lounge.font_options) && d.lounge.font_options.some(function (b) {
  3521.         return a === b.name
  3522.       })
  3523.     },
  3524.     this.downloadFont = function (a) {
  3525.       var b = window.document,
  3526.       c = b.createElement('style');
  3527.       c.type = 'text/css';
  3528.       var d = this.convertFontToClass(a.name),
  3529.       e = this.convertFontToStyle(a.name),
  3530.       f = a.category,
  3531.       g = '@import url("https://fonts.googleapis.com/css2?family=' + a.name + ':ital,wght@0,400;0,500;0,600;0,700;1,400;1,700&display=swap"); ',
  3532.       h = [
  3533.         '',
  3534.         'input',
  3535.         'select',
  3536.         'textarea'
  3537.       ].map(function (a) {
  3538.         return 'body.' + d + ' ' + a
  3539.       }).join(', ');
  3540.       g += h + ' { font-family: ' + e + ', ' + f + '; }',
  3541.       c.styleSheet ? c.styleSheet.cssText = g : c.appendChild(b.createTextNode(g));
  3542.       var i = b.head || b.getElementsByTagName('head') [0] || b.body;
  3543.       i.appendChild(c)
  3544.     },
  3545.     this.applyPublisherClasses = function () {
  3546.       var e = a('body'),
  3547.       f = this.getFont();
  3548.       !f && c.isFeatureActive('embed_refresh', {
  3549.         forum: this.forum.id
  3550.       }) && 'sans-serif' === this.getTypeface() && (f = 'Roboto');
  3551.       var g = f && b.find(d.lounge.font_options, function (a) {
  3552.         return a.name === f
  3553.       });
  3554.       g ? (this.downloadFont(g), e.addClass(this.convertFontToClass(g.name))) : 'serif' === this.getTypeface() ? e.addClass('serif') : e.addClass('sans-serif'),
  3555.       'dark' === this.getColorScheme() && e.addClass('dark'),
  3556.       c.isFeatureActive('embed_refresh', {
  3557.         forum: this.forum.id
  3558.       }) && ('dark' === this.getAnchorColorScheme() ? e.addClass('dark-anchor') : e.addClass('light-anchor'))
  3559.     }
  3560.   }
  3561.   return e
  3562. }),
  3563. define('core/templates/handlebars.partials', [
  3564.   'handlebars'
  3565. ], function (a) {
  3566.   a.registerPartial('cardGuestUser', a.template({
  3567.     1: function (a, b, c, d, e) {
  3568.       var f,
  3569.       g = null != b ? b : a.nullContext || {
  3570.       },
  3571.       h = a.lambda,
  3572.       i = a.escapeExpression;
  3573.       return '<li class="user ' + (null != (f = c['if'].call(g, null != b ? b.highlight : b, {
  3574.         name: 'if',
  3575.         hash: {
  3576.         },
  3577.         fn: a.program(2, e, 0),
  3578.         inverse: a.noop,
  3579.         data: e,
  3580.         loc: {
  3581.           start: {
  3582.             line: 2,
  3583.             column: 16
  3584.           },
  3585.           end: {
  3586.             line: 2,
  3587.             column: 49
  3588.           }
  3589.         }
  3590.       })) ? f : '') + '" data-role="guest">\n<span class="avatar ' + (null != (f = c['if'].call(g, null != b ? b.isRefreshEnabled : b, {
  3591.         name: 'if',
  3592.         hash: {
  3593.         },
  3594.         fn: a.program(4, e, 0),
  3595.         inverse: a.noop,
  3596.         data: e,
  3597.         loc: {
  3598.           start: {
  3599.             line: 3,
  3600.             column: 20
  3601.           },
  3602.           end: {
  3603.             line: 3,
  3604.             column: 66
  3605.           }
  3606.         }
  3607.       })) ? f : '') + '" title="' + i(h(null != b ? b.guestText : b, b)) + '">\n' + (null != (f = c['if'].call(g, null != b ? b.isRefreshEnabled : b, {
  3608.         name: 'if',
  3609.         hash: {
  3610.         },
  3611.         fn: a.program(6, e, 0),
  3612.         inverse: a.program(8, e, 0),
  3613.         data: e,
  3614.         loc: {
  3615.           start: {
  3616.             line: 4,
  3617.             column: 0
  3618.           },
  3619.           end: {
  3620.             line: 8,
  3621.             column: 7
  3622.           }
  3623.         }
  3624.       })) ? f : '') + '</span>\n<span class="username ' + (null != (f = c['if'].call(g, null != b ? b.isRefreshEnabled : b, {
  3625.         name: 'if',
  3626.         hash: {
  3627.         },
  3628.         fn: a.program(10, e, 0),
  3629.         inverse: a.noop,
  3630.         data: e,
  3631.         loc: {
  3632.           start: {
  3633.             line: 10,
  3634.             column: 22
  3635.           },
  3636.           end: {
  3637.             line: 10,
  3638.             column: 70
  3639.           }
  3640.         }
  3641.       })) ? f : '') + '" title="' + i(h(null != b ? b.guestText : b, b)) + '">\n' + i(h(null != b ? b.guestText : b, b)) + '\n</span>\n</li>\n'
  3642.     },
  3643.     2: function (a, b, c, d, e) {
  3644.       return 'highlight'
  3645.     },
  3646.     4: function (a, b, c, d, e) {
  3647.       return 'avatar--refresh'
  3648.     },
  3649.     6: function (a, b, c, d, e) {
  3650.       return '<div class="initials initials--small">G</div>\n'
  3651.     },
  3652.     8: function (a, b, c, d, e) {
  3653.       var f = a.escapeExpression;
  3654.       return '<img src="' + f(a.lambda(null != b ? b.guestAvatarUrl : b, b)) + '" alt="' + f(c.gettext.call(null != b ? b : a.nullContext || {
  3655.       }, 'Avatar', {
  3656.         name: 'gettext',
  3657.         hash: {
  3658.         },
  3659.         data: e,
  3660.         loc: {
  3661.           start: {
  3662.             line: 7,
  3663.             column: 35
  3664.           },
  3665.           end: {
  3666.             line: 7,
  3667.             column: 55
  3668.           }
  3669.         }
  3670.       })) + '" />\n'
  3671.     },
  3672.     10: function (a, b, c, d, e) {
  3673.       return 'username--refresh'
  3674.     },
  3675.     compiler: [
  3676.       8,
  3677.       '>= 4.3.0'
  3678.     ],
  3679.     main: function (a, b, c, d, e) {
  3680.       var f;
  3681.       return null != (f = c['if'].call(null != b ? b : a.nullContext || {
  3682.       }, null != b ? b.guestCount : b, {
  3683.         name: 'if',
  3684.         hash: {
  3685.         },
  3686.         fn: a.program(1, e, 0),
  3687.         inverse: a.noop,
  3688.         data: e,
  3689.         loc: {
  3690.           start: {
  3691.             line: 1,
  3692.             column: 0
  3693.           },
  3694.           end: {
  3695.             line: 14,
  3696.             column: 7
  3697.           }
  3698.         }
  3699.       })) ? f : ''
  3700.     },
  3701.     useData: !0
  3702.   })),
  3703.   a.registerPartial('cardGuestVoterText', a.template({
  3704.     1: function (a, b, c, d, e) {
  3705.       return ' ' + a.escapeExpression(c.gettext.call(null != b ? b : a.nullContext || {
  3706.       }, '%(guestCount)s Guest Votes', {
  3707.         name: 'gettext',
  3708.         hash: {
  3709.           guestCount: null != b ? b.guestCount : b
  3710.         },
  3711.         data: e,
  3712.         loc: {
  3713.           start: {
  3714.             line: 1,
  3715.             column: 26
  3716.           },
  3717.           end: {
  3718.             line: 1,
  3719.             column: 90
  3720.           }
  3721.         }
  3722.       })) + ' '
  3723.     },
  3724.     3: function (a, b, c, d, e) {
  3725.       return ' ' + a.escapeExpression(c.gettext.call(null != b ? b : a.nullContext || {
  3726.       }, '1 Guest Vote', {
  3727.         name: 'gettext',
  3728.         hash: {
  3729.         },
  3730.         data: e,
  3731.         loc: {
  3732.           start: {
  3733.             line: 1,
  3734.             column: 100
  3735.           },
  3736.           end: {
  3737.             line: 1,
  3738.             column: 126
  3739.           }
  3740.         }
  3741.       })) + ' '
  3742.     },
  3743.     compiler: [
  3744.       8,
  3745.       '>= 4.3.0'
  3746.     ],
  3747.     main: function (a, b, c, d, e) {
  3748.       var f,
  3749.       g = null != b ? b : a.nullContext || {
  3750.       };
  3751.       return (null != (f = c['if'].call(g, c.gt.call(g, null != b ? b.guestCount : b, 1, {
  3752.         name: 'gt',
  3753.         hash: {
  3754.         },
  3755.         data: e,
  3756.         loc: {
  3757.           start: {
  3758.             line: 1,
  3759.             column: 6
  3760.           },
  3761.           end: {
  3762.             line: 1,
  3763.             column: 23
  3764.           }
  3765.         }
  3766.       }), {
  3767.         name: 'if',
  3768.         hash: {
  3769.         },
  3770.         fn: a.program(1, e, 0),
  3771.         inverse: a.program(3, e, 0),
  3772.         data: e,
  3773.         loc: {
  3774.           start: {
  3775.             line: 1,
  3776.             column: 0
  3777.           },
  3778.           end: {
  3779.             line: 1,
  3780.             column: 134
  3781.           }
  3782.         }
  3783.       })) ? f : '') + '\n'
  3784.     },
  3785.     useData: !0
  3786.   })),
  3787.   a.registerPartial('cardOtherUserText', a.template({
  3788.     1: function (a, b, c, d, e) {
  3789.       return ' ' + a.escapeExpression(c.gettext.call(null != b ? b : a.nullContext || {
  3790.       }, '%(guestCount)s Others', {
  3791.         name: 'gettext',
  3792.         hash: {
  3793.           guestCount: null != b ? b.guestCount : b
  3794.         },
  3795.         data: e,
  3796.         loc: {
  3797.           start: {
  3798.             line: 1,
  3799.             column: 26
  3800.           },
  3801.           end: {
  3802.             line: 1,
  3803.             column: 85
  3804.           }
  3805.         }
  3806.       })) + ' '
  3807.     },
  3808.     3: function (a, b, c, d, e) {
  3809.       return ' ' + a.escapeExpression(c.gettext.call(null != b ? b : a.nullContext || {
  3810.       }, '1 Other', {
  3811.         name: 'gettext',
  3812.         hash: {
  3813.         },
  3814.         data: e,
  3815.         loc: {
  3816.           start: {
  3817.             line: 1,
  3818.             column: 95
  3819.           },
  3820.           end: {
  3821.             line: 1,
  3822.             column: 116
  3823.           }
  3824.         }
  3825.       })) + ' '
  3826.     },
  3827.     compiler: [
  3828.       8,
  3829.       '>= 4.3.0'
  3830.     ],
  3831.     main: function (a, b, c, d, e) {
  3832.       var f,
  3833.       g = null != b ? b : a.nullContext || {
  3834.       };
  3835.       return (null != (f = c['if'].call(g, c.gt.call(g, null != b ? b.guestCount : b, 1, {
  3836.         name: 'gt',
  3837.         hash: {
  3838.         },
  3839.         data: e,
  3840.         loc: {
  3841.           start: {
  3842.             line: 1,
  3843.             column: 6
  3844.           },
  3845.           end: {
  3846.             line: 1,
  3847.             column: 23
  3848.           }
  3849.         }
  3850.       }), {
  3851.         name: 'if',
  3852.         hash: {
  3853.         },
  3854.         fn: a.program(1, e, 0),
  3855.         inverse: a.program(3, e, 0),
  3856.         data: e,
  3857.         loc: {
  3858.           start: {
  3859.             line: 1,
  3860.             column: 0
  3861.           },
  3862.           end: {
  3863.             line: 1,
  3864.             column: 124
  3865.           }
  3866.         }
  3867.       })) ? f : '') + '\n'
  3868.     },
  3869.     useData: !0
  3870.   })),
  3871.   a.registerPartial('cardUser', a.template({
  3872.     1: function (a, b, c, d, e) {
  3873.       return 'highlight'
  3874.     },
  3875.     3: function (a, b, c, d, e) {
  3876.       return 'data-action="profile"'
  3877.     },
  3878.     5: function (a, b, c, d, e) {
  3879.       var f,
  3880.       g = null != b ? b : a.nullContext || {
  3881.       };
  3882.       return '<span class="avatar ' + (null != (f = c['if'].call(g, null != b ? b.isRefreshEnabled : b, {
  3883.         name: 'if',
  3884.         hash: {
  3885.         },
  3886.         fn: a.program(6, e, 0),
  3887.         inverse: a.noop,
  3888.         data: e,
  3889.         loc: {
  3890.           start: {
  3891.             line: 4,
  3892.             column: 20
  3893.           },
  3894.           end: {
  3895.             line: 4,
  3896.             column: 66
  3897.           }
  3898.         }
  3899.       })) ? f : '') + '">\n' + (null != (f = c['if'].call(g, null != b ? b.isRefreshEnabled : b, {
  3900.         name: 'if',
  3901.         hash: {
  3902.         },
  3903.         fn: a.program(8, e, 0),
  3904.         inverse: a.program(9, e, 0),
  3905.         data: e,
  3906.         loc: {
  3907.           start: {
  3908.             line: 5,
  3909.             column: 0
  3910.           },
  3911.           end: {
  3912.             line: 13,
  3913.             column: 7
  3914.           }
  3915.         }
  3916.       })) ? f : '') + '</span>\n<span class="username ' + (null != (f = c['if'].call(g, null != b ? b.isRefreshEnabled : b, {
  3917.         name: 'if',
  3918.         hash: {
  3919.         },
  3920.         fn: a.program(13, e, 0),
  3921.         inverse: a.noop,
  3922.         data: e,
  3923.         loc: {
  3924.           start: {
  3925.             line: 15,
  3926.             column: 22
  3927.           },
  3928.           end: {
  3929.             line: 15,
  3930.             column: 70
  3931.           }
  3932.         }
  3933.       })) ? f : '') + '">\n' + a.escapeExpression(a.lambda(null != b ? b.name : b, b)) + '\n</span>\n'
  3934.     },
  3935.     6: function (a, b, c, d, e) {
  3936.       return 'avatar--refresh'
  3937.     },
  3938.     8: function (a, b, c, d, e) {
  3939.       var f;
  3940.       return null != (f = c['if'].call(null != b ? b : a.nullContext || {
  3941.       }, null != (f = null != b ? b.avatar : b) ? f.isCustom : f, {
  3942.         name: 'if',
  3943.         hash: {
  3944.         },
  3945.         fn: a.program(9, e, 0),
  3946.         inverse: a.program(11, e, 0),
  3947.         data: e,
  3948.         loc: {
  3949.           start: {
  3950.             line: 6,
  3951.             column: 0
  3952.           },
  3953.           end: {
  3954.             line: 10,
  3955.             column: 7
  3956.           }
  3957.         }
  3958.       })) ? f : ''
  3959.     },
  3960.     9: function (a, b, c, d, e) {
  3961.       var f,
  3962.       g = a.escapeExpression;
  3963.       return '<img src="' + g(a.lambda(null != (f = null != b ? b.avatar : b) ? f.cache : f, b)) + '" alt="' + g(c.gettext.call(null != b ? b : a.nullContext || {
  3964.       }, 'Avatar', {
  3965.         name: 'gettext',
  3966.         hash: {
  3967.         },
  3968.         data: e,
  3969.         loc: {
  3970.           start: {
  3971.             line: 7,
  3972.             column: 33
  3973.           },
  3974.           end: {
  3975.             line: 7,
  3976.             column: 53
  3977.           }
  3978.         }
  3979.       })) + '" />\n'
  3980.     },
  3981.     11: function (a, b, c, d, e) {
  3982.       return '<div class="initials initials--small">' + a.escapeExpression(a.lambda(null != b ? b.initials : b, b)) + '</div>\n'
  3983.     },
  3984.     13: function (a, b, c, d, e) {
  3985.       return 'username--refresh'
  3986.     },
  3987.     15: function (a, b, c, d, e) {
  3988.       var f,
  3989.       g = null != b ? b : a.nullContext || {
  3990.       },
  3991.       h = a.lambda,
  3992.       i = a.escapeExpression;
  3993.       return '<a class="avatar ' + (null != (f = c['if'].call(g, null != b ? b.isRefreshEnabled : b, {
  3994.         name: 'if',
  3995.         hash: {
  3996.         },
  3997.         fn: a.program(6, e, 0),
  3998.         inverse: a.noop,
  3999.         data: e,
  4000.         loc: {
  4001.           start: {
  4002.             line: 19,
  4003.             column: 17
  4004.           },
  4005.           end: {
  4006.             line: 19,
  4007.             column: 63
  4008.           }
  4009.         }
  4010.       })) ? f : '') + '" href="' + i(h(null != b ? b.profileUrl : b, b)) + '" title="' + i(h(null != b ? b.name : b, b)) + '" target="_blank" rel="noopener noreferrer">\n' + (null != (f = c['if'].call(g, null != b ? b.isRefreshEnabled : b, {
  4011.         name: 'if',
  4012.         hash: {
  4013.         },
  4014.         fn: a.program(8, e, 0),
  4015.         inverse: a.program(9, e, 0),
  4016.         data: e,
  4017.         loc: {
  4018.           start: {
  4019.             line: 20,
  4020.             column: 0
  4021.           },
  4022.           end: {
  4023.             line: 28,
  4024.             column: 7
  4025.           }
  4026.         }
  4027.       })) ? f : '') + '</a>\n<a class="username ' + (null != (f = c['if'].call(g, null != b ? b.isRefreshEnabled : b, {
  4028.         name: 'if',
  4029.         hash: {
  4030.         },
  4031.         fn: a.program(13, e, 0),
  4032.         inverse: a.noop,
  4033.         data: e,
  4034.         loc: {
  4035.           start: {
  4036.             line: 30,
  4037.             column: 19
  4038.           },
  4039.           end: {
  4040.             line: 30,
  4041.             column: 67
  4042.           }
  4043.         }
  4044.       })) ? f : '') + '" href="' + i(h(null != b ? b.profileUrl : b, b)) + '" title="' + i(h(null != b ? b.name : b, b)) + '" target="_blank" rel="noopener noreferrer">\n' + i(h(null != b ? b.name : b, b)) + '\n</a>\n'
  4045.     },
  4046.     compiler: [
  4047.       8,
  4048.       '>= 4.3.0'
  4049.     ],
  4050.     main: function (a, b, c, d, e) {
  4051.       var f,
  4052.       g = null != b ? b : a.nullContext || {
  4053.       };
  4054.       return '<li class="user ' + (null != (f = c['if'].call(g, null != b ? b.highlight : b, {
  4055.         name: 'if',
  4056.         hash: {
  4057.         },
  4058.         fn: a.program(1, e, 0),
  4059.         inverse: a.noop,
  4060.         data: e,
  4061.         loc: {
  4062.           start: {
  4063.             line: 1,
  4064.             column: 16
  4065.           },
  4066.           end: {
  4067.             line: 1,
  4068.             column: 49
  4069.           }
  4070.         }
  4071.       })) ? f : '') + '" ' + (null != (f = c.unless.call(g, c['switch'].call(g, 'sso_less_branding', {
  4072.         name: 'switch',
  4073.         hash: {
  4074.           forum: null != b ? b.forumId : b
  4075.         },
  4076.         data: e,
  4077.         loc: {
  4078.           start: {
  4079.             line: 1,
  4080.             column: 61
  4081.           },
  4082.           end: {
  4083.             line: 1,
  4084.             column: 103
  4085.           }
  4086.         }
  4087.       }), {
  4088.         name: 'unless',
  4089.         hash: {
  4090.         },
  4091.         fn: a.program(3, e, 0),
  4092.         inverse: a.noop,
  4093.         data: e,
  4094.         loc: {
  4095.           start: {
  4096.             line: 1,
  4097.             column: 51
  4098.           },
  4099.           end: {
  4100.             line: 1,
  4101.             column: 137
  4102.           }
  4103.         }
  4104.       })) ? f : '') + ' data-username="' + a.escapeExpression(a.lambda(null != b ? b.username : b, b)) + '">\n' + (null != (f = c.if_all.call(g, c['switch'].call(g, 'sso_less_branding', {
  4105.         name: 'switch',
  4106.         hash: {
  4107.           forum: null != b ? b.forumId : b
  4108.         },
  4109.         data: e,
  4110.         loc: {
  4111.           start: {
  4112.             line: 3,
  4113.             column: 10
  4114.           },
  4115.           end: {
  4116.             line: 3,
  4117.             column: 52
  4118.           }
  4119.         }
  4120.       }), c.ne.call(g, null != b ? b.isSSOProfileUrl : b, !0, {
  4121.         name: 'ne',
  4122.         hash: {
  4123.         },
  4124.         data: e,
  4125.         loc: {
  4126.           start: {
  4127.             line: 3,
  4128.             column: 53
  4129.           },
  4130.           end: {
  4131.             line: 3,
  4132.             column: 78
  4133.           }
  4134.         }
  4135.       }), {
  4136.         name: 'if_all',
  4137.         hash: {
  4138.         },
  4139.         fn: a.program(5, e, 0),
  4140.         inverse: a.program(15, e, 0),
  4141.         data: e,
  4142.         loc: {
  4143.           start: {
  4144.             line: 3,
  4145.             column: 0
  4146.           },
  4147.           end: {
  4148.             line: 33,
  4149.             column: 11
  4150.           }
  4151.         }
  4152.       })) ? f : '') + '</li>\n'
  4153.     },
  4154.     useData: !0
  4155.   })),
  4156.   a.registerPartial('carouselArrowLeft', a.template({
  4157.     compiler: [
  4158.       8,
  4159.       '>= 4.3.0'
  4160.     ],
  4161.     main: function (a, b, c, d, e) {
  4162.       return '<button class="carousel-control carousel-control__previous"><span class="icon icon-right-bracket icon-flipped"></span></button>\n'
  4163.     },
  4164.     useData: !0
  4165.   })),
  4166.   a.registerPartial('carouselArrowRight', a.template({
  4167.     compiler: [
  4168.       8,
  4169.       '>= 4.3.0'
  4170.     ],
  4171.     main: function (a, b, c, d, e) {
  4172.       return '<button class="carousel-control carousel-control__next"><span class="icon icon-right-bracket"></span></button>\n'
  4173.     },
  4174.     useData: !0
  4175.   })),
  4176.   a.registerPartial('channelsHeader', a.template({
  4177.     compiler: [
  4178.       8,
  4179.       '>= 4.3.0'
  4180.     ],
  4181.     main: function (a, b, c, d, e) {
  4182.       var f = null != b ? b : a.nullContext || {
  4183.       },
  4184.       g = a.escapeExpression;
  4185.       return '<div class="channel-homepage-cover">\n<div class="channel-homepage-cover--header">\n<div class="align-inline spacing-top">\n<div class="module-header__icon icon-colorful spacing-right">\n<svg class="icon-discover" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" x="0px" y="0px" viewBox="0 0 18 18" enable-background="new 0 0 18 18" xml:space="preserve" width="26" height="26"><rect x="14" width="4" height="4" class="dot"/><rect x="14" y="7" width="4" height="4" class="dot"/><rect x="14" y="14" width="4" height="4" class="dot"/><rect x="7" width="4" height="4" class="dot"/><rect x="7" y="7" width="4" height="4" class="dot"/><rect x="7" y="14" width="4" height="4" class="dot"/><rect width="4" height="4" class="dot"/><rect y="7" width="4" height="4" class="dot"/><rect y="14" width="4" height="4" class="dot"/></g></svg>\n</div>\n<div class="module-header__title">\n<h1 class="text-larger text-darker">' + g(c.gettext.call(f, 'Channels', {
  4186.         name: 'gettext',
  4187.         hash: {
  4188.         },
  4189.         data: e,
  4190.         loc: {
  4191.           start: {
  4192.             line: 8,
  4193.             column: 36
  4194.           },
  4195.           end: {
  4196.             line: 8,
  4197.             column: 58
  4198.           }
  4199.         }
  4200.       })) + '</h1>\n</div>\n</div>\n<p class="text-medium text-gray spacing-bottom-narrow">' + g(c.gettext.call(f, 'Places to start your own discussions.', {
  4201.         name: 'gettext',
  4202.         hash: {
  4203.         },
  4204.         data: e,
  4205.         loc: {
  4206.           start: {
  4207.             line: 11,
  4208.             column: 55
  4209.           },
  4210.           end: {
  4211.             line: 11,
  4212.             column: 106
  4213.           }
  4214.         }
  4215.       })) + '</p>\n</div>\n<div class="metadata-hidden visible-lg spacing-left-small">\n<button\nclass="button button-fill--brand"\ntitle=' + g(c.gettext.call(f, 'Info', {
  4216.         name: 'gettext',
  4217.         hash: {
  4218.         },
  4219.         data: e,
  4220.         loc: {
  4221.           start: {
  4222.             line: 16,
  4223.             column: 6
  4224.           },
  4225.           end: {
  4226.             line: 16,
  4227.             column: 24
  4228.           }
  4229.         }
  4230.       })) + '\ndata-action="show-metadata">\n' + g(c.gettext.call(f, 'About', {
  4231.         name: 'gettext',
  4232.         hash: {
  4233.         },
  4234.         data: e,
  4235.         loc: {
  4236.           start: {
  4237.             line: 18,
  4238.             column: 0
  4239.           },
  4240.           end: {
  4241.             line: 18,
  4242.             column: 19
  4243.           }
  4244.         }
  4245.       })) + '\n</button>\n</div>\n</div>\n<div class="metadata-visible channels-metadata-visible">\n<button\nclass="spacing-top-small link-gray-darker pull-left channels-hide-metadata"\ntitle=' + g(c.gettext.call(f, 'Feed', {
  4246.         name: 'gettext',
  4247.         hash: {
  4248.         },
  4249.         data: e,
  4250.         loc: {
  4251.           start: {
  4252.             line: 25,
  4253.             column: 6
  4254.           },
  4255.           end: {
  4256.             line: 25,
  4257.             column: 24
  4258.           }
  4259.         }
  4260.       })) + '\ndata-action="hide-metadata">\n<span class="icon icon-left-bracket text-large icon__position"></span>\n</button>\n<h1 class="text-largest text-center">' + g(c.gettext.call(f, 'About Channels', {
  4261.         name: 'gettext',
  4262.         hash: {
  4263.         },
  4264.         data: e,
  4265.         loc: {
  4266.           start: {
  4267.             line: 29,
  4268.             column: 37
  4269.           },
  4270.           end: {
  4271.             line: 29,
  4272.             column: 65
  4273.           }
  4274.         }
  4275.       })) + '</h1>\n</div>\n'
  4276.     },
  4277.     useData: !0
  4278.   })),
  4279.   a.registerPartial('genericFollowButton', a.template({
  4280.     1: function (a, b, c, d, e) {
  4281.       return ' active'
  4282.     },
  4283.     3: function (a, b, c, d, e) {
  4284.       var f;
  4285.       return null != (f = c.unless.call(null != b ? b : a.nullContext || {
  4286.       }, null != b ? b.isFollowing : b, {
  4287.         name: 'unless',
  4288.         hash: {
  4289.         },
  4290.         fn: a.program(4, e, 0),
  4291.         inverse: a.noop,
  4292.         data: e,
  4293.         loc: {
  4294.           start: {
  4295.             line: 1,
  4296.             column: 85
  4297.           },
  4298.           end: {
  4299.             line: 1,
  4300.             column: 127
  4301.           }
  4302.         }
  4303.       })) ? f : ''
  4304.     },
  4305.     4: function (a, b, c, d, e) {
  4306.       return 'disabled'
  4307.     },
  4308.     compiler: [
  4309.       8,
  4310.       '>= 4.3.0'
  4311.     ],
  4312.     main: function (a, b, c, d, e) {
  4313.       var f,
  4314.       g = null != b ? b : a.nullContext || {
  4315.       },
  4316.       h = a.escapeExpression;
  4317.       return '<button class="button btn-follow' + (null != (f = c['if'].call(g, null != b ? b.isFollowing : b, {
  4318.         name: 'if',
  4319.         hash: {
  4320.         },
  4321.         fn: a.program(1, e, 0),
  4322.         inverse: a.noop,
  4323.         data: e,
  4324.         loc: {
  4325.           start: {
  4326.             line: 1,
  4327.             column: 32
  4328.           },
  4329.           end: {
  4330.             line: 1,
  4331.             column: 65
  4332.           }
  4333.         }
  4334.       })) ? f : '') + '" ' + (null != (f = c['if'].call(g, null != b ? b.isBlocking : b, {
  4335.         name: 'if',
  4336.         hash: {
  4337.         },
  4338.         fn: a.program(3, e, 0),
  4339.         inverse: a.noop,
  4340.         data: e,
  4341.         loc: {
  4342.           start: {
  4343.             line: 1,
  4344.             column: 67
  4345.           },
  4346.           end: {
  4347.             line: 1,
  4348.             column: 134
  4349.           }
  4350.         }
  4351.       })) ? f : '') + ' data-action="toggle-follow">\n<span class="symbol-default"><span class="icon-plus"></span></span><span class="text-default">' + h(c.gettext.call(g, 'Follow', {
  4352.         name: 'gettext',
  4353.         hash: {
  4354.         },
  4355.         data: e,
  4356.         loc: {
  4357.           start: {
  4358.             line: 3,
  4359.             column: 94
  4360.           },
  4361.           end: {
  4362.             line: 3,
  4363.             column: 114
  4364.           }
  4365.         }
  4366.       })) + '</span><span class="symbol-following"><span class="icon-checkmark"></span></span><span class="text-following">' + h(c.gettext.call(g, 'Following', {
  4367.         name: 'gettext',
  4368.         hash: {
  4369.         },
  4370.         data: e,
  4371.         loc: {
  4372.           start: {
  4373.             line: 3,
  4374.             column: 224
  4375.           },
  4376.           end: {
  4377.             line: 3,
  4378.             column: 247
  4379.           }
  4380.         }
  4381.       })) + '</span>\n</button>\n'
  4382.     },
  4383.     useData: !0
  4384.   }))
  4385. }),
  4386. define('core/extensions/helpers/eq', [
  4387. ], function () {
  4388.   'use strict';
  4389.   return function (a, b) {
  4390.     return a === b
  4391.   }
  4392. }),
  4393. define('core/extensions/helpers/ne', [
  4394. ], function () {
  4395.   'use strict';
  4396.   return function (a, b) {
  4397.     return a !== b
  4398.   }
  4399. }),
  4400. define('core/extensions/helpers/gt', [
  4401. ], function () {
  4402.   'use strict';
  4403.   return function (a, b) {
  4404.     return a > b
  4405.   }
  4406. }),
  4407. define('core/extensions/helpers/lt', [
  4408. ], function () {
  4409.   'use strict';
  4410.   return function (a, b) {
  4411.     return a < b
  4412.   }
  4413. }),
  4414. define('core/extensions/helpers/ge', [
  4415. ], function () {
  4416.   'use strict';
  4417.   return function (a, b) {
  4418.     return a >= b
  4419.   }
  4420. }),
  4421. define('core/extensions/helpers/le', [
  4422. ], function () {
  4423.   'use strict';
  4424.   return function (a, b) {
  4425.     return a <= b
  4426.   }
  4427. }),
  4428. define('core/extensions/helpers/typeof', [
  4429. ], function () {
  4430.   'use strict';
  4431.   return function (a, b) {
  4432.     return typeof a === b
  4433.   }
  4434. }),
  4435. define('core/extensions/helpers/notNull', [
  4436. ], function () {
  4437.   'use strict';
  4438.   return function (a) {
  4439.     return null !== a
  4440.   }
  4441. }),
  4442. define('core/extensions/helpers/any', [
  4443. ], function () {
  4444.   'use strict';
  4445.   return function () {
  4446.     for (var a = arguments.length, b = 0; b < a - 1; b++) if (arguments[b]) return arguments[b]
  4447.   }
  4448. }),
  4449. define('core/extensions/helpers/if_any', [
  4450. ], function () {
  4451.   'use strict';
  4452.   return function () {
  4453.     for (var a = arguments.length, b = arguments[a - 1], c = 0; c < a - 1; c++) if (arguments[c]) return b.fn(this);
  4454.     return b.inverse(this)
  4455.   }
  4456. }),
  4457. define('core/extensions/helpers/if_all', [
  4458. ], function () {
  4459.   'use strict';
  4460.   return function () {
  4461.     for (var a = arguments.length, b = arguments[a - 1], c = 0; c < a - 1; c++) if (!arguments[c]) return b.inverse(this);
  4462.     return b.fn(this)
  4463.   }
  4464. }),
  4465. define('core/extensions/helpers/switch', [
  4466.   'core/switches',
  4467.   'core/utils/object/extend'
  4468. ], function (a, b) {
  4469.   'use strict';
  4470.   return function (c, d) {
  4471.     return a.isFeatureActive(c, b({
  4472.     }, d.hash))
  4473.   }
  4474. }),
  4475. define('core/extensions/helpers/partial', [
  4476.   'handlebars'
  4477. ], function (a) {
  4478.   'use strict';
  4479.   return function (b, c) {
  4480.     a.registerPartial(b, c.fn)
  4481.   }
  4482. }),
  4483. define('core/extensions/helpers/getPartial', [
  4484.   'handlebars'
  4485. ], function (a) {
  4486.   'use strict';
  4487.   return function (b, c, d) {
  4488.     return 'undefined' == typeof d && (d = c, c = this, a.Utils.extend(c, d.hash)),
  4489.     new a.SafeString(a.partials[b](c, d))
  4490.   }
  4491. }),
  4492. define('core/extensions/helpers/gettext', [
  4493.   'handlebars',
  4494.   'core/strings'
  4495. ], function (a, b) {
  4496.   'use strict';
  4497.   return function () {
  4498.     var c,
  4499.     d,
  4500.     e,
  4501.     f,
  4502.     g = arguments.length,
  4503.     h = arguments[g - 1],
  4504.     i = h.hash,
  4505.     j = arguments[0],
  4506.     k = a.partials;
  4507.     j = a.Utils.escapeExpression(b.get(j));
  4508.     for (e in i) i.hasOwnProperty(e) && (d = new RegExp('%\\((' + e + ')\\)s', 'gm'), c = i[e], f = c && c.executePartial, f && (c = k[c.partial].call(this, c.context, h)), void 0 === c || null === c || 'number' == typeof c && isNaN(c) ? c = '' : f || (c = a.Utils.escapeExpression(c)), j = j.replace(d, c.toString()));
  4509.     return new a.SafeString(j)
  4510.   }
  4511. }),
  4512. define('core/utils/object/get', [
  4513. ], function () {
  4514.   'use strict';
  4515.   return function (a, b, c) {
  4516.     for (var d = 0, e = b.length; a && d < e; ) a = a[b[d]],
  4517.     d += 1;
  4518.     return d < e || void 0 === a ? c : a
  4519.   }
  4520. }),
  4521. define('core/extensions/helpers/urlfor', [
  4522.   'core/config/urls',
  4523.   'core/utils/object/get'
  4524. ], function (a, b) {
  4525.   'use strict';
  4526.   return function (c) {
  4527.     return b(a, c.split('.'))
  4528.   }
  4529. }),
  4530. define('core/extensions/helpers/html', [
  4531.   'handlebars'
  4532. ], function (a) {
  4533.   'use strict';
  4534.   return function (b) {
  4535.     return new a.SafeString(b || '')
  4536.   }
  4537. }),
  4538. define('core/extensions/helpers/with', [
  4539. ], function () {
  4540.   'use strict';
  4541.   return function () {
  4542.     var a = arguments.length,
  4543.     b = arguments[a - 1],
  4544.     c = arguments[0];
  4545.     return 3 === a ? (c = {
  4546.     }, c[arguments[0]] = arguments[1]) : '_window_' === c && (c = window),
  4547.     b.fn(c)
  4548.   }
  4549. }),
  4550. define('core/extensions/helpers/each', [
  4551.   'handlebars'
  4552. ], function (a) {
  4553.   'use strict';
  4554.   return function (b, c) {
  4555.     var d,
  4556.     e,
  4557.     f,
  4558.     g = c.fn,
  4559.     h = c.inverse,
  4560.     i = 0,
  4561.     j = '';
  4562.     if (c.data && (d = a.createFrame(c.data)), b && 'object' == typeof b) if ('[object Array]' === Object.prototype.toString.call(b)) for (f = b.length; i < f; i++) d && (d.index = i, d.length = b.length),
  4563.     j += g(b[i], {
  4564.       data: d
  4565.     });
  4566.      else for (e in b) b.hasOwnProperty(e) && (d && (d.key = e), j += g(b[e], {
  4567.       data: d
  4568.     }), i += 1);
  4569.     return 0 === i && (j = h(this)),
  4570.     j
  4571.   }
  4572. }),
  4573. define('core/extensions/helpers/log', [
  4574. ], function () {
  4575.   'use strict';
  4576.   return function (a) {
  4577.     console.log(a, this)
  4578.   }
  4579. }),
  4580. define('core/extensions/helpers/debug', [
  4581. ], function () {
  4582.   'use strict';
  4583.   return function () {
  4584.   }
  4585. }),
  4586. define('core/extensions/helpers/geturl', [
  4587. ], function () {
  4588.   'use strict';
  4589.   return window.geturl || function (a) {
  4590.     return a
  4591.   }
  4592. }),
  4593. define('core/extensions/helpers/tag', [
  4594.   'handlebars'
  4595. ], function (a) {
  4596.   'use strict';
  4597.   return function (b, c) {
  4598.     var d = [
  4599.       '<' + b
  4600.     ],
  4601.     e = c.hash.text;
  4602.     delete c.hash.text;
  4603.     for (var f in c.hash) c.hash.hasOwnProperty(f) && d.push(' ' + f + '="' + a.escapeExpression(c.hash[f]) + '"');
  4604.     return d.push('>' + a.escapeExpression(e) + '</' + b + '>'),
  4605.     new a.SafeString(d.join(''))
  4606.   }
  4607. }),
  4608. define('core/extensions/helpers/now', [
  4609.   'moment'
  4610. ], function (a) {
  4611.   'use strict';
  4612.   return function (b) {
  4613.     return a().format(b)
  4614.   }
  4615. }),
  4616. define('core/extensions/helpers/ternary', [
  4617. ], function () {
  4618.   'use strict';
  4619.   return function (a, b, c) {
  4620.     return a ? b : c
  4621.   }
  4622. }),
  4623. define('core/extensions/handlebars.helpers', [
  4624.   'require',
  4625.   'handlebars',
  4626.   './helpers/eq',
  4627.   './helpers/ne',
  4628.   './helpers/gt',
  4629.   './helpers/lt',
  4630.   './helpers/ge',
  4631.   './helpers/le',
  4632.   './helpers/typeof',
  4633.   './helpers/notNull',
  4634.   './helpers/any',
  4635.   './helpers/if_any',
  4636.   './helpers/if_all',
  4637.   './helpers/switch',
  4638.   './helpers/partial',
  4639.   './helpers/getPartial',
  4640.   './helpers/gettext',
  4641.   './helpers/urlfor',
  4642.   './helpers/html',
  4643.   './helpers/with',
  4644.   './helpers/each',
  4645.   './helpers/log',
  4646.   './helpers/debug',
  4647.   './helpers/geturl',
  4648.   './helpers/tag',
  4649.   './helpers/now',
  4650.   './helpers/ternary'
  4651. ], function (a) {
  4652.   'use strict';
  4653.   var b = a('handlebars');
  4654.   return b.registerHelper('eq', a('./helpers/eq')),
  4655.   b.registerHelper('ne', a('./helpers/ne')),
  4656.   b.registerHelper('gt', a('./helpers/gt')),
  4657.   b.registerHelper('lt', a('./helpers/lt')),
  4658.   b.registerHelper('ge', a('./helpers/ge')),
  4659.   b.registerHelper('le', a('./helpers/le')),
  4660.   b.registerHelper('typeof', a('./helpers/typeof')),
  4661.   b.registerHelper('notNull', a('./helpers/notNull')),
  4662.   b.registerHelper('any', a('./helpers/any')),
  4663.   b.registerHelper('if_any', a('./helpers/if_any')),
  4664.   b.registerHelper('if_all', a('./helpers/if_all')),
  4665.   b.registerHelper('switch', a('./helpers/switch')),
  4666.   b.registerHelper('partial', a('./helpers/partial')),
  4667.   b.registerHelper('getPartial', a('./helpers/getPartial')),
  4668.   b.registerHelper('gettext', a('./helpers/gettext')),
  4669.   b.registerHelper('urlfor', a('./helpers/urlfor')),
  4670.   b.registerHelper('html', a('./helpers/html')),
  4671.   b.registerHelper('with', a('./helpers/with')),
  4672.   b.registerHelper('each', a('./helpers/each')),
  4673.   b.registerHelper('log', a('./helpers/log')),
  4674.   b.registerHelper('debug', a('./helpers/debug')),
  4675.   b.registerHelper('geturl', a('./helpers/geturl')),
  4676.   b.registerHelper('tag', a('./helpers/tag')),
  4677.   b.registerHelper('now', a('./helpers/now')),
  4678.   b.registerHelper('ternary', a('./helpers/ternary')),
  4679.   b
  4680. }),
  4681. define('core/templates/alert', [
  4682.   'handlebars',
  4683.   'core/templates/handlebars.partials',
  4684.   'core/extensions/handlebars.helpers'
  4685. ], function (a) {
  4686.   return a.template({
  4687.     1: function (a, b, c, d, e) {
  4688.       return '<span class="icon icon-' + a.escapeExpression(a.lambda(null != b ? b.iconType : b, b)) + '"></span>\n'
  4689.     },
  4690.     3: function (a, b, c, d, e) {
  4691.       var f;
  4692.       return (null != (f = a.lambda(null != b ? b.message : b, b)) ? f : '') + '\n'
  4693.     },
  4694.     5: function (a, b, c, d, e) {
  4695.       return a.escapeExpression(a.lambda(null != b ? b.message : b, b)) + '\n'
  4696.     },
  4697.     compiler: [
  4698.       8,
  4699.       '>= 4.3.0'
  4700.     ],
  4701.     main: function (a, b, c, d, e) {
  4702.       var f,
  4703.       g = null != b ? b : a.nullContext || {
  4704.       };
  4705.       return '<a class="close" data-action="dismiss" title="' + a.escapeExpression(c.gettext.call(g, 'Dismiss', {
  4706.         name: 'gettext',
  4707.         hash: {
  4708.         },
  4709.         data: e,
  4710.         loc: {
  4711.           start: {
  4712.             line: 1,
  4713.             column: 46
  4714.           },
  4715.           end: {
  4716.             line: 1,
  4717.             column: 67
  4718.           }
  4719.         }
  4720.       })) + '">×</a>\n<span>\n' + (null != (f = c['if'].call(g, null != b ? b.icon : b, {
  4721.         name: 'if',
  4722.         hash: {
  4723.         },
  4724.         fn: a.program(1, e, 0),
  4725.         inverse: a.noop,
  4726.         data: e,
  4727.         loc: {
  4728.           start: {
  4729.             line: 3,
  4730.             column: 0
  4731.           },
  4732.           end: {
  4733.             line: 5,
  4734.             column: 7
  4735.           }
  4736.         }
  4737.       })) ? f : '') + (null != (f = c['if'].call(g, null != b ? b.safe : b, {
  4738.         name: 'if',
  4739.         hash: {
  4740.         },
  4741.         fn: a.program(3, e, 0),
  4742.         inverse: a.program(5, e, 0),
  4743.         data: e,
  4744.         loc: {
  4745.           start: {
  4746.             line: 6,
  4747.             column: 0
  4748.           },
  4749.           end: {
  4750.             line: 10,
  4751.             column: 7
  4752.           }
  4753.         }
  4754.       })) ? f : '') + '</span>\n'
  4755.     },
  4756.     useData: !0
  4757.   })
  4758. }),
  4759. define('core/views/AlertView', [
  4760.   'backbone',
  4761.   'core/templates/alert'
  4762. ], function (a, b) {
  4763.   'use strict';
  4764.   var c = a.View.extend({
  4765.     defaultClassName: 'alert',
  4766.     events: {
  4767.       'click [data-action=dismiss]': 'dismiss'
  4768.     },
  4769.     initialize: function (a) {
  4770.       this.options = a,
  4771.       this.message = a.message,
  4772.       this.safe = a.safe,
  4773.       this.type = a.type,
  4774.       this.className = a.className || this.defaultClassName
  4775.     },
  4776.     render: function () {
  4777.       var a = this.$el;
  4778.       return a.html(b({
  4779.         message: this.message,
  4780.         safe: this.safe,
  4781.         icon: Boolean(this.type),
  4782.         iconType: 'error' === this.type || 'warn' === this.type ? 'warning' : this.type
  4783.       })),
  4784.       a.attr('class', this.className),
  4785.       this.type && a.addClass(this.type),
  4786.       this
  4787.     },
  4788.     dismiss: function (a) {
  4789.       a && a.preventDefault && a.preventDefault(),
  4790.       this.remove(),
  4791.       this.trigger('dismiss')
  4792.     }
  4793.   });
  4794.   return c
  4795. }),
  4796. define('core/mixins/withAlert', [
  4797.   'underscore',
  4798.   'core/views/AlertView'
  4799. ], function (a, b) {
  4800.   'use strict';
  4801.   var c = {
  4802.     alert: function (c, d) {
  4803.       a.isObject(d) || (d = {
  4804.       });
  4805.       var e = d.target || this._alertSelector;
  4806.       this.dismissAlert();
  4807.       var f = this._alert = new b(a.extend({
  4808.         message: c
  4809.       }, d));
  4810.       if (this.listenToOnce(this._alert, 'dismiss', function () {
  4811.         this._alert = null
  4812.       }), f.render(), e) {
  4813.         var g = this.$el.find(e);
  4814.         g.length ? g.prepend(f.el) : this.listenToOnce(this, 'threadView:render', function () {
  4815.           return this.alert(c, d)
  4816.         })
  4817.       } else this.el.parentNode && this.el.parentNode.insertBefore(f.el, this.el);
  4818.       return f
  4819.     },
  4820.     dismissAlert: function (a) {
  4821.       this._alert && (a && !a(this._alert) || (this.stopListening(this._alert), this._alert.dismiss(), this._alert = null))
  4822.     },
  4823.     getAlert: function () {
  4824.       return this._alert || null
  4825.     },
  4826.     setAlertSelector: function (a) {
  4827.       this._alertSelector = a
  4828.     }
  4829.   },
  4830.   d = function () {
  4831.     return a.extend(this, c)
  4832.   };
  4833.   return d
  4834. }),
  4835. define('core/models/ThreadVote', [
  4836.   'backbone'
  4837. ], function (a) {
  4838.   'use strict';
  4839.   var b = a.Model.extend({
  4840.     defaults: {
  4841.       score: 0
  4842.     }
  4843.   });
  4844.   return b
  4845. }),
  4846. define('core/models/Vote', [
  4847.   'backbone'
  4848. ], function (a) {
  4849.   'use strict';
  4850.   var b = a.Model.extend({
  4851.     defaults: {
  4852.       score: 0
  4853.     }
  4854.   });
  4855.   return b
  4856. }),
  4857. define('core/constants/voteConstants', [
  4858.   'exports'
  4859. ], function (a) {
  4860.   'use strict';
  4861.   a.VOTING_TYPES = {
  4862.     DETAILED: 0,
  4863.     DOWNVOTE_LIMITED: 1,
  4864.     DOWNVOTE_DISABLED: 2,
  4865.     DISABLED: 3
  4866.   },
  4867.   a.DEFAULT_VOTING_TYPE = a.VOTING_TYPES.DETAILED
  4868. }),
  4869. define('core/time', [
  4870. ], function () {
  4871.   'use strict';
  4872.   function a(a) {
  4873.     return a.indexOf('+') >= 0 ? a : a + '+00:00'
  4874.   }
  4875.   var b = 'YYYY-MM-DDTHH:mm:ssZ';
  4876.   return {
  4877.     ISO_8601: b,
  4878.     assureTzOffset: a
  4879.   }
  4880. }),
  4881. define('core/models/BaseUser', [
  4882.   'backbone',
  4883.   'core/config'
  4884. ], function (a, b) {
  4885.   'use strict';
  4886.   var c = a.Model.extend({
  4887.     defaults: {
  4888.       about: null,
  4889.       avatar: {
  4890.         cache: b.urls.avatar.generic,
  4891.         permalink: b.urls.avatar.generic
  4892.       },
  4893.       connections: {
  4894.       },
  4895.       badges: [
  4896.       ],
  4897.       email: null,
  4898.       isAnonymous: !0,
  4899.       isFollowedBy: null,
  4900.       isFollowing: null,
  4901.       joinedAt: null,
  4902.       name: null,
  4903.       profileUrl: null,
  4904.       url: null,
  4905.       username: null,
  4906.       numPosts: null,
  4907.       numFollowing: null,
  4908.       numForumsFollowing: null,
  4909.       numFollowers: null,
  4910.       numLikesReceived: null,
  4911.       isFlagged: null
  4912.     },
  4913.     hasValidAvatar: function (a) {
  4914.       var b = a ? a.avatar : this.get('avatar');
  4915.       return b && b.cache
  4916.     },
  4917.     isAnonymous: function () {
  4918.       return !this.get('id')
  4919.     },
  4920.     isRegistered: function () {
  4921.       return !this.isAnonymous()
  4922.     },
  4923.     validate: function (a) {
  4924.       if (!this.hasValidAvatar(a)) return 'None of the avatar related properties can be null, undefined or empty on User models.'
  4925.     },
  4926.     toJSON: function () {
  4927.       var b = a.Model.prototype.toJSON.apply(this, arguments);
  4928.       return b.thread = {
  4929.       },
  4930.       this.hasValidAvatar() || (b.avatar = this.defaults.avatar),
  4931.       b.isRegistered = this.isRegistered(),
  4932.       b
  4933.     }
  4934.   });
  4935.   return c
  4936. }),
  4937. define('core/models/User', [
  4938.   'jquery',
  4939.   'underscore',
  4940.   'moment',
  4941.   'core/config',
  4942.   'core/time',
  4943.   'core/utils',
  4944.   'core/strings',
  4945.   'core/switches',
  4946.   'core/api',
  4947.   'core/models/BaseUser'
  4948. ], function (a, b, c, d, e, f, g, h, i, j) {
  4949.   'use strict';
  4950.   function k(a, b, c) {
  4951.     a[b] = a[b] || [
  4952.     ],
  4953.     a[b].push(c)
  4954.   }
  4955.   var l = g.get,
  4956.   m = j.extend({
  4957.     url: i.getURL('users/details'),
  4958.     validate: function (c) {
  4959.       var d = {
  4960.       };
  4961.       if (c.display_name && (c.display_name = a.trim(c.display_name)), c.display_name || k(d, 'display_name', l('Please enter your name.')), c.email || k(d, 'email', l('Please enter your email address.')), f.validateEmail(c.email) || k(d, 'email', l('Invalid email address.')), this.isNew() && (c.password ? c.password.length < m.MIN_PASSWORD_LEN && k(d, 'password', l('Password must have at least 6 characters.')) : k(d, 'password', l('Please enter a password.'))), c.name && (c.name.length < m.MIN_NAME_LEN && k(d, 'name', g.interpolate(l('Name must have at least %(minLength)s characters.'), {
  4962.         minLength: m.MIN_NAME_LEN
  4963.       })), c.name.length > m.MAX_NAME_LEN && k(d, 'name', g.interpolate(l('Name must have less than %(maxLength)s characters.'), {
  4964.         maxLength: m.MAX_NAME_LEN
  4965.       }))), c.location && c.location.length > m.MAX_LOCATION_LEN && k(d, 'location', g.interpolate(l('Location must have less than %(maxLength)s characters.'), {
  4966.         maxLength: m.MAX_LOCATION_LEN
  4967.       })), c.url && (c.url.length > m.MAX_URL_LEN && k(d, 'url', g.interpolate(l('Site must have less than %(maxLength)s characters.'), {
  4968.         maxLength: m.MAX_URL_LEN
  4969.       })), f.isUrl(c.url) || k(d, 'url', l('Please enter a valid site.'))), !b.isEmpty(d)) return d
  4970.     },
  4971.     prepareFetchOptions: function (a) {
  4972.       a = a ? b.clone(a) : {
  4973.       };
  4974.       var c = {
  4975.       };
  4976.       return this.get('id') ? c.user = this.get('id') : this.get('username') && (c.user = 'username:' + this.get('username')),
  4977.       b.extend(c, a.data),
  4978.       a.data = c,
  4979.       a
  4980.     },
  4981.     fetch: function (a) {
  4982.       return a = this.prepareFetchOptions(a),
  4983.       j.prototype.fetch.call(this, a)
  4984.     },
  4985.     parse: function (a) {
  4986.       var b = a.response || a;
  4987.       return b = this.handleBadgesUpdate(b)
  4988.     },
  4989.     register: function (a) {
  4990.       var c = this;
  4991.       return a = a || {
  4992.       },
  4993.       i.call('internal/users/register.json', {
  4994.         data: b.extend(this.toRegisterJSON(), {
  4995.           gRecaptchaResponse: a.gRecaptchaResponse
  4996.         }),
  4997.         method: 'POST',
  4998.         success: function (d) {
  4999.           i.call('users/acceptTerms', {
  5000.             method: 'POST'
  5001.           }),
  5002.           c.set(b.extend({
  5003.           }, d.response, {
  5004.             hasAcceptedGdprTerms: !0
  5005.           })),
  5006.           a.success && a.success(d)
  5007.         },
  5008.         error: a.error
  5009.       })
  5010.     },
  5011.     saveAvatar: function (a) {
  5012.       var b = new window.FormData;
  5013.       return b.append('avatar_file', a),
  5014.       b.append('api_key', d.keys.api),
  5015.       i.call('internal/users/updateAvatar.json', {
  5016.         method: 'post',
  5017.         data: b,
  5018.         cache: !1,
  5019.         contentType: !1,
  5020.         processData: !1
  5021.       })
  5022.     },
  5023.     saveProfile: function () {
  5024.       return i.call('users/updateProfile.json', {
  5025.         method: 'POST',
  5026.         data: {
  5027.           name: this.get('name'),
  5028.           about: this.get('about'),
  5029.           location: this.get('location'),
  5030.           url: this.get('url')
  5031.         }
  5032.       })
  5033.     },
  5034.     toRegisterJSON: function () {
  5035.       return b.pick(this.toJSON(), 'display_name', 'email', 'password')
  5036.     },
  5037.     isSession: function (a) {
  5038.       return a.user.id && a.user.id === this.id
  5039.     },
  5040.     isEditable: function (a) {
  5041.       return this.isSession(a) && !this.get('remote')
  5042.     },
  5043.     toJSON: function (a) {
  5044.       a = a || {
  5045.       };
  5046.       var b = j.prototype.toJSON.call(this),
  5047.       c = this.collection && this.collection.thread;
  5048.       return b.thread.canModerate = Boolean(c && c.isModerator(this)),
  5049.       b.thread.isOP = Boolean(c && c.isOP(this)),
  5050.       a.session && (b.isSession = this.isSession(a.session), b.isEditable = this.isEditable(a.session)),
  5051.       b
  5052.     },
  5053.     _changeFollowState: function (a) {
  5054.       this.set({
  5055.         isFollowing: a,
  5056.         numFollowers: Math.max(0, this.get('numFollowers') + (a ? 1 : - 1))
  5057.       });
  5058.       var b = 'users/' + (a ? 'follow' : 'unfollow'),
  5059.       c = this;
  5060.       return i.call(b + '.json', {
  5061.         data: {
  5062.           target: this.get('id')
  5063.         },
  5064.         method: 'POST',
  5065.         success: function (a) {
  5066.           c.trigger('sync', c, a, {
  5067.           })
  5068.         }
  5069.       })
  5070.     },
  5071.     follow: function () {
  5072.       return this._changeFollowState(!0)
  5073.     },
  5074.     unfollow: function () {
  5075.       return this._changeFollowState(!1)
  5076.     },
  5077.     _changeBlockState: function (a) {
  5078.       var b = 'users/block/' + (a ? 'create' : 'delete'),
  5079.       c = this;
  5080.       return i.call(b + '.json', {
  5081.         data: {
  5082.           user: this.get('id')
  5083.         },
  5084.         method: 'POST',
  5085.         success: function (a) {
  5086.           c.set(a.response)
  5087.         }
  5088.       })
  5089.     },
  5090.     block: function () {
  5091.       return this._changeBlockState(!0)
  5092.     },
  5093.     unblock: function () {
  5094.       return this._changeBlockState(!1)
  5095.     },
  5096.     report: function (a) {
  5097.       var b = this;
  5098.       return i.call('users/report.json', {
  5099.         data: {
  5100.           reason: a,
  5101.           user: this.get('id')
  5102.         },
  5103.         method: 'POST',
  5104.         success: function () {
  5105.           b.set('isFlagged', !0)
  5106.         }
  5107.       })
  5108.     },
  5109.     toggleFollowState: function () {
  5110.       return this._changeFollowState(!this.get('isFollowing'))
  5111.     },
  5112.     registeredLessThan: function (a, b) {
  5113.       var d = e.assureTzOffset(this.get('joinedAt')),
  5114.       f = c().subtract(a, b);
  5115.       return c(d).isAfter(f)
  5116.     },
  5117.     registeredToday: function () {
  5118.       return this.registeredLessThan(1, 'day')
  5119.     },
  5120.     registeredThisWeek: function () {
  5121.       return this.registeredLessThan(1, 'week')
  5122.     },
  5123.     shouldHomeOnboard: function () {
  5124.       return !this.get('homeOnboardingComplete') && !h.isFeatureActive('onboarding_without_channels')
  5125.     },
  5126.     setHomeOnboardComplete: function (a) {
  5127.       this.updateFlags({
  5128.         homeOnboardingComplete: a
  5129.       }),
  5130.       a && this.listenTo(this, 'change:homeOnboardingComplete', b.bind(this.set, this, 'homeOnboardingComplete', a, {
  5131.         silent: !0
  5132.       }))
  5133.     },
  5134.     handleBadgesUpdate: function (a) {
  5135.       if (this.collection && this.collection.thread && this.collection.thread.forum && this.collection.thread.forum.get('badges')) {
  5136.         var b = this.collection.thread.forum.get('badges');
  5137.         a.badges = a.badges ? a.badges.filter(function (a) {
  5138.           return b[a.id]
  5139.         }) : [
  5140.         ]
  5141.       }
  5142.       return a
  5143.     },
  5144.     updateFlags: function (a) {
  5145.       return this.set(a),
  5146.       i.call('internal/users/updateFlags.json', {
  5147.         data: b.mapObject(a, function (a) {
  5148.           return a ? 1 : 0
  5149.         }),
  5150.         method: 'POST'
  5151.       })
  5152.     }
  5153.   }, {
  5154.     MIN_PASSWORD_LEN: 6,
  5155.     MIN_NAME_LEN: 2,
  5156.     MAX_NAME_LEN: 30,
  5157.     MAX_LOCATION_LEN: 255,
  5158.     MAX_URL_LEN: 200
  5159.   });
  5160.   return m
  5161. }),
  5162. define('core/utils/html', [
  5163. ], function () {
  5164.   'use strict';
  5165.   var a = '...',
  5166.   b = a.length,
  5167.   c = function (a) {
  5168.     var b;
  5169.     try {
  5170.       b = (new window.DOMParser).parseFromString('<!doctype html><meta charset=utf-8><title> </title>', 'text/html')
  5171.     } catch (c) {
  5172.     }
  5173.     return b || (b = window.document.implementation.createHTMLDocument('')),
  5174.     b.body && (b.body.innerHTML = a),
  5175.     b
  5176.   };
  5177.   return {
  5178.     stripTags: function (a) {
  5179.       var b = c(a).body;
  5180.       return (b.textContent || b.innerText).replace(/\r?\n/g, ' ')
  5181.     },
  5182.     replaceAnchors: function (a, d) {
  5183.       var e = c(a);
  5184.       return [].forEach.call(e.querySelectorAll('a'), function (a) {
  5185.         var c = a.getAttribute('href') || '',
  5186.         e = a.innerHTML,
  5187.         f = d(a);
  5188.         0 === c.indexOf(e.slice(0, - b)) ? e = f : c.length && e.indexOf(c) !== - 1 ? e = e.replace(c, f) : e += ' ' + f,
  5189.         a.insertAdjacentHTML('afterend', e),
  5190.         a.parentNode.removeChild(a)
  5191.       }),
  5192.       e.body.innerHTML.trim()
  5193.     }
  5194.   }
  5195. }),
  5196. define('core/advice', [
  5197.   'underscore'
  5198. ], function (a) {
  5199.   'use strict';
  5200.   function b() {
  5201.     a.each(['before',
  5202.     'after',
  5203.     'around'], function (a) {
  5204.       this[a] = function (b, d) {
  5205.         return 'function' == typeof this[b] ? this[b] = c[a](this[b], d) : this[b] = d,
  5206.         this[b]
  5207.       }
  5208.     }, this)
  5209.   }
  5210.   var c = {
  5211.     around: function (b, c) {
  5212.       return function () {
  5213.         var d = a.toArray(arguments);
  5214.         return c.apply(this, [
  5215.           a.bind(b, this)
  5216.         ].concat(d))
  5217.       }
  5218.     },
  5219.     before: function (b, d) {
  5220.       return c.around(b, function () {
  5221.         var b = a.toArray(arguments),
  5222.         c = b.shift();
  5223.         return d.apply(this, b),
  5224.         c.apply(this, b)
  5225.       })
  5226.     },
  5227.     after: function (b, d) {
  5228.       return c.around(b, function () {
  5229.         var b = a.toArray(arguments),
  5230.         c = b.shift(),
  5231.         e = c.apply(this, b);
  5232.         return d.apply(this, b),
  5233.         e
  5234.       })
  5235.     }
  5236.   };
  5237.   return {
  5238.     withAdvice: b
  5239.   }
  5240. }),
  5241. define('core/models/mixins', [
  5242.   'underscore',
  5243.   'moment',
  5244.   'core/time'
  5245. ], function (a, b, c) {
  5246.   'use strict';
  5247.   function d() {
  5248.     b.locale('en', {
  5249.       relativeTime: {
  5250.         future: '%s from now',
  5251.         past: '%s ago',
  5252.         s: 'a few seconds',
  5253.         ss: '%d seconds',
  5254.         m: 'a minute',
  5255.         mm: '%d minutes',
  5256.         h: 'an hour',
  5257.         hh: '%d hours',
  5258.         d: 'a day',
  5259.         dd: '%d days',
  5260.         M: 'a month',
  5261.         MM: '%d months',
  5262.         y: 'a year',
  5263.         yy: '%d years'
  5264.       }
  5265.     }),
  5266.     this._getCreatedMoment = a.memoize(function (a) {
  5267.       var d = this.get(a || 'createdAt');
  5268.       if (d) return b(c.assureTzOffset(d), c.ISO_8601)
  5269.     }, function (a) {
  5270.       return this.get(a || 'createdAt')
  5271.     }),
  5272.     this.getRelativeCreatedAt = function (a) {
  5273.       var b = this._getCreatedMoment(a);
  5274.       return b && b.from(Number(new Date))
  5275.     },
  5276.     this.getFormattedCreatedAt = a.memoize(function (a) {
  5277.       var b = this._getCreatedMoment(a);
  5278.       return b && b.format('LLLL')
  5279.     }, function (a) {
  5280.       return this.get(a || 'createdAt')
  5281.     })
  5282.   }
  5283.   return {
  5284.     withCreatedAt: d
  5285.   }
  5286. }),
  5287. define('core/collections/UserCollection', [
  5288.   'jquery',
  5289.   'backbone',
  5290.   'core/models/User'
  5291. ], function (a, b, c) {
  5292.   'use strict';
  5293.   var d = b.Collection.extend({
  5294.     model: c,
  5295.     initialize: function (a, c) {
  5296.       b.Collection.prototype.initialize.apply(this, arguments),
  5297.       this.thread = c && c.thread
  5298.     },
  5299.     fetch: function () {
  5300.       return a.when(!0)
  5301.     }
  5302.   });
  5303.   return d
  5304. }),
  5305. define('core/collections/VotersUserCollection', [
  5306.   'underscore',
  5307.   'backbone',
  5308.   'core/api',
  5309.   'core/collections/UserCollection'
  5310. ], function (a, b, c, d) {
  5311.   'use strict';
  5312.   var e = d.extend({
  5313.     LIMIT: 50,
  5314.     url: function () {
  5315.       return c.getURL('posts/listUsersVotedPost')
  5316.     },
  5317.     initialize: function (a, b) {
  5318.       this.postId = b.postId,
  5319.       this.threadId = b.threadId
  5320.     },
  5321.     fetch: function (c) {
  5322.       return b.Collection.prototype.fetch.call(this, a.extend({
  5323.         data: {
  5324.           post: this.postId,
  5325.           thread: this.threadId,
  5326.           vote: c.vote,
  5327.           limit: this.LIMIT
  5328.         }
  5329.       }, c))
  5330.     }
  5331.   });
  5332.   return e
  5333. }),
  5334. define('core/collections/VoteCollection', [
  5335.   'backbone',
  5336.   'core/models/Vote'
  5337. ], function (a, b) {
  5338.   'use strict';
  5339.   var c = a.Collection.extend({
  5340.     model: b
  5341.   });
  5342.   return c
  5343. }),
  5344. define('core/models/Post', [
  5345.   'jquery',
  5346.   'underscore',
  5347.   'backbone',
  5348.   'moment',
  5349.   'core/config/urls',
  5350.   'core/api',
  5351.   'core/strings',
  5352.   'core/time',
  5353.   'core/utils',
  5354.   'core/utils/html',
  5355.   'core/advice',
  5356.   'remote/config',
  5357.   'core/models/mixins',
  5358.   'core/collections/VotersUserCollection',
  5359.   'core/collections/VoteCollection'
  5360. ], function (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o) {
  5361.   'use strict';
  5362.   var p = 1000,
  5363.   q = 0,
  5364.   r = 25000,
  5365.   s = function () {
  5366.     var b = a.now();
  5367.     return !(b - q < p) && (q = b, !0)
  5368.   },
  5369.   t = g.get,
  5370.   u = c.Model.extend({
  5371.     votersCollectionClass: n,
  5372.     defaults: function () {
  5373.       return {
  5374.         createdAt: d().format(h.ISO_8601),
  5375.         editableUntil: d().add(l.max_post_edit_days, 'days').format(h.ISO_8601),
  5376.         dislikes: 0,
  5377.         isApproved: !0,
  5378.         isDeleted: !1,
  5379.         isEdited: !1,
  5380.         isFlagged: !1,
  5381.         isFlaggedByUser: !1,
  5382.         isHighlighted: !1,
  5383.         isRealtime: !1,
  5384.         isImmediateReply: !1,
  5385.         isMinimized: null,
  5386.         hasMedia: !1,
  5387.         message: null,
  5388.         raw_message: null,
  5389.         likes: 0,
  5390.         media: [
  5391.         ],
  5392.         parent: null,
  5393.         points: 0,
  5394.         depth: 0,
  5395.         userScore: 0,
  5396.         rating: null
  5397.       }
  5398.     },
  5399.     initialize: function () {
  5400.       this.votes = new o
  5401.     },
  5402.     messageText: function () {
  5403.       var a = this.get('message');
  5404.       return a && j.stripTags(a)
  5405.     },
  5406.     permalink: function (a, b) {
  5407.       var c = this.id;
  5408.       if (!c || !a) return '';
  5409.       var d = b !== !1 && a.currentUrl || a.permalink(),
  5410.       e = window.document.createElement('a');
  5411.       return e.href = d,
  5412.       e.hash = '#comment-' + c,
  5413.       e.href
  5414.     },
  5415.     shortLink: function () {
  5416.       return e.shortener + '/p/' + Number(this.id).toString(36)
  5417.     },
  5418.     twitterText: function (a) {
  5419.       var b = 140,
  5420.       c = this.author.get('name') || this.author.get('username');
  5421.       b -= c.length + 3,
  5422.       b -= a.length + 1,
  5423.       b -= 2;
  5424.       var d = i.niceTruncate(this.messageText(), b);
  5425.       return '"' + d + '" — ' + c
  5426.     },
  5427.     toJSON: function (a) {
  5428.       var b = c.Model.prototype.toJSON.call(this);
  5429.       if (a) {
  5430.         var d = a.session,
  5431.         e = a.thread;
  5432.         b.canBeEdited = this.canBeEdited(d, e),
  5433.         b.canBeRepliedTo = this.canBeRepliedTo(d, e),
  5434.         b.canBeShared = this.canBeShared(),
  5435.         b.permalink = this.permalink(e)
  5436.       }
  5437.       return b.shortLink = this.shortLink(),
  5438.       b.isMinimized = this.isMinimized(),
  5439.       b.plaintext = this.messageText(),
  5440.       b.relativeCreatedAt = this.getRelativeCreatedAt(),
  5441.       b.formattedCreatedAt = this.getFormattedCreatedAt(),
  5442.       b.cid = this.cid,
  5443.       b
  5444.     },
  5445.     isPublic: function () {
  5446.       return !(!this.get('isHighlighted') && !this.get('isSponsored')) || !this.get('isDeleted') && this.get('isApproved')
  5447.     },
  5448.     isMinimized: function () {
  5449.       return !this.get('isHighlighted') && (this.get('isMinimized') !== !1 && !this.get('isApproved'))
  5450.     },
  5451.     isAuthorSessionUser: function () {
  5452.       return !1
  5453.     },
  5454.     canBeEdited: function () {
  5455.       return !1
  5456.     },
  5457.     canBeRepliedTo: function () {
  5458.       return !1
  5459.     },
  5460.     canBeShared: function () {
  5461.       return !1
  5462.     },
  5463.     validateMessage: function (a) {
  5464.       if (b.isString(a.raw_message)) {
  5465.         if ('' === a.raw_message) return t('Comments can\'t be blank.');
  5466.         if (a.raw_message.length < 2) return t('Comments must have at least 2 characters.');
  5467.         if (a.raw_message.length > r) return g.interpolate(t('Comments can\'t be longer than %(maxLength)s characters (currently %(currentLength)s characters).'), {
  5468.           maxLength: r,
  5469.           currentLength: a.raw_message.length
  5470.         })
  5471.       }
  5472.     },
  5473.     validate: function (c) {
  5474.       if (!this.id && !c.id) {
  5475.         var d = this.validateMessage(c);
  5476.         return d ? d : (c.author_email && (c.author_email = a.trim(c.author_email)), c.author_name && (c.author_name = a.trim(c.author_name)), '' === c.author_email && '' === c.author_name ? t('Please sign in or enter a name and email address.') : '' === c.author_email || '' === c.author_name ? t('Please enter both a name and email address.') : b.isString(c.author_email) && !this.validateEmail(c.author_email) ? t('Invalid email address format.') : void 0)
  5477.       }
  5478.     },
  5479.     validateEmail: function (a) {
  5480.       return i.validateEmail(a)
  5481.     },
  5482.     report: function (a) {
  5483.       this.set('isFlagged', !0);
  5484.       var b = {
  5485.         post: this.id
  5486.       };
  5487.       a && (b.reason = a),
  5488.       f.call('posts/report.json', {
  5489.         data: b,
  5490.         method: 'POST'
  5491.       })
  5492.     },
  5493.     _highlight: function (a) {
  5494.       this.set('isHighlighted', a),
  5495.       f.call('posts/' + (a ? 'highlight' : 'unhighlight') + '.json', {
  5496.         data: {
  5497.           post: this.id
  5498.         },
  5499.         method: 'POST'
  5500.       })
  5501.     },
  5502.     highlight: function () {
  5503.       this._highlight(!0)
  5504.     },
  5505.     unhighlight: function () {
  5506.       this._highlight(!1)
  5507.     },
  5508.     getThreadId: function () {
  5509.       return this.get('thread')
  5510.     },
  5511.     getUpvotersUserCollection: b.memoize(function () {
  5512.       var a = this.votersCollectionClass;
  5513.       return new a((void 0), {
  5514.         postId: this.id,
  5515.         threadId: this.getThreadId()
  5516.       })
  5517.     }, function () {
  5518.       return [this.id,
  5519.       '1'].join('')
  5520.     }),
  5521.     getDownvotersUserCollection: b.memoize(function () {
  5522.       var a = this.votersCollectionClass;
  5523.       return new a((void 0), {
  5524.         postId: this.id,
  5525.         threadId: this.getThreadId()
  5526.       })
  5527.     }, function () {
  5528.       return [this.id,
  5529.       '-1'].join('')
  5530.     }),
  5531.     _vote: function (a, b, c) {
  5532.       var d = a - b,
  5533.       e = {
  5534.         likes: this.get('likes'),
  5535.         dislikes: this.get('dislikes'),
  5536.         points: this.get('points')
  5537.       };
  5538.       return 0 === d ? d : (a > 0 ? (e.likes += a, e.dislikes += b) : a < 0 ? (e.dislikes -= a, e.likes -= b) : b > 0 ? e.likes -= b : e.dislikes += b, e.points += d, c && (1 === a ? (this.getUpvotersUserCollection().add(c), this.getDownvotersUserCollection().remove(c)) : (this.getDownvotersUserCollection().add(c), this.getUpvotersUserCollection().remove(c))), this.set(e), d)
  5539.     },
  5540.     vote: function (a) {
  5541.       if (!s()) return 0;
  5542.       var b = this,
  5543.       c = b._vote(a, b.get('userScore'));
  5544.       if (0 !== c) {
  5545.         var d = b.author ? b.author.get('numLikesReceived') : 0;
  5546.         1 === b.get('userScore') ? d -= 1 : 1 === a && (d += 1),
  5547.         b.set('userScore', a),
  5548.         f.call('posts/vote.json', {
  5549.           data: {
  5550.             post: b.id,
  5551.             vote: a
  5552.           },
  5553.           method: 'POST',
  5554.           success: function (c) {
  5555.             b.votes.add({
  5556.               id: c.response.id,
  5557.               score: a
  5558.             }, {
  5559.               merge: !0
  5560.             }),
  5561.             b.author && b.author.set('numLikesReceived', d)
  5562.           }
  5563.         })
  5564.       }
  5565.     },
  5566.     _delete: function () {
  5567.       return this.set({
  5568.         isApproved: !1,
  5569.         isDeleted: !0
  5570.       }),
  5571.       f.call('posts/remove.json', {
  5572.         data: {
  5573.           post: this.id
  5574.         },
  5575.         method: 'POST'
  5576.       })
  5577.     },
  5578.     spam: function () {
  5579.       this.set({
  5580.         isApproved: !1,
  5581.         isDeleted: !0,
  5582.         isSpam: !0
  5583.       }),
  5584.       this.trigger('spam'),
  5585.       f.call('posts/spam.json', {
  5586.         data: {
  5587.           post: this.id
  5588.         },
  5589.         method: 'POST'
  5590.       })
  5591.     },
  5592.     _create: function (a, b) {
  5593.       var c = this,
  5594.       d = a.attributes,
  5595.       e = {
  5596.         thread: d.thread,
  5597.         message: d.raw_message,
  5598.         rating: d.rating
  5599.       };
  5600.       return d.parent && (e.parent = d.parent),
  5601.       d.author_name && (e.author_name = d.author_name, e.author_email = d.author_email),
  5602.       f.call('posts/create.json', {
  5603.         data: e,
  5604.         method: 'POST',
  5605.         success: function (a) {
  5606.           c.set(a.response),
  5607.           b.success && b.success()
  5608.         },
  5609.         error: b.error
  5610.       })
  5611.     },
  5612.     _update: function (a, b) {
  5613.       var c = this,
  5614.       d = a.attributes,
  5615.       e = {
  5616.         post: d.id,
  5617.         message: d.raw_message,
  5618.         rating: d.rating
  5619.       };
  5620.       return f.call('posts/update.json', {
  5621.         data: e,
  5622.         method: 'POST',
  5623.         success: function (a) {
  5624.           c.set(a.response),
  5625.           b.success && b.success()
  5626.         },
  5627.         error: b.error
  5628.       })
  5629.     },
  5630.     _read: function (a, b) {
  5631.       var c = this;
  5632.       return b = b || {
  5633.       },
  5634.       f.call('posts/details.json', {
  5635.         data: {
  5636.           post: c.id
  5637.         },
  5638.         method: 'GET',
  5639.         success: function (a) {
  5640.           b.isHighlighted && !a.response.isHighlighted && (a.response.isHighlighted = !0),
  5641.           c.set(a.response),
  5642.           b.success && b.success()
  5643.         },
  5644.         error: b.error
  5645.       })
  5646.     },
  5647.     sync: function (a, b, c) {
  5648.       c = c || {
  5649.       };
  5650.       var d = c.error;
  5651.       switch (d && (c.error = function (a) {
  5652.           var b = {
  5653.           };
  5654.           try {
  5655.             b = JSON.parse(a.responseText)
  5656.           } catch (c) {
  5657.           }
  5658.           d(b)
  5659.         }), a) {
  5660.         case 'create':
  5661.           return this._create(b, c);
  5662.         case 'update':
  5663.           return this._update(b, c);
  5664.         case 'delete':
  5665.           return this._delete();
  5666.         case 'read':
  5667.           return this._read(b, c);
  5668.         default:
  5669.           return null
  5670.       }
  5671.     },
  5672.     storageKey: function () {
  5673.       if (this.isNew() && this.getThreadId()) return ['drafts',
  5674.       'thread',
  5675.       this.getThreadId(),
  5676.       'parent',
  5677.       this.get('parent') || 0].join(':')
  5678.     }
  5679.   }, {
  5680.     formatMessage: function () {
  5681.       var a = /(?:\r\n|\r|\n){2,}/,
  5682.       c = /\r\n|\r|\n/;
  5683.       return function (d) {
  5684.         var e = b.chain(d.split(a)).compact().value(),
  5685.         f = b.map(e, function (a) {
  5686.           return b.chain(a.split(c)).compact().map(b.escape).join('<br>').value()
  5687.         }).join('</p><p>');
  5688.         return '<p>' + f + '</p>'
  5689.       }
  5690.     }()
  5691.   });
  5692.   return m.withCreatedAt.call(u.prototype),
  5693.   k.withAdvice.call(u.prototype),
  5694.   u.withAuthor = function (a) {
  5695.     this.around('set', function (c, d, e, f) {
  5696.       var g;
  5697.       if (null == d) return this;
  5698.       'object' == typeof d ? (g = d, f = e) : (g = {
  5699.       }, g[d] = e);
  5700.       var h = g.author;
  5701.       if (h) {
  5702.         if (b.isString(h) || b.isNumber(h)) {
  5703.           var i = h;
  5704.           h = {
  5705.           },
  5706.           h[a.prototype.idAttribute || 'id'] = i
  5707.         }
  5708.         var j = this.collection || this.author && this.author.collection,
  5709.         k = j && j.thread && j.thread.forum;
  5710.         if (this.author && this.author.get('badges').length && this.author.get('badges') [0].id) h.badges = this.author.get('badges');
  5711.          else if (k && k.get('badges') && h.badges) {
  5712.           var l = [
  5713.           ],
  5714.           m = h.badges || [
  5715.           ],
  5716.           n = k.get('badges');
  5717.           m.forEach(function (a) {
  5718.             n[a] && l.push(n[a])
  5719.           }),
  5720.           h.badges = l
  5721.         }
  5722.         this.author = new a(h),
  5723.         this.trigger('changeRelated:author'),
  5724.         delete g.author
  5725.       }
  5726.       return c.call(this, g, f)
  5727.     }),
  5728.     this.around('toJSON', function (a) {
  5729.       var c = a.apply(this, b.rest(arguments));
  5730.       return this.author && (c.author = this.author.toJSON()),
  5731.       c
  5732.     })
  5733.   },
  5734.   u.withMediaCollection = function (a) {
  5735.     this.after('set', function (c) {
  5736.       c && 'string' != typeof c && (b.isUndefined(c.media) || (this.media ? this.media.reset(c.media) : this.media = new a(c.media), delete c.media))
  5737.     }),
  5738.     this.around('toJSON', function (a) {
  5739.       var c = a.apply(this, b.rest(arguments));
  5740.       return this.media && (c.media = this.media.toJSON()),
  5741.       c
  5742.     })
  5743.   },
  5744.   u
  5745. }),
  5746. define('core/utils/threadRatingsHelpers', [
  5747.   'core/utils/object/get'
  5748. ], function (a) {
  5749.   'use strict';
  5750.   var b = {
  5751.   };
  5752.   return b.isThreadRatingsEnabled = function (b, c) {
  5753.     return !!(b && b.forum && c && c.id === b.forum) && Boolean(a(b, [
  5754.       'ratingsEnabled'
  5755.     ]) && a(c, [
  5756.       'settings',
  5757.       'threadRatingsEnabled'
  5758.     ]) && a(c, [
  5759.       'features',
  5760.       'threadRatings'
  5761.     ]))
  5762.   },
  5763.   b.isThreadModelRatingsEnabled = function (a) {
  5764.     if (!a || !a.forum) return !1;
  5765.     var b = a.forum.get('settings'),
  5766.     c = a.forum.get('features');
  5767.     return Boolean(a.get('ratingsEnabled') && b && b.threadRatingsEnabled && c && c.threadRatings)
  5768.   },
  5769.   b.isForumRatingsEnabled = function (b) {
  5770.     return !!b && Boolean(a(b, [
  5771.       'settings',
  5772.       'threadRatingsEnabled'
  5773.     ]) && a(b, [
  5774.       'features',
  5775.       'threadRatings'
  5776.     ]))
  5777.   },
  5778.   b.isForumModelRatingsEnabled = function (a) {
  5779.     if (!a) return !1;
  5780.     var b = a.get('settings'),
  5781.     c = a.get('features');
  5782.     return Boolean(b && b.threadRatingsEnabled && c && c.threadRatings)
  5783.   },
  5784.   b
  5785. }),
  5786. define('core/models/Thread', [
  5787.   'underscore',
  5788.   'backbone',
  5789.   'loglevel',
  5790.   'core/config/urls',
  5791.   'core/utils',
  5792.   'core/api',
  5793.   'core/config',
  5794.   'core/advice',
  5795.   'core/UniqueModel',
  5796.   'core/utils/threadRatingsHelpers',
  5797.   'core/models/User'
  5798. ], function (a, b, c, d, e, f, g, h, i, j, k) {
  5799.   'use strict';
  5800.   var l = b.Model,
  5801.   m = l.prototype,
  5802.   n = l.extend({
  5803.     defaults: {
  5804.       author: null,
  5805.       category: null,
  5806.       createdAt: null,
  5807.       forum: null,
  5808.       identifiers: [
  5809.       ],
  5810.       ipAddress: null,
  5811.       isClosed: !1,
  5812.       isDeleted: !1,
  5813.       hasStreaming: !1,
  5814.       link: null,
  5815.       message: null,
  5816.       slug: null,
  5817.       title: null,
  5818.       userSubscription: !1,
  5819.       posts: 0,
  5820.       likes: 0,
  5821.       dislikes: 0,
  5822.       userScore: 0
  5823.     },
  5824.     initialize: function (a, b) {
  5825.       b = b || {
  5826.       },
  5827.       this.moderators = b.moderators,
  5828.       this.forum = b.forum,
  5829.       this.on('change:userScore', function () {
  5830.         var a = this.get('userScore');
  5831.         a > 0 && 0 === this.get('likes') && this.set('likes', a)
  5832.       }, this)
  5833.     },
  5834.     _vote: function (a, b) {
  5835.       var c = a - b;
  5836.       return 0 === c ? c : (this.set('likes', this.get('likes') + c), c)
  5837.     },
  5838.     vote: function (a) {
  5839.       var b = this,
  5840.       c = b._vote(a, b.get('userScore'));
  5841.       0 !== c && (this.set('userScore', a), f.call('threads/vote.json', {
  5842.         data: {
  5843.           thread: this.id,
  5844.           vote: a
  5845.         },
  5846.         method: 'POST',
  5847.         success: function (a) {
  5848.           a.response.id && b.trigger('vote:success', a)
  5849.         }
  5850.       }))
  5851.     },
  5852.     fetch: function (a) {
  5853.       var b,
  5854.       d = this,
  5855.       e = d.attributes;
  5856.       a = a || {
  5857.       },
  5858.       b = e.identifier ? 'ident:' + e.identifier : 'link:' + e.url,
  5859.       f.call('threads/details.json', {
  5860.         data: {
  5861.           thread: b,
  5862.           forum: e.forum
  5863.         },
  5864.         success: function (b) {
  5865.           d.set(b.response),
  5866.           a.success && a.success()
  5867.         },
  5868.         error: function () {
  5869.           g.debug ? d.save({
  5870.           }, {
  5871.             success: a.success
  5872.           }) : c.info('Couldn\'t find thread; not creating in production.')
  5873.         }
  5874.       })
  5875.     },
  5876.     _toggleState: function (a, b) {
  5877.       b || (b = {
  5878.       });
  5879.       var c = a ? 'open.json' : 'close.json';
  5880.       return this.set('isClosed', !a),
  5881.       f.call('threads/' + c, {
  5882.         method: 'POST',
  5883.         data: {
  5884.           thread: this.id
  5885.         },
  5886.         success: b.success,
  5887.         error: b.error
  5888.       })
  5889.     },
  5890.     open: function (a) {
  5891.       return this._toggleState(!0, a)
  5892.     },
  5893.     close: function (a) {
  5894.       return this._toggleState(!1, a)
  5895.     },
  5896.     premoderate: function (b, c) {
  5897.       return this.set('validateAllPosts', b),
  5898.       f.call('threads/update', a.extend({
  5899.       }, c, {
  5900.         method: 'POST',
  5901.         data: a.extend({
  5902.           thread: this.id,
  5903.           validateAllPosts: b ? 1 : 0
  5904.         }, c && c.data)
  5905.       }))
  5906.     },
  5907.     sync: function () {
  5908.       var a = this,
  5909.       b = a.attributes;
  5910.       f.call('threads/create.json', {
  5911.         data: {
  5912.           title: b.title,
  5913.           forum: b.forum,
  5914.           identifier: b.identifier,
  5915.           url: b.url
  5916.         },
  5917.         method: 'POST',
  5918.         success: function (b) {
  5919.           a.set(b.response)
  5920.         }
  5921.       })
  5922.     },
  5923.     fetchRatings: function () {
  5924.       var a = this,
  5925.       b = {
  5926.         thread: a.id
  5927.       };
  5928.       return f.call('threads/ratingsSummary.json', {
  5929.         data: b,
  5930.         method: 'GET',
  5931.         success: function (b) {
  5932.           a.set('ratings', b.response)
  5933.         }
  5934.       })
  5935.     },
  5936.     toggleRatingsEnabled: function () {
  5937.       var a = this;
  5938.       if (j.isForumModelRatingsEnabled(a.forum)) {
  5939.         var b = a.get('ratingsEnabled'),
  5940.         c = {
  5941.           thread: a.id,
  5942.           ratingsEnabled: b ? 0 : 1
  5943.         };
  5944.         return a.set('ratingsEnabled', !b),
  5945.         f.call('threads/update.json', {
  5946.           data: c,
  5947.           method: 'POST'
  5948.         })
  5949.       }
  5950.     },
  5951.     incrementPostCount: function (a) {
  5952.       var b = this.get('posts') + a;
  5953.       this.set('posts', b > 0 ? b : 0)
  5954.     },
  5955.     isModerator: function (b) {
  5956.       var c;
  5957.       if (this.moderators) return c = b instanceof k || a.isObject(b) ? b.id : b,
  5958.       c = parseInt(c, 10),
  5959.       a(this.moderators).contains(c)
  5960.     },
  5961.     isOP: function (b) {
  5962.       var c = b instanceof k || a.isObject(b) ? b.id : b;
  5963.       return this.get('author') === c
  5964.     },
  5965.     subscribe: function (a) {
  5966.       a = a !== !1;
  5967.       var b = this.get('userSubscription');
  5968.       if (b !== a) {
  5969.         this.set('userSubscription', a);
  5970.         var c = a ? 'subscribe.json' : 'unsubscribe.json',
  5971.         d = {
  5972.           thread: this.id
  5973.         };
  5974.         return f.call('threads/' + c, {
  5975.           data: d,
  5976.           method: 'POST'
  5977.         })
  5978.       }
  5979.     },
  5980.     twitterText: function (a) {
  5981.       var b = 140 - (a.length + 1),
  5982.       c = this.get('clean_title');
  5983.       return c = e.niceTruncate(c, b)
  5984.     },
  5985.     permalink: function () {
  5986.       return this.get('url') || this.get('link') || this.currentUrl
  5987.     },
  5988.     shortLink: function () {
  5989.       return d.shortener + '/t/' + Number(this.id).toString(36)
  5990.     },
  5991.     toJSON: function () {
  5992.       var a = m.toJSON.call(this);
  5993.       return a.permalink = this.permalink(),
  5994.       a.shortLink = this.shortLink(),
  5995.       a
  5996.     },
  5997.     getDiscussionRoute: function (a) {
  5998.       var b = [
  5999.         '',
  6000.         'home',
  6001.         'discussion',
  6002.         this.forum.id,
  6003.         this.get('slug'),
  6004.         ''
  6005.       ];
  6006.       return a = a || this.forum.channel,
  6007.       a && (a = a.attributes || a, b.splice(2, 0, 'channel', a.slug), b.splice(1, 1)),
  6008.       b.join('/')
  6009.     }
  6010.   });
  6011.   return h.withAdvice.call(n.prototype),
  6012.   n.withThreadVoteCollection = function (a) {
  6013.     this.after('initialize', function () {
  6014.       this.votes = new a,
  6015.       this.on('vote:success', function (a) {
  6016.         this.votes.get(a.response.id) || this.votes.add({
  6017.           id: a.response.id,
  6018.           score: a.response.vote,
  6019.           currentUser: !0
  6020.         })
  6021.       }, this)
  6022.     })
  6023.   },
  6024.   n.withPostCollection = function (b) {
  6025.     this.after('initialize', function (c) {
  6026.       c = c || {
  6027.       },
  6028.       this.posts = new b(c.posts, {
  6029.         thread: this,
  6030.         cursor: c.postCursor,
  6031.         order: c.order,
  6032.         perPage: this.postsPerPage
  6033.       }),
  6034.       this.listenTo(this.posts, 'add reset', function (b) {
  6035.         b = b.models ? b.models : [
  6036.           b
  6037.         ],
  6038.         this.users && a.each(b, function (a) {
  6039.           this.users.get(a.author.id) || this.users.add(a.author)
  6040.         }),
  6041.         this.recalculatePostCount()
  6042.       }),
  6043.       this.listenTo(this.posts, 'change:isDeleted change:isFlagged', function (a, b) {
  6044.         b && this.incrementPostCount( - 1)
  6045.       })
  6046.     }),
  6047.     this.recalculatePostCount = function () {
  6048.       var a = this.get('posts');
  6049.       a > 50 || (a = this.posts.reduce(function (a, b) {
  6050.         return b.isPublic() ? a + 1 : a
  6051.       }, 0), this.set('posts', a))
  6052.     }
  6053.   },
  6054.   i.addType('Thread', n),
  6055.   n
  6056. }),
  6057. define('core/models/Forum', [
  6058.   'backbone',
  6059.   'core/UniqueModel',
  6060.   'core/api'
  6061. ], function (a, b, c) {
  6062.   'use strict';
  6063.   var d = a.Model.extend({
  6064.     defaults: {
  6065.       settings: {
  6066.       },
  6067.       badges: [
  6068.       ],
  6069.       followUrl: 'forums/follow',
  6070.       unfollowUrl: 'forums/unfollow',
  6071.       isFollowing: !1
  6072.     },
  6073.     initialize: function (a, b) {
  6074.       b && b.channel && (this.channel = b.channel),
  6075.       this.getFeatures(),
  6076.       this.on('change:id', this.getFeatures),
  6077.       this.on('change:id', this.getBadges)
  6078.     },
  6079.     _changeFollowingState: function (a) {
  6080.       return c.call(a, {
  6081.         method: 'POST',
  6082.         data: {
  6083.           target: this.get('id')
  6084.         }
  6085.       })
  6086.     },
  6087.     follow: function () {
  6088.       return this.set('isFollowing', !0),
  6089.       this._changeFollowingState(this.get('followUrl'))
  6090.     },
  6091.     unfollow: function () {
  6092.       return this.set('isFollowing', !1),
  6093.       this._changeFollowingState(this.get('unfollowUrl'))
  6094.     },
  6095.     toggleFollowed: function () {
  6096.       if (this.channel && this.channel.get('options').isCurationOnlyChannel) return this.channel.toggleFollowed();
  6097.       var a = this.get('isFollowing') ? this.unfollow() : this.follow();
  6098.       return this.trigger('toggled:isFollowing'),
  6099.       a
  6100.     },
  6101.     getFeatures: function () {
  6102.       var a = this;
  6103.       a.id && c.call('forums/details', {
  6104.         data: {
  6105.           forum: this.id,
  6106.           attach: 'forumFeatures'
  6107.         },
  6108.         success: function (b) {
  6109.           b && b.response && a.set('features', b.response.features)
  6110.         }
  6111.       })
  6112.     },
  6113.     getBadges: function () {
  6114.       if (this.id && this.get('badges')) {
  6115.         var a = {
  6116.         },
  6117.         b = {
  6118.         };
  6119.         b.id = this.get('pk'),
  6120.         b.url = this.get('id'),
  6121.         this.get('badges').forEach(function (c) {
  6122.           c.forum = b,
  6123.           a[c.id] = c
  6124.         }),
  6125.         this.set('badges', a)
  6126.       }
  6127.     }
  6128.   });
  6129.   return b.addType('Forum', d),
  6130.   d
  6131. }),
  6132. define('core/models/Media', [
  6133.   'underscore',
  6134.   'backbone',
  6135.   'core/api',
  6136.   'core/UniqueModel'
  6137. ], function (a, b, c, d) {
  6138.   'use strict';
  6139.   var e = b.Model.extend({
  6140.     idAttribute: 'url',
  6141.     defaults: {
  6142.       mediaType: null,
  6143.       html: '',
  6144.       htmlWidth: null,
  6145.       htmlHeight: null,
  6146.       thumbnailUrl: '',
  6147.       thumbnailWidth: null,
  6148.       thumbnailHeight: null,
  6149.       url: '',
  6150.       urlRedirect: '',
  6151.       resolvedUrl: '',
  6152.       resolvedUrlRedirect: '',
  6153.       title: '',
  6154.       description: '',
  6155.       providerName: ''
  6156.     },
  6157.     parse: function (a) {
  6158.       return a.response
  6159.     },
  6160.     sync: function (b, d, e) {
  6161.       if ('read' !== b) throw new Error('Media models do not support methods other than "read".');
  6162.       return c.call('media/details.json', a.extend({
  6163.         method: 'POST',
  6164.         data: {
  6165.           url: this.get('url'),
  6166.           forum: e.forum
  6167.         }
  6168.       }, e))
  6169.     }
  6170.   }, {
  6171.     MEDIA_TYPES: {
  6172.       IMAGE: '1',
  6173.       IMAGE_UPLOAD: '2',
  6174.       YOUTUBE_VIDEO: '3',
  6175.       WEBPAGE: '4',
  6176.       TWITTER_STATUS: '5',
  6177.       FACEBOOK_PAGE: '6',
  6178.       FACEBOOK_POST: '7',
  6179.       FACEBOOK_PHOTO: '8',
  6180.       FACEBOOK_VIDEO: '9',
  6181.       SOUNDCLOUD_SOUND: '10',
  6182.       GOOGLE_MAP: '11',
  6183.       VIMEO_VIDEO: '12',
  6184.       VINE_VIDEO: '14',
  6185.       GIF_VIDEO: '15',
  6186.       MP4_VIDEO: '16'
  6187.     },
  6188.     WEBPAGE_TYPES: [
  6189.       '4',
  6190.       '6',
  6191.       '7'
  6192.     ]
  6193.   });
  6194.   return d.addType('Media', e),
  6195.   e
  6196. }),
  6197. define('core/collections/MediaCollection', [
  6198.   'backbone',
  6199.   'core/models/Media'
  6200. ], function (a, b) {
  6201.   'use strict';
  6202.   var c = a.Collection.extend({
  6203.     model: b
  6204.   });
  6205.   return c
  6206. }),
  6207. define('common/collections/VotersUserCollection', [
  6208.   'core/collections/VotersUserCollection'
  6209. ], function (a) {
  6210.   'use strict';
  6211.   var b = a.extend({
  6212.     initialize: function (b, c) {
  6213.       a.prototype.initialize.call(this, b, c);
  6214.       var d = require('common/Session');
  6215.       this.session = d.get()
  6216.     },
  6217.     parse: function (a) {
  6218.       return this.session.get('canModerate') && a.response && a.response.forEach(function (a) {
  6219.         a.isBlocking = !1
  6220.       }),
  6221.       a.response
  6222.     }
  6223.   });
  6224.   return b
  6225. }),
  6226. define('common/models', [
  6227.   'require',
  6228.   'jquery',
  6229.   'underscore',
  6230.   'backbone',
  6231.   'modernizr',
  6232.   'core/api',
  6233.   'core/UniqueModel',
  6234.   'core/models/User',
  6235.   'core/models/Post',
  6236.   'core/models/Thread',
  6237.   'core/models/Forum',
  6238.   'core/collections/MediaCollection',
  6239.   'core/utils/object/get',
  6240.   'core/utils/url/serialize',
  6241.   'core/utils/guid',
  6242.   'common/utils',
  6243.   'core/utils',
  6244.   'common/urls',
  6245.   'core/shared/urls',
  6246.   'common/collections/VotersUserCollection',
  6247.   'backbone.uniquemodel'
  6248. ], function (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t) {
  6249.   'use strict';
  6250.   var u = k.extend({
  6251.     defaults: {
  6252.       settings: {
  6253.       }
  6254.     },
  6255.     toJSON: function () {
  6256.       return c.extend(d.Model.prototype.toJSON.apply(this, arguments), {
  6257.         homeUrl: s.apps.home + 'home/forums/' + this.id + '/'
  6258.       })
  6259.     }
  6260.   }),
  6261.   v = j.extend({
  6262.     initialize: function (b, d) {
  6263.       j.prototype.initialize.apply(this, arguments),
  6264.       d = d || {
  6265.       };
  6266.       var e = this,
  6267.       f = a('common/collections');
  6268.       e.users = new f.UserCollection(d.users, {
  6269.         thread: e
  6270.       }),
  6271.       e.forum && (e.moderatorList = new f.ModeratorCollection(null, {
  6272.         forum: e.forum.get('id')
  6273.       })),
  6274.       e.posts = new f.SubpaginatedPostCollection(d.posts, {
  6275.         thread: e,
  6276.         cursor: d.postCursor,
  6277.         order: d.order,
  6278.         perPage: q.isMobileUserAgent() ? 20 : 50
  6279.       }),
  6280.       e.votes = new f.ThreadVoteCollection,
  6281.       e.posts.on('add reset', function (a) {
  6282.         a = a.models ? a.models : [
  6283.           a
  6284.         ],
  6285.         c.each(a, function (a) {
  6286.           e.users.get(a.author.id) || e.users.add(a.author)
  6287.         }),
  6288.         e.recalculatePostCount()
  6289.       }),
  6290.       e.listenTo(e.posts, 'change:isDeleted change:isFlagged', function (a, b) {
  6291.         b && e.incrementPostCount( - 1)
  6292.       }),
  6293.       e.queue = new f.QueuedPostCollection(null, {
  6294.         thread: e
  6295.       })
  6296.     },
  6297.     recalculatePostCount: function () {
  6298.       var a = this.get('posts');
  6299.       a > 50 || (a = this.posts.buffer.reduce(function (a, b) {
  6300.         var c = b.isPublic() && (!b.get('sb') || b.isAuthorSessionUser());
  6301.         return c ? a + 1 : a
  6302.       }, 0), this.set('posts', a))
  6303.     },
  6304.     toJSON: function () {
  6305.       var a = this.get('forum'),
  6306.       b = c.isObject(a) ? a.id : a;
  6307.       return c.extend(j.prototype.toJSON.apply(this, arguments), {
  6308.         homeUrl: s.apps.home + 'home/discussions/' + b + '/' + this.get('slug') + '/'
  6309.       })
  6310.     }
  6311.   });
  6312.   j.withThreadVoteCollection.call(v.prototype, d.Collection);
  6313.   var w = i.extend({
  6314.     votersCollectionClass: t,
  6315.     initialize: function () {
  6316.       i.prototype.initialize.apply(this, arguments);
  6317.       var b = a('common/collections');
  6318.       this.usersTyping = new b.TypingUserCollection
  6319.     },
  6320.     isAuthorSessionUser: function (b) {
  6321.       var c = a('common/Session'),
  6322.       d = m(b, [
  6323.         'user',
  6324.         'id'
  6325.       ]) || c.fromCookie().id;
  6326.       return !!(d && this.author && this.author.id) && this.author.id.toString() === d.toString()
  6327.     },
  6328.     canBeEdited: function (a, b) {
  6329.       var c = this.get('editableUntil'),
  6330.       d = (new Date).toISOString();
  6331.       return !b.get('isClosed') && !this.get('isDeleted') && a.isLoggedIn() && this.isAuthorSessionUser(a) && this.get('raw_message') && !this.get('isHighlighted') && !this.get('isSponsored') && d < c
  6332.     },
  6333.     canBeRepliedTo: function (a, b) {
  6334.       return !b.get('isClosed') && a.get('canReply') && !this.get('isDeleted') && (this.get('isApproved') || b.isModerator(a.user))
  6335.     },
  6336.     canBeShared: function () {
  6337.       return !this.get('isDeleted') && !this.get('isSponsored')
  6338.     },
  6339.     getParent: function () {
  6340.       var a = this.get('parent');
  6341.       if (a) return new g(w, {
  6342.         id: String(a)
  6343.       })
  6344.     }
  6345.   }, {
  6346.     fetchContext: function (a, d, e) {
  6347.       e = e || {
  6348.       };
  6349.       var h = b.Deferred();
  6350.       return f.call('posts/getContext.json', {
  6351.         method: 'GET',
  6352.         data: {
  6353.           post: a,
  6354.           order: d.posts.buffer.order
  6355.         },
  6356.         success: function (a) {
  6357.           var b = c.filter(a.response, function (a) {
  6358.             return a.thread === d.get('id')
  6359.           });
  6360.           return b ? (c.each(b, function (a) {
  6361.             d.posts.get(a.id) && delete a.hasMore,
  6362.             a = new g(w, a),
  6363.             e.requestedByPermalink && (a.requestedByPermalink = !0),
  6364.             d.posts.add(a)
  6365.           }), void h.resolve(b)) : void h.reject()
  6366.         }
  6367.       }),
  6368.       h.promise()
  6369.     }
  6370.   });
  6371.   i.withAuthor.call(w.prototype, g.wrap(h)),
  6372.   i.withMediaCollection.call(w.prototype, l),
  6373.   g.addType('Post', w);
  6374.   var x = d.Model.extend({
  6375.     defaults: {
  6376.       user: null,
  6377.       message: null,
  6378.       parentId: null,
  6379.       immedReply: !1,
  6380.       createdAt: void 0
  6381.     },
  6382.     getVisibleParent: function (a) {
  6383.       for (var b, c = this; c.get('parentId'); ) {
  6384.         if (b = a.posts.get(c.get('parentId'))) return b;
  6385.         if (c = a.queue.get(c.get('parentId')), !c) return null
  6386.       }
  6387.       return null
  6388.     },
  6389.     toPost: function (a) {
  6390.       var b = this,
  6391.       c = a.posts.get(b.get('parentId')),
  6392.       d = c ? c.get('depth') + 1 : 0,
  6393.       e = new g(w, {
  6394.         id: b.id,
  6395.         forum: a.get('forum'),
  6396.         thread: a.id,
  6397.         message: b.get('message'),
  6398.         parent: b.get('parentId'),
  6399.         depth: d,
  6400.         createdAt: b.get('createdAt'),
  6401.         isRealtime: !0,
  6402.         media: b.get('media'),
  6403.         isImmediateReply: b.get('immedReply')
  6404.       });
  6405.       return e.author = b.get('user'),
  6406.       e
  6407.     }
  6408.   }),
  6409.   y = d.Model.extend({
  6410.     defaults: {
  6411.       user: null,
  6412.       post: null,
  6413.       thread: null,
  6414.       client_context: null,
  6415.       typing: !0
  6416.     },
  6417.     idAttribute: 'client_context',
  6418.     set: function () {
  6419.       return this.lastModified = new Date,
  6420.       d.Model.prototype.set.apply(this, arguments)
  6421.     },
  6422.     sync: function () {
  6423.       var a = this.toJSON(),
  6424.       b = n(r.realertime + '/api/typing', a);
  6425.       try {
  6426.         p.CORS.request('GET', b).send()
  6427.       } catch (c) {
  6428.       }
  6429.     }
  6430.   }, {
  6431.     make: function (a) {
  6432.       return a.client_context || (a.client_context = o.generate()),
  6433.       new g(y, a)
  6434.     }
  6435.   });
  6436.   g.addType('TypingUser', y);
  6437.   var z = h.prototype.toJSON;
  6438.   c.extend(h.prototype, {
  6439.     getFollowing: function () {
  6440.       var b = a('common/collections/profile');
  6441.       return this.following || (this.following = new b.FollowingCollection(null, {
  6442.         user: this
  6443.       }))
  6444.     },
  6445.     hasDisqusProfileUrl: function () {
  6446.       var a = z.apply(this, arguments);
  6447.       if (!a.profileUrl) return !1;
  6448.       var b = a.profileUrl.match(/^https?:\/\/([^/?#]+)(?:[/?#]|$)/i);
  6449.       return b && b.length >= 2 && ('disqus.com' === b[1] || 'dev.disqus.org:8000' === b[1])
  6450.     },
  6451.     toJSON: function () {
  6452.       var b = z.apply(this, arguments),
  6453.       c = a('common/Session'),
  6454.       d = c.get(),
  6455.       e = d && d.get('sso') && d.get('sso').profile_url;
  6456.       e && (e = String(e), 0 === e.indexOf('//') && (e = 'https:' + e), /https?:\/\//.test(e) || (e = null), /\{username\}/.test(e) && b.name || (e = null));
  6457.       var f = this.hasDisqusProfileUrl();
  6458.       return b.isSSOProfileUrl = !f || Boolean(e),
  6459.       f && e && (b.profileUrl = e.replace(/\{username\}/gi, encodeURIComponent(b.name))),
  6460.       b
  6461.     }
  6462.   }),
  6463.   g.addType('User', h);
  6464.   var A = h.extend({
  6465.     defaults: c.extend({
  6466.       numPosts: 0
  6467.     }, h.prototype.defaults)
  6468.   }),
  6469.   B = e.sessionstorage ? 'sessionStorage' : null,
  6470.   C = d.UniqueModel(h, 'User', B),
  6471.   D = d.UniqueModel(A, 'User', B),
  6472.   E = d.Model.extend({
  6473.   }),
  6474.   F = d.Model.extend({
  6475.     defaults: {
  6476.       id: '',
  6477.       title: '',
  6478.       rating: 'g',
  6479.       'default': {
  6480.         url: '',
  6481.         height: '',
  6482.         width: ''
  6483.       },
  6484.       fixedWidth200: {
  6485.         url: '',
  6486.         height: '',
  6487.         width: ''
  6488.       },
  6489.       fixedWidth100: {
  6490.         url: '',
  6491.         height: '',
  6492.         width: ''
  6493.       }
  6494.     }
  6495.   });
  6496.   return {
  6497.     Forum: u,
  6498.     Thread: v,
  6499.     Post: w,
  6500.     QueuedPost: x,
  6501.     TypingUser: y,
  6502.     User: h,
  6503.     TopUser: A,
  6504.     Switch: E,
  6505.     SyncedUser: C,
  6506.     SyncedTopUser: D,
  6507.     GifObject: F
  6508.   }
  6509. }),
  6510. define('core/models/Channel', [
  6511.   'underscore',
  6512.   'backbone',
  6513.   'core/UniqueModel',
  6514.   'core/api',
  6515.   'core/models/Forum',
  6516.   'core/strings'
  6517. ], function (a, b, c, d, e, f) {
  6518.   'use strict';
  6519.   var g = f.get,
  6520.   h = b.Model.extend({
  6521.     defaults: {
  6522.       primaryForum: {
  6523.       },
  6524.       slug: null,
  6525.       name: null,
  6526.       options: {
  6527.       },
  6528.       followUrl: 'channels/follow',
  6529.       unfollowUrl: 'channels/unfollow'
  6530.     },
  6531.     idAttribute: 'slug',
  6532.     initialize: function (a, b) {
  6533.       this.buildPrimaryForum(b),
  6534.       this.listenTo(this, 'change:primaryForum', this.updatePrimaryForum),
  6535.       this.listenTo(this, 'change:primaryCategory', this.updatePrimaryCategory)
  6536.     },
  6537.     buildPrimaryForum: function () {
  6538.       if (!this.primaryForum) {
  6539.         var a = this.get('primaryForum');
  6540.         a && (this.primaryForum = new c(e, a, {
  6541.           channel: this
  6542.         }), this.unset('primaryForum'))
  6543.       }
  6544.     },
  6545.     updatePrimaryForum: function () {
  6546.       var a = this.get('primaryForum');
  6547.       a && (this.primaryForum || this.buildPrimaryForum(), this.primaryForum.set(a), this.unset('primaryForum'))
  6548.     },
  6549.     updatePrimaryCategory: function () {
  6550.       var a = this.get('primaryCategory'),
  6551.       b = this.primaryCategory;
  6552.       null === a ? this.primaryCategory = void 0 : b ? b.set(a) : this.primaryCategory = new c(h, a),
  6553.       this.unset('primaryCategory'),
  6554.       this.trigger('changeRelated:primaryCategory')
  6555.     },
  6556.     fetch: function (c) {
  6557.       return c = c ? a.clone(c) : {
  6558.       },
  6559.       c.data = this.buildFetchData(c.data),
  6560.       b.Model.prototype.fetch.call(this, c)
  6561.     },
  6562.     buildFetchData: function (b) {
  6563.       var c = b ? a.clone(b) : {
  6564.       };
  6565.       return this.id && (c.channel = this.id),
  6566.       c
  6567.     },
  6568.     url: function (a) {
  6569.       return d.getURL(this.constructor.URLS[a] || this.constructor.URLS.read)
  6570.     },
  6571.     sync: function (c, d, e) {
  6572.       var f = d.attributes;
  6573.       e = a.extend({
  6574.         url: this.url(c),
  6575.         emulateHTTP: !0
  6576.       }, e);
  6577.       var g = {
  6578.         bannerColor: f.bannerColor,
  6579.         description: f.description,
  6580.         primaryCategory: d.primaryCategory && d.primaryCategory.get('slug') || ''
  6581.       };
  6582.       switch ('default' === e.avatarType ? g.avatar = '' : f.avatar && !a.isString(f.avatar) && (g.avatar = f.avatar), 'file' !== e.bannerType ? g.banner = '' : f.banner && !a.isString(f.banner) && (g.banner = f.banner), c) {
  6583.         case 'create':
  6584.           e.processData = !1,
  6585.           e.contentType = !1,
  6586.           g.name = f.name,
  6587.           e.data = this.toFormData(a.extend({
  6588.           }, g, e.data));
  6589.           break;
  6590.         case 'update':
  6591.           e.processData = !1,
  6592.           e.contentType = !1,
  6593.           g.channel = f.slug,
  6594.           e.data = this.toFormData(a.extend({
  6595.           }, g, e.data))
  6596.       }
  6597.       return b.sync(c, d, e)
  6598.     },
  6599.     toFormData: function (b) {
  6600.       return a.reduce(b, function (b, c, d) {
  6601.         return b.append(d, a.isString(c) ? c.trim() : c),
  6602.         b
  6603.       }, new window.FormData)
  6604.     },
  6605.     parse: function (a) {
  6606.       return a.response || a
  6607.     },
  6608.     shouldFetch: function () {
  6609.       return !this.get('name') || !this.get('dateAdded')
  6610.     },
  6611.     ensureFetched: function () {
  6612.       this.shouldFetch() && this.fetch()
  6613.     },
  6614.     validate: function (b) {
  6615.       var c = [
  6616.       ],
  6617.       d = b.name.trim();
  6618.       d.length < this.constructor.MIN_NAME_LENGTH ? c.push({
  6619.         attrName: 'name',
  6620.         message: f.interpolate(g('Name must have at least %(minLength)s characters.'), {
  6621.           minLength: this.constructor.MIN_NAME_LENGTH
  6622.         })
  6623.       }) : d.length > this.constructor.MAX_NAME_LENGTH && c.push({
  6624.         attrName: 'name',
  6625.         message: f.interpolate(g('Name must have less than %(maxLength)s characters.'), {
  6626.           maxLength: this.constructor.MAX_NAME_LENGTH
  6627.         })
  6628.       });
  6629.       var e = b.description.trim();
  6630.       if (e.length < this.constructor.MIN_DESCRIPTION_LENGTH ? c.push({
  6631.         attrName: 'description',
  6632.         message: f.interpolate(g('Description must have at least %(minLength)s characters.'), {
  6633.           minLength: this.constructor.MIN_DESCRIPTION_LENGTH
  6634.         })
  6635.       }) : e.length > this.constructor.MAX_DESCRIPTION_LENGTH && c.push({
  6636.         attrName: 'description',
  6637.         message: f.interpolate(g('Description must have less than %(maxLength)s characters.'), {
  6638.           maxLength: this.constructor.MAX_DESCRIPTION_LENGTH
  6639.         })
  6640.       }), this.constructor.BANNER_COLORS[b.bannerColor] || c.push({
  6641.         attrName: 'bannerColor',
  6642.         message: f.interpolate(g('Banner color must be one of ' + a.invoke(a.values(this.constructor.BANNER_COLORS), 'toLowerCase').join(', ')) + '.')
  6643.       }), !a.isEmpty(c)) return c
  6644.     },
  6645.     _changeFollowingState: function (b, c) {
  6646.       return c = c || {
  6647.       },
  6648.       c.type = 'POST',
  6649.       c.data = a.extend({
  6650.         target: this.get('slug')
  6651.       }, c.data),
  6652.       d.call(b, c)
  6653.     },
  6654.     follow: function (a) {
  6655.       return this.primaryForum.set('isFollowing', !0),
  6656.       this._changeFollowingState(this.get('followUrl'), a)
  6657.     },
  6658.     unfollow: function (a) {
  6659.       return this.primaryForum.set('isFollowing', !1),
  6660.       this._changeFollowingState(this.get('unfollowUrl'), a)
  6661.     },
  6662.     toggleFollowed: function () {
  6663.       if (this.get('options').isCurationOnlyChannel && this.primaryForum) {
  6664.         var a = this.primaryForum.get('isFollowing') ? this.unfollow() : this.follow();
  6665.         return this.primaryForum.trigger('toggled:isFollowing'),
  6666.         a
  6667.       }
  6668.     },
  6669.     toJSON: function () {
  6670.       var c = b.Model.prototype.toJSON.call(this);
  6671.       return a.defaults({
  6672.         primaryCategory: this.primaryCategory ? this.primaryCategory.toJSON() : {
  6673.         }
  6674.       }, c)
  6675.     }
  6676.   }, {
  6677.     URLS: {
  6678.       read: 'channels/details',
  6679.       create: 'channels/create',
  6680.       update: 'channels/update'
  6681.     },
  6682.     BANNER_COLORS: {
  6683.       gray: g('Gray'),
  6684.       blue: g('Blue'),
  6685.       green: g('Green'),
  6686.       yellow: g('Yellow'),
  6687.       orange: g('Orange'),
  6688.       red: g('Red'),
  6689.       purple: g('Purple')
  6690.     },
  6691.     MIN_NAME_LENGTH: 3,
  6692.     MAX_NAME_LENGTH: 100,
  6693.     MIN_DESCRIPTION_LENGTH: 5,
  6694.     MAX_DESCRIPTION_LENGTH: 200
  6695.   });
  6696.   return c.addType('Channel', h),
  6697.   h
  6698. }),
  6699. define('core/utils/objectExpander', [
  6700.   'underscore',
  6701.   'core/UniqueModel',
  6702.   'core/models/Channel',
  6703.   'core/models/Thread'
  6704. ], function (a, b, c, d) {
  6705.   'use strict';
  6706.   return {
  6707.     Channel: c,
  6708.     Thread: d,
  6709.     parseObject: function (b, c) {
  6710.       return a.isString(c) ? b[c] : c
  6711.     },
  6712.     buildThread: function (c, d) {
  6713.       if (d instanceof this.Thread) return d;
  6714.       if (d = this.parseObject(c, d), a.isString(d.author)) {
  6715.         var e = d.author.replace('auth.User?id=', '');
  6716.         d.author = c['auth.User?id=' + e] || e
  6717.       }
  6718.       return new b(this.Thread, d, {
  6719.         forum: this.parseObject(c, d.forum),
  6720.         author: d.author
  6721.       })
  6722.     },
  6723.     buildChannel: function (a, c) {
  6724.       return c instanceof this.Channel ? c : (c = this.parseObject(a, c), new b(this.Channel, c))
  6725.     }
  6726.   }
  6727. }),
  6728. define('core/collections/PaginatedCollection', [
  6729.   'underscore',
  6730.   'backbone'
  6731. ], function (a, b) {
  6732.   'use strict';
  6733.   var c = b.Collection.extend({
  6734.     PER_PAGE: 30,
  6735.     initialize: function (b, c) {
  6736.       this.cid = a.uniqueId('collection'),
  6737.       c = c || {
  6738.       },
  6739.       this.cursor = c.cursor || {
  6740.       }
  6741.     },
  6742.     ensureFetched: a.memoize(function () {
  6743.       return this.fetch()
  6744.     }, function () {
  6745.       return this.cid
  6746.     }),
  6747.     fetch: function (c) {
  6748.       return c = c || {
  6749.       },
  6750.       c.data = a.defaults(c.data || {
  6751.       }, {
  6752.         cursor: c.cursor || '',
  6753.         limit: c.limit || this.PER_PAGE
  6754.       }),
  6755.       b.Collection.prototype.fetch.call(this, c)
  6756.     },
  6757.     hasPrev: function () {
  6758.       return this.cursor.hasPrev
  6759.     },
  6760.     hasNext: function () {
  6761.       return this.cursor.hasNext
  6762.     },
  6763.     next: function (b) {
  6764.       return this.cursor.hasNext ? this.fetch(a.extend({
  6765.       }, b, {
  6766.         add: !0,
  6767.         remove: !0,
  6768.         cursor: this.cursor.next
  6769.       })) : void this.trigger('nodata')
  6770.     },
  6771.     prev: function (b) {
  6772.       return this.cursor.hasPrev ? this.fetch(a.extend({
  6773.       }, b, {
  6774.         add: !0,
  6775.         remove: !0,
  6776.         cursor: this.cursor.prev
  6777.       })) : void this.trigger('nodata')
  6778.     },
  6779.     more: function (b) {
  6780.       function c(a) {
  6781.         f.push(a)
  6782.       }
  6783.       var d = this;
  6784.       if (b = b || {
  6785.       }, b.post ? !b.post.attributes.hasMore : !this.cursor.hasNext) return void d.trigger('nodata');
  6786.       var e,
  6787.       f = [
  6788.       ];
  6789.       if (b.post) {
  6790.         var g = this.postCursors[b.post.id];
  6791.         e = g && g.cursor ? g.cursor.next : ''
  6792.       } else e = this.cursor.next;
  6793.       return this.on('add', c),
  6794.       this.fetch(a.extend({
  6795.       }, b, {
  6796.         add: !0,
  6797.         remove: !1,
  6798.         cursor: e,
  6799.         limit: this.PER_PAGE || this.perPage,
  6800.         success: function () {
  6801.           d.trigger('add:many', f, d, b),
  6802.           d.off('add', c),
  6803.           b.success && b.success.apply(this, arguments)
  6804.         }
  6805.       }))
  6806.     },
  6807.     parse: function (c) {
  6808.       return Array.isArray(c) && a.every(c, function (a) {
  6809.         return a instanceof b.Model
  6810.       }) ? c : (this.cursor = c.cursor || {
  6811.         hasNext: !1
  6812.       }, c.response)
  6813.     },
  6814.     getLength: function () {
  6815.       return this.length
  6816.     }
  6817.   });
  6818.   return c
  6819. }),
  6820. define('core/collections/ChannelCollection', [
  6821.   'underscore',
  6822.   'core/collections/PaginatedCollection',
  6823.   'core/UniqueModel',
  6824.   'core/api',
  6825.   'core/models/Channel',
  6826.   'core/utils/objectExpander'
  6827. ], function (a, b, c, d, e, f) {
  6828.   'use strict';
  6829.   var g = b.extend({
  6830.     url: d.getURL('channels/list'),
  6831.     model: c.boundModel(e),
  6832.     initialize: function (a, c) {
  6833.       b.prototype.initialize.call(this, a, c),
  6834.       c = c || {
  6835.       },
  6836.       this.listName = c.listName
  6837.     },
  6838.     fetch: function (c) {
  6839.       return c = c || {
  6840.       },
  6841.       this.listName && (c.data = a.extend({
  6842.         listName: this.listName
  6843.       }, c.data)),
  6844.       b.prototype.fetch.call(this, c)
  6845.     },
  6846.     parse: function (c) {
  6847.       return c = b.prototype.parse.call(this, c),
  6848.       c.items ? a.map(c.items, function (a) {
  6849.         return f.buildChannel(c.objects, a.reference)
  6850.       }) : c
  6851.     }
  6852.   });
  6853.   return g
  6854. }),
  6855. define('core/common/cached-storage', [
  6856.   'underscore',
  6857.   'core/utils/storage'
  6858. ], function (a, b) {
  6859.   'use strict';
  6860.   var c = function (a, b) {
  6861.     this.namespace = a,
  6862.     this.ttl = b || 300,
  6863.     this.cache = this.getFromStorage()
  6864.   };
  6865.   return a.extend(c.prototype, {
  6866.     getItem: function (a) {
  6867.       var b = this.cache[a];
  6868.       if (b) {
  6869.         if (!this.isExpired(b)) return b.value;
  6870.         delete this.cache[a]
  6871.       }
  6872.     },
  6873.     getCurrentTime: function () {
  6874.       return Math.floor((new Date).getTime() / 1000)
  6875.     },
  6876.     persist: function () {
  6877.       b.set(this.namespace, this.cache)
  6878.     },
  6879.     getFromStorage: function () {
  6880.       var c = b.get(this.namespace);
  6881.       return a.isObject(c) ? c : {
  6882.       }
  6883.     },
  6884.     isExpired: function (a) {
  6885.       return this.getCurrentTime() > a.expiry
  6886.     },
  6887.     setItem: function (a, b) {
  6888.       this.cache[a] = {
  6889.         value: b,
  6890.         expiry: this.getCurrentTime() + this.ttl
  6891.       },
  6892.       this.persist()
  6893.     },
  6894.     removeItem: function (a) {
  6895.       delete this.cache[a],
  6896.       this.persist()
  6897.     },
  6898.     getAll: function () {
  6899.       var b = a.chain(this.cache).map(function (a, b) {
  6900.         return this.getItem(b)
  6901.       }, this).compact().value();
  6902.       return this.persist(),
  6903.       b
  6904.     }
  6905.   }),
  6906.   c
  6907. }),
  6908. define('common/collections', [
  6909.   'underscore',
  6910.   'backbone',
  6911.   'moment',
  6912.   'core/api',
  6913.   'core/utils/objectExpander',
  6914.   'core/utils/storage',
  6915.   'core/collections/UserCollection',
  6916.   'core/collections/PaginatedCollection',
  6917.   'core/collections/ChannelCollection',
  6918.   'core/models/ThreadVote',
  6919.   'core/UniqueModel',
  6920.   'common/models',
  6921.   'core/common/cached-storage',
  6922.   'core/constants/voteConstants',
  6923.   'lounge/common'
  6924. ], function (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o) {
  6925.   'use strict';
  6926.   var p = b.Collection.extend({
  6927.     model: j
  6928.   }),
  6929.   q = h.extend({
  6930.     PER_PAGE: 50,
  6931.     model: k.wrap(l.Post),
  6932.     url: d.getURL('threads/listPostsThreaded'),
  6933.     initialize: function (a, b) {
  6934.       h.prototype.initialize.apply(this, arguments),
  6935.       b = b || {
  6936.       },
  6937.       this.thread = b.thread,
  6938.       this.setOrder(b.order)
  6939.     },
  6940.     fetch: function (b) {
  6941.       return b = b || {
  6942.       },
  6943.       a.extend(b, {
  6944.         data: {
  6945.           limit: this.PER_PAGE,
  6946.           thread: this.thread.id,
  6947.           forum: this.thread.get('forum'),
  6948.           order: this.getOrder()
  6949.         }
  6950.       }),
  6951.       h.prototype.fetch.call(this, b)
  6952.     },
  6953.     getOrder: function () {
  6954.       return this.order
  6955.     },
  6956.     setOrder: function (a) {
  6957.       'popular' === a && this.thread.forum.get('votingType') === n.VOTING_TYPES.DISABLED ? this.order = 'desc' : this.order = a
  6958.     }
  6959.   }),
  6960.   r = b.Collection.extend({
  6961.     collection: b.Collection,
  6962.     initialize: function (a, b) {
  6963.       this.lounge = o.getLounge(),
  6964.       this.thread = b.thread,
  6965.       this.perPage = b.perPage || 20,
  6966.       this.buffer = new this.collection(a, b),
  6967.       this.resetPage(),
  6968.       this.listenTo(this.buffer, 'reset', this.resetPage)
  6969.     },
  6970.     resetPage: function (c, d) {
  6971.       d = d || {
  6972.       };
  6973.       var e = a.isUndefined(d.customThreadLength) ? this.perPage : Math.min(d.customThreadLength, this.perPage),
  6974.       f = this.buffer.slice(0, e);
  6975.       return this.postCursors = {
  6976.       },
  6977.       this.fetchedReplies = 0,
  6978.       this.trigger('set:done', f),
  6979.       b.Collection.prototype.reset.call(this, f, d)
  6980.     },
  6981.     currentPage: function () {
  6982.       var a = Math.floor((this.length - this.fetchedReplies) / this.perPage);
  6983.       return (this.length - this.fetchedReplies) % this.perPage && (a += 1),
  6984.       a
  6985.     },
  6986.     setPageFor: function (a, b) {
  6987.       var c = this.buffer.get(a),
  6988.       d = this.perPage;
  6989.       c && (d = this.perPage * Math.floor(this.buffer.indexOf(c) / this.perPage + 1)),
  6990.       this.add(this.buffer.slice(0, d), b)
  6991.     },
  6992.     hasNext: function () {
  6993.       return this.buffer.length > this.length || this.buffer.hasNext()
  6994.     },
  6995.     more: function (a) {
  6996.       a = a || {
  6997.       };
  6998.       var b = this,
  6999.       c = b.length + b.perPage,
  7000.       d = a.success;
  7001.       a.success = function () {
  7002.         a.post || b.add(b.buffer.slice(0, c)),
  7003.         b.trigger('set:done', b.models),
  7004.         d && d()
  7005.       };
  7006.       var e = a.post ? b.get(a.post.id) : null;
  7007.       e && e.attributes.hasMore ? b.collection.prototype.more.call(b, a) : !e && b.buffer.length < b.length + b.perPage && b.buffer.hasNext() ? (b.add(b.buffer.slice(0, c)), b.buffer.more(a)) : a.success()
  7008.     }
  7009.   });
  7010.   a.each(['setOrder',
  7011.   'getOrder',
  7012.   'reset'], function (a) {
  7013.     r.prototype[a] = function () {
  7014.       return this.buffer[a].apply(this.buffer, arguments)
  7015.     }
  7016.   }),
  7017.   a.each(['add',
  7018.   'remove'], function (a) {
  7019.     r.prototype[a] = function () {
  7020.       return this.buffer[a].apply(this.buffer, arguments),
  7021.       b.Collection.prototype[a].apply(this, arguments)
  7022.     }
  7023.   });
  7024.   var s = r.extend({
  7025.     model: q.prototype.model,
  7026.     collection: q,
  7027.     initialize: function () {
  7028.       r.prototype.initialize.apply(this, arguments),
  7029.       this.postCursors = {
  7030.       },
  7031.       this.fetchedReplies = 0,
  7032.       this.submittedPostsCache = new m('submitted_posts_cache'),
  7033.       this.on('set:done', this.mapStartPosts)
  7034.     },
  7035.     restoreFromCache: function () {
  7036.       var b = this.submittedPostsCache.getAll(),
  7037.       c = this;
  7038.       this.add(a.chain(b).reject(function (a) {
  7039.         return c.thread.get('id') !== a.thread || a.parent && !c.get(a.parent)
  7040.       }).map(function (a) {
  7041.         return a.isCached = !0,
  7042.         a
  7043.       }).value())
  7044.     },
  7045.     removeFromCache: function (a) {
  7046.       this.submittedPostsCache.removeItem(a.id)
  7047.     },
  7048.     saveToCache: function (a) {
  7049.       this.submittedPostsCache.setItem(a.id, a.toJSON())
  7050.     },
  7051.     mapStartPosts: function (c) {
  7052.       if (null !== c) {
  7053.         var d = this;
  7054.         c = Array.isArray(c) ? c : [
  7055.           c
  7056.         ],
  7057.         a.forEach(c.slice().reverse(), function (a) {
  7058.           var c = a instanceof b.Model ? a.get('parent') : a.parent;
  7059.           c && !d.postCursors[c] && (d.postCursors[c] = Object.defineProperty({
  7060.           }, 'startPost', {
  7061.             value: a.id,
  7062.             writeable: !1
  7063.           }))
  7064.         })
  7065.       }
  7066.     },
  7067.     fetch: function (c) {
  7068.       if (c = c || {
  7069.       }, !c.post) return this.buffer.fetch(c);
  7070.       var e = this;
  7071.       return c = a.extend({
  7072.         url: d.getURL('posts/getDescendants'),
  7073.         data: {
  7074.           limit: c.limit || this.perPage,
  7075.           order: this.getOrder(),
  7076.           post: c.post.id,
  7077.           start_post: this.postCursors[c.post.id] ? e.postCursors[c.post.id].startPost : '',
  7078.           cursor: c.cursor || ''
  7079.         }
  7080.       }, c),
  7081.       b.Collection.prototype.fetch.call(e, c)
  7082.     },
  7083.     parse: function (a, b) {
  7084.       if (!(b.url && b.url.indexOf('posts/getDescendants') > - 1)) return this.buffer.parse(a, b);
  7085.       this.postCursors[b.data.post] || (this.postCursors[b.data.post] = {
  7086.       }),
  7087.       this.postCursors[b.data.post].cursor = a.cursor,
  7088.       b.post.set('hasMore', a.cursor.hasNext),
  7089.       this.fetchedReplies += a.response.length;
  7090.       var c = this.buffer.indexOf(b.post),
  7091.       d = this.getDescendantsFromBuffer(b.post);
  7092.       return d && this.add(d, {
  7093.         at: c
  7094.       }),
  7095.       this.buffer.add(a.response, {
  7096.         at: c + d.length
  7097.       }),
  7098.       a.response
  7099.     },
  7100.     getDescendantsFromBuffer: function (b) {
  7101.       var c = {
  7102.       };
  7103.       c[b.id] = b;
  7104.       var d = this.buffer.slice(this.buffer.indexOf(b) + 1);
  7105.       return a.some(d, function (a) {
  7106.         var b = a.get('parent');
  7107.         return !b || !c[b] || (c[a.id] = a, !1)
  7108.       }),
  7109.       a.values(c)
  7110.     }
  7111.   }),
  7112.   t = b.Collection.extend({
  7113.     model: l.QueuedPost,
  7114.     initialize: function (a, b) {
  7115.       var c = this;
  7116.       c.thread = b.thread,
  7117.       c.counters = {
  7118.         comments: 0,
  7119.         replies: {
  7120.         }
  7121.       },
  7122.       c.on('add', function (a) {
  7123.         var b = a.getVisibleParent(c.thread),
  7124.         d = c.counters.replies;
  7125.         b ? (d[b.id] = (d[b.id] || 0) + 1, b.id === a.get('parentId') && a.set('immedReply', !0)) : c.counters.comments += 1
  7126.       })
  7127.     },
  7128.     comparator: function (a) {
  7129.       return parseInt(a.id, 10)
  7130.     },
  7131.     isDescendant: function (b, c) {
  7132.       var d = b.get('parentId'),
  7133.       e = d ? this.get(d) : null,
  7134.       f = {
  7135.       };
  7136.       for (a.each(c, function (a) {
  7137.         f[a] = !0
  7138.       }); e; ) {
  7139.         if (f[e.get('id')] === !0) return !0;
  7140.         d = e.get('parentId'),
  7141.         e = d ? this.get(d) : null
  7142.       }
  7143.       return !1
  7144.     },
  7145.     drain: function D(b) {
  7146.       function c(a) {
  7147.         var b = [
  7148.         ];
  7149.         e.each(function (a) {
  7150.           null === a.get('parentId') && b.push(a.get('id'))
  7151.         }),
  7152.         e.reset(e.filter(function (c) {
  7153.           return null === c.get('parentId') || e.isDescendant(c, b) ? void a(c) : c
  7154.         })),
  7155.         e.counters.comments = 0
  7156.       }
  7157.       function d(c) {
  7158.         var d,
  7159.         f = [
  7160.         ];
  7161.         d = e.filter(function (a) {
  7162.           var c = a.getVisibleParent(e.thread);
  7163.           return c && c.get('id') === b ? void f.push(a) : a
  7164.         }),
  7165.         f = a.sortBy(f, function (a) {
  7166.           return parseInt(a.get('id'), 10)
  7167.         }),
  7168.         a.each(f, function (a) {
  7169.           c(a)
  7170.         }),
  7171.         e.reset(d),
  7172.         e.counters.replies[b] = 0
  7173.       }
  7174.       var e = this,
  7175.       D = b ? d : c;
  7176.       return D(function (a) {
  7177.         e.thread.posts.add(a.toPost(e.thread))
  7178.       })
  7179.     }
  7180.   }),
  7181.   u = b.Collection.extend({
  7182.     models: l.TypingUser,
  7183.     initialize: function () {
  7184.       var b = this;
  7185.       b.gc = null,
  7186.       b.on('add remove reset', function () {
  7187.         var c = b.count();
  7188.         return c > 0 && null === b.gc ? void (b.gc = setInterval(a.bind(b.cleanup, b), 60000)) : void (c <= 0 && null !== b.gc && (clearInterval(b.gc), b.gc = null))
  7189.       }, b)
  7190.     },
  7191.     count: function (a) {
  7192.       var b = this.filter(function (b) {
  7193.         return !(a && b.id === a) && b.get('typing')
  7194.       });
  7195.       return b.length
  7196.     },
  7197.     cleanup: function () {
  7198.       var a = c();
  7199.       this.reset(this.filter(function (b) {
  7200.         return a.diff(b.lastModified, 'minutes') < 5
  7201.       }))
  7202.     }
  7203.   }),
  7204.   v = h.extend({
  7205.     model: k.wrap(l.Post),
  7206.     url: d.getURL('users/listPostActivity')
  7207.   }),
  7208.   w = h.extend({
  7209.     model: l.Thread,
  7210.     url: d.getURL('timelines/ranked'),
  7211.     initialize: function (a, b) {
  7212.       b = b || {
  7213.       },
  7214.       this.type = b.type,
  7215.       this.target = b.target
  7216.     },
  7217.     fetch: function (b) {
  7218.       return b = b || {
  7219.       },
  7220.       b.data = a.extend({
  7221.         type: this.type,
  7222.         target: this.target
  7223.       }, b.data),
  7224.       h.prototype.fetch.call(this, b)
  7225.     },
  7226.     parse: function (b) {
  7227.       return b = h.prototype.parse.call(this, b),
  7228.       a.map(b.activities, function (a) {
  7229.         return e.buildThread(b.objects, a.items[0].object)
  7230.       })
  7231.     }
  7232.   }),
  7233.   x = b.Collection.extend({
  7234.     model: l.SyncedTopUser,
  7235.     url: d.getURL('forums/listMostActiveUsers'),
  7236.     initialize: function (a, b) {
  7237.       this.forum = b.forum,
  7238.       this.limit = b.limit
  7239.     },
  7240.     fetch: function (c) {
  7241.       return b.Collection.prototype.fetch.call(this, a.extend({
  7242.         data: {
  7243.           forum: this.forum,
  7244.           limit: this.limit
  7245.         }
  7246.       }, c))
  7247.     },
  7248.     parse: function (b) {
  7249.       return a.filter(b.response, function (a) {
  7250.         if (parseFloat(a.rep) > 0.7) return a
  7251.       })
  7252.     }
  7253.   });
  7254.   g.prototype.model = k.wrap(l.User);
  7255.   var y = b.Collection.extend({
  7256.     model: l.SyncedUser,
  7257.     url: d.getURL('forums/listModerators'),
  7258.     initialize: function (a, b) {
  7259.       this.forum = b.forum
  7260.     },
  7261.     fetch: function (c) {
  7262.       return b.Collection.prototype.fetch.call(this, a.extend({
  7263.         data: {
  7264.           forum: this.forum
  7265.         }
  7266.       }, c))
  7267.     },
  7268.     parse: function (b) {
  7269.       return a.map(b.response, function (a) {
  7270.         return a.user
  7271.       })
  7272.     }
  7273.   }),
  7274.   z = 'reaction-vote',
  7275.   A = b.Collection.extend({
  7276.     url: d.getURL('threadReactions/loadReactions'),
  7277.     initialize: function (a, b) {
  7278.       this.thread = b.thread,
  7279.       this.enabled = Boolean(a.length),
  7280.       this.eligible = Boolean(b.eligible),
  7281.       this.userIsAnonymous = b.userIsAnonymous
  7282.     },
  7283.     fetch: function (c) {
  7284.       return b.Collection.prototype.fetch.call(this, a.extend({
  7285.         data: {
  7286.           thread: this.thread.id
  7287.         }
  7288.       }, c))
  7289.     },
  7290.     parse: function (a) {
  7291.       var b = a.response,
  7292.       c = b.reactions,
  7293.       d = b.selected && b.selected.id;
  7294.       if (!d && this.userIsAnonymous) {
  7295.         var e = f.get(z);
  7296.         d = e && e[this.thread.get('id')]
  7297.       }
  7298.       if (d) {
  7299.         var g = c.filter(function (a) {
  7300.           return a.id === d
  7301.         });
  7302.         g.length && (g[0].isSelected = !0, g[0].votes || (g[0].votes = 1))
  7303.       }
  7304.       return this.enabled = Boolean(c.length),
  7305.       this.eligible = b.eligible,
  7306.       this.prompt = b.prompt,
  7307.       c
  7308.     },
  7309.     toggleEnabled: function () {
  7310.       var a = this;
  7311.       d.call('threadReactions/disableForThread', {
  7312.         method: 'POST',
  7313.         data: {
  7314.           thread: this.thread.get('id'),
  7315.           enable: this.enabled ? 0 : 1
  7316.         },
  7317.         success: function () {
  7318.           a.enabled = !a.enabled,
  7319.           a.trigger('change:enabled'),
  7320.           a.enabled && !a.length && a.fetch()
  7321.         }
  7322.       })
  7323.     },
  7324.     vote: function (b, c) {
  7325.       var e = this.at(b);
  7326.       if (e && !e.get('isSelected')) {
  7327.         c = c || {
  7328.         },
  7329.         this.trigger('vote:start');
  7330.         var g = this;
  7331.         d.call('threadReactions/vote', a.extend({
  7332.         }, c, {
  7333.           method: 'POST',
  7334.           data: {
  7335.             thread: this.thread.get('id'),
  7336.             reaction: e.get('id')
  7337.           },
  7338.           success: function () {
  7339.             if (g.forEach(function (a, c) {
  7340.               var d = c === b,
  7341.               e = a.get('votes');
  7342.               d && (e += 1),
  7343.               a.get('isSelected') && (e = Math.max(0, e - 1)),
  7344.               a.set({
  7345.                 isSelected: d,
  7346.                 votes: e
  7347.               })
  7348.             }, g), g.trigger('vote:end'), g.userIsAnonymous) {
  7349.               var a = f.get(z) || {
  7350.               };
  7351.               a[g.thread.get('id')] = e.get('id'),
  7352.               f.set(z, a)
  7353.             }
  7354.             c.success && c.success()
  7355.           },
  7356.           error: function () {
  7357.             g.trigger('vote:end'),
  7358.             c.error && c.error()
  7359.           }
  7360.         }))
  7361.       }
  7362.     }
  7363.   }),
  7364.   B = b.Collection.extend({
  7365.     url: d.getURL('gifs/search'),
  7366.     model: l.GifObject,
  7367.     query: null,
  7368.     page: null,
  7369.     fetch: function (c) {
  7370.       return c.query === this.query ? this.page += 1 : this.page = 1,
  7371.       b.Collection.prototype.fetch.call(this, a.extend({
  7372.         data: {
  7373.           forum: c.forum,
  7374.           query: c.query,
  7375.           page: this.page
  7376.         }
  7377.       }, c))
  7378.     },
  7379.     parse: function (a, b) {
  7380.       var c = a.response,
  7381.       d = this.toJSON();
  7382.       return b.query === this.query ? d.concat(c) : (this.query = b.query, c)
  7383.     },
  7384.     reset: function () {
  7385.       return this.query = null,
  7386.       this.page = null,
  7387.       b.Collection.prototype.reset.call(this)
  7388.     }
  7389.   }),
  7390.   C = b.Collection.extend({
  7391.     url: d.getURL('mentions/listUsers'),
  7392.     model: l.SyncedUser,
  7393.     LIMIT: 5,
  7394.     query: null,
  7395.     cursor: null,
  7396.     initialize: function (a, b) {
  7397.       this.threadId = b && b.threadId
  7398.     },
  7399.     fetch: function (c) {
  7400.       var d = this.cursor && this.cursor.hasNext;
  7401.       if (this.query !== c.query || d) return b.Collection.prototype.fetch.call(this, a.extend({
  7402.         data: {
  7403.           thread: this.threadId,
  7404.           cursor: c.next && d && this.cursor.next ? this.cursor.next.slice(2) : null,
  7405.           query: c.query,
  7406.           limit: c.limit || this.LIMIT
  7407.         }
  7408.       }, c))
  7409.     },
  7410.     parse: function (a, c) {
  7411.       var d = a.response,
  7412.       e = a.cursor,
  7413.       f = this.toJSON();
  7414.       return f = c.query === this.query ? f.concat(d) : d,
  7415.       this.query = c.query,
  7416.       this.cursor = e,
  7417.       this.set(f),
  7418.       b.Collection.prototype.parse.call(this, f),
  7419.       f
  7420.     },
  7421.     reset: function () {
  7422.       return this.query = null,
  7423.       this.cursor = null,
  7424.       b.Collection.prototype.reset.call(this)
  7425.     }
  7426.   });
  7427.   return {
  7428.     PaginatedCollection: h,
  7429.     UserCollection: g,
  7430.     ChannelCollection: i,
  7431.     PostCollection: q,
  7432.     SubpaginatedPostCollection: s,
  7433.     TypingUserCollection: u,
  7434.     TopUserCollection: x,
  7435.     RankedThreadCollection: w,
  7436.     ThreadVoteCollection: p,
  7437.     PostActivityCollection: v,
  7438.     QueuedPostCollection: t,
  7439.     ModeratorCollection: y,
  7440.     ReactionsCollection: A,
  7441.     GifObjectsCollection: B,
  7442.     UserSuggestionsCollection: C
  7443.   }
  7444. }),
  7445. define('core/constants/storageConstants', [
  7446.   'exports'
  7447. ], function (a) {
  7448.   'use strict';
  7449.   a.STORAGE_KEY_SESSION_ID = 'sessionId'
  7450. }),
  7451. define('core/models/Session', [
  7452.   'jquery',
  7453.   'underscore',
  7454.   'backbone',
  7455.   'moment',
  7456.   'core/api',
  7457.   'core/bus',
  7458.   'core/config',
  7459.   'core/constants/storageConstants',
  7460.   'core/time',
  7461.   'core/utils',
  7462.   'core/utils/cookies',
  7463.   'core/utils/guid',
  7464.   'core/utils/auth',
  7465.   'core/utils/storage',
  7466.   'core/models/BaseUser',
  7467.   'core/models/User'
  7468. ], function (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p) {
  7469.   'use strict';
  7470.   var q = function () {
  7471.     return m.getFromCookie()
  7472.   },
  7473.   r = function () {
  7474.     return n.get(h.STORAGE_KEY_SESSION_ID)
  7475.   },
  7476.   s = c.Model.extend({
  7477.     initialize: function () {
  7478.       this.constructor.fromCookie = b.once(q),
  7479.       this.user = this.getAnonUserInstance()
  7480.     },
  7481.     setUser: function (a) {
  7482.       this.user && this.stopListening(this.user),
  7483.       this.user = a,
  7484.       this.setIfNewUser(),
  7485.       this.listenTo(a, 'all', this.trigger),
  7486.       this.trigger('change:id', a)
  7487.     },
  7488.     isLoggedOut: function () {
  7489.       return !this.isLoggedIn()
  7490.     },
  7491.     isLoggedIn: function () {
  7492.       return Boolean(this.user.get('id'))
  7493.     },
  7494.     fetch: function (a) {
  7495.       var c = a || {
  7496.       };
  7497.       return e.call('users/details.json', {
  7498.         data: c.data,
  7499.         success: b.bind(function (a) {
  7500.           a = a.response,
  7501.           a.id && this.setUser(this.getUserInstance(a)),
  7502.           c.success && c.success(a),
  7503.           c.complete && c.complete(a)
  7504.         }, this),
  7505.         error: function (a) {
  7506.           c.error && c.error(a),
  7507.           c.complete && c.complete(a)
  7508.         }
  7509.       })
  7510.     },
  7511.     getAnonUserInstance: function (a) {
  7512.       return new o(a)
  7513.     },
  7514.     getUserInstance: function (a) {
  7515.       return new p(a)
  7516.     },
  7517.     getCsrfToken: function () {
  7518.       var a = k.read('csrftoken');
  7519.       return a || (a = l.generate().replace(/\W/g, ''), k.create('csrftoken', a, {
  7520.         domain: window.location.hostname,
  7521.         expiresIn: 31536000000
  7522.       })),
  7523.       a
  7524.     },
  7525.     authenticate: function (c) {
  7526.       var d = this.authServices[c];
  7527.       if (d) {
  7528.         if (b.isFunction(d)) return d.call(this);
  7529.         f.trigger('uiAction:openLogin', c);
  7530.         var e = this.getAuthWindowArgs(d),
  7531.         g = d.url;
  7532.         g += (g.indexOf('?') > - 1 ? '&' : '?') + a.param(e),
  7533.         this.openAuthWindow(g, d.width, d.height)
  7534.       }
  7535.     },
  7536.     authServices: {
  7537.       disqus: {
  7538.         url: g.urls.login,
  7539.         width: 460,
  7540.         height: 355,
  7541.         attachExperiment: !0
  7542.       },
  7543.       twitter: {
  7544.         url: g.urls.oauth.twitter,
  7545.         width: 650,
  7546.         height: 680,
  7547.         csrf: !0,
  7548.         attachExperiment: !0
  7549.       },
  7550.       facebook: {
  7551.         url: g.urls.oauth.facebook,
  7552.         width: 550,
  7553.         height: 320,
  7554.         csrf: !0,
  7555.         attachExperiment: !0
  7556.       },
  7557.       google: {
  7558.         url: g.urls.oauth.google,
  7559.         width: 445,
  7560.         height: 635,
  7561.         csrf: !0,
  7562.         attachExperiment: !0
  7563.       },
  7564.       microsoft: {
  7565.         url: g.urls.oauth.microsoft,
  7566.         width: 650,
  7567.         height: 635,
  7568.         csrf: !0,
  7569.         attachExperiment: !0
  7570.       },
  7571.       apple: {
  7572.         url: g.urls.oauth.apple,
  7573.         width: 445,
  7574.         height: 750,
  7575.         csrf: !0,
  7576.         attachExperiment: !0
  7577.       }
  7578.     },
  7579.     getAuthWindowArgs: function (a) {
  7580.       var c = {
  7581.       };
  7582.       return a.csrf && (c.ctkn = this.getCsrfToken()),
  7583.       b.extend(c, a.params),
  7584.       c
  7585.     },
  7586.     openAuthWindow: function (a, b, c) {
  7587.       return j.openWindow(a, '_blank', {
  7588.         width: b,
  7589.         height: c
  7590.       })
  7591.     },
  7592.     setIfNewUser: function () {
  7593.       var a = this.user.get('joinedAt');
  7594.       if (this.user.get('isAnonymous') || !a) return void this.user.set('joinedRecently', !1);
  7595.       var b = i.assureTzOffset(a);
  7596.       this.user.set('joinedRecently', d().subtract(10, 'seconds').isBefore(b))
  7597.     }
  7598.   });
  7599.   return s.fromCookie = q,
  7600.   s.fromLocalStorage = r,
  7601.   s.isKnownToBeLoggedOut = function () {
  7602.     return !s.fromCookie().id && !s.fromLocalStorage()
  7603.   },
  7604.   s
  7605. }),
  7606. define('core/WindowBus', [
  7607.   'jquery',
  7608.   'underscore',
  7609.   'backbone',
  7610.   'modernizr'
  7611. ], function (a, b, c, d) {
  7612.   'use strict';
  7613.   var e = c.Model.extend({
  7614.     initialize: function () {
  7615.       d.localstorage && a(window).on('storage', b.bind(this.onStorageEvent, this))
  7616.     },
  7617.     broadcast: function (a, b) {
  7618.       if (d.localstorage) {
  7619.         var c = JSON.stringify({
  7620.           name: a,
  7621.           data: b,
  7622.           time: (new Date).getTime()
  7623.         });
  7624.         try {
  7625.           window.localStorage.setItem(this.constructor.STORAGE_KEY, c)
  7626.         } catch (e) {
  7627.         }
  7628.       }
  7629.     },
  7630.     onStorageEvent: function (a) {
  7631.       var b = a.originalEvent.key,
  7632.       c = a.originalEvent.newValue;
  7633.       if (c && b === this.constructor.STORAGE_KEY) try {
  7634.         c = JSON.parse(c),
  7635.         this.trigger(c.name, c.data)
  7636.       } catch (d) {
  7637.       }
  7638.     }
  7639.   }, {
  7640.     STORAGE_KEY: 'disqus.bus'
  7641.   });
  7642.   return e
  7643. }),
  7644. define('templates/lounge/threadVotes', [
  7645.   'react',
  7646.   'core/config/urls',
  7647.   'core/strings',
  7648.   'core/switches',
  7649.   'core/utils/object/get'
  7650. ], function (a, b, c, d, e) {
  7651.   'use strict';
  7652.   var f = c.gettext,
  7653.   g = function (c) {
  7654.     var g = c.thread && c.thread.forum,
  7655.     h = d.isFeatureActive('embed_refresh', {
  7656.       forum: g
  7657.     }),
  7658.     i = h && d.isFeatureActive('embed_refresh_v2', {
  7659.       forum: g
  7660.     }),
  7661.     j = h ? 'favorite-button-toggle' : 'dropdown-toggle',
  7662.     k = h ? 'label-count-refresh' : 'label-count',
  7663.     l = i ? 'favorite-icon favorite-icon--refresh-v2' : 'favorite-icon',
  7664.     m = function () {
  7665.       return i ? a.createElement('span', {
  7666.         className: 'label label-default'
  7667.       }, a.createElement('span', {
  7668.         className: l + ' icon-heart-empty'
  7669.       })) : h ? null : a.createElement('span', {
  7670.         className: 'label label-default'
  7671.       }, a.createElement('span', {
  7672.         className: 'favorite-icon icon-heart-empty'
  7673.       }))
  7674.     },
  7675.     n = function () {
  7676.       return i ? a.createElement('span', {
  7677.         className: 'label label-favorited'
  7678.       }, a.createElement('span', {
  7679.         className: l + ' icon-heart'
  7680.       })) : h ? null : a.createElement('span', {
  7681.         className: 'label label-favorited'
  7682.       }, a.createElement('span', {
  7683.         className: 'favorite-icon icon-heart'
  7684.       }))
  7685.     },
  7686.     o = function () {
  7687.       return h && !i ? a.createElement('div', {
  7688.         className: 'favorite-icon-wrapper'
  7689.       }, a.createElement('i', {
  7690.         className: 'favorite-icon-refresh'
  7691.       })) : null
  7692.     };
  7693.     return a.createElement('div', null, a.createElement('a', {
  7694.       href: '#',
  7695.       'data-action': 'favorite',
  7696.       title: f('Favorite this discussion'),
  7697.       className: j + ' ' + (i ? j + '--v2' : '') + ' ' + (e(c.thread, [
  7698.         'userScore'
  7699.       ]) ? 'upvoted' : ''),
  7700.       'aria-label': f('Favorite this discussion')
  7701.     }, m(), n(), o(), ' ', e(c.thread, [
  7702.       'likes'
  7703.     ]) ? a.createElement('span', {
  7704.       className: 'label ' + k + ' ' + (i ? k + '--v2' : '')
  7705.     }, e(c.thread, [
  7706.       'likes'
  7707.     ], null)) : null), a.createElement('ul', {
  7708.       className: 'dropdown-menu dropdown-menu--coachmark pull-right'
  7709.     }, a.createElement('li', null, c.loggedIn ? a.createElement('div', null, a.createElement('h2', {
  7710.       className: 'coachmark__heading'
  7711.     }, f('Your 1st favorited discussion!')), a.createElement('p', {
  7712.       className: 'coachmark__description'
  7713.     }, f('Favoriting means this is a discussion worth sharing. It gets shared to your followers\' %(Disqus)s feeds if you log in, and gives the creator kudos!', {
  7714.       Disqus: 'Disqus'
  7715.     }))) : a.createElement('div', null, a.createElement('h2', {
  7716.       className: 'coachmark__heading'
  7717.     }, f('Discussion Favorited!')), a.createElement('p', {
  7718.       className: 'coachmark__description'
  7719.     }, f('Favoriting means this is a discussion worth sharing. It gets shared to your followers\' %(Disqus)s feeds, and gives the creator kudos!', {
  7720.       Disqus: 'Disqus'
  7721.     }))), ' ', a.createElement('a', {
  7722.       href: (b.root || '') + '/home/?utm_source=disqus_embed&utm_content=recommend_btn',
  7723.       className: 'btn btn-primary coachmark__button',
  7724.       target: '_blank',
  7725.       rel: 'noopener noreferrer'
  7726.     }, f(c.loggedIn ? 'See Your Feed' : 'Find More Discussions')))))
  7727.   };
  7728.   return g
  7729. }),
  7730. define('lounge/views/favorite-button', [
  7731.   'backbone',
  7732.   'core/utils/storage',
  7733.   'templates/lounge/threadVotes'
  7734. ], function (a, b, c) {
  7735.   'use strict';
  7736.   var d = a.View.extend({
  7737.     className: 'thread-likes',
  7738.     events: {
  7739.       'click [data-action=favorite]': 'favoriteHandler'
  7740.     },
  7741.     initialize: function (a) {
  7742.       this.session = a.session,
  7743.       this.thread = a.thread,
  7744.       this.loggedOutFavoriteFlag = this.session.getLoggedOutUserFlags().get(d.ONBOARDING_KEY),
  7745.       this.listenTo(this.thread, 'change:userScore', this.render),
  7746.       this.listenTo(this.thread, 'change:likes', this.render),
  7747.       this.listenTo(this.session, 'change:id', this.startFavoriteOnboarding),
  7748.       this.setTooltipEnabled()
  7749.     },
  7750.     setTooltipEnabled: function () {
  7751.       this.tooltipEnabled = this.session.isLoggedIn() ? b.get(d.ONBOARDING_KEY) : !this.loggedOutFavoriteFlag.isRead()
  7752.     },
  7753.     render: function () {
  7754.       return this.$el.html(c({
  7755.         thread: this.thread.toJSON(),
  7756.         user: this.session.toJSON(),
  7757.         loggedIn: this.session.isLoggedIn()
  7758.       })),
  7759.       this
  7760.     },
  7761.     startFavoriteOnboarding: function () {
  7762.       this.session.user.get('joinedRecently') && b.set(d.ONBOARDING_KEY, 'true'),
  7763.       this.setTooltipEnabled()
  7764.     },
  7765.     favoriteHandler: function (a) {
  7766.       a.stopPropagation(),
  7767.       a.preventDefault();
  7768.       var b = 0 === this.thread.get('userScore');
  7769.       this.trigger(b ? 'vote:like' : 'vote:unlike'),
  7770.       this.thread.vote(b ? 1 : 0),
  7771.       this.toggleTooltip(b),
  7772.       this.tooltipEnabled && b && this.markAsSeen()
  7773.     },
  7774.     markAsSeen: function () {
  7775.       this.session.isLoggedIn() ? b.remove(d.ONBOARDING_KEY) : this.loggedOutFavoriteFlag.markRead()
  7776.     },
  7777.     toggleTooltip: function (a) {
  7778.       this.tooltipEnabled && (a ? this.$el.parent().addClass('open') : this.$el.parent().removeClass('open'))
  7779.     }
  7780.   }, {
  7781.     ONBOARDING_KEY: 'showRecommendOnboarding'
  7782.   });
  7783.   return d
  7784. }),
  7785. define('common/collections/LoggedOutCache', [
  7786.   'backbone',
  7787.   'core/common/cached-storage',
  7788.   'lounge/views/favorite-button'
  7789. ], function (a, b, c) {
  7790.   'use strict';
  7791.   var d = [
  7792.     {
  7793.       id: 'welcome',
  7794.       title: '',
  7795.       body: ''
  7796.     }
  7797.   ],
  7798.   e = [
  7799.     {
  7800.       id: c.ONBOARDING_KEY
  7801.     }
  7802.   ],
  7803.   f = new b('notes', 7776000),
  7804.   g = a.Model.extend({
  7805.     markRead: function () {
  7806.       f.setItem(this.id, !0)
  7807.     },
  7808.     isRead: function () {
  7809.       return Boolean(f.getItem(this.id))
  7810.     }
  7811.   }),
  7812.   h = a.Collection.extend({
  7813.     initialize: function (a, b) {
  7814.       this.session = b.session
  7815.     },
  7816.     model: g,
  7817.     markAllRead: function () {
  7818.       return this.each(function (a) {
  7819.         a.markRead()
  7820.       }),
  7821.       this.session.set('notificationCount', 0),
  7822.       this
  7823.     },
  7824.     getUnread: function () {
  7825.       return this.filter(function (a) {
  7826.         return !a.isRead()
  7827.       })
  7828.     }
  7829.   });
  7830.   return {
  7831.     storage: f,
  7832.     Collection: h,
  7833.     Model: g,
  7834.     LOGGED_OUT_NOTES: d,
  7835.     LOGGED_OUT_FLAGS: e
  7836.   }
  7837. }),
  7838. define('common/Session', [
  7839.   'jquery',
  7840.   'underscore',
  7841.   'core/analytics/jester',
  7842.   'core/api',
  7843.   'core/bus',
  7844.   'core/config',
  7845.   'core/constants/storageConstants',
  7846.   'common/models',
  7847.   'common/urls',
  7848.   'core/models/Session',
  7849.   'core/switches',
  7850.   'core/UniqueModel',
  7851.   'core/utils/cookies',
  7852.   'core/utils/url/serialize',
  7853.   'core/WindowBus',
  7854.   'core/utils/storage',
  7855.   'common/collections/LoggedOutCache',
  7856.   'common/keys',
  7857.   'common/utils',
  7858.   'lounge/common',
  7859.   'lounge/tracking'
  7860. ], function (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u) {
  7861.   'use strict';
  7862.   var v,
  7863.   w = 3500,
  7864.   x = {
  7865.   },
  7866.   y = new o,
  7867.   z = j.extend({
  7868.     _defaults: {
  7869.       canReply: !0,
  7870.       canModerate: !1,
  7871.       audienceSyncVerified: !1,
  7872.       sso: null
  7873.     },
  7874.     socialLoginProviders: {
  7875.       facebook: function () {
  7876.         var b = a.Deferred();
  7877.         return require(['fb'], b.resolve.bind(b), b.reject.bind(b)),
  7878.         b.promise().then(function () {
  7879.           window.FB.init({
  7880.             appId: r.facebook,
  7881.             xfbml: !1,
  7882.             status: !0,
  7883.             version: 'v2.8'
  7884.           });
  7885.           var b = a.Deferred();
  7886.           return window.FB.getLoginStatus(function (a) {
  7887.             'connected' === a.status ? b.resolve(a) : b.reject()
  7888.           }),
  7889.           b.promise()
  7890.         }).then(function (a) {
  7891.           c.logStat('lounge.auto_login.fb');
  7892.           var b = a.authResponse;
  7893.           return {
  7894.             grant_type: 'urn:disqus:params:oauth:grant-type:facebook-login',
  7895.             client_id: r.embedAPI,
  7896.             expires: b.expiresIn,
  7897.             fb_access_token: b.accessToken
  7898.           }
  7899.         })
  7900.       },
  7901.       google: function () {
  7902.         var b = a.Deferred();
  7903.         return require(['gapi'], function (a) {
  7904.           setTimeout(b.reject.bind(b), w),
  7905.           a.load('auth2', b.resolve.bind(b, a))
  7906.         }, b.reject.bind(b)),
  7907.         b.promise().then(function (b) {
  7908.           var c = b.auth2.init({
  7909.             client_id: r.google,
  7910.             fetch_basic_profile: !1,
  7911.             scope: 'profile email'
  7912.           }),
  7913.           d = a.Deferred();
  7914.           return c.then(function () {
  7915.             c.isSignedIn.get() ? d.resolve(c.currentUser.get()) : d.reject()
  7916.           }),
  7917.           d.promise()
  7918.         }).then(function (a) {
  7919.           c.logStat('lounge.auto_login.google');
  7920.           var b = a.getAuthResponse();
  7921.           return {
  7922.             grant_type: 'urn:disqus:params:oauth:grant-type:google-login',
  7923.             client_id: r.embedAPI,
  7924.             expires: b.expires_in,
  7925.             google_access_token: JSON.stringify(b)
  7926.           }
  7927.         })
  7928.       }
  7929.     },
  7930.     initialize: function () {
  7931.       z.__super__.initialize.apply(this, arguments),
  7932.       !x.fromCookie().isAuthenticated && this.getSessionId() && d.headers({
  7933.         'X-Sessionid': this.getSessionId()
  7934.       })
  7935.     },
  7936.     setSessionId: function (a) {
  7937.       p.set(g.STORAGE_KEY_SESSION_ID, a)
  7938.     },
  7939.     removeSessionId: function () {
  7940.       p.remove(g.STORAGE_KEY_SESSION_ID)
  7941.     },
  7942.     getSessionId: function () {
  7943.       return p.get(g.STORAGE_KEY_SESSION_ID)
  7944.     },
  7945.     defaults: function () {
  7946.       var a = new q.Collection(q.LOGGED_OUT_NOTES, {
  7947.         session: this
  7948.       });
  7949.       return b.extend(this._defaults, {
  7950.         notificationCount: a.getUnread().length
  7951.       })
  7952.     },
  7953.     start: function (b) {
  7954.       var c = b || {
  7955.       };
  7956.       if (this.set(c), this.listenTo(y, 'auth:success', this.fetch), this.listenTo(e.frame, {
  7957.         '!auth:success': function (a) {
  7958.           a && (a.sessionId && (d.headers({
  7959.             'X-Sessionid': a.sessionId
  7960.           }), x.fromCookie().isAuthenticated || this.setSessionId(a.sessionId)), a.message && this.trigger('alert', a.message, {
  7961.             type: 'info'
  7962.           }), a.logEvent && e.trigger('uiAction:' + a.logEvent)),
  7963.           y.broadcast('auth:success'),
  7964.           this.fetch()
  7965.         }
  7966.       }), this.bindAudienceSyncHandlers(), this.shouldFetchSession()) this.fetch();
  7967.        else if (m.read('no_auto_login') || u.isPrivate()) this.loginAsAnon();
  7968.        else {
  7969.         var f = this.socialLoginProviders,
  7970.         g = !1,
  7971.         h = 0,
  7972.         i = a.Deferred(),
  7973.         j = Object.keys(f).map(function (a) {
  7974.           return f[a].call(this)
  7975.         }, this),
  7976.         k = function (a) {
  7977.           g || (g = !0, i.resolve(a))
  7978.         },
  7979.         l = function (a) {
  7980.           h += 1,
  7981.           h === j.length && i.reject(a)
  7982.         };
  7983.         j.forEach(function (a) {
  7984.           a.then(k).fail(l)
  7985.         }),
  7986.         i.promise().then(function (b) {
  7987.           return a.post('https://disqus.com/api/oauth/2.0/access_token/', b)
  7988.         }).then(function (a) {
  7989.           this.fetch({
  7990.             data: {
  7991.               access_token: a.access_token
  7992.             }
  7993.           })
  7994.         }.bind(this)).fail(this.loginAsAnon.bind(this))
  7995.       }
  7996.     },
  7997.     stop: function () {
  7998.       this.stopListening(),
  7999.       this.off()
  8000.     },
  8001.     loginAsAnon: function () {
  8002.       this.setUser(this.getAnonUserInstance())
  8003.     },
  8004.     shouldFetchSession: function () {
  8005.       return Boolean(this.get('remoteAuthS3') || x.fromCookie().id || this.getSessionId())
  8006.     },
  8007.     getUserInstance: function (a) {
  8008.       return new l(h.User, a)
  8009.     },
  8010.     toJSON: function () {
  8011.       var a = this.user.toJSON.apply(this.user, arguments);
  8012.       return a.thread.canReply = this.get('canReply'),
  8013.       a.thread.canModerate || (a.thread.canModerate = this.get('canModerate')),
  8014.       a
  8015.     },
  8016.     fetch: function (a) {
  8017.       var b = this,
  8018.       c = a || {
  8019.       };
  8020.       b.has('thread') && (c.thread = b.get('thread'));
  8021.       var d = c.thread ? b.fetchThreadDetails(c) : j.prototype.fetch.call(b, c);
  8022.       return d.done(function () {
  8023.         b.set('notificationCount', 0)
  8024.       }),
  8025.       d
  8026.     },
  8027.     fetchNotificationCount: function () {
  8028.       var b = this;
  8029.       return b.isLoggedIn() ? d.call('timelines/getUnreadCount.json', {
  8030.         data: {
  8031.           type: 'notifications',
  8032.           routingVersion: f.feedApiVersion
  8033.         }
  8034.       }).done(function (a) {
  8035.         b.set('notificationCount', a.response)
  8036.       }) : a.Deferred().resolve()
  8037.     },
  8038.     fetchThreadDetails: function (a) {
  8039.       var c = this,
  8040.       e = a.thread;
  8041.       c._request && (c._request.abort(), c._request = null);
  8042.       var f = {
  8043.         thread: e.id,
  8044.         post: e.posts.pluck('id')
  8045.       };
  8046.       return c._request = d.call('embed/threadDetails.json', {
  8047.         data: f,
  8048.         success: function (a) {
  8049.           var d = a.response,
  8050.           f = {
  8051.           };
  8052.           if (d.user && (b.extend(f, d.user, {
  8053.             votes: d.votes
  8054.           }), f = b.omit(f, 'badges')), d.blockedUsers || d.blockingUsers) {
  8055.             var g = d.session.canModerate ? new Set(d.blockedUsers) : new Set([].concat(_toConsumableArray(d.blockedUsers), _toConsumableArray(d.blockingUsers)));
  8056.             b.extend(f, d.user, {
  8057.               blockedUserIdSet: g
  8058.             }),
  8059.             f.blockedUserIdSet.forEach(function (a) {
  8060.               new l(h.User, {
  8061.                 id: a
  8062.               }).set({
  8063.                 isBlocked: !0
  8064.               })
  8065.             })
  8066.           }
  8067.           var i = c.get('thread') && c.get('thread').forum && c.get('thread').forum.id;
  8068.           k.isFeatureActive('embed_refresh', {
  8069.             forum: i
  8070.           }) && d.followingUsers && (b.extend(f, d.user, {
  8071.             followingUserIdSet: new Set(d.followingUsers)
  8072.           }), f.followingUserIdSet.forEach(function (a) {
  8073.             return new l(h.User, {
  8074.               id: a,
  8075.               isFollowing: !0
  8076.             })
  8077.           })),
  8078.           c.set(d.session),
  8079.           f.id ? (c.setUser(new l(h.User, f)), e.users.add(c.user), d.thread && (e.set('userScore', d.thread.userScore), e.set('userSubscription', d.thread.userSubscription), e.set('userRating', d.thread.userRating))) : c.loginAsAnon(),
  8080.           c.trigger('fetchThreadDetails:success')
  8081.         },
  8082.         complete: function () {
  8083.           c._request = null
  8084.         }
  8085.       }),
  8086.       c._request
  8087.     },
  8088.     logout: function () {
  8089.       this.removeSessionId();
  8090.       var a = this.get('sso');
  8091.       this.isSSO() && a && a.logout ? e.frame.sendHostMessage('navigate', a.logout) : this.locationReplace(n(i.logout, {
  8092.         redirect: window.location.href
  8093.       }))
  8094.     },
  8095.     locationReplace: function (a) {
  8096.       window.location.replace(a)
  8097.     },
  8098.     isSSO: function () {
  8099.       return this.user && 'sso' === this.user.get('user_type')
  8100.     },
  8101.     getAuthWindowArgs: function (a) {
  8102.       var c = j.prototype.getAuthWindowArgs.call(this, a),
  8103.       d = t.getLounge().config;
  8104.       if (a.attachExperiment && d && d.experiment) {
  8105.         var e = d.experiment;
  8106.         c.evs = window.btoa([e.experiment,
  8107.         e.variant,
  8108.         e.service].join(':'))
  8109.       }
  8110.       return b.defaults({
  8111.         forum: this.get('thread') && this.get('thread').forum.id
  8112.       }, c)
  8113.     },
  8114.     openAuthWindow: function (a, b, c) {
  8115.       try {
  8116.         var d = this.get('thread'),
  8117.         e = d && d.currentUrl;
  8118.         window.sessionStorage && e && window.sessionStorage.setItem('discussionUrl', e)
  8119.       } catch (f) {
  8120.       }
  8121.       return j.prototype.openAuthWindow.call(this, a, b, c)
  8122.     },
  8123.     authServices: b.defaults({
  8124.       disqusDotcom: {
  8125.         url: i.dotcomLogin,
  8126.         width: 478,
  8127.         height: 590,
  8128.         params: {
  8129.           next: i.login
  8130.         },
  8131.         attachExperiment: !0
  8132.       },
  8133.       sso: function A() {
  8134.         var A = this.get('sso'),
  8135.         a = parseInt(A.width || '800', 10),
  8136.         c = parseInt(A.height || '500', 10),
  8137.         d = this.openAuthWindow(A.url, a, c);
  8138.         !function f() {
  8139.           s.isWindowClosed(d) ? e.frame.sendHostMessage('reload') : b.delay(f, 500)
  8140.         }()
  8141.       }
  8142.     }, j.prototype.authServices),
  8143.     bindAudienceSyncHandlers: function () {
  8144.       this.listenTo(this, 'change:id change:audienceSyncVerified', function () {
  8145.         this.get('audienceSyncVerified') && e.frame.sendHostMessage('session.identify', this.user.id)
  8146.       }),
  8147.       this.listenTo(e.frame, {
  8148.         '!audiencesync:grant': function () {
  8149.           this.set('audienceSyncVerified', !0)
  8150.         }
  8151.       })
  8152.     },
  8153.     getAudienceSyncUrl: function () {
  8154.       var a = {
  8155.         client_id: this.get('apiKey'),
  8156.         response_type: 'audiencesync',
  8157.         forum_id: this.get('thread').forum.id
  8158.       };
  8159.       return 'https:' === window.location.protocol && (a.ssl = 1),
  8160.       n(i.authorize, a)
  8161.     },
  8162.     getRecaptchaKey: function () {
  8163.       return this.get('recaptchaPublicKey')
  8164.     },
  8165.     audienceSync: function () {
  8166.       this.openAuthWindow(this.getAudienceSyncUrl(), 460, 355)
  8167.     },
  8168.     needsAudienceSyncAuth: function (a) {
  8169.       return a.get('settings').audienceSyncEnabled && this.isLoggedIn() && !this.get('audienceSyncVerified')
  8170.     },
  8171.     getLoggedOutUserFlags: function () {
  8172.       return this._loggedOutUserFlags ? this._loggedOutUserFlags : (this._loggedOutUserFlags = new q.Collection(q.LOGGED_OUT_FLAGS, {
  8173.         session: this
  8174.       }), this._loggedOutUserFlags)
  8175.     }
  8176.   });
  8177.   return b.extend(x, b.chain(z).keys().map(function (a) {
  8178.     return [a,
  8179.     z[a]]
  8180.   }).object().value(), {
  8181.     get: function () {
  8182.       return v = v || new z
  8183.     },
  8184.     setDefaults: function (a) {
  8185.       if (v) throw new Error('Session defaults cannot be changed after a session instance is created!');
  8186.       return z._defaults = b.extend(z.prototype._defaults, a),
  8187.       z._defaults
  8188.     },
  8189.     forget: function () {
  8190.       v && (v.stop(), v = null)
  8191.     }
  8192.   }),
  8193.   x
  8194. }),
  8195. define('common/views/mixins', [
  8196.   'jquery',
  8197.   'underscore',
  8198.   'core/bus',
  8199.   'core/UniqueModel',
  8200.   'common/models',
  8201.   'common/Session'
  8202. ], function (a, b, c, d, e, f) {
  8203.   'use strict';
  8204.   var g = {
  8205.     proxyViewEvents: function (a) {
  8206.       this.listenTo(a, 'all', function (a) {
  8207.         0 === a.indexOf('uiAction:') && this.trigger.apply(this, arguments)
  8208.       }, this)
  8209.     }
  8210.   },
  8211.   h = {
  8212.     updateUserAvatarHelper: function (b, c) {
  8213.       a('img[data-user=' + b + '][data-role="user-avatar"]').attr('src', c)
  8214.     },
  8215.     updateUserNameHelper: function (c, d) {
  8216.       var e = '[data-username="' + c + '"][data-role=username]';
  8217.       a('a' + e + ', span' + e).html(b.escape(d))
  8218.     },
  8219.     bindProfileUIListeners: function (a) {
  8220.       this.listenTo(a, {
  8221.         'change:avatar': function () {
  8222.           this.updateUserAvatarHelper(a.user.id, a.user.get('avatar').cache)
  8223.         },
  8224.         'change:name': function () {
  8225.           this.updateUserNameHelper(a.user.get('username'), a.user.get('name'))
  8226.         }
  8227.       })
  8228.     }
  8229.   },
  8230.   i = {
  8231.     toggleFollow: function (b) {
  8232.       b.preventDefault(),
  8233.       b.stopPropagation();
  8234.       var c,
  8235.       g = b && a(b.target).closest('a[data-user]').attr('data-user');
  8236.       c = this.collection && g ? this.collection.get(g) : this.user ? this.user : d.get(e.User, g);
  8237.       var h = f.get();
  8238.       return h.isLoggedOut() ? (this.trigger('authenticating'), this.listenToOnce(h, 'change:id', function () {
  8239.         h.isLoggedIn() && this.follow(c)
  8240.       }), h.get('sso') && h.get('sso').url ? void h.authenticate('sso') : void h.authenticate('disqusDotcom')) : void (c.get('isFollowing') ? this.unfollow(c) : this.follow(c))
  8241.     },
  8242.     unfollow: function (a) {
  8243.       a.unfollow(),
  8244.       c.trigger('uiAction:unfollowUser', a)
  8245.     },
  8246.     follow: function (a) {
  8247.       a.follow(),
  8248.       c.trigger('uiAction:followUser', a)
  8249.     }
  8250.   };
  8251.   return {
  8252.     FollowButtonMixin: i,
  8253.     UiActionEventProxy: g,
  8254.     ProfileHtmlHelpers: h
  8255.   }
  8256. }),
  8257. define('core/utils/isIframed', [
  8258. ], function () {
  8259.   'use strict';
  8260.   return function (a) {
  8261.     try {
  8262.       return a.self !== a.top
  8263.     } catch (b) {
  8264.       return !0
  8265.     }
  8266.   }
  8267. }),
  8268. define('core/utils/addElement', [
  8269. ], function () {
  8270.   'use strict';
  8271.   var a = window.document;
  8272.   return function (b, c, d) {
  8273.     var e = a.createElement(c);
  8274.     return d && Object.keys(d).forEach(function (a) {
  8275.       e.setAttribute(a, d[a])
  8276.     }),
  8277.     b.appendChild(e),
  8278.     e
  8279.   }
  8280. }),
  8281. define('core/utils/isMediaTradecraftAdEnabled', [
  8282.   'core/utils/url/parseQueryString',
  8283.   'core/switches',
  8284.   'core/utils/addElement'
  8285. ], function (a, b, c) {
  8286.   'use strict';
  8287.   function d() {
  8288.     var b = a();
  8289.     if (!window.isMtcAdded) {
  8290.       window.isMtcAdded = !0;
  8291.       var d = window.document.head;
  8292.       c(d, 'link', {
  8293.         rel: 'preconnect',
  8294.         href: 'https://01.cdn.mediatradecraft.com/',
  8295.         crossorigin: ''
  8296.       }),
  8297.       c(d, 'link', {
  8298.         rel: 'dns-prefetch',
  8299.         href: 'https://01.cdn.mediatradecraft.com/'
  8300.       }),
  8301.       c(d, 'link', {
  8302.         rel: 'preconnect',
  8303.         href: 'https://securepubads.g.doubleclick.net/',
  8304.         crossorigin: ''
  8305.       }),
  8306.       c(d, 'link', {
  8307.         rel: 'dns-prefetch',
  8308.         href: 'https://securepubads.g.doubleclick.net/'
  8309.       }),
  8310.       c(d, 'link', {
  8311.         rel: 'preconnect',
  8312.         href: 'https://c.amazon-adsystem.com/',
  8313.         crossorigin: ''
  8314.       }),
  8315.       c(d, 'link', {
  8316.         rel: 'dns-prefetch',
  8317.         href: 'https://c.amazon-adsystem.com/'
  8318.       }),
  8319.       c(d, 'link', {
  8320.         rel: 'preconnect',
  8321.         href: 'https://micro.rubiconproject.com/',
  8322.         crossorigin: ''
  8323.       }),
  8324.       c(d, 'link', {
  8325.         rel: 'dns-prefetch',
  8326.         href: 'https://micro.rubiconproject.com/'
  8327.       }),
  8328.       c(d, 'script', {
  8329.         src: 'https://c.amazon-adsystem.com/aax2/apstag.js',
  8330.         async: 'true'
  8331.       }),
  8332.       c(d, 'script', {
  8333.         src: 'https://securepubads.g.doubleclick.net/tag/js/gpt.js',
  8334.         async: 'true'
  8335.       }),
  8336.       'true' === b.mtctest && 'true' !== b.mtcprod ? (c(d, 'script', {
  8337.         src: 'https://01.cdn.mediatradecraft.com/disqus/stg/main.js',
  8338.         async: 'true'
  8339.       }), c(d, 'link', {
  8340.         href: 'https://01.cdn.mediatradecraft.com/disqus/stg/main.css',
  8341.         media: 'print',
  8342.         onload: 'this.media=\'all\'',
  8343.         rel: 'stylesheet'
  8344.       })) : (c(d, 'script', {
  8345.         src: 'https://01.cdn.mediatradecraft.com/disqus/main.js',
  8346.         async: 'true'
  8347.       }), c(d, 'link', {
  8348.         href: 'https://01.cdn.mediatradecraft.com/disqus/main.css',
  8349.         media: 'print',
  8350.         onload: 'this.media=\'all\'',
  8351.         rel: 'stylesheet'
  8352.       }))
  8353.     }
  8354.   }
  8355.   return function (c, e) {
  8356.     var f = a();
  8357.     if ('false' === f.mtctest) return !1;
  8358.     var g = (!e || !e.channelId || 'true' === f.mtctest || b.isFeatureActive('mtc_ads_channels')) && (c && 'mtcdisabled' === c.experiment.experiment && 'active' === c.experiment.variant || 'true' === f.mtctest || b.isFeatureActive('mtc_ads'));
  8359.     return g ? d() : window.isMtcAdded && location.reload(),
  8360.     g
  8361.   }
  8362. }),
  8363. define('core/viglink', [
  8364.   'remote/config'
  8365. ], function (a) {
  8366.   'use strict';
  8367.   var b = {
  8368.   },
  8369.   c = null;
  8370.   return b.resetVersion = function () {
  8371.     c = null
  8372.   },
  8373.   b.forceVersion = function (a) {
  8374.     c = a
  8375.   },
  8376.   b.getVersion = function () {
  8377.     return c ? c : a.lounge && a.lounge.viglink && a.lounge.viglink.version || 'none'
  8378.   },
  8379.   b.getExperimentVersion = function () {
  8380.     return a.lounge && a.lounge.viglink && a.lounge.viglink.experiment_version || 'none'
  8381.   },
  8382.   b
  8383. }),
  8384. define('common/outboundlinkhandler', [
  8385.   'jquery',
  8386.   'underscore',
  8387.   'core/utils',
  8388.   'common/utils'
  8389. ], function (a, b, c, d) {
  8390.   'use strict';
  8391.   function e() {
  8392.     this.handlers = [
  8393.     ],
  8394.     this.locked = {
  8395.     },
  8396.     this.timeout = 1000
  8397.   }
  8398.   return b.extend(e.prototype, {
  8399.     handleClick: function (d) {
  8400.       var e = a(d.currentTarget),
  8401.       f = this.getLinkTrackingId(e);
  8402.       if (this.shouldHandleClick(d, e, f)) {
  8403.         var g = b.chain(this.handlers).map(function (a) {
  8404.           return a[0].call(a[1], d, e)
  8405.         }).compact().value();
  8406.         c.willOpenNewWindow(d, e) || (d.preventDefault(), this.setLatestClick(f), this.delayNavigation(d, e, g))
  8407.       }
  8408.     },
  8409.     delayNavigation: function (c, e, f) {
  8410.       this.lockLink(this.getLinkTrackingId(e));
  8411.       var g = b.bind(function () {
  8412.         this.isLatestClick(this.getLinkTrackingId(e)) && d.triggerClick(e, c.originalEvent)
  8413.       }, this);
  8414.       b.delay(g, this.timeout),
  8415.       a.when.apply(a, f).always(g)
  8416.     },
  8417.     registerBeforeNavigationHandler: function (a, b) {
  8418.       this.handlers.push([a,
  8419.       b])
  8420.     },
  8421.     getLinkTrackingId: function (a) {
  8422.       var c = a.attr('data-tid');
  8423.       return c || (c = b.uniqueId(), a.attr('data-tid', c)),
  8424.       c
  8425.     },
  8426.     shouldHandleClick: function (a, b) {
  8427.       if (!this.isLinkLocked(this.getLinkTrackingId(b))) {
  8428.         if (a.isDefaultPrevented()) return !1;
  8429.         if (!b.is('a')) return !1;
  8430.         var c = /#.*/,
  8431.         d = (b.attr('href') || '').replace(c, '');
  8432.         return !!d
  8433.       }
  8434.     },
  8435.     setLatestClick: function (a) {
  8436.       this.latestLinkId = a
  8437.     },
  8438.     isLatestClick: function (a) {
  8439.       return this.latestLinkId === a
  8440.     },
  8441.     lockLink: function (a) {
  8442.       this.locked[a] = !0
  8443.     },
  8444.     isLinkLocked: function (a) {
  8445.       return this.locked[a]
  8446.     }
  8447.   }),
  8448.   e
  8449. }),
  8450. define('core/mixins/withEmailVerifyLink', [
  8451.   'jquery',
  8452.   'underscore',
  8453.   'core/config',
  8454.   'core/utils'
  8455. ], function (a, b, c, d) {
  8456.   'use strict';
  8457.   var e = d.preventDefaultHandler,
  8458.   f = {
  8459.     events: {
  8460.       'click [data-action=verify-email]': 'showVerifyEmailPopup'
  8461.     },
  8462.     showVerifyEmailPopup: e(function (b) {
  8463.       var e = a(b.target).attr('data-forum'),
  8464.       f = c.urls.verifyEmail;
  8465.       return e && (f = f + '?f=' + e),
  8466.       d.openWindow(f, '_blank', {
  8467.         width: 460,
  8468.         height: 355
  8469.       })
  8470.     })
  8471.   };
  8472.   return function () {
  8473.     this.events = b.defaults({
  8474.     }, this.events, f.events),
  8475.     b.extend(this, b.pick(f, 'showVerifyEmailPopup'))
  8476.   }
  8477. }),
  8478. define('core/constants/behindClickConstants', [
  8479.   'exports',
  8480.   'core/strings'
  8481. ], function (a, b) {
  8482.   'use strict';
  8483.   var c = b.get;
  8484.   a.DEFAULT_BUTTON_TEXT = b.interpolate(c('Show Comments (%(count)s)'), {
  8485.     count: '{postCount}'
  8486.   })
  8487. }),
  8488. define('core/templates/react/BehindClickTemplate', [
  8489.   'react',
  8490.   'core/constants/behindClickConstants'
  8491. ], function (a, b) {
  8492.   'use strict';
  8493.   function c(a) {
  8494.     if (!a || a.indexOf(':') === - 1) return {
  8495.     };
  8496.     var b = {
  8497.     },
  8498.     c = a.split(';');
  8499.     return c.forEach(function (a) {
  8500.       var c = a.split(':').map(function (a) {
  8501.         return a.trim()
  8502.       });
  8503.       if (c[0].indexOf('-') > 0) {
  8504.         var d = c[0].split('-');
  8505.         c[0] = d[0] + d[1].charAt(0).toUpperCase() + d[1].slice(1)
  8506.       }
  8507.       b[c.splice(0, 1) [0]] = c.join(':')
  8508.     }),
  8509.     b
  8510.   }
  8511.   function d(a, b) {
  8512.     return a ? a.replace('{postCount}', b.toLocaleString()) : a
  8513.   }
  8514.   var e = function (e) {
  8515.     var f = e.postCount,
  8516.     g = e.buttonText,
  8517.     h = e.buttonCSS,
  8518.     i = e.titleEnabled,
  8519.     j = e.titleText,
  8520.     k = e.titleCSS;
  8521.     return a.createElement('div', {
  8522.       id: 'behind-click__container'
  8523.     }, i ? a.createElement('h3', {
  8524.       id: 'behind-click__title',
  8525.       style: c(k)
  8526.     }, d(j, f)) : null, a.createElement('button', {
  8527.       id: 'thread-visibility__button',
  8528.       className: 'btn alert',
  8529.       'data-action': 'toggle-thread-visibility',
  8530.       style: c(h)
  8531.     }, g ? d(g, f) : d(b.DEFAULT_BUTTON_TEXT, f)))
  8532.   };
  8533.   return e
  8534. }),
  8535. define('templates/lounge/partials/badgesMessage', [
  8536.   'react',
  8537.   'core/strings',
  8538.   'core/switches',
  8539.   'core/bus'
  8540. ], function (a, b, c, d) {
  8541.   'use strict';
  8542.   var e = b.gettext,
  8543.   f = function (b) {
  8544.     var c = b.url;
  8545.     return a.createElement('a', {
  8546.       href: c,
  8547.       target: '_blank',
  8548.       rel: 'noopener noreferrer',
  8549.       className: 'policy-link publisher-anchor-color',
  8550.       onClick: function (a) {
  8551.         a.stopPropagation(),
  8552.         d.trigger('uiAction:clickBadgesMessage', c)
  8553.       }
  8554.     }, e('See the available badges'))
  8555.   },
  8556.   g = function (b) {
  8557.     var d = b.forum,
  8558.     g = b.forumBadgesLink,
  8559.     h = c.isFeatureActive('embed_refresh', {
  8560.       forum: d.id
  8561.     }),
  8562.     i = h ? 'comment-policy-refresh' : 'comment-policy',
  8563.     j = h ? 'comment-policy-refresh__text' : 'comment-policy-text',
  8564.     k = h ? 'comment-policy-refresh__heading' : 'comment-policy-text text-bold',
  8565.     l = h ? 'comment-policy-refresh__link' : 'comment-policy-link';
  8566.     return a.createElement('div', {
  8567.       id: 'badges-message',
  8568.       className: 'badges-message ' + i + ' publisher-anchor-color'
  8569.     }, a.createElement('span', {
  8570.       'data-action': 'close-badges-message',
  8571.       className: 'badges-message-close',
  8572.       tabIndex: '0'
  8573.     }), a.createElement('div', {
  8574.       className: 'content'
  8575.     }, a.createElement('p', {
  8576.       className: k
  8577.     }, e('Earn badges on %(forumName)s!', {
  8578.       forumName: d.name
  8579.     })), a.createElement('p', {
  8580.       className: j
  8581.     }, e('Badges are awarded for commenting, receiving upvotes, and other conditions established by the publisher. Awarded badges will be displayed next to your name in comments on this site as well as on your profile.'), a.createElement('p', {
  8582.       className: l
  8583.     }, a.createElement(f, {
  8584.       url: g,
  8585.       isRefreshEnabled: h
  8586.     })))), a.createElement('span', {
  8587.       'aria-hidden': 'true',
  8588.       className: 'badges-message-icon'
  8589.     }))
  8590.   };
  8591.   return g
  8592. }),
  8593. define('templates/lounge/partials/commentPolicy', [
  8594.   'react',
  8595.   'core/strings',
  8596.   'core/bus',
  8597.   'core/switches'
  8598. ], function (a, b, c, d) {
  8599.   'use strict';
  8600.   var e = b.gettext,
  8601.   f = function (b) {
  8602.     var d = b.url,
  8603.     e = b.className,
  8604.     f = void 0 === e ? '' : e,
  8605.     g = b.children,
  8606.     h = b.isRefreshEnabled,
  8607.     i = h ? 'comment-policy-refresh__link' : 'comment-policy-link';
  8608.     return a.createElement('a', {
  8609.       href: d,
  8610.       target: '_blank',
  8611.       rel: 'noopener noreferrer',
  8612.       className: f + ' ' + i,
  8613.       onClick: function (a) {
  8614.         a.stopPropagation(),
  8615.         c.trigger('uiAction:clickCommentPolicy', d)
  8616.       }
  8617.     }, g)
  8618.   },
  8619.   g = function (b) {
  8620.     var c = b.forum,
  8621.     d = b.isRefreshEnabled;
  8622.     if (!c.commentPolicyLink) return null;
  8623.     var g = e('Please read our %(commentPolicyLink)s before commenting.', {
  8624.       commentPolicyLink: a.createElement(f, {
  8625.         url: c.commentPolicyLink,
  8626.         isRefreshEnabled: d
  8627.       }, e('Comment Policy'))
  8628.     });
  8629.     return g
  8630.   },
  8631.   h = function (b) {
  8632.     var c = b.forum,
  8633.     f = b.isPolicyAccepted,
  8634.     h = d.isFeatureActive('embed_refresh', {
  8635.       forum: c.id
  8636.     }),
  8637.     i = h && d.isFeatureActive('embed_refresh_v2', {
  8638.       forum: c.id
  8639.     }),
  8640.     j = h ? 'comment-policy-refresh ' + (i ? 'comment-policy-refresh--v2' : '') : 'comment-policy',
  8641.     k = h ? 'comment-policy-refresh__text' : 'comment-policy-text',
  8642.     l = h ? 'comment-policy-refresh__heading' : 'comment-policy-text text-bold';
  8643.     return a.createElement('div', {
  8644.       id: 'comment-policy',
  8645.       className: j + ' publisher-anchor-color ' + (f ? 'hidden' : '')
  8646.     }, a.createElement('div', {
  8647.       className: 'content'
  8648.     }, a.createElement('p', {
  8649.       className: l
  8650.     }, e('%(forumName)s Comment Policy', {
  8651.       forumName: c.name
  8652.     })), a.createElement('p', {
  8653.       className: k
  8654.     }, c.commentPolicyText || null, a.createElement('p', {
  8655.       className: 'comment-policy-refresh__prompt'
  8656.     }, a.createElement(g, {
  8657.       forum: c,
  8658.       isRefreshEnabled: h
  8659.     })))), h ? a.createElement('button', {
  8660.       className: 'btn comment-policy-refresh__button publisher-background-color',
  8661.       'data-action': 'accept-comment-policy'
  8662.     }, e('Got it')) : a.createElement('span', {
  8663.       'aria-hidden': 'true',
  8664.       className: 'icon icon-chat-bubble'
  8665.     }))
  8666.   };
  8667.   return h
  8668. }),
  8669. define('core/templates/react/ThreadTemplate', [
  8670.   'react',
  8671.   'core/constants/voteConstants',
  8672.   'core/strings',
  8673.   'core/switches',
  8674.   'core/utils/object/get',
  8675.   'templates/lounge/partials/badgesMessage',
  8676.   'templates/lounge/partials/commentPolicy'
  8677. ], function (a, b, c, d, e, f, g) {
  8678.   'use strict';
  8679.   var h = c.gettext,
  8680.   i = function (b) {
  8681.     var c = d.isFeatureActive('embed_refresh', {
  8682.       forum: b.forum.id
  8683.     }),
  8684.     e = c && d.isFeatureActive('embed_refresh_v2', {
  8685.       forum: b.forum.id
  8686.     }),
  8687.     f = !1,
  8688.     i = c ? 'disqus-footer__wrapper disqus-footer__wrapper--refresh' : 'disqus-footer__wrapper',
  8689.     j = c ? 'load-more-refresh ' + (e ? 'load-more-refresh--v2' : '') : 'load-more',
  8690.     k = c ? 'btn load-more-refresh__button ' + (e ? '' : 'publisher-background-color-refresh') : 'btn load-more__button',
  8691.     l = c ? 'alert alert--realtime alert--realtime--refresh ' + (e ? 'alert--realtime--refresh-v2' : '') : 'alert alert--realtime',
  8692.     m = (b.forum.commentPolicyText || b.forum.commentPolicyLink) && !b.isPolicyAccepted,
  8693.     n = a.createElement('button', {
  8694.       className: l,
  8695.       style: {
  8696.         display: 'none'
  8697.       },
  8698.       'data-role': 'realtime-notification'
  8699.     }),
  8700.     o = f ? null : a.createElement('div', {
  8701.       id: 'highlighted-post',
  8702.       'data-tracking-area': 'highlighted',
  8703.       className: 'highlighted-post'
  8704.     });
  8705.     return a.createElement('div', {
  8706.       id: 'thread__wrapper'
  8707.     }, a.createElement('div', {
  8708.       id: 'placement-top',
  8709.       'data-tracking-area': 'discovery-north'
  8710.     }), a.createElement('div', {
  8711.       id: 'onboard',
  8712.       'data-tracking-area': 'onboard'
  8713.     }), m && c ? a.createElement(g, {
  8714.       forum: b.forum,
  8715.       isPolicyAccepted: b.isPolicyAccepted
  8716.     }) : null, a.createElement('div', {
  8717.       id: 'reactions__container'
  8718.     }), a.createElement('div', {
  8719.       id: 'ratings__container'
  8720.     }), m && !c ? a.createElement(g, {
  8721.       forum: b.forum,
  8722.       isPolicyAccepted: b.isPolicyAccepted
  8723.     }) : null, a.createElement('div', {
  8724.       id: 'badges-message__container'
  8725.     }), c ? null : o, a.createElement('div', {
  8726.       id: 'global-alert'
  8727.     }), a.createElement('div', {
  8728.       id: 'tos__container'
  8729.     }), b.inHome ? null : a.createElement('header', {
  8730.       id: 'main-nav',
  8731.       'data-tracking-area': 'main-nav'
  8732.     }), a.createElement('section', {
  8733.       id: 'conversation',
  8734.       'data-role': 'main',
  8735.       'data-tracking-area': 'main'
  8736.     }, a.createElement('div', {
  8737.       id: 'posts'
  8738.     }, a.createElement('div', {
  8739.       id: 'form',
  8740.       className: 'textarea-outer-wrapper--top-level'
  8741.     }), c ? null : n, a.createElement('div', {
  8742.       id: 'email-signup'
  8743.     }), a.createElement('div', {
  8744.       id: 'secondary-navigation'
  8745.     }), a.createElement('div', {
  8746.       id: 'no-posts',
  8747.       style: {
  8748.         display: 'none'
  8749.       }
  8750.     }), c ? o : null, c ? n : null, f ? a.createElement('div', {
  8751.       id: 'embed_v2-thread'
  8752.     }) : a.createElement('ul', {
  8753.       id: 'post-list',
  8754.       className: 'post-list loading'
  8755.     }), a.createElement('div', {
  8756.       className: j,
  8757.       'data-role': 'more',
  8758.       style: {
  8759.         display: 'none'
  8760.       }
  8761.     }, a.createElement('a', {
  8762.       href: '#',
  8763.       'data-action': 'more-posts',
  8764.       className: k
  8765.     }, h('Load more comments'))))), a.createElement('div', {
  8766.       id: 'placement-bottom',
  8767.       'data-tracking-area': 'discovery-south'
  8768.     }), b.hideFooter ? null : a.createElement('footer', {
  8769.       id: 'footer',
  8770.       'data-tracking-area': 'footer',
  8771.       className: i
  8772.     }))
  8773.   };
  8774.   return i
  8775. }),
  8776. define('lounge/menu-handler', [
  8777.   'jquery',
  8778.   'core/bus'
  8779. ], function (a, b) {
  8780.   'use strict';
  8781.   return {
  8782.     init: function (c) {
  8783.       function d() {
  8784.         a('.dropdown').removeClass('open')
  8785.       }
  8786.       a('html').on('click', d),
  8787.       a('body').delegate('[data-toggle]', 'click', function (b) {
  8788.         b.stopPropagation(),
  8789.         b.preventDefault();
  8790.         var e = a(b.currentTarget),
  8791.         f = e.closest('.' + e.attr('data-toggle')),
  8792.         g = 'disabled' !== f.attr('data-dropdown') && !f.hasClass('open');
  8793.         if (f.attr('data-dropdown', 'enabled'), d(), g) {
  8794.           f.addClass('open');
  8795.           var h = f.data('view-id');
  8796.           h && c.trigger('opened:' + h, f)
  8797.         }
  8798.       }),
  8799.       b.frame.on('window.click', d)
  8800.     }
  8801.   }
  8802. }),
  8803. define('lounge/mixins', [
  8804.   'core/utils/url/serialize',
  8805.   'core/strings'
  8806. ], function (a, b) {
  8807.   'use strict';
  8808.   var c = b.gettext,
  8809.   d = {
  8810.     _sharePopup: function (a, b) {
  8811.       return window.open(a, '_blank', b || 'width=550,height=520')
  8812.     },
  8813.     share: function (a) {
  8814.       this.sharers[a].call(this)
  8815.     },
  8816.     sharers: {
  8817.       twitter: function () {
  8818.         var b = 'https://twitter.com/intent/tweet',
  8819.         c = this.model.shortLink();
  8820.         this._sharePopup(a(b, {
  8821.           url: c,
  8822.           text: this.model.twitterText(c)
  8823.         }))
  8824.       },
  8825.       facebook: function () {
  8826.         this._sharePopup(a('https://www.facebook.com/sharer.php', {
  8827.           u: this.model.shortLink()
  8828.         }), 'width=655,height=352')
  8829.       },
  8830.       email: function () {
  8831.         window.location.href = a('mailto:', {
  8832.           subject: c('Somebody has shared this with you on Disqus'),
  8833.           body: c('Check out this discussion') + ': ' + this.model.shortLink()
  8834.         })
  8835.       }
  8836.     }
  8837.   },
  8838.   e = function () {
  8839.     function a() {
  8840.       return this.collapseTarget && this.collapseTarget.length || (this.collapseTarget = this.collapseTargetSelector ? this[this.collapseScope].find(this.collapseTargetSelector) : this[this.collapseScope]),
  8841.       this.collapseTarget
  8842.     }
  8843.     function b() {
  8844.       var b = this;
  8845.       if (b.isCollapseAllowed) {
  8846.         var c = a.call(b);
  8847.         c && c.length && (c.height(b.collapsedHeight), e.call(b))
  8848.       }
  8849.     }
  8850.     function c(a) {
  8851.       var b = this;
  8852.       if (b.collapseTarget && b.collapseTarget.length) {
  8853.         var c = b.collapseTarget;
  8854.         c.css('height', 'auto'),
  8855.         c.css('maxHeight', 'none'),
  8856.         f.call(b),
  8857.         a || (b.isCollapseAllowed = !1)
  8858.       }
  8859.     }
  8860.     function d() {
  8861.       return this.seeMoreButton && this.seeMoreButton.length || (this.seeMoreButton = a.call(this).siblings('[data-action=see-more]')),
  8862.       this.seeMoreButton
  8863.     }
  8864.     function e() {
  8865.       var a = this;
  8866.       d.call(this).removeClass('hidden').on('click', function () {
  8867.         a.expand()
  8868.       })
  8869.     }
  8870.     function f() {
  8871.       d.call(this).addClass('hidden').off('click')
  8872.     }
  8873.     return function (a) {
  8874.       var d = this;
  8875.       d.isCollapseAllowed = !0,
  8876.       d.collapsedHeight = a.collapsedHeight,
  8877.       d.collapseTargetSelector = a.collapseTargetSelector,
  8878.       d.collapseScope = a.collapseScope || '$el',
  8879.       d.collapse = b,
  8880.       d.expand = c
  8881.     }
  8882.   }();
  8883.   return {
  8884.     ShareMixin: d,
  8885.     asCollapsible: e
  8886.   }
  8887. }),
  8888. define('lounge/realtime', [
  8889.   'underscore',
  8890.   'backbone',
  8891.   'loglevel',
  8892.   'remote/config',
  8893.   'common/urls',
  8894.   'core/utils/url/serialize',
  8895.   'common/utils'
  8896. ], function (a, b, c, d, e, f, g) {
  8897.   'use strict';
  8898.   function h() {
  8899.     s.apply(this, arguments),
  8900.     this.marker = 0,
  8901.     this.interval = m,
  8902.     this._boundOnError = a.bind(this.onError, this),
  8903.     this._boundOnLoad = a.bind(this.onLoad, this),
  8904.     this._boundOnProgress = a.bind(this.onProgress, this)
  8905.   }
  8906.   function i() {
  8907.     s.apply(this, arguments),
  8908.     this.handshakeSuccess = null,
  8909.     this.interval = m,
  8910.     this.handshakeFails = 0,
  8911.     this._boundOnOpen = a.bind(this.onOpen, this),
  8912.     this._boundError = a.bind(this.onError, this),
  8913.     this._boundClose = a.bind(this.onClose, this),
  8914.     this._boundMessage = a.compose(a.bind(this.onMessage, this), function (a) {
  8915.       return JSON.parse(a.data)
  8916.     })
  8917.   }
  8918.   var j = d.lounge.REALTIME || {
  8919.   },
  8920.   k = j.EXP_BASE || 2,
  8921.   l = j.BACKOFF_LIMIT || 300,
  8922.   m = j.BACKOFF_INTERVAL || 1,
  8923.   n = j.MAX_HANDSHAKE_FAILS || 1,
  8924.   o = j.WEBSOCKETS_ENABLED !== !1 && window.WebSocket && 2 === window.WebSocket.CLOSING,
  8925.   p = j.XHR_ENABLED !== !1,
  8926.   q = function () {
  8927.   },
  8928.   r = function () {
  8929.     throw new Error('Pipe class cannot be used directly.')
  8930.   },
  8931.   s = function (b) {
  8932.     this.channel = b,
  8933.     this.connection = null,
  8934.     this.paused = !1,
  8935.     this._msgBuffer = [
  8936.     ],
  8937.     this._boundOpen = a.bind(this.open, this)
  8938.   };
  8939.   a.extend(s.prototype, b.Events, {
  8940.     getUrl: function (b) {
  8941.       var c = {
  8942.       };
  8943.       return a.extend(c, b),
  8944.       f(this.baseUrl + this.channel, c)
  8945.     },
  8946.     onMessage: function (a) {
  8947.       var b = a.message_type,
  8948.       d = a.firehose_id;
  8949.       this.lastEventId = d,
  8950.       c.debug('RT: new message:', b, d);
  8951.       var e = {
  8952.         type: b,
  8953.         data: a.message_body,
  8954.         lastEventId: d
  8955.       };
  8956.       this.trigger(b, e)
  8957.     },
  8958.     _msgToBuffer: function () {
  8959.       this._msgBuffer.push(a.toArray(arguments))
  8960.     },
  8961.     pause: function (a) {
  8962.       this.paused || (this.paused = !0, this._trigger = this.trigger, this.trigger = a === !1 ? q : this._msgToBuffer, c.debug('RT: paused, buffered: %s', a !== !1))
  8963.     },
  8964.     resume: function () {
  8965.       if (this.paused) {
  8966.         this.paused = !1,
  8967.         this.trigger = this._trigger,
  8968.         c.debug('RT: resumed, buffered messages: %s', this._msgBuffer.length);
  8969.         for (var a; a = this._msgBuffer.shift(); ) this.trigger.apply(this, a)
  8970.       }
  8971.     },
  8972.     open: r,
  8973.     close: function () {
  8974.       var a = this.connection;
  8975.       return !!a && (this.connection = null, a)
  8976.     }
  8977.   }),
  8978.   a.extend(h.prototype, s.prototype, {
  8979.     baseUrl: e.realertime + '/api/2/',
  8980.     onError: function () {
  8981.       this.connection && (this.connection = null, this.trigger('error', this), this.interval <= l && (this.interval *= k), c.info('RT: Connection error, backing off %s secs', this.interval), a.delay(this._boundOpen, 1000 * this.interval))
  8982.     },
  8983.     onLoad: function () {
  8984.       this.connection && (this.connection = null, this.trigger('success', this), a.defer(this._boundOpen))
  8985.     },
  8986.     onProgress: function () {
  8987.       if (this.connection) {
  8988.         var a,
  8989.         b,
  8990.         d,
  8991.         e,
  8992.         f = this.connection.responseText,
  8993.         g = 0;
  8994.         if (f && !(this.marker >= f.length)) {
  8995.           a = f.slice(this.marker).split('\n');
  8996.           for (var h = a.length, i = 0; i < h; i++) if (b = a[i], g += b.length + 1, d = b.replace(/^\s+|\s+$/g, '')) {
  8997.             try {
  8998.               e = JSON.parse(d)
  8999.             } catch (j) {
  9000.               if (i === h - 1) {
  9001.                 g -= b.length + 1;
  9002.                 break
  9003.               }
  9004.               c.debug('RT: unable to parse: ', d, b);
  9005.               continue
  9006.             }
  9007.             this.onMessage(e)
  9008.           } else c.debug('RT: ignoring empty row...');
  9009.           g > 0 && (this.marker += g - 1)
  9010.         }
  9011.       }
  9012.     },
  9013.     open: function () {
  9014.       this.close();
  9015.       var a = this.connection = g.CORS.request('GET', this.getUrl(), this._boundOnLoad, this._boundOnError);
  9016.       if (!a) return void c.debug('RT: Cannot use any cross-domain request tool with StreamPipe. Bailing out.');
  9017.       a.onprogress = this._boundOnProgress,
  9018.       this.connection = a,
  9019.       this.marker = 0;
  9020.       try {
  9021.         a.send()
  9022.       } catch (b) {
  9023.         this.connection = null,
  9024.         c.debug('RT: Attempt to send a CORS request failed.')
  9025.       }
  9026.     },
  9027.     close: function () {
  9028.       var a = s.prototype.close.apply(this);
  9029.       return a && a.abort()
  9030.     }
  9031.   }),
  9032.   a.extend(i.prototype, s.prototype, {
  9033.     baseUrl: 'wss:' + e.realertime + '/ws/2/',
  9034.     onOpen: function () {
  9035.       c.debug('RT: [Socket] Connection established.'),
  9036.       this.handshakeSuccess = !0
  9037.     },
  9038.     onError: function () {
  9039.       if (!this.handshakeSuccess) {
  9040.         if (this.handshakeFails >= n) return c.debug('RT: [Socket] Error before open, bailing out.'),
  9041.         void this.trigger('fail');
  9042.         this.handshakeFails += 1
  9043.       }
  9044.       this.connection && (this.connection = null, this.trigger('error'), this.interval <= l && (this.interval *= k), c.error('RT: Connection error, backing off %s secs', this.interval), a.delay(this._boundOpen, 1000 * this.interval))
  9045.     },
  9046.     onClose: function (a) {
  9047.       if (this.connection) {
  9048.         if (!a.wasClean) return this.onError();
  9049.         this.connection = null,
  9050.         c.debug('RT: [Socket] Connection closed. Restarting...'),
  9051.         this.trigger('close'),
  9052.         this.open()
  9053.       }
  9054.     },
  9055.     open: function () {
  9056.       this.close();
  9057.       try {
  9058.         this.connection = new window.WebSocket(this.getUrl())
  9059.       } catch (a) {
  9060.         return this.onError()
  9061.       }
  9062.       var b = this.connection;
  9063.       b.onopen = this._boundOnOpen,
  9064.       b.onerror = this._boundError,
  9065.       b.onmessage = this._boundMessage,
  9066.       b.onclose = this._boundClose
  9067.     },
  9068.     close: function () {
  9069.       var a = s.prototype.close.apply(this);
  9070.       return a && a.close()
  9071.     }
  9072.   });
  9073.   var t = {
  9074.     _wsSupported: o,
  9075.     initialize: function (b, c, d) {
  9076.       this.close(),
  9077.       this._initArgs = [
  9078.         b,
  9079.         c,
  9080.         d
  9081.       ];
  9082.       var e = this._wsSupported,
  9083.       f = e && i || p && h;
  9084.       if (f) {
  9085.         var g = this.pipe = new f(b);
  9086.         a.chain(c).pairs().each(function (a) {
  9087.           g.on(a[0], a[1], d)
  9088.         }),
  9089.         e && g.on('fail', function () {
  9090.           this._wsSupported = !1,
  9091.           g.off(),
  9092.           this.initialize.apply(this, this._initArgs)
  9093.         }, this),
  9094.         g.open()
  9095.       }
  9096.     },
  9097.     pause: function (a) {
  9098.       this.pipe && this.pipe.pause(a)
  9099.     },
  9100.     resume: function () {
  9101.       this.pipe && this.pipe.resume()
  9102.     },
  9103.     close: function () {
  9104.       this.pipe && (this.pipe.close(), this.pipe = null)
  9105.     }
  9106.   };
  9107.   return window.addEventListener('unload', a.bind(t.close, t)),
  9108.   {
  9109.     Pipe: s,
  9110.     StreamPipe: h,
  9111.     SocketPipe: i,
  9112.     Manager: t,
  9113.     MAX_HANDSHAKE_FAILS: n
  9114.   }
  9115. }),
  9116. define('lounge/views/badges-message', [
  9117.   'jquery',
  9118.   'underscore',
  9119.   'backbone',
  9120.   'react',
  9121.   'react-dom',
  9122.   'core/switches',
  9123.   'core/common/cached-storage',
  9124.   'templates/lounge/partials/badgesMessage'
  9125. ], function (a, b, c, d, e, f, g, h) {
  9126.   'use strict';
  9127.   var i = new g('badges-message', 7776000);
  9128.   i.getAll();
  9129.   var j = c.View.extend({
  9130.     events: {
  9131.       'click [data-action=close-badges-message]': 'handleDismiss',
  9132.       'keyup [data-action=close-badges-message]': 'handleDismiss'
  9133.     },
  9134.     initialize: function (a) {
  9135.       b.extend(this, b.pick(a, [
  9136.         'forum',
  9137.         'session'
  9138.       ])),
  9139.       this.model = new c.Model({
  9140.         dismissed: Boolean(i.getItem(this.forum.id))
  9141.       }),
  9142.       this.handleDismiss = this.handleDismiss.bind(this),
  9143.       this.listenTo(this.model, 'change', this.render)
  9144.     },
  9145.     handleDismiss: function (a) {
  9146.       var b = 13;
  9147.       if (!a.keyCode || a.keyCode === b) return this.model.set('dismissed', !0),
  9148.       i.setItem(this.forum.id, !0),
  9149.       Promise.resolve()
  9150.     },
  9151.     render: function () {
  9152.       var a = this.forum.get('badges');
  9153.       if (!a || !Object.keys(a).length || this.model.get('dismissed')) return this.$el.empty(),
  9154.       this;
  9155.       var b = '//disqus.com/home/forum/' + this.forum.get('id') + '/badges';
  9156.       return e.render(d.createElement(h, {
  9157.         forum: this.forum.toJSON(),
  9158.         forumBadgesLink: b
  9159.       }), this.el),
  9160.       this
  9161.     }
  9162.   });
  9163.   return j
  9164. }),
  9165. define('core/templates/react/aet/EmailSignupComplete', [
  9166.   'react',
  9167.   'core/switches'
  9168. ], function (a, b) {
  9169.   'use strict';
  9170.   var c = function (c) {
  9171.     var d = c.forum,
  9172.     e = c.isVerified,
  9173.     f = c.onDismiss;
  9174.     return a.createElement('div', {
  9175.       className: 'newsletter-box spacing-bottom-large text-center'
  9176.     }, a.createElement('div', {
  9177.       className: b.isFeatureActive('embed_refresh', {
  9178.         forum: d.name
  9179.       }) ? 'text-large spacing-bottom-small' : 'text-medium spacing-bottom-small'
  9180.     }, a.createElement('strong', null, 'Thanks for subscribing!')), e ? a.createElement('div', {
  9181.       className: 'spacing-bottom-small'
  9182.     }, (d.aetBannerConfirmation || '').split('\n').map(function (b, c) {
  9183.       return a.createElement('div', {
  9184.         key: c
  9185.       }, b)
  9186.     })) : a.createElement('div', {
  9187.       className: 'spacing-bottom-small'
  9188.     }, 'To begin receiving email updates from ', d.name, ', please click the link in the confirmation email we\'ve sent to your inbox.'), a.createElement('a', {
  9189.       className: 'newsletter-box__hide',
  9190.       href: '#',
  9191.       onClick: function (a) {
  9192.         a.preventDefault(),
  9193.         f()
  9194.       }
  9195.     }, 'Dismiss this message'))
  9196.   };
  9197.   return c
  9198. }),
  9199. define('core/templates/react/aet/EmailSignupForm', [
  9200.   'react',
  9201.   'core/strings',
  9202.   'core/switches'
  9203. ], function (a, b, c) {
  9204.   'use strict';
  9205.   var d = b.gettext,
  9206.   e = function (b) {
  9207.     var e = b.forum,
  9208.     f = b.isLoading,
  9209.     g = b.isLoggedIn,
  9210.     h = b.onDismiss,
  9211.     i = b.onSubscribe,
  9212.     j = b.allowEmpty;
  9213.     return a.createElement('div', {
  9214.       className: 'newsletter-box spacing-bottom-large'
  9215.     }, a.createElement('div', {
  9216.       className: c.isFeatureActive('embed_refresh', {
  9217.         forum: e.name
  9218.       }) ? 'text-large spacing-bottom-small' : 'text-medium spacing-bottom-small'
  9219.     }, a.createElement('strong', null, e.aetBannerTitle)), g ? a.createElement('button', {
  9220.       className: 'button button-fill--brand button-padding-wider pull-right',
  9221.       disabled: f,
  9222.       onClick: function () {
  9223.         i && i()
  9224.       }
  9225.     }, 'Subscribe') : null, a.createElement('div', {
  9226.       className: 'spacing-bottom'
  9227.     }, (e.aetBannerDescription || '').split('\n').map(function (b, c) {
  9228.       return a.createElement('div', {
  9229.         key: c
  9230.       }, b)
  9231.     })), a.createElement('div', {
  9232.       className: 'align align--wrap'
  9233.     }, g ? null : a.createElement('form', {
  9234.       className: 'align__item--grow',
  9235.       onSubmit: function (a) {
  9236.         a.preventDefault();
  9237.         var b = a.target.elements.email.value.trim();
  9238.         (b || j) && i && i(b)
  9239.       }
  9240.     }, a.createElement('div', {
  9241.       className: 'newsletter-box__input-group'
  9242.     }, a.createElement('span', {
  9243.       className: 'icon icon-mail text-large newsletter-box__input-group__icon'
  9244.     }), a.createElement('input', {
  9245.       type: 'email',
  9246.       name: 'email',
  9247.       placeholder: d('Enter email address'),
  9248.       'aria-label': 'Enter your email address here to opt into receiving a weekly digest of the latest articles from this publisher'
  9249.     })), a.createElement('input', {
  9250.       type: 'submit',
  9251.       className: 'button button-fill--brand button-padding-wider newsletter-box__submit',
  9252.       disabled: f,
  9253.       value: d('Subscribe'),
  9254.       'aria-label': 'Submit your email address'
  9255.     })), a.createElement('a', {
  9256.       href: '#',
  9257.       className: 'newsletter-box__hide publisher-anchor-color',
  9258.       onClick: function (a) {
  9259.         a.preventDefault(),
  9260.         h && h()
  9261.       }
  9262.     }, d('Hide this message'))))
  9263.   };
  9264.   return e
  9265. }),
  9266. define('lounge/views/email-signup', [
  9267.   'backbone',
  9268.   'react',
  9269.   'react-dom',
  9270.   'stance',
  9271.   'core/api',
  9272.   'core/bus',
  9273.   'core/templates/react/aet/EmailSignupComplete',
  9274.   'core/templates/react/aet/EmailSignupForm',
  9275.   'core/common/cached-storage'
  9276. ], function (a, b, c, d, e, f, g, h, i) {
  9277.   'use strict';
  9278.   var j = 0,
  9279.   k = 2,
  9280.   l = new i('aet-dismiss');
  9281.   l.getAll();
  9282.   var m = a.View.extend({
  9283.     initialize: function (b) {
  9284.       var c = b.forum,
  9285.       d = b.session;
  9286.       this.forum = c,
  9287.       this.session = d,
  9288.       this.model = new a.Model({
  9289.         dismissed: Boolean(l.getItem(this.forum.id)),
  9290.         loading: !1,
  9291.         signupComplete: !1
  9292.       }),
  9293.       this._isFirstRender = !0,
  9294.       this.handleCompleteDismiss = this.handleCompleteDismiss.bind(this),
  9295.       this.handleDismiss = this.handleDismiss.bind(this),
  9296.       this.handleSubscribe = this.handleSubscribe.bind(this),
  9297.       this.listenTo(this.model, 'change', this.render),
  9298.       this.listenTo(this.session, 'change', this.render)
  9299.     },
  9300.     getTrackingCopy: function () {
  9301.       return {
  9302.         title: this.forum.get('aetBannerTitle'),
  9303.         description_copy: this.forum.get('aetBannerDescription'),
  9304.         confirmation_copy: this.forum.get('aetBannerConfirmation')
  9305.       }
  9306.     },
  9307.     isLoggedIn: function () {
  9308.       return Boolean(this.session.user && this.session.user.id)
  9309.     },
  9310.     handleDismiss: function () {
  9311.       return this.model.set('dismissed', !0),
  9312.       f.trigger('uiAction:clickEmailSubscriptionPromptDismiss', this.getTrackingCopy()),
  9313.       this.isLoggedIn() ? Promise.resolve(e.call('aet/dismiss', {
  9314.         data: {
  9315.           forum: this.forum.id
  9316.         },
  9317.         method: 'POST'
  9318.       })) : (l.setItem(this.forum.id, !0), Promise.resolve())
  9319.     },
  9320.     handleCompleteDismiss: function () {
  9321.       this.model.set('dismissed', !0)
  9322.     },
  9323.     handleSubscribe: function () {
  9324.       var a = this,
  9325.       b = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : null;
  9326.       if (!this.model.get('loading')) return f.trigger('uiAction:clickEmailSubscriptionPromptSubscribe', this.getTrackingCopy()),
  9327.       this.model.set('loading', !0),
  9328.       Promise.resolve(b ? e.call('aet/anonymousSubscribe', {
  9329.         data: {
  9330.           email: b,
  9331.           forum: this.forum.id
  9332.         },
  9333.         method: 'POST'
  9334.       }) : e.call('aet/subscribe', {
  9335.         data: {
  9336.           forum: this.forum.id
  9337.         },
  9338.         method: 'POST'
  9339.       })).then(function (b) {
  9340.         return a.model.set({
  9341.           loading: !1,
  9342.           signupComplete: !0
  9343.         }),
  9344.         b
  9345.       }) ['catch'](function () {
  9346.         a.model.set('loading', !1)
  9347.       })
  9348.     },
  9349.     reportView: function () {
  9350.       f.trigger('uiAction:viewEmailSubscriptionPrompt', this.getTrackingCopy())
  9351.     },
  9352.     render: function () {
  9353.       if (!this.forum.get('aetEnabled') || this.model.get('dismissed')) return this.$el.empty(),
  9354.       this;
  9355.       var a = this.session.shouldFetchSession() ? this.session.get('aetBannerStatus') : j;
  9356.       switch (a) {
  9357.         case j:
  9358.         case k:
  9359.           if (this.model.get('signupComplete') || a === k ? c.render(b.createElement(g, {
  9360.             forum: this.forum.toJSON(),
  9361.             isVerified: Boolean(this.session.user && this.session.user.get('isVerified')),
  9362.             onDismiss: this.handleCompleteDismiss
  9363.           }), this.el) : c.render(b.createElement(h, {
  9364.             forum: this.forum.toJSON(),
  9365.             isLoading: this.model.get('loading'),
  9366.             isLoggedIn: this.isLoggedIn(),
  9367.             onDismiss: this.handleDismiss,
  9368.             onSubscribe: this.handleSubscribe
  9369.           }), this.el), this._isFirstRender) {
  9370.             this._isFirstRender = !1,
  9371.             f.trigger('uiAction:loadEmailSubscriptionPrompt', this.getTrackingCopy());
  9372.             var e = d(this);
  9373.             e.isVisible() ? this.reportView() : this.listenToOnce(e, 'enter', this.reportView)
  9374.           }
  9375.           break;
  9376.         default:
  9377.           this.$el.empty()
  9378.       }
  9379.       return this
  9380.     }
  9381.   });
  9382.   return m
  9383. }),
  9384. define('react-dom/server', [
  9385.   'underscore'
  9386. ], function (a) {
  9387.   'use strict';
  9388.   var b = function c(b) {
  9389.     if (null === b) return '';
  9390.     if (a.isArray(b)) return b.map(c).join('');
  9391.     if (a.isElement(b)) return b.outerHTML;
  9392.     if (b && b.nodeType === window.Node.DOCUMENT_FRAGMENT_NODE) {
  9393.       var d = window.document.createElement('div');
  9394.       return d.appendChild(b),
  9395.       d.innerHTML
  9396.     }
  9397.     return a.escape(String(b))
  9398.   };
  9399.   return {
  9400.     renderToString: b,
  9401.     renderToStaticMarkup: b
  9402.   }
  9403. }),
  9404. define('core/utils/media/upload', [
  9405.   'underscore',
  9406.   'exports',
  9407.   'core/api',
  9408.   'core/models/Media',
  9409.   'core/UniqueModel'
  9410. ], function (a, b, c, d, e) {
  9411.   'use strict';
  9412.   b.uploadSupported = Boolean(window.FormData),
  9413.   b._extractFirstImageFile = function (b) {
  9414.     return a.find(b, function (a) {
  9415.       return a.type.match(/^image\//)
  9416.     })
  9417.   },
  9418.   b._uploadViaApi = function (a, b, d) {
  9419.     return Promise.resolve(c.call(a, {
  9420.       data: b,
  9421.       contentType: !1,
  9422.       processData: !1,
  9423.       method: 'POST',
  9424.       xhr: function () {
  9425.         var a = new window.XMLHttpRequest,
  9426.         b = d && d.onProgress;
  9427.         return b && a.upload.addEventListener('progress', function (a) {
  9428.           a.total && b(100 * a.loaded / a.total)
  9429.         }),
  9430.         a
  9431.       }
  9432.     }))
  9433.   },
  9434.   b.UPLOAD_URL = 'https://uploads.services.disqus.com/api/3.0/media/create.json',
  9435.   b.uploadMediaUrl = function (c, f) {
  9436.     var g,
  9437.     h = new window.FormData,
  9438.     i = b._extractFirstImageFile(c);
  9439.     return i ? (h.append('upload', i), h.append('permanent', 1), b._uploadViaApi(b.UPLOAD_URL, h, f).then(function (b) {
  9440.       var c = b.response,
  9441.       f = a.first(a.values(c));
  9442.       if (!f || !f.ok) throw g = new Error('Upload failed'),
  9443.       g.code = f && f['error-code'],
  9444.       g;
  9445.       return new e(d, {
  9446.         mediaType: d.MEDIA_TYPES.IMAGE_UPLOAD,
  9447.         url: f.url,
  9448.         thumbnailUrl: f.url
  9449.       })
  9450.     }, function (a) {
  9451.       if (a.responseJSON && 4 === a.responseJSON.code) throw g = new Error('Upload failed'),
  9452.       g.code = 'not-authenticated',
  9453.       g;
  9454.       throw a
  9455.     })) : (g = new Error('No image file to upload'), g.code = 'invalid-content-type', Promise.reject(g))
  9456.   }
  9457. }),
  9458. define('core/views/media/DragDropUploadView', [
  9459.   'underscore',
  9460.   'backbone',
  9461.   'core/utils'
  9462. ], function (a, b, c) {
  9463.   'use strict';
  9464.   var d = c.stopEventHandler,
  9465.   e = b.View.extend({
  9466.     events: {
  9467.       dragover: '_dragOn',
  9468.       dragenter: '_dragOn',
  9469.       dragleave: '_dragOff',
  9470.       dragexit: '_dragOff',
  9471.       drop: '_drop'
  9472.     },
  9473.     _dragOn: d(function () {
  9474.       this.trigger('uploader:dragEnter'),
  9475.       this._toggleDragPlaceholder(!0)
  9476.     }),
  9477.     _dragOff: d(function () {
  9478.       this._toggleDragPlaceholder(!1)
  9479.     }),
  9480.     _drop: d(function (a) {
  9481.       this._toggleDragPlaceholder(!1);
  9482.       var b = a.originalEvent.dataTransfer.files;
  9483.       return b.length ? void this.trigger('uploader:attachMedia', b) : void this.trigger('uploader:dropError', 'No files')
  9484.     }),
  9485.     _toggleDragPlaceholder: a.throttle(function (a) {
  9486.       a ? this.trigger('uploader:showPlaceholder') : this.trigger('uploader:hidePlaceholder')
  9487.     }, 50)
  9488.   });
  9489.   return e
  9490. }),
  9491. define('core/templates/postMediaUploadButton', [
  9492.   'handlebars',
  9493.   'core/templates/handlebars.partials',
  9494.   'core/extensions/handlebars.helpers'
  9495. ], function (a) {
  9496.   return a.template({
  9497.     compiler: [
  9498.       8,
  9499.       '>= 4.3.0'
  9500.     ],
  9501.     main: function (a, b, c, d, e) {
  9502.       return '<a href="#" data-action="attach" class="attach" title="' + a.escapeExpression(c.gettext.call(null != b ? b : a.nullContext || {
  9503.       }, 'Upload Images', {
  9504.         name: 'gettext',
  9505.         hash: {
  9506.         },
  9507.         data: e,
  9508.         loc: {
  9509.           start: {
  9510.             line: 1,
  9511.             column: 55
  9512.           },
  9513.           end: {
  9514.             line: 1,
  9515.             column: 82
  9516.           }
  9517.         }
  9518.       })) + '" tabIndex="0" aria-label="Open file attachment menu">\n<div class="wysiwyg__attach wysiwyg__attach-dims"\nrole="img"\n/>\n</a>\n<input type="file" data-role="media-upload" tabIndex="-1" accept="image/*">\n'
  9519.     },
  9520.     useData: !0
  9521.   })
  9522. }),
  9523. define('core/views/media/UploadButtonView', [
  9524.   'jquery',
  9525.   'underscore',
  9526.   'backbone',
  9527.   'core/templates/postMediaUploadButton',
  9528.   'core/utils'
  9529. ], function (a, b, c, d, e) {
  9530.   'use strict';
  9531.   var f = e.stopEventHandler,
  9532.   g = 'input[type=file][data-role=media-upload]',
  9533.   h = c.View.extend({
  9534.     events: function () {
  9535.       var a = {
  9536.         'click [data-action=attach]': '_attachMedia',
  9537.         'keydown [data-action=attach]': 'keydownHandler'
  9538.       };
  9539.       return a['change ' + g] = '_selectorChange',
  9540.       a
  9541.     }(),
  9542.     initialize: function (a) {
  9543.       this.template = a && a.template || this.generateImageUploadButton
  9544.     },
  9545.     keydownHandler: function (a) {
  9546.       var b = 13,
  9547.       c = 32;
  9548.       a.keyCode !== b && a.keyCode !== c || (a.preventDefault(), this._attachMedia())
  9549.     },
  9550.     generateImageUploadButton: function () {
  9551.       return d({
  9552.         imageUrl: 'https://c.disquscdn.com/next/embed/assets/img/attach.03c320b14aa9c071da30c904d0a0827f.svg'
  9553.       })
  9554.     },
  9555.     render: function () {
  9556.       return this.$el.html(this.template()),
  9557.       this
  9558.     },
  9559.     _attachMedia: f(b.throttle(function () {
  9560.       this.$(g).click()
  9561.     }, 1000, {
  9562.       trailing: !1
  9563.     })),
  9564.     _selectorChange: function (b) {
  9565.       var c = b.target,
  9566.       d = c.files;
  9567.       d.length && (this.trigger('uploader:attachMedia', d), a(c).replaceWith(c.cloneNode()))
  9568.     }
  9569.   });
  9570.   return h
  9571. }),
  9572. define('core/templates/postMediaUploadProgress', [
  9573.   'handlebars',
  9574.   'core/templates/handlebars.partials',
  9575.   'core/extensions/handlebars.helpers'
  9576. ], function (a) {
  9577.   return a.template({
  9578.     1: function (a, b, c, d, e) {
  9579.       return '<li>\n<div class="media-progress-box">\n<div class="media-progress">\n<div class="bar" style="right: ' + a.escapeExpression(a.lambda(null != b ? b.remainingPerc : b, b)) + '%"></div>\n</div>\n</div>\n</li>\n'
  9580.     },
  9581.     compiler: [
  9582.       8,
  9583.       '>= 4.3.0'
  9584.     ],
  9585.     main: function (a, b, c, d, e) {
  9586.       var f;
  9587.       return null != (f = c.each.call(null != b ? b : a.nullContext || {
  9588.       }, null != b ? b.collection : b, {
  9589.         name: 'each',
  9590.         hash: {
  9591.         },
  9592.         fn: a.program(1, e, 0),
  9593.         inverse: a.noop,
  9594.         data: e,
  9595.         loc: {
  9596.           start: {
  9597.             line: 1,
  9598.             column: 0
  9599.           },
  9600.           end: {
  9601.             line: 9,
  9602.             column: 9
  9603.           }
  9604.         }
  9605.       })) ? f : ''
  9606.     },
  9607.     useData: !0
  9608.   })
  9609. }),
  9610. define('core/views/media/UploadsProgressSubView', [
  9611.   'backbone',
  9612.   'core/templates/postMediaUploadProgress'
  9613. ], function (a, b) {
  9614.   'use strict';
  9615.   var c = a.View.extend({
  9616.     initialize: function () {
  9617.       this.collection = new a.Collection,
  9618.       this.listenTo(this.collection, 'add remove change', this.render)
  9619.     },
  9620.     hasVisible: function () {
  9621.       return Boolean(this.collection.length)
  9622.     },
  9623.     render: function () {
  9624.       return this.$el.html(b({
  9625.         collection: this.collection.toJSON()
  9626.       })),
  9627.       this
  9628.     }
  9629.   });
  9630.   return c
  9631. }),
  9632. define('core/templates/postMediaUploadRich', [
  9633.   'handlebars',
  9634.   'core/templates/handlebars.partials',
  9635.   'core/extensions/handlebars.helpers'
  9636. ], function (a) {
  9637.   return a.template({
  9638.     1: function (a, b, c, d, e) {
  9639.       return '<video src="' + a.escapeExpression(a.lambda(null != b ? b.thumbnailUrl : b, b)) + '" autoplay muted loop></video>\n'
  9640.     },
  9641.     3: function (a, b, c, d, e) {
  9642.       var f;
  9643.       return '<img src="' + a.escapeExpression(a.lambda(null != b ? b.thumbnailUrl : b, b)) + '" alt="' + (null != (f = c['if'].call(null != b ? b : a.nullContext || {
  9644.       }, null != (f = null != b ? b.media : b) ? f.title : f, {
  9645.         name: 'if',
  9646.         hash: {
  9647.         },
  9648.         fn: a.program(4, e, 0),
  9649.         inverse: a.program(6, e, 0),
  9650.         data: e,
  9651.         loc: {
  9652.           start: {
  9653.             line: 9,
  9654.             column: 33
  9655.           },
  9656.           end: {
  9657.             line: 9,
  9658.             column: 112
  9659.           }
  9660.         }
  9661.       })) ? f : '') + '">\n'
  9662.     },
  9663.     4: function (a, b, c, d, e) {
  9664.       var f;
  9665.       return a.escapeExpression(a.lambda(null != (f = null != b ? b.media : b) ? f.title : f, b))
  9666.     },
  9667.     6: function (a, b, c, d, e) {
  9668.       return a.escapeExpression(c.gettext.call(null != b ? b : a.nullContext || {
  9669.       }, 'Media attachment', {
  9670.         name: 'gettext',
  9671.         hash: {
  9672.         },
  9673.         data: e,
  9674.         loc: {
  9675.           start: {
  9676.             line: 9,
  9677.             column: 75
  9678.           },
  9679.           end: {
  9680.             line: 9,
  9681.             column: 105
  9682.           }
  9683.         }
  9684.       }))
  9685.     },
  9686.     compiler: [
  9687.       8,
  9688.       '>= 4.3.0'
  9689.     ],
  9690.     main: function (a, b, c, d, e) {
  9691.       var f;
  9692.       return '<li class="publisher-border-color">\n<div class="media-box">\n<div class="media-ct">\n<div class="media-surface">\n<a href="' + a.escapeExpression(a.lambda(null != (f = null != b ? b.media : b) ? f.url : f, b)) + '" target="_blank">\n' + (null != (f = c['if'].call(null != b ? b : a.nullContext || {
  9693.       }, null != b ? b.isVideo : b, {
  9694.         name: 'if',
  9695.         hash: {
  9696.         },
  9697.         fn: a.program(1, e, 0),
  9698.         inverse: a.program(3, e, 0),
  9699.         data: e,
  9700.         loc: {
  9701.           start: {
  9702.             line: 6,
  9703.             column: 0
  9704.           },
  9705.           end: {
  9706.             line: 10,
  9707.             column: 7
  9708.           }
  9709.         }
  9710.       })) ? f : '') + '</a>\n</div>\n</div>\n</div>\n</li>\n'
  9711.     },
  9712.     useData: !0
  9713.   })
  9714. }),
  9715. define('core/views/media/UploadsRichSubView', [
  9716.   'underscore',
  9717.   'backbone',
  9718.   'core/models/Media',
  9719.   'core/UniqueModel',
  9720.   'core/utils',
  9721.   'core/templates/postMediaUploadRich'
  9722. ], function (a, b, c, d, e, f) {
  9723.   'use strict';
  9724.   var g = b.View.extend({
  9725.     initialize: function () {
  9726.       this._hasVisible = !1,
  9727.       this.collection = new b.Collection([], {
  9728.         model: c,
  9729.         comparator: 'index'
  9730.       }),
  9731.       this.listenTo(this.collection, 'add remove reset sort change:thumbnailUrl change:mediaType change:editsFinished', this.render),
  9732.       this.listenTo(this.collection, 'change:index', a.bind(this.collection.sort, this.collection))
  9733.     },
  9734.     render: function () {
  9735.       return this.$el.empty(),
  9736.       this._hasVisible = !1,
  9737.       this.collection.each(function (b) {
  9738.         b.get('thumbnailUrl') && (a.contains(c.WEBPAGE_TYPES, b.get('mediaType')) || b.get('editsFinished') && (this.$el.append(f({
  9739.           media: b.toJSON(),
  9740.           isVideo: this.isVideo(b),
  9741.           thumbnailUrl: b.get('thumbnailUrl')
  9742.         })), this._hasVisible = !0))
  9743.       }, this),
  9744.       this
  9745.     },
  9746.     isVideo: function (a) {
  9747.       return a.get('mediaType') === c.MEDIA_TYPES.MP4_VIDEO
  9748.     },
  9749.     hasVisible: function () {
  9750.       return this._hasVisible
  9751.     },
  9752.     addMedia: function (a, b) {
  9753.       var e = d.get(c, a.url);
  9754.       if (e) e.set(a);
  9755.        else {
  9756.         if (!a.editsFinished) return;
  9757.         e = new d(c, a),
  9758.         e.fetch(b)
  9759.       }
  9760.       return this.collection.add(e),
  9761.       e
  9762.     },
  9763.     updateFromText: function (b, c, d) {
  9764.       if (!b) return void this.collection.reset();
  9765.       var f = e.bleachFindUrls(b);
  9766.       f = a.uniq(f, !1, function (a) {
  9767.         return a.url
  9768.       });
  9769.       var g = {
  9770.       };
  9771.       a.each(f, function (e) {
  9772.         g[e.url] = !0;
  9773.         var f = a.pick(e, 'index', 'url'),
  9774.         h = e.index < c && c <= e.endIndex || '.' === b[e.endIndex];
  9775.         h && !d.isPasteEvent || (f.editsFinished = !0),
  9776.         this.addMedia(f, d)
  9777.       }, this);
  9778.       var h = this.collection.pluck('url');
  9779.       g = a.keys(g);
  9780.       var i = a.difference(h, g);
  9781.       this.collection.remove(this.collection.filter(function (b) {
  9782.         return a.contains(i, b.get('url'))
  9783.       }))
  9784.     }
  9785.   });
  9786.   return g
  9787. }),
  9788. define('core/templates/postMediaUploads', [
  9789.   'handlebars',
  9790.   'core/templates/handlebars.partials',
  9791.   'core/extensions/handlebars.helpers'
  9792. ], function (a) {
  9793.   return a.template({
  9794.     compiler: [
  9795.       8,
  9796.       '>= 4.3.0'
  9797.     ],
  9798.     main: function (a, b, c, d, e) {
  9799.       return '<ul data-role="media-progress-list"></ul>\n<ul data-role="media-rich-list"></ul>\n<div class="media-expanded empty" data-role="media-preview-expanded">\n<img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=="\ndata-role="media-preview-expanded-image" alt="' + a.escapeExpression(c.gettext.call(null != b ? b : a.nullContext || {
  9800.       }, 'Media preview placeholder', {
  9801.         name: 'gettext',
  9802.         hash: {
  9803.         },
  9804.         data: e,
  9805.         loc: {
  9806.           start: {
  9807.             line: 6,
  9808.             column: 46
  9809.           },
  9810.           end: {
  9811.             line: 6,
  9812.             column: 85
  9813.           }
  9814.         }
  9815.       })) + '">\n</div>\n'
  9816.     },
  9817.     useData: !0
  9818.   })
  9819. }),
  9820. define('core/views/media/UploadsView', [
  9821.   'backbone',
  9822.   'core/views/media/UploadsProgressSubView',
  9823.   'core/views/media/UploadsRichSubView',
  9824.   'core/templates/postMediaUploads'
  9825. ], function (a, b, c, d) {
  9826.   'use strict';
  9827.   var e = a.View.extend({
  9828.     initialize: function () {
  9829.       this.richView = new c,
  9830.       this.rich = this.richView.collection,
  9831.       this.uploadProgressView = new b,
  9832.       this.uploadProgress = this.uploadProgressView.collection,
  9833.       this.listenTo(this.rich, 'all', this._updateEmpty),
  9834.       this.listenTo(this.uploadProgress, 'all', this._updateEmpty)
  9835.     },
  9836.     render: function () {
  9837.       return this.richView.$el.detach(),
  9838.       this.uploadProgressView.$el.detach(),
  9839.       this.$el.html(d()),
  9840.       this._updateEmpty(),
  9841.       this.richView.setElement(this.$('[data-role=media-rich-list]') [0]),
  9842.       this.uploadProgressView.setElement(this.$('[data-role=media-progress-list]') [0]),
  9843.       this
  9844.     },
  9845.     clear: function () {
  9846.       this.rich.reset(),
  9847.       this.uploadProgress.reset()
  9848.     },
  9849.     _updateEmpty: function () {
  9850.       this.richView.hasVisible() || this.uploadProgressView.hasVisible() ? this.$el.removeClass('empty') : this.$el.addClass('empty')
  9851.     }
  9852.   });
  9853.   return e
  9854. }),
  9855. define('core/mixins/withUploadForm', [
  9856.   'underscore',
  9857.   'backbone',
  9858.   'core/strings',
  9859.   'core/utils',
  9860.   'core/utils/media/upload',
  9861.   'core/utils/storage',
  9862.   'core/views/media/DragDropUploadView',
  9863.   'core/views/media/UploadButtonView',
  9864.   'core/views/media/UploadsView'
  9865. ], function (a, b, c, d, e, f, g, h, i) {
  9866.   'use strict';
  9867.   var j = c.get,
  9868.   k = function () {
  9869.     a.defaults(this, k.bothProto, k.uploadsProto, k.previewsProto)
  9870.   },
  9871.   l = {
  9872.     'invalid-image-file': j('Unfortunately your image upload failed. Please verify that the file is valid and in a supported format (JPEG, PNG, or GIF).'),
  9873.     'invalid-content-type': j('Unfortunately your image upload failed. Please verify that the file is in a supported format (JPEG, PNG, or GIF).'),
  9874.     'file-too-large': j('Unfortunately your image upload failed. Please verify that your image is under 5MB.'),
  9875.     'not-authenticated': j('You must be logged in to upload an image.')
  9876.   },
  9877.   m = j('Unfortunately your image upload failed. Please verify that your image is in a supported format (JPEG, PNG, or GIF) and under 5MB. If you continue seeing this error, please try again later.');
  9878.   return k.previewsProto = {
  9879.     initMediaPreviews: function (b, c) {
  9880.       this.mediaUploadsView = new i({
  9881.         el: b[0]
  9882.       }),
  9883.       this.mediaUploadsView.render(),
  9884.       this.updateLiveMediaDebounced = a.partial(a.debounce(this.updateLiveMedia, 500), c, !1),
  9885.       this.stopListening(c, 'keychange'),
  9886.       this.stopListening(c, 'paste'),
  9887.       this.listenTo(c, {
  9888.         keychange: this.updateLiveMediaDebounced,
  9889.         paste: function (b, d) {
  9890.           d && d.fake || a.defer(a.bind(this.updateLiveMedia, this, c, !0))
  9891.         }
  9892.       }),
  9893.       this.updateLiveMedia(c, !0)
  9894.     },
  9895.     clearMediaPreviews: function () {
  9896.       this.mediaUploadsView && this.mediaUploadsView.clear()
  9897.     },
  9898.     updateLiveMedia: function (a, b) {
  9899.       if (this.mediaUploadsView) {
  9900.         var c = a.get(),
  9901.         d = a.offset();
  9902.         this.mediaUploadsView.richView.updateFromText(c, d, {
  9903.           isPasteEvent: b,
  9904.           forum: this.thread.forum.id
  9905.         })
  9906.       }
  9907.     }
  9908.   },
  9909.   k.uploadsProto = {
  9910.     initMediaUploads: function (a, b, c) {
  9911.       this.mediaDragDropView && this.stopListening(this.mediaDragDropView),
  9912.       this.mediaDragDropView = new g({
  9913.         el: b[0]
  9914.       }),
  9915.       this.listenTo(this.mediaDragDropView, {
  9916.         'uploader:attachMedia': function () {
  9917.           f.set('usedDragDrop', 1),
  9918.           this.handleAttachMedia.apply(this, arguments)
  9919.         },
  9920.         'uploader:dragEnter': function () {
  9921.           this.$el.addClass('expanded')
  9922.         },
  9923.         'uploader:showPlaceholder': function () {
  9924.           a.show()
  9925.         },
  9926.         'uploader:hidePlaceholder': function () {
  9927.           a.hide()
  9928.         },
  9929.         'uploader:dropError': function () {
  9930.           var a = j('Sorry we didn\'t catch that. Try again?');
  9931.           this.alert(a, {
  9932.             type: 'error',
  9933.             isUploadError: !0
  9934.           })
  9935.         }
  9936.       }),
  9937.       this.mediaUploadButtonView && this.stopListening(this.mediaUploadButtonView),
  9938.       this.mediaUploadButtonView = new h({
  9939.         el: c[0]
  9940.       }),
  9941.       this.listenTo(this.mediaUploadButtonView, {
  9942.         'uploader:attachMedia': this.handleUploadViaButton
  9943.       }),
  9944.       this.mediaUploadButtonView.render()
  9945.     },
  9946.     handleUploadViaButton: function (a) {
  9947.       if (a && f.isPersistent && !f.get('usedDragDrop') && !d.isMobileUserAgent()) {
  9948.         var b = this.alert(j('Did you know you can drag and drop images too? Try it now!'));
  9949.         this.listenToOnce(b, 'dismiss', function () {
  9950.           f.set('usedDragDrop', 1)
  9951.         })
  9952.       }
  9953.       this.handleAttachMedia.apply(this, arguments)
  9954.     },
  9955.     handleAttachMedia: function (c, d) {
  9956.       var f = this,
  9957.       g = new b.Model({
  9958.         remainingPerc: 100
  9959.       });
  9960.       f.mediaUploadsView.uploadProgress.add(g),
  9961.       d = a.extend(d || {
  9962.       }, {
  9963.         onProgress: function (a) {
  9964.           g.set('remainingPerc', 100 - a)
  9965.         }
  9966.       });
  9967.       var h = function () {
  9968.         f.mediaUploadsView.uploadProgress.remove(g)
  9969.       };
  9970.       e.uploadMediaUrl(c, d).then(function (a) {
  9971.         a.fetch({
  9972.           forum: f.thread.forum.id
  9973.         }),
  9974.         f.textarea.insertAtCursor(a.get('url')),
  9975.         f.updateLiveMedia(f.textarea, !0),
  9976.         f.dismissUploadError()
  9977.       }) ['catch'](function (a) {
  9978.         var b;
  9979.         a && a.code && (b = l[a.code]),
  9980.         b || (b = m),
  9981.         f.alert(b, {
  9982.           type: 'error',
  9983.           isUploadError: !0
  9984.         })
  9985.       }).then(h, h)
  9986.     },
  9987.     dismissUploadError: function () {
  9988.       this.dismissAlert(function (a) {
  9989.         return a.options && a.options.isUploadError
  9990.       })
  9991.     },
  9992.     uploadSupported: e.uploadSupported,
  9993.     isUploadInProgress: function () {
  9994.       return this.mediaUploadsView && this.mediaUploadsView.uploadProgress.length
  9995.     }
  9996.   },
  9997.   k.bothProto = {
  9998.     initMediaViews: function (a) {
  9999.       (a.mediaembedEnabled || a.gifPickerEnabled) && this.initMediaPreviews(this.$('[data-role=media-preview]'), a.textarea),
  10000.       a.allowUploads && this.initMediaUploads(this.$('[data-role=drag-drop-placeholder]'), this.$('[data-role=textarea]'), this.$('[data-role=media-uploader]'))
  10001.     }
  10002.   },
  10003.   k
  10004. }),
  10005. define('core/editable', [
  10006. ], function () {
  10007.   'use strict';
  10008.   function a(a) {
  10009.     return a.replace(e, ' ')
  10010.   }
  10011.   function b(c, d, e) {
  10012.     var f,
  10013.     h,
  10014.     i,
  10015.     j,
  10016.     k = '',
  10017.     l = [
  10018.     ];
  10019.     for ('string' != typeof e && (e = '\n\n'), j = 0; j < c.length; ++j) h = c[j],
  10020.     f = h.nodeName.toLowerCase(),
  10021.     1 === h.nodeType ? (i = d && d(h), i ? k += i : g.hasOwnProperty(f) ? (k && l.push(k), k = b(h.childNodes, d, e)) : k += 'br' === f ? '\n' : b(h.childNodes, d, e)) : 3 === h.nodeType && (k += a(h.nodeValue));
  10022.     return l.push(k),
  10023.     l.join(e)
  10024.   }
  10025.   var c = window.document,
  10026.   d = 'character',
  10027.   e = new RegExp(String.fromCharCode(160), 'gi'),
  10028.   f = 'h1 h2 h3 h4 h5 h6 p pre blockquote address ul ol dir menu li dl div form'.split(' '),
  10029.   g = {
  10030.   },
  10031.   h = 0;
  10032.   for (h = 0; h < f.length; h++) g[f[h]] = !0;
  10033.   var i = function (a, b, c) {
  10034.     var d = this;
  10035.     if (!a || !a.contentEditable) throw new Error('First argument must be contentEditable');
  10036.     this.elem = a,
  10037.     this.emulateTextarea = a.getAttribute('plaintext-only') || b,
  10038.     this.emulateTextarea && (this.pasteHandler = function (a) {
  10039.       var b = a && a.clipboardData || window.clipboardData;
  10040.       b && !b.getData('text') && (a.preventDefault(), a.stopPropagation());
  10041.       var c = d.plainTextReformat,
  10042.       e = function () {
  10043.         c.timeout = null,
  10044.         c.call(d)
  10045.       };
  10046.       c.timeout && clearTimeout(c.timeout),
  10047.       c.timeout = setTimeout(e, 0)
  10048.     }, a.addEventListener('paste', this.pasteHandler));
  10049.     for (var e in c) c.hasOwnProperty(e) && (this[e] = c[e])
  10050.   };
  10051.   return i.prototype = {
  10052.     insertHTML: function (a) {
  10053.       if (c.all) {
  10054.         var b = c.selection.createRange();
  10055.         return b.pasteHTML(a),
  10056.         b.collapse(!1),
  10057.         b.select()
  10058.       }
  10059.       return c.execCommand('insertHTML', !1, a)
  10060.     },
  10061.     insertNode: function (a) {
  10062.       var b,
  10063.       d,
  10064.       e;
  10065.       window.getSelection ? (b = window.getSelection(), b.getRangeAt && b.rangeCount && (d = b.getRangeAt(0), d.deleteContents(), d.insertNode(a), d.collapse(!1), b.removeAllRanges(), b.addRange(d))) : c.selection && c.selection.createRange && (d = c.selection.createRange(), e = 3 === a.nodeType ? a.data : a.outerHTML, d.pasteHTML(e), d.collapse(!1))
  10066.     },
  10067.     getTextNodes: function (a) {
  10068.       var b = this.elem;
  10069.       a && a.nodeType ? a = [
  10070.         a
  10071.       ] : a || (a = b.childNodes);
  10072.       for (var c, d = [
  10073.       ], e = 0; e < a.length; ++e) if (c = a[e]) switch (c.nodeType) {
  10074.         case 1:
  10075.           d = d.concat(this.getTextNodes(c.childNodes));
  10076.           break;
  10077.         case 3:
  10078.           /^\n\s+/.test(c.nodeValue) || d.push(c)
  10079.       }
  10080.       return d
  10081.     },
  10082.     text: function (a) {
  10083.       var c,
  10084.       d,
  10085.       e,
  10086.       f = this.elem;
  10087.       try {
  10088.         d = Array.prototype.slice.call(f.childNodes)
  10089.       } catch (g) {
  10090.         for (d = [
  10091.         ], e = 0; e < f.childNodes.length; ++e) d.push(f.childNodes[e])
  10092.       }
  10093.       return c = b(d, a, this.emulateTextarea && '\n'),
  10094.       c.replace(/^\s+|\s+$/g, '')
  10095.     },
  10096.     setText: function (a) {
  10097.       a = a || '';
  10098.       var b,
  10099.       d,
  10100.       e,
  10101.       f = c.createDocumentFragment(),
  10102.       g = [
  10103.         a
  10104.       ],
  10105.       h = g && g.length;
  10106.       for (b = 0; b < h; b++) d = g[b],
  10107.       e = this.createParagraph(d),
  10108.       f.appendChild(e);
  10109.       if (f.lastChild.appendChild(c.createElement('br')), this.elem.innerHTML = '', this.elem.appendChild(f), 'WebkitAppearance' in c.documentElement.style && window.navigator.userAgent.indexOf('Firefox') === - 1 && window.navigator.userAgent.indexOf('MSIE') === - 1) {
  10110.         var i = window.getSelection && window.getSelection();
  10111.         i && i.anchorNode === this.elem && i.modify && i.modify('move', 'forward', 'line')
  10112.       }
  10113.     },
  10114.     createParagraph: function (a) {
  10115.       var b,
  10116.       d,
  10117.       e,
  10118.       f,
  10119.       g,
  10120.       h,
  10121.       i,
  10122.       j = c.createElement('p');
  10123.       for (e = a.split(/\r\n|\r|\n/), d = 0, g = e.length; d < g; d++) {
  10124.         for (f = e[d], i = this.getHtmlElements(f), b = 0, h = i.length; b < h; b++) j.appendChild(i[b]);
  10125.         j.appendChild(c.createElement('br'))
  10126.       }
  10127.       return j.lastChild && j.removeChild(j.lastChild),
  10128.       j
  10129.     },
  10130.     getHtmlElements: function (a) {
  10131.       return [c.createTextNode(a)]
  10132.     },
  10133.     plainTextReformat: function () {
  10134.       if (!(this.elem.getElementsByTagName('p').length <= 1)) {
  10135.         this.emulateTextarea = !1;
  10136.         var a = this.text();
  10137.         this.emulateTextarea = !0,
  10138.         this.setText(a)
  10139.       }
  10140.     },
  10141.     removeNode: function (a) {
  10142.       var b,
  10143.       d,
  10144.       e;
  10145.       window.getSelection ? (b = a.previousSibling, a.parentNode.removeChild(a), d = window.getSelection(), e = c.createRange(), b && (e.setStart(b, b.length), e.setEnd(b, b.length)), d.addRange(e)) : a.parentNode.removeChild(a)
  10146.     },
  10147.     selectedTextNode: function () {
  10148.       var b,
  10149.       e,
  10150.       f,
  10151.       g,
  10152.       h,
  10153.       i,
  10154.       j,
  10155.       k,
  10156.       l,
  10157.       m = this.elem;
  10158.       if (window.getSelection) return b = window.getSelection(),
  10159.       b.anchorNode;
  10160.       if (c.selection.createRange) {
  10161.         for (e = c.selection.createRange().duplicate(); e.moveStart(d, - 1000) === - 1000; );
  10162.         var n = e.text;
  10163.         for (k = 0; k < m.childNodes.length; ++k) for (f = m.childNodes[k], h = this.getTextNodes(f), l = 0; l < h.length; ++l) if (g = h[l], j = a(g.nodeValue), n.indexOf(j) > - 1) i = g,
  10164.         n = n.replace(j, '');
  10165.          else if (j.indexOf(n) > - 1) return g;
  10166.         return i
  10167.       }
  10168.     },
  10169.     selectedTextNodeOffset: function (b) {
  10170.       var e,
  10171.       f,
  10172.       g;
  10173.       if (window.getSelection) {
  10174.         var h = window.getSelection();
  10175.         h && h.anchorOffset && (g = h.anchorOffset)
  10176.       } else if (b && c.selection.createRange) {
  10177.         var i = a(b.nodeValue);
  10178.         e = c.selection.createRange();
  10179.         var j = e.duplicate(),
  10180.         k = j.parentElement();
  10181.         for (f = 0; 0 !== e.moveStart(d, - 1) && (0 !== i.indexOf(a(e.text)) && k === e.parentElement()); f++) j = e.duplicate(),
  10182.         k = j.parentElement();
  10183.         g = f
  10184.       }
  10185.       return isNaN(g) ? 0 : g
  10186.     },
  10187.     offset: function () {
  10188.       function b(d, e) {
  10189.         function f(a) {
  10190.           i += a[0];
  10191.           for (var b = 1; b < a.length; ++b) h.push(i),
  10192.           i = a[b]
  10193.         }
  10194.         'string' != typeof e && (e = '\n\n');
  10195.         for (var h = [
  10196.         ], i = '', j = 0; j < d.length; ++j) {
  10197.           var k = d[j],
  10198.           l = k.nodeName.toLowerCase();
  10199.           1 === k.nodeType ? g.hasOwnProperty(l) ? (i && (i += e), f(b(k.childNodes, e))) : 'br' === l ? i += '\n' : f(b(k.childNodes, e)) : 3 === k.nodeType && (k === c.anchorNode ? (i += a(k.nodeValue.slice(0, c.anchorOffset)), h.push(i), i = a(k.nodeValue.slice(c.anchorOffset))) : i += a(k.nodeValue))
  10200.         }
  10201.         return h.push(i),
  10202.         h
  10203.       }
  10204.       var c = window.getSelection();
  10205.       if (!c || !c.anchorNode || 3 !== c.anchorNode.nodeType) return 0;
  10206.       var d,
  10207.       e = this.elem;
  10208.       try {
  10209.         d = Array.prototype.slice.call(e.childNodes)
  10210.       } catch (f) {
  10211.         d = [
  10212.         ];
  10213.         for (var h = 0; h < e.childNodes.length; ++h) d.push(e.childNodes[h])
  10214.       }
  10215.       var i = b(d, this.emulateTextarea && '\n');
  10216.       if (1 === i.length) return 0;
  10217.       var j = i[0].length,
  10218.       k = i.join(''),
  10219.       l = k.match(/\s+$/);
  10220.       if (l) {
  10221.         var m = l[0].length;
  10222.         j = Math.min(j, k.length - m)
  10223.       }
  10224.       var n = k.match(/^\s+/);
  10225.       if (n) {
  10226.         var o = n[0].length;
  10227.         j -= o
  10228.       }
  10229.       return j
  10230.     },
  10231.     selectNodeText: function (b, e, f) {
  10232.       var g,
  10233.       h,
  10234.       i = this.elem;
  10235.       if (window.getSelection) return g = window.getSelection(),
  10236.       g.removeAllRanges(),
  10237.       h = c.createRange(),
  10238.       h.setStart(b, e),
  10239.       h.setEnd(b, f),
  10240.       g.addRange(h),
  10241.       g;
  10242.       if (c.selection.createRange) {
  10243.         h = c.selection.createRange();
  10244.         var j = a(b.nodeValue);
  10245.         if ('body' === h.parentElement().nodeName.toLowerCase()) {
  10246.           for (i.focus(), h = c.selection.createRange(); h.moveStart(d, - 1000) === - 1000; );
  10247.           for (; 1000 === h.moveEnd(d, 1000); );
  10248.           var k = a(h.text),
  10249.           l = k.indexOf(j);
  10250.           l > 0 && h.moveStart(d, l + 2),
  10251.           h.collapse()
  10252.         }
  10253.         for (; h.moveStart(d, - 1) === - 1 && 0 !== j.indexOf(a(h.text)); );
  10254.         for (; 1 === h.moveEnd(d, 1) && j !== a(h.text); );
  10255.         return h.moveStart(d, e),
  10256.         h.moveEnd(d, - 1 * (f - e - h.text.length)),
  10257.         h.select(),
  10258.         h
  10259.       }
  10260.     }
  10261.   },
  10262.   i.normalizeSpace = a,
  10263.   i
  10264. }),
  10265. define('core/utils/html/nodeTypes', [
  10266. ], function () {
  10267.   'use strict';
  10268.   var a = function (a) {
  10269.     return 'p' === a.nodeName.toLowerCase()
  10270.   },
  10271.   b = function (a) {
  10272.     return 'div' === a.nodeName.toLowerCase()
  10273.   },
  10274.   c = function (a) {
  10275.     return '#text' === a.nodeName.toLowerCase()
  10276.   },
  10277.   d = function (a) {
  10278.     return 'br' === a.nodeName.toLowerCase()
  10279.   },
  10280.   e = function (a) {
  10281.     return 'button' === a.nodeName.toLowerCase()
  10282.   },
  10283.   f = function (a) {
  10284.     return 'br' === a.nodeName.toLowerCase() || '#text' === a.nodeName.toLowerCase() && '\n' === a.nodeValue
  10285.   },
  10286.   g = function (a) {
  10287.     return 'p' === a.nodeName.toLowerCase() || 'div' === a.nodeName.toLowerCase()
  10288.   },
  10289.   h = function (a) {
  10290.     return 'span' === a.nodeName.toLowerCase()
  10291.   };
  10292.   return {
  10293.     isP: a,
  10294.     isDiv: b,
  10295.     isText: c,
  10296.     isBr: d,
  10297.     isButton: e,
  10298.     isNewline: f,
  10299.     isPorDiv: g,
  10300.     isSpan: h
  10301.   }
  10302. }),
  10303. define('core/CappedStorage', [
  10304.   'core/utils/storage'
  10305. ], function (a) {
  10306.   'use strict';
  10307.   var b = function (a, b) {
  10308.     this.max = a || 10,
  10309.     this.queueKey = b || '__queue',
  10310.     this.getQueue() || this.setQueue([])
  10311.   };
  10312.   return b.prototype.set = function (b, c) {
  10313.     var d = this.getQueue() || this.setQueue([]);
  10314.     d.length === this.max && a.remove(d.shift()),
  10315.     a.set(b, c),
  10316.     d.push(b),
  10317.     this.setQueue(d)
  10318.   },
  10319.   b.prototype.get = function (b) {
  10320.     return a.get(b)
  10321.   },
  10322.   b.prototype.remove = function (b) {
  10323.     a.remove(b);
  10324.     for (var c = this.getQueue() || [
  10325.     ], d = 0; d < c.length; d++) if (c[d] === b) {
  10326.       c.splice(d, 1);
  10327.       break
  10328.     }
  10329.     this.setQueue(c)
  10330.   },
  10331.   b.prototype.clear = function () {
  10332.     a.clear(),
  10333.     this.setQueue([])
  10334.   },
  10335.   b.prototype.getQueue = function () {
  10336.     return a.get(this.queueKey)
  10337.   },
  10338.   b.prototype.setQueue = function (b) {
  10339.     return a.set(this.queueKey, b),
  10340.     b
  10341.   },
  10342.   b
  10343. }),
  10344. define('core/extensions/jquery.autoresize', [
  10345.   'jquery',
  10346.   'underscore'
  10347. ], function (a, b) {
  10348.   'use strict';
  10349.   return a.fn.autoresize = function (c) {
  10350.     var d = b.extend({
  10351.       extraSpace: 0,
  10352.       maxHeight: 1000
  10353.     }, c);
  10354.     return this.each(function () {
  10355.       var c = a(this).css({
  10356.         resize: 'none',
  10357.         overflow: 'hidden'
  10358.       }),
  10359.       e = 'true' === String(c[0].contentEditable) ? 'html' : 'val',
  10360.       f = 'html' === e ? '<br>' : '\n',
  10361.       g = c.height(),
  10362.       h = function () {
  10363.         var d = {
  10364.         };
  10365.         b.each(d, function (a, b) {
  10366.           d[b] = c.css(b)
  10367.         });
  10368.         var e = a(c[0].cloneNode(!0));
  10369.         return e.removeAttr('id').removeAttr('name').css({
  10370.           visibility: 'hidden',
  10371.           position: 'absolute',
  10372.           top: '-9999px',
  10373.           left: '-9999px',
  10374.           contentEditable: !1
  10375.         }).css(d).attr('tabIndex', '-1'),
  10376.         e.insertAfter(c[0]),
  10377.         e
  10378.       }(),
  10379.       i = null,
  10380.       j = function () {
  10381.         h[0].style.height = 0,
  10382.         h[e](c[e]() + f),
  10383.         h.scrollTop(h[0].scrollHeight);
  10384.         var a = Math.max(h[0].scrollHeight, g) + parseInt(d.extraSpace, 10);
  10385.         d.maxHeight && (a >= d.maxHeight ? (c.css('overflow', ''), a = d.maxHeight) : c.css('overflow', 'hidden')),
  10386.         i !== a && (i = a, c.height(a), c.trigger && c.trigger('resize'))
  10387.       },
  10388.       k = b.throttle(j, 500),
  10389.       l = function (a) {
  10390.         13 === a.keyCode ? j() : k()
  10391.       };
  10392.       c.bind('keyup', l).bind('paste', j).css('overflow', 'hidden'),
  10393.       j()
  10394.     })
  10395.   },
  10396.   a
  10397. }),
  10398. define('core/views/TextareaView', [
  10399.   'underscore',
  10400.   'jquery',
  10401.   'backbone',
  10402.   'core/utils',
  10403.   'core/utils/html/nodeTypes',
  10404.   'core/CappedStorage',
  10405.   'core/extensions/jquery.autoresize'
  10406. ], function (a, b, c, d, e, f) {
  10407.   'use strict';
  10408.   var g = c.View.extend({
  10409.     events: {
  10410.       'keydown  [data-role=editable]': 'handleKeyDown',
  10411.       'keyup    [data-role=editable]': 'handleKeyUp',
  10412.       'paste    [data-role=editable]': 'handlePaste',
  10413.       'focusin  [data-role=editable]': 'handleFocusIn',
  10414.       'blur     [data-role=editable]': 'handleBlur'
  10415.     },
  10416.     initialize: function (b) {
  10417.       b = b || {
  10418.       },
  10419.       this.storageKey = b.storageKey,
  10420.       this.value = b.value || this.getDraft() [0],
  10421.       this.history = [
  10422.         this.value
  10423.       ],
  10424.       this.historyPosition = 0,
  10425.       this.placeholder = b.placeholder,
  10426.       this.selectionIndices = {
  10427.         start: 0,
  10428.         end: 0,
  10429.         endElemInd: 0,
  10430.         endElemSelectionInd: 0,
  10431.         startElemInd: 0,
  10432.         startElemSelectionInd: 0
  10433.       },
  10434.       this.inputFixed = !1,
  10435.       this.listenTo(this, 'keychange', a.debounce(this.saveDraft, this.constructor.SAVE_DRAFT_INTERVAL))
  10436.     },
  10437.     render: function () {
  10438.       return this.$input = this.createInput(),
  10439.       this.set(this.value),
  10440.       this.$el.append(this.$input),
  10441.       this.$input.autoresize({
  10442.         maxHeight: this.constructor.MAX_TEXTAREA_HEIGHT
  10443.       }),
  10444.       this
  10445.     },
  10446.     createInput: function () {
  10447.       return b('<textarea>').attr({
  10448.         'class': 'textarea',
  10449.         placeholder: this.placeholder,
  10450.         'data-role': 'editable'
  10451.       })
  10452.     },
  10453.     resize: function () {
  10454.       this.$input.trigger('paste', {
  10455.         fake: !0
  10456.       })
  10457.     },
  10458.     get: function () {
  10459.       return this.$input.val().replace(/^\s+|\s+$/g, '')
  10460.     },
  10461.     getSelected: function () {
  10462.       var a = this.$input[0];
  10463.       return 'number' == typeof a.selectionStart ? this.$input.val().substring(a.selectionStart, a.selectionEnd) : ''
  10464.     },
  10465.     offset: function () {
  10466.       var a = this.$input[0],
  10467.       b = this.$input.val(),
  10468.       c = 'number' == typeof a.selectionStart ? a.selectionStart : 0,
  10469.       d = b.match(/\s+$/);
  10470.       if (d) {
  10471.         var e = d[0].length;
  10472.         c = Math.min(c, b.length - e)
  10473.       }
  10474.       var f = b.match(/^\s+/);
  10475.       if (f) {
  10476.         var g = f[0].length;
  10477.         c = Math.max(c - g, 0)
  10478.       }
  10479.       return c
  10480.     },
  10481.     insertAtCursor: function (a) {
  10482.       this.focus();
  10483.       var b = this.get(),
  10484.       c = this.offset(),
  10485.       e = d.insertWithWhitespace(b, c, a),
  10486.       f = this.$input[0];
  10487.       if (this.set(e), f.setSelectionRange) {
  10488.         var g = e.indexOf(a, c) + a.length + 1;
  10489.         f.setSelectionRange(g, g)
  10490.       }
  10491.     },
  10492.     insertAroundSelection: function (a, b) {
  10493.       this.focus();
  10494.       var c,
  10495.       d,
  10496.       e = this.$input[0];
  10497.       'number' == typeof e.selectionStart ? (c = e.selectionStart, d = e.selectionEnd) : c = d = 0;
  10498.       var f = this.get(),
  10499.       g = f.substring(0, c) + a + f.substring(c, d) + b + f.substring(d);
  10500.       this.set(g),
  10501.       e.setSelectionRange && e.setSelectionRange(c + a.length, d + a.length)
  10502.     },
  10503.     set: function (a) {
  10504.       this.$input.val(a)
  10505.     },
  10506.     clear: function () {
  10507.       this.set('')
  10508.     },
  10509.     focus: function () {
  10510.       this.$input.focus()
  10511.     },
  10512.     handleKeyDown: function (a) {
  10513.       this.trigger('keydown', a)
  10514.     },
  10515.     handleKeyUp: function (a) {
  10516.       this.trigger('keychange', a)
  10517.     },
  10518.     handlePaste: function (a, b) {
  10519.       b = b || {
  10520.       },
  10521.       this.trigger(b.fake ? 'paste' : 'paste keychange'),
  10522.       this.$input.trigger('resize')
  10523.     },
  10524.     handleFocusIn: function () {
  10525.       this.fixInputStructure(),
  10526.       this.trigger('focus')
  10527.     },
  10528.     handleBlur: function () {
  10529.       this.trigger('blur')
  10530.     },
  10531.     saveDraft: function () {
  10532.       if (this.storageKey) return b.trim(this.get()) ? void this.constructor.storage.set(this.storageKey, this.toJSON()) : void this.removeDraft()
  10533.     },
  10534.     toJSON: function () {
  10535.       return [this.get(),
  10536.       b.now()]
  10537.     },
  10538.     getDraft: function () {
  10539.       var a = [
  10540.         ''
  10541.       ];
  10542.       if (!this.storageKey) return a;
  10543.       var c = this.constructor.storage.get(this.storageKey);
  10544.       if (!c) return a;
  10545.       if (a = c, !a.length) return [''];
  10546.       var d = b.now() - a[1] >= this.constructor.DRAFT_MAX_AGE;
  10547.       return d ? (this.removeDraft(), [
  10548.         ''
  10549.       ]) : a
  10550.     },
  10551.     removeDraft: function () {
  10552.       this.storageKey && this.constructor.storage.remove(this.storageKey)
  10553.     },
  10554.     fixInputStructure: function () {
  10555.       var a,
  10556.       b,
  10557.       c,
  10558.       f,
  10559.       g,
  10560.       h,
  10561.       i,
  10562.       j = !1,
  10563.       k = !1,
  10564.       l = window.document,
  10565.       m = this.$input[0];
  10566.       if (m.type && 'textarea' === m.type);
  10567.        else if (d.browser.isChrome()) 0 === m.childNodes.length ? (b = m.appendChild(l.createElement('p')), b.appendChild(l.createTextNode('\n')), j = !0) : (a = m.childNodes[0], a.childNodes.forEach(function (b) {
  10568.         e.isBr(b) && a.replaceChild(l.createTextNode('\n'), b)
  10569.       }));
  10570.        else if (d.browser.isIE()) {
  10571.         if (0 === m.childNodes.length) c = l.createElement('p'),
  10572.         c.appendChild(l.createTextNode('')),
  10573.         m.appendChild(c),
  10574.         j = !0;
  10575.          else for (g = m.childNodes.length, i = 0; i < g; i++) if (e.isP(m.childNodes[i])) if (f = m.childNodes[i].childNodes.length, 0 === f) m.childNodes[i].appendChild(l.createTextNode('')),
  10576.         1 === g && (j = !0);
  10577.          else if (1 === f) e.isBr(m.childNodes[i].childNodes[0]) && (m.childNodes[i].replaceChild(l.createTextNode(''), m.childNodes[i].childNodes[0]), 1 === g && (j = !0));
  10578.          else for (; f > 0; ) h = m.childNodes[i].childNodes[0],
  10579.         1 === f && e.isBr(h) ? (m.childNodes[i].replaceChild(l.createTextNode(''), h), f -= 1) : 2 === f && e.isBr(h) && e.isText(m.childNodes[i].childNodes[1]) && this.inputFixed ? (c = l.createElement('p'), c.appendChild(l.createTextNode('')), m.insertBefore(c, m.childNodes[i]), i += 1, g += 1, m.childNodes[i].removeChild(h), f -= 2, this.selectionIndices = {
  10580.           startElemInd: i,
  10581.           endElemInd: i,
  10582.           startElemSelectionInd: 0,
  10583.           endElemSelectionInd: 0
  10584.         }, k = !0) : 2 === f && e.isText(h) && e.isBr(m.childNodes[i].childNodes[1]) ? (this.inputFixed && (c = l.createElement('p'), c.appendChild(l.createTextNode('')), i === g - 1 ? m.appendChild(c) : m.insertBefore(c, m.childNodes[i + 1]), g += 1, this.selectionIndices = {
  10585.           startElemInd: i + 1,
  10586.           endElemInd: i + 1,
  10587.           startElemSelectionInd: 0,
  10588.           endElemSelectionInd: 0
  10589.         }, k = !0), m.childNodes[i].removeChild(m.childNodes[i].childNodes[1]), f -= 2) : f > 2 && e.isText(h) && e.isBr(m.childNodes[i].childNodes[1]) ? (c = l.createElement('p'), c.appendChild(l.createTextNode(h.nodeValue)), m.insertBefore(c, m.childNodes[i]), i += 1, g += 1, m.childNodes[i].removeChild(m.childNodes[i].childNodes[1]), m.childNodes[i].removeChild(h), f -= 2) : f -= 1
  10590.       } else if (d.browser.isFirefox()) {
  10591.         if (1 === m.childNodes.length && e.isP(m.childNodes[0]) && m.childNodes[0].childNodes.length > 2) {
  10592.           for (f = m.childNodes[0].childNodes.length, i = 0; i < f; i++) h = m.childNodes[0].childNodes[i],
  10593.           e.isText(h) ? (c = l.createElement('p'), c.appendChild(l.createTextNode(h.nodeValue)), i < f - 1 && e.isBr(m.childNodes[0].childNodes[i + 1]) && (i += 1)) : e.isBr(h) && (c = l.createElement('p'), c.appendChild(l.createElement('br'))),
  10594.           m.appendChild(c);
  10595.           m.removeChild(m.childNodes[0])
  10596.         } else 1 === m.childNodes.length && e.isBr(m.childNodes[0]) ? (m.removeChild(m.childNodes[0]), c = l.createElement('p'), c.appendChild(l.createElement('br')), m.appendChild(c)) : 0 === m.childNodes.length && (c = l.createElement('p'), c.appendChild(l.createElement('br')), m.appendChild(c), j = !0);
  10597.         for (i = 0; i < m.childNodes.length; i++) {
  10598.           var n = m.childNodes[i];
  10599.           e.isP(n) && 1 === n.childNodes.length && e.isBr(n.childNodes[0]) ? n.insertBefore(l.createTextNode(''), n.childNodes[0]) : e.isDiv(n) && (c = l.createElement('p'), 1 === n.childNodes.length && e.isBr(n.childNodes[0]) ? (c.appendChild(l.createTextNode('')), c.appendChild(l.createElement('br'))) : 2 === n.childNodes.length && e.isText(n.childNodes[0]) && n.childNodes[0].nodeValue.length > 0 && e.isBr(n.childNodes[1]) && c.appendChild(l.createTextNode(n.childNodes[0].nodeValue)), m.replaceChild(c, n))
  10600.         }
  10601.       } else if (d.browser.isSafari() || d.browser.isEdge()) if (0 !== m.childNodes.length && e.isP(m.childNodes[0])) {
  10602.         for (a = m.childNodes[0], f = a.childNodes.length, i = 0; i < f; i += 1) e.isBr(a.childNodes[i]) && (0 === i || e.isBr(a.childNodes[i - 1])) && (a.insertBefore(l.createTextNode(''), a.childNodes[i]), i === f - 1 && (j = !0));
  10603.         for (i = 0; i < f - 1; i += 1) e.isText(a.childNodes[i]) && '' === a.childNodes[i].nodeValue && e.isText(a.childNodes[i + 1]) && (a.removeChild(a.childNodes[i]), i -= 1, f -= 1)
  10604.       } else {
  10605.         for (c = l.createElement('p'), c.appendChild(l.createTextNode('')), c.appendChild(l.createElement('br')); m.firstChild; ) m.removeChild(m.firstChild);
  10606.         m.appendChild(c),
  10607.         j = !0
  10608.       } else if (d.browser.isOpera()) if (0 === m.childNodes.length) c = l.createElement('p'),
  10609.       c.appendChild(l.createTextNode('\n')),
  10610.       m.appendChild(c),
  10611.       j = !0;
  10612.        else for (a = m.childNodes[0], i = 0; i < a.childNodes.length; i++) e.isBr(a.childNodes[i]) && a.replaceChild(l.createTextNode('\n'), a.childNodes[i]);
  10613.       this.inputFixed = !0,
  10614.       k ? this.selectText() : j && this.focusEndOfText()
  10615.     },
  10616.     focusEndOfText: function () {
  10617.       var a,
  10618.       b = this.$input[0],
  10619.       c = 0,
  10620.       f = 0,
  10621.       g = 0,
  10622.       h = 0;
  10623.       d.browser.isChrome() || d.browser.isOpera() ? (a = b.childNodes[0], c = f = a.childNodes.length - 1, g = h = a.childNodes[c].nodeValue.length) : d.browser.isSafari() || d.browser.isEdge() ? (a = b.childNodes[0], c = f = e.isText(a.childNodes[a.childNodes.length - 1]) ? a.childNodes.length - 1 : a.childNodes.length - 2, g = h = a.childNodes[c].nodeValue.length) : (d.browser.isFirefox() || d.browser.isIE()) && (c = f = b.childNodes.length - 1, g = b.childNodes[c].childNodes[0].nodeValue.length, h = g),
  10624.       this.selectionIndices = {
  10625.         startElemInd: c,
  10626.         startElemSelectionInd: g,
  10627.         endElemInd: f,
  10628.         endElemSelectionInd: h
  10629.       },
  10630.       this.selectText()
  10631.     },
  10632.     getWhichChildIndex: function (a, b) {
  10633.       for (var c = 0; c < a.childNodes.length; c++) if (a.childNodes[c] === b) return c;
  10634.       return - 1
  10635.     },
  10636.     getNodeLength: function (a) {
  10637.       return e.isBr(a) ? 1 : a.nodeValue.length
  10638.     },
  10639.     placeholderSetSelection: function () {
  10640.       var a,
  10641.       b,
  10642.       c = window.getSelection();
  10643.       this.$input[0].type && 'textarea' === this.$input[0].type ? (a = this.$input[0].selectionStart, b = this.$input[0].selectionEnd) : 'DIV' === c.anchorNode.tagName ? (a = 0, b = this.get().length) : 'P' === c.anchorNode.tagName ? a = b = this.get().length : (a = Math.min(c.focusOffset, c.anchorOffset), b = Math.max(c.focusOffset, c.anchorOffset)),
  10644.       this.selectionIndices = {
  10645.         start: a,
  10646.         end: b,
  10647.         endElemInd: 0,
  10648.         endElemSelectionInd: 0,
  10649.         startElemInd: 0,
  10650.         startElemSelectionInd: 0
  10651.       }
  10652.     },
  10653.     setSelection: function () {
  10654.       var a,
  10655.       b,
  10656.       c,
  10657.       f,
  10658.       g,
  10659.       h,
  10660.       i;
  10661.       this.fixInputStructure();
  10662.       var j = this.$input[0],
  10663.       k = !1,
  10664.       l = window.getSelection();
  10665.       if (j.type && 'textarea' === j.type) b = j.selectionStart,
  10666.       c = j.selectionEnd;
  10667.        else if (l.rangeCount) {
  10668.         var m = l.getRangeAt(0);
  10669.         if (d.browser.isChrome()) {
  10670.           for (a = j.childNodes[0], b = f = 0; a.childNodes[f] && a.childNodes[f] !== m.startContainer; ) e.isSpan(a.childNodes[f]) || (b += this.getNodeLength(a.childNodes[f])),
  10671.           f += 1;
  10672.           if (h = m.startOffset, b += m.startOffset, m.collapsed) g = f,
  10673.           c = b,
  10674.           i = h;
  10675.            else if (m.startContainer === m.endContainer) g = f,
  10676.           i = m.endOffset,
  10677.           c = b + (m.endOffset - m.startOffset);
  10678.            else {
  10679.             for (g = f, c = b - m.startOffset; a.childNodes[g] && a.childNodes[g] !== m.endContainer; ) e.isSpan(a.childNodes[g]) || (c += this.getNodeLength(a.childNodes[g])),
  10680.             g += 1;
  10681.             e.isNewline(a.childNodes[g]) ? (i = this.getNodeLength(a.childNodes[g - 1]), g -= 1) : (c += m.endOffset, i = m.endOffset)
  10682.           }
  10683.         } else if (d.browser.isIE()) e.isDiv(m.startContainer) && e.isDiv(m.endContainer) && m.collapsed ? (f = j.childNodes.length - 1, g = j.childNodes.length - 1, h = j.childNodes[f].childNodes[0].nodeValue.length, i = j.childNodes[g].childNodes[0].nodeValue.length, k = !0) : e.isDiv(m.startContainer) && e.isDiv(m.endContainer) && !m.collapsed ? (f = m.startOffset, g = m.endOffset - 1, h = 0, i = j.childNodes[g].childNodes[0].nodeValue.length) : e.isText(m.startContainer) && e.isText(m.endContainer) ? (f = this.getWhichChildIndex(j, m.startContainer.parentNode), g = this.getWhichChildIndex(j, m.endContainer.parentNode), h = m.startOffset, i = m.endOffset) : e.isText(m.startContainer) && e.isDiv(m.endContainer) ? (f = this.getWhichChildIndex(j, m.startContainer.parentNode), g = m.endOffset - 1, h = m.startOffset, i = j.childNodes[g].childNodes[0].nodeValue.length) : (f = 0, g = 0, h = 0, i = 0);
  10684.          else if (d.browser.isFirefox()) e.isDiv(m.startContainer) && e.isDiv(m.endContainer) && m.startContainer === j && m.endContainer === j && m.collapsed ? (f = j.childNodes.length - 1, g = j.childNodes.length - 1, h = j.childNodes[f].childNodes[0].nodeValue.length, i = j.childNodes[g].childNodes[0].nodeValue.length, k = !0) : e.isDiv(m.startContainer) && e.isDiv(m.endContainer) && m.startContainer === j && m.endContainer === j && !m.collapsed ? (f = m.startOffset, g = m.endOffset - 1, h = 0, i = j.childNodes[g].childNodes[0].nodeValue.length) : e.isDiv(m.startContainer) && e.isText(m.endContainer) && m.startContainer === j ? (f = 0, g = this.getWhichChildIndex(j, m.endContainer.parentNode), h = 0, i = m.endOffset) : e.isDiv(m.startContainer) && e.isP(m.endContainer) && m.startContainer === j ? (f = 0, g = this.getWhichChildIndex(j, m.endContainer), h = 0, i = j.childNodes[g].childNodes[0].nodeValue.length) : e.isText(m.startContainer) && e.isText(m.endContainer) ? (f = this.getWhichChildIndex(j, m.startContainer.parentNode), g = this.getWhichChildIndex(j, m.endContainer.parentNode), h = m.startOffset, i = m.endOffset) : e.isText(m.startContainer) && e.isP(m.endContainer) ? (f = this.getWhichChildIndex(j, m.startContainer.parentNode), g = this.getWhichChildIndex(j, m.endContainer), h = m.startOffset, i = f === g ? j.childNodes[g].childNodes[0].nodeValue.length : 0) : e.isP(m.startContainer) && e.isText(m.endContainer) ? (f = this.getWhichChildIndex(j, m.startContainer), g = this.getWhichChildIndex(j, m.endContainer.parentNode), h = 0, i = m.endOffset) : e.isP(m.startContainer) && e.isP(m.endContainer) ? (f = this.getWhichChildIndex(j, m.startContainer), g = this.getWhichChildIndex(j, m.endContainer), h = 0, i = j.childNodes[g].childNodes[0].nodeValue.length) : (f = 0, g = 0, h = 0, i = 0);
  10685.          else if (d.browser.isSafari() || d.browser.isEdge()) a = j.childNodes[0],
  10686.         e.isText(m.startContainer) ? (f = this.getWhichChildIndex(a, m.startContainer), h = m.startOffset) : e.isP(m.startContainer) ? (f = m.startOffset < a.childNodes.length && e.isText(a.childNodes[m.startOffset]) ? m.collapsed ? m.startOffset : m.startOffset - 2 : m.startOffset - 1, h = a.childNodes[f].nodeValue.length) : e.isDiv(m.startContainer) && (m.collapsed ? (f = e.isText(a.childNodes[a.childNodes.length - 1]) ? a.childNodes.length - 1 : a.childNodes.length - 2, h = a.childNodes[f].nodeValue.length) : (f = 0, h = 0)),
  10687.         e.isText(m.endContainer) ? (g = this.getWhichChildIndex(a, m.endContainer), i = m.endOffset) : e.isP(m.endContainer) ? (g = m.endOffset < a.childNodes.length && e.isText(a.childNodes[m.endOffset]) ? m.collapsed ? m.endOffset : m.endOffset - 2 : m.endOffset - 1 < a.childNodes.length && e.isText(a.childNodes[m.endOffset - 1]) ? m.endOffset - 1 : m.endOffset - 1 < a.childNodes.length && e.isBr(a.childNodes[m.endOffset - 1]) ? m.endOffset - 2 : a.childNodes.length - 2, i = a.childNodes[g].nodeValue.length) : e.isDiv(m.endContainer) && (g = e.isText(a.childNodes[a.childNodes.length - 1]) ? a.childNodes.length - 1 : a.childNodes.length - 2, i = a.childNodes[f].nodeValue.length);
  10688.          else {
  10689.           if (!d.browser.isOpera()) return this.placeholderSetSelection();
  10690.           a = j.childNodes[0],
  10691.           f = this.getWhichChildIndex(a, m.startContainer),
  10692.           g = this.getWhichChildIndex(a, m.endContainer),
  10693.           h = m.startOffset,
  10694.           i = m.endOffset
  10695.         }
  10696.       } else this.focusEndOfText();
  10697.       this.selectionIndices = {
  10698.         start: b,
  10699.         end: c,
  10700.         startElemInd: f,
  10701.         startElemSelectionInd: h,
  10702.         endElemInd: g,
  10703.         endElemSelectionInd: i
  10704.       },
  10705.       k && this.selectText()
  10706.     },
  10707.     addTagTextarea: function (a) {
  10708.       var b,
  10709.       c,
  10710.       d,
  10711.       e = this.selectionIndices.start,
  10712.       f = this.selectionIndices.end,
  10713.       g = this.selectionIndices.startElemInd,
  10714.       h = this.selectionIndices.endElemInd,
  10715.       i = this.selectionIndices.startElemSelectionInd,
  10716.       j = this.selectionIndices.endElemSelectionInd;
  10717.       switch (a) {
  10718.         case 'a':
  10719.           b = '<a href="#">',
  10720.           c = '</a>';
  10721.           break;
  10722.         default:
  10723.           b = '<' + a + '>',
  10724.           c = '</' + a + '>'
  10725.       }
  10726.       var k = this.get(),
  10727.       l = k.slice(0, e),
  10728.       m = k.slice(e, f),
  10729.       n = k.slice(f),
  10730.       o = new RegExp('<' + a + '[^<>]*>'),
  10731.       p = new RegExp(c + '$'),
  10732.       q = m.match(o),
  10733.       r = m.match(p);
  10734.       q && r && 0 === q.index && r.index === f - e - c.length ? (d = m.replace(o, '').replace(p, ''), f -= q[0].length + r[0].length, j -= q[0].length + r[0].length) : (d = b + m + c, f += b.length + c.length, j += b.length + c.length),
  10735.       this.selectionIndices = {
  10736.         start: e,
  10737.         end: f,
  10738.         startElemInd: g,
  10739.         endElemInd: h,
  10740.         startElemSelectionInd: i,
  10741.         endElemSelectionInd: j
  10742.       },
  10743.       this.set(l + d + n),
  10744.       this.debouncedSaveHistory(),
  10745.       this.selectText()
  10746.     },
  10747.     addTag: function (a) {
  10748.       var b,
  10749.       c,
  10750.       e,
  10751.       f,
  10752.       g,
  10753.       h,
  10754.       i,
  10755.       j,
  10756.       k,
  10757.       l,
  10758.       m,
  10759.       n,
  10760.       o,
  10761.       p = window.document,
  10762.       q = this.$input[0],
  10763.       r = this.selectionIndices.start,
  10764.       s = this.selectionIndices.end,
  10765.       t = this.selectionIndices.startElemInd,
  10766.       u = this.selectionIndices.endElemInd,
  10767.       v = this.selectionIndices.startElemSelectionInd,
  10768.       w = this.selectionIndices.endElemSelectionInd;
  10769.       switch (a) {
  10770.         case 'a':
  10771.           b = '<a href="#">',
  10772.           c = '</a>';
  10773.           break;
  10774.         default:
  10775.           b = '<' + a + '>',
  10776.           c = '</' + a + '>'
  10777.       }
  10778.       var x = new RegExp('<' + a + '[^<>]*>'),
  10779.       y = new RegExp(c + '$');
  10780.       if (q.type && 'textarea' === q.type) return this.addTagTextarea(a);
  10781.       if (d.browser.isChrome() || d.browser.isSafari() || d.browser.isOpera() || d.browser.isEdge()) k = q.childNodes[0],
  10782.       l = k.childNodes[t],
  10783.       m = k.childNodes[u],
  10784.       n = l.nodeValue,
  10785.       o = m.nodeValue,
  10786.       f = n.slice(v).match(x),
  10787.       g = o.slice(0, w).match(y),
  10788.       f && g && 0 === f.index && g.index === w - c.length ? (t === u ? (h = n.slice(0, v) + n.slice(v, w).replace(x, '').replace(y, '') + n.slice(w), k.replaceChild(p.createTextNode(h), l), w -= f[0].length + g[0].length) : (i = n.slice(0, v) + n.slice(v).replace(x, ''), j = o.slice(0, w).replace(y, '') + o.slice(w), k.replaceChild(p.createTextNode(i), l), k.replaceChild(p.createTextNode(j), m), w -= g[0].length), s -= f[0].length + g[0].length) : (t === u ? (h = n.slice(0, v) + b + n.slice(v, w) + c + n.slice(w), k.replaceChild(p.createTextNode(h), l), w += b.length + c.length) : (i = n.slice(0, v) + b + n.slice(v), j = o.slice(0, w) + c + o.slice(w), k.replaceChild(p.createTextNode(i), l), k.replaceChild(p.createTextNode(j), m), w += c.length), s += b.length + c.length);
  10789.        else if (d.browser.isFirefox() || d.browser.isIE()) {
  10790.         var z = q.childNodes[this.selectionIndices.startElemInd],
  10791.         A = q.childNodes[this.selectionIndices.endElemInd];
  10792.         l = z.childNodes[0],
  10793.         m = A.childNodes[0],
  10794.         n = l.nodeValue,
  10795.         o = m.nodeValue,
  10796.         f = n.slice(v).match(x),
  10797.         g = o.slice(0, w).match(y),
  10798.         f && g && 0 === f.index && g.index === w - c.length ? (t === u ? (h = n.slice(0, v) + n.slice(v, w).replace(x, '').replace(y, '') + n.slice(w), z.replaceChild(p.createTextNode(h), l), w -= f[0].length + g[0].length) : (i = n.slice(0, v) + n.slice(v).replace(x, ''), j = o.slice(0, w).replace(y, '') + o.slice(w), z.replaceChild(p.createTextNode(i), l), A.replaceChild(p.createTextNode(j), m), w -= g[0].length), s -= f[0].length + g[0].length) : (t === u ? (h = n.slice(0, v) + b + n.slice(v, w) + c + n.slice(w), z.replaceChild(p.createTextNode(h), l), w += b.length + c.length) : (i = n.slice(0, v) + b + n.slice(v), j = o.slice(0, w) + c + o.slice(w), z.replaceChild(p.createTextNode(i), l), A.replaceChild(p.createTextNode(j), m), w += c.length), s += b.length + c.length)
  10799.       } else {
  10800.         var B = this.get(),
  10801.         C = B.slice(0, r),
  10802.         D = B.slice(r, s),
  10803.         E = B.slice(s);
  10804.         f = D.match(x),
  10805.         g = D.match(y),
  10806.         f && g && 0 === f.index && g.index === s - r - c.length ? (e = D.replace(x, '').replace(y, ''), s = s - f[0].length - g[0].length) : (e = b + D + c, s = s + b.length + c.length),
  10807.         this.set(C + e + E)
  10808.       }
  10809.       this.debouncedSaveHistory(),
  10810.       this.selectionIndices = {
  10811.         start: r,
  10812.         end: s,
  10813.         startElemInd: t,
  10814.         startElemSelectionInd: v,
  10815.         endElemInd: u,
  10816.         endElemSelectionInd: w
  10817.       },
  10818.       this.selectText()
  10819.     },
  10820.     selectText: function () {
  10821.       var a,
  10822.       b,
  10823.       c,
  10824.       e,
  10825.       f = this.$input[0],
  10826.       g = window.document.createRange(),
  10827.       h = this.selectionIndices.start,
  10828.       i = this.selectionIndices.end,
  10829.       j = f.childNodes[0],
  10830.       k = window.getSelection();
  10831.       if (f.type && 'textarea' === f.type) f.setSelectionRange(h, i);
  10832.        else if (d.browser.isChrome() || d.browser.isSafari() || d.browser.isOpera() || d.browser.isEdge()) a = j.childNodes[this.selectionIndices.startElemInd],
  10833.       b = this.selectionIndices.startElemSelectionInd,
  10834.       c = j.childNodes[this.selectionIndices.endElemInd],
  10835.       e = this.selectionIndices.endElemSelectionInd,
  10836.       g.setStart(a, b),
  10837.       g.setEnd(c, e),
  10838.       k.removeAllRanges(),
  10839.       k.addRange(g);
  10840.        else if (d.browser.isFirefox() || d.browser.isIE()) a = f.childNodes[this.selectionIndices.startElemInd].childNodes[0],
  10841.       b = this.selectionIndices.startElemSelectionInd,
  10842.       c = f.childNodes[this.selectionIndices.endElemInd].childNodes[0],
  10843.       e = this.selectionIndices.endElemSelectionInd,
  10844.       g.setStart(a, b),
  10845.       g.setEnd(c, e),
  10846.       (!d.browser.isIE() || k.rangeCount > 0 && k.getRangeAt(0).getClientRects().length > 0) && k.removeAllRanges(),
  10847.       k.addRange(g);
  10848.        else {
  10849.         var l = j.childNodes[0];
  10850.         g.setStart(l, h),
  10851.         g.setEnd(l, i),
  10852.         k.removeAllRanges(),
  10853.         k.addRange(g)
  10854.       }(d.browser.isEdge() || f.type && 'textarea' === f.type) && this.focus()
  10855.     },
  10856.     debouncedSaveHistory: a.debounce(function () {
  10857.       var a = this.toJSON() [0];
  10858.       a !== this.history[this.historyPosition] && (this.historyPosition !== this.history.length - 1 && (this.history = this.history.slice(0, this.historyPosition + 1)), this.history.push(a), this.historyPosition += 1)
  10859.     }, 200),
  10860.     undoTextarea: function () {
  10861.       this.historyPosition > 0 && (this.historyPosition -= 1, this.set(this.history[this.historyPosition]), this.fixInputStructure(), this.focusEndOfText())
  10862.     },
  10863.     redoTextarea: function () {
  10864.       this.historyPosition < this.history.length - 1 && (this.historyPosition += 1, this.set(this.history[this.historyPosition]), this.fixInputStructure(), this.focusEndOfText())
  10865.     }
  10866.   }, {
  10867.     MAX_TEXTAREA_HEIGHT: 350,
  10868.     SAVE_DRAFT_INTERVAL: 500,
  10869.     DRAFT_MAX_AGE: 86400000,
  10870.     storage: new f(5, 'drafts.queue')
  10871.   });
  10872.   return g
  10873. }),
  10874. define('core/views/ContentEditableView', [
  10875.   'jquery',
  10876.   'underscore',
  10877.   'core/editable',
  10878.   'core/views/TextareaView'
  10879. ], function (a, b, c, d) {
  10880.   'use strict';
  10881.   var e = window.document,
  10882.   f = d,
  10883.   g = f.prototype,
  10884.   h = f.extend({
  10885.     events: b.defaults({
  10886.       'focusout [data-role=editable]': 'handleFocusOut',
  10887.       'click .placeholder': 'handlePlaceholderClick'
  10888.     }, g.events),
  10889.     initialize: function () {
  10890.       g.initialize.apply(this, arguments),
  10891.       this.hasFocus = !1,
  10892.       this._selectionRange = null
  10893.     },
  10894.     saveSelection: function () {
  10895.       var a = window.getSelection();
  10896.       this._selectionRange = a && a.rangeCount && a.getRangeAt(0)
  10897.     },
  10898.     restoreSelection: function () {
  10899.       if (this._selectionRange) {
  10900.         var a = window.getSelection();
  10901.         a.removeAllRanges(),
  10902.         a.addRange(this._selectionRange),
  10903.         this._selectionRange = null
  10904.       }
  10905.     },
  10906.     render: function () {
  10907.       return this.$input = this.createInput(),
  10908.       this.$el.append(this.$input),
  10909.       this.set(this.value),
  10910.       this.renderPlaceholder(),
  10911.       this
  10912.     },
  10913.     createInput: function () {
  10914.       var b = a('<div>').attr({
  10915.         'class': 'textarea',
  10916.         tabIndex: 0,
  10917.         role: 'textbox',
  10918.         'aria-multiline': 'true',
  10919.         contenteditable: 'PLAINTEXT-ONLY',
  10920.         'data-role': 'editable'
  10921.       }).css({
  10922.         overflow: 'auto',
  10923.         'word-wrap': 'break-word',
  10924.         'max-height': this.constructor.MAX_TEXTAREA_HEIGHT + 'px'
  10925.       }),
  10926.       d = b[0];
  10927.       return 'plaintext-only' !== d.contentEditable && (d.contentEditable = 'true'),
  10928.       this.content = new c(d, (!0)),
  10929.       b
  10930.     },
  10931.     renderPlaceholder: function () {
  10932.       var b = this.placeholder;
  10933.       b && (this.$input.attr('aria-label', b), this.$placeholder = a('<span class="placeholder">' + b + '</span>'), this.updatePlaceholderDisplay())
  10934.     },
  10935.     updatePlaceholderDisplay: function () {
  10936.       this.$placeholder && (this.hasFocus || this.content.text() ? this.$placeholder.remove() : this.$el.prepend(this.$placeholder))
  10937.     },
  10938.     handlePlaceholderClick: function () {
  10939.       this.$input.focus()
  10940.     },
  10941.     handleFocusIn: function () {
  10942.       g.handleFocusIn.call(this),
  10943.       this.restoreSelection(),
  10944.       this.hasFocus = !0,
  10945.       this.updatePlaceholderDisplay()
  10946.     },
  10947.     handleFocusOut: function () {
  10948.       this.saveSelection(),
  10949.       this.hasFocus = !1,
  10950.       this.updatePlaceholderDisplay()
  10951.     },
  10952.     get: function () {
  10953.       return this.content.text()
  10954.     },
  10955.     getSelected: function () {
  10956.       return this.hasFocus && window.getSelection ? window.getSelection().toString() : this._selectionRange ? this._selectionRange.toString() : ''
  10957.     },
  10958.     offset: function () {
  10959.       return this.content.offset()
  10960.     },
  10961.     set: function (a) {
  10962.       this.content.setText(a),
  10963.       this.resize(),
  10964.       this.updatePlaceholderDisplay()
  10965.     },
  10966.     insertAtCursor: function (a) {
  10967.       this.focus();
  10968.       var b = ' ' + a + ' ';
  10969.       e.queryCommandSupported && e.queryCommandSupported('insertText') && e.execCommand('insertText', !1, b) || this.content.insertNode(e.createTextNode(b))
  10970.     },
  10971.     clear: function () {
  10972.       g.clear.call(this),
  10973.       b.defer(function (a) {
  10974.         a.$input.blur()
  10975.       }, this)
  10976.     },
  10977.     insertAroundSelection: function (a, b) {
  10978.       this.focus();
  10979.       var c = window.getSelection();
  10980.       if (c.rangeCount) {
  10981.         var d = c.getRangeAt(0),
  10982.         f = d.cloneRange();
  10983.         f.collapse(!1);
  10984.         var g = e.createTextNode(b);
  10985.         f.insertNode(g);
  10986.         var h = d.cloneRange();
  10987.         h.collapse(!0);
  10988.         var i = e.createTextNode(a);
  10989.         h.insertNode(i),
  10990.         d.setStart(i, a.length),
  10991.         d.setEnd(g, 0),
  10992.         c.removeAllRanges(),
  10993.         c.addRange(d)
  10994.       }
  10995.     }
  10996.   });
  10997.   return h
  10998. }),
  10999. define('core/views/PostReplyView', [
  11000.   'jquery',
  11001.   'underscore',
  11002.   'backbone',
  11003.   'modernizr',
  11004.   'moment',
  11005.   'core/UniqueModel',
  11006.   'core/mixins/withAlert',
  11007.   'core/mixins/withUploadForm',
  11008.   'core/models/Post',
  11009.   'core/models/User',
  11010.   'core/strings',
  11011.   'core/time',
  11012.   'core/utils',
  11013.   'core/switches',
  11014.   'core/views/ContentEditableView',
  11015.   'core/views/TextareaView',
  11016.   'core/utils/threadRatingsHelpers'
  11017. ], function (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q) {
  11018.   'use strict';
  11019.   var r = k.get,
  11020.   s = m.preventDefaultHandler,
  11021.   t = c.View.extend({
  11022.     tagName: 'form',
  11023.     className: 'reply',
  11024.     events: {
  11025.       submit: 'submitForm'
  11026.     },
  11027.     postboxAlertSelector: '[role=postbox-alert]',
  11028.     initialize: function (a) {
  11029.       this.session = a.session,
  11030.       this.parent = a.parent,
  11031.       this.thread = a.thread,
  11032.       this.isRefreshEnabled = n.isFeatureActive('embed_refresh', {
  11033.         forum: this.thread && this.thread.forum && this.thread.forum.id
  11034.       }),
  11035.       this.isRefreshV2Enabled = this.isRefreshEnabled && n.isFeatureActive('embed_refresh_v2', {
  11036.         forum: this.thread && this.thread.forum && this.thread.forum.id
  11037.       }),
  11038.       this.$el.addClass(this.isRefreshEnabled ? 'form-refresh' : ''),
  11039.       this.$el.addClass(this.isRefreshV2Enabled ? 'form-refresh-v2' : ''),
  11040.       this.gifPickerEnabled = Boolean(this.thread) && Boolean(this.thread.forum) && Boolean(this.thread.forum.get('settings').gifPickerEnabled),
  11041.       this.post = this.makePostInstance(),
  11042.       this.setAlertSelector('[role=alert]'),
  11043.       this.shouldShowEmailAlertInForm = a.shouldShowEmailAlertInForm,
  11044.       this.parentView = a.parentView,
  11045.       this._isHidden = !1,
  11046.       this.parent && (t.open[this.parent.cid] = this),
  11047.       this.mediaembedEnabled = this.thread.forum.get('settings').mediaembedEnabled,
  11048.       this.allowUploads = this.mediaembedEnabled && this.uploadSupported,
  11049.       this.listenTo(this.session, 'change:id', this.redraw)
  11050.     },
  11051.     redraw: function () {
  11052.       var b = this.$el.hasClass('expanded'),
  11053.       c = this.el,
  11054.       d = this.$el.find('textarea').val();
  11055.       this.render(),
  11056.       this.$el.find('textarea').val(d),
  11057.       b && this.$el.addClass('expanded'),
  11058.       0 !== a(c).parent().length && c.parentNode.replaceChild(this.el, c)
  11059.     },
  11060.     getPlaceholderText: function () {
  11061.       return this.thread.get('posts') ? this.thread.forum.get('commentsPlaceholderTextPopulated') || r('Join the discussion…') : this.thread.forum.get('commentsPlaceholderTextEmpty') || r('Start the discussion…')
  11062.     },
  11063.     getTemplateData: function () {
  11064.       return {
  11065.         user: this.session.toJSON(),
  11066.         displayMediaPreviews: this.mediaembedEnabled || this.gifPickerEnabled,
  11067.         displayMediaUploadButton: this.allowUploads,
  11068.         gifPickerEnabled: this.gifPickerEnabled
  11069.       }
  11070.     },
  11071.     render: function () {
  11072.       return this.$el.html(this.template(this.getTemplateData())),
  11073.       this.initTextEditor(null, !0),
  11074.       this.parent ? this.$el.addClass('expanded') : this.$el.removeClass('expanded'),
  11075.       this.initTextarea(),
  11076.       this.initMediaViews({
  11077.         mediaembedEnabled: this.mediaembedEnabled,
  11078.         gifPickerEnabled: this.gifPickerEnabled,
  11079.         allowUploads: this.allowUploads,
  11080.         textarea: this.textarea
  11081.       }),
  11082.       this.constructor.mustVerifyEmailToPost(this.session.user, this.thread.forum) && this._alertMustVerify(this.shouldShowEmailAlertInForm),
  11083.       this._isHidden && this.$el.addClass('hidden'),
  11084.       this.initStarRatings(),
  11085.       this
  11086.     },
  11087.     createTextarea: function () {
  11088.       var a = {
  11089.         placeholder: this.getPlaceholderText(),
  11090.         storageKey: this.post.storageKey()
  11091.       };
  11092.       return this.constructor.canUseContentEditable ? new this.constructor.ContentEditableView(a) : new this.constructor.TextareaView(a)
  11093.     },
  11094.     initTextarea: function () {
  11095.       var a = this.textarea = this.createTextarea();
  11096.       this.$('[data-role=textarea]').prepend(a.render().el),
  11097.       this.listenTo(a, {
  11098.         keydown: function (a) {
  11099.           !a || !a.ctrlKey && !a.metaKey || 13 !== a.keyCode && 10 !== a.keyCode || this.submitForm(),
  11100.           this.session.get('banned') && this.alertBannedError()
  11101.         },
  11102.         focus: function () {
  11103.           this.$el.hasClass('expanded') || this.$el.addClass('expanded')
  11104.         }
  11105.       })
  11106.     },
  11107.     resize: function () {
  11108.       this.textarea.resize()
  11109.     },
  11110.     focus: function () {
  11111.       this.textarea.focus()
  11112.     },
  11113.     clear: function () {
  11114.       var a = this;
  11115.       a.textarea.clear(),
  11116.       a.clearMediaPreviews(),
  11117.       a.$el.removeClass('expanded'),
  11118.       b.delay(function () {
  11119.         a.resize()
  11120.       }, 200),
  11121.       a.parent && a.hide()
  11122.     },
  11123.     restore: function (a) {
  11124.       var c = this;
  11125.       c.textarea.set(a.get('raw_message')),
  11126.       c.textarea.handleFocusIn(),
  11127.       b.delay(function () {
  11128.         c.resize()
  11129.       }, 200),
  11130.       c.parent && c.show()
  11131.     },
  11132.     _alertMustVerify: function (a) {
  11133.       var b = this.emailVerifyAlertTemplate({
  11134.         user: this.session.user.toJSON(),
  11135.         forumName: this.thread.forum.get('name'),
  11136.         forumId: this.thread.forum.id
  11137.       });
  11138.       this.alert(b, {
  11139.         safe: !0,
  11140.         type: a ? 'error' : 'warn',
  11141.         target: a ? this.postboxAlertSelector : null
  11142.       })
  11143.     },
  11144.     submitForm: s(function () {
  11145.       return this.dismissAlert(),
  11146.       this.initiatePost()
  11147.     }),
  11148.     makePostInstance: function () {
  11149.       return new f(this.constructor.Post, {
  11150.         thread: this.thread.id,
  11151.         depth: this.parent ? this.parent.get('depth') + 1 : 0,
  11152.         parent: this.parent ? this.parent.id : null
  11153.       })
  11154.     },
  11155.     getPostParams: function () {
  11156.       var a = {
  11157.         raw_message: this.textarea.get(),
  11158.         rating: this.rating
  11159.       };
  11160.       b.extend(a, this.getAuthorParams());
  11161.       var c = this.mediaUploadsView;
  11162.       return c && (a.media = c.rich.invoke('toJSON')),
  11163.       a
  11164.     },
  11165.     getAuthorParams: function () {
  11166.       return {
  11167.         author_id: this.session.user.id
  11168.       }
  11169.     },
  11170.     initiatePost: function () {
  11171.       this.createPost(this.getPostParams())
  11172.     },
  11173.     createPost: function (c) {
  11174.       var d = this,
  11175.       e = this.post;
  11176.       this.dismissAlert();
  11177.       var f = a.now();
  11178.       if (!this.shouldAbortCreatePost(e, c)) return this.listenTo(e, {
  11179.         error: this._onCreateError,
  11180.         sync: b.partial(this._onCreateSync, f)
  11181.       }),
  11182.       e.save(c, {
  11183.         success: function () {
  11184.           b.isNumber(d.rating) && q.isThreadModelRatingsEnabled(d.thread) && (d.thread.set('userRating', d.rating), b.delay(b.bind(d.thread.fetchRatings, d.thread), 500))
  11185.         }
  11186.       }),
  11187.       this.attachAuthorToPost(e, c),
  11188.       e.created = !0,
  11189.       this.addPostToThread(e),
  11190.       this.clear(),
  11191.       e
  11192.     },
  11193.     shouldAbortCreatePost: function (a, b) {
  11194.       return this.isUploadInProgress() ? (this.alert(r('Please wait until your images finish uploading.'), {
  11195.         type: 'error',
  11196.         target: this.postboxAlertSelector
  11197.       }), !0) : !a.set(b, {
  11198.         validate: !0
  11199.       }) && (this.alert(a.validationError, {
  11200.         type: 'error',
  11201.         target: this.postboxAlertSelector
  11202.       }), !0)
  11203.     },
  11204.     alertBannedError: function () {
  11205.       var a = {
  11206.         blocker: this.session.user.get('isOnGlobalBlacklist') ? 'Disqus' : this.thread.forum.get('name')
  11207.       };
  11208.       if (this.session.get('banExpires')) {
  11209.         var b = e(l.assureTzOffset(this.session.get('banExpires')), l.ISO_8601);
  11210.         if (b.isBefore(e())) return;
  11211.         a.expirationRelative = b.fromNow()
  11212.       }
  11213.       this.alert(this.blacklistErrorMessageTemplate(a), {
  11214.         type: 'error',
  11215.         target: this.postboxAlertSelector,
  11216.         safe: !0
  11217.       })
  11218.     },
  11219.     _onCreateError: function (a, c) {
  11220.       12 === c.code && /not have permission to post on this thread/.test(c.response) ? this.alertBannedError() : 12 === c.code && /not have permission via SSO to post on this thread/.test(c.response) ? this.thread.forum.get('name') ? this.alert(k.interpolate(r('Please sign into %(forumName)s to comment.'), {
  11221.         forumName: this.thread.forum.get('name')
  11222.       }), {
  11223.         type: 'error',
  11224.         target: this.postboxAlertSelector
  11225.       }) : this.alert(r('Please sign into this site to comment'), {
  11226.         type: 'error',
  11227.         target: this.postboxAlertSelector
  11228.       }) : 12 === c.code && /verify/.test(c.response) ? this._alertMustVerify(!0) : b.isString(c.response) ? this.alert(c.response, {
  11229.         type: 'error',
  11230.         target: this.postboxAlertSelector
  11231.       }) : this.alert(r('Oops! We\'re having trouble posting your comment. Check your internet connection and try again.'), {
  11232.         type: 'error',
  11233.         target: this.postboxAlertSelector
  11234.       }),
  11235.       this.thread.posts.remove(a),
  11236.       this.restore(a)
  11237.     },
  11238.     _onCreateSync: function (b, c) {
  11239.       this.textarea.removeDraft(),
  11240.       this.thread.trigger('create', c),
  11241.       this.trigger('uiCallback:postCreated', c, {
  11242.         duration: a.now() - b
  11243.       }),
  11244.       this.parentView && this.parentView.toggleReplyLink(!1),
  11245.       this.stopListening(c, 'error', this._onCreateError),
  11246.       this.stopListening(c, 'sync', this._onCreateSync),
  11247.       this.post = this.makePostInstance(),
  11248.       this.trigger('domReflow')
  11249.     },
  11250.     attachAuthorToPost: function (a, b) {
  11251.       this.session.isLoggedIn() ? a.author = this.session.user : a.author = new f(this.constructor.User, {
  11252.         name: b.author_name,
  11253.         email: b.author_email
  11254.       })
  11255.     },
  11256.     addPostToThread: function (a) {
  11257.       this.thread.posts.add(a)
  11258.     },
  11259.     remove: function () {
  11260.       this.parent && delete t.open[this.parent.cid],
  11261.       c.View.prototype.remove.call(this)
  11262.     },
  11263.     toggle: function () {
  11264.       this.isOpen() ? this.hide() : this.show()
  11265.     },
  11266.     show: function () {
  11267.       var a = this;
  11268.       a._isHidden = !1,
  11269.       a.$el.removeClass('hidden'),
  11270.       a.trigger('show')
  11271.     },
  11272.     hide: function () {
  11273.       var a = this;
  11274.       a._isHidden = !0,
  11275.       a.dismissAlert(),
  11276.       a.$el.addClass('hidden'),
  11277.       a.trigger('hide')
  11278.     },
  11279.     isOpen: function () {
  11280.       return !this._isHidden
  11281.     }
  11282.   }, {
  11283.     mustVerifyEmailToPost: function (a, b) {
  11284.       if (a.isAnonymous()) return !1;
  11285.       var c = b.get('settings').mustVerifyEmail,
  11286.       d = a.get('isVerified');
  11287.       return c && !d
  11288.     },
  11289.     canUseContentEditable: d.contenteditable && !m.isMobileUserAgent() && !(window.opera && window.opera.version),
  11290.     TextareaView: p,
  11291.     ContentEditableView: o,
  11292.     User: j,
  11293.     Post: i,
  11294.     open: {
  11295.     }
  11296.   });
  11297.   return g.call(t.prototype),
  11298.   h.call(t.prototype),
  11299.   t
  11300. }),
  11301. define('constants/gifPickerConstants', [
  11302. ], function () {
  11303.   'use strict';
  11304.   return {
  11305.     GIF_PICKER_CATEGORIES: {
  11306.       LEFT: [
  11307.         {
  11308.           title: 'Trending',
  11309.           gifUrl: 'https://media.giphy.com/media/WsV5AoDeKePw4/200w_d.gif',
  11310.           width: 200,
  11311.           height: 113
  11312.         },
  11313.         {
  11314.           title: 'OMG',
  11315.           gifUrl: 'https://media.giphy.com/media/5VKbvrjxpVJCM/200w_d.gif',
  11316.           width: 200,
  11317.           height: 160
  11318.         },
  11319.         {
  11320.           title: 'No',
  11321.           gifUrl: 'https://media.giphy.com/media/z5WtAAaFpnIgU/200w_d.gif',
  11322.           width: 200,
  11323.           height: 150
  11324.         },
  11325.         {
  11326.           title: 'Slow clap',
  11327.           gifUrl: 'https://media.giphy.com/media/58FMN3DmsmYta2m0aB/200w_d.gif',
  11328.           width: 200,
  11329.           height: 150
  11330.         },
  11331.         {
  11332.           title: 'Love',
  11333.           gifUrl: 'https://media.giphy.com/media/Xf7g5BjIIMun8fR14k/200w_d.gif',
  11334.           width: 200,
  11335.           height: 199
  11336.         },
  11337.         {
  11338.           title: 'Eye roll',
  11339.           gifUrl: 'https://media.giphy.com/media/sbwjM9VRh0mLm/200w_d.gif',
  11340.           width: 200,
  11341.           height: 142
  11342.         }
  11343.       ],
  11344.       RIGHT: [
  11345.         {
  11346.           title: 'Applause',
  11347.           gifUrl: 'https://media.giphy.com/media/fnK0jeA8vIh2QLq3IZ/200w_d.gif',
  11348.           width: 200,
  11349.           height: 201
  11350.         },
  11351.         {
  11352.           title: 'Agree',
  11353.           gifUrl: 'https://media.giphy.com/media/3og0ILzGlzG26yNINq/200w_d.gif',
  11354.           width: 200,
  11355.           height: 166
  11356.         },
  11357.         {
  11358.           title: 'Ok',
  11359.           gifUrl: 'https://media.giphy.com/media/mgqefqwSbToPe/200w_d.gif',
  11360.           width: 200,
  11361.           height: 150
  11362.         },
  11363.         {
  11364.           title: 'Thumbs up',
  11365.           gifUrl: 'https://media.giphy.com/media/j5QcmXoFWl4Q0/200w_d.gif',
  11366.           width: 200,
  11367.           height: 125
  11368.         },
  11369.         {
  11370.           title: 'Thumbs down',
  11371.           gifUrl: 'https://media.giphy.com/media/KUrgyFtn9bQNW/200w_d.gif',
  11372.           width: 200,
  11373.           height: 128
  11374.         },
  11375.         {
  11376.           title: 'Thank you',
  11377.           gifUrl: 'https://media.giphy.com/media/QAsBwSjx9zVKoGp9nr/200w_d.gif',
  11378.           width: 200,
  11379.           height: 144
  11380.         }
  11381.       ]
  11382.     }
  11383.   }
  11384. }),
  11385. define('templates/lounge/gifsView', [
  11386.   'react'
  11387. ], function (a) {
  11388.   'use strict';
  11389.   var b = function (b) {
  11390.     return a.createElement('div', {
  11391.       className: 'gif-picker__gifs-view'
  11392.     }, a.createElement('div', {
  11393.       className: 'gif-picker__gifs-view-left'
  11394.     }, b.gifsLeft ? b.gifsLeft.map(function (b) {
  11395.       return a.createElement('div', {
  11396.         key: b.id,
  11397.         className: 'gif-picker__image',
  11398.         'data-action': 'gif-picker-image',
  11399.         'data-tag': b['default'].url,
  11400.         tabIndex: '0',
  11401.         'aria-label': b.title
  11402.       }, a.createElement('img', {
  11403.         src: b.fixedWidth200.url,
  11404.         title: b.title,
  11405.         style: {
  11406.           height: parseInt(b.fixedWidth200.height, 10) + 'px',
  11407.           width: parseInt(b.fixedWidth200.width, 10) + 'px'
  11408.         }
  11409.       }))
  11410.     }) : null), a.createElement('div', {
  11411.       className: 'gif-picker__gifs-view-right'
  11412.     }, b.gifsRight ? b.gifsRight.map(function (b) {
  11413.       return a.createElement('div', {
  11414.         key: b.fixedWidth200.url,
  11415.         className: 'gif-picker__image',
  11416.         'data-action': 'gif-picker-image',
  11417.         'data-tag': b['default'].url
  11418.       }, a.createElement('img', {
  11419.         src: b.fixedWidth200.url,
  11420.         title: b.title,
  11421.         style: {
  11422.           height: parseInt(b.fixedWidth200.height, 10) + 'px',
  11423.           width: parseInt(b.fixedWidth200.width, 10) + 'px'
  11424.         }
  11425.       }))
  11426.     }) : null))
  11427.   };
  11428.   return b
  11429. }),
  11430. define('templates/lounge/gifsCategory', [
  11431.   'react',
  11432.   'core/strings'
  11433. ], function (a, b) {
  11434.   'use strict';
  11435.   var c = b.get,
  11436.   d = function (d) {
  11437.     return a.createElement('div', {
  11438.       className: 'gif-picker__gifs-view gif-picker__categories'
  11439.     }, a.createElement('div', {
  11440.       className: 'gif-picker__gifs-view-left'
  11441.     }, d.categoriesLeft ? d.categoriesLeft.map(function (d) {
  11442.       return a.createElement('div', {
  11443.         key: d.title,
  11444.         className: 'gif-picker__image',
  11445.         'data-action': 'gif-picker-category',
  11446.         'data-tag': d.title,
  11447.         tabIndex: '0',
  11448.         'aria-label': 'Collection of animated images in the category of ' + d.title
  11449.       }, a.createElement('img', {
  11450.         src: d.gifUrl,
  11451.         className: 'gif-picker__category-gif',
  11452.         style: {
  11453.           height: d.height + 'px',
  11454.           width: d.width + 'px'
  11455.         }
  11456.       }), a.createElement('div', {
  11457.         className: 'gif-picker__category-overlay'
  11458.       }), a.createElement('div', {
  11459.         className: 'gif-picker__category-title align align--middle align--center'
  11460.       }, a.createElement('b', null, b.interpolate(c('%(title)s'), {
  11461.         title: d.title
  11462.       }))))
  11463.     }) : null), a.createElement('div', {
  11464.       className: 'gif-picker__gifs-view-right'
  11465.     }, d.categoriesRight ? d.categoriesRight.map(function (d) {
  11466.       return a.createElement('div', {
  11467.         key: d.title,
  11468.         className: 'gif-picker__image',
  11469.         'data-action': 'gif-picker-category',
  11470.         'data-tag': d.title,
  11471.         tabIndex: '0',
  11472.         'aria-label': 'Collection of animated images in the category of ' + d.title
  11473.       }, a.createElement('img', {
  11474.         src: d.gifUrl,
  11475.         className: 'gif-picker__category-gif',
  11476.         style: {
  11477.           height: d.height + 'px',
  11478.           width: d.width + 'px'
  11479.         }
  11480.       }), a.createElement('div', {
  11481.         className: 'gif-picker__category-overlay'
  11482.       }), a.createElement('div', {
  11483.         className: 'gif-picker__category-title align align--middle align--center'
  11484.       }, a.createElement('b', null, b.interpolate(c('%(title)s'), {
  11485.         title: d.title
  11486.       }))))
  11487.     }) : null))
  11488.   };
  11489.   return d
  11490. }),
  11491. define('templates/lounge/gifsPopout', [
  11492.   'react',
  11493.   'core/strings'
  11494. ], function (a, b) {
  11495.   'use strict';
  11496.   var c = b.get,
  11497.   d = function () {
  11498.     return a.createElement('div', {
  11499.       className: 'gif-picker__popout'
  11500.     }, a.createElement('textarea', {
  11501.       className: 'gif-picker__search-bar',
  11502.       placeholder: c('Search for gifs'),
  11503.       'data-role': 'gif-picker-input',
  11504.       wrap: 'soft',
  11505.       rows: '1'
  11506.     }), a.createElement('div', {
  11507.       className: 'gif-picker__gifs-view-container',
  11508.       'data-role': 'gifs-view-container'
  11509.     }), a.createElement('img', {
  11510.       className: 'gif-picker__powered-by',
  11511.       src: 'https://c.disquscdn.com/next/embed/assets/img/powered-by-giphy.b72f56fe31b44adb55a65c343c691d63.png'
  11512.     }))
  11513.   };
  11514.   return d
  11515. }),
  11516. define('lounge/mixins/asGifPicker', [
  11517.   'jquery',
  11518.   'underscore',
  11519.   'core/bus',
  11520.   'core/strings',
  11521.   'constants/gifPickerConstants',
  11522.   'templates/lounge/gifsView',
  11523.   'templates/lounge/gifsCategory',
  11524.   'templates/lounge/gifsPopout',
  11525.   'common/collections'
  11526. ], function (a, b, c, d, e, f, g, h, i) {
  11527.   'use strict';
  11528.   var j = d.get,
  11529.   k = {
  11530.     events: {
  11531.       'mousedown  [data-role=gif-picker-toggle]': 'toggleGifPicker',
  11532.       'keydown  [data-role=gif-picker-toggle]': 'toggleGifPicker',
  11533.       'mousedown  [data-action=gif-picker-image]': 'pickGif',
  11534.       'keydown  [data-action=gif-picker-image]': 'pickGif',
  11535.       'mousedown  [data-action=gif-picker-category]': 'pickGifCategory',
  11536.       'keydown  [data-action=gif-picker-category]': 'pickGifCategory',
  11537.       'keydown    [data-role=gif-picker-input]': 'onKeydown',
  11538.       'keyup      [data-role=gif-picker-input]': 'onKeyup'
  11539.     },
  11540.     initialize: function (a, b) {
  11541.       b = b || {
  11542.       },
  11543.       a.call(this, b)
  11544.     },
  11545.     initGifPicker: function () {
  11546.       this.gifPicker = this.$('.gif-picker'),
  11547.       this.toggle = this.$('[data-role=gif-picker-toggle]'),
  11548.       this.gifsCollection = new i.GifObjectsCollection,
  11549.       this.popoutContainer = this.$('[data-role=gif-picker-popout-container]'),
  11550.       this.categories = e.GIF_PICKER_CATEGORIES,
  11551.       this.gifPickerQuery = null,
  11552.       this.rescrollToTop = 0,
  11553.       this.popoutTemplate = h({
  11554.       }),
  11555.       this.popoutContainer.html(this.popoutTemplate),
  11556.       this.renderCategoriesView(),
  11557.       this.revealGifPicker(),
  11558.       this.listenTo(this.gifsCollection, 'sync', this.syncGifsCollection)
  11559.     },
  11560.     fetchGifObjectsCollection: function (a) {
  11561.       this.gifsCollection.fetch({
  11562.         forum: this.thread.forum.id,
  11563.         query: a
  11564.       })
  11565.     },
  11566.     syncGifsCollection: function () {
  11567.       this.renderGifsView(),
  11568.       this.positionGifPickerPopout(),
  11569.       this.gifsView[0].scrollTo({
  11570.         top: this.rescrollToTop
  11571.       })
  11572.     },
  11573.     dismissGifPicker: function (b) {
  11574.       this.gifPicker.length && !this.gifPicker[0].contains(b.target) && (this.hideGifPicker(), a(window).off('mousedown', this.dismissGifPicker))
  11575.     },
  11576.     toggleGifPicker: function (a) {
  11577.       if ('keydown' === a.type) {
  11578.         var b = 13,
  11579.         c = 32;
  11580.         if (a.keyCode !== b && a.keyCode !== c) return;
  11581.         a.preventDefault()
  11582.       }
  11583.       this.popoutTemplate ? this.popoutContainer.hasClass('hidden') ? this.revealGifPicker() : this.hideGifPicker() : this.initGifPicker()
  11584.     },
  11585.     pickGif: function (a) {
  11586.       if ('keydown' === a.type) {
  11587.         if (32 !== a.keyCode && 13 !== a.keyCode) return;
  11588.         a.preventDefault()
  11589.       }
  11590.       this.textarea.set(this.textarea.get() + ' ' + a.currentTarget.getAttribute('data-tag')),
  11591.       b.delay(b.bind(function () {
  11592.         this.hideGifPicker()
  11593.       }, this), 500)
  11594.     },
  11595.     pickGifCategory: function (a) {
  11596.       if ('keydown' === a.type) {
  11597.         if (32 !== a.keyCode && 13 !== a.keyCode) return;
  11598.         a.preventDefault()
  11599.       }
  11600.       var b = a.currentTarget.getAttribute('data-tag');
  11601.       b = 'Trending' === b ? '' : d.interpolate(j('%(category)s'), {
  11602.         category: b
  11603.       }),
  11604.       this.gifPickerQuery = b,
  11605.       this.rescrollToTop = 0,
  11606.       this.fetchGifObjectsCollection(b),
  11607.       this.gifsInput.val(b)
  11608.     },
  11609.     revealGifPicker: function () {
  11610.       this.popoutContainer.removeClass('hidden'),
  11611.       a(window).on('mousedown', b.bind(this.dismissGifPicker, this)),
  11612.       this.positionGifPickerPopout(),
  11613.       this.triggerClick()
  11614.     },
  11615.     hideGifPicker: function () {
  11616.       this.popoutContainer.addClass('hidden')
  11617.     },
  11618.     onKeydown: function (a) {
  11619.       13 === a.keyCode && a.preventDefault()
  11620.     },
  11621.     onKeyup: function (a) {
  11622.       a.target.value !== this.gifPickerQuery && (this.gifPickerQuery = '' === a.target.value ? null : a.target.value, this.rescrollToTop = 0, this.debouncedSearch())
  11623.     },
  11624.     debouncedSearch: b.debounce(function () {
  11625.       this.gifPickerQuery || '' === this.gifPickerQuery ? this.fetchGifObjectsCollection(this.gifPickerQuery) : this.renderCategoriesView()
  11626.     }, 250),
  11627.     renderCategoriesView: function () {
  11628.       this.gifsCollection.reset(),
  11629.       this.gifsContainer = this.$('[data-role=gifs-view-container]'),
  11630.       this.gifsInput = this.$('[data-role=gif-picker-input]'),
  11631.       this.gifCategories ? (this.gifsContainer.html(this.gifCategories), this.gifsView = this.gifCategories) : (this.gifsContainer.html(g({
  11632.         categoriesLeft: this.categories.LEFT,
  11633.         categoriesRight: this.categories.RIGHT
  11634.       })), this.gifCategories = this.gifsView = this.gifsContainer.children())
  11635.     },
  11636.     renderGifsView: function () {
  11637.       var a = this.gifsCollection && this.gifsCollection.toJSON(),
  11638.       c = [
  11639.       ],
  11640.       d = [
  11641.       ],
  11642.       e = 0,
  11643.       g = 0;
  11644.       b.forEach(a, function (a) {
  11645.         var b = parseInt(a.fixedWidth200.height, 10) + 10;
  11646.         g >= e ? (c.push(a), e += b) : (d.push(a), g += b)
  11647.       }),
  11648.       this.gifsContainer.html(f({
  11649.         gifsLeft: c,
  11650.         gifsRight: d
  11651.       })),
  11652.       this.gifsView = this.gifsContainer.children()
  11653.     },
  11654.     positionGifPickerPopout: function () {
  11655.       var b = this,
  11656.       c = 450,
  11657.       d = 800,
  11658.       e = 0,
  11659.       f = 0,
  11660.       g = d,
  11661.       h = !1,
  11662.       i = 873,
  11663.       j = 236,
  11664.       k = 73,
  11665.       l = 20,
  11666.       m = this.toggle.outerWidth() + 2,
  11667.       n = this.popoutContainer.height() + l,
  11668.       o = this.toggle.outerHeight(),
  11669.       p = this.toggle.offset().left,
  11670.       q = this.toggle.offset().top + o - 2,
  11671.       r = a(window.document).height(),
  11672.       s = a(window.document).width();
  11673.       if (n > r || n < i && n < r && r < i ? (g = Math.min(r, i) - k, e = - q + o, f = m, h = !0) : r > i && r - q < i ? (e = r - q - Math.max(n, i) + o, f = m, h = !0) : r - q > i && (h = !0, e = o, f = Math.min(0, s - (this.toggle.offset().left + j))), s < c) {
  11674.         this.popoutContainer.find('.gif-picker__popout').css({
  11675.           padding: '4px 4px 4px'
  11676.         });
  11677.         var t = this.popoutContainer.outerWidth() - this.gifsView.outerWidth(),
  11678.         u = s - (p + t + f + 10),
  11679.         v = u / 2;
  11680.         this.popoutContainer.find('.gif-picker__image > img').each(function () {
  11681.           a(this).css({
  11682.             width: v,
  11683.             height: v * a(this).height() / a(this).width()
  11684.           })
  11685.         }),
  11686.         h = !0
  11687.       }
  11688.       h && (this.gifsView.css('maxHeight', g), this.popoutContainer.css({
  11689.         top: e,
  11690.         left: f
  11691.       })),
  11692.       this.lastScrollTop = 0,
  11693.       this.gifsView[0].onscroll = function (a) {
  11694.         var c = a.target.scrollHeight - a.target.scrollTop - g,
  11695.         d = a.target.scrollTop > b.lastScrollTop;
  11696.         b.lastScrollTop = a.target.scrollTop,
  11697.         b.rescrollToTop = a.target.scrollTop,
  11698.         d && null !== b.gifPickerQuery && c < Math.min(1000, 0.5 * g) && b.throttledOnScrollToBottom(a.target.scrollTop)
  11699.       }
  11700.     },
  11701.     throttledOnScrollToBottom: b.throttle(function () {
  11702.       this.debouncedSearch()
  11703.     }, 500, {
  11704.       trailing: !1
  11705.     }),
  11706.     triggerClick: function () {
  11707.       c.trigger('uiAction:gifsClickButton')
  11708.     },
  11709.     triggerScroll: function () {
  11710.       c.trigger('uiAction:gifsScrollToBottom')
  11711.     }
  11712.   };
  11713.   return function () {
  11714.     this.events = b.defaults({
  11715.     }, this.events, k.events),
  11716.     this.initialize = b.wrap(this.initialize, k.initialize),
  11717.     b.extend(this, b.pick(k, [
  11718.       'initGifPicker',
  11719.       'fetchGifObjectsCollection',
  11720.       'syncGifsCollection',
  11721.       'toggleGifPicker',
  11722.       'dismissGifPicker',
  11723.       'pickGif',
  11724.       'pickGifCategory',
  11725.       'revealGifPicker',
  11726.       'hideGifPicker',
  11727.       'onKeydown',
  11728.       'onKeyup',
  11729.       'debouncedSearch',
  11730.       'renderCategoriesView',
  11731.       'renderGifsView',
  11732.       'positionGifPickerPopout',
  11733.       'throttledOnScrollToBottom',
  11734.       'triggerClick',
  11735.       'triggerScroll'
  11736.     ]))
  11737.   }
  11738. }),
  11739. define('core/constants/textEditorConstants', [
  11740.   'exports'
  11741. ], function (a) {
  11742.   'use strict';
  11743.   a.EDITOR_BUTTONS_ORDER = [
  11744.     'b',
  11745.     'spoiler',
  11746.     'i',
  11747.     's',
  11748.     'u',
  11749.     'a',
  11750.     'code',
  11751.     'blockquote'
  11752.   ],
  11753.   a.GIF_PICKER_BUTTON = 'gif-picker',
  11754.   a.MEDIA_UPLOADER_BUTTON = 'media-uploader'
  11755. }),
  11756. define('lounge/mixins/asTextEditor', [
  11757.   'jquery',
  11758.   'underscore',
  11759.   'core/constants/textEditorConstants'
  11760. ], function (a, b, c) {
  11761.   'use strict';
  11762.   var d = {
  11763.     events: {
  11764.       'mousedown [data-action=text-editor-tag]': 'textEditorTag',
  11765.       'keydown [data-action=text-editor-tag]': 'textEditorTag',
  11766.       'mouseup   [data-action=text-editor-buttons]': 'textEditorForceSelectText',
  11767.       'mousedown [data-role=editable]': 'textEditorMouseDown',
  11768.       'keyup     [data-role=editable]': 'textEditorKeyUp',
  11769.       'keydown   [data-role=editable]': 'textEditorKeyDown'
  11770.     },
  11771.     initialize: function (c, d) {
  11772.       d = d || {
  11773.       },
  11774.       c.call(this, d),
  11775.       this.textEditorMouseUp = b.bind(this.textEditorMouseUp, this),
  11776.       this.editBox = this.el && this.el.className && this.el.className.indexOf('edit') > - 1,
  11777.       a(window).on('resize', b.bind(this.initTextEditor, this)),
  11778.       this.mostRecentPostBoxWidth = null
  11779.     },
  11780.     textEditorTag: function (a) {
  11781.       if ('keydown' === a.type) {
  11782.         var b = 13,
  11783.         c = 32;
  11784.         return void (a.keyCode !== b && a.keyCode !== c || (a.preventDefault(), this.textarea.addTag(a.currentTarget.getAttribute('data-tag'))))
  11785.       }
  11786.       this.textarea.addTag(a.currentTarget.getAttribute('data-tag'))
  11787.     },
  11788.     textEditorForceSelectText: function () {
  11789.       this.textarea.selectText()
  11790.     },
  11791.     textEditorMouseDown: function () {
  11792.       a(window).on('mouseup', this.textEditorMouseUp)
  11793.     },
  11794.     textEditorMouseUp: function () {
  11795.       a(window).off('mouseup', this.textEditorMouseUp),
  11796.       setTimeout(b.bind(this.textarea.setSelection, this.textarea), 200)
  11797.     },
  11798.     textEditorKeyUp: function () {
  11799.       this.textarea.setSelection()
  11800.     },
  11801.     textEditorKeyDown: function (a) {
  11802.       !a.ctrlKey && !a.metaKey || 'z' !== a.key && 'y' !== a.key && 'Z' !== a.key && 'Y' !== a.key ? this.textarea.debouncedSaveHistory() : (a.preventDefault(), this.textarea.debouncedSaveHistory(), 'y' === a.key || 'Y' === a.key || a.shiftKey && ('z' === a.key || 'Z' === a.key) ? this.textarea.redoTextarea() : 'z' !== a.key && 'Z' !== a.key || this.textarea.undoTextarea())
  11803.     },
  11804.     getTextEditorTemplateData: function () {
  11805.       var a = [
  11806.       ],
  11807.       b = !this.editBox && this.gifPickerEnabled,
  11808.       d = !this.editBox && this.allowUploads,
  11809.       e = this.$('.post-actions').outerWidth() || 0;
  11810.       this.mostRecentPostBoxWidth = e;
  11811.       var f = this.$('.wysiwyg__item').outerWidth(!0) || 0,
  11812.       g = (this.$('.edit-button').outerWidth() || 0) + (this.$('.post-action__cancel').outerWidth(!0) || 0),
  11813.       h = this.$('.full-size-button').outerWidth() || 0,
  11814.       i = this.$('.small-size-button').outerWidth() || 0,
  11815.       j = b || d ? this.$('.vertical-separator').outerWidth() || 30 : 0,
  11816.       k = c.EDITOR_BUTTONS_ORDER.length + (!this.editBox && this.gifPickerEnabled ? 1 : 0) + (!this.editBox && this.allowUploads ? 1 : 0),
  11817.       l = h + j + (k + 1) * f >= e,
  11818.       m = l ? i : h,
  11819.       n = this.editBox ? g : m,
  11820.       o = Math.floor((e - n - j) / f) || 0;
  11821.       return b && o > a.length && (a = a.concat([c.GIF_PICKER_BUTTON])),
  11822.       o > a.length && (a = a.concat(c.EDITOR_BUTTONS_ORDER.slice(0, 1))),
  11823.       d && o > a.length && (a = a.concat([c.MEDIA_UPLOADER_BUTTON])),
  11824.       o > a.length && (a = a.concat(c.EDITOR_BUTTONS_ORDER.slice(1, o - a.length))),
  11825.       {
  11826.         user: this.session.toJSON(),
  11827.         displayMediaPreviews: this.mediaembedEnabled || this.gifPickerEnabled,
  11828.         displayMediaUploadButton: this.allowUploads,
  11829.         gifPickerEnabled: this.gifPickerEnabled,
  11830.         useSmallPostButton: l,
  11831.         buttonsToShow: a,
  11832.         edit: this.editBox,
  11833.         forum: this.thread.forum.id
  11834.       }
  11835.     },
  11836.     initTextEditor: function (a, b) {
  11837.       var c = this.$('.post-actions').outerWidth();
  11838.       if (!(a && 'resize' === a.type && this.mostRecentPostBoxWidth && c && c === this.mostRecentPostBoxWidth)) return this.$('.text-editor-container').html(this.textEditorTemplate(this.getTextEditorTemplateData())),
  11839.       b && null === c ? void this.initTextEditor(null, !1) : void (!this.editBox && this.textarea && this.initMediaViews({
  11840.         mediaembedEnabled: this.mediaembedEnabled,
  11841.         gifPickerEnabled: this.gifPickerEnabled,
  11842.         allowUploads: this.allowUploads,
  11843.         textarea: this.textarea
  11844.       }))
  11845.     }
  11846.   };
  11847.   return function () {
  11848.     this.events = b.defaults({
  11849.     }, this.events, d.events),
  11850.     this.initialize = b.wrap(this.initialize, d.initialize),
  11851.     b.extend(this, b.pick(d, [
  11852.       'textEditorTag',
  11853.       'textEditorForceSelectText',
  11854.       'textEditorMouseDown',
  11855.       'textEditorMouseUp',
  11856.       'textEditorKeyUp',
  11857.       'textEditorKeyDown',
  11858.       'getTextEditorTemplateData',
  11859.       'initTextEditor'
  11860.     ]))
  11861.   }
  11862. }),
  11863. define('lounge/mixins/asTextEditorV2', [
  11864.   'underscore',
  11865.   'core/strings',
  11866.   'core/switches'
  11867. ], function (a, b, c) {
  11868.   'use strict';
  11869.   var d = b.translations,
  11870.   e = [
  11871.   ];
  11872.   Object.defineProperties(window, {
  11873.     _loadTextEditor: {
  11874.       writable: !0
  11875.     },
  11876.     loadTextEditor: {
  11877.       get: function () {
  11878.         return this._loadTextEditor
  11879.       },
  11880.       set: function (a) {
  11881.         for (this._loadTextEditor = a; e.length; ) {
  11882.           var b = e.shift();
  11883.           b()
  11884.         }
  11885.       }
  11886.     }
  11887.   });
  11888.   var f = {
  11889.     initialize: function (a, b) {
  11890.       a.call(this, b),
  11891.       this.isEmbedV2Enabled = c.isFeatureActive('embed_v2', {
  11892.         forum: this.thread.forum.id
  11893.       })
  11894.     },
  11895.     loadEditorV2: function (b) {
  11896.       var c = this.$el.find('[data-role=textarea]') [0],
  11897.       f = a.extend({
  11898.         forum: this.thread.forum.id,
  11899.         thread: this.thread.id,
  11900.         lang: this.thread.forum.get('language'),
  11901.         translations: d,
  11902.         setAlert: a.partial(this.alert, a, a, !0).bind(this),
  11903.         clearAlert: this.alert.bind(this, '', null, !0),
  11904.         key: this.post && this.post.cid
  11905.       }, b),
  11906.       g = function () {
  11907.         var a = this.editorV2Root && this.editorV2Root._internalRoot && this.editorV2Root._internalRoot.containerInfo === c;
  11908.         this.editorV2Root && !a ? (this.editorV2Root.unmount(), this.editorV2Root = window.loadTextEditor(c, f)) : this.editorV2Root = window.loadTextEditor(c, f, this.editorV2Root)
  11909.       };
  11910.       window.loadTextEditor ? g.call(this) : e.push(g.bind(this))
  11911.     },
  11912.     resize: function (a) {
  11913.       this.isEmbedV2Enabled || a.call(this)
  11914.     },
  11915.     focus: function (a) {
  11916.       this.isEmbedV2Enabled || a.call(this)
  11917.     },
  11918.     initTextEditor: function (a) {
  11919.       this.isEmbedV2Enabled || a.call(this)
  11920.     },
  11921.     remove: function (a) {
  11922.       this.editorV2Root && (this.editorV2Root.unmount(), this.editorV2Root = null),
  11923.       a.call(this)
  11924.     },
  11925.     alert: function (a, b, c, d) {
  11926.       c = c || {
  11927.       };
  11928.       var e = '[role=postbox-alert]' === this._alertSelector || '[role=postbox-alert]' === c.target;
  11929.       if (!this.isEmbedV2Enabled || !d && !e) return a.call(this, b, c);
  11930.       var f = this.getEditorProps ? this.getEditorProps() : {
  11931.       };
  11932.       f.alert = {
  11933.         message: b,
  11934.         type: c.type,
  11935.         safe: c.safe
  11936.       },
  11937.       this.loadEditorV2(f)
  11938.     }
  11939.   };
  11940.   return function () {
  11941.     this.initialize = a.wrap(this.initialize, f.initialize),
  11942.     this.resize = a.wrap(this.resize, f.resize),
  11943.     this.focus = a.wrap(this.focus, f.focus),
  11944.     this.remove = a.wrap(this.remove, f.remove),
  11945.     this.alert = a.wrap(this.alert, f.alert),
  11946.     this.initTextEditor = a.wrap(this.initTextEditor, f.initTextEditor),
  11947.     a.extend(this, a.pick(f, [
  11948.       'loadEditorV2'
  11949.     ]))
  11950.   }
  11951. }),
  11952. define('templates/lounge/rate', [
  11953.   'react',
  11954.   'core/strings'
  11955. ], function (a, b) {
  11956.   'use strict';
  11957.   var c = b.gettext,
  11958.   d = function (b) {
  11959.     return a.createElement('div', {
  11960.       className: 'ratings-rate'
  11961.     }, a.createElement('div', {
  11962.       className: 'ratings-text'
  11963.     }, c(b.submitted ? 'You rated this' : 'Rate and comment')), a.createElement('div', {
  11964.       className: 'ratings-stars'
  11965.     }, a.createElement('div', {
  11966.       className: 'stars animation-star-container'
  11967.     }, a.createElement('div', {
  11968.       className: 'animation-star'
  11969.     }, a.createElement('div', {
  11970.       className: 'rating-star'
  11971.     }, '★'), a.createElement('div', {
  11972.       className: 'rating-star'
  11973.     }, '★'), a.createElement('div', {
  11974.       className: 'rating-star'
  11975.     }, '★'), a.createElement('div', {
  11976.       className: 'rating-star'
  11977.     }, '★'), a.createElement('div', {
  11978.       className: 'rating-star'
  11979.     }, '★'))), b.selected ? a.createElement('div', {
  11980.       className: 'stars selection-stars',
  11981.       style: {
  11982.         width: 20 * b.selectedValue + '%'
  11983.       }
  11984.     }, a.createElement('div', {
  11985.       className: 'rating-star'
  11986.     }, '★'), a.createElement('div', {
  11987.       className: 'rating-star'
  11988.     }, '★'), a.createElement('div', {
  11989.       className: 'rating-star'
  11990.     }, '★'), a.createElement('div', {
  11991.       className: 'rating-star'
  11992.     }, '★'), a.createElement('div', {
  11993.       className: 'rating-star'
  11994.     }, '★')) : null, a.createElement('div', {
  11995.       className: 'stars voting-stars'
  11996.     }, a.createElement('div', {
  11997.       className: 'rating-star',
  11998.       'data-action': 'rateThread',
  11999.       'data-tag': '1',
  12000.       tabIndex: '0'
  12001.     }, '★'), a.createElement('div', {
  12002.       className: 'rating-star',
  12003.       'data-action': 'rateThread',
  12004.       'data-tag': '2',
  12005.       tabIndex: '0'
  12006.     }, '★'), a.createElement('div', {
  12007.       className: 'rating-star',
  12008.       'data-action': 'rateThread',
  12009.       'data-tag': '3',
  12010.       tabIndex: '0'
  12011.     }, '★'), a.createElement('div', {
  12012.       className: 'rating-star',
  12013.       'data-action': 'rateThread',
  12014.       'data-tag': '4',
  12015.       tabIndex: '0'
  12016.     }, '★'), a.createElement('div', {
  12017.       className: 'rating-star',
  12018.       'data-action': 'rateThread',
  12019.       'data-tag': '5',
  12020.       tabIndex: '0'
  12021.     }, '★')), a.createElement('div', {
  12022.       className: 'stars base-stars'
  12023.     }, a.createElement('div', {
  12024.       className: 'rating-star'
  12025.     }, '★'), a.createElement('div', {
  12026.       className: 'rating-star'
  12027.     }, '★'), a.createElement('div', {
  12028.       className: 'rating-star'
  12029.     }, '★'), a.createElement('div', {
  12030.       className: 'rating-star'
  12031.     }, '★'), a.createElement('div', {
  12032.       className: 'rating-star'
  12033.     }, '★'))))
  12034.   };
  12035.   return d
  12036. }),
  12037. define('lounge/mixins/withStarRatings', [
  12038.   'underscore',
  12039.   'core/strings',
  12040.   'core/utils/threadRatingsHelpers',
  12041.   'templates/lounge/rate'
  12042. ], function (a, b, c, d) {
  12043.   'use strict';
  12044.   var e = b.gettext,
  12045.   f = 13,
  12046.   g = {
  12047.     events: {
  12048.       'click     [data-action=rateThread]': 'rateThread',
  12049.       'keydown   [data-action=rateThread]': function (a) {
  12050.         a.keyCode && a.keyCode === f && (a.preventDefault(), this.rateThread(a))
  12051.       },
  12052.       'mouseover [data-action=rateThread]': 'highlightRating',
  12053.       'mouseout  [data-action=rateThread]': 'unhighlightRating',
  12054.       'focusin   [data-action=rateThread]': 'highlightRating',
  12055.       'focusout  [data-action=rateThread]': 'unhighlightRating'
  12056.     },
  12057.     initialize: function (a, b) {
  12058.       b = b || {
  12059.       },
  12060.       a.call(this, b),
  12061.       this.rateTemplate = d,
  12062.       this.rating = null,
  12063.       this.ratingsEnabled = !this.post.get('parent') && c.isThreadModelRatingsEnabled(this.thread),
  12064.       this.listenTo(this.thread, 'change', function () {
  12065.         var a = this.thread.changedAttributes();
  12066.         return void 0 !== a.ratingsEnabled ? (this.ratingsEnabled = !this.post.get('parent') && c.isThreadModelRatingsEnabled(this.thread), this.initStarRatings(this.thread.get('userRating'))) : a.userRating && a.userRating !== this.rating ? this.initStarRatings(a.userRating) : void 0
  12067.       }),
  12068.       this.listenToOnce(this.thread.forum, 'change:features', function () {
  12069.         return this.ratingsEnabled = !this.post.get('parent') && c.isThreadModelRatingsEnabled(this.thread),
  12070.         this.initStarRatings(this.thread.get('userRating'))
  12071.       })
  12072.     },
  12073.     initStarRatings: function (b) {
  12074.       if (!this.ratingsEnabled) {
  12075.         var c = this.$('[data-role=ratings-container]');
  12076.         return void (c.length && this.$('[data-role=ratings-container]').empty())
  12077.       }
  12078.       return this.rating = a.isNumber(b) ? b : this.thread.get('userRating'),
  12079.       this.$('[data-role=ratings-container]').html(this.rateTemplate({
  12080.         selected: a.isNumber(this.rating),
  12081.         submitted: Boolean(this.thread.get('userRating')),
  12082.         selectedValue: this.rating
  12083.       }))
  12084.     },
  12085.     rateThread: function (a) {
  12086.       var b = this,
  12087.       c = parseInt(a.currentTarget.getAttribute('data-tag'), 10);
  12088.       Promise.resolve(this.initStarRatings(c)).then(function () {
  12089.         var a = b.$('.animation-star-container'),
  12090.         d = b.$('.animation-star-container > .animation-star');
  12091.         d.children().slice(c).remove(),
  12092.         a.addClass('animate-star'),
  12093.         d.css({
  12094.           position: 'absolute',
  12095.           left: '0',
  12096.           width: 20 * c + '%'
  12097.         }),
  12098.         setTimeout(function () {
  12099.           a.removeClass('animate-star')
  12100.         }, 500)
  12101.       }).then(function () {
  12102.         return b.textarea.focus()
  12103.       }).then(function () {
  12104.         return !b.postEditMode && b.alert(e('Please post a comment to submit your rating.'), {
  12105.           type: 'info',
  12106.           target: b.postboxAlertSelector
  12107.         })
  12108.       })
  12109.     },
  12110.     highlightRating: function (a) {
  12111.       this.$(a.currentTarget).addClass('selected-star'),
  12112.       this.$(a.currentTarget).prevAll().addClass('selected-star')
  12113.     },
  12114.     unhighlightRating: function (a) {
  12115.       this.$(a.currentTarget).removeClass('selected-star'),
  12116.       this.$(a.currentTarget).prevAll().removeClass('selected-star')
  12117.     }
  12118.   };
  12119.   return function () {
  12120.     this.events = a.defaults({
  12121.     }, this.events, g.events),
  12122.     this.initialize = a.wrap(this.initialize, g.initialize),
  12123.     a.extend(this, a.pick(g, [
  12124.       'initStarRatings',
  12125.       'rateThread',
  12126.       'highlightRating',
  12127.       'unhighlightRating'
  12128.     ]))
  12129.   }
  12130. }),
  12131. define('lounge/mixins/post-reply', [
  12132.   'underscore',
  12133.   'common/models',
  12134.   'lounge/common'
  12135. ], function (a, b, c) {
  12136.   'use strict';
  12137.   var d = {
  12138.     initialize: function () {
  12139.       this.canBindTypingHandlers() && this.bindTypingHandlers()
  12140.     },
  12141.     canBindTypingHandlers: function () {
  12142.       return this.parent && c.getLounge().isRealtimeEnabled() && this.session && this.thread && this.thread.forum
  12143.     },
  12144.     bindTypingHandlers: function () {
  12145.       return a.map([[this,
  12146.       'show',
  12147.       this.typingStart],
  12148.       [
  12149.         this,
  12150.         'hide',
  12151.         this.typingStop
  12152.       ]], function (a) {
  12153.         return this.listenTo.apply(this, a),
  12154.         a
  12155.       }, this)
  12156.     },
  12157.     syncTyping: function (a) {
  12158.       this.typingUser && (void 0 !== a && this.typingUser.set('typing', a), this.typingUser.sync());
  12159.     },
  12160.     typingStart: function () {
  12161.       var a = this.parent;
  12162.       this.typingUser || (this.typingUser = b.TypingUser.make({
  12163.         user: this.session.user.id,
  12164.         post: a.id,
  12165.         thread: this.thread.id,
  12166.         forum: this.thread.forum.id
  12167.       }), a.usersTyping.add(this.typingUser)),
  12168.       this.syncTyping(!0)
  12169.     },
  12170.     typingStop: function () {
  12171.       this.syncTyping(!1)
  12172.     }
  12173.   },
  12174.   e = function (b) {
  12175.     var c = b.initialize,
  12176.     e = b.remove;
  12177.     a.extend(b, d),
  12178.     b.initialize = function () {
  12179.       c.apply(this, arguments),
  12180.       d.initialize.call(this)
  12181.     },
  12182.     b.remove = function () {
  12183.       return this.parent && this.typingStop(),
  12184.       e.call(this)
  12185.     }
  12186.   };
  12187.   return {
  12188.     asRealtimeTyping: e
  12189.   }
  12190. }),
  12191. define('templates/lounge/suggestions', [
  12192.   'react',
  12193.   'core/strings'
  12194. ], function (a, b) {
  12195.   'use strict';
  12196.   var c = b.gettext,
  12197.   d = function () {
  12198.     return a.createElement('ul', {
  12199.       className: 'user-mention__list',
  12200.       id: 'user-mention-list'
  12201.     }, a.createElement('li', {
  12202.       className: 'header user-mention__header'
  12203.     }, a.createElement('h5', null, c('in this conversation'))))
  12204.   };
  12205.   return d
  12206. }),
  12207. define('templates/lounge/suggestedUser', [
  12208.   'react',
  12209.   'core/strings',
  12210.   'core/utils/object/get'
  12211. ], function (a, b, c) {
  12212.   'use strict';
  12213.   var d = b.gettext,
  12214.   e = function (b) {
  12215.     return a.createElement('li', {
  12216.       className: 'user-mention__item',
  12217.       'data-cid': b.cid || ''
  12218.     }, a.createElement('img', {
  12219.       src: c(b.avatar, [
  12220.         'cache'
  12221.       ], ''),
  12222.       className: 'avatar',
  12223.       alt: d('Avatar')
  12224.     }), a.createElement('span', null, b.name || b.username || null))
  12225.   };
  12226.   return e
  12227. }),
  12228. define('lounge/views/posts/SuggestionView', [
  12229.   'jquery',
  12230.   'underscore',
  12231.   'backbone',
  12232.   'templates/lounge/suggestions',
  12233.   'templates/lounge/suggestedUser'
  12234. ], function (a, b, c, d, e) {
  12235.   'use strict';
  12236.   var f = c.View.extend({
  12237.     events: {
  12238.       'click li': 'handleClick'
  12239.     },
  12240.     initialize: function (a) {
  12241.       this.active = !1,
  12242.       this.userSuggestions = a.userSuggestions,
  12243.       this.scrollListener = null,
  12244.       this.userHtmlCache = {
  12245.       },
  12246.       this.userSuggestions && this.userSuggestions.userCollection && this.listenTo(this.userSuggestions.userCollection, 'sync', this.syncUserCollection)
  12247.     },
  12248.     syncUserCollection: function () {
  12249.       this.active && (this.userSuggestions.userCollection.models.length ? this.renderUsers(this.userSuggestions.userCollection.models) : this.clear())
  12250.     },
  12251.     suggest: function (a, b) {
  12252.       return a ? (this.userSuggestions.find(a, b), this.currTerms = a, this.active = !0, void this.$el.show()) : void this.clear()
  12253.     },
  12254.     throttledSuggestMore: b.throttle(function () {
  12255.       this.suggest(this.currTerms, !0)
  12256.     }, 200, {
  12257.       trailing: !1
  12258.     }),
  12259.     render: function () {
  12260.       var a = this;
  12261.       return this.$el.html(d()),
  12262.       this.active || this.$el.hide(),
  12263.       this.scrollListener || (this.scrollListener = this.$el.find('#user-mention-list') [0].onscroll = function (b) {
  12264.         b.target.scrollHeight - b.target.scrollTop === b.target.clientHeight && a.throttledSuggestMore()
  12265.       }),
  12266.       this
  12267.     },
  12268.     renderUsers: function (c) {
  12269.       var d = b.reduce(c, function (b, c) {
  12270.         var d = this.userHtmlCache[c.cid];
  12271.         return void 0 === d && (this.userHtmlCache[c.cid] = d = a(this.renderSingleUser(c))),
  12272.         b.appendChild(d[0]),
  12273.         b
  12274.       }, window.document.createDocumentFragment(), this);
  12275.       this.$('.header').siblings().remove().end().after(d).siblings().removeClass('active').first().addClass('active')
  12276.     },
  12277.     renderSingleUser: function (a) {
  12278.       var b = a.toJSON();
  12279.       return b.cid = a.cid,
  12280.       e(b)
  12281.     },
  12282.     clear: function () {
  12283.       this.active = !1,
  12284.       this.$el.hide()
  12285.     },
  12286.     handleClick: function (b) {
  12287.       var c = a(b.currentTarget);
  12288.       this.select(c.attr('data-cid'))
  12289.     },
  12290.     select: function (a) {
  12291.       this.active && (a || (a = this.$el.find('.active').attr('data-cid')), this.trigger('select', a), this.clear())
  12292.     },
  12293.     move: function (a) {
  12294.       if (this.active) {
  12295.         var b = this.$el.find('.active'),
  12296.         c = 'up' === a ? 'prev' : 'next',
  12297.         d = b[c]();
  12298.         d.length && d.attr('data-cid') && (b.removeClass('active'), d.addClass('active'))
  12299.       }
  12300.     }
  12301.   }, {
  12302.     MAX_SUGGESTIONS: 5
  12303.   });
  12304.   return f
  12305. }),
  12306. define('lounge/views/posts/ContentEditableView', [
  12307.   'jquery',
  12308.   'underscore',
  12309.   'core/editable',
  12310.   'core/views/ContentEditableView',
  12311.   'common/collections',
  12312.   'lounge/common',
  12313.   'lounge/views/posts/SuggestionView'
  12314. ], function (a, b, c, d, e, f, g) {
  12315.   'use strict';
  12316.   var h = window.document,
  12317.   i = d,
  12318.   j = i.prototype,
  12319.   k = i.extend({
  12320.     initialize: function (a) {
  12321.       j.initialize.call(this, a),
  12322.       a = a || {
  12323.       },
  12324.       this.userSuggestions = a.userSuggestions,
  12325.       this.mentionsCache = new e.UserCollection,
  12326.       this.restoreMentionedUsers(),
  12327.       this.suggestions = new g({
  12328.         userSuggestions: this.userSuggestions,
  12329.         mentions: this.mentionsCache
  12330.       }),
  12331.       this.listenTo(this.suggestions, 'select', this.insertMention),
  12332.       this.reset(),
  12333.       this.$input = null
  12334.     },
  12335.     restoreMentionedUsers: function () {
  12336.       var a = this.getDraft() [2];
  12337.       a && !b.isEmpty(a) && this.userSuggestions.addRemote(new e.UserCollection(a))
  12338.     },
  12339.     reset: function () {
  12340.       this.anchorNode = null,
  12341.       this.anchorOffset = null,
  12342.       this.anchorLength = 0,
  12343.       this.suggestions.clear()
  12344.     },
  12345.     render: function () {
  12346.       return d.prototype.render.call(this),
  12347.       this.$el.append(this.suggestions.render().el),
  12348.       this
  12349.     },
  12350.     createInput: function () {
  12351.       var a = d.prototype.createInput.call(this);
  12352.       return this.content.getHtmlElements = b.bind(this.getHtmlElements, this),
  12353.       a
  12354.     },
  12355.     getHtmlElements: function (a) {
  12356.       if (!a) return a;
  12357.       var c = [
  12358.         a
  12359.       ],
  12360.       d = this.getMentionNodes(a);
  12361.       return b.each(d, function (a, d) {
  12362.         for (var e = 0; e < c.length; e++) {
  12363.           var f,
  12364.           g = c[e],
  12365.           h = e;
  12366.           if (b.isString(g)) {
  12367.             for (; (f = g.indexOf(d)) > - 1; ) f > 0 && (c.splice(e, 0, g.substring(0, f)), e += 1),
  12368.             c.splice(e, 0, a.cloneNode(!0)),
  12369.             e += 1,
  12370.             g = g.substring(f + d.length);
  12371.             g && g !== c[h] && (c.splice(e, 0, g), e += 1),
  12372.             h !== e && c.splice(e, 1)
  12373.           }
  12374.         }
  12375.       }),
  12376.       c = b.map(c, function (a) {
  12377.         return b.isString(a) ? h.createTextNode(a) : a
  12378.       })
  12379.     },
  12380.     getMentionNodes: function (a) {
  12381.       var b = k.MENTIONS_RE_GROUPED,
  12382.       c = {
  12383.       };
  12384.       b.lastIndex = 0;
  12385.       for (var d = b.exec(a); d; ) {
  12386.         var e = d[1],
  12387.         f = this.userSuggestions.all().findWhere({
  12388.           username: e
  12389.         });
  12390.         if (f) {
  12391.           var g = k.getMentionDom(f),
  12392.           h = d[0];
  12393.           c[h] = g,
  12394.           this.updateCache(f, f.cid)
  12395.         }
  12396.         d = b.exec(a)
  12397.       }
  12398.       return c
  12399.     },
  12400.     handleKeyDown: function (a) {
  12401.       switch (d.prototype.handleKeyDown.call(this, a), a.keyCode) {
  12402.         case 9:
  12403.           this.suggestions.active && (this.suggestions.select(), a.preventDefault(), a.stopPropagation());
  12404.           break;
  12405.         case 10:
  12406.         case 13:
  12407.         case 38:
  12408.         case 40:
  12409.           this.suggestions.active && (a.preventDefault(), a.stopPropagation())
  12410.       }
  12411.     },
  12412.     handleKeyUp: function (a) {
  12413.       switch (d.prototype.handleKeyUp.call(this, a), a.preventDefault(), a.stopPropagation(), this.setSelection(), this.checkExistingMentions(), a.keyCode) {
  12414.         case 10:
  12415.         case 13:
  12416.           this.suggestions.select();
  12417.           break;
  12418.         case 27:
  12419.           this.reset(a);
  12420.           break;
  12421.         case 38:
  12422.           this.suggestions.move('up');
  12423.           break;
  12424.         case 40:
  12425.           this.suggestions.move('down');
  12426.           break;
  12427.         default:
  12428.           this.throttledSuggest(a)
  12429.       }
  12430.     },
  12431.     handleFocusIn: function () {
  12432.       var a = f.getLounge();
  12433.       a && this.$input && this.$input.on('transitionend webkitTransitionEnd oTransitionEnd otransitionend MSTransitionEnd resize', function () {
  12434.         a.resize()
  12435.       }),
  12436.       j.handleFocusIn.call(this)
  12437.     },
  12438.     suggest: function () {
  12439.       var a = this.parseSearchTerms();
  12440.       this.suggestions.suggest(a)
  12441.     },
  12442.     throttledSuggest: b.throttle(function () {
  12443.       this.suggest()
  12444.     }, 250),
  12445.     insertMention: function (a) {
  12446.       var c = this.userSuggestions.get(a);
  12447.       if (c) {
  12448.         this.selectSearchString(c),
  12449.         this.updateCache(c, a);
  12450.         var d = k.getMentionDom(c);
  12451.         this.content.insertNode(d);
  12452.         var e = this.$el.find('span[data-cid]');
  12453.         b.each(e, function (a) {
  12454.           a.contentEditable !== !1 && (a.contentEditable = !1)
  12455.         })
  12456.       }
  12457.     },
  12458.     updateCache: function (a, b) {
  12459.       this.mentionsCache.get(b) || this.mentionsCache.add(a)
  12460.     },
  12461.     selectSearchString: function () {
  12462.       this.content.selectNodeText(this.anchorNode, this.anchorOffset - 1, this.anchorOffset + this.anchorLength)
  12463.     },
  12464.     get: function () {
  12465.       function a(a) {
  12466.         return c(a, !0) ? b.mentionToText(a) : null
  12467.       }
  12468.       var b = this,
  12469.       c = k.isMention;
  12470.       return this.content.text(a)
  12471.     },
  12472.     parseSearchTerms: function () {
  12473.       var a = this.content.selectedTextNode(),
  12474.       b = a ? a.nodeValue : '',
  12475.       d = c.normalizeSpace;
  12476.       if (b) {
  12477.         var e = this.content.selectedTextNodeOffset(a),
  12478.         f = c.normalizeSpace(b.slice(0, e).split('').reverse().join('')),
  12479.         g = f.indexOf('@');
  12480.         if (g === - 1) return null;
  12481.         this.anchorNode = a,
  12482.         this.anchorOffset = e - g,
  12483.         this.anchorLength = g;
  12484.         var h = d(b.slice(this.anchorOffset - 1, e)).match(k.MENTIONS_RE);
  12485.         return h ? h[0].slice(1).split(' ') : 0 === g ? [
  12486.           ''
  12487.         ] : void 0
  12488.       }
  12489.     },
  12490.     checkExistingMentions: function () {
  12491.       var d = c.normalizeSpace,
  12492.       e = this.$el.find('span'),
  12493.       f = b.filter(e, k.isMention),
  12494.       g = this.mentionsCache,
  12495.       h = {
  12496.       };
  12497.       b.each(f, function (c) {
  12498.         var e = a(c).attr('data-cid'),
  12499.         f = b.reduce(this.content.getTextNodes(c), function (a, b) {
  12500.           return a + d(b.nodeValue)
  12501.         }, ''),
  12502.         i = g.get(e);
  12503.         i && i.get('name') !== f ? (this.mentionsCache.remove(i), this.content.removeNode(c), this.content.insertHTML(' '), this.reset()) : h[e] = c
  12504.       }, this),
  12505.       g.each(function (a) {
  12506.         h[a.cid] || g.remove(a)
  12507.       })
  12508.     },
  12509.     mentionToText: function (b) {
  12510.       var c = a(b).attr('data-cid'),
  12511.       d = this.mentionsCache.get(c),
  12512.       e = b.innerText || b.textContent;
  12513.       return d && d.get('username') && (e = d.get('username')),
  12514.       [
  12515.         '@',
  12516.         e,
  12517.         ':',
  12518.         'disqus'
  12519.       ].join('')
  12520.     },
  12521.     toJSON: function () {
  12522.       var a = d.prototype.toJSON.call(this);
  12523.       return a.push(this.mentionsCache.models),
  12524.       a
  12525.     }
  12526.   }, {
  12527.     MENTIONS_RE: new RegExp('@\\w+\\s?(?:\\w+\\s?){0,5}(?:\\w+)?$'),
  12528.     MENTIONS_RE_GROUPED: /@([\d\w]+)\s?(:\s?(\w+))?/gi,
  12529.     isMention: function (b, c) {
  12530.       var d;
  12531.       do {
  12532.         if (d = a(b), d.hasClass('mention') && d.attr('data-cid')) return !0;
  12533.         b = b.parentElement
  12534.       } while (c && b);
  12535.       return !1
  12536.     },
  12537.     getMentionDom: function (a) {
  12538.       var b = h.createDocumentFragment(),
  12539.       c = h.createElement('span'),
  12540.       d = h.createElement('span'),
  12541.       e = h.createTextNode(a.get('name') || a.get('username'));
  12542.       return c.setAttribute('contenteditable', !0),
  12543.       d.setAttribute('contenteditable', !1),
  12544.       d.setAttribute('data-cid', a.cid),
  12545.       d.className = 'mention',
  12546.       d.appendChild(e),
  12547.       c.appendChild(d),
  12548.       b.appendChild(c),
  12549.       b.appendChild(h.createTextNode(' ')),
  12550.       b
  12551.     }
  12552.   });
  12553.   return k
  12554. }),
  12555. define('lounge/views/posts/DummyTextareaView', [
  12556.   'backbone',
  12557.   'core/CappedStorage',
  12558.   'core/extensions/jquery.autoresize'
  12559. ], function (a, b) {
  12560.   'use strict';
  12561.   var c = a.View.extend({
  12562.     initialize: function (a) {
  12563.       a = a || {
  12564.       },
  12565.       this.storageKey = a.storageKey,
  12566.       this.value = a.value,
  12567.       this.history = [
  12568.         this.value
  12569.       ],
  12570.       this.historyPosition = 0,
  12571.       this.placeholder = a.placeholder,
  12572.       this.selectionIndices = {
  12573.         start: 0,
  12574.         end: 0,
  12575.         endElemInd: 0,
  12576.         endElemSelectionInd: 0,
  12577.         startElemInd: 0,
  12578.         startElemSelectionInd: 0
  12579.       },
  12580.       this.inputFixed = !1
  12581.     },
  12582.     render: function () {
  12583.       return this
  12584.     },
  12585.     createInput: function () {
  12586.     },
  12587.     resize: function () {
  12588.     },
  12589.     get: function () {
  12590.     },
  12591.     getSelected: function () {
  12592.     },
  12593.     offset: function () {
  12594.     },
  12595.     insertAtCursor: function () {
  12596.     },
  12597.     insertAroundSelection: function () {
  12598.     },
  12599.     set: function () {
  12600.     },
  12601.     clear: function () {
  12602.     },
  12603.     focus: function () {
  12604.     },
  12605.     handleKeyDown: function () {
  12606.     },
  12607.     handleKeyUp: function () {
  12608.     },
  12609.     handlePaste: function () {
  12610.     },
  12611.     handleFocusIn: function () {
  12612.     },
  12613.     handleBlur: function () {
  12614.     },
  12615.     saveDraft: function () {
  12616.     },
  12617.     toJSON: function () {
  12618.     },
  12619.     getDraft: function () {
  12620.     },
  12621.     removeDraft: function () {
  12622.     },
  12623.     fixInputStructure: function () {
  12624.     },
  12625.     focusEndOfText: function () {
  12626.     },
  12627.     getWhichChildIndex: function () {
  12628.     },
  12629.     getNodeLength: function () {
  12630.     },
  12631.     placeholderSetSelection: function () {
  12632.     },
  12633.     setSelection: function () {
  12634.     },
  12635.     addTagTextarea: function () {
  12636.     },
  12637.     addTag: function () {
  12638.     },
  12639.     selectText: function () {
  12640.     },
  12641.     debouncedSaveHistory: function () {
  12642.     },
  12643.     undoTextarea: function () {
  12644.     },
  12645.     redoTextarea: function () {
  12646.     }
  12647.   }, {
  12648.     MAX_TEXTAREA_HEIGHT: 350,
  12649.     SAVE_DRAFT_INTERVAL: 500,
  12650.     DRAFT_MAX_AGE: 86400000,
  12651.     storage: new b(5, 'drafts.queue')
  12652.   });
  12653.   return c
  12654. }),
  12655. define('core/views/common/LoginFormView', [
  12656.   'underscore',
  12657.   'backbone',
  12658.   'core/strings'
  12659. ], function (a, b, c) {
  12660.   'use strict';
  12661.   var d = c.get,
  12662.   e = b.View.extend({
  12663.     initialize: function () {
  12664.       this.model = new this.User
  12665.     },
  12666.     parseRegistrationErrorResponse: function (a) {
  12667.       if (a.responseJSON) {
  12668.         var b = a.responseJSON.response;
  12669.         return window.grecaptcha && window.grecaptcha.reset(),
  12670.         /Unable to create user/i.test(b) ? {
  12671.           email: [
  12672.             d('That email address is already registered with a Disqus account. Log in or enter another email.')
  12673.           ]
  12674.         }
  12675.          : /The e-mail address you specified is already in use./i.test(b) ? {
  12676.           email: [
  12677.             d('The e-mail address you specified is already in use.') + '<br><a class="link" href="#" data-action="auth:disqus">' + d('Try logging in.') + '</a>'
  12678.           ]
  12679.         }
  12680.          : (/You must re-submit this request with a response to the captcha challenge/i.test(b) && this.showCaptcha && this.showCaptcha(null, !0), {
  12681.           all: [
  12682.             b
  12683.           ]
  12684.         })
  12685.       }
  12686.     },
  12687.     getPassword: function () {
  12688.       var a = this.$el.find('input[name=password]');
  12689.       return a.length ? a.val() : null
  12690.     },
  12691.     getDisplayName: function () {
  12692.       return this.$el.find('input[name=display_name]').val()
  12693.     },
  12694.     getEmail: function () {
  12695.       return this.$el.find('input[name=email]').val()
  12696.     },
  12697.     disableForm: function () {
  12698.       this.$('[data-role=submit-btn-container]').addClass('is-submitting')
  12699.     },
  12700.     enableForm: function () {
  12701.       this.$('[data-role=submit-btn-container]').removeClass('is-submitting')
  12702.     },
  12703.     handleRegistrationErrorResponse: function (a) {
  12704.       this.handleRegistrationError(this.parseRegistrationErrorResponse(a))
  12705.     },
  12706.     registerUser: function () {
  12707.       return this.model.set({
  12708.         display_name: this.$el.find('input[name=display_name]').val(),
  12709.         email: this.$el.find('input[name=email]').val(),
  12710.         password: this.getPassword()
  12711.       }),
  12712.       this.model.isValid() ? (this.disableForm(), void this.model.register({
  12713.         gRecaptchaResponse: this.captchaShown && window.grecaptcha && window.grecaptcha.getResponse(),
  12714.         error: a.bind(this.handleRegistrationErrorResponse, this),
  12715.         success: a.bind(this.handleRegistrationSuccess, this)
  12716.       }).always(a.bind(this.enableForm, this))) : void this.handleRegistrationError(this.model.validationError)
  12717.     }
  12718.   });
  12719.   return e
  12720. }),
  12721. define('templates/lounge/partials/audienceSync', [
  12722.   'react',
  12723.   'core/config/urls',
  12724.   'core/strings'
  12725. ], function (a, b, c) {
  12726.   'use strict';
  12727.   var d = c.gettext,
  12728.   e = function (c) {
  12729.     return a.createElement('div', {
  12730.       className: 'audiencesync'
  12731.     }, a.createElement('h6', null, d('Connect with %(forumName)s', {
  12732.       forumName: c.forumName
  12733.     })), a.createElement('div', {
  12734.       className: 'services'
  12735.     }, a.createElement('div', {
  12736.       className: 'audiencesync__icons'
  12737.     }, a.createElement('img', {
  12738.       className: 'icon',
  12739.       alt: 'Disqus',
  12740.       src: 'https://c.disquscdn.com/next/embed/assets/img/audiencesync/sync-icon.74333606cf6b545eb92a69a61b112481.png'
  12741.     }), a.createElement('i', {
  12742.       className: 'icon icon-proceed'
  12743.     }), a.createElement('img', {
  12744.       className: 'icon',
  12745.       alt: c.forumName,
  12746.       src: (b.root || '') + '/api/applications/icons/' + (c.apiKey || '') + '.png'
  12747.     })), a.createElement('p', null, d('%(forumName)s needs permission to access your account.', {
  12748.       forumName: c.forumName
  12749.     }))), a.createElement('button', {
  12750.       type: 'button',
  12751.       'data-action': 'audiencesync',
  12752.       className: 'proceed btn submit'
  12753.     }, d('Next')))
  12754.   };
  12755.   return e
  12756. }),
  12757. define('templates/lounge/partials/guestForm', [
  12758.   'react',
  12759.   'core/strings',
  12760.   'core/utils/object/get'
  12761. ], function (a, b, c) {
  12762.   'use strict';
  12763.   var d = b.gettext,
  12764.   e = function () {
  12765.     return a.createElement('div', {
  12766.       className: 'acceptance-wrapper'
  12767.     }, a.createElement('label', null, a.createElement('input', {
  12768.       type: 'checkbox',
  12769.       name: 'tos'
  12770.     }), a.createElement('span', {
  12771.       className: 'spacing-left-small'
  12772.     }, d('I agree to Disqus\' %(terms)s', {
  12773.       terms: a.createElement('a', {
  12774.         href: 'https://help.disqus.com/customer/portal/articles/466260-terms-of-service',
  12775.         target: '_blank',
  12776.         rel: 'noopener noreferrer'
  12777.       }, d('Terms of Service'))
  12778.     }))), a.createElement('label', null, a.createElement('input', {
  12779.       type: 'checkbox',
  12780.       name: 'privacy-policy'
  12781.     }), a.createElement('span', {
  12782.       className: 'spacing-left-small'
  12783.     }, d('I consent to Disqus’ processing of my personal data, in accordance with its %(policy)s and %(terms)s, (including the use of strictly necessary cookies) to the extent needed to authenticate me and enable me to post comments or use other Disqus services. I acknowledge that my personal data will be processed in the United States', {
  12784.       policy: a.createElement('a', {
  12785.         href: 'https://disqus.com/privacy-policy',
  12786.         target: '_blank',
  12787.         rel: 'noopener noreferrer'
  12788.       }, d('Privacy Policy')),
  12789.       terms: a.createElement('a', {
  12790.         href: 'https://help.disqus.com/customer/portal/articles/466260-terms-of-service',
  12791.         target: '_blank',
  12792.         rel: 'noopener noreferrer'
  12793.       }, d('Terms of Service'))
  12794.     }))), a.createElement('label', null, a.createElement('input', {
  12795.       type: 'checkbox',
  12796.       name: 'data-sharing'
  12797.     }), a.createElement('span', {
  12798.       className: 'spacing-left-small'
  12799.     }, d('I consent to Disqus collecting, using, and disclosing my personal data for marketing purposes, including the use of tracking cookies for cross context behavioral advertising. My personal data may be transferred to the companies listed %(dataRecipients)s. I may withdraw my consent at any time by clicking %(policy)s', {
  12800.       policy: a.createElement('a', {
  12801.         href: 'https://disqus.com/data-sharing-settings/',
  12802.         target: '_blank',
  12803.         rel: 'noopener noreferrer'
  12804.       }, d('here')),
  12805.       dataRecipients: a.createElement('a', {
  12806.         href: 'https://help.disqus.com/en/articles/1944034-cookies-and-data-recipients',
  12807.         target: '_blank',
  12808.         rel: 'noopener noreferrer'
  12809.       }, d('here'))
  12810.     }))))
  12811.   },
  12812.   f = function (b) {
  12813.     var f = b.isRefreshEnabled,
  12814.     g = f ? 'sign-up-wrapper-refresh' : '',
  12815.     h = f ? 'guest guest--refresh' : 'guest',
  12816.     i = f ? 'guest-form-title guest-form-title--refresh' : 'guest-form-title';
  12817.     return a.createElement('div', {
  12818.       className: h
  12819.     }, a.createElement('div', {
  12820.       className: g
  12821.     }, a.createElement('h6', {
  12822.       className: i
  12823.     }, a.createElement('span', {
  12824.       className: 'register-text'
  12825.     }, ' ', d('or sign up with Disqus'), ' '), a.createElement('span', {
  12826.       className: 'guest-text'
  12827.     }, ' ', d('or pick a name'), ' ')), ' ', a.createElement('button', {
  12828.       type: 'button',
  12829.       className: 'help-tooltip__wrapper help-icon',
  12830.       name: 'guest_tooltip',
  12831.       tabIndex: 0
  12832.     }, a.createElement('div', {
  12833.       id: 'rules',
  12834.       className: 'help-tooltip__container',
  12835.       'data-role': 'guest-form-tooltip'
  12836.     }, a.createElement('div', {
  12837.       className: 'tooltip show help-tooltip'
  12838.     }, a.createElement('h3', {
  12839.       className: 'help-tooltip__heading'
  12840.     }, d('Disqus is a discussion network')), a.createElement('ul', {
  12841.       className: 'help-tooltip__list'
  12842.     }, a.createElement('li', null, a.createElement('span', null, d('Don\'t be a jerk or do anything illegal. Everything is easier that way.')))), a.createElement('p', {
  12843.       className: 'clearfix'
  12844.     }, a.createElement('a', {
  12845.       href: 'https://docs.disqus.com/kb/terms-and-policies/',
  12846.       className: 'btn btn-small help-tooltip__button',
  12847.       rel: 'noopener noreferrer',
  12848.       target: '_blank'
  12849.     }, d('Read full terms and conditions'))))))), a.createElement('p', {
  12850.       className: 'input-wrapper'
  12851.     }, a.createElement('input', {
  12852.       dir: 'auto',
  12853.       type: 'text',
  12854.       placeholder: d('Name'),
  12855.       name: 'display_name',
  12856.       id: (b.cid || '') + '_display_name',
  12857.       maxLength: '30',
  12858.       className: 'input--text',
  12859.       'aria-label': 'name'
  12860.     })), a.createElement('div', {
  12861.       className: 'guest-details ' + (c(b.sso, [
  12862.         'url'
  12863.       ]) ? 'expanded' : ''),
  12864.       'data-role': 'guest-details'
  12865.     }, a.createElement('p', {
  12866.       className: 'input-wrapper'
  12867.     }, a.createElement('input', {
  12868.       dir: 'auto',
  12869.       type: 'email',
  12870.       placeholder: d('Email'),
  12871.       name: 'email',
  12872.       id: (b.cid || '') + '_email',
  12873.       className: 'input--text',
  12874.       'aria-label': 'email'
  12875.     })), a.createElement('p', {
  12876.       className: 'input-wrapper'
  12877.     }, a.createElement('input', {
  12878.       dir: 'auto',
  12879.       disabled: !c(b.sso, [
  12880.         'url'
  12881.       ]),
  12882.       type: c(b.sso, [
  12883.         'url'
  12884.       ]) ? 'password' : 'text',
  12885.       className: 'register-text input--text',
  12886.       placeholder: d('Password'),
  12887.       name: 'password',
  12888.       'aria-label': 'password',
  12889.       id: (b.cid || '') + '_password'
  12890.     })), b.isPrivate ? a.createElement(e, null) : a.createElement('p', {
  12891.       className: 'privacy-info'
  12892.     }, a.createElement('div', null, d('By clicking submit, I authorize Disqus, Inc. and its affiliated companies to'), ':'), a.createElement('div', null, a.createElement('ul', {
  12893.       className: 'privacy-info-list'
  12894.     }, a.createElement('li', null, d('Use, sell, and share my information to enable me to use its comment services and for marketing purposes, including cross-context behavioral advertising, as described in our %(terms)s and %(policy)s', {
  12895.       policy: a.createElement('a', {
  12896.         href: 'https://disqus.com/privacy-policy',
  12897.         target: '_blank',
  12898.         rel: 'noopener noreferrer'
  12899.       }, d('Privacy Policy')),
  12900.       terms: a.createElement('a', {
  12901.         href: 'https://help.disqus.com/customer/portal/articles/466260-terms-of-service',
  12902.         target: '_blank',
  12903.         rel: 'noopener noreferrer'
  12904.       }, d('Terms of Service'))
  12905.     })), a.createElement('li', null, d('Supplement the information that I provide with additional information lawfully obtained from other sources, like demographic data from public sources, interests inferred from web page views, or other data relevant to what might interest me, like past purchase or location data')), a.createElement('li', null, d('Contact me or enable others to contact me by email with offers for goods and services (from any category) at the email address provided')), a.createElement('li', null, d('Process any sensitive personal information that I submit in a comment for the purpose of displaying the comment')), a.createElement('li', null, d('Retain my information while I am engaging with marketing messages that I receive and for a reasonable amount of time thereafter. I understand I can opt out at any time through an email that I receive.  Companies that we share data with are listed %(dataRecipients)s.', {
  12906.       dataRecipients: a.createElement('a', {
  12907.         href: 'https://help.disqus.com/en/articles/1944034-cookies-and-data-recipients',
  12908.         target: '_blank',
  12909.         rel: 'noopener noreferrer'
  12910.       }, d('here'))
  12911.     }))))), b.allowAnonPost ? a.createElement('div', {
  12912.       className: 'guest-checkbox'
  12913.     }, a.createElement('label', null, a.createElement('input', {
  12914.       type: 'checkbox',
  12915.       name: 'author-guest'
  12916.     }), ' ', d('I\'d rather post as a guest'))) : a.createElement('input', {
  12917.       type: 'checkbox',
  12918.       name: 'author-guest',
  12919.       style: {
  12920.         display: 'none'
  12921.       }
  12922.     }), a.createElement('div', {
  12923.       className: 'g-recaptcha',
  12924.       'data-role': 'grecaptcha-container'
  12925.     }), a.createElement('div', {
  12926.       className: 'proceed',
  12927.       'data-role': 'submit-btn-container'
  12928.     }, b.allowAnonPost ? a.createElement('div', null, a.createElement('button', {
  12929.       type: 'submit',
  12930.       className: 'proceed__button btn submit',
  12931.       'aria-label': d('Post')
  12932.     }, a.createElement('span', {
  12933.       className: 'icon-proceed'
  12934.     }), a.createElement('div', {
  12935.       className: 'spinner'
  12936.     })), a.createElement('button', {
  12937.       type: 'submit',
  12938.       className: 'proceed__button btn next',
  12939.       'aria-label': d('Next')
  12940.     }, a.createElement('span', {
  12941.       className: 'icon-proceed'
  12942.     }), a.createElement('div', {
  12943.       className: 'spinner'
  12944.     }))) : a.createElement('button', {
  12945.       type: 'submit',
  12946.       className: 'proceed__button btn submit',
  12947.       'aria-label': d('Next')
  12948.     }, a.createElement('span', {
  12949.       className: 'icon-proceed'
  12950.     }), a.createElement('div', {
  12951.       className: 'spinner'
  12952.     })))))
  12953.   };
  12954.   return f
  12955. }),
  12956. define('templates/lounge/partials/loginButtons', [
  12957.   'react',
  12958.   'core/utils/object/get'
  12959. ], function (a, b) {
  12960.   'use strict';
  12961.   var c = function (c) {
  12962.     return a.createElement('ul', {
  12963.       'data-role': 'login-menu',
  12964.       className: 'services login-buttons'
  12965.     }, b(c.sso, [
  12966.       'url'
  12967.     ]) ? a.createElement('li', {
  12968.       className: 'sso'
  12969.     }, a.createElement('button', {
  12970.       type: 'button',
  12971.       'data-action': 'auth:sso',
  12972.       title: b(c.sso, [
  12973.         'name'
  12974.       ], ''),
  12975.       className: 'sso__button ' + (b(c.sso, [
  12976.         'button'
  12977.       ]) ? 'image' : 'no-image')
  12978.     }, b(c.sso, [
  12979.       'button'
  12980.     ]) ? a.createElement('img', {
  12981.       alt: b(c.sso, [
  12982.         'name'
  12983.       ], ''),
  12984.       src: b(c.sso, [
  12985.         'button'
  12986.       ], '')
  12987.     }) : b(c.sso, [
  12988.       'name'
  12989.     ], null))) : null, a.createElement('li', {
  12990.       className: 'auth-disqus'
  12991.     }, a.createElement('button', {
  12992.       type: 'button',
  12993.       'data-action': 'auth:disqus',
  12994.       title: 'Disqus',
  12995.       className: 'connect__button',
  12996.       'aria-label': 'Login with Disqus'
  12997.     }, a.createElement('i', {
  12998.       className: 'icon-disqus'
  12999.     }))), a.createElement('li', {
  13000.       className: 'auth-facebook'
  13001.     }, a.createElement('button', {
  13002.       type: 'button',
  13003.       'data-action': 'auth:facebook',
  13004.       title: 'Facebook',
  13005.       className: 'connect__button',
  13006.       'aria-label': 'Login with Facebook'
  13007.     }, a.createElement('i', {
  13008.       className: 'icon-facebook-circle'
  13009.     }))), a.createElement('li', {
  13010.       className: 'auth-twitter'
  13011.     }, a.createElement('button', {
  13012.       type: 'button',
  13013.       'data-action': 'auth:twitter',
  13014.       title: 'X (Twitter)',
  13015.       className: 'connect__button',
  13016.       'aria-label': 'Login with X (Twitter)'
  13017.     }, a.createElement('i', {
  13018.       className: 'icon-twitter-x'
  13019.     }))), a.createElement('li', {
  13020.       className: 'auth-google'
  13021.     }, a.createElement('button', {
  13022.       type: 'button',
  13023.       'data-action': 'auth:google',
  13024.       title: 'Google',
  13025.       className: 'connect__button',
  13026.       'aria-label': 'Login with Google'
  13027.     }, a.createElement('i', {
  13028.       className: 'icon-google-plus-circle'
  13029.     }))), a.createElement('li', {
  13030.       className: 'auth-microsoft'
  13031.     }, a.createElement('button', {
  13032.       type: 'button',
  13033.       'data-action': 'auth:microsoft',
  13034.       title: 'Microsoft',
  13035.       className: 'connect__button',
  13036.       'aria-label': 'Login with Microsoft'
  13037.     })), a.createElement('li', {
  13038.       className: 'auth-apple'
  13039.     }, a.createElement('button', {
  13040.       type: 'button',
  13041.       'data-action': 'auth:apple',
  13042.       title: 'Apple',
  13043.       className: 'connect__button',
  13044.       'aria-label': 'Login with Apple'
  13045.     })))
  13046.   };
  13047.   return c
  13048. }),
  13049. define('templates/lounge/loginForm', [
  13050.   'react',
  13051.   'core/strings',
  13052.   'core/switches',
  13053.   'core/utils/object/get',
  13054.   'templates/lounge/partials/audienceSync',
  13055.   'templates/lounge/partials/guestForm',
  13056.   'templates/lounge/partials/loginButtons'
  13057. ], function (a, b, c, d, e, f, g) {
  13058.   'use strict';
  13059.   var h = b.gettext,
  13060.   i = function (b) {
  13061.     var i = b.forumName,
  13062.     j = c.isFeatureActive('embed_refresh', {
  13063.       forum: i
  13064.     }),
  13065.     k = j ? 'connect__heading' : '';
  13066.     return a.createElement('div', null, d(b.user, [
  13067.       'isAnonymous'
  13068.     ]) ? a.createElement('section', {
  13069.       className: 'auth-section logged-out__display'
  13070.     }, a.createElement('div', {
  13071.       className: 'connect'
  13072.     }, a.createElement('h6', {
  13073.       className: k
  13074.     }, h('Log in with')), a.createElement(g, {
  13075.       sso: b.sso
  13076.     })), a.createElement(f, {
  13077.       cid: b.cid,
  13078.       sso: b.sso,
  13079.       allowAnonPost: b.allowAnonPost,
  13080.       isPrivate: b.isPrivate,
  13081.       captcha_site_key: b.captcha_site_key,
  13082.       isRefreshEnabled: j
  13083.     })) : null, b.audienceSyncRequired ? a.createElement('section', {
  13084.       className: 'auth-section'
  13085.     }, a.createElement(e, {
  13086.       apiKey: b.apiKey,
  13087.       forumName: b.forumName
  13088.     })) : null)
  13089.   };
  13090.   return i
  13091. }),
  13092. define('lounge/views/posts/LoginFormView', [
  13093.   'underscore',
  13094.   'jquery',
  13095.   'remote/config',
  13096.   'core/bus',
  13097.   'core/api',
  13098.   'core/views/common/LoginFormView',
  13099.   'common/models',
  13100.   'lounge/common',
  13101.   'templates/lounge/loginForm'
  13102. ], function (a, b, c, d, e, f, g, h, i) {
  13103.   'use strict';
  13104.   var j = f.extend({
  13105.     events: {
  13106.       'click input[name=author-guest]': 'updateLoginForm',
  13107.       'focusin input[name=display_name]': 'expandGuestForm',
  13108.       'change input[name=tos], input[name=privacy-policy]': 'updateEnabled',
  13109.       'keyup input[name=display_name]': 'showCaptcha',
  13110.       'click button[name=guest_tooltip]': 'toggleGuestFormTooltip'
  13111.     },
  13112.     User: g.User,
  13113.     initialize: function (b) {
  13114.       f.prototype.initialize.call(this, b),
  13115.       this.thread = b.thread,
  13116.       this.session = b.session,
  13117.       this.alert = b.alert,
  13118.       this.config = a.property('config') (h.getLounge()) || {
  13119.       }
  13120.     },
  13121.     expandGuestForm: function () {
  13122.       this.$('[data-role=guest-details]').hasClass('expanded') || (this.$('[data-role=guest-details]').addClass('expanded'), this.$('input[name=password]').attr('type', 'password').removeAttr('disabled'), this.$('[name=display_name]').focus())
  13123.     },
  13124.     retractGuestForm: function () {
  13125.       this.$('[data-role=guest-details]').hasClass('expanded') && this.$('[data-role=guest-details]').removeClass('expanded')
  13126.     },
  13127.     toggleGuestFormTooltip: function () {
  13128.       this.$('[data-role=guest-form-tooltip]').hasClass('expanded') ? this.$('[data-role=guest-form-tooltip]').removeClass('expanded') : this.$('[data-role=guest-form-tooltip]').addClass('expanded')
  13129.     },
  13130.     showCaptcha: function (d, e) {
  13131.       !this.captchaShown && this.$('input[name=display_name]').val().trim().length && (c.register.ENABLE_CAPTCHA || e) && (window.onCaptchaChange = a.bind(this.updateEnabled, this), window.onCaptchaLoad = a.bind(function () {
  13132.         window.grecaptcha && (this.captchaId = window.grecaptcha.render(this.$('[data-role=grecaptcha-container]') [0], {
  13133.           sitekey: this.session.getRecaptchaKey(),
  13134.           callback: 'onCaptchaChange',
  13135.           'expired-callback': 'onCaptchaChange'
  13136.         }), this.updateEnabled(), a.delay(function () {
  13137.           b('iframe[title^="recaptcha challenge"]').parent().parent().addClass('recaptcha-challenge-container')
  13138.         }, 1000))
  13139.       }, this), b('<script>').attr('src', 'https://www.google.com/recaptcha/api.js?onload=onCaptchaLoad&render=explicit').appendTo(b('head')), this.captchaShown = !0)
  13140.     },
  13141.     shouldRegisterUser: function () {
  13142.       return this.session.isLoggedOut() && !this.$('input[name=author-guest]').is(':checked')
  13143.     },
  13144.     render: function () {
  13145.       return this.$el.html(i({
  13146.         user: this.session.toJSON(),
  13147.         forumName: this.thread.forum.get('name'),
  13148.         audienceSyncRequired: this.session.needsAudienceSyncAuth(this.thread.forum),
  13149.         allowAnonPost: this.thread.forum.get('settings').allowAnonPost,
  13150.         apiKey: this.config.apiKey || '',
  13151.         sso: this.session.get('sso'),
  13152.         cid: this.cid,
  13153.         isPrivate: Boolean(this.config.isPrivate)
  13154.       })),
  13155.       this.updateEnabled(),
  13156.       this
  13157.     },
  13158.     updateEnabled: function () {
  13159.       this.$el.closest('form').find('button[type=submit]').attr('disabled', Boolean(this.config.isPrivate) && (!this.$('input[name=tos]').prop('checked') || !this.$('input[name=privacy-policy]').prop('checked')) || Boolean(this.captchaShown && window.grecaptcha && !window.grecaptcha.getResponse(this.captchaId)))
  13160.     },
  13161.     handleRegistrationSuccess: function () {
  13162.       var a = this.$('input[name=data-sharing]');
  13163.       a.length && e.call('internal/users/setDNT', {
  13164.         method: 'POST',
  13165.         data: {
  13166.           value: a.prop('checked') ? 0 : 1
  13167.         }
  13168.       }),
  13169.       this.session.setUser(this.model),
  13170.       d.frame.trigger('onboardAlert.show'),
  13171.       this.retractGuestForm()
  13172.     },
  13173.     handleRegistrationError: function (b) {
  13174.       var c = this;
  13175.       c.clearRegistrationErrors(),
  13176.       a.isString(b) && (b = {
  13177.         all: [
  13178.           b
  13179.         ]
  13180.       }),
  13181.       a.has(b, 'all') && (c.alert && c.alert(b.all[0], {
  13182.         type: 'error'
  13183.       }), b = a.omit(b, 'all')),
  13184.       a.each(b, function (a, b) {
  13185.         var d = c.$('input[name=' + b + ']');
  13186.         d.attr('aria-invalid', 'true').attr('aria-labelledby', 'label-for-' + d.attr('id')).after('<label for="' + d.attr('id') + '" id="label-for-' + d.attr('id') + '" class="input-label">' + a[0] + '</label>').parent('.input-wrapper').addClass('has-error')
  13187.       }),
  13188.       c.$('[aria-invalid]').first().focus()
  13189.     },
  13190.     updateLoginForm: function () {
  13191.       var a = this.$el,
  13192.       b = a.find('input[name=author-guest]').is(':checked'),
  13193.       c = a.find('.guest'),
  13194.       d = a.find('input[name=password]');
  13195.       d.val(''),
  13196.       c.toggleClass('is-guest', b),
  13197.       this.clearRegistrationErrors()
  13198.     },
  13199.     clearRegistrationErrors: function () {
  13200.       this.$('.input-wrapper.has-error').removeClass('has-error').find('.input-label').remove(),
  13201.       this.$('[aria-invalid]').removeAttr('aria-invalid')
  13202.     }
  13203.   });
  13204.   return j
  13205. });
  13206. var _extends = Object.assign || function (a) {
  13207.   for (var b = 1; b < arguments.length; b++) {
  13208.     var c = arguments[b];
  13209.     for (var d in c) Object.prototype.hasOwnProperty.call(c, d) && (a[d] = c[d])
  13210.   }
  13211.   return a
  13212. };
  13213. define('templates/lounge/partials/profileLink', [
  13214.   'react',
  13215.   'core/switches',
  13216.   'core/utils/object/get'
  13217. ], function (a, b, c) {
  13218.   'use strict';
  13219.   var d = function (d) {
  13220.     var e = d.children,
  13221.     f = d.user,
  13222.     g = d.forumId,
  13223.     h = d.profileTab,
  13224.     i = _objectWithoutProperties(d, [
  13225.       'children',
  13226.       'user',
  13227.       'forumId',
  13228.       'profileTab'
  13229.     ]),
  13230.     j = c(f, [
  13231.       'isSSOProfileUrl'
  13232.     ]);
  13233.     if (!j && b.isFeatureActive('sso_less_branding', {
  13234.       forum: g
  13235.     })) return a.createElement('span', i, e);
  13236.     var k = c(f, [
  13237.       'profileUrl'
  13238.     ], ''),
  13239.     l = 'profile';
  13240.     return j ? l = null : k && h && (k = '' + k + h),
  13241.     a.createElement('a', _extends({
  13242.       href: k,
  13243.       'data-action': l,
  13244.       'data-tab': h || '',
  13245.       'data-username': c(f, [
  13246.         'username'
  13247.       ], ''),
  13248.       target: '_blank',
  13249.       rel: 'noopener noreferrer'
  13250.     }, i), e)
  13251.   };
  13252.   return d
  13253. }),
  13254. define('templates/lounge/partials/userAvatar', [
  13255.   'react',
  13256.   'core/strings',
  13257.   'core/switches',
  13258.   'core/utils',
  13259.   'core/utils/object/get',
  13260.   'templates/lounge/partials/profileLink'
  13261. ], function (a, b, c, d, e, f) {
  13262.   'use strict';
  13263.   var g = b.gettext,
  13264.   h = d.getInitials,
  13265.   i = function (b) {
  13266.     var d = b.defaultAvatarUrl,
  13267.     i = b.forum,
  13268.     j = b.user,
  13269.     k = b.hasForumAvatar,
  13270.     l = c.isFeatureActive('embed_refresh', {
  13271.       forum: i.id
  13272.     }),
  13273.     m = l && c.isFeatureActive('embed_refresh_v2', {
  13274.       forum: i.id
  13275.     }),
  13276.     n = l ? 'user user--refresh' : 'user',
  13277.     o = void 0,
  13278.     p = e(i, [
  13279.       'avatar',
  13280.       'large',
  13281.       'cache'
  13282.     ], '');
  13283.     return void 0 === j.avatar.isCustom || j.avatar.isCustom === !0 ? o = e(j, [
  13284.       'avatar',
  13285.       'cache'
  13286.     ], '') : l ? l && k && (o = p) : o = p ? p : d,
  13287.     a.createElement(f, {
  13288.       user: j,
  13289.       forumId: i.id,
  13290.       className: n
  13291.     }, o ? a.createElement('img', {
  13292.       'data-role': 'user-avatar',
  13293.       'data-user': e(j, [
  13294.         'id'
  13295.       ], ''),
  13296.       src: d || o,
  13297.       'data-src': d ? o : null,
  13298.       alt: g('Avatar'),
  13299.       className: l ? 'image-refresh' : null
  13300.     }) : a.createElement('div', null, m ? h(j.name) [0] : h(j.name)))
  13301.   };
  13302.   return i
  13303. }),
  13304. define('templates/lounge/form', [
  13305.   'react',
  13306.   'core/strings',
  13307.   'core/switches',
  13308.   'core/utils',
  13309.   'core/utils/object/get',
  13310.   'templates/lounge/partials/userAvatar'
  13311. ], function (a, b, c, d, e, f) {
  13312.   'use strict';
  13313.   var g = b.gettext,
  13314.   h = function (b) {
  13315.     var h = b.forum.id,
  13316.     i = c.isFeatureActive('embed_refresh', {
  13317.       forum: h
  13318.     }),
  13319.     j = c.isFeatureActive('embed_v2', {
  13320.       forum: h
  13321.     }),
  13322.     k = i ? 'textarea-outer-wrapper textarea-outer-wrapper--refresh' : 'textarea-outer-wrapper',
  13323.     l = i ? 'user user--refresh' : 'user',
  13324.     m = i ? 'image-refresh' : '',
  13325.     n = !d.isDefaultAvatar(e(b.forum, [
  13326.       'avatar',
  13327.       'large',
  13328.       'cache'
  13329.     ], ''));
  13330.     return a.createElement('div', {
  13331.       className: 'postbox'
  13332.     }, a.createElement('div', {
  13333.       role: 'alert'
  13334.     }), a.createElement('div', {
  13335.       className: 'ratings-wrapper',
  13336.       'data-role': 'ratings-container'
  13337.     }), a.createElement('div', {
  13338.       className: 'compose-wrapper'
  13339.     }, a.createElement('div', {
  13340.       className: 'avatar'
  13341.     }, e(b.user, [
  13342.       'isRegistered'
  13343.     ]) ? a.createElement(f, {
  13344.       forum: b.forum,
  13345.       user: b.user,
  13346.       hasForumAvatar: n
  13347.     }) : a.createElement('span', {
  13348.       className: l
  13349.     }, i && !n ? a.createElement('div', null, 'G') : a.createElement('img', {
  13350.       'data-role': 'user-avatar',
  13351.       src: e(b.forum, [
  13352.         'avatar',
  13353.         'large',
  13354.         'cache'
  13355.       ], ''),
  13356.       alt: g('Avatar'),
  13357.       className: m
  13358.     }))), a.createElement('div', {
  13359.       className: k
  13360.     }, j ? a.createElement('div', {
  13361.       className: 'textarea-wrapper textarea-wrapper--embedv2',
  13362.       'data-role': 'textarea',
  13363.       dir: 'auto'
  13364.     }, a.createElement('div', {
  13365.       className: 'textarea-skeleton'
  13366.     })) : a.createElement('div', {
  13367.       className: 'textarea-wrapper',
  13368.       'data-role': 'textarea',
  13369.       dir: 'auto'
  13370.     }, a.createElement('div', {
  13371.       'data-role': 'drag-drop-placeholder',
  13372.       className: 'media-drag-hover',
  13373.       style: {
  13374.         display: 'none'
  13375.       }
  13376.     }, a.createElement('div', {
  13377.       className: 'drag-text'
  13378.     }, '⬇ ', g('Drag and drop your images here to upload them.'))), b.displayMediaPreviews ? a.createElement('div', {
  13379.       className: 'media-preview empty',
  13380.       'data-role': 'media-preview'
  13381.     }) : null, a.createElement('div', {
  13382.       className: 'edit-alert',
  13383.       role: 'postbox-alert'
  13384.     }), a.createElement('div', {
  13385.       className: 'text-editor-container'
  13386.     })))), a.createElement('div', {
  13387.       'data-role': 'login-form'
  13388.     }))
  13389.   };
  13390.   return h
  13391. }),
  13392. define('templates/lounge/textEditor', [
  13393.   'react',
  13394.   'core/constants/textEditorConstants',
  13395.   'core/strings',
  13396.   'core/switches',
  13397.   'core/utils/object/get'
  13398. ], function (a, b, c, d, e) {
  13399.   'use strict';
  13400.   var f = c.gettext,
  13401.   g = function (b) {
  13402.     var c = b.forum,
  13403.     g = d.isFeatureActive('embed_refresh', {
  13404.       forum: c
  13405.     }),
  13406.     h = function () {
  13407.       return g ? b.useSmallPostButton ? 'hidden' : '' : e(b.user, [
  13408.         'isRegistered'
  13409.       ]) && !b.useSmallPostButton ? '' : 'hidden'
  13410.     };
  13411.     return a.createElement('div', {
  13412.       className: 'temp-post'
  13413.     }, a.createElement('button', {
  13414.       type: 'submit',
  13415.       className: 'btn post-action__button full-size-button ' + h()
  13416.     }, g ? f('Comment') : f('Post as %(name)s', {
  13417.       name: a.createElement('span', {
  13418.         'data-username': e(b.user, [
  13419.           'username'
  13420.         ], ''),
  13421.         'data-role': 'username'
  13422.       }, e(b.user, [
  13423.         'name'
  13424.       ], null))
  13425.     })), a.createElement('button', {
  13426.       type: 'submit',
  13427.       className: 'btn post-action__button small-size-button' + (e(b.user, [
  13428.         'isRegistered'
  13429.       ]) && b.useSmallPostButton ? '' : ' hidden')
  13430.     }, f(g ? 'Comment' : 'Post')))
  13431.   },
  13432.   h = function (b) {
  13433.     return a.createElement('div', {
  13434.       className: 'logged-in'
  13435.     }, a.createElement('section', null, b.edit ? a.createElement('div', {
  13436.       className: 'temp-post'
  13437.     }, a.createElement('button', {
  13438.       className: 'btn post-action__button edit-button',
  13439.       type: 'submit'
  13440.     }, f('Save Edit')), a.createElement('a', {
  13441.       className: 'cancel post-action__cancel',
  13442.       href: '#',
  13443.       'data-action': 'edit'
  13444.     }, f('Cancel'))) : a.createElement(g, b)))
  13445.   },
  13446.   i = function (c) {
  13447.     return a.createElement('div', {
  13448.       className: 'wysiwyg'
  13449.     }, c.buttonsToShow.indexOf(b.GIF_PICKER_BUTTON) > - 1 ? a.createElement('div', {
  13450.       className: 'gif-picker'
  13451.     }, a.createElement('div', {
  13452.       className: 'wysiwyg__item',
  13453.       'data-role': 'gif-picker-toggle',
  13454.       title: f('GIF'),
  13455.       'aria-label': 'Open GIF menu',
  13456.       tabIndex: '0'
  13457.     }, a.createElement('div', {
  13458.       className: 'wysiwyg__gif',
  13459.       title: f('GIF'),
  13460.       role: 'img'
  13461.     })), a.createElement('div', {
  13462.       className: 'hidden gif-picker__popout-container',
  13463.       'data-role': 'gif-picker-popout-container'
  13464.     }), a.createElement('div', {
  13465.       className: 'new-feature-badge-star',
  13466.       title: f('New')
  13467.     }, a.createElement('div', {
  13468.       className: 'wysiwyg__star-badge wysiwyg__star-badge-dims'
  13469.     }))) : null, c.buttonsToShow.indexOf(b.MEDIA_UPLOADER_BUTTON) > - 1 ? a.createElement('div', {
  13470.       className: 'media-uploader'
  13471.     }, a.createElement('li', {
  13472.       className: 'wysiwyg__item',
  13473.       'data-role': 'media-uploader',
  13474.       tabIndex: '-1'
  13475.     })) : null, (c.buttonsToShow.indexOf(b.GIF_PICKER_BUTTON) > - 1 || c.buttonsToShow.indexOf(b.MEDIA_UPLOADER_BUTTON) > - 1) && c.buttonsToShow.length > 1 ? a.createElement('div', {
  13476.       className: 'vertical-separator'
  13477.     }) : null, a.createElement('div', {
  13478.       'data-action': 'text-editor-buttons'
  13479.     }, a.createElement('div', {
  13480.       className: 'wysiwyg__item' + (c.buttonsToShow.indexOf('b') > - 1 ? '' : ' hidden'),
  13481.       'data-action': 'text-editor-tag',
  13482.       'data-tag': 'b',
  13483.       tabIndex: '0',
  13484.       'aria-label': 'Add bold tags to text editor'
  13485.     }, a.createElement('div', {
  13486.       className: 'wysiwyg__bold',
  13487.       title: f('Bold'),
  13488.       role: 'img'
  13489.     })), a.createElement('div', {
  13490.       className: 'wysiwyg__item' + (c.buttonsToShow.indexOf('i') > - 1 ? '' : ' hidden'),
  13491.       'data-action': 'text-editor-tag',
  13492.       'data-tag': 'i',
  13493.       tabIndex: '0',
  13494.       'aria-label': 'Add italics tags to text editor'
  13495.     }, a.createElement('div', {
  13496.       className: 'wysiwyg__italic',
  13497.       title: f('Italic'),
  13498.       role: 'img'
  13499.     })), a.createElement('div', {
  13500.       className: 'wysiwyg__item' + (c.buttonsToShow.indexOf('u') > - 1 ? '' : ' hidden'),
  13501.       'data-action': 'text-editor-tag',
  13502.       'data-tag': 'u',
  13503.       tabIndex: '0',
  13504.       'aria-label': 'Add underline tags to text editor'
  13505.     }, a.createElement('div', {
  13506.       className: 'wysiwyg__underline',
  13507.       title: f('Underline'),
  13508.       role: 'img'
  13509.     })), a.createElement('div', {
  13510.       className: 'wysiwyg__item' + (c.buttonsToShow.indexOf('s') > - 1 ? '' : ' hidden'),
  13511.       'data-action': 'text-editor-tag',
  13512.       'data-tag': 's',
  13513.       tabIndex: '0',
  13514.       'aria-label': 'Add strikethrough tags to text editor'
  13515.     }, a.createElement('div', {
  13516.       className: 'wysiwyg__strikethrough',
  13517.       title: f('Strikethrough'),
  13518.       role: 'img'
  13519.     })), a.createElement('div', {
  13520.       className: 'wysiwyg__item' + (c.buttonsToShow.indexOf('a') > - 1 ? '' : ' hidden'),
  13521.       'data-action': 'text-editor-tag',
  13522.       'data-tag': 'a',
  13523.       tabIndex: '0',
  13524.       'aria-label': 'Add link tags to text editor'
  13525.     }, a.createElement('div', {
  13526.       className: 'wysiwyg__link',
  13527.       title: f('Link'),
  13528.       role: 'img'
  13529.     })), a.createElement('div', {
  13530.       className: 'wysiwyg__item' + (c.buttonsToShow.indexOf('spoiler') > - 1 ? '' : ' hidden'),
  13531.       'data-action': 'text-editor-tag',
  13532.       'data-tag': 'spoiler',
  13533.       tabIndex: '0',
  13534.       'aria-label': 'Add spoiler tags to text editor'
  13535.     }, a.createElement('div', {
  13536.       className: 'wysiwyg__spoiler',
  13537.       title: f('Spoiler'),
  13538.       role: 'img'
  13539.     })), a.createElement('div', {
  13540.       className: 'wysiwyg__item' + (c.buttonsToShow.indexOf('code') > - 1 ? '' : ' hidden'),
  13541.       'data-action': 'text-editor-tag',
  13542.       'data-tag': 'code',
  13543.       tabIndex: '0',
  13544.       'aria-label': 'Add code tags to text editor'
  13545.     }, a.createElement('div', {
  13546.       className: 'wysiwyg__code',
  13547.       title: f('Code'),
  13548.       role: 'img'
  13549.     })), a.createElement('div', {
  13550.       className: 'wysiwyg__item' + (c.buttonsToShow.indexOf('blockquote') > - 1 ? '' : ' hidden'),
  13551.       'data-action': 'text-editor-tag',
  13552.       'data-tag': 'blockquote',
  13553.       tabIndex: '0',
  13554.       'aria-label': 'Add block quote tags to text editor'
  13555.     }, a.createElement('div', {
  13556.       className: 'wysiwyg__blockquote',
  13557.       title: f('Quote'),
  13558.       role: 'img'
  13559.     }))))
  13560.   },
  13561.   j = function (b) {
  13562.     return a.createElement('div', {
  13563.       className: 'post-actions'
  13564.     }, a.createElement(i, b), a.createElement(h, b))
  13565.   };
  13566.   return j
  13567. }),
  13568. define('templates/lounge/blacklistErrorMessage', [
  13569.   'react',
  13570.   'core/strings'
  13571. ], function (a, b) {
  13572.   'use strict';
  13573.   var c = b.gettext,
  13574.   d = function (b) {
  13575.     return [b.expirationRelative ? c('We are unable to post your comment because %(blocker)s has placed your account in a timeout. You will be able to comment again when your timeout expires %(expirationRelative)s.', {
  13576.       blocker: b.blocker,
  13577.       expirationRelative: b.expirationRelative
  13578.     }) : c('We are unable to post your comment because you have been banned by %(blocker)s.', {
  13579.       blocker: b.blocker
  13580.     }),
  13581.     ' ',
  13582.     a.createElement('a', {
  13583.       key: 'error-link',
  13584.       target: '_blank',
  13585.       href: 'https://help.disqus.com/customer/portal/articles/466223-who-deleted-or-removed-my-comment-'
  13586.     }, c('Find out more.'))]
  13587.   };
  13588.   return d
  13589. }),
  13590. define('templates/lounge/emailVerifyAlert', [
  13591.   'react',
  13592.   'core/strings',
  13593.   'core/utils/object/get'
  13594. ], function (a, b, c) {
  13595.   'use strict';
  13596.   var d = b.gettext,
  13597.   e = function (b) {
  13598.     return [d('%(forumName)s requires you to verify your email address before posting.', {
  13599.       forumName: b.forumName
  13600.     }),
  13601.     ' ',
  13602.     a.createElement('a', {
  13603.       key: 'alert-link',
  13604.       'data-action': 'verify-email',
  13605.       'data-forum': b.forumId,
  13606.       title: d('Verify Email'),
  13607.       href: '/verify'
  13608.     }, d('Send verification email to %(email)s', {
  13609.       email: c(b.user, [
  13610.         'email'
  13611.       ], '')
  13612.     }))]
  13613.   };
  13614.   return e
  13615. }),
  13616. define('lounge/views/posts/PostReplyView', [
  13617.   'jquery',
  13618.   'underscore',
  13619.   'react',
  13620.   'react-dom/server',
  13621.   'core/utils',
  13622.   'core/bus',
  13623.   'core/switches',
  13624.   'core/views/PostReplyView',
  13625.   'common/models',
  13626.   'lounge/mixins/asGifPicker',
  13627.   'lounge/mixins/asTextEditor',
  13628.   'lounge/mixins/asTextEditorV2',
  13629.   'lounge/mixins/withStarRatings',
  13630.   'lounge/mixins/post-reply',
  13631.   'lounge/common',
  13632.   'lounge/views/posts/ContentEditableView',
  13633.   'lounge/views/posts/DummyTextareaView',
  13634.   'lounge/views/posts/LoginFormView',
  13635.   'templates/lounge/form',
  13636.   'templates/lounge/textEditor',
  13637.   'templates/lounge/blacklistErrorMessage',
  13638.   'templates/lounge/emailVerifyAlert'
  13639. ], function (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v) {
  13640.   'use strict';
  13641.   var w = e.preventDefaultHandler,
  13642.   x = h,
  13643.   y = x.prototype,
  13644.   z = x.extend({
  13645.     initialize: function (a) {
  13646.       y.initialize.call(this, a),
  13647.       this.listenTo(this.session, 'change:audienceSyncVerified', this.redraw),
  13648.       this.userSuggestions = a.userSuggestions,
  13649.       this.loginFormView = new r({
  13650.         thread: this.thread,
  13651.         session: this.session,
  13652.         alert: b.bind(this.alert, this)
  13653.       });
  13654.       var e = o.getLounge();
  13655.       b.each(['uiCallback:postCreated',
  13656.       'domReflow'], function (a) {
  13657.         this.listenTo(this, a, b.bind(e.trigger, e, a))
  13658.       }, this),
  13659.       this.template = s,
  13660.       this.textEditorTemplate = t,
  13661.       this.blacklistErrorMessageTemplate = function (a) {
  13662.         return d.renderToStaticMarkup(c.createElement(u, a))
  13663.       },
  13664.       this.emailVerifyAlertTemplate = function (a) {
  13665.         return d.renderToStaticMarkup(c.createElement(v, a))
  13666.       },
  13667.       this.postEditMode = !1
  13668.     },
  13669.     getTemplateData: function () {
  13670.       var a = y.getTemplateData.call(this);
  13671.       return a.audienceSyncRequired = this.session.needsAudienceSyncAuth(this.thread.forum),
  13672.       a.forum = this.thread.forum.toJSON(),
  13673.       a
  13674.     },
  13675.     getEditorProps: function () {
  13676.       return {
  13677.         placeholder: this.getPlaceholderText(),
  13678.         allowUploads: this.allowUploads,
  13679.         gifPickerEnabled: this.gifPickerEnabled,
  13680.         focusOnLoad: Boolean(this.parent),
  13681.         onSubmit: this.submitForm.bind(this, null),
  13682.         draftKey: 'v2:' + this.post.storageKey()
  13683.       }
  13684.     },
  13685.     render: function () {
  13686.       return this.loginFormView.$el.detach(),
  13687.       this.isEmbedV2Enabled ? (this.$el.html(this.template(this.getTemplateData())), this.loadEditorV2(this.getEditorProps()), this.textarea = new q, this.constructor.mustVerifyEmailToPost(this.session.user, this.thread.forum) && this._alertMustVerify(this.shouldShowEmailAlertInForm), this._isHidden && this.$el.addClass('hidden'), this.initStarRatings()) : y.render.call(this),
  13688.       this.loginFormView.render(),
  13689.       this.loginFormView.$el.appendTo(this.$('[data-role=login-form]')),
  13690.       this.session.user.id ? this.$el.addClass('authenticated') : this.$el.removeClass('authenticated'),
  13691.       this
  13692.     },
  13693.     createTextarea: function () {
  13694.       var a = {
  13695.         placeholder: this.getPlaceholderText(),
  13696.         storageKey: this.post.storageKey()
  13697.       };
  13698.       return this.constructor.canUseContentEditable ? (a.userSuggestions = this.userSuggestions, new this.constructor.ContentEditableView(a)) : new this.constructor.TextareaView(a)
  13699.     },
  13700.     getPostParams: function (c) {
  13701.       var d = a.Deferred(),
  13702.       e = y.getPostParams.call(this);
  13703.       return b.isString(c) && (e.raw_message = c),
  13704.       g.isFeatureActive('before_comment_callback', {
  13705.         forum: this.thread.forum.id
  13706.       }) ? (f.frame.sendHostMessage('posts.beforeCreate', {
  13707.         raw_message: e.raw_message
  13708.       }), this.listenToOnce(f.frame, 'posts.beforeCreate.response', function (a) {
  13709.         a && (e.raw_message = a),
  13710.         d.resolve(e)
  13711.       })) : d.resolve(e),
  13712.       d.promise()
  13713.     },
  13714.     getAuthorParams: function () {
  13715.       return this.session.isLoggedIn() ? {
  13716.         author_id: this.session.user.id
  13717.       }
  13718.        : {
  13719.         author_name: this.loginFormView.getDisplayName(),
  13720.         author_email: this.loginFormView.getEmail()
  13721.       }
  13722.     },
  13723.     initiatePost: function (a) {
  13724.       var c = b.bind(this.createPost, this);
  13725.       this.getPostParams(a).done(c)
  13726.     },
  13727.     shouldAbortCreatePost: function (a, c) {
  13728.       return this.constructor.mustVerifyEmailToPost(this.session.user, this.thread.forum) ? (this.session.fetch().always(b.bind(function () {
  13729.         this.constructor.mustVerifyEmailToPost(this.session.user, this.thread.forum) ? this._alertMustVerify(!0) : this.createPost(c)
  13730.       }, this)), !0) : y.shouldAbortCreatePost.call(this, a, c)
  13731.     },
  13732.     _onCreateError: function (a, b) {
  13733.       y._onCreateError.call(this, a, b),
  13734.       this.thread.incrementPostCount( - 1)
  13735.     },
  13736.     _onCreateSync: function (a, c) {
  13737.       y._onCreateSync.call(this, a, c),
  13738.       this.thread.posts.saveToCache(c),
  13739.       this.isEmbedV2Enabled && this.loadEditorV2(b.extend({
  13740.         clearDraft: !0
  13741.       }, this.getEditorProps()))
  13742.     },
  13743.     addPostToThread: function (a) {
  13744.       this.thread.incrementPostCount(1),
  13745.       this.thread.posts.add(a)
  13746.     },
  13747.     remove: function () {
  13748.       return this.loginFormView && (this.loginFormView.remove(), this.loginFormView = null),
  13749.       y.remove.call(this)
  13750.     },
  13751.     _submitForm: function (a, b) {
  13752.       return this.dismissAlert(),
  13753.       this.loginFormView.shouldRegisterUser() ? void this.loginFormView.registerUser() : this.initiatePost(b)
  13754.     },
  13755.     submitForm: w(function (a, c) {
  13756.       if (this.isEmbedV2Enabled && !b.isString(c)) {
  13757.         var d = this.$el.find('[data-role=textarea] button[type=button]');
  13758.         return void d.trigger('click')
  13759.       }
  13760.       return this._submitForm(a, c)
  13761.     })
  13762.   }, {
  13763.     ContentEditableView: p,
  13764.     User: i.User,
  13765.     Post: i.Post
  13766.   });
  13767.   return n.asRealtimeTyping(z.prototype),
  13768.   m.call(z.prototype),
  13769.   k.call(z.prototype),
  13770.   l.call(z.prototype),
  13771.   j.call(z.prototype),
  13772.   z
  13773. }),
  13774. define('core/constants/badgesConstants', [
  13775.   'exports'
  13776. ], function (a) {
  13777.   'use strict';
  13778.   a.ACTION_TYPES = {
  13779.     AWARD: 'award',
  13780.     REMOVE: 'remove'
  13781.   },
  13782.   a.BADGES_CRITERIA = {
  13783.     MANUAL: 'MANUAL',
  13784.     COMMENTS: 'COMMENTS',
  13785.     FEATURED_COMMENTS: 'FEATURED_COMMENTS',
  13786.     COMMENT_UPVOTES: 'COMMENT_UPVOTES'
  13787.   },
  13788.   a.MAX_BADGE_COUNT = 8
  13789. }),
  13790. define('core/models/RichMediaViewModel', [
  13791.   'backbone'
  13792. ], function (a) {
  13793.   'use strict';
  13794.   return a.Model.extend({
  13795.     defaults: {
  13796.       deferred: !0,
  13797.       showButtons: !0,
  13798.       activated: !1,
  13799.       kind: 'image',
  13800.       deferredHeight: 0,
  13801.       providerExpandMessage: '',
  13802.       providerCollapseMessage: '',
  13803.       providerIcon: 'icon-proceed',
  13804.       respectSettings: !0
  13805.     }
  13806.   })
  13807. }),
  13808. define('core/templates/postMediaInlineLink', [
  13809.   'handlebars',
  13810.   'core/templates/handlebars.partials',
  13811.   'core/extensions/handlebars.helpers'
  13812. ], function (a) {
  13813.   return a.template({
  13814.     1: function (a, b, c, d, e) {
  13815.       var f;
  13816.       return null != (f = c['if'].call(null != b ? b : a.nullContext || {
  13817.       }, null != b ? b.hasUserText : b, {
  13818.         name: 'if',
  13819.         hash: {
  13820.         },
  13821.         fn: a.program(2, e, 0),
  13822.         inverse: a.noop,
  13823.         data: e,
  13824.         loc: {
  13825.           start: {
  13826.             line: 2,
  13827.             column: 0
  13828.           },
  13829.           end: {
  13830.             line: 5,
  13831.             column: 7
  13832.           }
  13833.         }
  13834.       })) ? f : ''
  13835.     },
  13836.     2: function (a, b, c, d, e) {
  13837.       var f = a.lambda,
  13838.       g = a.escapeExpression;
  13839.       return '<a href="' + g(f(null != b ? b.href : b, b)) + '" rel="nofollow">' + g(f(null != b ? b.text : b, b)) + '</a>\n'
  13840.     },
  13841.     4: function (a, b, c, d, e) {
  13842.       var f,
  13843.       g = a.lambda,
  13844.       h = a.escapeExpression,
  13845.       i = null != b ? b : a.nullContext || {
  13846.       };
  13847.       return '<a href="' + h(g(null != b ? b.href : b, b)) + '" class="post-media-link" data-action="expand-collapse-media" rel="nofollow">' + (null != (f = c['if'].call(i, null != (f = null != b ? b.model : b) ? f.providerIcon : f, {
  13848.         name: 'if',
  13849.         hash: {
  13850.         },
  13851.         fn: a.program(5, e, 0),
  13852.         inverse: a.noop,
  13853.         data: e,
  13854.         loc: {
  13855.           start: {
  13856.             line: 10,
  13857.             column: 3
  13858.           },
  13859.           end: {
  13860.             line: 10,
  13861.             column: 74
  13862.           }
  13863.         }
  13864.       })) ? f : '') + h(g(null != b ? b.mediaLinkText : b, b)) + (null != (f = c['if'].call(i, null != b ? b.domain : b, {
  13865.         name: 'if',
  13866.         hash: {
  13867.         },
  13868.         fn: a.program(7, e, 0),
  13869.         inverse: a.noop,
  13870.         data: e,
  13871.         loc: {
  13872.           start: {
  13873.             line: 14,
  13874.             column: 3
  13875.           },
  13876.           end: {
  13877.             line: 14,
  13878.             column: 87
  13879.           }
  13880.         }
  13881.       })) ? f : '') + '</a>\n'
  13882.     },
  13883.     5: function (a, b, c, d, e) {
  13884.       var f;
  13885.       return '<i class="' + a.escapeExpression(a.lambda(null != (f = null != b ? b.model : b) ? f.providerIcon : f, b)) + '"></i>'
  13886.     },
  13887.     7: function (a, b, c, d, e) {
  13888.       return '<span class="post-media-link-domain"> &mdash; ' + a.escapeExpression(a.lambda(null != b ? b.domain : b, b)) + '</span>'
  13889.     },
  13890.     compiler: [
  13891.       8,
  13892.       '>= 4.3.0'
  13893.     ],
  13894.     main: function (a, b, c, d, e) {
  13895.       var f;
  13896.       return null != (f = c['if'].call(null != b ? b : a.nullContext || {
  13897.       }, null != (f = null != b ? b.model : b) ? f.deferred : f, {
  13898.         name: 'if',
  13899.         hash: {
  13900.         },
  13901.         fn: a.program(1, e, 0),
  13902.         inverse: a.program(4, e, 0),
  13903.         data: e,
  13904.         loc: {
  13905.           start: {
  13906.             line: 1,
  13907.             column: 0
  13908.           },
  13909.           end: {
  13910.             line: 16,
  13911.             column: 7
  13912.           }
  13913.         }
  13914.       })) ? f : ''
  13915.     },
  13916.     useData: !0
  13917.   })
  13918. }),
  13919. define('core/views/RichMediaLinkView', [
  13920.   'backbone',
  13921.   'core/utils',
  13922.   'core/templates/postMediaInlineLink'
  13923. ], function (a, b, c) {
  13924.   'use strict';
  13925.   return a.View.extend({
  13926.     tagName: 'span',
  13927.     events: {
  13928.       'click [data-action=expand-collapse-media]': 'handleToggle'
  13929.     },
  13930.     initialize: function (a) {
  13931.       this.media = a.media;
  13932.       var c = a.$link;
  13933.       this.linkText = c.text(),
  13934.       this.linkHref = c.attr('href'),
  13935.       this.linkDomain = b.getDomain(this.linkHref),
  13936.       this.linkHasUserText = this.isUserText(c),
  13937.       this.hasGenericMessage = !1,
  13938.       this.linkHasUserText ? this.mediaLinkText = this.linkText : this.media.get('title') ? this.mediaLinkText = b.niceTruncate(this.media.get('title'), 60) : (this.hasGenericMessage = !0, this.mediaLinkText = this.model.get('providerExpandMessage')),
  13939.       this.listenTo(this.model, 'change:deferred', this.render),
  13940.       this.listenTo(this.model, 'change:activated', this.onChangeActivated)
  13941.     },
  13942.     isUserText: function (a) {
  13943.       if ('A' !== a[0].nodeName) return !1;
  13944.       var b = (a.text() || '').toLowerCase();
  13945.       if (!b) return !1;
  13946.       if (0 === b.indexOf('http') || 0 === b.indexOf('www')) return !1;
  13947.       b = b.replace(/\.\.\.$/, '');
  13948.       var c = (a.attr('href') || '').toLowerCase();
  13949.       return c.indexOf(b) === - 1
  13950.     },
  13951.     render: function () {
  13952.       var a = this.mediaLinkText;
  13953.       return this.hasGenericMessage && this.model.get('activated') && (a = this.model.get('providerCollapseMessage')),
  13954.       this.$el.html(c({
  13955.         model: this.model.toJSON(),
  13956.         text: this.linkText,
  13957.         href: this.linkHref,
  13958.         mediaLinkText: a,
  13959.         domain: this.linkDomain,
  13960.         hasUserText: this.linkHasUserText
  13961.       })),
  13962.       this
  13963.     },
  13964.     onChangeActivated: function () {
  13965.       this.hasGenericMessage && this.render()
  13966.     },
  13967.     handleToggle: function (a) {
  13968.       this.model.get('deferred') || (this.model.set('activated', !this.model.get('activated')), a && a.preventDefault && a.preventDefault())
  13969.     }
  13970.   })
  13971. }),
  13972. define('core/templates/postMedia', [
  13973.   'handlebars',
  13974.   'core/templates/handlebars.partials',
  13975.   'core/extensions/handlebars.helpers'
  13976. ], function (a) {
  13977.   return a.template({
  13978.     1: function (a, b, c, d, e) {
  13979.       var f;
  13980.       return (null != (f = c['if'].call(null != b ? b : a.nullContext || {
  13981.       }, null != (f = null != b ? b.media : b) ? f.providerName : f, {
  13982.         name: 'if',
  13983.         hash: {
  13984.         },
  13985.         fn: a.program(2, e, 0),
  13986.         inverse: a.noop,
  13987.         data: e,
  13988.         loc: {
  13989.           start: {
  13990.             line: 5,
  13991.             column: 26
  13992.           },
  13993.           end: {
  13994.             line: 5,
  13995.             column: 90
  13996.           }
  13997.         }
  13998.       })) ? f : '') + a.escapeExpression(a.lambda(null != (f = null != b ? b.media : b) ? f.title : f, b))
  13999.     },
  14000.     2: function (a, b, c, d, e) {
  14001.       var f;
  14002.       return a.escapeExpression(a.lambda(null != (f = null != b ? b.media : b) ? f.providerName : f, b)) + ' &ndash; '
  14003.     },
  14004.     4: function (a, b, c, d, e) {
  14005.       var f;
  14006.       return '<i class="' + a.escapeExpression(a.lambda(null != (f = null != b ? b.model : b) ? f.providerIcon : f, b)) + ' publisher-background-color"></i>'
  14007.     },
  14008.     6: function (a, b, c, d, e) {
  14009.       return 'media-video'
  14010.     },
  14011.     compiler: [
  14012.       8,
  14013.       '>= 4.3.0'
  14014.     ],
  14015.     main: function (a, b, c, d, e) {
  14016.       var f,
  14017.       g = a.lambda,
  14018.       h = a.escapeExpression,
  14019.       i = null != b ? b : a.nullContext || {
  14020.       };
  14021.       return '\n<a class="media-button media-button-expand publisher-color publisher-border-color" href="' + h(g(null != (f = null != b ? b.media : b) ? f.url : f, b)) + '" rel="nofollow" target="_blank" data-action="expand"\ntitle="' + (null != (f = c['if'].call(i, null != (f = null != b ? b.media : b) ? f.title : f, {
  14022.         name: 'if',
  14023.         hash: {
  14024.         },
  14025.         fn: a.program(1, e, 0),
  14026.         inverse: a.noop,
  14027.         data: e,
  14028.         loc: {
  14029.           start: {
  14030.             line: 5,
  14031.             column: 7
  14032.           },
  14033.           end: {
  14034.             line: 5,
  14035.             column: 112
  14036.           }
  14037.         }
  14038.       })) ? f : '') + '">\n' + (null != (f = c['if'].call(i, null != (f = null != b ? b.model : b) ? f.providerIcon : f, {
  14039.         name: 'if',
  14040.         hash: {
  14041.         },
  14042.         fn: a.program(4, e, 0),
  14043.         inverse: a.noop,
  14044.         data: e,
  14045.         loc: {
  14046.           start: {
  14047.             line: 6,
  14048.             column: 0
  14049.           },
  14050.           end: {
  14051.             line: 6,
  14052.             column: 98
  14053.           }
  14054.         }
  14055.       })) ? f : '') + '\n' + h(g(null != (f = null != b ? b.model : b) ? f.providerExpandMessage : f, b)) + '\n</a>\n<a class="media-button media-button-contract publisher-color publisher-border-color" href="#" target="_blank" data-action="contract">\n<i class="icon-cancel publisher-background-color"></i> ' + h(g(null != (f = null != b ? b.model : b) ? f.providerCollapseMessage : f, b)) + '\n</a>\n<div class="media-content-loader" data-role="content-loader"></div>\n<div data-role="content-placeholder" class="media-content-placeholder media-' + h(g(null != (f = null != b ? b.media : b) ? f.providerName : f, b)) + ' ' + (null != (f = c['if'].call(i, null != b ? b.isVideo : b, {
  14056.         name: 'if',
  14057.         hash: {
  14058.         },
  14059.         fn: a.program(6, e, 0),
  14060.         inverse: a.noop,
  14061.         data: e,
  14062.         loc: {
  14063.           start: {
  14064.             line: 15,
  14065.             column: 99
  14066.           },
  14067.           end: {
  14068.             line: 15,
  14069.             column: 132
  14070.           }
  14071.         }
  14072.       })) ? f : '') + '"></div>\n'
  14073.     },
  14074.     useData: !0
  14075.   })
  14076. }),
  14077. define('core/templates/postMediaPlaceholder', [
  14078.   'handlebars',
  14079.   'core/templates/handlebars.partials',
  14080.   'core/extensions/handlebars.helpers'
  14081. ], function (a) {
  14082.   return a.template({
  14083.     compiler: [
  14084.       8,
  14085.       '>= 4.3.0'
  14086.     ],
  14087.     main: function (a, b, c, d, e) {
  14088.       var f;
  14089.       return '<a href="#" class="media-force-load" data-action="force-load"><i class="' + a.escapeExpression(a.lambda(null != (f = null != b ? b.model : b) ? f.providerIcon : f, b)) + '"></i></a>\n'
  14090.     },
  14091.     useData: !0
  14092.   })
  14093. }),
  14094. define('core/constants/mediaTypeConstants', [
  14095.   'exports'
  14096. ], function (a) {
  14097.   'use strict';
  14098.   a.VIDEO_CODES = [
  14099.     '3',
  14100.     '9',
  14101.     '12',
  14102.     '14'
  14103.   ]
  14104. }),
  14105. define('core/views/RichMediaView', [
  14106.   'jquery',
  14107.   'underscore',
  14108.   'backbone',
  14109.   'core/utils',
  14110.   'core/mediaConfig',
  14111.   'core/views/RichMediaLinkView',
  14112.   'core/templates/postMedia',
  14113.   'core/templates/postMediaPlaceholder',
  14114.   'core/constants/mediaTypeConstants'
  14115. ], function (a, b, c, d, e, f, g, h, i) {
  14116.   'use strict';
  14117.   var j = d.preventDefaultHandler,
  14118.   k = function (a, b, c, d) {
  14119.     a[b.get(c) ? 'addClass' : 'removeClass'](d)
  14120.   };
  14121.   return c.View.extend({
  14122.     className: 'media-container',
  14123.     events: {
  14124.       'click [data-action=expand]': 'handleExpand',
  14125.       'click [data-action=contract]': 'handleContract',
  14126.       'click [data-action=force-load]': 'handleForceLoad'
  14127.     },
  14128.     template: g,
  14129.     initialize: function (a) {
  14130.       this.options = a,
  14131.       this.media = a.media,
  14132.       this.template = a.template || this.template,
  14133.       this.$linkEl = null,
  14134.       this.setupMode(),
  14135.       this.listenTo(this.model, 'change:activated', this.applyState),
  14136.       this.listenTo(this.model, 'change:deferredHeight', this.onChangeDeferredHeight),
  14137.       this.listenTo(this.model, 'change:showButtons', this.updateElementClass),
  14138.       this.listenTo(this.model, 'change:deferred', this.render),
  14139.       this.listenTo(e, 'change:collapsed', this.setupMode)
  14140.     },
  14141.     getMediaDimensions: function () {
  14142.       return {
  14143.         width: null,
  14144.         height: null
  14145.       }
  14146.     },
  14147.     getAvailableWidth: function () {
  14148.       return this.$el.parent().width() || e.get('loadedThumbnailWidth')
  14149.     },
  14150.     updateDeferredHeight: function () {
  14151.       this.model.set('deferredHeight', this.calculateDeferredHeight())
  14152.     },
  14153.     calculateDeferredHeight: function () {
  14154.       var a = this.getMediaDimensions(),
  14155.       b = a.width,
  14156.       c = a.height;
  14157.       if (!b || !c) return c;
  14158.       var d = this.getAvailableWidth(),
  14159.       e = d * c / b;
  14160.       return e
  14161.     },
  14162.     convertToButton: function (a) {
  14163.       this.model.set('showButtons', !1),
  14164.       this.linkSubview && this.linkSubview.remove(),
  14165.       this.linkSubview = new f({
  14166.         model: this.model,
  14167.         media: this.media,
  14168.         $link: a
  14169.       }),
  14170.       a.replaceWith(this.linkSubview.$el),
  14171.       this.linkSubview.render()
  14172.     },
  14173.     applyContentNodeHeight: function (a) {
  14174.       this.contentNode.height(a || 'auto')
  14175.     },
  14176.     shouldAutoplay: function () {
  14177.       return !this.model.get('deferred')
  14178.     },
  14179.     generateContentHtml: function () {
  14180.       return this.media.get('html')
  14181.     },
  14182.     createContentNode: function (b) {
  14183.       return a(b)
  14184.     },
  14185.     insertContentNode: function (a) {
  14186.       this.contentNode.html(a)
  14187.     },
  14188.     prepareElementEvents: function () {
  14189.     },
  14190.     displayContent: function () {
  14191.       this.updateDeferredHeight();
  14192.       var a = this.generateContentHtml(),
  14193.       b = this.createContentNode(a);
  14194.       this.prepareElementEvents(b),
  14195.       this.insertContentNode(b),
  14196.       this.applyContentNodeHeight(null)
  14197.     },
  14198.     configureDeferred: function () {
  14199.       this.enterViewport()
  14200.     },
  14201.     configureContentFromActivated: function () {
  14202.       this.model.get('activated') ? this.displayContent() : this.displayPlaceholder()
  14203.     },
  14204.     displayPlaceholder: function () {
  14205.       this.contentNode.html(h({
  14206.         model: this.model.toJSON()
  14207.       }))
  14208.     },
  14209.     updateElementClass: function () {
  14210.       var a = this.$el,
  14211.       b = this.model;
  14212.       k(a, b, 'deferred', 'media-mode-deferred'),
  14213.       k(a, b, 'activated', 'media-activated'),
  14214.       k(a, b, 'showButtons', 'media-show-buttons')
  14215.     },
  14216.     applyState: function () {
  14217.       this.configureDeferred(),
  14218.       this.configureContentFromActivated(),
  14219.       this.updateElementClass()
  14220.     },
  14221.     render: function () {
  14222.       return this.$el.html(this.template({
  14223.         model: this.model.toJSON(),
  14224.         media: this.media.toJSON(),
  14225.         isVideo: b.contains(i.VIDEO_CODES, this.media.get('mediaType'))
  14226.       })),
  14227.       this.contentNode = this.$el.find('[data-role=content-placeholder]'),
  14228.       this.applyState(),
  14229.       this
  14230.     },
  14231.     remove: function () {
  14232.       this.linkSubview && this.linkSubview.remove(),
  14233.       c.View.prototype.remove.apply(this, arguments)
  14234.     },
  14235.     enterViewport: function () {
  14236.       this.model.get('deferred') && this.activate()
  14237.     },
  14238.     activate: function () {
  14239.       this.model.set('activated', !0)
  14240.     },
  14241.     setupMode: function () {
  14242.       if (this.model.get('respectSettings')) {
  14243.         this.model.set('activated', !1);
  14244.         var a = e.get('collapsed');
  14245.         a ? this.model.set('deferred', !1) : this.model.set('deferred', !0)
  14246.       }
  14247.     },
  14248.     onChangeDeferredHeight: function () {
  14249.       this.model.get('deferred') && !this.model.get('activated') && this.applyContentNodeHeight(this.model.get('deferredHeight'))
  14250.     },
  14251.     handleExpand: j(function () {
  14252.       this.model.set('activated', !0)
  14253.     }),
  14254.     handleContract: j(function () {
  14255.       this.model.set('activated', !1)
  14256.     }),
  14257.     handleForceLoad: j(function () {
  14258.       this.model.get('deferred') && this.model.set('activated', !0)
  14259.     })
  14260.   })
  14261. }),
  14262. define('core/templates/postMediaImage', [
  14263.   'handlebars',
  14264.   'core/templates/handlebars.partials',
  14265.   'core/extensions/handlebars.helpers'
  14266. ], function (a) {
  14267.   return a.template({
  14268.     1: function (a, b, c, d, e) {
  14269.       return '<video src="' + a.escapeExpression(a.lambda(null != b ? b.thumbnailUrl : b, b)) + '" autoplay muted loop></video>\n'
  14270.     },
  14271.     3: function (a, b, c, d, e) {
  14272.       var f,
  14273.       g = a.escapeExpression,
  14274.       h = null != b ? b : a.nullContext || {
  14275.       };
  14276.       return '<img src="' + g(a.lambda(null != b ? b.thumbnailUrl : b, b)) + '" alt="' + g(c.gettext.call(h, 'Thumbnail', {
  14277.         name: 'gettext',
  14278.         hash: {
  14279.         },
  14280.         data: e,
  14281.         loc: {
  14282.           start: {
  14283.             line: 6,
  14284.             column: 33
  14285.           },
  14286.           end: {
  14287.             line: 6,
  14288.             column: 56
  14289.           }
  14290.         }
  14291.       })) + '" ' + (null != (f = c['if'].call(h, null != (f = null != b ? b.model : b) ? f.deferredHeight : f, {
  14292.         name: 'if',
  14293.         hash: {
  14294.         },
  14295.         fn: a.program(4, e, 0),
  14296.         inverse: a.noop,
  14297.         data: e,
  14298.         loc: {
  14299.           start: {
  14300.             line: 6,
  14301.             column: 58
  14302.           },
  14303.           end: {
  14304.             line: 6,
  14305.             column: 128
  14306.           }
  14307.         }
  14308.       })) ? f : '') + '>\n'
  14309.     },
  14310.     4: function (a, b, c, d, e) {
  14311.       var f;
  14312.       return ' height="' + a.escapeExpression(a.lambda(null != (f = null != b ? b.model : b) ? f.deferredHeight : f, b)) + '" '
  14313.     },
  14314.     compiler: [
  14315.       8,
  14316.       '>= 4.3.0'
  14317.     ],
  14318.     main: function (a, b, c, d, e) {
  14319.       var f;
  14320.       return '<a href="' + a.escapeExpression(a.lambda(null != b ? b.imageUrl : b, b)) + '" target="_blank" rel="nofollow">\n' + (null != (f = c['if'].call(null != b ? b : a.nullContext || {
  14321.       }, null != b ? b.isVideo : b, {
  14322.         name: 'if',
  14323.         hash: {
  14324.         },
  14325.         fn: a.program(1, e, 0),
  14326.         inverse: a.program(3, e, 0),
  14327.         data: e,
  14328.         loc: {
  14329.           start: {
  14330.             line: 3,
  14331.             column: 0
  14332.           },
  14333.           end: {
  14334.             line: 7,
  14335.             column: 8
  14336.           }
  14337.         }
  14338.       })) ? f : '') + '</a>\n'
  14339.     },
  14340.     useData: !0
  14341.   })
  14342. }),
  14343. define('core/views/ImageRichMediaView', [
  14344.   'core/views/RichMediaView',
  14345.   'core/models/Media',
  14346.   'core/utils',
  14347.   'core/config',
  14348.   'core/mediaConfig',
  14349.   'core/templates/postMediaImage'
  14350. ], function (a, b, c, d, e, f) {
  14351.   'use strict';
  14352.   var g = new RegExp('(^|\\.)' + c.getDomain(d.urls.media).split('.').slice( - 2).join('\\.') + '$');
  14353.   return a.extend({
  14354.     getMediaDimensions: function () {
  14355.       return {
  14356.         width: this.media.get('thumbnailWidth'),
  14357.         height: this.media.get('thumbnailHeight')
  14358.       }
  14359.     },
  14360.     getImageUrl: function () {
  14361.       return this.media.get('resolvedUrlRedirect') || this.media.get('urlRedirect') || this.media.get('thumbnailUrl')
  14362.     },
  14363.     getImageThumbnailUrl: function () {
  14364.       var a = this.media.get('thumbnailUrl');
  14365.       return this.constructor.isOnDisqusCDN(a) && !this.isVideo() && (a = c.serialize(a, {
  14366.         w: e.get('loadedThumbnailWidth'),
  14367.         h: this.model.get('deferredHeight')
  14368.       })),
  14369.       a
  14370.     },
  14371.     isVideo: function () {
  14372.       return this.media.get('mediaType') === b.MEDIA_TYPES.MP4_VIDEO
  14373.     },
  14374.     generateContentHtml: function () {
  14375.       return f({
  14376.         model: this.model.toJSON(),
  14377.         media: this.media.toJSON(),
  14378.         thumbnailUrl: this.getImageThumbnailUrl(),
  14379.         imageUrl: this.getImageUrl(),
  14380.         isVideo: this.isVideo()
  14381.       })
  14382.     },
  14383.     prepareElementEvents: function (a) {
  14384.       var b = this,
  14385.       c = a.find('img');
  14386.       c.on('load.richMediaView error.richMediaView', function (a) {
  14387.         b.trigger(a.type),
  14388.         c.off('.richMediaView')
  14389.       })
  14390.     },
  14391.     calculateDeferredHeight: function () {
  14392.       var b = Math.floor(a.prototype.calculateDeferredHeight.apply(this, arguments)),
  14393.       c = this.getMediaDimensions().height;
  14394.       return Math.min(c, b) || null
  14395.     }
  14396.   }, {
  14397.     isOnDisqusCDN: function (a) {
  14398.       var b = c.getDomain(a);
  14399.       return g.test(b)
  14400.     }
  14401.   })
  14402. }),
  14403. define('core/views/IframeRichMediaView', [
  14404.   'underscore',
  14405.   'core/mediaConfig',
  14406.   'core/views/RichMediaView'
  14407. ], function (a, b, c) {
  14408.   'use strict';
  14409.   return c.extend({
  14410.     getMediaDimensions: function () {
  14411.       return {
  14412.         width: this.media.get('htmlWidth'),
  14413.         height: this.media.get('htmlHeight')
  14414.       }
  14415.     },
  14416.     _findIframe: function (a) {
  14417.       return a.is('iframe') ? a : a.find('iframe')
  14418.     },
  14419.     configureContentFromActivated: function () {
  14420.       c.prototype.configureContentFromActivated.apply(this, arguments),
  14421.       this.model.get('activated') || this.$el.removeClass('media-loading')
  14422.     },
  14423.     createContentNode: function () {
  14424.       var a = c.prototype.createContentNode.apply(this, arguments);
  14425.       return a.attr({
  14426.         width: '100%',
  14427.         height: this.model.get('deferredHeight')
  14428.       }),
  14429.       a
  14430.     },
  14431.     insertContentNode: function (a) {
  14432.       this.loaderNode = this.$el.find('[data-role=content-loader]'),
  14433.       this.loaderHeight = this.model.get('deferredHeight') || b.get('defaultIframeHeight'),
  14434.       this.loaderNode.height(this.loaderHeight),
  14435.       this.$el.addClass('media-loading'),
  14436.       c.prototype.insertContentNode.call(this, a)
  14437.     },
  14438.     prepareElementEvents: function (b) {
  14439.       var c = this._findIframe(b);
  14440.       c.one('load', a.bind(this.finishLoad, this, c))
  14441.     },
  14442.     finishLoad: function (a) {
  14443.       this.$el.removeClass('media-loading'),
  14444.       a.height(this.loaderHeight),
  14445.       this.trigger('load')
  14446.     }
  14447.   })
  14448. }),
  14449. define('core/views/FacebookPhotoRichMediaView', [
  14450.   'core/views/ImageRichMediaView'
  14451. ], function (a) {
  14452.   'use strict';
  14453.   return a.extend({
  14454.     getImageThumbnailUrl: function () {
  14455.       return this.media.get('metadata').imageUrl || a.prototype.getImageThumbnailUrl.call(this)
  14456.     }
  14457.   })
  14458. }),
  14459. define('core/views/AutoplayRichMediaView', [
  14460.   'underscore',
  14461.   'jquery',
  14462.   'core/utils',
  14463.   'core/views/IframeRichMediaView'
  14464. ], function (a, b, c, d) {
  14465.   'use strict';
  14466.   return d.extend({
  14467.     createContentNode: function () {
  14468.       var a = d.prototype.createContentNode.apply(this, arguments),
  14469.       b = a.attr('src');
  14470.       return this.shouldAutoplay() && b && !this.model.get('playerjs') && (b = c.serialize(b, {
  14471.         auto_play: !0,
  14472.         autoplay: 1
  14473.       }), a.attr('src', b)),
  14474.       a
  14475.     },
  14476.     insertContentNode: function (c) {
  14477.       if (this.model.get('playerjs')) {
  14478.         var e = this._findIframe(c),
  14479.         f = e.attr('src');
  14480.         '//' === f.substr(0, 2) && (f = window.location.protocol + f);
  14481.         var g = f.split('/');
  14482.         g = g[0] + '//' + g[2],
  14483.         this.playerjs = {
  14484.           ready: !1,
  14485.           queue: [
  14486.           ],
  14487.           origin: g,
  14488.           $iframe: e
  14489.         },
  14490.         this.model.get('mute') && this.send('mute'),
  14491.         this.shouldAutoplay() && this.send('play');
  14492.         var h = a.once(a.bind(function () {
  14493.           this.playerjs.ready = !0;
  14494.           var b = this.playerjs.queue;
  14495.           this.playerjs.queue = [
  14496.           ],
  14497.           a.each(b, this.send, this)
  14498.         }, this));
  14499.         b(window).on('message', function (a) {
  14500.           if (a = a.originalEvent, a.origin === g) {
  14501.             var b;
  14502.             try {
  14503.               b = JSON.parse(a.data)
  14504.             } catch (c) {
  14505.               return
  14506.             }
  14507.             'ready' === b.event && b.value && b.value.src === f && h()
  14508.           }
  14509.         })
  14510.       }
  14511.       return d.prototype.insertContentNode.apply(this, arguments)
  14512.     },
  14513.     send: function (a) {
  14514.       if (this.playerjs) {
  14515.         if (!this.playerjs.ready) return void this.playerjs.queue.push(a);
  14516.         var b = {
  14517.           context: 'player.js',
  14518.           version: '0.0.10',
  14519.           method: a
  14520.         };
  14521.         this.playerjs.$iframe[0].contentWindow.postMessage(JSON.stringify(b), this.playerjs.origin)
  14522.       }
  14523.     }
  14524.   })
  14525. }),
  14526. define('core/views/DynamicHeightRichMediaView', [
  14527.   'underscore',
  14528.   'core/views/RichMediaView'
  14529. ], function (a, b) {
  14530.   'use strict';
  14531.   return b.extend({
  14532.     insertContentNode: function () {
  14533.       b.prototype.insertContentNode.apply(this, arguments),
  14534.       this.finishLoad()
  14535.     },
  14536.     finishLoad: function () {
  14537.       var b = this,
  14538.       c = 0,
  14539.       d = 150,
  14540.       e = 20,
  14541.       f = function () {
  14542.         c += 1,
  14543.         c < e ? a.delay(f, d) : b.trigger('load')
  14544.       };
  14545.       f()
  14546.     }
  14547.   })
  14548. }),
  14549. define('core/templates/postMediaTwitterContent', [
  14550.   'handlebars',
  14551.   'core/templates/handlebars.partials',
  14552.   'core/extensions/handlebars.helpers'
  14553. ], function (a) {
  14554.   return a.template({
  14555.     compiler: [
  14556.       8,
  14557.       '>= 4.3.0'
  14558.     ],
  14559.     main: function (a, b, c, d, e) {
  14560.       var f = a.lambda,
  14561.       g = a.escapeExpression;
  14562.       return '<meta name="twitter:widgets:csp" content="on">\n<blockquote class="twitter-tweet" data-theme="' + g(f(null != b ? b.theme : b, b)) + '" data-link-color="' + g(f(null != b ? b.linkColor : b, b)) + '" lang="' + g(f(null != b ? b.language : b, b)) + '">\n<a href="' + g(f(null != b ? b.url : b, b)) + '"></a>\n</blockquote>\n<script src="//platform.twitter.com/widgets.js"></script>\n'
  14563.     },
  14564.     useData: !0
  14565.   })
  14566. }),
  14567. define('core/views/TwitterRichMediaView', [
  14568.   'underscore',
  14569.   'core/views/DynamicHeightRichMediaView',
  14570.   'core/templates/postMediaTwitterContent'
  14571. ], function (a, b, c) {
  14572.   'use strict';
  14573.   var d = b.extend({
  14574.     generateContentHtml: function () {
  14575.       var b = window.document.documentElement.lang;
  14576.       b = b && b.substring(0, 2);
  14577.       var e = this.media.get('url');
  14578.       return this.media.get('resolvedUrl').indexOf('/status') !== - 1 && (e = this.media.get('resolvedUrl')),
  14579.       c({
  14580.         url: e,
  14581.         theme: a.result(d, 'theme'),
  14582.         linkColor: a.result(d, 'linkColor'),
  14583.         language: b
  14584.       })
  14585.     }
  14586.   }, {
  14587.     theme: 'light',
  14588.     linkColor: '#2e9fff'
  14589.   });
  14590.   return d
  14591. }),
  14592. define('core/views/SoundCloudRichMediaView', [
  14593.   'core/views/AutoplayRichMediaView'
  14594. ], function (a) {
  14595.   'use strict';
  14596.   return a.extend({
  14597.     getMediaDimensions: function () {
  14598.       return {
  14599.         width: null,
  14600.         height: this.media.get('htmlHeight')
  14601.       }
  14602.     }
  14603.   })
  14604. }),
  14605. define('core/views/VineRichMediaView', [
  14606.   'core/views/AutoplayRichMediaView',
  14607.   'core/utils'
  14608. ], function (a, b) {
  14609.   'use strict';
  14610.   return a.extend({
  14611.     createContentNode: function () {
  14612.       var c = a.prototype.createContentNode.apply(this, arguments),
  14613.       d = c.attr('src');
  14614.       return this.shouldAutoplay() && d && (d = b.serialize(d, {
  14615.         audio: 1
  14616.       }), c.attr('src', d)),
  14617.       c
  14618.     }
  14619.   })
  14620. }),
  14621. define('core/views/IframeGifRichMediaView', [
  14622.   'core/views/IframeRichMediaView'
  14623. ], function (a) {
  14624.   'use strict';
  14625.   return a.extend({
  14626.     insertContentNode: function (b) {
  14627.       a.prototype.insertContentNode.call(this, b),
  14628.       this.loaderNode.width(this.getMediaDimensions().width)
  14629.     },
  14630.     createContentNode: function () {
  14631.       var b = a.prototype.createContentNode.apply(this, arguments);
  14632.       return b.attr(this.getMediaDimensions()),
  14633.       b
  14634.     },
  14635.     calculateDeferredHeight: function () {
  14636.       return this.getMediaDimensions().height
  14637.     },
  14638.     displayPlaceholder: function () {
  14639.       a.prototype.displayPlaceholder.call(this);
  14640.       var b = this.getMediaDimensions();
  14641.       this.contentNode.height(b.height).width(b.width)
  14642.     }
  14643.   })
  14644. }),
  14645. define('core/media', [
  14646.   'underscore',
  14647.   'core/strings',
  14648.   'core/models/Media',
  14649.   'core/models/RichMediaViewModel',
  14650.   'core/views/ImageRichMediaView',
  14651.   'core/views/IframeRichMediaView',
  14652.   'core/views/FacebookPhotoRichMediaView',
  14653.   'core/views/AutoplayRichMediaView',
  14654.   'core/views/TwitterRichMediaView',
  14655.   'core/views/SoundCloudRichMediaView',
  14656.   'core/views/VineRichMediaView',
  14657.   'core/views/IframeGifRichMediaView'
  14658. ], function (a, b, c, d, e, f, g, h, i, j, k, l) {
  14659.   'use strict';
  14660.   var m = b.get,
  14661.   n = {
  14662.     PLAY_HIDE: {
  14663.       kind: 'html',
  14664.       providerExpandMessage: m('Play'),
  14665.       providerCollapseMessage: m('Hide')
  14666.     },
  14667.     VIEW_HIDE: {
  14668.       kind: 'html',
  14669.       providerExpandMessage: m('View'),
  14670.       providerCollapseMessage: m('Hide')
  14671.     },
  14672.     VIEW_IMAGE: {
  14673.       kind: 'image',
  14674.       providerIcon: 'icon-images',
  14675.       providerExpandMessage: m('View'),
  14676.       providerCollapseMessage: m('Hide')
  14677.     }
  14678.   },
  14679.   o = function (b) {
  14680.     var m = function (b, c) {
  14681.       return a.defaults({
  14682.         providerIcon: c
  14683.       }, n[b])
  14684.     },
  14685.     o = null,
  14686.     p = null,
  14687.     q = c.MEDIA_TYPES;
  14688.     switch (b.get('mediaType')) {
  14689.       case q.IMAGE:
  14690.       case q.IMAGE_UPLOAD:
  14691.       case q.MP4_VIDEO:
  14692.         o = n.VIEW_IMAGE;
  14693.         break;
  14694.       case q.FACEBOOK_PHOTO:
  14695.         p = g,
  14696.         o = n.VIEW_IMAGE;
  14697.         break;
  14698.       case q.GIF_VIDEO:
  14699.         p = l,
  14700.         o = n.VIEW_HIDE;
  14701.         break;
  14702.       case q.VIMEO_VIDEO:
  14703.       case q.YOUTUBE_VIDEO:
  14704.         p = h,
  14705.         o = m('PLAY_HIDE', 'icon-video');
  14706.         break;
  14707.       case q.TWITTER_STATUS:
  14708.         p = i,
  14709.         o = m('VIEW_HIDE', 'icon-twitter-x');
  14710.         break;
  14711.       case q.VINE_VIDEO:
  14712.         p = k,
  14713.         o = m('PLAY_HIDE', 'icon-video');
  14714.         break;
  14715.       case q.FACEBOOK_VIDEO:
  14716.         o = m('VIEW_HIDE', 'icon-video');
  14717.         break;
  14718.       case q.SOUNDCLOUD_SOUND:
  14719.         p = j,
  14720.         o = m('PLAY_HIDE', 'icon-music');
  14721.         break;
  14722.       case q.GOOGLE_MAP:
  14723.         o = m('VIEW_HIDE', 'icon-map');
  14724.         break;
  14725.       default:
  14726.         return null
  14727.     }
  14728.     if (null === p) switch (o.kind) {
  14729.       case 'webpage':
  14730.         return null;
  14731.       case 'html':
  14732.         p = f;
  14733.         break;
  14734.       case 'image':
  14735.         p = e
  14736.     }
  14737.     var r = new d(o);
  14738.     return {
  14739.       Cls: p,
  14740.       mediaViewModel: r
  14741.     }
  14742.   },
  14743.   p = function (a) {
  14744.     var b = o(a);
  14745.     return b ? new b.Cls({
  14746.       model: b.mediaViewModel,
  14747.       media: a
  14748.     }) : null
  14749.   },
  14750.   q = function (a) {
  14751.     return new e({
  14752.       model: new d(n.VIEW_IMAGE),
  14753.       media: a
  14754.     })
  14755.   };
  14756.   return {
  14757.     instantiateRichMediaView: p,
  14758.     instantiateRichMediaThumbnail: q,
  14759.     getRichMediaViewConfig: o
  14760.   }
  14761. }),
  14762. define('core/mixins/withRichMedia', [
  14763.   'underscore',
  14764.   'jquery',
  14765.   'core/collections/MediaCollection',
  14766.   'core/media'
  14767. ], function (a, b, c, d) {
  14768.   'use strict';
  14769.   function e(a) {
  14770.     var c = {
  14771.     };
  14772.     return a.length ? (a.find('a').each(function (a, d) {
  14773.       var e = d.href;
  14774.       c[e] || (c[e] = b(d))
  14775.     }), c) : c
  14776.   }
  14777.   function f() {
  14778.     a.extend(this, g)
  14779.   }
  14780.   var g = {
  14781.     renderRichMedia: function (a, f, g) {
  14782.       return g = g || {
  14783.       },
  14784.       a = a instanceof c ? a : new c(a),
  14785.       a.chain().map(function (a) {
  14786.         return d.instantiateRichMediaView(a)
  14787.       }).without(null).map(function (a) {
  14788.         var c = a.media.get('urlRedirect');
  14789.         g.normalize && (c = g.normalize.call(this, c));
  14790.         var d = e(this.$('[data-role=message]')),
  14791.         h = d[c];
  14792.         return g.beforeRender && g.beforeRender.call(this, a),
  14793.         a.render(),
  14794.         h ? g.convertLinkToButton ? (h.after(a.$el), a.convertToButton(h)) : h.replaceWith(a.$el) : (f = f || this.$('[data-role=post-media-list]'), f.append(b('<li>').append(a.$el))),
  14795.         a
  14796.       }, this).value()
  14797.     }
  14798.   };
  14799.   return f
  14800. }),
  14801. define('core/views/common/HoverCard', [
  14802.   'jquery',
  14803.   'underscore',
  14804.   'backbone',
  14805.   'core/bus'
  14806. ], function (a, b, c, d) {
  14807.   'use strict';
  14808.   var e = c.View.extend({
  14809.     events: {
  14810.       mouseenter: 'enter',
  14811.       mouseleave: 'leave'
  14812.     },
  14813.     initialize: function () {
  14814.       this._id = b.uniqueId(),
  14815.       this._rendered = !1,
  14816.       this._hoverState = 'out',
  14817.       this._visible = !1,
  14818.       this._enterTimeout = null,
  14819.       this._leaveTimeout = null,
  14820.       e.open = {
  14821.       },
  14822.       this.events = this.events || {
  14823.       },
  14824.       this.events['click [data-action=profile]'] = 'handleShowProfile',
  14825.       this.listenTo(this, 'authenticating', this.keepOpen)
  14826.     },
  14827.     render: function () {
  14828.       return this.hide(),
  14829.       a('body').append(this.el),
  14830.       this
  14831.     },
  14832.     target: function (a) {
  14833.       a.on('mouseenter', b.bind(this.enter, this, a)),
  14834.       a.on('mouseleave', b.bind(this.leave, this))
  14835.     },
  14836.     enter: function (a) {
  14837.       var c = this;
  14838.       a.originalEvent && (a = null),
  14839.       a && (c.$target = a),
  14840.       c._leaveTimeout && clearTimeout(c._leaveTimeout),
  14841.       'in' !== c._hoverState && (c._hoverState = 'in', c._enterTimeout = b.delay(function () {
  14842.         'in' === c._hoverState && c.show(),
  14843.         c._enterTimeout = null
  14844.       }, e.DELAY_ENTER), e.open[this.uid] = this)
  14845.     },
  14846.     leave: function () {
  14847.       var a = this;
  14848.       a._enterTimeout && clearTimeout(a._enterTimeout),
  14849.       'out' !== a._hoverState && (a._hoverState = 'out', a._leaveTimeout = b.delay(function () {
  14850.         'out' === a._hoverState && a.hide(),
  14851.         a._leaveTimeout = null
  14852.       }, e.DELAY_LEAVE), e.open[this.uid] && delete e.open[this.uid])
  14853.     },
  14854.     show: function () {
  14855.       var a = this;
  14856.       a._rendered || (a._rendered = !0, a.render()),
  14857.       a.moveTo(a.$target),
  14858.       a.$el.show(),
  14859.       a._visible = !0,
  14860.       a.trigger('show')
  14861.     },
  14862.     moveTo: function (a) {
  14863.       if (a) {
  14864.         var b = e.POSITION_OFFSET,
  14865.         c = a.offset(),
  14866.         d = this.$el,
  14867.         f = d.height(),
  14868.         g = this.getContainerPosition();
  14869.         c.top -= b;
  14870.         var h = c.top + f + g.containerOffset.top,
  14871.         i = g.pageOffset + g.containerHeight;
  14872.         h <= i ? d.css('top', c.top) : d.css('top', c.top - f + 2 * b),
  14873.         d.css('left', c.left + b)
  14874.       }
  14875.     },
  14876.     getContainerPosition: function () {
  14877.       return {
  14878.         pageOffset: a(window).scrollTop(),
  14879.         containerOffset: {
  14880.           top: 0,
  14881.           height: a(window).height()
  14882.         },
  14883.         containerHeight: a(window).height()
  14884.       }
  14885.     },
  14886.     hide: function () {
  14887.       this._keepOpen || (this._enterTimeout && clearTimeout(this._enterTimeout), this.$el.hide(), this._visible = !1)
  14888.     },
  14889.     keepOpen: function () {
  14890.       this._keepOpen = !0,
  14891.       this.setupKeepOpenCanceler()
  14892.     },
  14893.     setupKeepOpenCanceler: function () {
  14894.       var c = this,
  14895.       e = function () {
  14896.         'out' === c._hoverState && (c.stopListening(d, 'window.click', e), a('body').off('click', e), c._keepOpen = !1, c.hide())
  14897.       };
  14898.       b.delay(function () {
  14899.         c.listenTo(d, 'window.click', e),
  14900.         a('body').on('click', e)
  14901.       }, 100)
  14902.     },
  14903.     isVisible: function () {
  14904.       return this._visible
  14905.     },
  14906.     handleShowProfile: function () {
  14907.       this.hide()
  14908.     }
  14909.   }, {
  14910.     open: {
  14911.     },
  14912.     instances: {
  14913.     },
  14914.     DELAY_ENTER: 350,
  14915.     DELAY_LEAVE: 175,
  14916.     POSITION_OFFSET: 20,
  14917.     exitAll: function () {
  14918.       b.invoke(e.open, 'leave')
  14919.     },
  14920.     create: function (a, b, c, d) {
  14921.       var f = e.instances[c];
  14922.       f || (e.instances[c] = f = {
  14923.       });
  14924.       var g = f[a];
  14925.       return g || (g = new d(b), f[a] = g),
  14926.       b.targetElement && g.target(b.targetElement),
  14927.       g
  14928.     }
  14929.   });
  14930.   return function () {
  14931.     a(window.document).on('mouseout', b.debounce(function (a) {
  14932.       var b = a.relatedTarget || a.toElement;
  14933.       b && 'HTML' !== b.nodeName || e.exitAll()
  14934.     }, 10))
  14935.   }(),
  14936.   e
  14937. }),
  14938. define('core/utils/views', [
  14939.   'underscore'
  14940. ], function (a) {
  14941.   'use strict';
  14942.   var b = function (b, c, d) {
  14943.     var e = b.prototype,
  14944.     f = a.extend({
  14945.     }, c, d);
  14946.     if (a.defaults(e, f), a.defaults(e.events, f.events), void 0 !== e.initialize && void 0 !== f.initialize) {
  14947.       var g = e.initialize;
  14948.       e.initialize = function () {
  14949.         var a = g.apply(this, arguments);
  14950.         return f.initialize.apply(this, arguments),
  14951.         a
  14952.       }
  14953.     }
  14954.   };
  14955.   return {
  14956.     mixin: b
  14957.   }
  14958. }),
  14959. define('core/views/common/mixins/LocalScroll', [
  14960. ], function () {
  14961.   'use strict';
  14962.   var a = {
  14963.     events: {
  14964.       mousewheel: 'handleScrollEvent',
  14965.       wheel: 'handleScrollEvent'
  14966.     },
  14967.     scrollMeasureSelector: '',
  14968.     getScrollMeasure: function () {
  14969.       return this.scrollMeasure || (this.scrollMeasure = this.$el, this.scrollMeasureSelector && (this.scrollMeasure = this.$el.find(this.scrollMeasureSelector))),
  14970.       this.scrollMeasure
  14971.     },
  14972.     handleScrollEvent: function (a) {
  14973.       var b = a.originalEvent,
  14974.       c = b.wheelDeltaY || - b.deltaY,
  14975.       d = this.$el,
  14976.       e = d.height(),
  14977.       f = this.getScrollMeasure(),
  14978.       g = f.height(),
  14979.       h = f.parent() [0].scrollTop,
  14980.       i = h >= g - e,
  14981.       j = 0 === h;
  14982.       (i && c < 0 || j && c > 0) && a.preventDefault()
  14983.     }
  14984.   };
  14985.   return a
  14986. }),
  14987. define('core/templates/usersCard', [
  14988.   'handlebars',
  14989.   'core/templates/handlebars.partials',
  14990.   'core/extensions/handlebars.helpers'
  14991. ], function (a) {
  14992.   return a.template({
  14993.     1: function (a, b, c, d, e) {
  14994.       return 'guests-only'
  14995.     },
  14996.     3: function (a, b, c, d, e) {
  14997.       return 'tooltip--post-refresh'
  14998.     },
  14999.     5: function (a, b, c, d, e, f, g) {
  15000.       var h;
  15001.       return null != (h = c.each.call(null != b ? b : a.nullContext || {
  15002.       }, null != b ? b.users : b, {
  15003.         name: 'each',
  15004.         hash: {
  15005.         },
  15006.         fn: a.program(6, e, 0, f, g),
  15007.         inverse: a.noop,
  15008.         data: e,
  15009.         loc: {
  15010.           start: {
  15011.             line: 5,
  15012.             column: 0
  15013.           },
  15014.           end: {
  15015.             line: 7,
  15016.             column: 9
  15017.           }
  15018.         }
  15019.       })) ? h : ''
  15020.     },
  15021.     6: function (a, b, c, d, e, f, g) {
  15022.       var h;
  15023.       return null != (h = a.invokePartial(d.cardUser, b, {
  15024.         name: 'cardUser',
  15025.         hash: {
  15026.           isRefreshEnabled: null != g[1] ? g[1].isRefreshEnabled : g[1],
  15027.           forumId: null != g[1] ? g[1].forumId : g[1],
  15028.           highlight: null != g[1] ? g[1].highlight : g[1]
  15029.         },
  15030.         data: e,
  15031.         helpers: c,
  15032.         partials: d,
  15033.         decorators: a.decorators
  15034.       })) ? h : ''
  15035.     },
  15036.     8: function (a, b, c, d, e) {
  15037.       return 'tooltip-point--refresh'
  15038.     },
  15039.     compiler: [
  15040.       8,
  15041.       '>= 4.3.0'
  15042.     ],
  15043.     main: function (a, b, c, d, e, f, g) {
  15044.       var h,
  15045.       i = null != b ? b : a.nullContext || {
  15046.       };
  15047.       return '<div class="tooltip-wrapper">\n<div class="tooltip voters ' + (null != (h = c.unless.call(i, null != (h = null != b ? b.users : b) ? h.length : h, {
  15048.         name: 'unless',
  15049.         hash: {
  15050.         },
  15051.         fn: a.program(1, e, 0, f, g),
  15052.         inverse: a.noop,
  15053.         data: e,
  15054.         loc: {
  15055.           start: {
  15056.             line: 2,
  15057.             column: 27
  15058.           },
  15059.           end: {
  15060.             line: 2,
  15061.             column: 73
  15062.           }
  15063.         }
  15064.       })) ? h : '') + ' ' + (null != (h = c['if'].call(i, null != b ? b.isRefreshEnabled : b, {
  15065.         name: 'if',
  15066.         hash: {
  15067.         },
  15068.         fn: a.program(3, e, 0, f, g),
  15069.         inverse: a.noop,
  15070.         data: e,
  15071.         loc: {
  15072.           start: {
  15073.             line: 2,
  15074.             column: 74
  15075.           },
  15076.           end: {
  15077.             line: 2,
  15078.             column: 126
  15079.           }
  15080.         }
  15081.       })) ? h : '') + '">\n<ul class="scroll-measure" data-role="content">\n' + (null != (h = c['if'].call(i, null != (h = null != b ? b.users : b) ? h.length : h, {
  15082.         name: 'if',
  15083.         hash: {
  15084.         },
  15085.         fn: a.program(5, e, 0, f, g),
  15086.         inverse: a.noop,
  15087.         data: e,
  15088.         loc: {
  15089.           start: {
  15090.             line: 4,
  15091.             column: 0
  15092.           },
  15093.           end: {
  15094.             line: 8,
  15095.             column: 7
  15096.           }
  15097.         }
  15098.       })) ? h : '') + '</ul>\n</div>\n</div>\n<div class="tooltip-point hidden ' + (null != (h = c['if'].call(i, null != b ? b.isRefreshEnabled : b, {
  15099.         name: 'if',
  15100.         hash: {
  15101.         },
  15102.         fn: a.program(8, e, 0, f, g),
  15103.         inverse: a.noop,
  15104.         data: e,
  15105.         loc: {
  15106.           start: {
  15107.             line: 12,
  15108.             column: 33
  15109.           },
  15110.           end: {
  15111.             line: 12,
  15112.             column: 86
  15113.           }
  15114.         }
  15115.       })) ? h : '') + '"></div>\n'
  15116.     },
  15117.     usePartial: !0,
  15118.     useData: !0,
  15119.     useDepths: !0
  15120.   })
  15121. }),
  15122. define('core/views/UsersCard', [
  15123.   'jquery',
  15124.   'underscore',
  15125.   'handlebars',
  15126.   'core/config',
  15127.   'core/bus',
  15128.   'core/utils/views',
  15129.   'core/switches',
  15130.   'core/utils',
  15131.   'core/views/common/HoverCard',
  15132.   'core/views/common/mixins/LocalScroll',
  15133.   'core/templates/usersCard'
  15134. ], function (a, b, c, d, e, f, g, h, i, j, k) {
  15135.   'use strict';
  15136.   var l = function (a) {
  15137.     return a.get('isAnonymous') || a.get('isBlocked') || a.get('isBlocking')
  15138.   },
  15139.   m = i.extend({
  15140.     guestTextPartialName: 'cardOtherUserText',
  15141.     initialize: function (a) {
  15142.       this.isRefreshEnabled = a.isRefreshEnabled,
  15143.       this.$el.attr('class', this.isRefreshEnabled ? 'tooltip-outer voters-outer voters-outer--refresh' : 'tooltip-outer voters-outer'),
  15144.       i.prototype.initialize.call(this, a),
  15145.       this.collection = this.collection || a.collection,
  15146.       this.session = a.session,
  15147.       this.numUsers = a.numUsers,
  15148.       this.voteType = a.voteType,
  15149.       this.listenTo(this.collection, 'add', this.addUser),
  15150.       this.listenTo(this.collection, 'change:isBlocked', this.render),
  15151.       this.listenTo(this.collection, 'remove', this.removeUser),
  15152.       this.listenTo(this.collection, 'reset', this.render)
  15153.     },
  15154.     addUser: function (a) {
  15155.       l(a) ? this.updateGuests() : this.$listEl && this.$listEl.length && (this.$listEl.prepend(c.partials.cardUser(this.getUserTemplateData(a))), this.stopHighlightUsername())
  15156.     },
  15157.     removeUser: function (a) {
  15158.       if (l(a)) this.updateGuests();
  15159.        else {
  15160.         var b = this.$el.find('[data-username=' + a.get('username') + ']');
  15161.         b.length && b.remove()
  15162.       }
  15163.     },
  15164.     stopHighlightUsername: b.debounce(function () {
  15165.       var a = this.$el.find('.highlight');
  15166.       a.removeClass('highlight')
  15167.     }, 1100),
  15168.     getGuestCount: function () {
  15169.       return Math.max(this.numUsers - this.collection.reject(l).length, 0)
  15170.     },
  15171.     updateGuests: function () {
  15172.       var a = this.$el.find('[data-role=guest]'),
  15173.       b = this.getGuestCount(),
  15174.       e = c.partials[this.guestTextPartialName]({
  15175.         guestCount: b
  15176.       }),
  15177.       f = {
  15178.         guestCount: b,
  15179.         guestAvatarUrl: d.urls.avatar.generic,
  15180.         highlight: a.length,
  15181.         guestText: e,
  15182.         isRefreshEnabled: this.isRefreshEnabled
  15183.       },
  15184.       g = c.partials.cardGuestUser(f);
  15185.       a.length ? (a.replaceWith(g), this.stopHighlightUsername()) : this.$listEl && this.$listEl.length && this.$listEl.append(g)
  15186.     },
  15187.     getTemplateData: function () {
  15188.       var a = b.invoke(this.collection.reject(l), 'toJSON').map(function (a) {
  15189.         return a.initials = h.getInitials(a.name || ''),
  15190.         a
  15191.       });
  15192.       return {
  15193.         users: a,
  15194.         highlight: !1,
  15195.         isRefreshEnabled: this.isRefreshEnabled
  15196.       }
  15197.     },
  15198.     getUserTemplateData: function (a) {
  15199.       var c = a.toJSON();
  15200.       return c.initials = h.getInitials(c.name || ''),
  15201.       b.extend({
  15202.         highlight: !0,
  15203.         isRefreshEnabled: this.isRefreshEnabled
  15204.       }, c)
  15205.     },
  15206.     render: function () {
  15207.       delete this.pointEl,
  15208.       this.$el.html(k(this.getTemplateData())),
  15209.       i.prototype.render.call(this),
  15210.       this.$listEl = this.$el.find('.voters ul'),
  15211.       this.updateGuests()
  15212.     },
  15213.     show: function () {
  15214.       this.numUsers && !this.isVisible() && (i.prototype.show.call(this), e.trigger('uiAction:userCardShow'))
  15215.     },
  15216.     showPoint: function (a) {
  15217.       var c = [
  15218.         'tl',
  15219.         'bl'
  15220.       ],
  15221.       d = this.$el.find('.tooltip--post-refresh'),
  15222.       e = this.$el.find('.tooltip-wrapper');
  15223.       this.pointEl || (this.pointEl = this.$el.find('.tooltip-point'), this.pointEl.removeClass('hidden')),
  15224.       b.each(c, function (a) {
  15225.         this.pointEl.removeClass('point-position-' + a),
  15226.         d.removeClass('tooltip--' + a),
  15227.         e.removeClass('tooltip-wrapper--' + a)
  15228.       }, this),
  15229.       this.pointEl.addClass('point-position-' + a),
  15230.       d.addClass('tooltip--' + a),
  15231.       e.addClass('tooltip-wrapper--' + a)
  15232.     },
  15233.     moveTo: function (a, b) {
  15234.       if (a) {
  15235.         var c = i.POSITION_OFFSET,
  15236.         d = a.offset(),
  15237.         e = this.$el,
  15238.         f = e.height(),
  15239.         g = a.outerWidth(),
  15240.         h = this.getContainerPosition();
  15241.         b && (f += e.find('li.user').height() + 10),
  15242.         d.top - f - c >= 0 && d.top - f + h.containerOffset.top >= h.pageOffset ? (e.css({
  15243.           bottom: h.containerOffset.height - d.top + c,
  15244.           top: 'inherit'
  15245.         }), this.showPoint('bl')) : (e.css({
  15246.           bottom: 'inherit',
  15247.           top: d.top + 2 * c
  15248.         }), this.showPoint('tl')),
  15249.         'rtl' === window.document.documentElement.dir ? e.css('right', d.left ? h.containerOffset.width - d.left - g - c : 0) : e.css('left', d.left - c)
  15250.       }
  15251.     },
  15252.     handleShowProfile: function (b) {
  15253.       i.prototype.handleShowProfile.call(this, b);
  15254.       var c = a(b.currentTarget),
  15255.       d = c.attr('data-username');
  15256.       e.trigger('uiCallback:showProfile', d, b)
  15257.     }
  15258.   }, {
  15259.     create: function (a, b) {
  15260.       return i.create(a, b, 'UsersCard', m)
  15261.     }
  15262.   });
  15263.   return f.mixin(m, j, {
  15264.     scrollMeasureSelector: '[data-role=content]'
  15265.   }),
  15266.   m
  15267. }),
  15268. define('core/views/VotersCard', [
  15269.   'underscore',
  15270.   'core/views/common/HoverCard',
  15271.   'core/views/UsersCard',
  15272.   'core/switches',
  15273.   'core/utils'
  15274. ], function (a, b, c, d, e) {
  15275.   'use strict';
  15276.   var f = e.preventDefaultHandler,
  15277.   g = c.extend({
  15278.     guestTextPartialName: 'cardGuestVoterText',
  15279.     initialize: function (b) {
  15280.       this.voteType = b.voteType;
  15281.       var d = b.model,
  15282.       e = 1 === this.voteType ? d.getUpvotersUserCollection() : d.getDownvotersUserCollection();
  15283.       a.extend(b, {
  15284.         collection: e,
  15285.         numUsers: 1 === this.voteType ? d.get('likes') : d.get('dislikes')
  15286.       }),
  15287.       c.prototype.initialize.call(this, b),
  15288.       this.model = d,
  15289.       this.session = b.session,
  15290.       this.likes = d.get('likes'),
  15291.       this.dislikes = d.get('dislikes'),
  15292.       this.hadLikes = Boolean(this.likes),
  15293.       this.hadDislikes = Boolean(this.dislikes),
  15294.       this.isRefreshEnabled = b.isRefreshEnabled,
  15295.       this._fetched = !1,
  15296.       this._rendered = !1,
  15297.       this.listenTo(this.model, 'change:userScore', this.updateUserSet),
  15298.       1 === this.voteType ? this.listenTo(this.model, 'change:likes', this.updateGuests) : this.listenTo(this.model, 'change:dislikes', this.updateGuests)
  15299.     },
  15300.     updateGuests: function () {
  15301.       this.numUsers = (1 === this.voteType ? this.model.get('likes') : this.model.get('dislikes')) || 0,
  15302.       c.prototype.updateGuests.call(this)
  15303.     },
  15304.     updateUserSet: function () {
  15305.       var a = this.session.user,
  15306.       b = this.likes,
  15307.       c = this.dislikes,
  15308.       d = !1;
  15309.       this.likes = this.model.get('likes'),
  15310.       this.dislikes = this.model.get('dislikes'),
  15311.       this.model.get('userScore') === this.voteType ? (this.session.isLoggedIn() && this.collection.add(a), 1 === this.voteType && this.likes && !b || this.voteType === - 1 && this.dislikes && !c ? (this._rendered = !1, this.show()) : d = !!this.session.isLoggedOut() || Boolean((1 === this.voteType ? this.likes : this.dislikes) - 1 - this.collection.length)) : (this.collection.remove(a), (1 === this.voteType && !this.likes || this.voteType === - 1 && !this.dislikes) && this.hide()),
  15312.       this.updateGuests(),
  15313.       this.moveTo(this.$target, d)
  15314.     },
  15315.     show: function () {
  15316.       if (this.isRefreshEnabled && (b.prototype.constructor.POSITION_OFFSET = 12), !(1 === this.voteType && !this.likes || this.voteType === - 1 && !this.dislikes || this.isVisible())) {
  15317.         if ((1 === this.voteType && !this.hadLikes || this.voteType === - 1 && !this.hadDislikes) && (this._fetched = !0), !this._fetched) return void this.collection.fetch({
  15318.           vote: this.voteType
  15319.         }).done(a.bind(function () {
  15320.           this._fetched = !0,
  15321.           this.show()
  15322.         }, this));
  15323.         var d = this.session.user;
  15324.         this.model.get('userScore') === this.voteType && this.session.isLoggedIn() && !this.collection.contains(d) && this.collection.add(d),
  15325.         c.prototype.show.call(this)
  15326.       }
  15327.     },
  15328.     handleShowProfile: f(function (a) {
  15329.       c.prototype.handleShowProfile.call(this, a)
  15330.     }),
  15331.     getTemplateData: function () {
  15332.       var b = c.prototype.getTemplateData.apply(this, arguments);
  15333.       return a.extend({
  15334.       }, b, {
  15335.         forumId: this.model.get('forum')
  15336.       })
  15337.     },
  15338.     getUserTemplateData: function () {
  15339.       var b = c.prototype.getUserTemplateData.apply(this, arguments);
  15340.       return a.extend({
  15341.       }, b, {
  15342.         forumId: this.model.get('forum')
  15343.       })
  15344.     }
  15345.   }, {
  15346.     create: function (a) {
  15347.       var c = a.model;
  15348.       if (c.has('id')) return b.create([c.get('id'),
  15349.       '-',
  15350.       a.voteType].join(''), a, 'VotersCard', g)
  15351.     }
  15352.   });
  15353.   return g
  15354. }),
  15355. define('templates/lounge/contextCard', [
  15356.   'react',
  15357.   'core/strings',
  15358.   'core/utils/object/get',
  15359.   'core/utils',
  15360.   'core/switches',
  15361.   'templates/lounge/partials/profileLink'
  15362. ], function (a, b, c, d, e, f) {
  15363.   'use strict';
  15364.   var g = b.gettext,
  15365.   h = d.getInitials,
  15366.   i = function (b) {
  15367.     var d = e.isFeatureActive('embed_refresh', {
  15368.       forum: b.post.forum
  15369.     }),
  15370.     f = !c(b.post, [
  15371.       'author',
  15372.       'avatar',
  15373.       'isCustom'
  15374.     ]);
  15375.     return f && d ? a.createElement('div', {
  15376.       className: 'initials user--refresh'
  15377.     }, h(b.post.author.name)) : a.createElement('img', {
  15378.       src: c(b.post, [
  15379.         'author',
  15380.         'avatar',
  15381.         'cache'
  15382.       ], ''),
  15383.       className: 'user',
  15384.       alt: g('Avatar')
  15385.     })
  15386.   },
  15387.   j = function (b) {
  15388.     var d = e.isFeatureActive('embed_refresh', {
  15389.       forum: b.post.forum
  15390.     }),
  15391.     g = d ? 'avatar avatar--refresh' : 'avatar',
  15392.     h = d ? 'tooltip tooltip--post-refresh' : 'tooltip';
  15393.     return a.createElement('div', {
  15394.       className: h
  15395.     }, a.createElement('div', {
  15396.       className: 'notch'
  15397.     }), c(b.post, [
  15398.       'author',
  15399.       'isAnonymous'
  15400.     ]) ? a.createElement('div', {
  15401.       className: g
  15402.     }, a.createElement(i, {
  15403.       post: b.post
  15404.     })) : a.createElement(f, {
  15405.       className: g,
  15406.       user: c(b.post, [
  15407.         'author'
  15408.       ]),
  15409.       forumId: b.post.forum
  15410.     }, a.createElement(i, {
  15411.       post: b.post
  15412.     })), a.createElement('div', {
  15413.       className: 'tooltip__content'
  15414.     }, a.createElement('h3', null, c(b.post, [
  15415.       'author',
  15416.       'isAnonymous'
  15417.     ]) ? a.createElement('h3', null, c(b.post, [
  15418.       'author',
  15419.       'name'
  15420.     ], null)) : a.createElement(f, {
  15421.       user: c(b.post, [
  15422.         'author'
  15423.       ]),
  15424.       forumId: b.post.forum
  15425.     }, a.createElement('h3', null, c(b.post, [
  15426.       'author',
  15427.       'name'
  15428.     ], null)))), a.createElement('p', null, c(b.post, [
  15429.       'excerpt'
  15430.     ], null))))
  15431.   };
  15432.   return j
  15433. }),
  15434. define('templates/lounge/partials/followButtonSmall', [
  15435.   'react',
  15436.   'core/config/urls',
  15437.   'core/strings',
  15438.   'core/utils/object/get',
  15439.   'core/switches'
  15440. ], function (a, b, c, d, e) {
  15441.   'use strict';
  15442.   var f = c.gettext,
  15443.   g = function (c) {
  15444.     var g = e.isFeatureActive('embed_refresh', {
  15445.       forum: c.forumId
  15446.     }),
  15447.     h = g && e.isFeatureActive('embed_refresh_v2', {
  15448.       forum: c.forumId
  15449.     });
  15450.     return d(c.user, [
  15451.       'isSession'
  15452.     ]) ? d(c.user, [
  15453.       'isEditable'
  15454.     ]) ? g ? a.createElement('a', {
  15455.       href: b.editProfile || '',
  15456.       target: '_blank',
  15457.       className: c.buttonAsLink ? 'publisher-anchor-color follow-link hover-card' : 'follow-btn btn-small hover-card edit'
  15458.     }, f('Edit')) : a.createElement('a', {
  15459.       href: b.editProfile || '',
  15460.       target: '_blank',
  15461.       className: c.buttonAsLink ? 'publisher-anchor-color follow-link' : 'btn btn-small'
  15462.     }, f('Edit profile')) : null : d(c.user, [
  15463.       'isPrivate'
  15464.     ]) ? g ? h ? a.createElement('span', {
  15465.       className: 'btn btn-small follow-btn private'
  15466.     }, a.createElement('a', {
  15467.       href: d(c.user, [
  15468.         'profileUrl'
  15469.       ], ''),
  15470.       'data-action': 'profile',
  15471.       'data-username': d(c.user, [
  15472.         'username'
  15473.       ], ''),
  15474.       target: '_blank',
  15475.       rel: 'noopener noreferrer'
  15476.     }, a.createElement('i', {
  15477.       'aria-hidden': 'true',
  15478.       className: 'icon-lock'
  15479.     }), a.createElement('span', {
  15480.       className: 'btn-text'
  15481.     }, f('Private Profile')))) : null : a.createElement('span', {
  15482.       className: 'btn btn-small follow-btn private'
  15483.     }, a.createElement('i', {
  15484.       'aria-hidden': 'true',
  15485.       className: 'icon-lock'
  15486.     }), ' ', a.createElement('span', {
  15487.       className: 'btn-text'
  15488.     }, f('Private'))) : g ? h ? a.createElement('a', {
  15489.       href: d(c.user, [
  15490.         'profileUrl'
  15491.       ], ''),
  15492.       className: '' + (c.buttonAsLink ? 'publisher-anchor-color follow-link' : 'btn btn-small follow-btn hover-card') + (d(c.user, [
  15493.         'isFollowing'
  15494.       ]) ? ' following' : ''),
  15495.       'data-action': 'toggleFollow',
  15496.       'data-user': d(c.user, [
  15497.         'id'
  15498.       ], ''),
  15499.       target: '_blank',
  15500.       rel: 'noopener noreferrer'
  15501.     }, a.createElement('span', {
  15502.       className: 'btn-text following-text hover-card'
  15503.     }, a.createElement('span', {
  15504.       className: 'follow-user is-following'
  15505.     }), f('Following')), a.createElement('span', {
  15506.       className: 'btn-text follow-text'
  15507.     }, a.createElement('span', {
  15508.       className: 'follow-user publisher-background-color-refresh hover-card'
  15509.     }), f('Follow'))) : a.createElement('a', {
  15510.       href: d(c.user, [
  15511.         'profileUrl'
  15512.       ], ''),
  15513.       className: '' + (c.buttonAsLink ? 'publisher-anchor-color follow-link' : 'btn btn-small follow-btn hover-card') + (d(c.user, [
  15514.         'isFollowing'
  15515.       ]) ? ' following' : ''),
  15516.       'data-action': 'toggleFollow',
  15517.       'data-user': d(c.user, [
  15518.         'id'
  15519.       ], ''),
  15520.       target: '_blank',
  15521.       rel: 'noopener noreferrer'
  15522.     }, a.createElement('span', {
  15523.       className: 'btn-text following-text hover-card'
  15524.     }, a.createElement('span', {
  15525.       className: 'follow-user is-following publisher-background-color-refresh'
  15526.     })), a.createElement('span', {
  15527.       className: 'btn-text follow-text'
  15528.     }, a.createElement('span', {
  15529.       className: 'follow-user publisher-background-color-refresh hover-card'
  15530.     }))) : a.createElement('a', {
  15531.       href: d(c.user, [
  15532.         'profileUrl'
  15533.       ], ''),
  15534.       className: '' + (c.buttonAsLink ? 'publisher-anchor-color follow-link' : 'btn btn-small follow-btn') + (d(c.user, [
  15535.         'isFollowing'
  15536.       ]) ? ' following' : ''),
  15537.       'data-action': 'toggleFollow',
  15538.       'data-user': d(c.user, [
  15539.         'id'
  15540.       ], ''),
  15541.       target: '_blank',
  15542.       rel: 'noopener noreferrer'
  15543.     }, a.createElement('span', {
  15544.       className: 'btn-text following-text'
  15545.     }, f('Following')), a.createElement('span', {
  15546.       className: 'btn-text follow-text'
  15547.     }, f('Follow')), a.createElement('i', {
  15548.       'aria-hidden': 'true',
  15549.       className: 'icon-checkmark'
  15550.     }))
  15551.   };
  15552.   return g
  15553. }),
  15554. define('templates/lounge/partials/hovercardActions', [
  15555.   'react',
  15556.   'core/strings',
  15557.   'core/switches',
  15558.   'templates/lounge/partials/followButtonSmall',
  15559.   'templates/lounge/partials/profileLink'
  15560. ], function (a, b, c, d, e) {
  15561.   'use strict';
  15562.   var f = b.gettext,
  15563.   g = function (b) {
  15564.     var g = c.isFeatureActive('embed_refresh', {
  15565.       forum: b.forumId
  15566.     }),
  15567.     h = g && c.isFeatureActive('embed_refresh_v2', {
  15568.       forum: b.forumId
  15569.     });
  15570.     return g ? h ? a.createElement('div', {
  15571.       className: 'hovercard-actions-container'
  15572.     }, b.showFollowButton ? a.createElement(d, {
  15573.       user: b.user,
  15574.       buttonAsLink: b.buttonAsLink,
  15575.       forumId: b.forumId
  15576.     }) : null, b.user.isPrivate && !b.user.isEditable ? null : a.createElement(e, {
  15577.       user: b.user,
  15578.       forumId: null,
  15579.       className: 'view-profile'
  15580.     }, a.createElement('span', {
  15581.       className: 'eye'
  15582.     }), f('View Profile'))) : a.createElement('div', null, b.showFollowButton ? a.createElement(d, {
  15583.       user: b.user,
  15584.       buttonAsLink: b.buttonAsLink,
  15585.       forumId: b.forumId
  15586.     }) : null) : a.createElement('div', null, a.createElement(e, {
  15587.       user: b.user,
  15588.       forumId: null,
  15589.       className: 'full-profile'
  15590.     }, f('Full profile')), b.showFollowButton ? a.createElement(d, {
  15591.       user: b.user,
  15592.       buttonAsLink: b.buttonAsLink
  15593.     }) : null, ' ')
  15594.   };
  15595.   return g
  15596. }),
  15597. define('templates/lounge/partials/hovercardCounters', [
  15598.   'react',
  15599.   'core/strings',
  15600.   'core/utils/object/get',
  15601.   'core/switches'
  15602. ], function (a, b, c, d) {
  15603.   'use strict';
  15604.   var e = b.gettext,
  15605.   f = function (b) {
  15606.     var f = d.isFeatureActive('embed_refresh', {
  15607.       forum: b.forumId
  15608.     }),
  15609.     g = f && d.isFeatureActive('embed_refresh_v2', {
  15610.       forum: b.forumId
  15611.     });
  15612.     return f ? g ? a.createElement('div', {
  15613.       className: 'hovercard-counters-container hovercard-counters-container-v2'
  15614.     }, a.createElement('div', {
  15615.       className: 'counters'
  15616.     }, a.createElement('span', {
  15617.       className: 'count count-v2 comment'
  15618.     }), 1 === c(b.user, [
  15619.       'numPosts'
  15620.     ]) ? '1' : b.user.numPosts), a.createElement('div', {
  15621.       className: 'counters'
  15622.     }, a.createElement('span', {
  15623.       className: 'count count-v2 like'
  15624.     }), 1 === c(b.user, [
  15625.       'numLikesReceived'
  15626.     ]) ? '1' : b.user.numLikesReceived)) : a.createElement('div', {
  15627.       className: 'hovercard-counters-container'
  15628.     }, a.createElement('div', {
  15629.       className: 'counters'
  15630.     }, a.createElement('span', {
  15631.       className: 'count comment'
  15632.     }), 1 === c(b.user, [
  15633.       'numPosts'
  15634.     ]) ? '1' : b.user.numPosts), a.createElement('div', {
  15635.       className: 'counters'
  15636.     }, a.createElement('span', {
  15637.       className: 'count like'
  15638.     }), 1 === c(b.user, [
  15639.       'numLikesReceived'
  15640.     ]) ? '1' : b.user.numLikesReceived)) : a.createElement('div', null, 1 === c(b.user, [
  15641.       'numPosts'
  15642.     ]) ? e('1 comment') : e('%(numPosts)s comments', {
  15643.       numPosts: c(b.user, [
  15644.         'numPosts'
  15645.       ], '')
  15646.     }), ' ', a.createElement('span', {
  15647.       className: 'bullet'
  15648.     }, '•'), ' ', 1 === c(b.user, [
  15649.       'numLikesReceived'
  15650.     ]) ? e('1 vote') : e('%(numLikesReceived)s votes', {
  15651.       numLikesReceived: c(b.user, [
  15652.         'numLikesReceived'
  15653.       ], '')
  15654.     }))
  15655.   };
  15656.   return f
  15657. }),
  15658. define('templates/lounge/hovercard', [
  15659.   'react',
  15660.   'core/strings',
  15661.   'core/switches',
  15662.   'core/utils/object/get',
  15663.   'core/utils',
  15664.   'templates/lounge/partials/hovercardActions',
  15665.   'templates/lounge/partials/hovercardCounters',
  15666.   'templates/lounge/partials/profileLink'
  15667. ], function (a, b, c, d, e, f, g, h) {
  15668.   'use strict';
  15669.   var i = b.gettext,
  15670.   j = e.getInitials,
  15671.   k = function (b, c) {
  15672.     return b.length <= c ? b : a.createElement('span', null, b.slice(0, c), '…')
  15673.   },
  15674.   l = function (b) {
  15675.     var e = c.isFeatureActive('embed_refresh', {
  15676.       forum: b.forumId
  15677.     }),
  15678.     l = e && c.isFeatureActive('embed_refresh_v2', {
  15679.       forum: b.forumId
  15680.     }),
  15681.     m = d(b.user, [
  15682.       'isPrivate'
  15683.     ]),
  15684.     n = d(b.user, [
  15685.       'avatar',
  15686.       'isCustom'
  15687.     ]) ? d(b.user, [
  15688.       'avatar',
  15689.       'cache'
  15690.     ], '') : b.forumAvatar;
  15691.     return e ? l ? a.createElement('div', {
  15692.       className: 'tooltip tooltip-v2 tooltip--refresh--v2'
  15693.     }, a.createElement('div', {
  15694.       className: 'tooltip__header'
  15695.     }, a.createElement(h, {
  15696.       user: b.user,
  15697.       forumId: b.forumId,
  15698.       className: 'avatar avatar--refresh-v2'
  15699.     }, n ? a.createElement('img', {
  15700.       'data-user': d(b.user, [
  15701.         'id'
  15702.       ], ''),
  15703.       'data-role': 'user-avatar',
  15704.       src: n,
  15705.       className: 'user',
  15706.       alt: i('Avatar')
  15707.     }) : a.createElement('div', {
  15708.       className: 'initials'
  15709.     }, j(b.user.name) [0])), a.createElement('div', {
  15710.       className: 'tooltip__content tooltip__content--refresh-v2'
  15711.     }, a.createElement('h3', {
  15712.       className: 'profile-link-container'
  15713.     }, a.createElement('div', {
  15714.       className: 'profile-link-username profile-link-username-refresh-v2'
  15715.     }, a.createElement(h, {
  15716.       user: b.user,
  15717.       forumId: null,
  15718.       'data-role': 'username'
  15719.     }, d(b.user, [
  15720.       'name'
  15721.     ], null)))), a.createElement('p', {
  15722.       className: 'stats stats--refresh-v2',
  15723.       'data-role': 'counters'
  15724.     }, null !== d(b.user, [
  15725.       'numPosts'
  15726.     ], null) && null !== d(b.user, [
  15727.       'numLikesReceived'
  15728.     ], null) ? a.createElement(g, {
  15729.       user: b.user
  15730.     }) : null))), a.createElement('div', {
  15731.       className: 'tooltip__bio'
  15732.     }, d(b.user, [
  15733.       'about'
  15734.     ]) ? a.createElement('p', {
  15735.       className: 'bio'
  15736.     }, d(b.user, [
  15737.       'about'
  15738.     ], '')) : null), a.createElement('footer', {
  15739.       className: 'tooltip__footer-v2',
  15740.       'data-role': 'actions'
  15741.     }, a.createElement(f, {
  15742.       user: b.user,
  15743.       buttonAsLink: b.buttonAsLink,
  15744.       showFollowButton: b.showFollowButton,
  15745.       forumId: b.forumId
  15746.     }))) : a.createElement('div', {
  15747.       className: 'tooltip tooltip--refresh'
  15748.     }, a.createElement(h, {
  15749.       user: b.user,
  15750.       forumId: b.forumId,
  15751.       className: 'avatar avatar--refresh'
  15752.     }, n ? a.createElement('img', {
  15753.       'data-user': d(b.user, [
  15754.         'id'
  15755.       ], ''),
  15756.       'data-role': 'user-avatar',
  15757.       src: n,
  15758.       className: 'user user--refresh',
  15759.       alt: i('Avatar')
  15760.     }) : a.createElement('div', {
  15761.       className: 'initials user--refresh'
  15762.     }, j(b.user.name)), m ? a.createElement('div', {
  15763.       className: 'view-profile-message-container'
  15764.     }, a.createElement('i', {
  15765.       'aria-hidden': 'true',
  15766.       className: 'icon-lock'
  15767.     }), a.createElement('div', null, 'Private')) : a.createElement('div', {
  15768.       className: 'view-profile-message-container'
  15769.     }, a.createElement('div', null, 'View'), a.createElement('div', null, 'Profile'))), a.createElement('div', {
  15770.       className: 'tooltip__content tooltip__content--refresh'
  15771.     }, a.createElement('h3', {
  15772.       className: 'profile-link-container'
  15773.     }, a.createElement('div', {
  15774.       className: 'profile-link-username'
  15775.     }, a.createElement(h, {
  15776.       user: b.user,
  15777.       forumId: null,
  15778.       'data-role': 'username'
  15779.     }, d(b.user, [
  15780.       'name'
  15781.     ], null))), a.createElement('div', {
  15782.       className: 'tooltip__actions',
  15783.       'data-role': 'actions'
  15784.     }, a.createElement(f, {
  15785.       user: b.user,
  15786.       buttonAsLink: b.buttonAsLink,
  15787.       showFollowButton: b.showFollowButton,
  15788.       forumId: b.forumId
  15789.     }))), a.createElement('p', {
  15790.       className: 'stats stats--refresh',
  15791.       'data-role': 'counters'
  15792.     }, null !== d(b.user, [
  15793.       'numPosts'
  15794.     ], null) && null !== d(b.user, [
  15795.       'numLikesReceived'
  15796.     ], null) ? a.createElement(g, {
  15797.       user: b.user
  15798.     }) : null))) : a.createElement('div', {
  15799.       className: 'tooltip'
  15800.     }, a.createElement('div', {
  15801.       className: 'notch'
  15802.     }), a.createElement(h, {
  15803.       user: b.user,
  15804.       forumId: null,
  15805.       className: 'avatar'
  15806.     }, a.createElement('img', {
  15807.       'data-user': d(b.user, [
  15808.         'id'
  15809.       ], ''),
  15810.       'data-role': 'user-avatar',
  15811.       src: d(b.user, [
  15812.         'avatar',
  15813.         'cache'
  15814.       ], ''),
  15815.       className: 'user',
  15816.       alt: i('Avatar')
  15817.     })), a.createElement('div', {
  15818.       className: 'tooltip__content'
  15819.     }, a.createElement('h3', null, a.createElement(h, {
  15820.       user: b.user,
  15821.       forumId: null,
  15822.       'data-role': 'username'
  15823.     }, d(b.user, [
  15824.       'name'
  15825.     ], null)), ' ', d(b.user, [
  15826.       'thread',
  15827.       'canModerate'
  15828.     ]) ? a.createElement('span', {
  15829.       className: 'badge moderator'
  15830.     }, i('MOD')) : null), d(b.user, [
  15831.       'about'
  15832.     ]) ? a.createElement('p', {
  15833.       className: 'bio'
  15834.     }, k(d(b.user, [
  15835.       'about'
  15836.     ], ''), 80)) : null, a.createElement('p', {
  15837.       className: 'stats',
  15838.       'data-role': 'counters'
  15839.     }, null !== d(b.user, [
  15840.       'numPosts'
  15841.     ], null) && null !== d(b.user, [
  15842.       'numLikesReceived'
  15843.     ], null) ? a.createElement(g, {
  15844.       user: b.user
  15845.     }) : null), a.createElement('div', {
  15846.       className: 'hovercard-badges',
  15847.       'data-role': 'hovercard-badges'
  15848.     })), a.createElement('footer', {
  15849.       className: 'tooltip__footer',
  15850.       'data-role': 'actions'
  15851.     }, a.createElement(f, {
  15852.       user: b.user,
  15853.       buttonAsLink: b.buttonAsLink,
  15854.       showFollowButton: b.showFollowButton
  15855.     })))
  15856.   };
  15857.   return l
  15858. }),
  15859. define('templates/lounge/upgradeCard', [
  15860.   'react',
  15861.   'core/strings',
  15862.   'core/utils/object/get'
  15863. ], function (a, b, c) {
  15864.   'use strict';
  15865.   var d = b.gettext,
  15866.   e = function (b) {
  15867.     return a.createElement('div', {
  15868.       className: 'tooltip'
  15869.     }, a.createElement('div', {
  15870.       className: 'notch'
  15871.     }), a.createElement('div', null, a.createElement('p', {
  15872.       className: 'text-normal'
  15873.     }, d('Disqus Pro gives you access to exclusive features like auto-moderation, shadow banning, and customization options.')), a.createElement('a', {
  15874.       href: [
  15875.         'https://disqus.com/admin/',
  15876.         b.organization ? 'orgs/' + c(b.organization, [
  15877.           'id'
  15878.         ]) + '/' + c(b.organization, [
  15879.           'slug'
  15880.         ], 'sites') + '/' : '',
  15881.         'settings/subscription/'
  15882.       ].join(''),
  15883.       target: '_blank',
  15884.       rel: 'noopener noreferrer',
  15885.       className: 'btn btn-small',
  15886.       'data-role': 'upgrade-link'
  15887.     }, d('Subscriptions and Billing'))))
  15888.   };
  15889.   return e
  15890. }),
  15891. define('templates/lounge/partials/userBadges', [
  15892.   'react',
  15893.   'core/bus',
  15894.   'templates/lounge/partials/profileLink'
  15895. ], function (a, b, c) {
  15896.   'use strict';
  15897.   var d = function (b) {
  15898.     var d = b.badge,
  15899.     e = b.user,
  15900.     f = b.forumId,
  15901.     g = b.context,
  15902.     h = b.trackClick,
  15903.     i = b.postId;
  15904.     return d.image ? a.createElement(c, {
  15905.       user: e,
  15906.       forumId: f,
  15907.       profileTab: 'badges',
  15908.       id: g + '-badge_' + e.id + '-' + d.id + '-' + i,
  15909.       className: 'user-badge badge-tooltip__wrapper',
  15910.       'data-role': 'user-badge',
  15911.       'data-badge': d.id,
  15912.       onClick: function (a) {
  15913.         return h(a, d.id)
  15914.       },
  15915.       tabIndex: 0
  15916.     }, a.createElement('img', {
  15917.       className: 'user-badge-image',
  15918.       src: d.image,
  15919.       alt: d.name
  15920.     }), a.createElement('div', {
  15921.       className: 'badge-tooltip__container'
  15922.     }, a.createElement('div', {
  15923.       className: 'tooltip show badge-tooltip'
  15924.     }, a.createElement('span', {
  15925.       className: 'badge-tooltip__content'
  15926.     }, d.name)))) : null
  15927.   },
  15928.   e = function (a, b) {
  15929.     return b.badges ? b.badges.filter(function (b) {
  15930.       return a.badges[b.id]
  15931.     }) : [
  15932.     ]
  15933.   },
  15934.   f = function (f) {
  15935.     var g = f.forum,
  15936.     h = f.user,
  15937.     i = f.context,
  15938.     j = f.limit,
  15939.     k = f.postId;
  15940.     if (!(g.settings.badgesEnabled && g.badges && Object.keys(g.badges).length && h)) return null;
  15941.     var l = e(g, h),
  15942.     m = function (a, c) {
  15943.       b.trigger('uiAction:clickBadge', a, c)
  15944.     },
  15945.     n = l.length > j,
  15946.     o = n ? j - 1 : j;
  15947.     return l.length ? a.createElement('span', {
  15948.       'data-role': 'badges',
  15949.       className: 'user-badges-collection',
  15950.       'data-tracking-area': i
  15951.     }, l.map(function (b, c) {
  15952.       return c < o ? a.createElement(d, {
  15953.         key: c,
  15954.         badge: b,
  15955.         user: h,
  15956.         forumId: g.id,
  15957.         context: i,
  15958.         trackClick: m,
  15959.         postId: k
  15960.       }) : null
  15961.     }), n ? a.createElement(c, {
  15962.       user: h,
  15963.       forumId: g.id,
  15964.       profileTab: 'badges',
  15965.       className: 'user-badge truncate-badge publisher-background-color',
  15966.       'data-role': 'user-badge',
  15967.       onClick: function (a) {
  15968.         return m(a, 'more')
  15969.       },
  15970.       tabIndex: 0
  15971.     }, a.createElement('span', {
  15972.       className: 'user-badge-more'
  15973.     }, '+', l.length - o)) : null) : a.createElement('span', {
  15974.       'data-role': 'badges',
  15975.       className: 'user-badges-collection'
  15976.     })
  15977.   };
  15978.   return f
  15979. }),
  15980. define('lounge/views/cards', [
  15981.   'jquery',
  15982.   'underscore',
  15983.   'lounge/common',
  15984.   'core/utils',
  15985.   'core/switches',
  15986.   'common/models',
  15987.   'common/views/mixins',
  15988.   'core/constants/badgesConstants',
  15989.   'core/views/common/HoverCard',
  15990.   'core/views/VotersCard',
  15991.   'templates/lounge/contextCard',
  15992.   'templates/lounge/hovercard',
  15993.   'templates/lounge/upgradeCard',
  15994.   'templates/lounge/partials/hovercardActions',
  15995.   'templates/lounge/partials/hovercardCounters',
  15996.   'templates/lounge/partials/userBadges'
  15997. ], function (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p) {
  15998.   'use strict';
  15999.   i.prototype.getContainerPosition = function () {
  16000.     var a = c.getLounge().getPosition();
  16001.     return {
  16002.       pageOffset: a.pageOffset,
  16003.       containerOffset: a.frameOffset,
  16004.       containerHeight: a.height
  16005.     }
  16006.   },
  16007.   function () {
  16008.     var c = 10;
  16009.     a(window.document).on('mouseout', b.debounce(function (a) {
  16010.       var b = a.relatedTarget || a.toElement;
  16011.       b && 'HTML' !== b.nodeName || i.exitAll()
  16012.     }, c))
  16013.   }();
  16014.   var q = i.extend({
  16015.     className: 'tooltip-outer profile-card',
  16016.     events: b.defaults({
  16017.       'click [data-action=toggleFollow]': 'toggleFollow'
  16018.     }, i.prototype.events),
  16019.     initialize: function (a) {
  16020.       var b = this;
  16021.       i.prototype.initialize.call(b, a),
  16022.       b.session = a.session,
  16023.       b.user = a.user,
  16024.       b._fetched = !1,
  16025.       b.listenTo(b.session, 'change:id', function () {
  16026.         this._rendered && this.render()
  16027.       }),
  16028.       b.session.attributes.thread && e.isFeatureActive('embed_refresh', {
  16029.         forum: b.session.attributes.thread.forum.id
  16030.       }) && b.el.classList.add('profile-card--refresh')
  16031.     },
  16032.     onFetch: function (a) {
  16033.       this.user = new f.SyncedUser(a.attributes),
  16034.       this.updateCounters(),
  16035.       this.updateActions(),
  16036.       this.updateBadges(),
  16037.       this.listenTo(this.user, {
  16038.         'change:numPosts change:numLikesReceived': b.debounce(function () {
  16039.           this.updateCounters()
  16040.         }),
  16041.         'change:isFollowing': this.updateActions
  16042.       });
  16043.       var c = function (a) {
  16044.         this.set('isFollowing', a.get('isFollowing'))
  16045.       };
  16046.       a.listenTo(this.user, 'change:isFollowing', c),
  16047.       this.user.listenTo(a, 'change:isFollowing', c)
  16048.     },
  16049.     serialize: function () {
  16050.       var a = this.user.toJSON({
  16051.         session: this.session
  16052.       });
  16053.       a.numLikesReceived = a.numLikesReceived || this.user.get('numVotes') || 0;
  16054.       var b = this.session.get('thread').forum.get('avatar');
  16055.       return b = b && b.large && b.large.cache,
  16056.       b = d.isDefaultAvatar(b) ? null : b,
  16057.       {
  16058.         forumId: this.session.attributes.thread.forum.id,
  16059.         forumAvatar: b,
  16060.         user: a,
  16061.         showFollowButton: this.user.has('isFollowing') || this.session.isLoggedOut()
  16062.       }
  16063.     },
  16064.     render: function () {
  16065.       this.$el.html(l(this.serialize())),
  16066.       i.prototype.render.call(this)
  16067.     },
  16068.     setBadges: function (a) {
  16069.       this._fetched && (this.user.set('badges', a), this.updateBadges())
  16070.     },
  16071.     updateBadges: function () {
  16072.       if (!e.isFeatureActive('embed_refresh', {
  16073.         forum: this.session.attributes.thread.forum.id
  16074.       })) {
  16075.         var a = this.session.get('thread') && this.session.get('thread').forum,
  16076.         b = Boolean(a && a.get('settings') && a.get('settings').badgesEnabled && a.get('badges')),
  16077.         c = Boolean(b && this.user.get('badges') && this.user.get('badges').length);
  16078.         c && !this.el.classList.contains('has-badges') ? this.el.classList.add('has-badges') : !c && this.el.classList.contains('has-badges') && this.el.classList.remove('has-badges'),
  16079.         b && this.$el.find('[data-role=hovercard-badges]').html(p({
  16080.           forum: a.attributes,
  16081.           user: this.user.attributes,
  16082.           context: 'hovercard',
  16083.           limit: h.MAX_BADGE_COUNT
  16084.         }))
  16085.       }
  16086.     },
  16087.     updateCounters: function () {
  16088.       this.$el.find('[data-role=counters]').html(o(this.serialize()))
  16089.     },
  16090.     updateActions: function () {
  16091.       this.$el.find('[data-role=actions]').html(n(this.serialize()))
  16092.     },
  16093.     show: function () {
  16094.       this._fetched || (this._fetched = !0, this.user.fetch({
  16095.         success: b.bind(this.onFetch, this)
  16096.       })),
  16097.       e.isFeatureActive('embed_refresh', {
  16098.         forum: this.session.attributes.thread.forum.id
  16099.       }) && (i.prototype.constructor.POSITION_OFFSET = 0, i.prototype.constructor.DELAY_ENTER = 0, i.prototype.constructor.DELAY_LEAVE = 0),
  16100.       i.prototype.show.call(this)
  16101.     }
  16102.   }, {
  16103.     create: function (a) {
  16104.       var b = a.user;
  16105.       return i.create(b.id, a, 'ProfileCard', q)
  16106.     }
  16107.   });
  16108.   b.extend(q.prototype, g.FollowButtonMixin);
  16109.   var r = i.extend({
  16110.     className: 'context-card tooltip-outer',
  16111.     initialize: function (a) {
  16112.       var b = this;
  16113.       i.prototype.initialize.call(b, a),
  16114.       b.post = a.post
  16115.     },
  16116.     render: function () {
  16117.       var a = this.post,
  16118.       b = a.toJSON();
  16119.       b.excerpt = d.niceTruncate(b.plaintext, 40),
  16120.       this.$el.html(k({
  16121.         post: b
  16122.       })),
  16123.       i.prototype.render.call(this)
  16124.     }
  16125.   }, {
  16126.     create: function (a) {
  16127.       var b = a.post;
  16128.       return i.create(b.id, a, 'ContextCard', r)
  16129.     }
  16130.   }),
  16131.   s = i.extend({
  16132.     className: 'tooltip-outer upgrade-card',
  16133.     events: b.defaults({
  16134.       'click [data-role=upgrade-link]': 'onClickUpgrade'
  16135.     }, i.prototype.events),
  16136.     initialize: function (a) {
  16137.       i.prototype.initialize.call(this, a),
  16138.       this.organization = a.organization
  16139.     },
  16140.     render: function () {
  16141.       this.$el.html(m({
  16142.         organization: this.organization
  16143.       })),
  16144.       i.prototype.render.call(this)
  16145.     },
  16146.     onClickUpgrade: function (a) {
  16147.       this.trigger('click:upgrade', a)
  16148.     }
  16149.   }, {
  16150.     create: function (a) {
  16151.       var b = a.organization;
  16152.       return i.create(b ? b.id : 'upgrade', a, 'UpgradeCard', s)
  16153.     }
  16154.   });
  16155.   return {
  16156.     HoverCard: i,
  16157.     ProfileCard: q,
  16158.     ContextCard: r,
  16159.     VotersCard: j,
  16160.     UpgradeCard: s
  16161.   }
  16162. }),
  16163. define('core/views/SourcelessIframeRichMediaView', [
  16164.   'jquery',
  16165.   'core/mediaConfig',
  16166.   'core/views/RichMediaView'
  16167. ], function (a, b, c) {
  16168.   'use strict';
  16169.   return c.extend({
  16170.     createContentNode: function (b) {
  16171.       return a('<iframe>').attr({
  16172.         frameBorder: 0,
  16173.         scrolling: 'no',
  16174.         width: '100%',
  16175.         height: this.model.get('deferredHeight'),
  16176.         'data-src': b,
  16177.         src: 'javascript:window.frameElement.getAttribute("data-src");'
  16178.       })
  16179.     },
  16180.     insertContentNode: function (a) {
  16181.       c.prototype.insertContentNode.apply(this, arguments);
  16182.       var d = this.model.get('deferredHeight') || b.get('defaultIframeHeight');
  16183.       a.height(d)
  16184.     }
  16185.   })
  16186. }),
  16187. define('lounge/views/media', [
  16188.   'underscore',
  16189.   'stance',
  16190.   'core/utils',
  16191.   'core/utils/storage',
  16192.   'core/utils/html/toHexColorString',
  16193.   'core/media',
  16194.   'core/mediaConfig',
  16195.   'core/models/RichMediaViewModel',
  16196.   'core/views/RichMediaLinkView',
  16197.   'core/views/RichMediaView',
  16198.   'core/views/IframeRichMediaView',
  16199.   'core/views/SoundCloudRichMediaView',
  16200.   'core/views/AutoplayRichMediaView',
  16201.   'core/views/SourcelessIframeRichMediaView',
  16202.   'core/views/DynamicHeightRichMediaView',
  16203.   'core/views/TwitterRichMediaView',
  16204.   'core/views/ImageRichMediaView',
  16205.   'core/views/FacebookPhotoRichMediaView',
  16206.   'core/views/VineRichMediaView',
  16207.   'lounge/common'
  16208. ], function (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t) {
  16209.   'use strict';
  16210.   function u() {
  16211.     var b = d.get('disqus.collapse-media');
  16212.     return a.isBoolean(b) || (b = c.isMobileUserAgent()),
  16213.     b
  16214.   }
  16215.   return a.extend(j.prototype, {
  16216.     topEdgeOffset: function () {
  16217.       return - t.getLounge().getPosition().height
  16218.     },
  16219.     configureDeferred: function () {
  16220.       this.model.get('deferred') && !this.model.get('activated') && this.listenToOnce(b(this), 'enter', function () {
  16221.         this.relatedPost && this.listenToOnce(this, 'load error', function () {
  16222.           t.getLounge().postsView.onDeferredViewReady(this.relatedPost)
  16223.         }),
  16224.         this.enterViewport()
  16225.       }),
  16226.       this.listenToOnce(t.getLounge().postsView, 'render:end', this.updateDeferredHeight)
  16227.     }
  16228.   }),
  16229.   p.theme = function () {
  16230.     return t.getLounge().config.colorScheme
  16231.   },
  16232.   p.linkColor = function () {
  16233.     return e(t.getLounge().config.anchorColor)
  16234.   },
  16235.   g.set({
  16236.     collapsed: u()
  16237.   }),
  16238.   g.on('change:collapsed', function (b, c) {
  16239.     if (a.isObject(c)) {
  16240.       if (!c.persist) return;
  16241.       c = c.value
  16242.     }
  16243.     d.set('disqus.collapse-media', c)
  16244.   }),
  16245.   {
  16246.     settings: g,
  16247.     getCollapseDefault: u,
  16248.     getDomain: c.getDomain,
  16249.     RichMediaLinkView: i,
  16250.     RichMediaViewModel: h,
  16251.     RichMediaView: j,
  16252.     IframeRichMediaView: k,
  16253.     SoundCloudRichMediaView: l,
  16254.     AutoplayRichMediaView: m,
  16255.     SourcelessIframeRichMediaView: n,
  16256.     DynamicHeightRichMediaView: o,
  16257.     TwitterRichMediaView: p,
  16258.     ImageRichMediaView: q,
  16259.     FacebookPhotoRichMediaView: r,
  16260.     VineRichMediaView: s,
  16261.     instantiateRichMediaView: f.instantiateRichMediaView,
  16262.     getRichMediaViewConfig: f.getRichMediaViewConfig
  16263.   }
  16264. }),
  16265. define('core/templates/react/BadgesManageTemplate', [
  16266.   'react',
  16267.   'underscore',
  16268.   'core/strings',
  16269.   'core/constants/badgesConstants'
  16270. ], function (a, b, c, d) {
  16271.   'use strict';
  16272.   var e = c.gettext,
  16273.   f = d.ACTION_TYPES,
  16274.   g = function (b) {
  16275.     var c = b.text,
  16276.     d = b.value,
  16277.     e = b.selected,
  16278.     f = b.handleChange,
  16279.     g = function (a) {
  16280.       var b = 13;
  16281.       a.keyCode === b && f(a)
  16282.     };
  16283.     return a.createElement('label', {
  16284.       className: 'padding-default align align__item--grow align__item--equal align--center align--column modal__option' + (e ? ' -selected' : ''),
  16285.       tabIndex: '0',
  16286.       onKeyPress: g,
  16287.       onChange: f
  16288.     }, a.createElement('input', {
  16289.       type: 'radio',
  16290.       name: 'badge_action',
  16291.       value: d,
  16292.       checked: e
  16293.     }), a.createElement('p', {
  16294.       className: 'text-semibold text-center modal__option-text'
  16295.     }, c))
  16296.   },
  16297.   h = function (b) {
  16298.     var c = b.badge,
  16299.     d = b.selectedBadge,
  16300.     e = b.handleChange;
  16301.     return a.createElement('span', {
  16302.       key: c.id,
  16303.       className: 'badge-option spacing-right ' + (d && d === c.id ? ' selected' : '') + (c.disabled ? ' disabled' : '')
  16304.     }, a.createElement('input', {
  16305.       id: 'badge-' + c.id + '-input',
  16306.       name: 'badge',
  16307.       type: 'radio',
  16308.       className: 'badge-option_input',
  16309.       value: c.id,
  16310.       onChange: e,
  16311.       disabled: c.disabled,
  16312.       tabIndex: '0'
  16313.     }), a.createElement('label', {
  16314.       htmlFor: 'badge-' + c.id + '-input',
  16315.       className: 'badge-option_label'
  16316.     }, a.createElement('span', {
  16317.       className: 'badge-option_image-wrapper'
  16318.     }, a.createElement('img', {
  16319.       className: 'badge-option_image',
  16320.       src: c.image,
  16321.       alt: c.name
  16322.     })), a.createElement('span', {
  16323.       className: 'badge-option_title'
  16324.     }, c.name)))
  16325.   },
  16326.   i = function (b) {
  16327.     var c = b.badgeAction,
  16328.     d = b.formValues,
  16329.     i = b.badgeOptions,
  16330.     j = b.updateBadgeAction,
  16331.     k = b.updateBadgeSelection,
  16332.     l = b.handleSubmit,
  16333.     m = b.handleClose,
  16334.     n = 'https://' + d.forum + '.disqus.com/admin/settings/badges';
  16335.     return a.createElement('form', {
  16336.       className: 'badges-manage-form'
  16337.     }, a.createElement('div', {
  16338.       className: 'admin-modal__content padding-bottom'
  16339.     }, a.createElement('div', null, a.createElement('div', {
  16340.       className: 'align align--stretch align--wrap'
  16341.     }, a.createElement(g, {
  16342.       text: e('Award a Badge'),
  16343.       value: f.AWARD,
  16344.       selected: c === f.AWARD,
  16345.       handleChange: j
  16346.     }), a.createElement(g, {
  16347.       text: e('Remove a Badge'),
  16348.       value: f.REMOVE,
  16349.       selected: c === f.REMOVE,
  16350.       handleChange: j
  16351.     })), a.createElement('div', {
  16352.       className: 'modal__description border-bottom-dark'
  16353.     }, a.createElement('p', {
  16354.       className: 'modal__option-subtext'
  16355.     }, e(c === f.AWARD ? 'Select a badge below to award it to this commenter.' : 'Select one of the manually awarded badges below to remove it from this commenter. Automatically awarded badges can only be removed by removing the badge from your site entirely.'), a.createElement('br', null), e('You can manage your site\'s badges using the '), a.createElement('a', {
  16356.       href: n,
  16357.       target: '_blank',
  16358.       rel: 'noopener noreferrer'
  16359.     }, e('Badges settings')), e(' in the Disqus Admin.'))), a.createElement('div', {
  16360.       className: 'modal__config'
  16361.     }, a.createElement('div', {
  16362.       className: 'badge-options_list'
  16363.     }, i.map(function (b) {
  16364.       return a.createElement(h, {
  16365.         key: b.id,
  16366.         badge: b,
  16367.         selectedBadge: d.badge,
  16368.         handleChange: k
  16369.       })
  16370.     }), c === f.AWARD ? a.createElement('span', {
  16371.       className: 'badge-option spacing-right create-badge'
  16372.     }, a.createElement('a', {
  16373.       className: 'badge-option_link',
  16374.       href: n,
  16375.       target: '_blank',
  16376.       rel: 'noopener noreferrer'
  16377.     }, a.createElement('span', {
  16378.       className: 'badge-option_image-wrapper'
  16379.     }, a.createElement('span', {
  16380.       className: 'icon icon-plus badge-option_add-icon'
  16381.     })), a.createElement('span', {
  16382.       className: 'badge-option_title'
  16383.     }, e('Create a new badge')))) : null), c !== f.REMOVE || i.length ? null : a.createElement('div', {
  16384.       className: 'badge-options_empty'
  16385.     }, e('This user doesn\'t have any badges.')), d.errorMessage ? a.createElement('div', {
  16386.       className: 'spacing-top-narrow'
  16387.     }, a.createElement('p', {
  16388.       className: 'text-small modal__option-subtext modal__error'
  16389.     }, d.errorMessage)) : null))), a.createElement('div', {
  16390.       className: 'admin-modal__footer clearfix'
  16391.     }, a.createElement('button', {
  16392.       className: 'button button-fill--brand button-small text-capitalized',
  16393.       onClick: l
  16394.     }, e(c === f.AWARD ? 'Award badge' : 'Remove badge')), a.createElement('button', {
  16395.       className: 'button button-fill button-small text-capitalized',
  16396.       onClick: m
  16397.     }, e('Cancel'))))
  16398.   };
  16399.   return i
  16400. });
  16401. var _extends = Object.assign || function (a) {
  16402.   for (var b = 1; b < arguments.length; b++) {
  16403.     var c = arguments[b];
  16404.     for (var d in c) Object.prototype.hasOwnProperty.call(c, d) && (a[d] = c[d])
  16405.   }
  16406.   return a
  16407. };
  16408. define('lounge/views/posts/BadgesManageView', [
  16409.   'underscore',
  16410.   'backbone',
  16411.   'core/api',
  16412.   'core/bus',
  16413.   'core/strings',
  16414.   'core/utils',
  16415.   'core/templates/react/BadgesManageTemplate',
  16416.   'core/constants/badgesConstants'
  16417. ], function (a, b, c, d, e, f, g, h) {
  16418.   'use strict';
  16419.   var i = h.ACTION_TYPES,
  16420.   j = h.BADGES_CRITERIA,
  16421.   k = f.preventDefaultHandler,
  16422.   l = e.get,
  16423.   m = b.View.extend({
  16424.     className: 'badges-action',
  16425.     initialize: function (a) {
  16426.       this.forum = a.forum
  16427.     },
  16428.     render: function () {
  16429.       var a = this.$el;
  16430.       return this.badgeAction = this.badgeAction || i.AWARD,
  16431.       this.formValues = _extends({
  16432.         user: this.model.author.id,
  16433.         forum: this.forum.id
  16434.       }, this.formValues),
  16435.       a.html(g({
  16436.         badgeAction: this.badgeAction,
  16437.         formValues: this.formValues,
  16438.         badgeOptions: this.getBadgeOptions(),
  16439.         updateBadgeAction: this.updateBadgeAction.bind(this),
  16440.         updateBadgeSelection: this.updateBadgeSelection.bind(this),
  16441.         handleSubmit: this.submit.bind(this),
  16442.         handleClose: this.cancel.bind(this)
  16443.       })),
  16444.       this.trigger('render'),
  16445.       this
  16446.     },
  16447.     updateBadgeAction: function (a) {
  16448.       this.formValues.badge = null,
  16449.       this.formValues.errorMessage = null,
  16450.       this.badgeAction = a.target.value || a.target.children[0].value,
  16451.       this.render()
  16452.     },
  16453.     updateBadgeSelection: function (a) {
  16454.       this.formValues.errorMessage = null,
  16455.       a.target.disabled || (this.formValues.badge = a.target.value)
  16456.     },
  16457.     getBadgeOptions: function () {
  16458.       var a = [
  16459.       ],
  16460.       b = [
  16461.       ],
  16462.       c = this.forum.get('badges') ? f.deepClone(this.forum.get('badges')) : [
  16463.       ],
  16464.       d = this.model.author.get('badges') || [
  16465.       ];
  16466.       if (this.badgeAction === i.AWARD) {
  16467.         var e = d.map(function (a) {
  16468.           return a.id
  16469.         });
  16470.         Object.keys(c).forEach(function (d) {
  16471.           var f = c[d];
  16472.           f.criteria === j.MANUAL && (e.indexOf(f.id) > - 1 ? (f.disabled = !0, b.push(f)) : a.push(f))
  16473.         })
  16474.       } else this.badgeAction === i.REMOVE && d.forEach(function (c) {
  16475.         c.criteria === j.MANUAL ? a.push(c) : (c.disabled = !0, b.push(c))
  16476.       });
  16477.       return [].concat(a, b)
  16478.     },
  16479.     submit: k(function () {
  16480.       var b = this;
  16481.       if (this.formValues.badge) {
  16482.         this.formValues.errorMessage = null;
  16483.         var e = this.badgeAction === i.AWARD ? 'uiAction:awardBadge' : 'uiAction:removeBadge';
  16484.         c.call('badges/' + this.badgeAction, {
  16485.           method: 'POST',
  16486.           data: a.omit(this.formValues, a.isNull),
  16487.           success: function (a) {
  16488.             b.trigger('success', {
  16489.               action: b.badgeAction,
  16490.               badge: a.response
  16491.             }),
  16492.             d.trigger(e, a.response.id)
  16493.           },
  16494.           error: function (a) {
  16495.             b.formValues.errorMessage = a.responseJSON.response,
  16496.             b.render()
  16497.           }
  16498.         })
  16499.       } else this.badgeAction === i.AWARD ? this.formValues.errorMessage = l('You must select a badge to award') : this.formValues.errorMessage = l('You must select a badge to remove'),
  16500.       this.render()
  16501.     }),
  16502.     cancel: k(function () {
  16503.       this.trigger('cancel')
  16504.     })
  16505.   }, {
  16506.     defaultFormValues: {
  16507.       badge: null,
  16508.       errorMessage: null
  16509.     }
  16510.   });
  16511.   return m
  16512. }),
  16513. define('core/constants/moderationUserLists', [
  16514.   'exports',
  16515.   'moment'
  16516. ], function (a, b) {
  16517.   'use strict';
  16518.   a.LIST_TYPES = {
  16519.     WHITELIST: 'whitelist',
  16520.     BLACKLIST: 'blacklist'
  16521.   },
  16522.   a.BAN_TYPES = {
  16523.     SHADOW: 'shadowban',
  16524.     PERMANENT: 'permanent',
  16525.     TEMP: 'temp'
  16526.   },
  16527.   a.RETROACTIVE_ACTION_TYPES = {
  16528.     DO_NOTHING: '',
  16529.     DELETE: '1',
  16530.     MARK_AS_SPAM: '2'
  16531.   },
  16532.   a.DEFAULT_FORM_VALUES = {
  16533.     durationHours: '24',
  16534.     customDurationAmount: '1',
  16535.     customDurationScale: '1'
  16536.   },
  16537.   a.STORAGE_KEY_BAN_TYPE = 'defaultBan',
  16538.   a.getDateExpires = function (a) {
  16539.     return 'custom' === a.durationHours && (a.durationHours = parseInt(a.customDurationAmount, 10) * parseInt(a.customDurationScale, 10)),
  16540.     b().add(a.durationHours, 'hours').toISOString()
  16541.   },
  16542.   a.isBanTypeSupported = function (b, c) {
  16543.     return !!c && (b === a.BAN_TYPES.SHADOW ? c.shadowBanning : b === a.BAN_TYPES.TEMP ? c.temporaryBanning : Boolean(b))
  16544.   }
  16545. }),
  16546. define('core/templates/react/ModerationUserListsTemplate', [
  16547.   'react',
  16548.   'underscore',
  16549.   'core/strings',
  16550.   'core/constants/moderationUserLists'
  16551. ], function (a, b, c, d) {
  16552.   'use strict';
  16553.   var e = this,
  16554.   f = c.gettext,
  16555.   g = d.LIST_TYPES,
  16556.   h = d.BAN_TYPES,
  16557.   i = d.RETROACTIVE_ACTION_TYPES,
  16558.   j = 168,
  16559.   k = [
  16560.     {
  16561.       label: f('1 day'),
  16562.       durationHours: '24'
  16563.     },
  16564.     {
  16565.       label: f('1 week'),
  16566.       durationHours: j.toString()
  16567.     },
  16568.     {
  16569.       label: f('2 weeks'),
  16570.       durationHours: (2 * j).toString()
  16571.     }
  16572.   ],
  16573.   l = function (c) {
  16574.     var d = c.user,
  16575.     j = c.listName,
  16576.     l = c.ipAddress,
  16577.     m = c.formValues,
  16578.     n = c.supportsShadowBanning,
  16579.     o = c.supportsTempBanning,
  16580.     p = c.selectRetroactiveAction,
  16581.     q = c.toggleBanTypeCallback,
  16582.     r = c.toggleUserValueChecked,
  16583.     s = c.toggleIpAddressChecked,
  16584.     t = c.updateDuration,
  16585.     u = c.updateCustomDurationAmount,
  16586.     v = c.updateCustomDurationScale,
  16587.     w = c.updateReason,
  16588.     x = c.handleSubmit,
  16589.     y = c.handleClose,
  16590.     z = c.handleChangeValue,
  16591.     A = c.closeText,
  16592.     B = c.getPlaceholderForValue,
  16593.     C = c.itemTypes,
  16594.     D = c.itemType,
  16595.     E = c.UpgradeIcon,
  16596.     F = c.itemValue;
  16597.     return j ? a.createElement('form', {
  16598.       className: j + '-form'
  16599.     }, a.createElement('div', {
  16600.       className: 'admin-modal__content padding-bottom'
  16601.     }, a.createElement('div', null, j === g.WHITELIST ? a.createElement('p', {
  16602.       className: 'spacing-default'
  16603.     }, f('Adding this person to the whitelist will automatically approve his or her new comments from now on.')) : a.createElement('div', {
  16604.       className: 'align align--stretch align--wrap'
  16605.     }, a.createElement('label', {
  16606.       className: [
  16607.         'padding-default',
  16608.         'align',
  16609.         'align__item--grow',
  16610.         'align__item--equal',
  16611.         'align--center',
  16612.         'align--column',
  16613.         'modal__option',
  16614.         'ban__option',
  16615.         o ? null : '-disabled',
  16616.         m.type === h.TEMP ? '-selected' : null
  16617.       ].join(' ')
  16618.     }, a.createElement('input', {
  16619.       type: 'radio',
  16620.       name: 'ban_type',
  16621.       value: h.TEMP,
  16622.       checked: m.type === h.TEMP,
  16623.       onChange: q,
  16624.       disabled: !o
  16625.     }), a.createElement('p', {
  16626.       className: 'text-semibold text-center modal__option-text ban__option-text'
  16627.     }, f('Timeout'), o ? null : a.createElement(E, {
  16628.       tooltipClass: 'tooltip-timeout'
  16629.     }))), j === g.BLACKLIST && m.type === h.TEMP ? a.createElement('div', {
  16630.       className: 'padding-default modal__description ban__description border-bottom-dark'
  16631.     }, a.createElement('div', {
  16632.       className: 'text-small modal__option-subtext ban__option-subtext'
  16633.     }, f('Restrict a user\'s ability to comment for a period of time. This notifies the user of their timeout. If discussions get heated, enforce timeouts so that users cool off and improve their behavior.'), k.map(function (b) {
  16634.       return a.createElement('label', {
  16635.         className: 'fieldset__block--checkbox text-medium spacing-bottom-small text-semibold text-gray-dark',
  16636.         key: b.durationHours
  16637.       }, a.createElement('input', {
  16638.         type: 'radio',
  16639.         name: 'duration',
  16640.         checked: m.durationHours === b.durationHours,
  16641.         onChange: t,
  16642.         value: b.durationHours,
  16643.         className: 'spacing-right-small'
  16644.       }), b.label)
  16645.     }), a.createElement('div', null, a.createElement('label', {
  16646.       className: 'text-medium spacing-bottom-small inline__item spacing-right text-semibold text-gray-dark'
  16647.     }, a.createElement('input', {
  16648.       type: 'radio',
  16649.       name: 'duration',
  16650.       checked: 'custom' === m.durationHours,
  16651.       onChange: t,
  16652.       value: 'custom',
  16653.       className: 'spacing-right-small'
  16654.     }), f('Custom')), a.createElement('input', {
  16655.       name: 'customDurationAmount',
  16656.       type: 'number',
  16657.       value: m.customDurationAmount,
  16658.       onChange: u,
  16659.       onFocus: u,
  16660.       onKeyPress: u,
  16661.       className: 'spacing-right-small -text-small',
  16662.       maxLength: '2',
  16663.       style: {
  16664.         width: '50px'
  16665.       },
  16666.       min: '0'
  16667.     }), a.createElement('select', {
  16668.       value: m.customDurationScale,
  16669.       onChange: v
  16670.     }, a.createElement('option', {
  16671.       value: '1'
  16672.     }, 'Hour(s)'), a.createElement('option', {
  16673.       value: '24'
  16674.     }, 'Day(s)'), a.createElement('option', {
  16675.       value: 168 .toString()
  16676.     }, 'Week(s)'))))) : null, a.createElement('label', {
  16677.       className: [
  16678.         'padding-default',
  16679.         'align',
  16680.         'align__item--grow',
  16681.         'align__item--equal',
  16682.         'align--center',
  16683.         'align--column',
  16684.         'modal__option',
  16685.         'ban__option',
  16686.         n ? null : '-disabled',
  16687.         m.type === h.SHADOW ? '-selected' : null
  16688.       ].join(' ')
  16689.     }, a.createElement('input', {
  16690.       type: 'radio',
  16691.       name: 'ban_type',
  16692.       value: h.SHADOW,
  16693.       checked: m.type === h.SHADOW,
  16694.       onChange: q,
  16695.       disabled: !n
  16696.     }), a.createElement('p', {
  16697.       className: 'text-semibold text-center modal__option-text ban__option-text'
  16698.     }, f('Shadow Ban'), n ? null : a.createElement(E, null))), j === g.BLACKLIST && m.type === h.SHADOW ? a.createElement('div', {
  16699.       className: 'modal__description ban__description border-bottom-dark'
  16700.     }, a.createElement('p', {
  16701.       className: 'text-small modal__option-subtext ban__option-subtext'
  16702.     }, f('Ban a user without them knowing. The user can still comment, however, their posts will only be visible to themselves. Use it against trolls and spammers who attempt to circumvent a ban with new accounts.'))) : null, a.createElement('label', {
  16703.       className: [
  16704.         'padding-default',
  16705.         'align',
  16706.         'align__item--grow',
  16707.         'align__item--equal',
  16708.         'align--center',
  16709.         'align--column',
  16710.         'modal__option',
  16711.         'ban__option',
  16712.         m.type === h.PERMANENT ? '-selected' : null
  16713.       ].join(' ')
  16714.     }, a.createElement('input', {
  16715.       type: 'radio',
  16716.       name: 'ban_type',
  16717.       value: h.PERMANENT,
  16718.       checked: m.type === h.PERMANENT,
  16719.       onChange: q
  16720.     }), a.createElement('p', {
  16721.       className: 'text-semibold text-center modal__option-text ban__option-text'
  16722.     }, 'Permanent Ban')), j === g.BLACKLIST && m.type === h.PERMANENT ? a.createElement('div', {
  16723.       className: 'modal__description ban__description border-bottom-dark'
  16724.     }, a.createElement('p', {
  16725.       className: 'text-small modal__option-subtext ban__option-subtext'
  16726.     }, f('Permanently ban the user so they can no longer post, vote, or flag comments on your site. If the user repeatedly violates your comment policy, revoke their ability to participate.'), a.createElement('label', {
  16727.       className: 'fieldset__block--checkbox text-medium spacing-bottom-small'
  16728.     }, a.createElement('span', {
  16729.       className: 'text-semibold text-gray-dark'
  16730.     }, f('Last 30 days of comments:'), ' '), a.createElement('select', {
  16731.       value: m.retroactiveAction,
  16732.       onChange: p,
  16733.       className: 'custom-select'
  16734.     }, a.createElement('option', {
  16735.       value: i.DO_NOTHING
  16736.     }, f('Do nothing')), a.createElement('option', {
  16737.       value: i.DELETE
  16738.     }, f('Delete')), a.createElement('option', {
  16739.       value: i.MARK_AS_SPAM
  16740.     }, f('Mark as spam')))))) : null)), a.createElement('div', {
  16741.       className: 'padding-default modal__config ban__config'
  16742.     }, !d || d.isAnonymous ? null : a.createElement('div', {
  16743.       className: 'align align--stretch access__block spacing-bottom embed-hidden'
  16744.     }, a.createElement('a', {
  16745.       href: d.profileUrl,
  16746.       className: 'spacing-right'
  16747.     }, a.createElement('img', {
  16748.       src: d.avatar.cache,
  16749.       alt: d.name,
  16750.       className: 'comment-__avatar border-radius-sm'
  16751.     })), a.createElement('div', {
  16752.       className: 'access__value'
  16753.     }, a.createElement('h4', null, d.name), a.createElement('p', {
  16754.       className: 'text-gray text-small'
  16755.     }, ' ', d.username, ' '))), d ? a.createElement('label', {
  16756.       className: 'fieldset__block--checkbox text-medium spacing-bottom-small'
  16757.     }, a.createElement('input', {
  16758.       type: 'checkbox',
  16759.       checked: Boolean(m.username),
  16760.       onChange: b.partial(r, b, 'username'),
  16761.       className: 'spacing-right-small'
  16762.     }), f('User:'), ' ', ' ', a.createElement('strong', null, ' ', d.username, ' ')) : a.createElement(a.Fragment, null, a.createElement('div', {
  16763.       className: 'spacing-top spacing-bottom form-attribute-input'
  16764.     }, a.createElement('div', null, a.createElement('h3', {
  16765.       className: 'text-gray-darker'
  16766.     }, 'Type')), a.createElement('select', {
  16767.       name: 'itemType',
  16768.       className: 'input--select',
  16769.       value: e.itemType,
  16770.       onChange: z,
  16771.       disabled: C.length <= 1
  16772.     }, C.map(function (b) {
  16773.       return a.createElement('option', {
  16774.         key: b.value,
  16775.         value: b.value
  16776.       }, ' ', b.displayName, ' ')
  16777.     }))), a.createElement('div', {
  16778.       className: 'spacing-top spacing-bottom form-attribute-input'
  16779.     }, a.createElement('h3', {
  16780.       className: 'text-gray-darker'
  16781.     }, 'Value'), a.createElement('div', null, a.createElement('input', {
  16782.       className: 'input--textbox',
  16783.       name: 'itemValue',
  16784.       type: 'text',
  16785.       placeholder: B(D),
  16786.       value: F,
  16787.       onChange: z
  16788.     })))), d && j === g.BLACKLIST ? a.createElement('label', {
  16789.       className: 'fieldset__block--checkbox text-medium spacing-bottom-small'
  16790.     }, a.createElement('input', {
  16791.       type: 'checkbox',
  16792.       checked: Boolean(m.email),
  16793.       onChange: b.partial(r, b, 'email'),
  16794.       className: 'spacing-right-small'
  16795.     }), f('Email:'), ' ', a.createElement('strong', null, ' ', d.email, ' ')) : null, j === g.BLACKLIST && l ? a.createElement('label', {
  16796.       className: 'fieldset__block--checkbox text-medium spacing-bottom-small'
  16797.     }, a.createElement('input', {
  16798.       type: 'checkbox',
  16799.       checked: Boolean(m.ipAddress),
  16800.       onChange: s,
  16801.       className: 'spacing-right-small'
  16802.     }), f('IP Address:'), ' ', a.createElement('strong', null, ' ', l, ' '), a.createElement('div', {
  16803.       className: [
  16804.         'spacing-default-narrow',
  16805.         'text-small',
  16806.         'text-gray',
  16807.         'spacing-left-large',
  16808.         'embed-hidden'
  16809.       ].join(' ')
  16810.     }, a.createElement('strong', null, f('Note:'), ' '), f('Adding an IP address to the banned list may also unintentionally block others who may share this IP address.'))) : null, j === g.BLACKLIST ? a.createElement('div', null, a.createElement('div', {
  16811.       className: 'spacing-bottom-small spacing-top-narrow'
  16812.     }, a.createElement('label', {
  16813.       className: 'modal__reason ban__reason'
  16814.     }, f('Reason for banning:'), a.createElement('input', {
  16815.       name: 'reason',
  16816.       type: 'text',
  16817.       value: m.reason || '',
  16818.       onChange: w,
  16819.       className: 'input--textbox -text-small border-gray-light',
  16820.       maxLength: '50'
  16821.     }))), a.createElement('p', {
  16822.       className: 'text-small modal__option-subtext ban__option-subtext'
  16823.     }, f('You can remove the user from the banned list at any time.'))) : null)), a.createElement('div', {
  16824.       className: 'admin-modal__footer clearfix'
  16825.     }, a.createElement('div', null, a.createElement('button', {
  16826.       className: [
  16827.         'button',
  16828.         'button-fill--brand',
  16829.         'button-small',
  16830.         'text-capitalized'
  16831.       ].join(' '),
  16832.       disabled: !(m.email || m.username || m.ipAddress || F),
  16833.       onClick: x
  16834.     }, f(j === g.WHITELIST ? 'Add to Trusted List' : 'Add to Banned List')), j === g.BLACKLIST ? a.createElement('button', {
  16835.       className: [
  16836.         'button',
  16837.         'button-fill',
  16838.         'button-small',
  16839.         'text-capitalized'
  16840.       ].join(' '),
  16841.       onClick: y
  16842.     }, f(A)) : null))) : null
  16843.   };
  16844.   return l
  16845. }),
  16846. define('lounge/utils', [
  16847.   'jquery',
  16848.   'core/api'
  16849. ], function (a, b) {
  16850.   'use strict';
  16851.   var c = {
  16852.   },
  16853.   d = function (d) {
  16854.     if (c[d]) return c[d];
  16855.     var e = a.Deferred();
  16856.     return d ? (c[d] = e.promise(), b.call('forums/details', {
  16857.       method: 'GET',
  16858.       data: {
  16859.         forum: d,
  16860.         attach: 'forumFeatures'
  16861.       }
  16862.     }).done(function (a) {
  16863.       e.resolve(a.response.features)
  16864.     }).fail(function () {
  16865.       e.reject({
  16866.       })
  16867.     }), e.promise()) : e.reject({
  16868.     })
  16869.   };
  16870.   return d._clearCache = function () {
  16871.     c = {
  16872.     }
  16873.   },
  16874.   {
  16875.     getSaasFeatures: d
  16876.   }
  16877. });
  16878. var _extends = Object.assign || function (a) {
  16879.   for (var b = 1; b < arguments.length; b++) {
  16880.     var c = arguments[b];
  16881.     for (var d in c) Object.prototype.hasOwnProperty.call(c, d) && (a[d] = c[d])
  16882.   }
  16883.   return a
  16884. };
  16885. define('lounge/views/posts/BlacklistView', [
  16886.   'jquery',
  16887.   'underscore',
  16888.   'backbone',
  16889.   'react',
  16890.   'moment',
  16891.   'core/bus',
  16892.   'core/api',
  16893.   'core/utils',
  16894.   'core/utils/storage',
  16895.   'core/templates/react/ModerationUserListsTemplate',
  16896.   'core/constants/moderationUserLists',
  16897.   'lounge/utils',
  16898.   'lounge/views/cards'
  16899. ], function (a, b, c, d, e, f, g, h, i, j, k, l, m) {
  16900.   'use strict';
  16901.   var n = k.BAN_TYPES,
  16902.   o = k.LIST_TYPES,
  16903.   p = k.STORAGE_KEY_BAN_TYPE,
  16904.   q = k.RETROACTIVE_ACTION_TYPES,
  16905.   r = k.DEFAULT_FORM_VALUES,
  16906.   s = k.getDateExpires,
  16907.   t = k.isBanTypeSupported,
  16908.   u = h.preventDefaultHandler,
  16909.   v = c.View.extend({
  16910.     className: 'moderate',
  16911.     initialize: function (b) {
  16912.       this.forum = b.forum;
  16913.       var c = [
  16914.         l.getSaasFeatures(this.model.get('forum'))
  16915.       ];
  16916.       this.model.get('ipAddress') && this.model.author.get('email') || c.push(this.model.fetch()),
  16917.       this.loading = a.when.apply(a, c)
  16918.     },
  16919.     render: function () {
  16920.       var a = this,
  16921.       b = this.$el;
  16922.       return b.addClass('loading'),
  16923.       f.trigger('uiAction:viewBanUser'),
  16924.       this.loading.always(function (c) {
  16925.         var e = a.model.author,
  16926.         f = i.get(p);
  16927.         a.saasFeatures = c,
  16928.         a.formValues = _extends({
  16929.         }, r, {
  16930.           type: t(f, c) ? f : n.PERMANENT,
  16931.           username: e.get('username'),
  16932.           email: e.get('email'),
  16933.           user: e.get('id'),
  16934.           postId: a.model.id
  16935.         }, a.formValues),
  16936.         b.removeClass('loading'),
  16937.         b.html(j({
  16938.           user: e.toJSON(),
  16939.           listName: o.BLACKLIST,
  16940.           ipAddress: a.model.get('ipAddress'),
  16941.           formValues: a.formValues,
  16942.           supportsShadowBanning: t(n.SHADOW, a.saasFeatures),
  16943.           supportsTempBanning: t(n.TEMP, a.saasFeatures),
  16944.           selectRetroactiveAction: a.selectRetroactiveAction.bind(a),
  16945.           toggleBanTypeCallback: a.toggleBanTypeCallback.bind(a),
  16946.           toggleUserValueChecked: a.toggleUserValueChecked.bind(a),
  16947.           toggleIpAddressChecked: a.toggleIpAddressChecked.bind(a),
  16948.           updateReason: a.updateReason.bind(a),
  16949.           updateDuration: a.updateDuration.bind(a),
  16950.           updateCustomDurationAmount: a.updateCustomDurationAmount.bind(a),
  16951.           updateCustomDurationScale: a.updateCustomDurationScale.bind(a),
  16952.           handleSubmit: a.submit.bind(a),
  16953.           handleClose: a.cancel.bind(a),
  16954.           closeText: 'Cancel',
  16955.           UpgradeIcon: function () {
  16956.             return d.createElement('span', {
  16957.               className: 'text-largest text-yellow icon-upgrade-arrow-pro media-middle spacing-left upgrade-card',
  16958.               'data-role': 'upgrade-card-target'
  16959.             })
  16960.           }
  16961.         })),
  16962.         a.initUpgradeCard()
  16963.       }),
  16964.       this.trigger('render'),
  16965.       this
  16966.     },
  16967.     initUpgradeCard: function () {
  16968.       var b = m.UpgradeCard.create({
  16969.         organization: this.forum ? {
  16970.           id: this.forum.get('organizationId')
  16971.         }
  16972.          : null
  16973.       });
  16974.       this.$('[data-role=upgrade-card-target]').each(function () {
  16975.         b.target(a(this))
  16976.       }),
  16977.       this.listenToOnce(b, 'show', function () {
  16978.         f.trigger('uiAction:viewUpgradeCard')
  16979.       }),
  16980.       this.listenTo(b, 'click:upgrade', function (a) {
  16981.         a.stopPropagation(),
  16982.         f.trigger('uiAction:clickUpgrade')
  16983.       })
  16984.     },
  16985.     toggleBanType: function (a, b) {
  16986.       t(b, this.saasFeatures) && (this.formValues.type = b, i.set(p, b), this.render())
  16987.     },
  16988.     toggleBanTypeCallback: function (a) {
  16989.       this.toggleBanType(a, a.target.value)
  16990.     },
  16991.     selectRetroactiveAction: function (a) {
  16992.       this.formValues.retroactiveAction = a.target.value || q.DO_NOTHING
  16993.     },
  16994.     toggleUserValueChecked: function (a, b) {
  16995.       this.formValues[b] = a.target.checked ? 1 : 0
  16996.     },
  16997.     toggleIpAddressChecked: function (a) {
  16998.       this.formValues.ipAddress = a.target.checked ? 1 : 0
  16999.     },
  17000.     updateReason: function (a) {
  17001.       this.formValues.reason = a.target.value
  17002.     },
  17003.     updateDuration: function (a) {
  17004.       this.formValues.durationHours = a.target.value
  17005.     },
  17006.     updateCustomDurationAmount: function (a) {
  17007.       var b = this;
  17008.       if ('keypress' === a.type && /[^\d]/.test(a.key)) return void a.preventDefault();
  17009.       var c = a.target.value,
  17010.       d = 'custom';
  17011.       this.formValues.customDurationAmount === c && this.formValues.durationHours === d || (this.formValues.customDurationAmount = c, this.formValues.durationHours = d, a.target === window.document.activeElement && this.once('render', function () {
  17012.         b.$('input[name=customDurationAmount]').focus()
  17013.       }), this.render())
  17014.     },
  17015.     updateCustomDurationScale: function (a) {
  17016.       this.formValues.customDurationScale = a.target.value,
  17017.       this.formValues.durationHours = 'custom',
  17018.       this.render()
  17019.     },
  17020.     cancel: u(function () {
  17021.       this.trigger('cancel')
  17022.     }),
  17023.     submit: u(function () {
  17024.       var a = this,
  17025.       c = this.formValues.type === n.TEMP ? s(this.formValues) : null;
  17026.       f.trigger('uiAction:clickBanUser', JSON.stringify({
  17027.         date_expires: c,
  17028.         date_added: e().toISOString()
  17029.       }));
  17030.       var d = {
  17031.         post: this.formValues.postId,
  17032.         notes: this.formValues.reason,
  17033.         shadowBan: this.formValues.type === n.SHADOW ? 1 : 0,
  17034.         dateExpires: c
  17035.       };
  17036.       this.formValues.email && (d.banEmail = 1),
  17037.       this.formValues.username && (d.banUser = 1),
  17038.       this.formValues.ipAddress && (d.banIp = 1),
  17039.       this.formValues.type === n.PERMANENT && (d.retroactiveAction = this.formValues.retroactiveAction),
  17040.       d.post && g.call('forums/block/banPostAuthor.json', {
  17041.         method: 'POST',
  17042.         data: b.omit(d, b.isNull),
  17043.         success: function () {
  17044.           a.trigger('success')
  17045.         }
  17046.       })
  17047.     })
  17048.   }, {
  17049.     defaultFormValues: {
  17050.       postId: null,
  17051.       username: null,
  17052.       email: null,
  17053.       ipAddress: null,
  17054.       reason: '',
  17055.       retroactiveAction: null
  17056.     }
  17057.   });
  17058.   return v
  17059. }),
  17060. define('templates/lounge/edit', [
  17061.   'react',
  17062.   'core/switches'
  17063. ], function (a, b) {
  17064.   'use strict';
  17065.   var c = function (c) {
  17066.     var d = c.forum.id,
  17067.     e = b.isFeatureActive('embed_refresh', {
  17068.       forum: d
  17069.     }),
  17070.     f = b.isFeatureActive('embed_v2', {
  17071.       forum: d
  17072.     }),
  17073.     g = e ? 'textarea-outer-wrapper textarea-outer-wrapper--refresh' : 'textarea-outer-wrapper',
  17074.     h = f ? 'textarea-wrapper textarea-wrapper--embedv2' : 'textarea-wrapper';
  17075.     return a.createElement('div', {
  17076.       className: g
  17077.     }, a.createElement('div', {
  17078.       className: 'ratings-wrapper',
  17079.       'data-role': 'ratings-container'
  17080.     }), a.createElement('div', {
  17081.       className: h,
  17082.       'data-role': 'textarea'
  17083.     }, a.createElement('div', {
  17084.       className: 'edit-alert',
  17085.       role: 'postbox-alert'
  17086.     }), a.createElement('div', {
  17087.       className: 'text-editor-container'
  17088.     })))
  17089.   };
  17090.   return c
  17091. }),
  17092. define('lounge/views/posts/PostEditView', [
  17093.   'backbone',
  17094.   'moment',
  17095.   'underscore',
  17096.   'core/bus',
  17097.   'core/mixins/withAlert',
  17098.   'core/strings',
  17099.   'core/switches',
  17100.   'core/time',
  17101.   'core/views/TextareaView',
  17102.   'core/utils/threadRatingsHelpers',
  17103.   'lounge/common',
  17104.   'lounge/mixins/asTextEditor',
  17105.   'lounge/mixins/asTextEditorV2',
  17106.   'lounge/mixins/withStarRatings',
  17107.   'lounge/views/posts/DummyTextareaView',
  17108.   'templates/lounge/edit',
  17109.   'templates/lounge/textEditor'
  17110. ], function (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q) {
  17111.   'use strict';
  17112.   var r = f.get,
  17113.   s = a.View.extend({
  17114.     tagName: 'form',
  17115.     className: 'edit',
  17116.     events: {
  17117.       submit: 'submitForm',
  17118.       'click [data-action=cancel]': 'cancel'
  17119.     },
  17120.     initialize: function (a) {
  17121.       this.post = a.post,
  17122.       this.session = a.session,
  17123.       this.thread = a.thread,
  17124.       this.isRefreshEnabled = g.isFeatureActive('embed_refresh', {
  17125.         forum: this.thread.forum.id
  17126.       }),
  17127.       this.isRefreshV2Enabled = this.isRefreshEnabled && g.isFeatureActive('embed_refresh_v2', {
  17128.         forum: this.thread.forum.id
  17129.       }),
  17130.       this.$el.addClass(this.isRefreshEnabled ? 'form-refresh' : ''),
  17131.       this.$el.addClass(this.isRefreshV2Enabled ? 'form-refresh-v2' : ''),
  17132.       this._alertSelector = '[role=postbox-alert]',
  17133.       this.textEditorTemplate = q,
  17134.       this.postEditMode = !0
  17135.     },
  17136.     cancel: function () {
  17137.       this.trigger('cancel')
  17138.     },
  17139.     getEditTimeLeft: function () {
  17140.       var a,
  17141.       c = b().format(h.ISO_8601);
  17142.       return a = c < this.post.get('editableUntil') ? f.interpolate(r('You have until %(editableUntil)s to edit this comment.'), {
  17143.         editableUntil: this.post.getRelativeCreatedAt('editableUntil')
  17144.       }) : r('The edit period for this comment has expired.'),
  17145.       '<div class="edit-time-left">' + a + ' <a class="edit-time-message"href="https://help.disqus.com/commenting/remove-and-edit-your-comments"target="_blank"rel="noopener noreferrer"align="center">' + r('Learn more') + '</a></div>'
  17146.     },
  17147.     getEditorProps: function () {
  17148.       return {
  17149.         focusOnLoad: !0,
  17150.         onSubmit: this.submitForm.bind(this, null),
  17151.         isEdit: !0,
  17152.         onCancel: this.cancel.bind(this),
  17153.         initialState: this.post.toJSON().message
  17154.       }
  17155.     },
  17156.     render: function () {
  17157.       var a = this.post.toJSON();
  17158.       this.$el.html(p({
  17159.         post: a,
  17160.         user: this.session.toJSON(),
  17161.         forum: this.thread.forum
  17162.       }));
  17163.       var b = this.getEditTimeLeft();
  17164.       if (this.isEmbedV2Enabled) this.loadEditorV2(this.getEditorProps()),
  17165.       this.textarea = new o,
  17166.       this.$('[data-role=textarea]').after(b);
  17167.        else {
  17168.         this.initTextEditor();
  17169.         var c = this.textarea = new i({
  17170.           value: a.raw_message
  17171.         });
  17172.         this.$('[data-role=textarea]').prepend(c.render().el).after(b)
  17173.       }
  17174.       return this.initStarRatings(),
  17175.       this
  17176.     },
  17177.     resize: function () {
  17178.       var a = k.getLounge();
  17179.       a && this.textarea && this.textarea.$input && this.textarea.$input.on('transitionend webkitTransitionEnd oTransitionEnd otransitionend MSTransitionEnd', function () {
  17180.         a.resize()
  17181.       }),
  17182.       this.textarea.resize()
  17183.     },
  17184.     submitForm: function (a, b) {
  17185.       this.dismissAlert(),
  17186.       a && a.preventDefault() && a.preventDefault();
  17187.       var e = this,
  17188.       f = {
  17189.         raw_message: b || this.textarea.get(),
  17190.         rating: this.rating
  17191.       },
  17192.       g = e.post.validateMessage(f);
  17193.       return void 0 !== g ? this.alert(g, {
  17194.         type: 'error'
  17195.       }) : void e.post.save(f, {
  17196.         success: function () {
  17197.           e.trigger('submitted'),
  17198.           d.trigger('uiCallback:postUpdated', e.post, {
  17199.             area: 'main'
  17200.           }),
  17201.           c.isNumber(e.rating) && j.isThreadModelRatingsEnabled(e.thread) && (e.thread.set('userRating', e.rating), c.delay(c.bind(e.thread.fetchRatings, e.thread), 500))
  17202.         },
  17203.         error: function (a, b) {
  17204.           var c;
  17205.           return c = b.response.indexOf('Comment edit period expired') > - 1 ? r('You can no longer edit this comment. Comments can only be edited within 7 days after posting.') + ' <a href="https://help.disqus.com/commenting/remove-and-edit-your-comments" target="_blank" rel="noopener noreferrer"style="color:white ! important" >' + r('Learn more') + '</a>' : b.response,
  17206.           e.alert(c, {
  17207.             type: 'error',
  17208.             safe: !0
  17209.           })
  17210.         }
  17211.       })
  17212.     },
  17213.     remove: function () {
  17214.       this.$el.remove()
  17215.     }
  17216.   });
  17217.   return e.call(s.prototype),
  17218.   n.call(s.prototype),
  17219.   l.call(s.prototype),
  17220.   m.call(s.prototype),
  17221.   s
  17222. }),
  17223. define('lounge/views/posts/TypingUserView', [
  17224.   'backbone',
  17225.   'core/strings',
  17226.   'core/switches',
  17227.   'core/utils/object/get'
  17228. ], function (a, b, c, d) {
  17229.   'use strict';
  17230.   var e = b.get,
  17231.   f = a.View.extend({
  17232.     initialize: function (a) {
  17233.       this.options = a
  17234.     },
  17235.     render: function () {
  17236.       var a,
  17237.       d = this.options.parentView.reply,
  17238.       f = d && d.typingUser,
  17239.       g = this.model.usersTyping.count(f && f.id),
  17240.       h = c.isFeatureActive('embed_refresh', {
  17241.         forum: this.model.get('forum')
  17242.       });
  17243.       return g <= 0 ? void this.$el.hide() : (1 === g ? a = e(h ? '1 person writing a comment…' : 'One other person is typing…') : (a = e(h ? '%(num)s people writing comments…' : '%(num)s other people are typing…'), a = b.interpolate(a, {
  17244.         num: g
  17245.       })), this.$el.text(a), this.$el.show(), this)
  17246.     }
  17247.   });
  17248.   return f
  17249. });
  17250. var _extends = Object.assign || function (a) {
  17251.   for (var b = 1; b < arguments.length; b++) {
  17252.     var c = arguments[b];
  17253.     for (var d in c) Object.prototype.hasOwnProperty.call(c, d) && (a[d] = c[d])
  17254.   }
  17255.   return a
  17256. };
  17257. define('templates/lounge/flaggingReasons', [
  17258.   'react',
  17259.   'core/strings'
  17260. ], function (a, b) {
  17261.   'use strict';
  17262.   var c = b.gettext,
  17263.   d = [
  17264.     {
  17265.       id: 6,
  17266.       title: c('I disagree with this user')
  17267.     },
  17268.     {
  17269.       id: 0,
  17270.       title: c('Targeted harassment'),
  17271.       description: c('posted or encouraged others to post harassing comments or hate speech targeting me, other individuals, or groups')
  17272.     },
  17273.     {
  17274.       id: 1,
  17275.       title: c('Spam'),
  17276.       description: c('posted spam comments or discussions')
  17277.     },
  17278.     {
  17279.       id: 2,
  17280.       title: c('Inappropriate profile'),
  17281.       description: c('profile contains inappropriate images or text')
  17282.     },
  17283.     {
  17284.       id: 3,
  17285.       title: c('Threatening content'),
  17286.       description: c('posted directly threatening content')
  17287.     },
  17288.     {
  17289.       id: 4,
  17290.       title: c('Impersonation'),
  17291.       description: c('misrepresents themselves as someone else')
  17292.     },
  17293.     {
  17294.       id: 5,
  17295.       title: c('Private information'),
  17296.       description: c('posted someone else\'s personally identifiable information')
  17297.     }
  17298.   ],
  17299.   e = function (b) {
  17300.     var c = b.id,
  17301.     d = b.title,
  17302.     e = b.description,
  17303.     f = b.updateReason;
  17304.     return a.createElement('label', {
  17305.       className: [
  17306.         'padding-default',
  17307.         'flagging__reason'
  17308.       ].join(' ')
  17309.     }, a.createElement('input', {
  17310.       type: 'radio',
  17311.       name: 'reason',
  17312.       value: c,
  17313.       onChange: f
  17314.     }), a.createElement('p', {
  17315.       className: 'text-bold flagging__reason-text'
  17316.     }, d, e ? a.createElement('span', {
  17317.       className: 'text-small text-normal'
  17318.     }, ' — ', e) : null))
  17319.   },
  17320.   f = function (b) {
  17321.     var f = b.updateReason,
  17322.     g = b.handleSubmit,
  17323.     h = b.handleCancel;
  17324.     return a.createElement('form', {
  17325.       className: 'flagging-form'
  17326.     }, a.createElement('div', {
  17327.       className: 'flagging__title text-semibold'
  17328.     }, c('Flag Comment')), a.createElement('div', {
  17329.       className: 'flagging__content'
  17330.     }, a.createElement('p', {
  17331.       className: 'flagging__subtitle text-semibold'
  17332.     }, c('Why are you flagging this comment?')), d.map(function (b) {
  17333.       return a.createElement(e, _extends({
  17334.         key: b.id,
  17335.         updateReason: f
  17336.       }, b))
  17337.     }), a.createElement('p', {
  17338.       className: 'flagging__reason-subtext'
  17339.     }, c('Before flagging, please keep in mind that %(disqus)s does not moderate communities. Your username will be shown to the moderator, so you should only flag this comment for one of the reasons listed above.', {
  17340.       disqus: 'Disqus'
  17341.     }))), a.createElement('div', {
  17342.       className: 'admin-modal__footer -mobile clearfix'
  17343.     }, a.createElement('button', {
  17344.       className: 'button button-fill--brand',
  17345.       onClick: g
  17346.     }, c('Flag Comment')), ' ', a.createElement('button', {
  17347.       className: 'button button-fill',
  17348.       onClick: h
  17349.     }, c('Cancel'))))
  17350.   };
  17351.   return f
  17352. }),
  17353. define('templates/lounge/flaggingUserBlocking', [
  17354.   'react',
  17355.   'core/strings',
  17356.   'core/switches',
  17357.   'templates/lounge/partials/profileLink'
  17358. ], function (a, b, c, d) {
  17359.   'use strict';
  17360.   var e = b.gettext,
  17361.   f = function (b) {
  17362.     var f = b.user,
  17363.     g = b.forumId,
  17364.     h = b.handleBlock,
  17365.     i = b.handleComplete;
  17366.     return a.createElement('div', {
  17367.       className: 'flagging__blocking-form'
  17368.     }, a.createElement('div', {
  17369.       className: 'flagging__title text-semibold'
  17370.     }, e('Thanks for your feedback!')), c.isFeatureActive('sso_less_branding', {
  17371.       forum: g
  17372.     }) ? a.createElement('div', {
  17373.       className: 'admin-modal__footer -mobile clearfix'
  17374.     }, a.createElement('button', {
  17375.       className: 'button button-fill--brand',
  17376.       onClick: i
  17377.     }, e('Done'))) : [
  17378.       a.createElement('div', {
  17379.         key: 'blocking-0',
  17380.         className: 'flagging__blocking-content'
  17381.       }, a.createElement('p', {
  17382.         className: 'flagging__subtitle text-semibold'
  17383.       }, e('Other tools for you:')), a.createElement('p', {
  17384.         className: 'spacing-bottom'
  17385.       }, e('Blocking this user will hide all of their activity and comments from your %(disqus)s content, feeds, and notifications.', {
  17386.         disqus: 'Disqus'
  17387.       })), a.createElement('p', {
  17388.         className: 'spacing-top spacing-bottom-none'
  17389.       }, e('Would you like to block %(user)s?', {
  17390.         user: a.createElement(d, {
  17391.           user: f,
  17392.           forumId: g,
  17393.           className: 'text-semibold'
  17394.         }, f.name)
  17395.       }))),
  17396.       a.createElement('div', {
  17397.         key: 'blocking-1',
  17398.         className: 'admin-modal__footer -mobile clearfix'
  17399.       }, a.createElement('div', null, a.createElement('button', {
  17400.         className: 'button button-fill--red',
  17401.         onClick: h
  17402.       }, e('Block User')), ' ', a.createElement('button', {
  17403.         className: 'button button-fill',
  17404.         onClick: i
  17405.       }, e('No Thanks'))))
  17406.     ])
  17407.   };
  17408.   return f
  17409. }),
  17410. define('templates/lounge/flaggingUserBlocked', [
  17411.   'react',
  17412.   'core/strings'
  17413. ], function (a, b) {
  17414.   'use strict';
  17415.   var c = b.gettext,
  17416.   d = function (b) {
  17417.     var d = b.displayName,
  17418.     e = b.handleComplete,
  17419.     f = b.error;
  17420.     return a.createElement('div', {
  17421.       className: 'flagging__blocking-complete'
  17422.     }, a.createElement('div', {
  17423.       className: 'flagging__title'
  17424.     }, c('Blocked User')), a.createElement('div', {
  17425.       className: 'flagging__blocking-complete-content'
  17426.     }, a.createElement('img', {
  17427.       className: 'flagging-pam',
  17428.       alt: 'Pam',
  17429.       src: 'https://c.disquscdn.com/next/embed/assets/img/PamX.fe88e2955f3d594a6cc13c66569ed7d0.svg'
  17430.     }), f ? a.createElement('p', {
  17431.       className: 'spacing-top-bottom'
  17432.     }, f) : a.createElement('div', null, a.createElement('p', {
  17433.       className: 'spacing-top-bottom text-semibold'
  17434.     }, c('You\'ve blocked %(user)s.', {
  17435.       user: d
  17436.     })), a.createElement('p', {
  17437.       className: 'spacing-top-bottom'
  17438.     }, c('You won\'t see comments from this user on %(disqus)s in discussions, notifications, and more.', {
  17439.       disqus: 'Disqus'
  17440.     })))), a.createElement('div', {
  17441.       className: 'admin-modal__footer -mobile clearfix'
  17442.     }, a.createElement('div', null, a.createElement('button', {
  17443.       className: 'button button-fill--brand',
  17444.       onClick: e
  17445.     }, c('Done')), ' ', a.createElement('a', {
  17446.       className: 'button button-fill',
  17447.       href: 'https://disqus.com/home/settings/blocking/',
  17448.       target: '_blank',
  17449.       rel: 'noopener noreferrer',
  17450.       onClick: e
  17451.     }, c('Manage Blocked Users')))))
  17452.   };
  17453.   return d
  17454. }),
  17455. define('lounge/views/posts/FlaggingView', [
  17456.   'backbone',
  17457.   'core/api',
  17458.   'core/utils',
  17459.   'core/bus',
  17460.   'core/strings',
  17461.   'templates/lounge/flaggingReasons',
  17462.   'templates/lounge/flaggingUserBlocking',
  17463.   'templates/lounge/flaggingUserBlocked'
  17464. ], function (a, b, c, d, e, f, g, h) {
  17465.   'use strict';
  17466.   var i = c.preventDefaultHandler,
  17467.   j = e.gettext,
  17468.   k = a.View.extend({
  17469.     className: 'moderate',
  17470.     render: function () {
  17471.       if (this.model.get('isFlaggedByUser')) if (this.blockComplete) {
  17472.         var a = this.model.author;
  17473.         this.$el.html(h({
  17474.           displayName: a.get('name'),
  17475.           error: this.blockError,
  17476.           handleComplete: this.handleComplete.bind(this)
  17477.         }))
  17478.       } else {
  17479.         var b = this.model.author;
  17480.         this.$el.html(g({
  17481.           user: b.toJSON(),
  17482.           forumId: this.model.get('forum'),
  17483.           handleBlock: this.handleBlockUser.bind(this),
  17484.           handleComplete: this.handleComplete.bind(this)
  17485.         })),
  17486.         d.trigger('uiAction:viewBlockUser')
  17487.       } else this.$el.html(f({
  17488.         updateReason: this.updateFlaggingReason.bind(this),
  17489.         handleSubmit: this.submitReason.bind(this),
  17490.         handleCancel: this.cancel.bind(this)
  17491.       })),
  17492.       d.trigger('uiAction:viewFlagPost');
  17493.       return this;
  17494.     },
  17495.     updateFlaggingReason: function (a) {
  17496.       this.reason = a.target.value
  17497.     },
  17498.     cancel: i(function () {
  17499.       this.trigger('cancel')
  17500.     }),
  17501.     handleComplete: function () {
  17502.       this.trigger('success')
  17503.     },
  17504.     submitReason: i(function () {
  17505.       this.reason && (d.trigger('uiAction:clickFlagPost'), this.model.report(this.reason), this.model.set('isFlaggedByUser', !0), this.render())
  17506.     }),
  17507.     handleBlockUser: i(function () {
  17508.       var a = this,
  17509.       c = this.model.author;
  17510.       return d.trigger('uiAction:clickBlockUser'),
  17511.       c.block().fail(function (c) {
  17512.         var d = j('Something went wrong while trying to block this user. Please try again later.'),
  17513.         e = c && c.responseJSON && c.responseJSON.code;
  17514.         e === b.ERROR_CODES.MAX_ITEMS_REACHED && (d = j('Unfortunately this user could not be blocked; you have reached the limit for number of users blocked.')),
  17515.         a.blockError = d
  17516.       }).always(function () {
  17517.         a.blockComplete = !0,
  17518.         a.render()
  17519.       })
  17520.     })
  17521.   });
  17522.   return k
  17523. }),
  17524. define('core/views/Tooltip', [
  17525.   'jquery',
  17526.   'core/views/common/HoverCard'
  17527. ], function (a, b) {
  17528.   'use strict';
  17529.   var c = b.extend({
  17530.     className: 'tooltip-outer message-card',
  17531.     initialize: function (a) {
  17532.       b.prototype.initialize.call(this, a),
  17533.       this.template = a.template,
  17534.       this.message = a.message
  17535.     },
  17536.     render: function () {
  17537.       if (this.template) this.$el.html(this.template());
  17538.        else {
  17539.         if (!this.message) return;
  17540.         this.$el.html(a('<div>').addClass('tooltip').text(this.message))
  17541.       }
  17542.       b.prototype.render.call(this)
  17543.     },
  17544.     moveTo: function (a) {
  17545.       if (a) {
  17546.         var b = this.constructor.POSITION_OFFSET,
  17547.         c = a.offset(),
  17548.         d = this.getContainerPosition(),
  17549.         e = this.$el.width();
  17550.         this.$el.css({
  17551.           bottom: d.containerOffset.height - c.top + b,
  17552.           top: 'inherit',
  17553.           left: c.left - e / 2
  17554.         })
  17555.       }
  17556.     }
  17557.   }, {
  17558.     create: function (a) {
  17559.       return b.create(a.id, a, 'Tooltip', c)
  17560.     },
  17561.     POSITION_OFFSET: 10
  17562.   });
  17563.   return c
  17564. }),
  17565. define('core/views/ClickTooltip', [
  17566.   'underscore',
  17567.   'core/views/common/HoverCard',
  17568.   'core/views/Tooltip'
  17569. ], function (a, b, c) {
  17570.   'use strict';
  17571.   var d = c.extend({
  17572.     target: function (b) {
  17573.       b.on('click', a.bind(this.targetClicked, this, b)),
  17574.       b.on('mouseleave', a.bind(this.leave, this))
  17575.     },
  17576.     targetClicked: function (a) {
  17577.       a && (this.$target = a),
  17578.       'in' !== this._hoverState && (this._hoverState = 'in', this.show(), c.open[this.uid] = this)
  17579.     }
  17580.   }, {
  17581.     create: function (a) {
  17582.       return b.create(a.id, a, 'ClickTooltip', d)
  17583.     }
  17584.   });
  17585.   return d
  17586. }),
  17587. define('templates/lounge/partials/postVotes', [
  17588.   'react',
  17589.   'core/constants/voteConstants',
  17590.   'core/strings',
  17591.   'core/switches',
  17592.   'core/utils/object/get'
  17593. ], function (a, b, c, d, e) {
  17594.   'use strict';
  17595.   var f = c.gettext,
  17596.   g = function (c) {
  17597.     var g = d.isFeatureActive('embed_refresh', {
  17598.       forum: c.forumId
  17599.     }),
  17600.     h = a.createElement('span', {
  17601.       className: 'control'
  17602.     }, g ? null : a.createElement('i', {
  17603.       'aria-hidden': 'true',
  17604.       className: 'icon icon-arrow-2'
  17605.     })),
  17606.     i = a.createElement('span', {
  17607.       className: 'updatable count',
  17608.       'data-role': 'likes'
  17609.     }, e(c.post, [
  17610.       'likes'
  17611.     ], null)),
  17612.     j = g ? [
  17613.       h,
  17614.       ' ',
  17615.       i
  17616.     ] : [
  17617.       i,
  17618.       ' ',
  17619.       h
  17620.     ];
  17621.     return c.votingType === b.VOTING_TYPES.DISABLED ? null : a.createElement('div', {
  17622.       className: 'post-votes'
  17623.     }, a.createElement('a', {
  17624.       href: '#',
  17625.       className: 'vote-up ' + (e(c.post, [
  17626.         'userScore'
  17627.       ], 0) > 0 ? 'upvoted' : '') + ' count-' + e(c.post, [
  17628.         'likes'
  17629.       ], ''),
  17630.       'data-action': 'upvote',
  17631.       title: e(c.post, [
  17632.         'likes'
  17633.       ]) ? '' : f('Vote up'),
  17634.       name: f('Vote up')
  17635.     }, j), c.votingType === b.VOTING_TYPES.DOWNVOTE_DISABLED || g ? null : a.createElement('div', {
  17636.       className: 'post-votes__separator'
  17637.     }, ''), c.votingType === b.VOTING_TYPES.DOWNVOTE_DISABLED ? null : a.createElement('a', {
  17638.       href: '#',
  17639.       className: 'vote-down ' + (e(c.post, [
  17640.         'userScore'
  17641.       ], 0) < 0 ? 'downvoted' : '') + ' count-' + (c.votingType === b.VOTING_TYPES.DOWNVOTE_LIMITED ? 0 : e(c.post, [
  17642.         'dislikes'
  17643.       ], '')),
  17644.       'data-action': 'downvote',
  17645.       title: e(c.post, [
  17646.         'dislikes'
  17647.       ]) ? '' : f('Vote down'),
  17648.       name: f('Vote down')
  17649.     }, a.createElement('span', {
  17650.       className: 'control'
  17651.     }, g ? null : a.createElement('i', {
  17652.       'aria-hidden': 'true',
  17653.       className: 'icon icon-arrow'
  17654.     })), ' ', a.createElement('span', {
  17655.       className: 'updatable count',
  17656.       'data-role': 'dislikes'
  17657.     }, c.votingType === b.VOTING_TYPES.DOWNVOTE_LIMITED ? null : e(c.post, [
  17658.       'dislikes'
  17659.     ], null))))
  17660.   };
  17661.   return g
  17662. }),
  17663. define('templates/lounge/partials/postFooter', [
  17664.   'react',
  17665.   'core/constants/voteConstants',
  17666.   'core/strings',
  17667.   'core/switches',
  17668.   'core/utils/object/get',
  17669.   'templates/lounge/partials/postVotes'
  17670. ], function (a, b, c, d, e, f) {
  17671.   'use strict';
  17672.   var g = c.gettext,
  17673.   h = function (c) {
  17674.     var h = (e(c.session, [
  17675.       'isRegistered'
  17676.     ]) || !d.isFeatureActive('sso_less_branding', {
  17677.       forum: c.post.forum
  17678.     })) && c.votingType !== b.VOTING_TYPES.DISABLED,
  17679.     i = d.isFeatureActive('embed_refresh', {
  17680.       forum: c.post.forum
  17681.     }),
  17682.     j = i && d.isFeatureActive('embed_refresh_v2', {
  17683.       forum: c.post.forum
  17684.     }),
  17685.     k = i ? 'realtime-replies realtime-replies--refresh icon icon-pencil' : 'realtime-replies',
  17686.     l = i ? 'realtime-button realtime-button--refresh' : 'realtime-button';
  17687.     return a.createElement('menu', {
  17688.       className: 'comment-footer__menu'
  17689.     }, h ? [
  17690.       a.createElement('li', {
  17691.         key: 'vote-0',
  17692.         className: 'voting',
  17693.         'data-role': 'voting'
  17694.       }, a.createElement(f, {
  17695.         post: c.post,
  17696.         votingType: c.votingType,
  17697.         forumId: c.forumId
  17698.       })),
  17699.       i && j ? null : a.createElement('li', {
  17700.         key: 'vote-1',
  17701.         className: 'bullet',
  17702.         'aria-hidden': 'true'
  17703.       }, '•')
  17704.     ] : null, e(c.post, [
  17705.       'canBeEdited'
  17706.     ]) ? a.createElement('li', {
  17707.       key: 'edit-0',
  17708.       className: 'edit',
  17709.       'data-role': 'edit-link'
  17710.     }, a.createElement('a', {
  17711.       className: 'comment-footer__action',
  17712.       href: '#',
  17713.       'data-action': 'edit'
  17714.     }, a.createElement('i', {
  17715.       className: 'icon icon-pencil-large'
  17716.     }), a.createElement('span', {
  17717.       className: 'text'
  17718.     }, g('Edit')))) : null, e(c.post, [
  17719.       'canBeRepliedTo'
  17720.     ]) ? a.createElement('li', {
  17721.       key: 'reply-0',
  17722.       className: 'reply',
  17723.       'data-role': 'reply-link'
  17724.     }, a.createElement('a', {
  17725.       className: 'comment-footer__action',
  17726.       href: '#',
  17727.       'data-action': 'reply'
  17728.     }, a.createElement('span', {
  17729.       className: 'text'
  17730.     }, g('Reply')))) : null, e(c.post, [
  17731.       'isSponsored'
  17732.     ]) && !e(c.post, [
  17733.       'hideViewAllComments'
  17734.     ]) ? [
  17735.       a.createElement('li', {
  17736.         key: 'sponsored-0',
  17737.         className: 'thread-link',
  17738.         'data-role': 'thread-link'
  17739.       }, a.createElement('a', {
  17740.         href: e(c.post, [
  17741.           'permalink'
  17742.         ], ''),
  17743.         target: '_blank',
  17744.         rel: 'noopener noreferrer',
  17745.         'data-action': 'thread'
  17746.       }, a.createElement('i', {
  17747.         className: 'icon icon-mobile'
  17748.       }), a.createElement('span', {
  17749.         className: 'text'
  17750.       }, g('View all comments')), a.createElement('span', {
  17751.         className: 'mobile-text'
  17752.       }, g('All Comments')))),
  17753.       a.createElement('li', {
  17754.         key: 'sponsored-1',
  17755.         className: 'bullet',
  17756.         'aria-hidden': 'true'
  17757.       }, '•')
  17758.     ] : null, e(c.post, [
  17759.       'canBeShared'
  17760.     ]) ? a.createElement('li', {
  17761.       id: 'comment__share-' + e(c.post, [
  17762.         'id'
  17763.       ], ''),
  17764.       className: 'comment__share'
  17765.     }, a.createElement('a', {
  17766.       className: 'toggle',
  17767.       href: '#',
  17768.       'data-action': 'expand-share'
  17769.     }, a.createElement('i', {
  17770.       className: 'icon icon-share'
  17771.     }), a.createElement('span', {
  17772.       className: 'text'
  17773.     }, g('Share'), ' ›')), a.createElement('ul', {
  17774.       className: 'comment-share__buttons'
  17775.     }, c.disableSocialShare ? null : a.createElement('div', {
  17776.       className: 'comment-share__social-share-buttons'
  17777.     }, a.createElement('li', {
  17778.       className: 'twitter share__button-container'
  17779.     }, a.createElement('button', {
  17780.       className: 'share__button icon icon-twitter-x',
  17781.       'data-action': 'share:twitter',
  17782.       'aria-label': 'Share comment on X (Twitter)'
  17783.     })), a.createElement('li', {
  17784.       className: 'facebook share__button-container'
  17785.     }, a.createElement('button', {
  17786.       className: 'share__button icon icon-facebook',
  17787.       'data-action': 'share:facebook',
  17788.       'aria-label': 'Share comment on Facebook'
  17789.     }))), a.createElement('li', {
  17790.       className: 'link share__button-container'
  17791.     }, a.createElement('button', {
  17792.       className: 'share__button icon icon-link',
  17793.       value: e(c.post, [
  17794.         'shortLink'
  17795.       ], ''),
  17796.       name: g('Link'),
  17797.       title: g('Click to copy post link'),
  17798.       'data-action': 'copy-link',
  17799.       'aria-label': 'Copy link to comment'
  17800.     }), a.createElement('input', {
  17801.       className: 'share__button link_url',
  17802.       value: e(c.post, [
  17803.         'shortLink'
  17804.       ], ''),
  17805.       name: g('Link'),
  17806.       title: g('Click to copy post link'),
  17807.       'data-action': 'copy-link',
  17808.       readOnly: !0
  17809.     })))) : null, e(c.post, [
  17810.       'isDeleted'
  17811.     ]) ? null : a.createElement('li', {
  17812.       className: 'realtime',
  17813.       'data-role': 'realtime-notification:' + e(c.post, [
  17814.         'id'
  17815.       ], '')
  17816.     }, a.createElement('span', {
  17817.       style: {
  17818.         display: 'none'
  17819.       },
  17820.       className: k
  17821.     }), a.createElement('a', {
  17822.       style: {
  17823.         display: 'none'
  17824.       },
  17825.       href: '#',
  17826.       className: l
  17827.     })), e(c.post, [
  17828.       'isSponsored'
  17829.     ]) ? a.createElement('li', {
  17830.       className: 'feedback'
  17831.     }, a.createElement('button', {
  17832.       'data-action': 'feedback'
  17833.     }, g('Leave Feedback'))) : null)
  17834.   };
  17835.   return h
  17836. });
  17837. var _extends = Object.assign || function (a) {
  17838.   for (var b = 1; b < arguments.length; b++) {
  17839.     var c = arguments[b];
  17840.     for (var d in c) Object.prototype.hasOwnProperty.call(c, d) && (a[d] = c[d])
  17841.   }
  17842.   return a
  17843. };
  17844. define('templates/lounge/partials/postMenu', [
  17845.   'react',
  17846.   'core/config/urls',
  17847.   'core/strings',
  17848.   'core/switches',
  17849.   'core/utils/object/get'
  17850. ], function (a, b, c, d, e) {
  17851.   'use strict';
  17852.   var f = c.gettext,
  17853.   g = function (a, c, d, g) {
  17854.     var h = [
  17855.     ],
  17856.     i = e(c, [
  17857.       'thread',
  17858.       'canModerate'
  17859.     ]),
  17860.     j = e(c, [
  17861.       'isRegistered'
  17862.     ]),
  17863.     k = j && e(a, [
  17864.       'author'
  17865.     ]) && e(a, [
  17866.       'author',
  17867.       'id'
  17868.     ]) === e(c, [
  17869.       'id'
  17870.     ]);
  17871.     if (i) {
  17872.       if (h = [
  17873.         {
  17874.           link: '#',
  17875.           action: 'spam',
  17876.           text: f('Mark as Spam')
  17877.         },
  17878.         {
  17879.           link: '#',
  17880.           action: 'delete',
  17881.           text: f('Delete')
  17882.         },
  17883.         {
  17884.           link: '#',
  17885.           action: 'blacklist',
  17886.           text: f('Ban User')
  17887.         },
  17888.         {
  17889.           link: b.moderate + 'approved/search/id:' + e(a, [
  17890.             'id'
  17891.           ], ''),
  17892.           action: 'moderate',
  17893.           target: '_blank',
  17894.           rel: 'noopener noreferrer',
  17895.           text: f('Moderate')
  17896.         },
  17897.         {
  17898.           link: '#',
  17899.           action: e(a, [
  17900.             'isHighlighted'
  17901.           ]) ? 'unhighlight' : 'highlight',
  17902.           text: f(e(a, [
  17903.             'isHighlighted'
  17904.           ]) ? 'Stop featuring' : 'Feature this comment'),
  17905.           className: 'highlight-toggle'
  17906.         }
  17907.       ], d && !a.author.isAnonymous) {
  17908.         var l = 4;
  17909.         h.splice(l, 0, {
  17910.           link: '#',
  17911.           action: 'manage-badges',
  17912.           text: f('Manage Badges')
  17913.         })
  17914.       }
  17915.       k || g || h.unshift({
  17916.         link: '#',
  17917.         action: 'block-user',
  17918.         text: f('Block User')
  17919.       })
  17920.     } else k ? h = [
  17921.       {
  17922.         link: '#',
  17923.         action: 'delete',
  17924.         text: f('Delete')
  17925.       },
  17926.       {
  17927.         link: '#',
  17928.         action: 'flag',
  17929.         text: f(e(a, [
  17930.           'isFlaggedByUser'
  17931.         ]) ? 'Flagged' : 'Flag as inappropriate')
  17932.       }
  17933.     ] : j && (h = [
  17934.       {
  17935.         link: '#',
  17936.         action: 'block-user',
  17937.         text: f('Block User')
  17938.       },
  17939.       {
  17940.         link: '#',
  17941.         action: 'flag',
  17942.         text: f(e(a, [
  17943.           'isFlaggedByUser'
  17944.         ]) ? 'Flagged' : 'Flag as inappropriate')
  17945.       }
  17946.     ]);
  17947.     return h
  17948.   },
  17949.   h = function (b) {
  17950.     var c = null,
  17951.     h = e(b.session, [
  17952.       'thread',
  17953.       'canModerate'
  17954.     ]),
  17955.     i = d.isFeatureActive('sso_less_branding', {
  17956.       forum: b.post.forum
  17957.     }),
  17958.     j = b.forum && b.forum.settings && b.forum.settings.badgesEnabled,
  17959.     k = d.isFeatureActive('embed_refresh', {
  17960.       forum: b.post.forum
  17961.     }),
  17962.     l = g(b.post, b.session, j, i);
  17963.     return e(b.post, [
  17964.       'id'
  17965.     ]) && e(b.post, [
  17966.       'isMinimized'
  17967.     ]) !== !0 && e(b.post, [
  17968.       'isDeleted'
  17969.     ]) !== !0 && e(b.post, [
  17970.       'author',
  17971.       'isBlocked'
  17972.     ]) !== !0 && e(b.post, [
  17973.       'sb'
  17974.     ]) !== !0 && (l.length ? c = a.createElement('div', null, a.createElement('a', {
  17975.       className: 'dropdown-toggle',
  17976.       'data-toggle': 'dropdown',
  17977.       href: '#'
  17978.     }, k ? a.createElement('span', {
  17979.       className: 'dropdown-toggle-icon' + (h ? ' moderator-menu-options' : '')
  17980.     }) : a.createElement('b', {
  17981.       className: 'caret' + (h ? ' moderator-menu-options' : '')
  17982.     })), a.createElement('ul', {
  17983.       className: 'dropdown-menu' + (k ? ' dropdown-menu--refresh' : '')
  17984.     }, l.map(function (b) {
  17985.       var c = {
  17986.       };
  17987.       return b.rel && (c.rel = b.rel),
  17988.       b.target && (c.target = b.target),
  17989.       a.createElement('li', {
  17990.         key: b.action,
  17991.         className: 'dropdown-item ' + (b.className || '')
  17992.       }, a.createElement('a', _extends({
  17993.         className: 'dropdown-link',
  17994.         href: b.link,
  17995.         'data-action': b.action,
  17996.         role: 'menuitem'
  17997.       }, c), b.text))
  17998.     }))) : i || (c = a.createElement('a', {
  17999.       className: 'dropdown-toggle',
  18000.       href: '#',
  18001.       'data-action': 'flag',
  18002.       'data-role': 'flag',
  18003.       title: f('Flag as inappropriate')
  18004.     }, a.createElement('i', {
  18005.       'aria-hidden': 'true',
  18006.       className: 'icon icon-flag'
  18007.     })))),
  18008.     a.createElement('ul', {
  18009.       className: 'post-menu dropdown' + (k ? ' post-menu--refresh' : ''),
  18010.       'data-role': 'menu',
  18011.       'data-view-id': 'post-menu',
  18012.       'data-post-id': e(b.post, [
  18013.         'id'
  18014.       ])
  18015.     }, a.createElement('li', {
  18016.       className: 'post-menu-item collapse'
  18017.     }, a.createElement('a', {
  18018.       href: '#',
  18019.       'data-action': 'collapse',
  18020.       title: f('Collapse'),
  18021.       name: f('Collapse')
  18022.     }, a.createElement('span', null, '−'))), a.createElement('li', {
  18023.       className: 'post-menu-item expand'
  18024.     }, a.createElement('a', {
  18025.       href: '#',
  18026.       'data-action': 'collapse',
  18027.       title: f('Expand'),
  18028.       name: f('Collapse')
  18029.     }, a.createElement('span', null, '+'))), null === c ? null : a.createElement('li', {
  18030.       className: (h ? 'moderator-menu-options' : '') + ' post-menu-item',
  18031.       role: 'menuitem'
  18032.     }, c))
  18033.   };
  18034.   return h
  18035. }),
  18036. define('templates/lounge/partials/postUserAvatar', [
  18037.   'react',
  18038.   'core/strings',
  18039.   'core/switches',
  18040.   'core/utils',
  18041.   'core/utils/object/get',
  18042.   'templates/lounge/partials/userAvatar'
  18043. ], function (a, b, c, d, e, f) {
  18044.   'use strict';
  18045.   var g = b.gettext,
  18046.   h = d.getInitials,
  18047.   i = function (b) {
  18048.     var d = c.isFeatureActive('embed_refresh', {
  18049.       forum: b.forum && b.forum.id
  18050.     }),
  18051.     i = d ? 'user user--refresh' : 'user',
  18052.     j = d ? 'user image-refresh' : 'user',
  18053.     k = void 0;
  18054.     return k = e(b.post, [
  18055.       'author',
  18056.       'isRegistered'
  18057.     ]) && e(b.post, [
  18058.       'isMinimized'
  18059.     ]) !== !0 ? a.createElement('div', {
  18060.       className: 'avatar hovercard'
  18061.     }, a.createElement(f, {
  18062.       defaultAvatarUrl: b.defaultAvatarUrl,
  18063.       forum: b.forum,
  18064.       user: b.post.author,
  18065.       hasForumAvatar: b.hasForumAvatar
  18066.     })) : e(b.post, [
  18067.       'author',
  18068.       'hasSponsoredAvatar'
  18069.     ]) ? a.createElement('div', {
  18070.       className: 'avatar'
  18071.     }, a.createElement('div', {
  18072.       className: 'user'
  18073.     }, a.createElement('img', {
  18074.       src: b.defaultAvatarUrl,
  18075.       'data-src': e(b.post, [
  18076.         'author',
  18077.         'avatar',
  18078.         'cache'
  18079.       ], ''),
  18080.       className: 'user',
  18081.       alt: g('Avatar')
  18082.     }))) : a.createElement('div', {
  18083.       className: 'avatar'
  18084.     }, a.createElement('div', {
  18085.       className: i
  18086.     }, d && !b.hasForumAvatar ? a.createElement('div', null, h(b.post.author.name) || 'G') : a.createElement('img', {
  18087.       src: b.defaultAvatarUrl,
  18088.       className: j,
  18089.       alt: g('Avatar')
  18090.     })))
  18091.   };
  18092.   return i
  18093. }),
  18094. define('templates/lounge/partials/postWrapper', [
  18095.   'react',
  18096.   'core/strings',
  18097.   'core/switches',
  18098.   'core/utils/object/get',
  18099.   'templates/lounge/partials/postMenu'
  18100. ], function (a, b, c, d, e) {
  18101.   'use strict';
  18102.   var f = b.gettext,
  18103.   g = function (b) {
  18104.     var g = [
  18105.       'post-content',
  18106.       d(b.post, [
  18107.         'isRealtime'
  18108.       ]) && 'new',
  18109.       d(b.session, [
  18110.         'isRegistered'
  18111.       ]) && d(b.post, [
  18112.         'author',
  18113.         'id'
  18114.       ]) === d(b.session, [
  18115.         'id'
  18116.       ]) && 'authored-by-session-user'
  18117.     ].filter(Boolean).join(' ');
  18118.     return [a.createElement('div', {
  18119.       key: 'post-wrapper-content',
  18120.       'data-role': 'post-content',
  18121.       className: g,
  18122.       tabIndex: 0
  18123.     }, a.createElement('div', {
  18124.       className: 'indicator'
  18125.     }), c.isFeatureActive('embed_refresh', {
  18126.       forum: b.forum && b.forum.id
  18127.     }) ? a.createElement('span', {
  18128.       className: 'pinned-icon'
  18129.     }) : null, a.createElement(e, {
  18130.       post: b.post,
  18131.       session: b.session,
  18132.       forum: b.forum
  18133.     }), b.children, a.createElement('div', {
  18134.       className: 'moderate-form blacklist-form',
  18135.       'data-role': 'blacklist-form'
  18136.     }), a.createElement('div', {
  18137.       className: 'moderate-form flag-form',
  18138.       'data-role': 'flagging-form'
  18139.     }), a.createElement('div', {
  18140.       className: 'badges-form',
  18141.       'data-role': 'badges-form'
  18142.     }), a.createElement('div', {
  18143.       className: 'reply-form-container',
  18144.       'data-role': 'reply-form'
  18145.     })),
  18146.     a.createElement('div', {
  18147.       className: 'children',
  18148.       key: 'post-wrapper-children'
  18149.     }, a.createElement('ul', {
  18150.       'data-role': 'children'
  18151.     }), a.createElement('div', {
  18152.       className: 'show-children-wrapper ' + (b.post.hasMore ? '' : 'hidden')
  18153.     }, a.createElement('a', {
  18154.       className: 'show-children',
  18155.       id: 'post-' + b.post.id + '-show-children',
  18156.       'data-action': 'show-children',
  18157.       href: '#'
  18158.     }, f('Show more replies'))))]
  18159.   };
  18160.   return g
  18161. }),
  18162. define('templates/lounge/post', [
  18163.   'react',
  18164.   'core/constants/voteConstants',
  18165.   'core/strings',
  18166.   'core/switches',
  18167.   'core/utils/object/get',
  18168.   'core/utils/threadRatingsHelpers',
  18169.   'templates/lounge/partials/postFooter',
  18170.   'templates/lounge/partials/postUserAvatar',
  18171.   'templates/lounge/partials/postWrapper',
  18172.   'templates/lounge/partials/profileLink',
  18173.   'templates/lounge/partials/userBadges'
  18174. ], function (a, b, c, d, e, f, g, h, i, j, k) {
  18175.   'use strict';
  18176.   var l = c.gettext,
  18177.   m = function (a) {
  18178.     var b = e(a.parentPost, [
  18179.       'author',
  18180.       'id'
  18181.     ]),
  18182.     c = e(a.session, [
  18183.       'blockedUserIdSet'
  18184.     ]);
  18185.     return a.post.hideParent || !(!b || !c) && c.has(b)
  18186.   },
  18187.   n = function (b) {
  18188.     return e(b.post, [
  18189.       'author',
  18190.       'badge'
  18191.     ]) ? a.createElement('span', {
  18192.       className: 'badge',
  18193.       'data-type': 'tracked-badge'
  18194.     }, b.hasEmbedRefreshV2 ? a.createElement('span', {
  18195.       className: 'badge-content'
  18196.     }, e(b.post, [
  18197.       'author',
  18198.       'badge'
  18199.     ], null)) : e(b.post, [
  18200.       'author',
  18201.       'badge'
  18202.     ], null)) : e(b.post, [
  18203.       'author',
  18204.       'thread',
  18205.       'canModerate'
  18206.     ]) ? a.createElement('span', {
  18207.       className: 'badge moderator'
  18208.     }, b.hasEmbedRefreshV2 ? a.createElement('span', {
  18209.       className: 'badge-content'
  18210.     }, l('Mod')) : l('Mod')) : b.opBadgeEnabled && e(b.post, [
  18211.       'author',
  18212.       'thread',
  18213.       'isOP'
  18214.     ]) ? a.createElement('span', {
  18215.       className: 'badge'
  18216.     }, b.hasEmbedRefreshV2 ? a.createElement('span', {
  18217.       className: 'badge-content'
  18218.     }, l('OP')) : l('OP')) : null
  18219.   },
  18220.   o = function (b) {
  18221.     var c = e(b.author, [
  18222.       'isFollowing'
  18223.     ]),
  18224.     f = e(b.author, [
  18225.       'id'
  18226.     ]),
  18227.     g = e(b.session, [
  18228.       'id'
  18229.     ]);
  18230.     return !d.isFeatureActive('embed_refresh', {
  18231.       forum: b.forumId
  18232.     }) || f === g || e(b.author, [
  18233.       'isPrivate'
  18234.     ]) ? null : a.createElement('a', {
  18235.       'data-action': 'follow',
  18236.       'data-user': f,
  18237.       className: 'follow-user-container',
  18238.       tabIndex: '0'
  18239.     }, a.createElement('span', {
  18240.       className: 'follow-user' + (c ? ' is-following' : ''),
  18241.       'aria-label': l(c ? 'Unfollow' : 'Follow'),
  18242.       title: l(c ? 'Unfollow' : 'Follow')
  18243.     }))
  18244.   },
  18245.   p = function (b) {
  18246.     return !b.parentPost && f.isThreadRatingsEnabled(b.thread, b.forum) && b.post.author.threadRating ? a.createElement('span', {
  18247.       className: 'post-ratings'
  18248.     }, b.hasEmbedRefresh ? null : a.createElement('span', {
  18249.       className: 'bullet time-ago-bullet',
  18250.       'aria-hidden': 'true'
  18251.     }, '•'), a.createElement('span', {
  18252.       className: 'post-ratings-stars'
  18253.     }, a.createElement('div', {
  18254.       className: 'post-stars active',
  18255.       style: {
  18256.         width: Math.round(20 * b.post.author.threadRating) + '%'
  18257.       }
  18258.     }, a.createElement('div', {
  18259.       className: 'rating-star'
  18260.     }, '★'), a.createElement('div', {
  18261.       className: 'rating-star'
  18262.     }, '★'), a.createElement('div', {
  18263.       className: 'rating-star'
  18264.     }, '★'), a.createElement('div', {
  18265.       className: 'rating-star'
  18266.     }, '★'), a.createElement('div', {
  18267.       className: 'rating-star'
  18268.     }, '★')), a.createElement('div', {
  18269.       className: 'post-stars inactive'
  18270.     }, a.createElement('div', {
  18271.       className: 'rating-star'
  18272.     }, '★'), a.createElement('div', {
  18273.       className: 'rating-star'
  18274.     }, '★'), a.createElement('div', {
  18275.       className: 'rating-star'
  18276.     }, '★'), a.createElement('div', {
  18277.       className: 'rating-star'
  18278.     }, '★'), a.createElement('div', {
  18279.       className: 'rating-star'
  18280.     }, '★')))) : null
  18281.   },
  18282.   q = function (b) {
  18283.     return a.createElement('span', {
  18284.       className: 'post-meta'
  18285.     }, b.hasEmbedRefresh ? null : a.createElement('span', {
  18286.       className: 'bullet time-ago-bullet',
  18287.       'aria-hidden': 'true'
  18288.     }, '•'), ' ', e(b.post, [
  18289.       'id'
  18290.     ]) ? a.createElement('a', {
  18291.       href: e(b.post, [
  18292.         'permalink'
  18293.       ], ''),
  18294.       'data-role': 'relative-time',
  18295.       className: 'time-ago' + (b.hasEmbedRefresh && !b.hasEmbedRefreshV2 ? ' icon icon-clock' : ''),
  18296.       title: e(b.post, [
  18297.         'formattedCreatedAt'
  18298.       ], '')
  18299.     }, e(b.post, [
  18300.       'relativeCreatedAt'
  18301.     ], null)) : a.createElement('span', {
  18302.       className: 'time-ago' + (b.hasEmbedRefresh && !b.hasEmbedRefreshV2 ? ' icon icon-clock' : ''),
  18303.       'data-role': 'relative-time',
  18304.       title: e(b.post, [
  18305.         'formattedCreatedAt'
  18306.       ], '')
  18307.     }, e(b.post, [
  18308.       'relativeCreatedAt'
  18309.     ], null)), ' ', e(b.post, [
  18310.       'isEdited'
  18311.     ]) ? a.createElement('span', null, b.hasEmbedRefresh ? null : a.createElement('span', {
  18312.       className: 'bullet time-ago-bullet',
  18313.       'aria-hidden': 'true'
  18314.     }, '•'), ' ', a.createElement('span', {
  18315.       className: 'has-edit',
  18316.       'data-role': 'has-edit'
  18317.     }, l('edited'))) : null)
  18318.   },
  18319.   r = function (c) {
  18320.     return [a.createElement('div', {
  18321.       key: 'post-alert',
  18322.       role: 'alert'
  18323.     }),
  18324.     a.createElement(i, {
  18325.       key: 'post-wrapper',
  18326.       post: c.post,
  18327.       session: c.session,
  18328.       forum: c.forum
  18329.     }, a.createElement(h, {
  18330.       post: c.post,
  18331.       forum: c.forum,
  18332.       defaultAvatarUrl: c.defaultAvatarUrl,
  18333.       hasForumAvatar: c.hasForumAvatar
  18334.     }), a.createElement('div', {
  18335.       className: 'post-body'
  18336.     }, a.createElement('header', {
  18337.       className: 'comment__header'
  18338.     }, a.createElement('span', {
  18339.       className: 'post-byline'
  18340.     }, e(c.post, [
  18341.       'author',
  18342.       'isRegistered'
  18343.     ]) ? a.createElement('span', null, c.isInHome && e(c.post, [
  18344.       'author',
  18345.       'isPowerContributor'
  18346.     ]) ? a.createElement('a', {
  18347.       href: '#',
  18348.       className: 'icon__position -inline -allstar',
  18349.       'data-toggle': 'tooltip',
  18350.       'data-role': 'allstar',
  18351.       title: l('All-Star')
  18352.     }, a.createElement('span', {
  18353.       className: 'icon-allstar allstar__icon'
  18354.     })) : null, ' ', a.createElement('span', {
  18355.       className: 'author publisher-anchor-color'
  18356.     }, a.createElement(j, {
  18357.       user: e(c.post, [
  18358.         'author'
  18359.       ]),
  18360.       forumId: c.post.forum
  18361.     }, e(c.post, [
  18362.       'author',
  18363.       'name'
  18364.     ], null))), ' ', a.createElement(n, {
  18365.       post: c.post,
  18366.       forumId: c.forum.id,
  18367.       hasEmbedRefreshV2: d.isFeatureActive('embed_refresh', {
  18368.         forum: c.forum && c.forum.id
  18369.       }) && d.isFeatureActive('embed_refresh_v2', {
  18370.         forum: c.forum && c.forum.id
  18371.       }),
  18372.       opBadgeEnabled: c.isOnChannel
  18373.     }), d.isFeatureActive('sso_less_branding', {
  18374.       forum: c.forum.id
  18375.     }) ? null : a.createElement(o, {
  18376.       author: e(c.post, [
  18377.         'author'
  18378.       ]),
  18379.       session: c.session,
  18380.       forumId: c.forum.id
  18381.     }), a.createElement(k, {
  18382.       forum: c.forum,
  18383.       user: e(c.post, [
  18384.         'author'
  18385.       ]),
  18386.       context: 'post',
  18387.       limit: 4,
  18388.       postId: e(c.post, [
  18389.         'id'
  18390.       ])
  18391.     })) : a.createElement('span', {
  18392.       className: 'author'
  18393.     }, e(c.post, [
  18394.       'author',
  18395.       'name'
  18396.     ], null)), c.parentPost && !m(c) ? a.createElement('span', {
  18397.       className: 'parent-link-container'
  18398.     }, ' ', a.createElement('a', {
  18399.       href: e(c.parentPost, [
  18400.         'permalink'
  18401.       ], ''),
  18402.       className: 'parent-link',
  18403.       'data-role': 'parent-link'
  18404.     }, a.createElement('i', {
  18405.       'aria-label': 'in reply to',
  18406.       className: 'icon-forward',
  18407.       title: 'in reply to'
  18408.     }), ' ', e(c.parentPost, [
  18409.       'author',
  18410.       'name'
  18411.     ], null))) : null), ' ', d.isFeatureActive('embed_refresh', {
  18412.       forum: c.forum && c.forum.id
  18413.     }) ? [
  18414.       a.createElement(p, {
  18415.         parentPost: e(c, [
  18416.           'parentPost'
  18417.         ]),
  18418.         thread: c.thread,
  18419.         forum: c.forum,
  18420.         post: c.post,
  18421.         key: 'ratings',
  18422.         hasEmbedRefresh: !0
  18423.       }),
  18424.       ' ',
  18425.       a.createElement(q, {
  18426.         post: c.post,
  18427.         key: 'meta',
  18428.         hasEmbedRefresh: !0,
  18429.         hasEmbedRefreshV2: d.isFeatureActive('embed_refresh_v2', {
  18430.           forum: c.forum && c.forum.id
  18431.         })
  18432.       })
  18433.     ] : [
  18434.       a.createElement(q, {
  18435.         post: c.post,
  18436.         key: 'meta'
  18437.       }),
  18438.       ' ',
  18439.       a.createElement(p, {
  18440.         parentPost: e(c, [
  18441.           'parentPost'
  18442.         ]),
  18443.         thread: c.thread,
  18444.         forum: c.forum,
  18445.         post: c.post,
  18446.         key: 'ratings'
  18447.       })
  18448.     ], ' ', c.stateByline ? a.createElement('span', {
  18449.       className: 'state-byline state-byline-' + e(c.stateByline, [
  18450.         'style'
  18451.       ], '')
  18452.     }, a.createElement('span', {
  18453.       className: 'icon-mobile icon-' + e(c.stateByline, [
  18454.         'icon'
  18455.       ], ''),
  18456.       'aria-hidden': 'true'
  18457.     }), ' ', a.createElement('span', {
  18458.       className: 'text'
  18459.     }, e(c.stateByline, [
  18460.       'text'
  18461.     ], null))) : null), a.createElement('div', {
  18462.       className: 'post-body-inner'
  18463.     }, a.createElement('div', {
  18464.       className: 'post-message-container',
  18465.       'data-role': 'message-container'
  18466.     }, a.createElement('div', {
  18467.       className: 'publisher-anchor-color',
  18468.       'data-role': 'message-content'
  18469.     }, a.createElement('div', {
  18470.       className: 'post-message ' + (e(c.post, [
  18471.         'message'
  18472.       ]) ? '' : 'loading'),
  18473.       'data-role': 'message',
  18474.       dir: 'auto'
  18475.     }, '' === e(c.post, [
  18476.       'message'
  18477.     ]) ? a.createElement('p', null, a.createElement('i', null, l('This comment has no content.'))) : a.createElement('div', {
  18478.       dangerouslySetInnerHTML: {
  18479.         __html: e(c.post, [
  18480.           'message'
  18481.         ], '')
  18482.       }
  18483.     })), a.createElement('span', {
  18484.       className: 'post-media'
  18485.     }, a.createElement('ul', {
  18486.       'data-role': 'post-media-list'
  18487.     })))), a.createElement('a', {
  18488.       className: 'see-more hidden',
  18489.       title: l('see more'),
  18490.       'data-action': 'see-more'
  18491.     }, l('see more'))), a.createElement('footer', {
  18492.       className: 'comment__footer'
  18493.     }, a.createElement(g, {
  18494.       post: c.post,
  18495.       session: c.session,
  18496.       disableSocialShare: e(c.forum, [
  18497.         'settings',
  18498.         'disableSocialShare'
  18499.       ], !1),
  18500.       votingType: e(c.forum, [
  18501.         'votingType'
  18502.       ], b.VOTING_TYPES.DEFAULT_VOTING_TYPE),
  18503.       forumId: c.forum && c.forum.id
  18504.     }))))]
  18505.   };
  18506.   return r
  18507. }),
  18508. define('templates/lounge/postDeleted', [
  18509.   'react',
  18510.   'core/config/urls',
  18511.   'core/strings',
  18512.   'core/utils/object/get',
  18513.   'templates/lounge/partials/postMenu',
  18514.   'templates/lounge/partials/postWrapper'
  18515. ], function (a, b, c, d, e, f) {
  18516.   'use strict';
  18517.   var g = c.gettext,
  18518.   h = function (c) {
  18519.     return a.createElement(f, {
  18520.       post: c.post,
  18521.       session: c.session,
  18522.       forum: c.forum
  18523.     }, a.createElement('div', {
  18524.       className: 'avatar'
  18525.     }, a.createElement('img', {
  18526.       'data-src': d(b, [
  18527.         'avatar',
  18528.         'generic'
  18529.       ], ''),
  18530.       className: 'user',
  18531.       alt: g('Avatar')
  18532.     })), a.createElement('div', {
  18533.       className: 'post-body'
  18534.     }, a.createElement('div', {
  18535.       className: 'post-message'
  18536.     }, a.createElement('p', null, g('This comment was deleted.'))), a.createElement('header', null, a.createElement(e, {
  18537.       post: c.post,
  18538.       session: c.session,
  18539.       forum: c.forum
  18540.     }))))
  18541.   };
  18542.   return h
  18543. }),
  18544. define('templates/lounge/postBlocked', [
  18545.   'react',
  18546.   'core/config/urls',
  18547.   'core/strings',
  18548.   'core/utils/object/get',
  18549.   'core/switches',
  18550.   'templates/lounge/partials/postWrapper'
  18551. ], function (a, b, c, d, e, f) {
  18552.   'use strict';
  18553.   var g = c.gettext,
  18554.   h = function (c) {
  18555.     return a.createElement(f, {
  18556.       post: c.post,
  18557.       session: c.session,
  18558.       forum: c.forum
  18559.     }, a.createElement('div', {
  18560.       className: 'avatar'
  18561.     }, a.createElement('img', {
  18562.       'data-src': d(b, [
  18563.         'avatar',
  18564.         'generic'
  18565.       ], ''),
  18566.       className: 'user',
  18567.       alt: g('Avatar')
  18568.     })), a.createElement('div', {
  18569.       className: 'post-body'
  18570.     }, a.createElement('div', {
  18571.       className: 'post-message'
  18572.     }, a.createElement('p', null, g('Content unavailable')))))
  18573.   };
  18574.   return h
  18575. }),
  18576. define('templates/lounge/postMinimized', [
  18577.   'react',
  18578.   'core/strings',
  18579.   'core/utils/object/get',
  18580.   'templates/lounge/partials/postMenu',
  18581.   'templates/lounge/partials/postUserAvatar',
  18582.   'templates/lounge/partials/postWrapper'
  18583. ], function (a, b, c, d, e, f) {
  18584.   'use strict';
  18585.   var g = b.gettext,
  18586.   h = function (b) {
  18587.     var d = void 0;
  18588.     return d = c(b.post, [
  18589.       'isApproved'
  18590.     ]) ? a.createElement('p', null, g('Comment score below threshold.'), ' ', a.createElement('a', {
  18591.       href: '#',
  18592.       'data-action': 'reveal'
  18593.     }, g('Show comment.'))) : b.created ? a.createElement('p', null, g('Your comment is awaiting moderation.'), ' ', a.createElement('a', {
  18594.       href: '#',
  18595.       'data-action': 'reveal'
  18596.     }, g('See your comment.')), ' ', a.createElement('a', {
  18597.       href: 'https://help.disqus.com/customer/portal/articles/466223',
  18598.       className: 'help-icon',
  18599.       title: g('Why?'),
  18600.       target: '_blank',
  18601.       rel: 'noopener noreferrer'
  18602.     }), ' ') : a.createElement('p', null, g('This comment is awaiting moderation.'), ' ', a.createElement('a', {
  18603.       href: '#',
  18604.       'data-action': 'reveal'
  18605.     }, g('Show comment.')))
  18606.   },
  18607.   i = function (b) {
  18608.     return a.createElement(f, {
  18609.       post: b.post,
  18610.       session: b.session,
  18611.       forum: b.forum
  18612.     }, a.createElement(e, {
  18613.       post: b.post,
  18614.       forum: b.forum,
  18615.       defaultAvatarUrl: b.defaultAvatarUrl
  18616.     }), a.createElement('div', {
  18617.       className: 'post-body'
  18618.     }, a.createElement('div', {
  18619.       className: 'post-message publisher-anchor-color'
  18620.     }, a.createElement(h, {
  18621.       create: b.created,
  18622.       post: b.post
  18623.     })), a.createElement('header', null, a.createElement('div', {
  18624.       className: 'post-meta'
  18625.     }, g('This comment is awaiting moderation.')), a.createElement(d, {
  18626.       post: b.post,
  18627.       session: b.session,
  18628.       forum: b.forum
  18629.     }))))
  18630.   };
  18631.   return i
  18632. }),
  18633. define('templates/lounge/postSpam', [
  18634.   'react',
  18635.   'core/config/urls',
  18636.   'core/strings',
  18637.   'core/utils/object/get',
  18638.   'templates/lounge/partials/postMenu',
  18639.   'templates/lounge/partials/postWrapper'
  18640. ], function (a, b, c, d, e, f) {
  18641.   'use strict';
  18642.   var g = c.gettext,
  18643.   h = function (c) {
  18644.     return a.createElement(f, {
  18645.       post: c.post,
  18646.       session: c.session,
  18647.       forum: c.forum
  18648.     }, a.createElement('div', {
  18649.       className: 'avatar'
  18650.     }, a.createElement('img', {
  18651.       'data-src': d(b, [
  18652.         'avatar',
  18653.         'generic'
  18654.       ], ''),
  18655.       className: 'user',
  18656.       alt: g('Avatar')
  18657.     })), a.createElement('div', {
  18658.       className: 'post-body'
  18659.     }, a.createElement('div', {
  18660.       className: 'post-message'
  18661.     }, a.createElement('p', null, g('This comment was marked as spam.'))), a.createElement('header', null, a.createElement(e, {
  18662.       post: c.post,
  18663.       session: c.session,
  18664.       forum: c.forum
  18665.     }))))
  18666.   };
  18667.   return h
  18668. }),
  18669. define('templates/lounge/anonUpvoteCard', [
  18670.   'react',
  18671.   'core/strings'
  18672. ], function (a, b) {
  18673.   'use strict';
  18674.   var c = b.gettext,
  18675.   d = function () {
  18676.     return a.createElement('div', {
  18677.       className: 'vote-action tooltip'
  18678.     }, c('You must sign in to up-vote this post.'))
  18679.   };
  18680.   return d
  18681. }),
  18682. define('templates/lounge/anonDownvoteCard', [
  18683.   'react',
  18684.   'core/strings'
  18685. ], function (a, b) {
  18686.   'use strict';
  18687.   var c = b.gettext,
  18688.   d = function () {
  18689.     return a.createElement('div', {
  18690.       className: 'vote-action tooltip'
  18691.     }, c('You must sign in to down-vote this post.'))
  18692.   };
  18693.   return d
  18694. }),
  18695. define('lounge/views/post', [
  18696.   'jquery',
  18697.   'underscore',
  18698.   'backbone',
  18699.   'stance',
  18700.   'react',
  18701.   'react-dom',
  18702.   'core/api',
  18703.   'core/constants/badgesConstants',
  18704.   'core/constants/voteConstants',
  18705.   'core/strings',
  18706.   'core/switches',
  18707.   'core/utils',
  18708.   'core/mixins/withAlert',
  18709.   'core/mixins/withRichMedia',
  18710.   'core/WindowBus',
  18711.   'core/bus',
  18712.   'common/urls',
  18713.   'common/views/mixins',
  18714.   'common/utils',
  18715.   'lounge/common',
  18716.   'lounge/mixins',
  18717.   'lounge/views/cards',
  18718.   'lounge/views/media',
  18719.   'lounge/views/posts/BadgesManageView',
  18720.   'lounge/views/posts/BlacklistView',
  18721.   'lounge/views/posts/PostEditView',
  18722.   'lounge/views/posts/PostReplyView',
  18723.   'lounge/views/posts/TypingUserView',
  18724.   'lounge/views/posts/FlaggingView',
  18725.   'core/views/ClickTooltip',
  18726.   'core/views/Tooltip',
  18727.   'templates/lounge/partials/postFooter',
  18728.   'templates/lounge/partials/postMenu',
  18729.   'templates/lounge/partials/userBadges',
  18730.   'templates/lounge/post',
  18731.   'templates/lounge/postDeleted',
  18732.   'templates/lounge/postBlocked',
  18733.   'templates/lounge/postMinimized',
  18734.   'templates/lounge/postSpam',
  18735.   'templates/lounge/anonUpvoteCard',
  18736.   'templates/lounge/anonDownvoteCard'
  18737. ], function (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, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O) {
  18738.   'use strict';
  18739.   var P = l.preventDefaultHandler,
  18740.   Q = j.get,
  18741.   R = new o,
  18742.   S = h.ACTION_TYPES,
  18743.   T = 13,
  18744.   U = c.View.extend({
  18745.     tagName: 'li',
  18746.     className: 'post',
  18747.     events: {
  18748.       'click > [data-role=post-content] [data-action]': 'performAction',
  18749.       'keydown > [data-role=post-content] [data-action]': function (a) {
  18750.         a.keyCode && a.keyCode !== T || this.performAction(a)
  18751.       },
  18752.       'click [data-role=allstar]': function () {
  18753.         R.broadcast('click:allstar')
  18754.       }
  18755.     },
  18756.     actions: {
  18757.       upvote: P(function (a) {
  18758.         this.handleVote(a, 1)
  18759.       }),
  18760.       downvote: P(function (a) {
  18761.         this.handleVote(a, - 1)
  18762.       }),
  18763.       reply: 'handleReply',
  18764.       flag: 'handleFlag',
  18765.       'block-user': 'handleBlockUser',
  18766.       edit: 'handleEdit',
  18767.       'delete': 'handleDelete',
  18768.       spam: 'handleSpam',
  18769.       blacklist: 'handleBlacklist',
  18770.       'manage-badges': 'handleManageBadges',
  18771.       highlight: 'handleHighlight',
  18772.       unhighlight: 'handleUnhighlight',
  18773.       collapse: 'handleCollapse',
  18774.       reveal: 'handleReveal',
  18775.       'expand-share': 'handleExpandShare',
  18776.       'share:twitter': '_onShare',
  18777.       'share:facebook': '_onShare',
  18778.       'copy-link': 'handleCopyLink',
  18779.       follow: 'toggleFollow'
  18780.     },
  18781.     performAction: function (c) {
  18782.       var d = this,
  18783.       e = a(c.currentTarget).attr('data-action'),
  18784.       f = d.actions[e];
  18785.       if (f) return (b.isFunction(f) ? f : d[f]).call(d, c)
  18786.     },
  18787.     initialize: function (a) {
  18788.       var b = this;
  18789.       this.thread = a.thread,
  18790.       this.session = a.session,
  18791.       this.created = Boolean(a.created),
  18792.       this.options = a,
  18793.       this.userSuggestions = a.userSuggestions,
  18794.       this.gifPickerEnabled = Boolean(this.thread) && Boolean(this.thread.forum) && this.thread.forum.get('settings').gifPickerEnabled,
  18795.       this.config = a.config,
  18796.       this.setAlertSelector('> [role=alert]'),
  18797.       this.listenTo(this.model, {
  18798.         'change:isDeleted spam': this.removeAsDeleted,
  18799.         'change:message': this.stopLoading,
  18800.         'change:points': this.updateVotePoints,
  18801.         'change:userScore': this.updateActiveUserVote,
  18802.         'change:isFlaggedByUser': this.updateMenu,
  18803.         'change:hasMore': this.handleHasMoreChanged,
  18804.         'change:isHighlighted': function () {
  18805.           this.redraw()
  18806.         },
  18807.         'change:hideReplyPreview': this.updateHideReplyPreview,
  18808.         change: function () {
  18809.           var a = this.model.changedAttributes();
  18810.           (a.id || a.message) && (a.media && k.isFeatureActive('embed_v2', {
  18811.             forum: this.thread.forum.id
  18812.           }) && (this.shouldWaitToRenderMedia = !0, this.listenToOnce(this.model.media, 'reset', function () {
  18813.             this.shouldWaitToRenderMedia = !1,
  18814.             this.renderMedia()
  18815.           })), this.redraw())
  18816.         }
  18817.       }),
  18818.       this.model.author && (this.listenTo(this.model.author, 'change:isBlocked', function (a, c) {
  18819.         var d = a.previous('isBlocked') || !1;
  18820.         return b.flaggingView ? void b.listenToOnce(b.flaggingView, 'success cancel', b.redraw) : b.manageBadgeView ? void b.listenToOnce(b.manageBadgeView, 'success cancel', b.redraw) : void (c !== d && b.redraw())
  18821.       }), this.listenTo(this.model.author, 'change:badges', this.updateBadges), this.listenTo(this.model.author, 'change:isFollowing', this.updateFollowing)),
  18822.       this.thread.forum.get('features') || this.listenToOnce(this.thread.forum, 'change:features', this.redraw),
  18823.       this.listenTo(this.thread, 'change:ratingsEnabled', this.redraw),
  18824.       !this.model.getParent() && this.model.isAuthorSessionUser(this.session) && this.listenTo(this.thread, 'change:userRating', function () {
  18825.         this.model.author.set('threadRating', this.thread.get('userRating')),
  18826.         this.redraw()
  18827.       }),
  18828.       this.listenTo(this.model.usersTyping, 'add remove reset change', this.updateTypingCount),
  18829.       this.listenTo(this.session, 'change:id', function () {
  18830.         this.updateFooter(),
  18831.         this.updateMenu(),
  18832.         this.updateSessionClass(),
  18833.         k.isFeatureActive('embed_refresh', {
  18834.           forum: this.thread.forum.id
  18835.         }) && this.updateFollowingInitial()
  18836.       }),
  18837.       this.listenTo(t.getLounge(), 'opened:post-menu', this.positionMenu),
  18838.       this.listenTo(this.thread, 'change:ratingsEnabled', this.render),
  18839.       this.hasVisibleChildren = !1,
  18840.       this.reply = null,
  18841.       this.edit = null,
  18842.       this.parent = a.parent,
  18843.       this.trackPosition = !1,
  18844.       this.offset = {
  18845.         top: - 1,
  18846.         height: - 1
  18847.       },
  18848.       this.dim = {
  18849.         height: - 1,
  18850.         width: - 1
  18851.       },
  18852.       this.listenTo(t.getLounge(), 'domReflow', this.calcRect),
  18853.       this.isCollapseAllowed = !0,
  18854.       this.haveSubscribedToRichMediaEvents = !1
  18855.     },
  18856.     calcRect: function () {
  18857.       if (!this.trackPosition || !this.visible) return this.offset = {
  18858.         top: - 1,
  18859.         height: - 1
  18860.       },
  18861.       void (this.dim = {
  18862.         height: - 1,
  18863.         width: - 1
  18864.       });
  18865.       var a = this.contentNode;
  18866.       this.offset = a.offset(),
  18867.       this.dim = {
  18868.         height: a.height(),
  18869.         width: a.width()
  18870.       }
  18871.     },
  18872.     updatePostMetaPlacement: function () {
  18873.       var a = k.isFeatureActive('embed_refresh', {
  18874.         forum: this.thread.forum.id
  18875.       });
  18876.       if (a && !l.isMobileUserAgent()) {
  18877.         var b = a && k.isFeatureActive('embed_refresh_v2', {
  18878.           forum: this.thread.forum.id
  18879.         }),
  18880.         c = this.$el.find('.comment__header').first(),
  18881.         d = c.find('.post-meta'),
  18882.         e = 32;
  18883.         d.css({
  18884.           display: '',
  18885.           'margin-top': ''
  18886.         }),
  18887.         c.height() <= e ? d.css({
  18888.           display: 'block',
  18889.           'margin-top': b ? '' : '6px'
  18890.         }) : b && d.css({
  18891.           top: '-2px'
  18892.         })
  18893.       }
  18894.     },
  18895.     createTypingUserView: function () {
  18896.       var a = this.$el.find('[data-role=realtime-notification\\:' + this.model.id + '] .realtime-replies');
  18897.       this.typingUserView = new B({
  18898.         parentView: this,
  18899.         model: this.model,
  18900.         el: a
  18901.       })
  18902.     },
  18903.     updateTypingCount: function () {
  18904.       this.typingUserView || this.createTypingUserView(),
  18905.       this.typingUserView.render()
  18906.     },
  18907.     stopLoading: function () {
  18908.       this.contentNode.find('.loading').removeClass('loading')
  18909.     },
  18910.     updateRelativeTime: function () {
  18911.       this.contentNode.find('[data-role=relative-time]').text(this.model.getRelativeCreatedAt())
  18912.     },
  18913.     updateSessionClass: function () {
  18914.       var a = 'authored-by-session-user';
  18915.       this.model.isAuthorSessionUser(this.session) ? this.contentNode.addClass(a) : this.contentNode.removeClass(a)
  18916.     },
  18917.     updateActiveUserVote: function () {
  18918.       var a = this.model,
  18919.       b = this.contentNode.find('[data-action=upvote]'),
  18920.       c = this.contentNode.find('[data-action=downvote]');
  18921.       c.removeClass('downvoted'),
  18922.       b.removeClass('upvoted'),
  18923.       a.get('userScore') > 0 ? b.addClass('upvoted') : a.get('userScore') < 0 && c.addClass('downvoted')
  18924.     },
  18925.     updateHideReplyPreview: function () {
  18926.       var a = this.contentNode.find('a.parent-link');
  18927.       a.removeClass('parent-link'),
  18928.       a.addClass('hidden'),
  18929.       this.updatePostMetaPlacement()
  18930.     },
  18931.     updateVotePoints: function () {
  18932.       var c = this,
  18933.       d = c.model,
  18934.       e = c.contentNode.find('[data-role=likes], [data-role=dislikes]'),
  18935.       f = c.contentNode.find('[data-action=upvote], [data-action=downvote]'),
  18936.       g = function (a) {
  18937.         b.delay(function () {
  18938.           a.addClass('update'),
  18939.           b.delay(function () {
  18940.             a.removeClass('update')
  18941.           }, 1000)
  18942.         }, 500)
  18943.       };
  18944.       b.each(e, function (b, e) {
  18945.         b = a(b);
  18946.         var h = b.html(),
  18947.         j = d.get(b.attr('data-role')),
  18948.         k = a(f[e]);
  18949.         if (j = Math.max(j, 0).toString(), h !== j) {
  18950.           k.removeClass('count-' + h);
  18951.           var l = c.thread.forum.get('votingType'),
  18952.           m = l === i.VOTING_TYPES.DOWNVOTE_LIMITED || l === i.VOTING_TYPES.DOWNVOTE_DISABLED;
  18953.           l === i.VOTING_TYPES.DISABLED || 'dislikes' === b.attr('data-role') && m ? k.addClass('count-0') : (k.addClass('count-' + j), b.html(j)),
  18954.           g(b)
  18955.         }
  18956.       })
  18957.     },
  18958.     updateFooter: function () {
  18959.       var a = this.contentNode.find('footer'),
  18960.       b = F({
  18961.         post: this.getPostAttributes(),
  18962.         session: this.session.toJSON(),
  18963.         disableSocialShare: this.thread.forum.get('settings').disableSocialShare,
  18964.         votingType: this.thread.forum.get('votingType'),
  18965.         forumId: this.thread.forum.id
  18966.       });
  18967.       A.open[this.model.cid] && this.toggleReplyLink(!0),
  18968.       a.html(b),
  18969.       this.initVotersCard()
  18970.     },
  18971.     updateMenu: function () {
  18972.       var a = this.contentNode.find('[data-role=menu]'),
  18973.       b = G({
  18974.         session: this.session.toJSON(),
  18975.         post: this.getPostAttributes(),
  18976.         forum: this.thread.forum.toJSON()
  18977.       });
  18978.       a.replaceWith(b)
  18979.     },
  18980.     updateBadges: function () {
  18981.       var a = this.getPostAttributes().author,
  18982.       b = this.contentNode.find('[data-role=badges]'),
  18983.       c = H({
  18984.         forum: this.thread.forum.toJSON(),
  18985.         user: a,
  18986.         context: 'post',
  18987.         limit: 4
  18988.       });
  18989.       b.replaceWith(c),
  18990.       this.profileCard && this.profileCard.setBadges(a.badges),
  18991.       this.updatePostMetaPlacement()
  18992.     },
  18993.     updateFollowing: function () {
  18994.       var a = '[data-user=' + this.model.author.id + '][data-action=follow]';
  18995.       if (this.model.author.get('isPrivate') || this.model.author.id === this.session.user.id) return void this.$el.find(a).hide();
  18996.       var b = Boolean(this.model.author.get('isFollowing')),
  18997.       c = a + ' .follow-user',
  18998.       d = Q(b ? 'Unfollow' : 'Follow');
  18999.       this.$el.find(c).toggleClass('is-following', b),
  19000.       this.$el.find(c).attr('aria-label', d),
  19001.       this.$el.find(c).attr('title', d)
  19002.     },
  19003.     updateFollowingInitial: function () {
  19004.       (this.session.user.get('followingUserIdSet') && this.session.user.get('followingUserIdSet').has(this.model.author.id) || this.session.user.id === this.model.author.id) && this.updateFollowing()
  19005.     },
  19006.     updatePostStateClasses: function () {
  19007.       var a = this.model,
  19008.       b = a.get('isHighlighted') || a.get('isSponsored');
  19009.       this.$el.toggleClass('highlighted', Boolean(b)),
  19010.       this.contentNode.toggleClass('disabled', !a.id)
  19011.     },
  19012.     getMessageContent: function () {
  19013.       return this.messageContent && this.messageContent.length || (this.messageContent = this.contentNode.find('[data-role=message-content]')),
  19014.       this.messageContent
  19015.     },
  19016.     manageMessageHeight: function (a) {
  19017.       var b = this,
  19018.       c = b.getMessageContent(),
  19019.       d = 1.5 * b.collapsedHeight,
  19020.       e = c && c.length && c.height() || 0;
  19021.       e += a || 0,
  19022.       e > d && !b.$el.hasClass('collapsed') ? b.collapse() : b.expand(!0)
  19023.     },
  19024.     preventCollapsing: function (a) {
  19025.       a.get('deferred') || (this.expand(), this.isCollapseAllowed = !1)
  19026.     },
  19027.     markSeen: function () {
  19028.       function a() {
  19029.         c.contentNode.addClass('seen'),
  19030.         b.delay(function () {
  19031.           c.contentNode.removeClass('seen'),
  19032.           c.contentNode.removeClass('new')
  19033.         }, 10000),
  19034.         c.trackPosition = !1
  19035.       }
  19036.       var c = this,
  19037.       e = d(c);
  19038.       e.isVisible() ? a() : this.listenToOnce(e, 'enter', a)
  19039.     },
  19040.     renderMedia: function () {
  19041.       var a = this.model.media;
  19042.       if (a && a.length) {
  19043.         var c = this.$el.find('[data-role=post-media-list]');
  19044.         this.richMediaViews = this.renderRichMedia(a, c, {
  19045.           convertLinkToButton: !0,
  19046.           beforeRender: function (a) {
  19047.             this.listenTo(a.model, 'change:activated', this.preventCollapsing),
  19048.             a.relatedPost = this.model.cid
  19049.           },
  19050.           normalize: function (a) {
  19051.             var b = l.bleachFindUrls(a);
  19052.             return b.length && (a = b[0].url),
  19053.             a
  19054.           }
  19055.         }),
  19056.         !this.haveSubscribedToRichMediaEvents && this.richMediaViews.length && (this.listenTo(w.settings, 'change:collapsed', function (a, c) {
  19057.           if (c) this.manageMessageHeight();
  19058.            else {
  19059.             var d = b.reduce(this.richMediaViews, function (a, b) {
  19060.               return a + (b.model.get('deferredHeight') || 0)
  19061.             }, 0);
  19062.             this.manageMessageHeight(d)
  19063.           }
  19064.         }), this.haveSubscribedToRichMediaEvents = !0)
  19065.       }
  19066.     },
  19067.     renderSpoilers: function () {
  19068.       this.$el.find('spoiler').each(function () {
  19069.         a(this).attr('tabindex', '0')
  19070.       })
  19071.     },
  19072.     getStateByline: function () {
  19073.       var a,
  19074.       b = this.model;
  19075.       return b.get('isHighlighted') ? a = {
  19076.         icon: 'trophy',
  19077.         text: Q('Featured by %(forum)s'),
  19078.         style: 'default'
  19079.       }
  19080.        : b.get('isSponsored') ? a = {
  19081.         icon: 'trophy',
  19082.         text: Q('Sponsored on Disqus'),
  19083.         style: 'sponsored'
  19084.       }
  19085.        : b.isAuthorSessionUser(this.session) && (b.get('isApproved') || (a = {
  19086.         icon: 'clock',
  19087.         text: Q('Hold on, this is waiting to be approved by %(forum)s.'),
  19088.         style: 'default'
  19089.       })),
  19090.       a && (a.text = j.interpolate(a.text, {
  19091.         forum: this.thread.forum.get('name')
  19092.       })),
  19093.       a
  19094.     },
  19095.     getTemplate: function (a) {
  19096.       if (a.isDeleted) return J;
  19097.       var b = this.model.isAuthorSessionUser(this.session);
  19098.       return a.sb && !b ? J : a.isSpam ? M : this.model.author && (this.model.author.get('isBlocked') || this.model.author.get('isBlocking')) ? K : b && !a.isApproved ? I : a.isMinimized ? L : I
  19099.     },
  19100.     getPostAttributes: function () {
  19101.       var a = this.model.toJSON({
  19102.         session: this.session,
  19103.         thread: this.thread
  19104.       }),
  19105.       b = this.model.getParent();
  19106.       return b && b.get('isSponsored') && (a.canBeRepliedTo = !1, a.hideViewAllComments = b.get('hideViewAllComments')),
  19107.       a
  19108.     },
  19109.     render: function () {
  19110.       var a = this.$el,
  19111.       b = this.getPostAttributes(),
  19112.       c = t.getLounge(),
  19113.       d = this.thread.forum.get('avatar'),
  19114.       g = this.model.getParent(),
  19115.       h = this.getTemplate(b);
  19116.       return !b.message && b.raw_message && s.isPlainText(b.raw_message) && (b.message = this.model.constructor.formatMessage(b.raw_message)),
  19117.       f.render(e.createElement(h, {
  19118.         post: b,
  19119.         forumName: this.thread.forum.get('name'),
  19120.         session: this.session.toJSON(),
  19121.         thread: this.thread.toJSON(),
  19122.         forum: this.thread.forum.toJSON(),
  19123.         created: this.created,
  19124.         parentPost: g && g.toJSON({
  19125.           session: this.session,
  19126.           thread: this.thread
  19127.         }),
  19128.         defaultAvatarUrl: d ? d.large.cache : q.avatar.generic,
  19129.         hasForumAvatar: Boolean(d && !l.isDefaultAvatar(d.large.cache)),
  19130.         stateByline: this.getStateByline(),
  19131.         isInHome: c.isInHome(),
  19132.         isOnChannel: c.isOnChannel()
  19133.       }), this.el),
  19134.       h === I ? a.removeClass('minimized') : a.addClass('minimized'),
  19135.       b.sb && !this.model.isAuthorSessionUser(this.session) ? this.hasVisibleChildren || a.addClass('banned') : this.parent && this.parent.markHasVisibleChildren(),
  19136.       !this.options.excludeAnchor && this.model.id && a.attr('id', 'post-' + this.model.id),
  19137.       this.contentNode = a.find('[data-role=post-content]'),
  19138.       this.childrenNode = a.find('[data-role=children]'),
  19139.       this.messageNode = this.contentNode.find('[data-role=message]'),
  19140.       this.highlightSyntax(),
  19141.       this.processMentions(),
  19142.       this.initCards(),
  19143.       this.updatePostStateClasses(),
  19144.       this.shouldWaitToRenderMedia || this.renderMedia(),
  19145.       this.renderSpoilers(),
  19146.       this.model.get('isRealtime') && (this.trackPosition = !0, this.listenToOnce(c.postsView, 'render:end', this.markSeen)),
  19147.       this.listenToOnce(c.postsView, 'render:end', function () {
  19148.         this.markSeen(),
  19149.         this.manageMessageHeight(),
  19150.         this.updatePostMetaPlacement()
  19151.       }),
  19152.       this
  19153.     },
  19154.     positionMenu: function (b) {
  19155.       var c = b.data('postId').toString();
  19156.       if (c === this.model.id) {
  19157.         var d = this.$('.dropdown-menu', b);
  19158.         if (d.css('top', ''), d.height() + d.offset().top > a(window.document).height()) {
  19159.           var e = d.css('top') || 0;
  19160.           d.css('top', (d.height() + parseInt(e, 10)) * - 1)
  19161.         }
  19162.       }
  19163.     },
  19164.     markHasVisibleChildren: function () {
  19165.       this.hasVisibleChildren = !0,
  19166.       this.model.get('sb') && (this.$el.removeClass('banned'), this.parent && this.parent.markHasVisibleChildren())
  19167.     },
  19168.     highlightSyntax: function () {
  19169.       var a = this.contentNode.find('pre code');
  19170.       a.length && a.each(function () {
  19171.         s.syntaxHighlighter.highlight(this)
  19172.       })
  19173.     },
  19174.     redraw: function () {
  19175.       var a = window.document.createDocumentFragment();
  19176.       this.childrenNode.children().appendTo(a),
  19177.       this.render(),
  19178.       this.childrenNode.append(a),
  19179.       this.blacklist && this.contentNode.find('[data-role=blacklist-form]').first().append(this.blacklist.el),
  19180.       t.getLounge().postsView.trigger('render:end'),
  19181.       t.getLounge().trigger('domReflow')
  19182.     },
  19183.     handleHasMoreChanged: function () {
  19184.       var b = this.$el.find('.show-children-wrapper');
  19185.       a(b[b.length - 1]).toggleClass('hidden', !this.model.get('hasMore'))
  19186.     },
  19187.     processMentions: function () {
  19188.       var b = this.session,
  19189.       c = b && b.get('sso') && b.get('sso').profile_url;
  19190.       c && (c = String(c), 0 === c.indexOf('//') && (c = 'https:' + c), /https?:\/\//.test(c) || (c = null), /\{username\}/.test(c) || (c = null));
  19191.       var d = k.isFeatureActive('sso_less_branding', {
  19192.         forum: this.thread.forum.id
  19193.       }) && !c;
  19194.       this.contentNode.find('[data-dsq-mention]').each(function () {
  19195.         var b = a(this);
  19196.         if (d) {
  19197.           var e = a('<span />');
  19198.           e.text(b.text()),
  19199.           e.addClass('mention'),
  19200.           b.replaceWith(e)
  19201.         } else {
  19202.           if (c) {
  19203.             var f = c.replace(/\{username\}/gi, encodeURIComponent(b.text()));
  19204.             b.attr('href', f),
  19205.             b.attr('title', f)
  19206.           } else {
  19207.             var g = b.attr('data-dsq-mention').split(':') [0];
  19208.             b.attr('data-action', 'profile'),
  19209.             b.attr('data-username', g)
  19210.           }
  19211.           b.addClass('mention')
  19212.         }
  19213.       })
  19214.     },
  19215.     attachChild: function (a) {
  19216.       var b = a.model;
  19217.       b.created || !b.id || b.get('isImmediateReply') ? this.childrenNode.prepend(a.el) : this.childrenNode.append(a.el)
  19218.     },
  19219.     toggleReply: function () {
  19220.       this.reply && this.reply.isOpen() ? this.hideReply() : this.showReply()
  19221.     },
  19222.     toggleReplyLink: function (a) {
  19223.       this.contentNode.find('[data-role=reply-link]').toggleClass('active', a),
  19224.       this.contentNode.find('[data-role=reply-link]').toggleClass('publisher-anchor-color', a)
  19225.     },
  19226.     showReply: function () {
  19227.       this.reply ? (this.$el.find('[data-role=reply-form]').first().prepend(this.reply.$el), this.reply.show(), this.reply.focus()) : this.getReplyView(),
  19228.       this.toggleReplyLink(!0)
  19229.     },
  19230.     hideReply: function () {
  19231.       this.reply && (this.reply.hide(), this.toggleReplyLink(!1))
  19232.     },
  19233.     toggleEdit: function () {
  19234.       return this.contentNode.find('[data-role=edit-link]').toggleClass('active', !this.edit),
  19235.       this.edit ? (this.edit.remove(), this.edit = null, void this.messageNode.show()) : void this.showEdit()
  19236.     },
  19237.     showEdit: function () {
  19238.       if (this.session.isLoggedOut()) return void this.listenToOnce(this.session, 'change:id', this.toggleEdit);
  19239.       if (this.model.canBeEdited(this.session, this.thread) && !this.edit) {
  19240.         this.edit = new z({
  19241.           post: this.model,
  19242.           session: this.session,
  19243.           thread: this.thread
  19244.         }),
  19245.         this.edit.render(),
  19246.         this.listenTo(this.edit, 'submitted cancel', this.toggleEdit),
  19247.         this.expand(!0);
  19248.         var a = this.messageNode;
  19249.         a.parent().prepend(this.edit.$el),
  19250.         a.hide(),
  19251.         this.edit.resize();
  19252.         var b = t.getLounge();
  19253.         b && b.scrollToPost(this.model.id),
  19254.         p.trigger('uiAction:postStartUpdate', this.model, {
  19255.           area: 'main'
  19256.         })
  19257.       }
  19258.     },
  19259.     removeAsDeleted: function () {
  19260.       this.redraw()
  19261.     },
  19262.     initCards: function () {
  19263.       var a = this;
  19264.       a.initProfileCard(),
  19265.       a.initContextCard(),
  19266.       a.initVotersCard(),
  19267.       a.initAnonVoteCards(),
  19268.       a.initTooltips()
  19269.     },
  19270.     initProfileCard: function () {
  19271.       if (!l.isMobileUserAgent() && !k.isFeatureActive('sso_less_branding', {
  19272.         forum: this.thread.forum.id
  19273.       })) {
  19274.         var a = this.$el.find('.hovercard');
  19275.         a.length && (this.profileCard = v.ProfileCard.create({
  19276.           session: this.session,
  19277.           user: this.model.author,
  19278.           targetElement: a
  19279.         }))
  19280.       }
  19281.     },
  19282.     initContextCard: function () {
  19283.       if (!l.isMobileUserAgent()) {
  19284.         var a = this.parent && this.parent.model;
  19285.         a && !a.get('isDeleted') && (this.contextCard = v.ContextCard.create({
  19286.           post: a,
  19287.           targetElement: this.$el.find('[data-role=parent-link]')
  19288.         }))
  19289.       }
  19290.     },
  19291.     initVotersCard: function () {
  19292.       if (!l.isMobileUserAgent()) {
  19293.         var a = this.$el.find('[data-action=upvote]'),
  19294.         b = this.$el.find('[data-action=downvote]'),
  19295.         c = this.thread.forum.get('votingType');
  19296.         a.length && c !== i.VOTING_TYPES.DISABLED && (this.upvotersCard = v.VotersCard.create({
  19297.           session: this.session,
  19298.           model: this.model,
  19299.           targetElement: a,
  19300.           voteType: 1,
  19301.           isRefreshEnabled: k.isFeatureActive('embed_refresh', {
  19302.             forum: this.thread.forum.id
  19303.           })
  19304.         })),
  19305.         !b.length || null !== c && void 0 !== c && c !== i.VOTING_TYPES.DETAILED || (this.downvotersCard = v.VotersCard.create({
  19306.           session: this.session,
  19307.           model: this.model,
  19308.           targetElement: b,
  19309.           voteType: - 1,
  19310.           isRefreshEnabled: k.isFeatureActive('embed_refresh', {
  19311.             forum: this.thread.forum.id
  19312.           })
  19313.         }))
  19314.       }
  19315.     },
  19316.     initAnonVoteCards: function () {
  19317.       this.session.isLoggedOut() && !this.thread.forum.get('settings').allowAnonVotes && (this.anonVoteCards = this.anonVoteCards || {
  19318.       }, b.each({
  19319.         upvote: N,
  19320.         downvote: O
  19321.       }, function (a, b) {
  19322.         this.anonVoteCards[b] && (this.anonVoteCards[b].remove(), this.anonVoteCards[b] = null);
  19323.         var c = this.$('[data-action=' + b + ']');
  19324.         c.length && (this.anonVoteCards[b] = D.create({
  19325.           targetElement: c,
  19326.           template: a,
  19327.           id: 'anon' + b + this.model.id
  19328.         }))
  19329.       }, this), this.anonVoteCards.upvote && this.listenTo(this.anonVoteCards.upvote, 'show', this.closeUpvotersCard), this.anonVoteCards.downvote && this.listenTo(this.anonVoteCards.upvote, 'show', this.closeDownvotersCard))
  19330.     },
  19331.     initTooltips: function () {
  19332.       if (!l.isMobileUserAgent()) {
  19333.         var b = this.$el.find('[data-toggle=tooltip]');
  19334.         b.length && b.each(function (b, c) {
  19335.           var d = a(c),
  19336.           e = d.attr('title');
  19337.           d.attr('data-original-title', e).attr('title', ''),
  19338.           E.create({
  19339.             targetElement: d,
  19340.             message: e,
  19341.             id: e
  19342.           })
  19343.         })
  19344.       }
  19345.     },
  19346.     closeUpvotersCard: function () {
  19347.       this.upvotersCard && this.upvotersCard.hide()
  19348.     },
  19349.     closeDownvotersCard: function () {
  19350.       this.downvotersCard && this.downvotersCard.hide()
  19351.     },
  19352.     _onShare: P(function (a) {
  19353.       if (!this.thread.forum.get('settings').disableSocialShare) {
  19354.         var b = s.extractService(a.target, 'share');
  19355.         b && (t.getLounge().trigger('uiAction:postShare', this.model, b), this.share(b))
  19356.       }
  19357.     }),
  19358.     handleBlacklist: P(function () {
  19359.       if (!this.blacklist) {
  19360.         var a = this.blacklist = new y({
  19361.           model: this.model,
  19362.           forum: this.thread.forum
  19363.         });
  19364.         a.render(),
  19365.         this.listenTo(a, 'success cancel', function () {
  19366.           this.blacklist.remove(),
  19367.           this.blacklist = null
  19368.         }),
  19369.         this.contentNode.find('[data-role=blacklist-form]').first().append(a.el)
  19370.       }
  19371.     }),
  19372.     handleManageBadges: P(function () {
  19373.       if (!this.manageBadgeView) {
  19374.         var a = this.manageBadgeView = new x({
  19375.           model: this.model,
  19376.           forum: this.thread.forum
  19377.         });
  19378.         a.render(),
  19379.         p.trigger('uiAction:viewBadgeModal'),
  19380.         this.listenTo(a, 'success cancel', function () {
  19381.           this.manageBadgeView.remove(),
  19382.           this.manageBadgeView = null
  19383.         }),
  19384.         this.listenTo(a, 'success', function (a) {
  19385.           var b = this.model.author;
  19386.           b.get('badges') || b.set('badges', [
  19387.           ]);
  19388.           var c = b.get('badges');
  19389.           a.action === S.AWARD ? c.unshift(a.badge) : a.action === S.REMOVE && b.set('badges', c.filter(function (b) {
  19390.             return b.id !== a.badge.id
  19391.           })),
  19392.           this.thread.trigger('change:badgeAction', b)
  19393.         }),
  19394.         this.contentNode.find('[data-role=badges-form]').first().append(a.el)
  19395.       }
  19396.     }),
  19397.     toggleCollapse: function (a) {
  19398.       this.$el.toggleClass('collapsed', a)
  19399.     },
  19400.     handleCollapse: P(function () {
  19401.       this.toggleCollapse()
  19402.     }),
  19403.     handleHighlight: P(function () {
  19404.       this.model.highlight();
  19405.       var a = Q('You\'ve featured a comment! This comment will now also appear at the top of the discussion.');
  19406.       this.alert(a, {
  19407.         safe: !0,
  19408.         type: 'success'
  19409.       }),
  19410.       this.thread.set('highlightedPost', this.model);
  19411.       var b = t.getLounge();
  19412.       b && b.scrollToPost(this.model.id)
  19413.     }),
  19414.     handleUnhighlight: P(function () {
  19415.       this.model.unhighlight(),
  19416.       this.dismissAlert(),
  19417.       this.thread.unset('highlightedPost')
  19418.     }),
  19419.     handleVote: function (a, b) {
  19420.       if (this.thread.forum.get('votingType') !== i.VOTING_TYPES.DISABLED && (b !== - 1 || this.thread.forum.get('votingType') !== i.VOTING_TYPES.DOWNVOTE_DISABLED)) {
  19421.         if (!this.thread.forum.get('settings').allowAnonVotes && this.session.isLoggedOut()) return void this.queueAuthAction(function () {
  19422.           this.handleVote(a, b)
  19423.         }, this);
  19424.         var c = t.getLounge(),
  19425.         d = this.model.get('userScore') === b;
  19426.         d ? c.trigger('uiAction:postUnvote', this.model, a) : 1 === b ? c.trigger('uiAction:postUpvote', this.model, a) : b === - 1 && c.trigger('uiAction:postDownvote', this.model, a),
  19427.         this.model.vote(d ? 0 : b)
  19428.       }
  19429.     },
  19430.     queueAuthAction: function (a, b) {
  19431.       this.listenToOnce(this.session, 'change:id', function () {
  19432.         this.session.isLoggedIn() && a.call(b)
  19433.       }),
  19434.       this.session.get('sso') && this.session.get('sso').url ? this.session.authenticate('sso') : this.session.authenticate('disqusDotcom')
  19435.     },
  19436.     getReplyView: function () {
  19437.       return this.reply ? this.reply : (this.reply = new A({
  19438.         parentView: this,
  19439.         parent: this.model,
  19440.         thread: this.thread,
  19441.         session: this.options.session,
  19442.         userSuggestions: this.userSuggestions,
  19443.         gifPickerEnabled: this.gifPickerEnabled,
  19444.         shouldShowEmailAlertInForm: !0
  19445.       }), this.reply.render(), this.showReply(), this.reply)
  19446.     },
  19447.     handleReply: P(function () {
  19448.       this.toggleReply()
  19449.     }),
  19450.     handleFlag: P(function () {
  19451.       if (!this.model.get('isFlaggedByUser') && !this.flaggingView) {
  19452.         if (this.session.isLoggedOut()) {
  19453.           var a = this;
  19454.           return a._pendingFlagComplete = !1,
  19455.           void a.queueAuthAction(function () {
  19456.             a._pendingFlagComplete || (a._pendingFlagComplete = !0, setTimeout(function () {
  19457.               a.handleFlag()
  19458.             }, 400))
  19459.           })
  19460.         }
  19461.         var b = this.flaggingView = new C({
  19462.           model: this.model
  19463.         });
  19464.         b.render(),
  19465.         this.listenTo(b, 'cancel success', function () {
  19466.           b.remove(),
  19467.           this.flaggingView = null,
  19468.           this.updateMenu()
  19469.         }),
  19470.         this.contentNode.find('[data-role=flagging-form]').first().append(b.el),
  19471.         p.frame.sendHostMessage('scrollTo', {
  19472.           top: b.$el.offset().top - 80
  19473.         })
  19474.       }
  19475.     }),
  19476.     handleBlockUser: P(function () {
  19477.       this.dismissAlert(function (a) {
  19478.         return a.options && a.options.isBlockError
  19479.       });
  19480.       var a = this;
  19481.       this.model.author.block().fail(function (b) {
  19482.         var c = Q('Something went wrong while trying to block this user. Please try again later.'),
  19483.         d = b && b.responseJSON && b.responseJSON.code;
  19484.         d === g.ERROR_CODES.MAX_ITEMS_REACHED && (c = Q('Unfortunately this user could not be blocked; you have reached the limit for number of users blocked.')),
  19485.         a.alert(c, {
  19486.           type: 'error',
  19487.           isBlockError: !0
  19488.         })
  19489.       })
  19490.     }),
  19491.     handleEdit: P(function () {
  19492.       this.toggleEdit()
  19493.     }),
  19494.     handleDelete: P(function () {
  19495.       this.model.get('isHighlighted') && (this.model.set('isHighlighted', !1), this.thread.unset('highlightedPost')),
  19496.       this.model._delete()
  19497.     }),
  19498.     handleSpam: P(function () {
  19499.       this.model.spam()
  19500.     }),
  19501.     handleReveal: P(function () {
  19502.       this.model.set('isMinimized', !1),
  19503.       this.redraw()
  19504.     }),
  19505.     handleExpandMessage: P(function () {
  19506.       return this.expand()
  19507.     }),
  19508.     handleExpandShare: P(function () {
  19509.       var a = this.$('#comment__share-' + this.model.id + ' .comment-share__buttons');
  19510.       a.toggleClass('comment-share__buttons-visible')
  19511.     }),
  19512.     handleCopyLink: function () {
  19513.       l.copyToClipboard(this.model.shortLink())
  19514.     }
  19515.   });
  19516.   return b.extend(U.prototype, u.ShareMixin),
  19517.   b.extend(U.prototype, r.FollowButtonMixin),
  19518.   m.call(U.prototype),
  19519.   u.asCollapsible.call(U.prototype, {
  19520.     collapsedHeight: 374,
  19521.     collapseTargetSelector: '[data-role=message-container]',
  19522.     collapseScope: 'contentNode'
  19523.   }),
  19524.   n.call(U.prototype),
  19525.   U
  19526. }),
  19527. define('lounge/views/posts/collection', [
  19528.   'jquery',
  19529.   'underscore',
  19530.   'backbone',
  19531.   'moment',
  19532.   'core/bus',
  19533.   'core/strings',
  19534.   'core/switches',
  19535.   'common/models',
  19536.   'common/utils',
  19537.   'lounge/views/posts/PostReplyView',
  19538.   'lounge/views/post'
  19539. ], function (a, b, c, d, e, f, g, h, i, j, k) {
  19540.   'use strict';
  19541.   var l = f.get,
  19542.   m = c.View.extend({
  19543.     events: {
  19544.       'click [data-action=more-posts]': 'handleLoadMore',
  19545.       'click [data-action=show-children]': 'handleLoadMoreChildPosts'
  19546.     },
  19547.     STREAMING_MAX_VISIBLE: 250,
  19548.     initialize: function (a) {
  19549.       this.lounge = a.lounge,
  19550.       this.thread = a.thread,
  19551.       this.userSuggestions = a.userSuggestions,
  19552.       this.posts = a.posts,
  19553.       this.postsToAppend = [
  19554.       ],
  19555.       this.postsToPrepend = [
  19556.       ],
  19557.       this.session = a.session,
  19558.       this.subViews = {
  19559.       },
  19560.       this.state = {
  19561.         nextPassTimeoutId: null,
  19562.         renderedPosts: [
  19563.         ],
  19564.         clearDomAfterRender: !1,
  19565.         totalPostsProcessed: 0,
  19566.         totalElapsedTime: 0
  19567.       },
  19568.       this.addPostsIncremental = b.bind(this.addPostsIncremental, this),
  19569.       this.listenTo(this.posts, {
  19570.         reset: this.redrawPosts,
  19571.         add: this.addPosts,
  19572.         remove: this.removePost
  19573.       }),
  19574.       this.listenTo(this.thread, 'change:badgeAction', this.handleBadgeAction),
  19575.       this.listenTo(this.thread, 'change:highlightedPost', this.handleHasHighlightedState),
  19576.       this.listenToOnce(this.lounge, 'threadView:init', function () {
  19577.         this.listenTo(this.thread, 'change:isClosed', this.toggleNoPosts),
  19578.         this.listenTo(this.session, 'change:id', this.toggleNoPosts),
  19579.         this.listenTo(this.posts, 'reset add', this.toggleNoPosts)
  19580.       }),
  19581.       this.listenTo(this.posts, 'reset add', this.enableTimestampUpdates),
  19582.       this.listenTo(this, 'render:end', this.toggleLoadMorePosts),
  19583.       this.listenTo(this, 'render:end', this.handleHasHighlightedState),
  19584.       g.isFeatureActive('limit_rendered_posts', {
  19585.         forum: this.thread.forum.id
  19586.       }) && this.listenTo(this.lounge, 'scroll', b.throttle(this.hideOffscreenPosts, 200))
  19587.     },
  19588.     handleHasHighlightedState: function () {
  19589.       this.$el.toggleClass('has-highlighted-post', this.thread.has('highlightedPost'))
  19590.     },
  19591.     handleBadgeAction: function (a) {
  19592.       var b = this;
  19593.       Object.keys(this.subViews).forEach(function (c) {
  19594.         var d = b.subViews[c];
  19595.         d.model.author.id === a.id && d.updateBadges()
  19596.       })
  19597.     },
  19598.     getPostView: function (a) {
  19599.       return this.subViews[a]
  19600.     },
  19601.     bootstrap: function (a, c) {
  19602.       this.permalinkOptions = c,
  19603.       this.listenTo(this.posts, 'reset', b.bind(this.posts.restoreFromCache, this.posts)),
  19604.       this.listenTo(this.posts, 'change:isDeleted', b.bind(this.posts.removeFromCache, this.posts)),
  19605.       this.handleInitialCommentCount(a.posts)
  19606.     },
  19607.     handleInitialCommentCount: function (a) {
  19608.       var c = this.thread.forum.get('initialCommentCount');
  19609.       if (!c) {
  19610.         var d = g.getSwitchContext('customCommentCounts') || {
  19611.         };
  19612.         c = d[this.thread.forum.id]
  19613.       }
  19614.       this.posts.reset(a, {
  19615.         customThreadLength: c
  19616.       }),
  19617.       b.invoke(this.subViews, 'manageMessageHeight')
  19618.     },
  19619.     bindUIUpdateHandlers: function () {
  19620.       var c = this,
  19621.       d = a(window),
  19622.       e = a(window.document.body),
  19623.       f = e.width(),
  19624.       g = b.debounce(function () {
  19625.         var a = e.width();
  19626.         f !== a && c.subViews && (f = a, b.each(c.subViews, function (a) {
  19627.           a.manageMessageHeight()
  19628.         }))
  19629.       }, 50);
  19630.       d.on('resize', g)
  19631.     },
  19632.     updateTimestamps: function () {
  19633.       return !(!this.subViews || b.size(this.subViews) < 1) && (b.invoke(this.subViews, 'updateRelativeTime'), !0)
  19634.     },
  19635.     enableTimestampUpdates: function () {
  19636.       var a = this,
  19637.       c = 60000;
  19638.       if (!a.timestampUpdateTimer) {
  19639.         var d = function e() {
  19640.           return a.updateTimestamps() ? void (a.timestampUpdateTimer = b.delay(e, c)) : void (a.timestampUpdateTimer = null)
  19641.         };
  19642.         a.timestampUpdateTimer = b.delay(d, c)
  19643.       }
  19644.     },
  19645.     openReply: function (a) {
  19646.       var b = this.posts.get(a);
  19647.       if (b) {
  19648.         var c = this.subViews[b.cid];
  19649.         c.showReply()
  19650.       }
  19651.     },
  19652.     openEdit: function (a) {
  19653.       var b = this.posts.get(a);
  19654.       if (b) {
  19655.         var c = this.subViews[b.cid];
  19656.         c.showEdit()
  19657.       }
  19658.     },
  19659.     toggleLoadMorePosts: function () {
  19660.       var a = this.lounge.threadView.$el.find('#posts [data-role=more]'),
  19661.       b = this.posts.hasNext();
  19662.       b ? a.show() : a.hide()
  19663.     },
  19664.     handleLoadMore: function (a) {
  19665.       var b = this.posts.currentPage();
  19666.       this._loadMore(a),
  19667.       this.lounge.trigger('uiAction:seeMore', b + 1)
  19668.     },
  19669.     handleLoadMoreChildPosts: function (a) {
  19670.       var b = a.currentTarget.id.split('-') [1],
  19671.       c = this.posts.get(b);
  19672.       this._loadMore(a, c),
  19673.       this.lounge.trigger('uiAction:seeMoreChildren', a)
  19674.     },
  19675.     _loadMore: function (b, c) {
  19676.       b.preventDefault();
  19677.       var d = this,
  19678.       f = a(b.currentTarget);
  19679.       f.addClass('busy'),
  19680.       d.posts.more({
  19681.         post: c,
  19682.         success: function () {
  19683.           d.posts.restoreFromCache(),
  19684.           d.once('render:end', function () {
  19685.             f.removeClass('busy')
  19686.           })
  19687.         },
  19688.         error: function () {
  19689.           f.removeClass('busy')
  19690.         }
  19691.       }),
  19692.       e.frame.sendHostMessage('posts.paginate')
  19693.     },
  19694.     renderLayout: a.noop,
  19695.     toggleNoPosts: function () {
  19696.       var a,
  19697.       b = this.lounge.threadView.$el.find('#no-posts');
  19698.       this.posts.models.length ? b.hide() : (a = l(this.thread.get('isClosed') ? 'This discussion has been closed.' : this.session.get('canReply') ? 'Be the first to comment.' : 'Nothing in this discussion yet.'), b.text(a), b.show())
  19699.     },
  19700.     handleSort: function () {
  19701.       a('#posts [data-role=more]').hide(),
  19702.       a('#no-posts').hide(),
  19703.       a('#post-list').addClass('loading').empty()
  19704.     },
  19705.     redrawPosts: function () {
  19706.       var a = this;
  19707.       a.subViews = {
  19708.       },
  19709.       a.once('render:end', function () {
  19710.         b.each(j.open, function (b, c) {
  19711.           var d = a.subViews[c];
  19712.           if (d) {
  19713.             var e = d.getReplyView();
  19714.             e.textarea.set(b.textarea.get()),
  19715.             b.isOpen() ? e.show() : e.hide()
  19716.           }
  19717.         })
  19718.       }),
  19719.       a.posts.setPageFor && a.permalinkOptions && a.permalinkOptions.postId && a.posts.setPageFor(a.permalinkOptions.postId, {
  19720.         silent: !0
  19721.       }),
  19722.       a.addPosts(a.posts, {
  19723.         clearDom: !0
  19724.       })
  19725.     },
  19726.     hideOffscreenPosts: function (a) {
  19727.       var c = a.pageOffset,
  19728.       d = this.lounge.position.frameOffset.top,
  19729.       e = 2 * a.height,
  19730.       f = c - e,
  19731.       g = c + a.height + e;
  19732.       b.isNumber(c) && b.isNumber(e) && b.each(this.subViews, function (a) {
  19733.         var b = a.$el,
  19734.         c = b.offset().top + d,
  19735.         e = c + b.outerHeight();
  19736.         e < f || c > g ? b.addClass('invisible') : b.removeClass('invisible')
  19737.       })
  19738.     },
  19739.     postsShouldBePrepended: function (a) {
  19740.       var b = a.length && a[0];
  19741.       return Boolean(b && (b.created || !b.id || b.get('isRealtime') || b.get('isCached') || b.requestedByPermalink))
  19742.     },
  19743.     hasQueuedPosts: function () {
  19744.       return this.postsToAppend.length || this.postsToPrepend.length
  19745.     },
  19746.     addPosts: i.decorate(c.collectionAddNormalizer(c.Collection, h.Post), function (a, c, d) {
  19747.       var e = this;
  19748.       if (d.clearDom && (e.postsToAppend = [
  19749.       ], e.postsToPrepend = [
  19750.       ], e.postsShouldClearDom = !0), e.postsShouldBePrepended(a)) {
  19751.         var f = [
  19752.         ];
  19753.         b.each(a, function (a) {
  19754.           var b = a.get('parent');
  19755.           b && e.posts.get(b) ? e.postsToPrepend.push(a) : f.push(a)
  19756.         }),
  19757.         e.postsToPrepend = f.concat(e.postsToPrepend)
  19758.       } else e.postsToAppend = e.postsToAppend.concat(a);
  19759.       e.state.nextPassTimeoutId || (e.state.nextPassTimeoutId = b.defer(function () {
  19760.         e.trigger('render:start'),
  19761.         e.addPostsIncremental(!0)
  19762.       }))
  19763.     }),
  19764.     onDeferredViewReady: function (a) {
  19765.       var b = this.subViews;
  19766.       b.hasOwnProperty(a) && b[a].manageMessageHeight()
  19767.     },
  19768.     removePost: function (a) {
  19769.       if (this.hasQueuedPosts()) return void this.once('render:end', b.bind(this.removePost, this, a));
  19770.       var c = this.subViews[a.cid];
  19771.       c && (c.remove(), delete this.subViews[a.cid])
  19772.     },
  19773.     addPostsIncremental: function (a) {
  19774.       this.state.nextPassTimeoutId = null,
  19775.       this.discardRenderProgressIfClearDomRequested();
  19776.       var b = this.getPostModelsForThePass();
  19777.       b.length && this.renderPass(b, a ? m.FIRST_ATTEMPT_TIME_SCALE : void 0),
  19778.       this.finishPass(b),
  19779.       this.scheduleNextPass()
  19780.     },
  19781.     discardRenderProgressIfClearDomRequested: function () {
  19782.       this.postsShouldClearDom && (this.state.clearDomAfterRender = !0, this.postsShouldClearDom = !1, this.state.renderedPosts = [
  19783.       ])
  19784.     },
  19785.     getPostModelsForThePass: function () {
  19786.       return this.postsToAppend.length ? this.postsToAppend : this.postsToPrepend
  19787.     },
  19788.     renderPass: function (a, b) {
  19789.       var c = m.TARGET_PROCESS_TIME;
  19790.       b && (c *= b);
  19791.       for (var d = this.calculatePostsForNextRun(c) || m.MINIMUM_POSTS_PER_RUN; d > 0; ) {
  19792.         var e = a.splice(0, d),
  19793.         f = this.timedRenderPosts(e);
  19794.         if (null === f) break;
  19795.         c -= f,
  19796.         d = this.calculatePostsForNextRun(c)
  19797.       }
  19798.     },
  19799.     timedRenderPosts: function (a) {
  19800.       if (!a.length) return null;
  19801.       var c = Number(new Date);
  19802.       this.state.renderedPosts = this.state.renderedPosts.concat(b.map(a, this.createPostView, this));
  19803.       var d = Number(new Date) - c;
  19804.       return d < 0 && (d = 0),
  19805.       this.state.totalElapsedTime += d,
  19806.       this.state.totalPostsProcessed += a.length,
  19807.       d || null
  19808.     },
  19809.     createPostView: function (a) {
  19810.       var b,
  19811.       c = a.get('parent');
  19812.       c && (c = this.posts.get(c), b = c && this.getPostView(c.cid));
  19813.       var d = new k({
  19814.         parent: b,
  19815.         model: a,
  19816.         thread: this.thread,
  19817.         session: this.session,
  19818.         created: a.created,
  19819.         userSuggestions: this.userSuggestions,
  19820.         config: this.lounge.config
  19821.       });
  19822.       return this.subViews[a.cid] = d,
  19823.       d.render(),
  19824.       d
  19825.     },
  19826.     calculatePostsForNextRun: function (a) {
  19827.       return a <= 0 ? 0 : this.state.totalElapsedTime <= 0 ? this.state.totalPostsProcessed : Math.floor(a * this.state.totalPostsProcessed / this.state.totalElapsedTime)
  19828.     },
  19829.     finishPass: function (a) {
  19830.       if (!a.length) {
  19831.         if (this.$postList = this.lounge.threadView.$el.find('#post-list'), this.state.clearDomAfterRender && (this.$postList.empty(), this.state.clearDomAfterRender = !1), this.state.renderedPosts.length) {
  19832.           this.removeOldPostsIfRealtime(),
  19833.           this.enablePostTracking(this.state.renderedPosts);
  19834.           var b = a === this.postsToAppend;
  19835.           this.insertPostElements(this.state.renderedPosts, b),
  19836.           this.state.renderedPosts = [
  19837.           ]
  19838.         }
  19839.         this.$postList.removeClass('loading'),
  19840.         this.postsToPrepend.length || this.postsToAppend.length || this.trigger('render:end')
  19841.       }
  19842.     },
  19843.     removeOldPostsIfRealtime: function () {
  19844.       var a = b.any(this.state.renderedPosts, function (a) {
  19845.         return a.model.get('isRealtime')
  19846.       });
  19847.       a && this.removeOldPosts()
  19848.     },
  19849.     removeOldPosts: function () {
  19850.       var a = b.size(this.subViews) - this.STREAMING_MAX_VISIBLE;
  19851.       if (!(a <= 0)) for (var c, e = this.posts.sortBy(function (a) {
  19852.         return d(a.get('createdAt')).valueOf()
  19853.       }), f = 0, g = 0; g < e.length && f <= a; g++) c = this.getPostView(e[g].cid),
  19854.       c && 0 === c.childrenNode.children().length && (this.posts.remove(e[g]), f += 1)
  19855.     },
  19856.     enablePostTracking: function (a) {
  19857.       b.each(a, function (a) {
  19858.         a.visible = !0
  19859.       })
  19860.     },
  19861.     insertPostElements: function (a, c) {
  19862.       var d = b.groupBy(a, function (a) {
  19863.         return Boolean(a.parent)
  19864.       });
  19865.       b.each(d['true'], function (a) {
  19866.         a.parent.attachChild(a)
  19867.       });
  19868.       var e = b.pluck(d['false'], '$el');
  19869.       c ? this.$postList.append(e) : this.$postList.prepend(e)
  19870.     },
  19871.     scheduleNextPass: function () {
  19872.       (this.postsToPrepend.length || this.postsToAppend.length) && (this.state.nextPassTimeoutId = b.defer(this.addPostsIncremental))
  19873.     }
  19874.   });
  19875.   m.TARGET_PROCESS_TIME = 30,
  19876.   m.FIRST_ATTEMPT_TIME_SCALE = 0.8,
  19877.   m.MINIMUM_POSTS_PER_RUN = 2;
  19878.   var n = c.View.extend({
  19879.     initialize: function (a) {
  19880.       this.lounge = a.lounge,
  19881.       this.thread = a.thread,
  19882.       this.userSuggestions = a.userSuggestions,
  19883.       this.posts = a.posts,
  19884.       this.postsToAppend = [
  19885.       ],
  19886.       this.postsToPrepend = [
  19887.       ],
  19888.       this.session = a.session,
  19889.       this.subViews = {
  19890.       },
  19891.       this.state = {
  19892.         nextPassTimeoutId: null,
  19893.         renderedPosts: [
  19894.         ],
  19895.         clearDomAfterRender: !1,
  19896.         totalPostsProcessed: 0,
  19897.         totalElapsedTime: 0
  19898.       },
  19899.       this.listenTo(this.posts, {
  19900.         reset: this.addPosts,
  19901.         add: this.addPosts
  19902.       })
  19903.     },
  19904.     handleHasHighlightedState: function () {
  19905.     },
  19906.     handleBadgeAction: function () {
  19907.     },
  19908.     getPostView: function () {
  19909.     },
  19910.     bootstrap: function (a) {
  19911.       this.posts.reset(a.posts)
  19912.     },
  19913.     handleInitialCommentCount: function () {
  19914.     },
  19915.     bindUIUpdateHandlers: function () {
  19916.     },
  19917.     enableTimestampUpdates: function () {
  19918.     },
  19919.     openReply: function () {
  19920.     },
  19921.     openEdit: function () {
  19922.     },
  19923.     toggleLoadMorePosts: function () {
  19924.     },
  19925.     handleLoadMore: function () {
  19926.     },
  19927.     handleLoadMoreChildPosts: function () {
  19928.     },
  19929.     _loadMore: function () {
  19930.     },
  19931.     renderLayout: function () {
  19932.     },
  19933.     toggleNoPosts: function () {
  19934.     },
  19935.     handleSort: function () {
  19936.     },
  19937.     redrawPosts: function () {
  19938.     },
  19939.     hideOffscreenPosts: function () {
  19940.     },
  19941.     postsShouldBePrepended: function () {
  19942.     },
  19943.     hasQueuedPosts: function () {
  19944.     },
  19945.     addPosts: function () {
  19946.       this.trigger('render:end')
  19947.     },
  19948.     onDeferredViewReady: function () {
  19949.     },
  19950.     removePost: function () {
  19951.     },
  19952.     addPostsIncremental: function () {
  19953.     },
  19954.     discardRenderProgressIfClearDomRequested: function () {
  19955.     },
  19956.     getPostModelsForThePass: function () {
  19957.     },
  19958.     renderPass: function () {
  19959.     },
  19960.     timedRenderPosts: function () {
  19961.     },
  19962.     createPostView: function () {
  19963.     },
  19964.     calculatePostsForNextRun: function () {
  19965.     },
  19966.     finishPass: function () {
  19967.     },
  19968.     removeOldPostsIfRealtime: function () {
  19969.     },
  19970.     removeOldPosts: function () {
  19971.     },
  19972.     enablePostTracking: function () {
  19973.     },
  19974.     insertPostElements: function () {
  19975.     },
  19976.     scheduleNextPass: function () {
  19977.     }
  19978.   });
  19979.   return {
  19980.     PostCollectionView: m,
  19981.     DummyPostCollectionView: n
  19982.   }
  19983. }),
  19984. define('templates/lounge/onboard', [
  19985.   'react',
  19986.   'core/config/urls',
  19987.   'core/strings',
  19988.   'core/utils/object/get'
  19989. ], function (a, b, c, d) {
  19990.   'use strict';
  19991.   var e = c.gettext,
  19992.   f = function (c) {
  19993.     return [a.createElement('div', {
  19994.       key: 'onboard-notice',
  19995.       className: 'notice ' + (c.showHome ? 'notice--brand' : '')
  19996.     }, a.createElement('div', {
  19997.       className: 'notice-wrapper'
  19998.     }, a.createElement('span', {
  19999.       className: 'notice__icon icon icon-disqus'
  20000.     }), a.createElement('a', {
  20001.       'data-action': 'show-home',
  20002.       href: (b.home || '') + 'explore/?utm_source=embed&utm_medium=onboard_message&utm_content=see_home_msg&forum_id=' + d(c.forum, [
  20003.         'id'
  20004.       ], ''),
  20005.       target: '_blank',
  20006.       className: 'notice__message'
  20007.     }, e('Welcome to %(Disqus)s! Discover more great discussions just like this one. We\'re a lot more than comments.', {
  20008.       Disqus: 'Disqus'
  20009.     })), a.createElement('a', {
  20010.       'data-action': 'show-home',
  20011.       href: (b.home || '') + 'explore/?utm_source=embed&utm_medium=onboard_message&utm_content=see_home_btn&forum_id=' + d(c.forum, [
  20012.         'id'
  20013.       ], ''),
  20014.       target: '_blank',
  20015.       className: 'btn btn-primary notice__button'
  20016.     }, e('Get Started')))),
  20017.     a.createElement('a', {
  20018.       key: 'onboard-link',
  20019.       className: 'dismiss',
  20020.       'data-action': 'close',
  20021.       href: '#',
  20022.       title: e('Dismiss')
  20023.     }, 'Dismiss ', a.createElement('span', {
  20024.       'aria-label': 'Dismiss',
  20025.       className: 'cross'
  20026.     }, '×'))]
  20027.   };
  20028.   return f
  20029. }),
  20030. define('lounge/views/onboard-alert', [
  20031.   'backbone',
  20032.   'react',
  20033.   'react-dom',
  20034.   'common/utils',
  20035.   'templates/lounge/onboard'
  20036. ], function (a, b, c, d, e) {
  20037.   'use strict';
  20038.   var f = a.View.extend({
  20039.     events: {
  20040.       'click [data-action=close]': 'handleClose',
  20041.       'click [data-action=show-home]': 'handleShowHome'
  20042.     },
  20043.     initialize: function (a) {
  20044.       this.session = a.session,
  20045.       this.forum = a.forum
  20046.     },
  20047.     render: function () {
  20048.       return this.session.isLoggedIn() && this.shouldShow() && (c.render(b.createElement(e, {
  20049.         forum: this.forum.toJSON()
  20050.       }), this.el), this.trigger('uiAction:onboardAlertShow')),
  20051.       this
  20052.     },
  20053.     shouldShow: function () {
  20054.       return !1
  20055.     },
  20056.     getCookie: function () {
  20057.       return d.cookies.read(f.COOKIE_NAME)
  20058.     },
  20059.     setInitialCookie: function () {
  20060.       this.session.user.get('joinedRecently') && this.createCookie(f.COOKIE_NEW_USER)
  20061.     },
  20062.     createCookie: function (a) {
  20063.       d.cookies.create(f.COOKIE_NAME, a, {
  20064.         expiresIn: 2592000000
  20065.       })
  20066.     },
  20067.     eraseCookie: function () {
  20068.       d.cookies.erase(f.COOKIE_NAME)
  20069.     },
  20070.     handleShowHome: function () {
  20071.       this.remove()
  20072.     },
  20073.     handleClose: function (a) {
  20074.       a.preventDefault(),
  20075.       this.remove(),
  20076.       this.trigger('uiAction:onboardAlertDismiss')
  20077.     },
  20078.     remove: function () {
  20079.       this.eraseCookie(),
  20080.       this.session = null,
  20081.       a.View.prototype.remove.call(this)
  20082.     }
  20083.   }, {
  20084.     COOKIE_NAME: 'disqus.onboarding',
  20085.     COOKIE_NEW_USER: 'newUser'
  20086.   });
  20087.   return {
  20088.     OnboardAlert: f
  20089.   }
  20090. }),
  20091. define('templates/lounge/notificationMenu', [
  20092.   'react',
  20093.   'core/config/urls',
  20094.   'core/switches'
  20095. ], function (a, b, c) {
  20096.   'use strict';
  20097.   var d = function (d) {
  20098.     var e = c.isFeatureActive('embed_refresh', {
  20099.       forum: d.forumId
  20100.     }),
  20101.     f = e ? 'notification-icon notification-icon--refresh' : 'notification-icon',
  20102.     g = e ? 'notification-count notification-count--refresh' : 'notification-count';
  20103.     return a.createElement('a', {
  20104.       href: b.homeInbox || '',
  20105.       className: 'notification-container',
  20106.       'data-action': 'home',
  20107.       'data-home-path': 'home/notifications/'
  20108.     }, a.createElement('span', {
  20109.       className: f + ' icon-comment',
  20110.       'aria-hidden': !0
  20111.     }), a.createElement('span', {
  20112.       className: g,
  20113.       'data-role': 'notification-count'
  20114.     }))
  20115.   };
  20116.   return d
  20117. }),
  20118. define('lounge/views/notification-menu', [
  20119.   'jquery',
  20120.   'underscore',
  20121.   'backbone',
  20122.   'stance',
  20123.   'core/bus',
  20124.   'core/switches',
  20125.   'core/utils',
  20126.   'templates/lounge/notificationMenu'
  20127. ], function (a, b, c, d, e, f, g, h) {
  20128.   'use strict';
  20129.   var i = c.View.extend({
  20130.     events: {
  20131.       'click [data-action=home]': 'handleShowHome'
  20132.     },
  20133.     initialize: function (c) {
  20134.       var e = a.Deferred();
  20135.       this.listenToOnce(d(this), 'enter', function () {
  20136.         e.resolveWith(this)
  20137.       });
  20138.       var f = this.session = c.session;
  20139.       this.forum = c.forum,
  20140.       this.language = window.document.documentElement.lang,
  20141.       this.listenTo(f, 'change:id', this.render),
  20142.       this.listenTo(f, 'change:notificationCount', this.updateCount),
  20143.       this.listenTo(f, 'change:id', function () {
  20144.         e.done(b.bind(f.fetchNotificationCount, f)),
  20145.         e.done(this.preloadSidebar)
  20146.       }),
  20147.       this.listenTo(this, {
  20148.         'sidebar:open:start': this.startLoadingAnimation,
  20149.         'sidebar:open:done': this.stopLoadingAnimation
  20150.       })
  20151.     },
  20152.     startLoadingAnimation: function () {
  20153.       this.$el.addClass('notification-loading')
  20154.     },
  20155.     stopLoadingAnimation: function () {
  20156.       this.$el.removeClass('notification-loading')
  20157.     },
  20158.     preloadSidebar: function () {
  20159.       e.trigger('sidebar:preload')
  20160.     },
  20161.     render: function () {
  20162.       return this.forum.get('settings').ssoRequired && this.session.isLoggedOut() || f.isFeatureActive('sso_less_branding', {
  20163.         forum: this.forum.id
  20164.       }) ? void this.$el.hide() : (this.$el.html(h({
  20165.         forumId: this.forum.id
  20166.       })), this.updateCount(), this.$el.show(), this)
  20167.     },
  20168.     handleShowHome: function (b) {
  20169.       if (this.session.set('notificationCount', 0), !g.willOpenNewWindow(b)) {
  20170.         b.preventDefault();
  20171.         var c = a(b.currentTarget).attr('data-home-path');
  20172.         e.trigger('sidebar:open', c, this)
  20173.       }
  20174.     },
  20175.     updateCount: function () {
  20176.       var a = this.session.get('notificationCount') || 0;
  20177.       a > 0 ? (this.$('[data-role=notification-count]').html(a > 9 ? '9<i class="icon icon-plus"></i>' : a), this.$el.addClass('unread')) : (this.$('[data-role=notification-count]').html(''), this.$el.removeClass('unread'))
  20178.     }
  20179.   });
  20180.   return {
  20181.     NotificationMenuView: i
  20182.   }
  20183. }),
  20184. define('templates/lounge/highlightedPost', [
  20185.   'react',
  20186.   'core/strings'
  20187. ], function (a, b) {
  20188.   'use strict';
  20189.   var c = b.gettext,
  20190.   d = function (b) {
  20191.     return a.createElement('div', null, b.isRefreshEnabled ? null : a.createElement('h2', {
  20192.       className: 'highlighted-comment-header'
  20193.     }, c('Featured Comment')), a.createElement('ul', {
  20194.       className: 'post-list'
  20195.     }))
  20196.   };
  20197.   return d
  20198. }),
  20199. define('lounge/views/highlighted-post', [
  20200.   'backbone',
  20201.   'underscore',
  20202.   'jquery',
  20203.   'core/switches',
  20204.   'core/UniqueModel',
  20205.   'common/models',
  20206.   'lounge/views/post',
  20207.   'templates/lounge/highlightedPost'
  20208. ], function (a, b, c, d, e, f, g, h) {
  20209.   'use strict';
  20210.   var i = g.extend({
  20211.     getPostAttributes: function () {
  20212.       var a = g.prototype.getPostAttributes.apply(this, arguments);
  20213.       return a.hasMore = !1,
  20214.       d.isFeatureActive('embed_refresh', {
  20215.         forum: this.thread.forum.id
  20216.       }) ? a.hideParent = !0 : a.canBeRepliedTo = !1,
  20217.       a
  20218.     },
  20219.     getStateByline: function () {
  20220.       return !1
  20221.     }
  20222.   }),
  20223.   j = a.View.extend({
  20224.     template: h,
  20225.     itemViewContainer: '.post-list',
  20226.     initialize: function (a) {
  20227.       b.extend(this, b.pick(a, [
  20228.         'thread',
  20229.         'session',
  20230.         'userSuggestions',
  20231.         'config'
  20232.       ])),
  20233.       this.listenTo(this.thread, 'change:highlightedPost', this.reset)
  20234.     },
  20235.     getPost: function () {
  20236.       return this.post ? c.Deferred().resolve(this.post) : this.getHighlightedPost()
  20237.     },
  20238.     _getHighlightedPost: function () {
  20239.       var a = this.thread.get('highlightedPost');
  20240.       return a ? (a instanceof f.Post || (a = new e(f.Post, a)), a.get('isDeleted') ? null : a.get('sb') && !a.isAuthorSessionUser(this.session) ? null : a.get('isHighlighted') ? a : null) : null
  20241.     },
  20242.     getHighlightedPost: function () {
  20243.       var a,
  20244.       e = this.post = this._getHighlightedPost(),
  20245.       g = c.Deferred();
  20246.       return e ? !(a = e.getParent()) || a.author || d.isFeatureActive('embed_refresh', {
  20247.         forum: this.thread.forum.id
  20248.       }) ? e.sync('read', e, {
  20249.         isHighlighted: !0
  20250.       }).always(b.bind(g.resolve, g)) : f.Post.fetchContext(e.id, this.thread).always(b.bind(g.resolve, g)) : g.reject(),
  20251.       g.promise()
  20252.     },
  20253.     reset: function () {
  20254.       delete this.post,
  20255.       this.getPost().always(b.bind(this.render, this))
  20256.     },
  20257.     createPostView: function () {
  20258.       return this.post ? new i({
  20259.         model: this.post,
  20260.         thread: this.thread,
  20261.         session: this.session,
  20262.         userSuggestions: this.userSuggestions,
  20263.         config: this.config,
  20264.         excludeAnchor: !0
  20265.       }).stopListening(this.post.usersTyping) : null
  20266.     },
  20267.     render: function () {
  20268.       var a = this.createPostView();
  20269.       return a ? (a.render(), this.$el.html(this.template({
  20270.         isRefreshEnabled: d.isFeatureActive('embed_refresh', {
  20271.           forum: this.thread.forum.id
  20272.         })
  20273.       })), this.$(this.itemViewContainer).append(a.el), this.$el.show(), this) : (this.$el.hide(), this)
  20274.     }
  20275.   });
  20276.   return {
  20277.     HighlightedPostView: j,
  20278.     FeaturedPostView: i
  20279.   }
  20280. }),
  20281. define('templates/lounge/realtimeCommentNotification', [
  20282.   'core/strings',
  20283.   'core/switches'
  20284. ], function (a, b) {
  20285.   'use strict';
  20286.   var c = a.gettext,
  20287.   d = function (a) {
  20288.     var d = b.isFeatureActive('embed_refresh', {
  20289.       forum: a.forumId
  20290.     });
  20291.     return 1 === a.comments ? c(d ? '+1 new comment' : 'Show One New Comment') : d ? c('+%(comments)s new comments', {
  20292.       comments: a.comments
  20293.     }) : c('Show %(comments)s New Comments', {
  20294.       comments: a.comments
  20295.     })
  20296.   };
  20297.   return d
  20298. }),
  20299. define('templates/lounge/realtimeReplyNotification', [
  20300.   'react',
  20301.   'core/strings',
  20302.   'core/switches'
  20303. ], function (a, b, c) {
  20304.   'use strict';
  20305.   var d = b.gettext,
  20306.   e = function (b) {
  20307.     var e = c.isFeatureActive('embed_refresh', {
  20308.       forum: b.forumId
  20309.     }),
  20310.     f = e ? 'indicator indicator--refresh' : 'indicator';
  20311.     return 1 === b.replies ? [
  20312.       a.createElement('span', {
  20313.         key: 'indicator',
  20314.         className: f
  20315.       }),
  20316.       d(e ? '+1 new reply' : 'Show 1 new reply')
  20317.     ] : [
  20318.       a.createElement('span', {
  20319.         key: 'indicator',
  20320.         className: f
  20321.       }),
  20322.       e ? d('+%(replies)s new replies', {
  20323.         replies: b.replies
  20324.       }) : d('Show %(replies)s new replies', {
  20325.         replies: b.replies
  20326.       })
  20327.     ]
  20328.   };
  20329.   return e
  20330. }),
  20331. define('lounge/views/realtime', [
  20332.   'underscore',
  20333.   'backbone',
  20334.   'react',
  20335.   'react-dom',
  20336.   'core/bus',
  20337.   'core/utils',
  20338.   'core/utils/object/get',
  20339.   'lounge/common',
  20340.   'templates/lounge/realtimeCommentNotification',
  20341.   'templates/lounge/realtimeReplyNotification'
  20342. ], function (a, b, c, d, e, f, g, h, i, j) {
  20343.   'use strict';
  20344.   var k = f.preventDefaultHandler,
  20345.   l = b.View.extend({
  20346.     events: {
  20347.       click: 'handleDrain'
  20348.     },
  20349.     initialize: function (a) {
  20350.       this.options = a
  20351.     },
  20352.     getDirection: function (a) {
  20353.       if (this.offset && this.dim) {
  20354.         var b = a.pageOffset,
  20355.         c = b + a.height,
  20356.         d = this.offset.top + a.frameOffset.top,
  20357.         e = d + this.dim.height;
  20358.         return e < b ? 1 : d > c ? - 1 : 0
  20359.       }
  20360.     },
  20361.     setCount: function (a) {
  20362.       this.options.count = a
  20363.     },
  20364.     render: function () {
  20365.       return 0 === this.options.count ? void this.$el.hide() : (d.render(c.createElement(i, {
  20366.         comments: this.options.count,
  20367.         forumId: this.model.get('forum')
  20368.       }), this.el), this.listenTo(h.getLounge(), 'domReflow', a.throttle(function () {
  20369.         0 !== this.options.count && (this.offset = this.$el.offset(), this.dim = {
  20370.           height: this.$el.height(),
  20371.           width: this.$el.width()
  20372.         })
  20373.       }, 400)), this.$el.show(), this)
  20374.     },
  20375.     handleDrain: k(function () {
  20376.       this.model.queue.drain(),
  20377.       this.setCount(this.model.queue.counters.comments),
  20378.       this.render(),
  20379.       e.trigger('uiAction:loadLiveComments')
  20380.     })
  20381.   }),
  20382.   m = l.extend({
  20383.     events: {
  20384.       click: 'handleDrain'
  20385.     },
  20386.     getDirection: function (a) {
  20387.       if (this.options.postView.visible) {
  20388.         this.offset = this.options.postView.offset,
  20389.         this.dim = this.options.postView.dim;
  20390.         var b = l.prototype.getDirection.call(this, a);
  20391.         return delete this.offset,
  20392.         delete this.dim,
  20393.         b
  20394.       }
  20395.     },
  20396.     render: function () {
  20397.       var b = this,
  20398.       e = b.options.postView;
  20399.       return 0 === b.options.count ? (b.$el.hide(), void (e.trackPosition = !1)) : (e.trackPosition = !0, e.calcRect(), d.render(c.createElement(j, {
  20400.         replies: b.options.count,
  20401.         forumId: this.model.get('forum')
  20402.       }), this.el), b.$el.show(), void a.delay(function () {
  20403.         b.$el.addClass('reveal')
  20404.       }, 13))
  20405.     },
  20406.     handleDrain: k(function () {
  20407.       var a = this.model.id,
  20408.       b = this.options.postView,
  20409.       c = this.options.thread.queue;
  20410.       c.drain(a),
  20411.       this.setCount(c.counters.replies[a]),
  20412.       b.trackPosition = !1,
  20413.       this.render(),
  20414.       e.trigger('uiAction:loadLiveReplies')
  20415.     })
  20416.   });
  20417.   return {
  20418.     QueuedPostView: l,
  20419.     QueuedReplyView: m
  20420.   }
  20421. }),
  20422. define('lounge/views/posts/UserSuggestionsManager', [
  20423.   'underscore',
  20424.   'common/collections'
  20425. ], function (a, b) {
  20426.   'use strict';
  20427.   function c(a) {
  20428.     this.remotes = [
  20429.     ],
  20430.     this.threadId = a.threadId,
  20431.     this.userCollection = new b.UserSuggestionsCollection([], {
  20432.       threadId: this.threadId
  20433.     })
  20434.   }
  20435.   return a.extend(c.prototype, {
  20436.     fetch: function (a, b) {
  20437.       this.userCollection.fetch({
  20438.         query: a || '',
  20439.         next: b
  20440.       })
  20441.     },
  20442.     addRemote: function (a) {
  20443.       this.remotes.push(a)
  20444.     },
  20445.     all: function () {
  20446.       var c = new b.UserCollection;
  20447.       return c.add(this.userCollection.models),
  20448.       c.add(a.chain(this.remotes).pluck('models').flatten().value()),
  20449.       c
  20450.     },
  20451.     find: function (a, b) {
  20452.       a && a.length && this.fetch(a.join(' ').replace(/[^\w\s]/, ''), b)
  20453.     },
  20454.     get: function (a) {
  20455.       return this.userCollection.get(a)
  20456.     }
  20457.   }),
  20458.   c
  20459. }),
  20460. define('lounge/views/sidebar', [
  20461.   'underscore',
  20462.   'backbone',
  20463.   'modernizr',
  20464.   'core/bus',
  20465.   'core/switches',
  20466.   'core/utils/url/serialize',
  20467.   'core/shared/urls',
  20468.   'core/utils'
  20469. ], function (a, b, c, d, e, f, g, h) {
  20470.   'use strict';
  20471.   var i = b.View.extend({
  20472.     initialize: function (a) {
  20473.       this.forum = a.forum,
  20474.       this.session = a.session,
  20475.       this.config = a.config,
  20476.       this.language = window.document.documentElement.lang,
  20477.       'en' === this.language && (this.language = void 0),
  20478.       this.listenTo(this.session, 'change:id', this.destroyHome),
  20479.       this.listenTo(d, {
  20480.         'sidebar:open': this.open,
  20481.         'sidebar:preload': this.preload
  20482.       }),
  20483.       this.iframeAlive = !0,
  20484.       this.iframeReady = !1,
  20485.       this.listenToOnce(d.frame, 'home.timeout', this.handleTimeout),
  20486.       this.listenToOnce(d.frame, 'home.ready', this.handleReady)
  20487.     },
  20488.     isIE9: function () {
  20489.       return 9 === window.document.documentMode
  20490.     },
  20491.     shouldUseIframe: function () {
  20492.       return !!this.iframeAlive && (this.session.isSSO() || this.forum && this.forum.get('settings').sidebarEnabled)
  20493.     },
  20494.     handleTimeout: function () {
  20495.       this.iframeAlive = !1
  20496.     },
  20497.     handleReady: function () {
  20498.       this.iframeReady = !0,
  20499.       d.frame.off('home.timeout')
  20500.     },
  20501.     open: function (b, c) {
  20502.       if (this.shouldUseIframe()) {
  20503.         if (this.storeHomeSession(), d.frame.sendHostMessage('home.show', {
  20504.           path: b,
  20505.           language: this.language,
  20506.           forum: this.forum && this.forum.id
  20507.         }), this.iframeReady || this.listenToOnce(d.frame, 'home.timeout', a.bind(this.open, this, b, c)), c) {
  20508.           c.trigger('sidebar:open:start');
  20509.           var e = a.bind(c.trigger, c, 'sidebar:open:done');
  20510.           this.listenToOnce(d.frame, {
  20511.             'home.opened': e,
  20512.             'home.timeout': e
  20513.           })
  20514.         }
  20515.       } else h.openWindow(f(g.apps.home + b, {
  20516.         l: this.language
  20517.       }));
  20518.       var i = 'unknown';
  20519.       0 === b.indexOf('home/forums/') ? i = 'community' : 0 === b.indexOf('by/') ? i = 'profile' : 'home/inbox/' === b && (i = 'notifications'),
  20520.       d.trigger('uiAction:openHome', i, this.shouldUseIframe())
  20521.     },
  20522.     destroyHome: function () {
  20523.       d.frame.sendHostMessage('home.destroy')
  20524.     },
  20525.     preload: function () {
  20526.       this.session.isLoggedOut() || this.shouldUseIframe() && (this.storeHomeSession(), d.frame.sendHostMessage('home.preload', {
  20527.         language: this.language
  20528.       }))
  20529.     },
  20530.     storeHomeSession: function () {
  20531.       c.sessionstorage && window.sessionStorage.setItem('home.session', JSON.stringify(this.session.user.toJSON()))
  20532.     }
  20533.   });
  20534.   return i
  20535. }),
  20536. define('core/constants/ratingsConstants', [
  20537.   'exports'
  20538. ], function (a) {
  20539.   'use strict';
  20540.   a.DEFAULT_RATINGS = {
  20541.     average: 0,
  20542.     breakdown: {
  20543.       1: 0,
  20544.       2: 0,
  20545.       3: 0,
  20546.       4: 0,
  20547.       5: 0
  20548.     },
  20549.     count: 0
  20550.   }
  20551. });
  20552. var _slicedToArray = function () {
  20553.   function a(a, b) {
  20554.     var c = [
  20555.     ],
  20556.     d = !0,
  20557.     e = !1,
  20558.     f = void 0;
  20559.     try {
  20560.       for (var g, h = a[Symbol.iterator](); !(d = (g = h.next()).done) && (c.push(g.value), !b || c.length !== b); d = !0);
  20561.     } catch (i) {
  20562.       e = !0,
  20563.       f = i
  20564.     } finally {
  20565.       try {
  20566.         !d && h['return'] && h['return']()
  20567.       } finally {
  20568.         if (e) throw f
  20569.       }
  20570.     }
  20571.     return c
  20572.   }
  20573.   return function (b, c) {
  20574.     if (Array.isArray(b)) return b;
  20575.     if (Symbol.iterator in Object(b)) return a(b, c);
  20576.     throw new TypeError('Invalid attempt to destructure non-iterable instance')
  20577.   }
  20578. }();
  20579. define('core/templates/react/RatingsScoreTemplate', [
  20580.   'react',
  20581.   'underscore',
  20582.   'core/strings'
  20583. ], function (a, b, c) {
  20584.   'use strict';
  20585.   var d = function (b) {
  20586.     var c = b.breakdown,
  20587.     d = b.totalCount;
  20588.     return a.createElement('div', {
  20589.       className: 'ratings-breakdown-units align align--stretch'
  20590.     }, a.createElement('div', {
  20591.       className: 'align__item--flex-1 align align--column'
  20592.     }, c.map(function (b, c) {
  20593.       var e = b.rating,
  20594.       f = b.count,
  20595.       g = b.percentage;
  20596.       return a.createElement('div', {
  20597.         className: 'ratings-breakdown-unit-row align align--middle',
  20598.         key: c
  20599.       }, a.createElement('div', {
  20600.         className: 'ratings-breakdown-text'
  20601.       }, e, ' ', a.createElement('div', {
  20602.         className: 'rating-star'
  20603.       }, '★')), a.createElement('div', {
  20604.         className: 'align__item--flex-1 align align--center align--middle'
  20605.       }, a.createElement('div', {
  20606.         className: 'ratings-breakdown-outer-bar'
  20607.       }, a.createElement('div', {
  20608.         className: 'ratings-breakdown-inner-bar' + (d && f ? '' : ' no-rating'),
  20609.         style: {
  20610.           width: g / 2 + 'px'
  20611.         }
  20612.       }))))
  20613.     })), a.createElement('div', {
  20614.       className: 'align align--column'
  20615.     }, c.map(function (b, c) {
  20616.       var d = b.percentage;
  20617.       return a.createElement('div', {
  20618.         key: c,
  20619.         className: 'ratings-breakdown-unit-row ratings-breakdown-percentage align__item--flex-1 align align--center'
  20620.       }, a.createElement('div', {
  20621.         className: 'align__item--flex-1 text-right'
  20622.       }, d, '%'))
  20623.     })), a.createElement('div', {
  20624.       className: 'align align--column'
  20625.     }, c.map(function (b, c) {
  20626.       var d = b.count;
  20627.       return a.createElement('div', {
  20628.         key: c,
  20629.         className: 'ratings-breakdown-unit-row ratings-breakdown-percentage align__item--flex-1 align align--center'
  20630.       }, a.createElement('div', {
  20631.         className: 'align__item--flex-1 text-left'
  20632.       }, '(', d, ')'))
  20633.     })))
  20634.   },
  20635.   e = function (e) {
  20636.     var f = e.totalCount,
  20637.     g = e.average,
  20638.     h = e.breakdown,
  20639.     i = e.error,
  20640.     j = e.expandClass;
  20641.     return a.createElement('div', {
  20642.       className: 'ratings-score'
  20643.     }, a.createElement('div', {
  20644.       className: 'spacing-top-small align align--center'
  20645.     }, 1 === f ? c.gettext('1 Rating') : c.gettext('%(totalCount)s Ratings', {
  20646.       totalCount: f
  20647.     })), a.createElement('div', {
  20648.       className: 'ratings-items align align--center align--middle',
  20649.       tabIndex: '0'
  20650.     }, a.createElement('div', {
  20651.       className: 'ratings-stars'
  20652.     }, a.createElement('div', {
  20653.       className: 'stars score-stars',
  20654.       style: {
  20655.         width: 20 * g + '%'
  20656.       }
  20657.     }, a.createElement('div', {
  20658.       className: 'rating-star'
  20659.     }, '★'), a.createElement('div', {
  20660.       className: 'rating-star'
  20661.     }, '★'), a.createElement('div', {
  20662.       className: 'rating-star'
  20663.     }, '★'), a.createElement('div', {
  20664.       className: 'rating-star'
  20665.     }, '★'), a.createElement('div', {
  20666.       className: 'rating-star'
  20667.     }, '★')), a.createElement('div', {
  20668.       className: 'stars base-stars'
  20669.     }, a.createElement('div', {
  20670.       className: 'rating-star'
  20671.     }, '★'), a.createElement('div', {
  20672.       className: 'rating-star'
  20673.     }, '★'), a.createElement('div', {
  20674.       className: 'rating-star'
  20675.     }, '★'), a.createElement('div', {
  20676.       className: 'rating-star'
  20677.     }, '★'), a.createElement('div', {
  20678.       className: 'rating-star'
  20679.     }, '★'))), a.createElement('div', {
  20680.       className: 'ratings-average'
  20681.     }, (Math.round(10 * g) / 10).toFixed(1), a.createElement('div', {
  20682.       className: 'ratings-breakdown ' + j
  20683.     }, a.createElement('div', {
  20684.       className: 'ratings-breakdown-notch-border'
  20685.     }), a.createElement('div', {
  20686.       className: 'ratings-breakdown-notch'
  20687.     }), a.createElement(d, {
  20688.       breakdown: b.sortBy(b.mapObject(h, function (a, b) {
  20689.         return [Number(b),
  20690.         a]
  20691.       }), function (a) {
  20692.         return - a[0]
  20693.       }).map(function (a) {
  20694.         var b = _slicedToArray(a, 2),
  20695.         c = b[0],
  20696.         d = b[1];
  20697.         return {
  20698.           rating: c,
  20699.           count: d,
  20700.           percentage: f && d ? (100 * d / f).toFixed() : 0
  20701.         }
  20702.       }),
  20703.       totalCount: f
  20704.     })))), a.createElement('div', {
  20705.       className: 'err text-semibold'
  20706.     }, i || ''))
  20707.   };
  20708.   return e
  20709. });
  20710. var _extends = Object.assign || function (a) {
  20711.   for (var b = 1; b < arguments.length; b++) {
  20712.     var c = arguments[b];
  20713.     for (var d in c) Object.prototype.hasOwnProperty.call(c, d) && (a[d] = c[d])
  20714.   }
  20715.   return a
  20716. };
  20717. define('lounge/views/ratings', [
  20718.   'underscore',
  20719.   'backbone',
  20720.   'react',
  20721.   'react-dom',
  20722.   'core/constants/ratingsConstants',
  20723.   'core/utils/threadRatingsHelpers',
  20724.   'core/templates/react/RatingsScoreTemplate'
  20725. ], function (a, b, c, d, e, f, g) {
  20726.   'use strict';
  20727.   var h = b.View.extend({
  20728.     initialize: function (a) {
  20729.       this.session = a.session,
  20730.       this.thread = a.thread,
  20731.       this.error = null,
  20732.       this.listenTo(this.thread, 'change:ratingsEnabled change:ratings', this.render),
  20733.       this.thread.forum.get('features') || this.listenToOnce(this.thread.forum, 'change:features', this.render)
  20734.     },
  20735.     setError: function () {
  20736.       var b = this;
  20737.       this.error = 'You must be logged in to rate this page',
  20738.       this.render(),
  20739.       setTimeout(a.bind(function () {
  20740.         b.error = null,
  20741.         b.render()
  20742.       }, this), 5000)
  20743.     },
  20744.     render: function () {
  20745.       if (f.isThreadModelRatingsEnabled(this.thread)) {
  20746.         var a = this.thread.get('ratings') || e.DEFAULT_RATINGS;
  20747.         d.render(c.createElement(g, _extends({
  20748.         }, a, {
  20749.           totalCount: a.count || 0,
  20750.           error: this.error,
  20751.           expandClass: 'expand-below'
  20752.         })), this.el)
  20753.       } else this.$el.empty();
  20754.       return this
  20755.     }
  20756.   });
  20757.   return h
  20758. }),
  20759. define('core/utils/reactions', [
  20760.   'jquery',
  20761.   'underscore',
  20762.   'core/switches'
  20763. ], function (a, b, c) {
  20764.   'use strict';
  20765.   var d = function (b) {
  20766.     for (var d, e = c.isFeatureActive('embed_refresh', {
  20767.       forum: b
  20768.     }), f = e && c.isFeatureActive('embed_refresh_v2', {
  20769.       forum: b
  20770.     }), g = 24, h = a('#reactions').width(), i = a('.reaction-item').map(function (b, c) {
  20771.       return e ? Math.ceil(a(c) [0].getBoundingClientRect().width) : a(c).width()
  20772.     }).get(), j = 0, k = [
  20773.     ]; !d && j < a('.reaction-item').length; ) {
  20774.       j += 1,
  20775.       d = !0;
  20776.       var l = Math.ceil(i.length / j);
  20777.       k = [
  20778.       ];
  20779.       for (var m = 0; m < j; m++) {
  20780.         var n = i.slice(l * m, l * (m + 1)),
  20781.         o = (n.length - 1) * g,
  20782.         p = n.reduce(function (a, b) {
  20783.           return a + b
  20784.         }, 0) + (e && !f ? o : 0);
  20785.         if (p >= h) {
  20786.           d = !1;
  20787.           break
  20788.         }
  20789.         k.push(p)
  20790.       }
  20791.     }
  20792.     if (e) {
  20793.       var q = 16;
  20794.       a('.reaction-tooltip').each(function (b, c) {
  20795.         a(c).height() > q && (c.style.top = '-68px')
  20796.       })
  20797.     }
  20798.     a('.reaction-items__container').width(Math.max.apply(null, k) + 1)
  20799.   },
  20800.   e = function (b) {
  20801.     var c = a('.reaction-items').width();
  20802.     c !== b._lastReactionsWidth && (b._lastReactionsWidth = c, d(b.forum))
  20803.   },
  20804.   f = function (c) {
  20805.     c._lastReactionsWidth = a('.reaction-items').width();
  20806.     var d = 200;
  20807.     c._reactionsResizeListener = b.debounce(b.partial(e, c), d),
  20808.     a(window).resize(c._reactionsResizeListener)
  20809.   },
  20810.   g = function (b) {
  20811.     b._reactionsResizeListener && a(window).off('resize', b._reactionsResizeListener)
  20812.   };
  20813.   return {
  20814.     attachReactionsListener: f,
  20815.     formatReactionsItems: d,
  20816.     detachReactionsListener: g
  20817.   }
  20818. }),
  20819. define('core/constants/reactionConstants', [
  20820.   'exports',
  20821.   'core/strings'
  20822. ], function (a, b) {
  20823.   'use strict';
  20824.   var c = b.get,
  20825.   d = '//c.disquscdn.com/next/current/publisher-admin/assets/img/emoji/';
  20826.   a.DEFAULT_REACTIONS = [
  20827.     {
  20828.       text: 'Upvote',
  20829.       imageUrl: d + 'upvote-512x512.png'
  20830.     },
  20831.     {
  20832.       text: 'Funny',
  20833.       imageUrl: d + 'funny-512x512.png'
  20834.     },
  20835.     {
  20836.       text: 'Love',
  20837.       imageUrl: d + 'love-512x512.png'
  20838.     },
  20839.     {
  20840.       text: 'Surprised',
  20841.       imageUrl: d + 'surprised-512x512.png'
  20842.     },
  20843.     {
  20844.       text: 'Angry',
  20845.       imageUrl: d + 'angry-512x512.png'
  20846.     },
  20847.     {
  20848.       text: 'Sad',
  20849.       imageUrl: d + 'sad-512x512.png'
  20850.     }
  20851.   ],
  20852.   a.DEFAULT_PROMPT = c('What do you think?'),
  20853.   a.DEFAULT_DESCRIPTIONS = [
  20854.     'Upvote',
  20855.     'Funny',
  20856.     'Love',
  20857.     'Surprised',
  20858.     'Angry',
  20859.     'Sad'
  20860.   ],
  20861.   a.UPLOAD_IMAGE_ERROR_MESSAGES = {
  20862.     'invalid-image-file': 'Unfortunately your image upload failed. Please verify that the file is valid and in a supported format (JPEG, PNG, or GIF).',
  20863.     'invalid-content-type': 'Unfortunately your image upload failed. Please verify that the file is in a supported format (JPEG, PNG, or GIF).',
  20864.     'file-too-large': 'Unfortunately your image upload failed. Please verify that your image is under 5MB.',
  20865.     'not-authenticated': 'You must be logged in to upload an image.',
  20866.     'default': 'Unfortunately your image upload failed. Please verify that your image is in a supported format (JPEG, PNG, or GIF) and under 5MB. If you continue seeing this error, please try again later.'
  20867.   }
  20868. });
  20869. var _extends = Object.assign || function (a) {
  20870.   for (var b = 1; b < arguments.length; b++) {
  20871.     var c = arguments[b];
  20872.     for (var d in c) Object.prototype.hasOwnProperty.call(c, d) && (a[d] = c[d])
  20873.   }
  20874.   return a
  20875. };
  20876. define('core/templates/react/ReactionItemsPartial', [
  20877.   'react',
  20878.   'core/constants/reactionConstants'
  20879. ], function (a, b) {
  20880.   'use strict';
  20881.   var c = function (c) {
  20882.     var d = c.reactionsList,
  20883.     e = c.onSubmitReaction,
  20884.     f = c.showVoteCount,
  20885.     g = c.readonly,
  20886.     h = c.isRefreshEnabled,
  20887.     i = c.isRefreshV2Enabled,
  20888.     j = h ? 'reaction-items__container--refresh' : '',
  20889.     k = h ? 'reaction-item reaction-item--refresh' : 'reaction-item align align--column align--middle spacing-bottom-narrow',
  20890.     l = h ? 'reaction-item__button reaction-item__button--refresh' : 'align align--middle align--column reaction-item__button',
  20891.     m = h ? 'reaction-item__votes reaction-item__votes--refresh' : 'reaction-item__votes',
  20892.     n = h ? 'reaction-item__votes-wrapper reaction-item__votes-wrapper--refresh' : 'reaction-item__votes-wrapper',
  20893.     o = h ? 'reaction-item__image-wrapper reaction-item__image-wrapper--refresh' : 'reaction-item__image-wrapper',
  20894.     p = h ? 'reaction-item__image reaction-item__image--refresh' : 'reaction-item__image',
  20895.     q = 'reaction-vote',
  20896.     r = function (a, b) {
  20897.       e && !g && e(a, b)
  20898.     },
  20899.     s = function (a, b, c) {
  20900.       var d = 13;
  20901.       a.keyCode === d && r(b, c)
  20902.     },
  20903.     t = d.map(function (a) {
  20904.       if (!a.imageUrl) return a;
  20905.       var c = a.imageUrl.split('/'),
  20906.       d = b.DEFAULT_REACTIONS.filter(function (a) {
  20907.         var b = a.imageUrl.split('/');
  20908.         return b[b.length - 1].split('-') [0].split('.') [0] === c[c.length - 1].split('-') [0].split('.') [0]
  20909.       }),
  20910.       e = (d.length ? d[0] : a).imageUrl;
  20911.       return _extends({
  20912.       }, a, {
  20913.         imageUrl: e
  20914.       })
  20915.     }),
  20916.     u = function (a) {
  20917.       if (a > 999) {
  20918.         var b = a.toString();
  20919.         return a < 9999 ? b[0] + '.' + b[1] + 'k' : a < 99999 ? b.slice(0, 2) + '.' + b[2] + 'k' : a < 999999 ? b.slice(0, 3) + '.' + b[3] + 'k' : b[0] + '.' + b[1] + 'm'
  20920.       }
  20921.       return a
  20922.     },
  20923.     v = function (a) {
  20924.       return (!h || i) && a.text && a.text.trim()
  20925.     };
  20926.     return a.createElement('div', {
  20927.       className: 'align align--center align--wrap reaction-items__container ' + j
  20928.     }, t.map(function (b, c) {
  20929.       return a.createElement('div', {
  20930.         key: c,
  20931.         className: [
  20932.           k,
  20933.           e ? 'reaction-item__enabled' : 'reaction-item__disabled',
  20934.           b.isSelected ? 'reaction-item__selected' : ''
  20935.         ].join(' ').trim()
  20936.       }, a.createElement('div', {
  20937.         className: l,
  20938.         tabIndex: g ? '-1' : '0',
  20939.         onKeyPress: function (a) {
  20940.           return s(a, c, b)
  20941.         },
  20942.         onClick: function () {
  20943.           return r(c, b)
  20944.         }
  20945.       }, a.createElement('div', {
  20946.         className: o
  20947.       }, b.imageUrl ? a.createElement('img', {
  20948.         className: p,
  20949.         src: b.imageUrl,
  20950.         title: b.text || 'reaction ' + c,
  20951.         alt: b.text || 'reaction ' + c
  20952.       }) : null, !i && f ? a.createElement('div', {
  20953.         className: n
  20954.       }, void 0 !== b.votes && f ? a.createElement('div', {
  20955.         className: m
  20956.       }, b.votes || 0) : a.createElement('div', {
  20957.         className: m
  20958.       }, ' ')) : null), i ? a.createElement('div', {
  20959.         className: q
  20960.       }, f ? a.createElement('div', {
  20961.         className: n
  20962.       }, void 0 !== b.votes && f ? a.createElement('div', {
  20963.         className: m
  20964.       }, u(b.votes) || 0) : a.createElement('div', {
  20965.         className: m
  20966.       }, ' ')) : null) : null, v(b) ? a.createElement('div', {
  20967.         className: 'reaction-item__text'
  20968.       }, b.text) : null), h && !i ? a.createElement('div', {
  20969.         className: 'reaction-tooltip'
  20970.       }, a.createElement('span', {
  20971.         className: 'reaction-tooltip__text'
  20972.       }, b.text), a.createElement('div', {
  20973.         className: 'reaction-tooltip__triangle'
  20974.       }, a.createElement('div', {
  20975.         className: 'reaction-tooltip__inner-triangle'
  20976.       }))) : null)
  20977.     }))
  20978.   };
  20979.   return c
  20980. }),
  20981. define('core/templates/react/ReactionsTemplate', [
  20982.   'react',
  20983.   'core/strings',
  20984.   'core/templates/react/ReactionItemsPartial',
  20985.   'core/constants/reactionConstants',
  20986.   'core/switches'
  20987. ], function (a, b, c, d, e) {
  20988.   'use strict';
  20989.   var f = function (f) {
  20990.     var g = f.reactionsList,
  20991.     h = f.prompt,
  20992.     i = f.onSubmitReaction,
  20993.     j = f.error,
  20994.     k = f.readonly,
  20995.     l = f.userCanModerate,
  20996.     m = f.forum,
  20997.     n = e.isFeatureActive('embed_refresh', {
  20998.       forum: m
  20999.     }),
  21000.     o = n && e.isFeatureActive('embed_refresh_v2', {
  21001.       forum: m
  21002.     }),
  21003.     p = n ? 'reactions-refresh' : '',
  21004.     q = g.reduce(function (a, b) {
  21005.       return a + ('number' == typeof b.votes ? b.votes : 0)
  21006.     }, 0),
  21007.     r = g.some(function (a) {
  21008.       return a.isSelected
  21009.     });
  21010.     return a.createElement('div', {
  21011.       id: 'reactions',
  21012.       className: p
  21013.     }, a.createElement('div', {
  21014.       className: 'text-bold align align--center spacing-bottom-small prompt'
  21015.     }, h && h.trim() || d.DEFAULT_PROMPT), a.createElement('div', {
  21016.       className: 'align align--center spacing-bottom'
  21017.     }, 1 === q ? b.gettext('1 Response') : b.gettext('%(voteCount)s Responses', {
  21018.       voteCount: q
  21019.     })), a.createElement('div', {
  21020.       className: [
  21021.         'reaction-items',
  21022.         k ? 'readonly' : '',
  21023.         r ? 'has-selection' : '',
  21024.         l || r || k ? 'counts-visible' : ''
  21025.       ].join(' ').trim()
  21026.     }, a.createElement(c, {
  21027.       reactionsList: g,
  21028.       onSubmitReaction: i,
  21029.       showVoteCount: l || r || k,
  21030.       readonly: k,
  21031.       isRefreshEnabled: n,
  21032.       isRefreshV2Enabled: o
  21033.     })), a.createElement('div', {
  21034.       className: 'err text-semibold'
  21035.     }, j || ''))
  21036.   };
  21037.   return f
  21038. }),
  21039. define('lounge/views/reactions', [
  21040.   'backbone',
  21041.   'react',
  21042.   'react-dom',
  21043.   'core/bus',
  21044.   'core/utils/reactions',
  21045.   'core/switches',
  21046.   'core/templates/react/ReactionsTemplate'
  21047. ], function (a, b, c, d, e, f, g) {
  21048.   'use strict';
  21049.   var h = a.View.extend({
  21050.     initialize: function (a) {
  21051.       this.reactions = a.reactions,
  21052.       this.readonly = a.readonly,
  21053.       this.session = a.session,
  21054.       this.forum = a.forum,
  21055.       this.userCanModerate = this.session.get('canModerate'),
  21056.       this.isRefreshEnabled = f.isFeatureActive('embed_refresh', {
  21057.         forum: this.forum
  21058.       }),
  21059.       this.listenTo(this.reactions, 'sync', this.render),
  21060.       this.listenTo(this.reactions, 'vote:start', this.handleSubmitStart),
  21061.       this.listenTo(this.reactions, 'vote:end', this.handleSubmitEnd),
  21062.       this.listenTo(this.session, 'change:canModerate', this.handleCanModerateChange),
  21063.       e.attachReactionsListener(this)
  21064.     },
  21065.     handleSubmitStart: function () {
  21066.       this.isSubmitting = !0,
  21067.       this.$('.reaction-items').addClass('is-submitting'),
  21068.       this.$('.err').html()
  21069.     },
  21070.     handleSubmitEnd: function () {
  21071.       this.isSubmitting = !1,
  21072.       this.$('.reaction-items').removeClass('is-submitting')
  21073.     },
  21074.     handleCanModerateChange: function () {
  21075.       this.userCanModerate = this.session.get('canModerate'),
  21076.       this.render()
  21077.     },
  21078.     vote: function (a) {
  21079.       if (!this.isSubmitting && !this.readonly) {
  21080.         var b = this;
  21081.         this.reactions.vote(a, {
  21082.           success: this.render.bind(this),
  21083.           error: function () {
  21084.             b.$('.err').html('An error has occurred while saving your reaction. Please try again later.')
  21085.           }
  21086.         }),
  21087.         d.trigger('uiAction:reactionsVote', this.reactions.at(a))
  21088.       }
  21089.     },
  21090.     render: function () {
  21091.       return this.reactions.length ? (c.render(b.createElement(g, {
  21092.         reactionsList: this.reactions.toJSON(),
  21093.         prompt: this.reactions.prompt,
  21094.         onSubmitReaction: this.vote.bind(this),
  21095.         readonly: this.readonly,
  21096.         userCanModerate: this.userCanModerate,
  21097.         forum: this.forum
  21098.       }), this.el), this.isRefreshEnabled && e.formatReactionsItems(this.forum)) : this.$el.html(''),
  21099.       this
  21100.     }
  21101.   });
  21102.   return h
  21103. }),
  21104. define('templates/lounge/reactionsPromotion', [
  21105.   'react',
  21106.   'core/strings',
  21107.   'core/templates/react/ReactionItemsPartial',
  21108.   'core/constants/reactionConstants'
  21109. ], function (a, b, c, d) {
  21110.   'use strict';
  21111.   var e = b.gettext,
  21112.   f = function (b) {
  21113.     var f = b.onConfirm,
  21114.     g = b.onDefer,
  21115.     h = b.forumShortname;
  21116.     return a.createElement('div', {
  21117.       id: 'reactions-promotion'
  21118.     }, a.createElement('div', {
  21119.       className: 'striped-bar'
  21120.     }), a.createElement('div', {
  21121.       className: 'align align--center private'
  21122.     }, a.createElement('span', {
  21123.       className: 'icon icon-lock'
  21124.     }), e('Only you can see this')), a.createElement('div', {
  21125.       className: 'promotion-title text-bold align align--center spacing-top-narrow spacing-bottom'
  21126.     }, e('Want to increase engagement? Add Reactions to your articles.')), a.createElement('div', {
  21127.       className: 'reaction-items'
  21128.     }, a.createElement(c, {
  21129.       reactionsList: d.DEFAULT_REACTIONS,
  21130.       readonly: !0
  21131.     })), a.createElement('div', {
  21132.       className: 'align align--center'
  21133.     }, a.createElement('button', {
  21134.       className: 'btn btn-info',
  21135.       onClick: g
  21136.     }, e('Maybe later')), a.createElement('a', {
  21137.       className: 'btn btn-primary spacing-left',
  21138.       onClick: f,
  21139.       target: '_blank',
  21140.       rel: 'noopener noreferrer',
  21141.       href: 'https://' + h + '.disqus.com/admin/settings/reactions/'
  21142.     }, 'Enable Reactions')))
  21143.   };
  21144.   return f
  21145. }),
  21146. define('lounge/views/reactions-promotion', [
  21147.   'backbone',
  21148.   'stance',
  21149.   'react',
  21150.   'react-dom',
  21151.   'core/api',
  21152.   'lounge/common',
  21153.   'templates/lounge/reactionsPromotion'
  21154. ], function (a, b, c, d, e, f, g) {
  21155.   'use strict';
  21156.   var h = a.View.extend({
  21157.     initialize: function (a) {
  21158.       this.forum = a.forum,
  21159.       this.listenToOnce(b(this), 'visible', this.trackView)
  21160.     },
  21161.     onConfirm: function () {
  21162.       f.getLounge().trigger('uiAction:reactionsEnable'),
  21163.       this.onDismiss()
  21164.     },
  21165.     onDefer: function () {
  21166.       f.getLounge().trigger('uiAction:reactionsDefer'),
  21167.       this.onDismiss()
  21168.     },
  21169.     onDismiss: function () {
  21170.       this.dismissed = !0,
  21171.       this.render(),
  21172.       e.call('announcements/messages/view', {
  21173.         method: 'POST',
  21174.         data: {
  21175.           message: 'reactionsEmbedPromotion'
  21176.         }
  21177.       })
  21178.     },
  21179.     trackView: function () {
  21180.       f.getLounge().trigger('uiAction:viewReactionsPromotion')
  21181.     },
  21182.     render: function () {
  21183.       return this.dismissed ? this.$el.html('') : d.render(c.createElement(g, {
  21184.         onDefer: this.onDefer.bind(this),
  21185.         onConfirm: this.onConfirm.bind(this),
  21186.         forumShortname: this.forum.id
  21187.       }), this.el),
  21188.       this
  21189.     }
  21190.   });
  21191.   return h
  21192. }),
  21193. define('templates/lounge/partials/postCount', [
  21194.   'react',
  21195.   'core/strings'
  21196. ], function (a, b) {
  21197.   'use strict';
  21198.   var c = b.gettext,
  21199.   d = function (b) {
  21200.     return a.createElement('a', {
  21201.       className: 'publisher-nav-color'
  21202.     }, a.createElement('span', {
  21203.       className: 'comment-count'
  21204.     }, 1 === b.count ? c('1 comment') : c('%(numPosts)s comments', {
  21205.       numPosts: b.count
  21206.     })))
  21207.   };
  21208.   return d
  21209. }),
  21210. define('templates/lounge/partials/topNavigation', [
  21211.   'react',
  21212.   'core/utils/object/get',
  21213.   'templates/lounge/partials/postCount',
  21214.   'core/switches'
  21215. ], function (a, b, c, d) {
  21216.   'use strict';
  21217.   var e = function (e) {
  21218.     var f = d.isFeatureActive('embed_refresh', {
  21219.       forum: e.thread.attributes.forum
  21220.     }),
  21221.     g = f ? 'nav-primary nav-primary--refresh' : 'nav-primary',
  21222.     h = f ? 'tab-conversation tab-conversation--refresh' : 'tab-conversation';
  21223.     return a.createElement('nav', {
  21224.       className: 'nav ' + g
  21225.     }, a.createElement('ul', null, a.createElement('li', {
  21226.       className: 'nav-tab nav-tab--primary ' + h + ' active',
  21227.       'data-role': 'post-count'
  21228.     }, e.inHome ? null : a.createElement(c, {
  21229.       count: b(e.thread, [
  21230.         'attributes',
  21231.         'posts'
  21232.       ], null)
  21233.     })), a.createElement('li', {
  21234.       className: 'nav-tab nav-tab--primary tab-user'
  21235.     }, a.createElement('ul', null, a.createElement('li', {
  21236.       className: 'nav-tab nav-tab--primary notification-menu',
  21237.       'data-role': 'notification-menu'
  21238.     }), a.createElement('li', {
  21239.       className: 'nav-tab nav-tab--primary dropdown user-menu',
  21240.       'data-role': 'logout'
  21241.     })))))
  21242.   };
  21243.   return e
  21244. }),
  21245. define('lounge/views/top-navigation', [
  21246.   'backbone',
  21247.   'templates/lounge/partials/topNavigation'
  21248. ], function (a, b) {
  21249.   'use strict';
  21250.   var c = a.View.extend({
  21251.     initialize: function (a) {
  21252.       this.inHome = a.inHome,
  21253.       this.thread = a.thread
  21254.     },
  21255.     render: function () {
  21256.       return this.$el.html(b({
  21257.         inHome: this.inHome,
  21258.         thread: this.thread
  21259.       })),
  21260.       this
  21261.     }
  21262.   });
  21263.   return c
  21264. }),
  21265. define('templates/lounge/partials/threadFooter', [
  21266.   'react',
  21267.   'core/strings',
  21268.   'core/switches',
  21269.   'core/utils/object/get'
  21270. ], function (a, b, c, d) {
  21271.   'use strict';
  21272.   var e = b.gettext,
  21273.   f = function (b) {
  21274.     var f = c.isFeatureActive('embed_refresh', {
  21275.       forum: b.forum.id
  21276.     }),
  21277.     g = f ? 'disqus-footer__link disqus-footer__link--refresh' : 'disqus-footer__link',
  21278.     h = f ? 'disqus-footer__item disqus-footer__item--refresh' : 'disqus-footer__item',
  21279.     i = f ? 'text-item' : 'clip',
  21280.     j = f ? 'disqus-footer disqus-footer--refresh' : 'disqus-footer';
  21281.     return a.createElement('div', {
  21282.       className: j
  21283.     }, a.createElement('ul', {
  21284.       className: 'disqus-footer__list'
  21285.     }, c.isFeatureActive('sso_less_branding', {
  21286.       forum: b.forum.id
  21287.     }) ? null : a.createElement('li', {
  21288.       id: 'thread-subscribe-button',
  21289.       className: 'email ' + h
  21290.     }, a.createElement('div', {
  21291.       className: 'default'
  21292.     }, a.createElement('a', {
  21293.       href: '#',
  21294.       rel: 'nofollow',
  21295.       'data-action': 'subscribe',
  21296.       title: e('Subscribe and get email updates from this discussion'),
  21297.       className: g
  21298.     }, f ? a.createElement('div', {
  21299.       className: 'icon-wrapper'
  21300.     }, a.createElement('i', {
  21301.       'aria-hidden': 'true',
  21302.       className: 'icon-subscribe-refresh'
  21303.     })) : a.createElement('i', {
  21304.       'aria-hidden': 'true',
  21305.       className: 'icon icon-mail'
  21306.     }), a.createElement('i', {
  21307.       'aria-hidden': 'true',
  21308.       className: 'icon icon-checkmark'
  21309.     }), a.createElement('span', {
  21310.       id: 'thread-subscribe-text-default',
  21311.       className: i
  21312.     }, e('Subscribe')), a.createElement('span', {
  21313.       id: 'thread-subscribe-text-subscribed',
  21314.       className: i
  21315.     }, e('Subscribed'))))), c.isFeatureActive('removePrivacyPolicy', {
  21316.       forum: b.forum.id
  21317.     }) ? null : a.createElement('li', {
  21318.       className: 'privacy ' + h
  21319.     }, a.createElement('a', {
  21320.       href: 'https://disqus.com/privacy-policy',
  21321.       rel: 'nofollow noopener noreferrer',
  21322.       target: '_blank',
  21323.       className: g,
  21324.       title: 'Privacy'
  21325.     }, f ? a.createElement('div', {
  21326.       className: 'icon-wrapper'
  21327.     }, a.createElement('i', {
  21328.       'aria-hidden': 'true',
  21329.       className: 'icon-privacy-refresh'
  21330.     })) : a.createElement('i', {
  21331.       'aria-hidden': 'true',
  21332.       className: 'icon icon-lock'
  21333.     }), a.createElement('span', {
  21334.       className: i
  21335.     }, e('Privacy')))), c.isFeatureActive('removePrivacyPolicy', {
  21336.       forum: b.forum.id
  21337.     }) ? '' : a.createElement('li', {
  21338.       className: 'do-not-sell ' + h
  21339.     }, a.createElement('a', {
  21340.       href: 'https://disqus.com/data-sharing-settings/',
  21341.       rel: 'nofollow noopener noreferrer',
  21342.       target: '_blank',
  21343.       className: g
  21344.     }, f ? a.createElement('div', {
  21345.       className: 'icon-wrapper'
  21346.     }, a.createElement('i', {
  21347.       'aria-hidden': 'true',
  21348.       className: 'icon-warning-refresh'
  21349.     })) : a.createElement('i', {
  21350.       'aria-hidden': 'true',
  21351.       className: 'icon icon-warning'
  21352.     }), a.createElement('span', {
  21353.       className: i
  21354.     }, e('Do Not Sell My Data'))))), d(b.forum, [
  21355.       'attributes',
  21356.       'disableDisqusBranding'
  21357.     ], null) ? null : a.createElement('span', {
  21358.       className: 'disqus-footer__logo'
  21359.     }, a.createElement('a', {
  21360.       href: 'https://disqus.com',
  21361.       rel: 'nofollow',
  21362.       title: e('Powered by Disqus'),
  21363.       className: g
  21364.     }, e('Powered by Disqus'))))
  21365.   };
  21366.   return f
  21367. }),
  21368. define('lounge/views/thread-footer', [
  21369.   'backbone',
  21370.   'templates/lounge/partials/threadFooter'
  21371. ], function (a, b) {
  21372.   'use strict';
  21373.   var c = a.View.extend({
  21374.     initialize: function (a) {
  21375.       this.forum = a.forum
  21376.     },
  21377.     render: function () {
  21378.       return this.$el.html(b({
  21379.         forum: this.forum
  21380.       })),
  21381.       this
  21382.     }
  21383.   });
  21384.   return c
  21385. }),
  21386. define('templates/lounge/partials/postSort', [
  21387.   'react',
  21388.   'core/strings',
  21389.   'core/switches'
  21390. ], function (a, b, c) {
  21391.   'use strict';
  21392.   var d = b.gettext,
  21393.   e = function (b) {
  21394.     var e = b.votingDisabled && 'popular' === b.order ? 'desc' : b.order,
  21395.     f = c.isFeatureActive('embed_refresh', {
  21396.       forum: b.forum
  21397.     }),
  21398.     g = f ? '' : 'nav-tab nav-tab--secondary dropdown sorting pull-left spacing-right-large',
  21399.     h = f ? 'sort-menu-refresh' : 'dropdown-menu',
  21400.     i = f ? 'sort-menu-refresh__item' : '';
  21401.     return a.createElement('li', {
  21402.       'data-role': 'post-sort',
  21403.       className: g
  21404.     }, f ? null : a.createElement('a', {
  21405.       href: '#',
  21406.       className: 'dropdown-toggle',
  21407.       'data-toggle': 'dropdown'
  21408.     }, 'popular' === e ? d('Sort by Best') : null, 'desc' === e ? d('Sort by Newest') : null, 'asc' === e ? d('Sort by Oldest') : null, a.createElement('span', {
  21409.       className: 'caret'
  21410.     })), a.createElement('ul', {
  21411.       className: h
  21412.     }, a.createElement('li', {
  21413.       className: i + ' ' + ('popular' === e ? 'selected' : '')
  21414.     }, b.votingDisabled ? null : a.createElement('a', {
  21415.       href: '#',
  21416.       'data-action': 'sort',
  21417.       'data-sort': 'popular'
  21418.     }, d('Best'), f ? null : a.createElement('i', {
  21419.       'aria-hidden': 'true',
  21420.       className: 'icon-checkmark'
  21421.     }))), a.createElement('li', {
  21422.       className: i + ' ' + ('desc' === e ? 'selected' : '')
  21423.     }, a.createElement('a', {
  21424.       href: '#',
  21425.       'data-action': 'sort',
  21426.       'data-sort': 'desc'
  21427.     }, d('Newest'), f ? null : a.createElement('i', {
  21428.       'aria-hidden': 'true',
  21429.       className: 'icon-checkmark'
  21430.     }))), a.createElement('li', {
  21431.       className: i + ' ' + ('asc' === e ? 'selected' : '')
  21432.     }, a.createElement('a', {
  21433.       href: '#',
  21434.       'data-action': 'sort',
  21435.       'data-sort': 'asc'
  21436.     }, d('Oldest'), f ? null : a.createElement('i', {
  21437.       'aria-hidden': 'true',
  21438.       className: 'icon-checkmark'
  21439.     })))))
  21440.   };
  21441.   return e
  21442. }),
  21443. define('templates/lounge/partials/secondaryNavigation', [
  21444.   'react',
  21445.   'templates/lounge/partials/postSort',
  21446.   'core/switches'
  21447. ], function (a, b, c) {
  21448.   'use strict';
  21449.   var d = function (d) {
  21450.     var e = d.forum,
  21451.     f = c.isFeatureActive('embed_refresh', {
  21452.       forum: e
  21453.     }),
  21454.     g = f ? 'nav-secondary-refresh__list' : '',
  21455.     h = d.inHome ? null : a.createElement(b, {
  21456.       order: d.order,
  21457.       votingDisabled: d.votingDisabled,
  21458.       forum: e
  21459.     }),
  21460.     i = a.createElement('li', {
  21461.       id: 'thread-share-bar',
  21462.       className: 'nav-tab nav-tab--secondary share-bar pull-left'
  21463.     }),
  21464.     j = a.createElement('li', {
  21465.       id: 'favorite-button',
  21466.       className: 'nav-tab nav-tab--secondary favorite dropdown pull-left',
  21467.       'aria-label': 'Favorite this discussion'
  21468.     }),
  21469.     k = a.createElement('li', {
  21470.       className: 'nav-secondary-refresh__list-item'
  21471.     }, a.createElement('div', {
  21472.       id: 'favorite-button'
  21473.     }), a.createElement('div', {
  21474.       id: 'thread-share-bar',
  21475.       className: 'share-bar-refresh'
  21476.     })),
  21477.     l = f ? [
  21478.       k,
  21479.       h
  21480.     ] : [
  21481.       h,
  21482.       j,
  21483.       i
  21484.     ];
  21485.     return a.createElement('ul', {
  21486.       className: g
  21487.     }, l)
  21488.   };
  21489.   return d
  21490. }),
  21491. define('lounge/views/secondary-navigation', [
  21492.   'backbone',
  21493.   'core/utils/storage',
  21494.   'core/switches',
  21495.   'templates/lounge/partials/secondaryNavigation'
  21496. ], function (a, b, c, d) {
  21497.   'use strict';
  21498.   var e = a.View.extend({
  21499.     attributes: {
  21500.       'data-tracking-area': 'secondary-nav'
  21501.     },
  21502.     initialize: function (a) {
  21503.       this.inHome = a.inHome,
  21504.       this.order = a.order,
  21505.       this.votingDisabled = a.votingDisabled,
  21506.       this.forum = a.forum,
  21507.       this.isRefreshEnabled = c.isFeatureActive('embed_refresh', {
  21508.         forum: this.forum
  21509.       }),
  21510.       this.$el.addClass(this.isRefreshEnabled ? 'nav-secondary-refresh' : 'nav nav-secondary')
  21511.     },
  21512.     render: function () {
  21513.       return this.$el.html(d({
  21514.         inHome: this.inHome,
  21515.         order: this.order,
  21516.         votingDisabled: this.votingDisabled,
  21517.         forum: this.forum
  21518.       })),
  21519.       this
  21520.     }
  21521.   });
  21522.   return e
  21523. }),
  21524. define('templates/lounge/userMenu', [
  21525.   'react',
  21526.   'core/config/urls',
  21527.   'core/strings',
  21528.   'core/switches',
  21529.   'core/utils/object/get',
  21530.   'core/utils/threadRatingsHelpers',
  21531.   'core/utils/storage',
  21532.   'templates/lounge/partials/profileLink'
  21533. ], function (a, b, c, d, e, f, g, h) {
  21534.   'use strict';
  21535.   var i = c.gettext,
  21536.   j = function (c) {
  21537.     var j = d.isFeatureActive('embed_refresh', {
  21538.       forum: c.forum.id
  21539.     }),
  21540.     k = d.isFeatureActive('embed_refresh_v2', {
  21541.       forum: c.forum.id
  21542.     }),
  21543.     l = j ? 'username username--refresh' : 'username',
  21544.     m = j ? 'avatar avatar--refresh' : 'avatar',
  21545.     n = j ? 'dropdown-toggle dropdown-toggle--refresh' : 'dropdown-toggle',
  21546.     o = j ? 'dropdown-menu dropdown-menu--refresh' : 'dropdown-menu',
  21547.     p = j ? 'caret caret--refresh' : 'caret',
  21548.     q = i(null === g.get('switch:embed_refresh') || g.get('switch:embed_refresh') === !0 ? 'Classic Disqus' : 'New Disqus');
  21549.     return [!e(c.user, [
  21550.       'thread',
  21551.       'canReply'
  21552.     ]) || !e(c.user, [
  21553.       'thread',
  21554.       'canModerate'
  21555.     ]) && d.isFeatureActive('sso_less_branding', {
  21556.       forum: c.thread.forum
  21557.     }) ? null : a.createElement('a', {
  21558.       key: 'user-menu-dropdown',
  21559.       href: '#',
  21560.       className: n,
  21561.       'data-toggle': 'dropdown',
  21562.       role: 'menuitem',
  21563.       name: e(c.user, [
  21564.         'isRegistered'
  21565.       ]) ? 'User Menu' : i('Login')
  21566.     }, a.createElement('span', {
  21567.       className: 'dropdown-toggle-wrapper'
  21568.     }, e(c.user, [
  21569.       'isRegistered'
  21570.     ]) ? a.createElement('span', null, a.createElement('span', {
  21571.       className: m
  21572.     }, a.createElement('img', {
  21573.       'data-role': 'user-avatar',
  21574.       'data-user': e(c.user, [
  21575.         'id'
  21576.       ], ''),
  21577.       'data-src': e(c.user, [
  21578.         'avatar',
  21579.         'cache'
  21580.       ], ''),
  21581.       alt: i('Avatar')
  21582.     })), a.createElement('span', {
  21583.       className: l,
  21584.       'data-role': 'username',
  21585.       'data-username': e(c.user, [
  21586.         'username'
  21587.       ], '')
  21588.     }, e(c.user, [
  21589.       'name'
  21590.     ]) || e(c.user, [
  21591.       'username'
  21592.     ]) || null)) : a.createElement('span', {
  21593.       className: l
  21594.     }, i('Login')), ' '), ' ', a.createElement('span', {
  21595.       className: p
  21596.     })),
  21597.     a.createElement('ul', {
  21598.       key: 'user-menu-menu',
  21599.       className: o
  21600.     }, e(c.user, [
  21601.       'isRegistered'
  21602.     ]) ? [
  21603.       e(c.user, [
  21604.         'thread',
  21605.         'canModerate'
  21606.       ]) && d.isFeatureActive('sso_less_branding', {
  21607.         forum: c.thread.forum
  21608.       }) ? null : a.createElement('li', {
  21609.         key: 'menu-profile'
  21610.       }, a.createElement(h, {
  21611.         user: c.user,
  21612.         forum: c.forum
  21613.       }, i('Your Profile'))),
  21614.       d.isFeatureActive('sso_less_branding', {
  21615.         forum: c.thread.forum
  21616.       }) || e(c.forum, [
  21617.         'disableDisqusBranding'
  21618.       ], null) ? null : a.createElement('li', {
  21619.         key: 'menu-channels'
  21620.       }, a.createElement('a', {
  21621.         href: '/channels/',
  21622.         target: '_blank',
  21623.         rel: 'noopener noreferrer'
  21624.       }, i('Channels'))),
  21625.       j && k && !c.isInHome && !d.isFeatureActive('sso_less_branding', {
  21626.         forum: c.thread.forum
  21627.       }) ? a.createElement('li', {
  21628.         key: 'menu-community'
  21629.       }, a.createElement('a', {
  21630.         href: e(c.forum, [
  21631.           'homeUrl'
  21632.         ], ''),
  21633.         'data-action': 'community-sidebar',
  21634.         'data-forum': e(c.forum, [
  21635.           'id'
  21636.         ], ''),
  21637.         id: 'community-tab',
  21638.         name: e(c.forum, [
  21639.           'name'
  21640.         ], null)
  21641.       }, i('Community'))) : null,
  21642.       a.createElement('li', {
  21643.         key: 'menu-media'
  21644.       }, a.createElement('a', {
  21645.         href: '#',
  21646.         className: 'media-toggle-on',
  21647.         'data-action': 'toggle-media'
  21648.       }, i('Display Media')), a.createElement('a', {
  21649.         href: '#',
  21650.         className: 'media-toggle-off',
  21651.         'data-action': 'toggle-media'
  21652.       }, i('Hide Media'))),
  21653.       e(c.user, [
  21654.         'remote'
  21655.       ]) ? null : a.createElement('li', {
  21656.         key: 'menu-settings'
  21657.       }, a.createElement('a', {
  21658.         href: e(b, [
  21659.           'editProfile'
  21660.         ], '')
  21661.       }, i('Edit Settings')))
  21662.     ] : [
  21663.       e(c.sso, [
  21664.         'url'
  21665.       ]) ? a.createElement('li', {
  21666.         key: 'menu-auth-sso',
  21667.         className: 'sso'
  21668.       }, a.createElement('a', {
  21669.         href: '#',
  21670.         'data-action': 'auth:sso'
  21671.       }, e(c.sso, [
  21672.         'name'
  21673.       ], null))) : null,
  21674.       a.createElement('li', {
  21675.         key: 'menu-auth-disqus'
  21676.       }, a.createElement('a', {
  21677.         href: '#',
  21678.         'data-action': 'auth:disqus'
  21679.       }, 'Disqus')),
  21680.       a.createElement('li', {
  21681.         key: 'menu-auth-facebook'
  21682.       }, a.createElement('a', {
  21683.         href: '#',
  21684.         'data-action': 'auth:facebook'
  21685.       }, 'Facebook')),
  21686.       a.createElement('li', {
  21687.         key: 'menu-auth-twitter'
  21688.       }, a.createElement('a', {
  21689.         href: '#',
  21690.         'data-action': 'auth:twitter'
  21691.       }, 'X (Twitter)')),
  21692.       a.createElement('li', {
  21693.         key: 'menu-auth-google'
  21694.       }, a.createElement('a', {
  21695.         href: '#',
  21696.         'data-action': 'auth:google'
  21697.       }, 'Google')),
  21698.       a.createElement('li', {
  21699.         key: 'menu-auth-microsoft'
  21700.       }, a.createElement('a', {
  21701.         href: '#',
  21702.         'data-action': 'auth:microsoft'
  21703.       }, 'Microsoft')),
  21704.       a.createElement('li', {
  21705.         key: 'menu-auth-apple'
  21706.       }, a.createElement('a', {
  21707.         href: '#',
  21708.         'data-action': 'auth:apple'
  21709.       }, 'Apple'))
  21710.     ], e(c.user, [
  21711.       'thread',
  21712.       'canModerate'
  21713.     ]) ? [
  21714.       c.forum.settings.validateAllPosts ? null : a.createElement('li', {
  21715.         key: 'menu-toggle-thread-premoderate'
  21716.       }, a.createElement('a', {
  21717.         href: '#',
  21718.         'data-action': 'toggle-thread-premoderate'
  21719.       }, i(c.thread.validateAllPosts ? 'Don\'t Premoderate Thread' : 'Premoderate Thread'))),
  21720.       a.createElement('li', {
  21721.         key: 'menu-toggle-thread'
  21722.       }, a.createElement('a', {
  21723.         href: '#',
  21724.         'data-action': 'toggle-thread'
  21725.       }, i(e(c.thread, [
  21726.         'isClosed'
  21727.       ]) ? 'Open Thread' : 'Close Thread'))),
  21728.       e(c.forum, [
  21729.         'settings',
  21730.         'threadReactionsEnabled'
  21731.       ]) && e(c.user, [
  21732.         'thread',
  21733.         'canModerate'
  21734.       ]) && c.thread.reactions.eligible ? a.createElement('li', {
  21735.         key: 'menu-toggle-reactions'
  21736.       }, a.createElement('a', {
  21737.         href: '#',
  21738.         'data-action': 'toggle-reactions'
  21739.       }, i(c.thread.reactions && c.thread.reactions.enabled ? 'Remove Reactions' : 'Restore Reactions'))) : null,
  21740.       f.isForumRatingsEnabled(c.forum) ? a.createElement('li', {
  21741.         key: 'menu-toggle-thread-ratings'
  21742.       }, a.createElement('a', {
  21743.         href: '#',
  21744.         'data-action': 'toggle-thread-ratings'
  21745.       }, i(c.thread.ratingsEnabled ? 'Disable Ratings' : 'Enable Ratings'))) : null,
  21746.       e(c.user, [
  21747.         'isGlobalAdmin'
  21748.       ]) ? null : a.createElement('li', {
  21749.         key: 'menu-help'
  21750.       }, a.createElement('a', {
  21751.         href: 'https://help.disqus.com/customer/portal/articles/2538045-commenter-launch-pad'
  21752.       }, i('Help')))
  21753.     ] : null, e(c.user, [
  21754.       'isGlobalAdmin'
  21755.     ]) ? [
  21756.       a.createElement('li', {
  21757.         key: 'menu-debug'
  21758.       }, a.createElement('a', {
  21759.         href: '#',
  21760.         'data-action': 'debug'
  21761.       }, i('Debug'))),
  21762.       a.createElement('li', {
  21763.         key: 'menu-repair'
  21764.       }, a.createElement('a', {
  21765.         href: '#',
  21766.         'data-action': 'repair'
  21767.       }, i('Repair')))
  21768.     ] : null, e(c.user, [
  21769.       'isRegistered'
  21770.     ]) && e(c.user, [
  21771.       'thread',
  21772.       'canReply'
  21773.     ]) ? [
  21774.       a.createElement('li', {
  21775.         key: 'menu-toggle-embed-refresh'
  21776.       }, d.isFeatureActive('toggle_embed_refresh') && !d.isFeatureActive('sso_less_branding', {
  21777.         forum: c.thread.forum
  21778.       }) ? a.createElement('a', {
  21779.         href: '#',
  21780.         'data-action': 'toggle-embed-refresh'
  21781.       }, q) : null),
  21782.       a.createElement('li', {
  21783.         key: 'menu-logout'
  21784.       }, a.createElement('a', {
  21785.         href: '#',
  21786.         'data-action': 'logout'
  21787.       }, i('Logout')))
  21788.     ] : null)]
  21789.   };
  21790.   return j
  21791. }),
  21792. define('templates/lounge/threadShareBar', [
  21793.   'react',
  21794.   'core/strings',
  21795.   'core/switches'
  21796. ], function (a, b, c) {
  21797.   'use strict';
  21798.   var d = b.gettext,
  21799.   e = function (b) {
  21800.     var e = b.forum,
  21801.     f = c.isFeatureActive('embed_refresh', {
  21802.       forum: e
  21803.     }),
  21804.     g = f && c.isFeatureActive('embed_refresh_v2', {
  21805.       forum: e
  21806.     }),
  21807.     h = f ? 'thread-share-bar-buttons-refresh' : 'thread-share-bar-buttons dropdown',
  21808.     i = f ? 'share-dropdown-refresh' : 'dropdown-menu pull-right',
  21809.     j = f ? 'share-button-toggle' : 'dropdown-toggle icon icon-share',
  21810.     k = f ? 'share-dropdown-refresh__item' : 'thread-share__item';
  21811.     return a.createElement('div', {
  21812.       className: 'thread-share-wrapper'
  21813.     }, f ? a.createElement('div', {
  21814.       className: 'round-delimiter'
  21815.     }) : null, a.createElement('span', {
  21816.       'data-role': 'thread-share',
  21817.       className: h
  21818.     }, a.createElement('a', {
  21819.       href: '#',
  21820.       className: j + ' ' + (g ? j + '--v2' : ''),
  21821.       'data-toggle': 'dropdown',
  21822.       'aria-label': d('Share')
  21823.     }, f ? d('Share') : ''), a.createElement('ul', {
  21824.       className: i
  21825.     }, f ? null : a.createElement('div', {
  21826.       className: 'thread-share__text'
  21827.     }, 'Share this discussion'), a.createElement('li', {
  21828.       className: k
  21829.     }, f ? a.createElement('div', {
  21830.       className: 'share-icons-wrapper share-icons-wrapper--twitter',
  21831.       'data-action': 'share:twitter'
  21832.     }, a.createElement('span', {
  21833.       className: 'icon-twitter-x',
  21834.       'aria-hidden': 'true'
  21835.     }), a.createElement('span', {
  21836.       className: 'visually-hidden'
  21837.     }, d('Tweet this discussion'))) : a.createElement('span', {
  21838.       className: 'share-twitter',
  21839.       'data-action': 'share:twitter',
  21840.       tabIndex: '0'
  21841.     }, a.createElement('span', {
  21842.       className: 'icon-twitter-circle',
  21843.       'aria-hidden': 'true'
  21844.     }), a.createElement('span', {
  21845.       className: 'visually-hidden'
  21846.     }, d('Tweet this discussion')))), a.createElement('li', {
  21847.       className: k
  21848.     }, f ? a.createElement('div', {
  21849.       className: 'share-icons-wrapper share-icons-wrapper--facebook',
  21850.       'data-action': 'share:facebook'
  21851.     }, a.createElement('span', {
  21852.       className: 'icon-facebook',
  21853.       'aria-hidden': 'true'
  21854.     }), a.createElement('span', {
  21855.       className: 'visually-hidden'
  21856.     }, d('Share this discussion on Facebook'))) : a.createElement('span', {
  21857.       className: 'share-facebook',
  21858.       'data-action': 'share:facebook',
  21859.       tabIndex: '0'
  21860.     }, a.createElement('span', {
  21861.       className: 'icon-facebook-circle',
  21862.       'aria-hidden': 'true'
  21863.     }), a.createElement('span', {
  21864.       className: 'visually-hidden'
  21865.     }, d('Share this discussion on Facebook')))), a.createElement('li', {
  21866.       className: k
  21867.     }, f ? a.createElement('div', {
  21868.       className: 'share-icons-wrapper share-icons-wrapper--email',
  21869.       'data-action': 'share:email'
  21870.     }, a.createElement('span', {
  21871.       className: 'icon-mail',
  21872.       'aria-hidden': 'true'
  21873.     }), a.createElement('span', {
  21874.       className: 'visually-hidden'
  21875.     }, d('Share this discussion via email'))) : a.createElement('span', {
  21876.       className: 'share-email',
  21877.       'data-action': 'share:email',
  21878.       tabIndex: '0'
  21879.     }, a.createElement('span', {
  21880.       className: 'icon-mail',
  21881.       'aria-hidden': 'true'
  21882.     }), a.createElement('span', {
  21883.       className: 'visually-hidden'
  21884.     }, d('Share this discussion via email')))), a.createElement('li', {
  21885.       className: k
  21886.     }, f ? a.createElement('div', {
  21887.       className: 'share-icons-wrapper share-icons-wrapper--link',
  21888.       'data-action': 'copy-link',
  21889.       title: d('Click to copy discussion link')
  21890.     }, a.createElement('span', {
  21891.       className: 'icon-link',
  21892.       'aria-hidden': 'true'
  21893.     }), a.createElement('span', {
  21894.       className: 'visually-hidden'
  21895.     }, d('Copy link to discussion'))) : a.createElement('span', {
  21896.       className: 'share-link',
  21897.       'data-action': 'copy-link',
  21898.       title: d('Click to copy discussion link'),
  21899.       tabIndex: '0'
  21900.     }, a.createElement('span', {
  21901.       className: 'icon-link',
  21902.       'aria-hidden': 'true'
  21903.     }), a.createElement('span', {
  21904.       className: 'visually-hidden'
  21905.     }, d('Copy link to discussion')))))))
  21906.   };
  21907.   return e
  21908. }),
  21909. define('templates/lounge/layout', [
  21910.   'react'
  21911. ], function (a) {
  21912.   'use strict';
  21913.   var b = function (b) {
  21914.     var c = b.forum;
  21915.     return a.createElement('div', {
  21916.       id: 'layout',
  21917.       'data-tracking-area': 'layout'
  21918.     }, c.settings.behindClickEnabled ? a.createElement('div', {
  21919.       id: 'behindclick__container'
  21920.     }) : null, a.createElement('div', {
  21921.       id: 'thread__container'
  21922.     }), a.createElement('div', {
  21923.       id: 'embed_v2-root'
  21924.     }))
  21925.   };
  21926.   return b
  21927. }),
  21928. define('templates/lounge/inEmbedAd', [
  21929.   'react'
  21930. ], function (a) {
  21931.   'use strict';
  21932.   return function () {
  21933.     return a.createElement('div', {
  21934.       className: 'ad-content',
  21935.       role: 'ad-content'
  21936.     })
  21937.   }
  21938. }),
  21939. define('templates/lounge/inthreadAd', [
  21940.   'react'
  21941. ], function (a) {
  21942.   'use strict';
  21943.   var b = function () {
  21944.     return a.createElement('li', {
  21945.       className: 'post advertisement'
  21946.     }, a.createElement('div', {
  21947.       className: 'post-content',
  21948.       'data-role': 'post-content'
  21949.     }))
  21950.   };
  21951.   return b
  21952. }),
  21953. define('templates/lounge/termsOfService', [
  21954.   'react',
  21955.   'core/strings'
  21956. ], function (a, b) {
  21957.   'use strict';
  21958.   var c = b.gettext,
  21959.   d = function () {
  21960.     return a.createElement('div', null, a.createElement('div', {
  21961.       className: 'checkbox-wrapper'
  21962.     }, a.createElement('p', null, a.createElement('label', null, a.createElement('input', {
  21963.       type: 'checkbox',
  21964.       name: 'tos'
  21965.     }), a.createElement('span', {
  21966.       className: 'spacing-left-small'
  21967.     }, c('I agree to Disqus\' %(terms)s', {
  21968.       terms: a.createElement('a', {
  21969.         href: 'https://help.disqus.com/customer/portal/articles/466260-terms-of-service',
  21970.         target: '_blank',
  21971.         rel: 'noopener noreferrer'
  21972.       }, c('Terms of Service'))
  21973.     })))), a.createElement('p', null, a.createElement('label', null, a.createElement('input', {
  21974.       type: 'checkbox',
  21975.       name: 'privacy-policy'
  21976.     }), a.createElement('span', {
  21977.       className: 'spacing-left-small'
  21978.     }, c('I agree to Disqus\' processing of email and IP address, and the use of cookies, to facilitate my authentication and posting of comments, explained further in the %(policy)s', {
  21979.       policy: a.createElement('a', {
  21980.         href: 'https://disqus.com/privacy-policy',
  21981.         target: '_blank',
  21982.         rel: 'noopener noreferrer'
  21983.       }, c('Privacy Policy'))
  21984.     })))), a.createElement('p', null, a.createElement('label', null, a.createElement('input', {
  21985.       type: 'checkbox',
  21986.       name: 'data-sharing'
  21987.     }), a.createElement('span', {
  21988.       className: 'spacing-left-small'
  21989.     }, c('I agree to additional processing of my information, including first and third party cookies, for personalized content and advertising as outlined in our %(policy)s', {
  21990.       policy: a.createElement('a', {
  21991.         href: 'https://disqus.com/data-sharing-settings/'
  21992.       }, c('Data Sharing Policy'))
  21993.     }))))))
  21994.   },
  21995.   e = function (b) {
  21996.     var e = b.onAccept,
  21997.     f = b.isPrivate;
  21998.     return a.createElement('div', {
  21999.       id: 'tos__message',
  22000.       className: 'align align--column align--middle'
  22001.     }, a.createElement('h1', null, c('Important Update')), a.createElement('p', null, c('When you log in with Disqus, we process personal data to facilitate your authentication and posting of comments. We also store the comments you post and those comments are immediately viewable and searchable by anyone around the world.')), f ? a.createElement(d, null) : a.createElement('p', null, a.createElement('label', null, a.createElement('span', null, c('Please access our %(policy)s to learn what personal data Disqus collects and your choices about how it is used.  All users of our service are also subject to our %(terms)s.', {
  22002.       policy: a.createElement('a', {
  22003.         href: 'https://disqus.com/privacy-policy',
  22004.         target: '_blank',
  22005.         rel: 'noopener noreferrer'
  22006.       }, c('Privacy Policy')),
  22007.       terms: a.createElement('a', {
  22008.         href: 'https://help.disqus.com/customer/portal/articles/466260-terms-of-service',
  22009.         target: '_blank',
  22010.         rel: 'noopener noreferrer'
  22011.       }, c('Terms of Service'))
  22012.     })))), a.createElement('p', {
  22013.       className: 'align'
  22014.     }, a.createElement('button', {
  22015.       className: 'button button-large',
  22016.       onClick: e,
  22017.       id: 'accept_tos'
  22018.     }, c('Proceed'))))
  22019.   };
  22020.   return e
  22021. }),
  22022. define('common/collections/profile', [
  22023.   'core/api',
  22024.   'common/models',
  22025.   'common/collections'
  22026. ], function (a, b, c) {
  22027.   'use strict';
  22028.   var d = c.PaginatedCollection.extend({
  22029.     initialize: function (a, b) {
  22030.       this.user = b.user,
  22031.       c.PaginatedCollection.prototype.initialize.apply(this, arguments)
  22032.     },
  22033.     fetch: function (a) {
  22034.       return a = a || {
  22035.       },
  22036.       a.data = a.data || {
  22037.       },
  22038.       a.data.user = this.user.id,
  22039.       c.PaginatedCollection.prototype.fetch.call(this, a)
  22040.     }
  22041.   }),
  22042.   e = d.extend({
  22043.     model: b.SyncedUser,
  22044.     url: a.getURL('users/listFollowing'),
  22045.     PER_PAGE: 20
  22046.   });
  22047.   return {
  22048.     SessionPaginatedCollection: d,
  22049.     FollowingCollection: e
  22050.   }
  22051. });
  22052. var _typeof = 'function' == typeof Symbol && 'symbol' == typeof Symbol.iterator ? function (a) {
  22053.   return typeof a
  22054. }
  22055.  : function (a) {
  22056.   return a && 'function' == typeof Symbol && a.constructor === Symbol && a !== Symbol.prototype ? 'symbol' : typeof a
  22057. };
  22058. define('lounge/views', [
  22059.   'jquery',
  22060.   'underscore',
  22061.   'backbone',
  22062.   'loglevel',
  22063.   'raven',
  22064.   'stance',
  22065.   'moment',
  22066.   'react',
  22067.   'react-dom',
  22068.   'core/ads/ads',
  22069.   'core/analytics/identity',
  22070.   'core/api',
  22071.   'core/mediaConfig',
  22072.   'core/UniqueModel',
  22073.   'core/mixins/appliesPublisherClasses',
  22074.   'core/mixins/withAlert',
  22075.   'core/models/ThreadVote',
  22076.   'core/models/Vote',
  22077.   'core/constants/voteConstants',
  22078.   'core/config',
  22079.   'remote/config',
  22080.   'common/models',
  22081.   'common/collections',
  22082.   'common/utils',
  22083.   'core/bus',
  22084.   'core/strings',
  22085.   'common/urls',
  22086.   'core/analytics/jester',
  22087.   'common/views/mixins',
  22088.   'common/Session',
  22089.   'common/keys',
  22090.   'core/utils',
  22091.   'core/utils/isIframed',
  22092.   'core/utils/html/toRGBColorString',
  22093.   'core/utils/threadRatingsHelpers',
  22094.   'core/utils/url/serialize',
  22095.   'core/utils/storage',
  22096.   'core/utils/isMediaTradecraftAdEnabled',
  22097.   'core/switches',
  22098.   'core/viglink',
  22099.   'core/WindowBus',
  22100.   'common/outboundlinkhandler',
  22101.   'core/mixins/withEmailVerifyLink',
  22102.   'core/templates/react/BehindClickTemplate',
  22103.   'core/templates/react/ThreadTemplate',
  22104.   'core/shared/urls',
  22105.   'lounge/common',
  22106.   'lounge/menu-handler',
  22107.   'lounge/mixins',
  22108.   'lounge/realtime',
  22109.   'lounge/views/badges-message',
  22110.   'lounge/views/email-signup',
  22111.   'lounge/views/posts/PostReplyView',
  22112.   'lounge/views/posts/collection',
  22113.   'lounge/views/media',
  22114.   'lounge/views/onboard-alert',
  22115.   'lounge/views/notification-menu',
  22116.   'lounge/views/highlighted-post',
  22117.   'lounge/views/realtime',
  22118.   'lounge/views/posts/UserSuggestionsManager',
  22119.   'lounge/views/sidebar',
  22120.   'lounge/views/ratings',
  22121.   'lounge/views/reactions',
  22122.   'lounge/views/reactions-promotion',
  22123.   'lounge/views/favorite-button',
  22124.   'lounge/views/top-navigation',
  22125.   'lounge/views/thread-footer',
  22126.   'lounge/views/secondary-navigation',
  22127.   'lounge/tracking',
  22128.   'templates/lounge/userMenu',
  22129.   'templates/lounge/threadShareBar',
  22130.   'templates/lounge/layout',
  22131.   'templates/lounge/inEmbedAd',
  22132.   'templates/lounge/inthreadAd',
  22133.   'templates/lounge/termsOfService',
  22134.   'templates/lounge/partials/postCount',
  22135.   'templates/lounge/partials/postSort',
  22136.   'common/main',
  22137.   'common/collections/profile'
  22138. ], function (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, 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, ia, ja, ka, la, ma, na, oa, pa, qa, ra, sa, ta, ua, va, wa, xa) {
  22139.   'use strict';
  22140.   var ya = window.document,
  22141.   za = z.get,
  22142.   Aa = F.preventDefaultHandler,
  22143.   Ba = new O,
  22144.   Ca = c.View.extend({
  22145.     events: {
  22146.       'click [data-action=subscribe]': 'subscribe'
  22147.     },
  22148.     initialize: function (a) {
  22149.       this.thread = a.thread,
  22150.       this.session = a.session,
  22151.       this.listenTo(this.thread, 'change:userSubscription', this.updateStatus),
  22152.       this.updateStatus()
  22153.     },
  22154.     updateStatus: function () {
  22155.       this.thread.get('userSubscription') ? (this.$el.addClass('subscribed'), this.$el.find('#thread-subscribe-text-default').addClass('hidden'), this.$el.find('#thread-subscribe-text-subscribed').removeClass('hidden')) : (this.$el.removeClass('subscribed'), this.$el.find('#thread-subscribe-text-default').removeClass('hidden'), this.$el.find('#thread-subscribe-text-subscribed').addClass('hidden'))
  22156.     },
  22157.     subscribe: Aa(function () {
  22158.       var a = this.thread.get('userSubscription');
  22159.       this.session.isLoggedOut() ? this.subscribeAfterAuthentication() : this.thread.subscribe(!a)
  22160.     }),
  22161.     subscribeAfterAuthentication: function () {
  22162.       this.listenToOnce(this.session, 'fetchThreadDetails:success', function () {
  22163.         this.session.isLoggedIn() && this.thread.subscribe()
  22164.       }),
  22165.       this.session.get('sso') && this.session.get('sso').url ? this.session.authenticate('sso') : this.session.authenticate('disqusDotcom')
  22166.     }
  22167.   }),
  22168.   Da = c.View.extend({
  22169.     topEdgeOffset: function () {
  22170.       return - U.getLounge().getPosition().height
  22171.     },
  22172.     initialize: function (a) {
  22173.       this.options = a,
  22174.       this.hasLoaded = null,
  22175.       this.listenToOnce(f(this), 'enter', this.loadImage)
  22176.     },
  22177.     loadImage: function () {
  22178.       var a = this;
  22179.       if (!a.hasLoaded) {
  22180.         var b = function (b) {
  22181.           return function () {
  22182.             a.trigger(b),
  22183.             a.$el.off('.deferredMediaView'),
  22184.             a.relatedPost && U.getLounge().postsView.onDeferredViewReady(a.relatedPost)
  22185.           }
  22186.         };
  22187.         a.$el.on('load.deferredMediaView', b('load')),
  22188.         a.$el.on('error.deferredMediaView', b('error')),
  22189.         a.$el.attr('src', a.options.url),
  22190.         a.hasLoaded = !0
  22191.       }
  22192.     }
  22193.   }),
  22194.   Ea = c.View.extend({
  22195.     tagName: 'ul',
  22196.     className: 'debug',
  22197.     initialize: function (a) {
  22198.       this.values = a
  22199.     },
  22200.     render: function () {
  22201.       return this.$el.html(b.reduce(this.values, function (a, b, c) {
  22202.         return a + '<li><strong>' + c + '</strong>: ' + b + '</li>'
  22203.       }, '')),
  22204.       this
  22205.     }
  22206.   }),
  22207.   Fa = c.View.extend({
  22208.     initialize: function (a) {
  22209.       this.forum = a.forum,
  22210.       this.session = a.session,
  22211.       this.thread = a.thread,
  22212.       this.isInHome = a.isInHome,
  22213.       this.listenTo(this.session, 'change:id', this.render),
  22214.       this.listenTo(this.thread, 'change', this.render),
  22215.       this.listenTo(aa.settings, 'change:collapsed', this.onMediaCollapseChange),
  22216.       this.listenToReactions()
  22217.     },
  22218.     listenToReactions: function () {
  22219.       this.thread.get('reactions') ? this.listenTo(this.thread.get('reactions'), 'sync change:enabled', this.render) : this.listenToOnce(this.thread, 'change:reactions', this.listenToReactions)
  22220.     },
  22221.     render: function () {
  22222.       return i.render(h.createElement(pa, {
  22223.         user: this.session.toJSON(),
  22224.         forum: this.forum.toJSON(),
  22225.         thread: this.thread.toJSON(),
  22226.         sso: this.session.get('sso'),
  22227.         isInHome: this.isInHome
  22228.       }), this.el),
  22229.       this.onMediaCollapseChange(),
  22230.       this
  22231.     },
  22232.     onMediaCollapseChange: function () {
  22233.       aa.settings.get('collapsed') ? this.$el.addClass('media-collapsed') : this.$el.removeClass('media-collapsed')
  22234.     }
  22235.   }),
  22236.   Ga = c.View.extend({
  22237.     events: {
  22238.       'click [data-action=share\\:twitter]': '_onShare',
  22239.       'keyup [data-action=share\\:twitter]': '_onShare',
  22240.       'click [data-action=share\\:facebook]': '_onShare',
  22241.       'keyup [data-action=share\\:facebook]': '_onShare',
  22242.       'click [data-action=share\\:email]': '_onShare',
  22243.       'keyup [data-action=share\\:email]': '_onShare',
  22244.       'click [data-action=copy-link]': '_onCopyLink',
  22245.       'keyup [data-action=copy-link]': '_onCopyLink'
  22246.     },
  22247.     _onCopyLink: Aa(function () {
  22248.       F.copyToClipboard(this.model.shortLink())
  22249.     }),
  22250.     _onShare: Aa(function (a) {
  22251.       var b = 13;
  22252.       if (!a.keyCode || a.keyCode === b) {
  22253.         var c = x.extractService(a.target, 'share');
  22254.         c && this.sharers[c] && (U.getLounge().trigger('uiAction:threadShare', c), this.share(c))
  22255.       }
  22256.     }),
  22257.     render: function () {
  22258.       return i.render(h.createElement(qa, {
  22259.         forum: this.model.forum.id
  22260.       }), this.el),
  22261.       this
  22262.     }
  22263.   });
  22264.   b.extend(Ga.prototype, W.ShareMixin);
  22265.   var Ha = c.View.extend({
  22266.     events: {
  22267.       'change input[name=tos], input[name=privacy-policy]': 'updateEnabled'
  22268.     },
  22269.     initialize: function (a) {
  22270.       this.isPrivate = a.isPrivate,
  22271.       this.session = a.session
  22272.     },
  22273.     updateEnabled: function () {
  22274.       this.$('#accept_tos').prop('disabled', !!this.isPrivate && !this.areTosAccepted())
  22275.     },
  22276.     areTosAccepted: function () {
  22277.       return this.$('input[name=tos]').prop('checked') && this.$('input[name=privacy-policy]').prop('checked')
  22278.     },
  22279.     onAccept: function () {
  22280.       if (!this.isPrivate || this.areTosAccepted()) {
  22281.         var a = this.$('input[name=data-sharing]');
  22282.         a.length && l.call('internal/users/setDNT', {
  22283.           method: 'POST',
  22284.           data: {
  22285.             value: a.prop('checked') ? 0 : 1
  22286.           }
  22287.         }),
  22288.         l.call('users/acceptTerms', {
  22289.           method: 'POST'
  22290.         }),
  22291.         this.close()
  22292.       }
  22293.     },
  22294.     close: function () {
  22295.       this.remove()
  22296.     },
  22297.     render: function () {
  22298.       return i.render(h.createElement(ua, {
  22299.         onAccept: this.onAccept.bind(this),
  22300.         isPrivate: this.isPrivate
  22301.       }), this.el),
  22302.       this.updateEnabled(),
  22303.       this
  22304.     }
  22305.   }),
  22306.   Ia = c.View.extend({
  22307.     initialize: function (a) {
  22308.       this.thread = a.thread,
  22309.       this.postCount = a.thread.get('posts') || 0,
  22310.       this.settings = a.settings
  22311.     },
  22312.     render: function () {
  22313.       return i.render(h.createElement(R, {
  22314.         postCount: this.postCount,
  22315.         titleEnabled: this.settings.title_enabled,
  22316.         titleText: this.settings.title_text,
  22317.         titleCSS: this.settings.title_css,
  22318.         buttonText: this.settings.button_text,
  22319.         buttonCSS: this.settings.button_css
  22320.       }), this.el),
  22321.       this
  22322.     }
  22323.   }),
  22324.   Ja = c.View.extend({
  22325.     initialize: function (a) {
  22326.       this.thread = a.thread,
  22327.       this.forum = a.forum,
  22328.       this.inHome = a.inHome,
  22329.       this.hideFooter = a.hideFooter,
  22330.       this.posts = a.posts
  22331.     },
  22332.     render: function () {
  22333.       return i.render(h.createElement(S, {
  22334.         thread: this.thread.toJSON(),
  22335.         forum: this.forum.toJSON(),
  22336.         inHome: this.inHome,
  22337.         hideFooter: this.hideFooter,
  22338.         isPolicyAccepted: Boolean(K.get('isPolicyAccepted:' + this.forum.id)),
  22339.         posts: this.posts
  22340.       }), this.el),
  22341.       this
  22342.     }
  22343.   }),
  22344.   Ka = c.View.extend({
  22345.     events: {
  22346.       'click [data-action^=auth\\:]': 'handleAuth',
  22347.       'click [data-action=logout]': 'handleLogout',
  22348.       'click [data-action=audiencesync]': 'audienceSync',
  22349.       'click [data-action=profile]': 'handleShowProfile',
  22350.       'click [data-action=community-sidebar]': 'handleShowCommunitySidebar',
  22351.       'click [data-action=sort]': 'handleSort',
  22352.       'click [data-action=toggle-thread-premoderate]': 'toggleThreadPremoderate',
  22353.       'click [data-action=toggle-thread]': 'toggleThread',
  22354.       'click [data-action=toggle-thread-ratings]': 'toggleThreadRatingsEnabled',
  22355.       'click [data-action=toggle-thread-visibility]': 'toggleBehindClick',
  22356.       'click [data-action=debug]': 'renderDebugInfo',
  22357.       'click [data-action=repair]': 'repairThread',
  22358.       'click [data-action=toggle-media]': 'toggleMedia',
  22359.       'click [data-action=toggle-reactions]': 'toggleReactions',
  22360.       'click a': 'handleLinkClick',
  22361.       'click [data-action=accept-comment-policy]': 'setPolicyAccepted',
  22362.       'click [data-action=toggle-embed-refresh]': 'toggleEmbedRefresh'
  22363.     },
  22364.     initialize: function (c) {
  22365.       U.setLounge(this),
  22366.       c = c || {
  22367.       };
  22368.       var d = c.jsonData || {
  22369.       };
  22370.       this.language = ya.documentElement.lang,
  22371.       this.initialData = d.response || {
  22372.       },
  22373.       this.cleanInitialData(this.initialData),
  22374.       this.onboardWindowName = x.globalUniqueId('disqus_'),
  22375.       this.initialData.forum && this.initialData.forum.id && (A.moderate = x.updateURL(A.moderate, {
  22376.         hostname: this.initialData.forum.id + '.'
  22377.       })),
  22378.       this.deferredViews = [
  22379.       ],
  22380.       this.unsortedDeferredViews = [
  22381.       ],
  22382.       this.inthreadAdApps = [
  22383.       ],
  22384.       this.adPromise = a.Deferred().resolve(),
  22385.       D.setDefaults(this.initialData.session),
  22386.       this.session = D.get(),
  22387.       this.forum = new v.Forum,
  22388.       this.forum.set(this.initialData.forum),
  22389.       this.thread = new v.Thread(this.initialData.thread, {
  22390.         forum: this.forum,
  22391.         postCursor: d.cursor,
  22392.         moderators: (this.initialData.thread || {
  22393.         }).moderators,
  22394.         order: d.order
  22395.       }),
  22396.       this.initUserSuggestionsManager();
  22397.       this.postsView = new _.PostCollectionView({
  22398.         posts: this.thread.posts,
  22399.         thread: this.thread,
  22400.         lounge: this,
  22401.         session: this.session,
  22402.         el: this.el,
  22403.         userSuggestions: this.userSuggestions
  22404.       }),
  22405.       this.states = {
  22406.         fullyVisible: !1,
  22407.         realtimeIndicatorsCreated: !1,
  22408.         streamingPaused: !1,
  22409.         inViewport: !1,
  22410.         behindClick: !1
  22411.       },
  22412.       this.meta = {
  22413.         topics: null
  22414.       },
  22415.       xa.timings.loungeStart = Number(new Date);
  22416.       var e = b.bind(this.bootstrap, this);
  22417.       G(window) ? (this.listenTo(y.frame, 'init', e), this.initThreadView()) : b.defer(e),
  22418.       this.setAlertSelector('#layout'),
  22419.       this.initResizeHandler(),
  22420.       this.initAlertListeners(),
  22421.       this.initTopics()
  22422.     },
  22423.     setPolicyAccepted: function () {
  22424.       K.set('isPolicyAccepted:' + this.forum.id, !0),
  22425.       this.$el.find('#comment-policy').addClass('hidden')
  22426.     },
  22427.     cleanInitialData: function (a) {
  22428.       var c = a.thread && a.thread.highlightedPost;
  22429.       c && (c.isHighlighted = !0),
  22430.       b.each(a.posts, function (a) {
  22431.         c ? a.isHighlighted = a.id === c.id : a.isHighlighted = !1
  22432.       })
  22433.     },
  22434.     initAlertListeners: function () {
  22435.       this.listenTo(this.session, 'alert', this.alert)
  22436.     },
  22437.     initOnboardAlert: function () {
  22438.       var a = this.onboardAlert = new ba.OnboardAlert({
  22439.         session: this.session,
  22440.         forum: this.forum
  22441.       });
  22442.       this.proxyViewEvents(this.onboardAlert),
  22443.       this.listenTo(this.session, 'change:id', function () {
  22444.         a.setInitialCookie(),
  22445.         a.render().$el.appendTo('#onboard')
  22446.       })
  22447.     },
  22448.     bootstrap: function (a) {
  22449.       var c,
  22450.       d = this,
  22451.       e = {
  22452.       };
  22453.       d.config = a = a || x.getConfigFromHash(window),
  22454.       a.forceSwitch && M.forceFeature(a.forceSwitch),
  22455.       a.loaderVersion = xa.version,
  22456.       d.states.fullyVisible = a.startedFullyVisible,
  22457.       k.init({
  22458.         isPrivate: a.isPrivate
  22459.       });
  22460.       var f = a.experiment;
  22461.       if (f) {
  22462.         if (f.experiment && f.variant) {
  22463.           var g = f,
  22464.           h = g.experiment,
  22465.           i = g.variant;
  22466.           h = h.replace(/_hidden$/, ''),
  22467.           M.forceFeature(['experiment',
  22468.           h,
  22469.           i].join(':'))
  22470.         }
  22471.       } else a.experiment = f = {
  22472.       };
  22473.       a.apiKey && (e['X-Disqus-Publisher-API-Key'] = a.apiKey),
  22474.       b.isObject(a.remoteAuthS3) && b.isEmpty(a.remoteAuthS3) ? a.remoteAuthS3 = null : e['X-Disqus-Remote-Auth'] = a.remoteAuthS3,
  22475.       b.isEmpty(e) || l.headers(e),
  22476.       a.anchorColor && (c = H(a.anchorColor), x.setPublisherColor(c), x.addStylesheetRules([['.publisher-anchor-color a',
  22477.       [
  22478.         'color',
  22479.         c,
  22480.         !0
  22481.       ]],
  22482.       [
  22483.         'a.publisher-anchor-color',
  22484.         [
  22485.           'color',
  22486.           c,
  22487.           !0
  22488.         ]
  22489.       ],
  22490.       [
  22491.         '.publisher-anchor-hover a:hover',
  22492.         [
  22493.           'color',
  22494.           c,
  22495.           !0
  22496.         ]
  22497.       ],
  22498.       [
  22499.         'a.publisher-anchor-hover:hover',
  22500.         [
  22501.           'color',
  22502.           c,
  22503.           !0
  22504.         ]
  22505.       ],
  22506.       [
  22507.         '.active .publisher-nav-color:after',
  22508.         [
  22509.           'background',
  22510.           c,
  22511.           !0
  22512.         ]
  22513.       ],
  22514.       [
  22515.         '.media-preview .active.publisher-border-color',
  22516.         [
  22517.           'border-color',
  22518.           c,
  22519.           !0
  22520.         ]
  22521.       ],
  22522.       [
  22523.         '.publisher-color',
  22524.         [
  22525.           'color',
  22526.           c,
  22527.           !1
  22528.         ]
  22529.       ],
  22530.       [
  22531.         '.publisher-color:hover',
  22532.         [
  22533.           'color',
  22534.           c,
  22535.           !1
  22536.         ]
  22537.       ],
  22538.       [
  22539.         '.publisher-background-color',
  22540.         [
  22541.           'background-color',
  22542.           c,
  22543.           !1
  22544.         ]
  22545.       ],
  22546.       [
  22547.         '.publisher-border-color',
  22548.         [
  22549.           'border-color',
  22550.           c,
  22551.           !1
  22552.         ]
  22553.       ],
  22554.       [
  22555.         '.publisher-color-refresh',
  22556.         [
  22557.           'color',
  22558.           c,
  22559.           !0
  22560.         ]
  22561.       ],
  22562.       [
  22563.         '.publisher-color-refresh:hover',
  22564.         [
  22565.           'color',
  22566.           c,
  22567.           !0
  22568.         ]
  22569.       ],
  22570.       [
  22571.         '.publisher-background-color-refresh',
  22572.         [
  22573.           'background-color',
  22574.           c,
  22575.           !0
  22576.         ]
  22577.       ],
  22578.       [
  22579.         '.publisher-background-color-hover-refresh:hover',
  22580.         [
  22581.           'background-color',
  22582.           c,
  22583.           !0
  22584.         ]
  22585.       ],
  22586.       [
  22587.         '.publisher-border-color-refresh',
  22588.         [
  22589.           'border-color',
  22590.           c,
  22591.           !0
  22592.         ]
  22593.       ]])),
  22594.       a.impressionId && k.impression.setImpressionId(a.impressionId),
  22595.       x.injectBaseElement(),
  22596.       a.referrer && (d.thread.currentUrl = a.referrer),
  22597.       this.config.inthreadLeadingCommentCount && (this.config.inthreadLeadingCommentCount = Number(this.config.inthreadLeadingCommentCount), this.config.inthreadRepeatCommentCount = Number(this.config.inthreadRepeatCommentCount), this.config.inthreadTrailingCommentCount = Number(this.config.inthreadTrailingCommentCount));
  22598.       var j = this.getPermalinkOptions(a.parentWindowHash);
  22599.       j && y.frame.once('embed.rendered', b.bind(d.scrollToPost, d, j.postId, j.options)),
  22600.       a.sso && d.session.set('sso', a.sso),
  22601.       M.isFeatureActive('embed_v2', {
  22602.         forum: this.forum.id
  22603.       }) && (window.embedv2 = window.embedv2 || {
  22604.       }, window.embedv2.embedConfig = a, window.embedv2.TLDS = t.TLDS),
  22605.       a.initialPosition ? d.position = a.initialPosition : d.position = x.calculatePositionFullscreen(),
  22606.       d.initPrivacySettings(),
  22607.       d.initLinkAffiliation(),
  22608.       d.initLiveRamp(),
  22609.       d.updateModeratorBadgeText(),
  22610.       d.bindBusListeners();
  22611.       var m = xa.timings;
  22612.       m.hostStart = a.timestamp || m.initStart,
  22613.       m.embedLoadTime = a.loadTime,
  22614.       this.once('threadView:prep', function () {
  22615.         d.listenToOnce(d.postsView, 'render:start', function () {
  22616.           m.renderStart = Number(new Date)
  22617.         }),
  22618.         d.listenToOnce(d.postsView, 'render:end', d.sendTelemetry),
  22619.         m.bootstrapStart = Number(new Date),
  22620.         d.postsView.bootstrap(d.initialData, j),
  22621.         d.initAfterPostCreateHandler(),
  22622.         d.initSession()
  22623.       }),
  22624.       d.initUI(),
  22625.       d.initLinkHandler(),
  22626.       d.initialized = !0,
  22627.       d.trigger('bootstrap:complete', d)
  22628.     },
  22629.     _isInHome: function (a, b) {
  22630.       var c = /^(?:https?:)?\/\/(?:www.)?/;
  22631.       return a = a.replace(c, ''),
  22632.       b = b.replace(c, ''),
  22633.       0 === a.indexOf(b)
  22634.     },
  22635.     isInHome: function () {
  22636.       return !(!this.config || !this.config.referrer) && this._isInHome(this.config.referrer, T.apps.home + 'home/')
  22637.     },
  22638.     isOnChannel: function () {
  22639.       return !(!this.forum || !this.forum.id) && 0 === this.forum.id.indexOf('channel-')
  22640.     },
  22641.     initSession: function () {
  22642.       var a = this.config,
  22643.       b = this.session,
  22644.       c = this.thread;
  22645.       b.start({
  22646.         remoteAuthS3: a.remoteAuthS3,
  22647.         sso: a.sso,
  22648.         apiKey: a.apiKey,
  22649.         thread: c
  22650.       })
  22651.     },
  22652.     initPrivacySettings: function () {
  22653.       this.listenToOnce(this.session, 'change:id', function (a) {
  22654.         oa.isPrivate(a) && m.set({
  22655.           collapsed: {
  22656.             value: !0,
  22657.             persist: !1
  22658.           }
  22659.         })
  22660.       })
  22661.     },
  22662.     initLiveRamp: function () {
  22663.       var a = this.forum.get('settings') || {
  22664.       };
  22665.       a.userIdentityDisabled || this.listenTo(this.session, 'change:id', function (a) {
  22666.         var b = a.get('email');
  22667.         b && y.frame.sendHostMessage('liveramp:init', {
  22668.           email: a.get('email'),
  22669.           launchpad: A.liveRampAtsV2
  22670.         })
  22671.       })
  22672.     },
  22673.     initLinkAffiliation: function () {
  22674.       var a = N.getVersion();
  22675.       if (M.isFeatureActive('viglink_experiment', {
  22676.         forum: this.forum.id,
  22677.         forumPercent: this.forum.id
  22678.       }) && (a = N.getExperimentVersion()), this.isLinkAffiliatorEnabled() && !this.initLinkAffiliatorCalled && 'none' !== a) {
  22679.         this.initLinkAffiliatorCalled = !0;
  22680.         var b = A.linkAffiliatorClientV4;
  22681.         oa.shouldTrack(this.forum, this.session.user) && 'v5' === a && (b = A.linkAffiliatorClientV5),
  22682.         y.frame.sendHostMessage('viglink:init', {
  22683.           clientUrl: b,
  22684.           apiUrl: A.linkAffiliatorAPI,
  22685.           key: E.viglinkAPI,
  22686.           id: this.forum.get('pk')
  22687.         })
  22688.       }
  22689.     },
  22690.     initAfterPostCreateHandler: function () {
  22691.       this.listenTo(this.thread, 'create', function (a) {
  22692.         var c = a.toJSON();
  22693.         y.frame.sendHostMessage('posts.create', c),
  22694.         Ba.broadcast('posts.create', b.pick(c, 'forum', 'parent', 'id'))
  22695.       })
  22696.     },
  22697.     sendTelemetry: function () {
  22698.       if (x.shouldSample(u.lounge.telemetry_sample_percent)) {
  22699.         var c = a.now(),
  22700.         d = xa.timings,
  22701.         e = {
  22702.           embed: d.embedLoadTime,
  22703.           frame: d.initStart - d.hostStart,
  22704.           asset: d.downloadEnd - d.initStart,
  22705.           render: c - d.renderStart,
  22706.           total: c - d.hostStart - (d.renderStart - d.bootstrapStart)
  22707.         },
  22708.         f = window.performance;
  22709.         if (f) {
  22710.           var g = f.timing;
  22711.           g.responseStart && (e.frame_rtt = g.responseStart - g.navigationStart);
  22712.           var h = b.find(f.getEntries && f.getEntries() || [
  22713.           ], function (a) {
  22714.             return a.name.indexOf('/next/config.js') > - 1
  22715.           });
  22716.           h && h.responseStart && (e.config_rtt = h.responseStart - h.startTime)
  22717.         }
  22718.         var i = 'lounge_' + ('static' === this.config.experiment.service ? 'static' : 'dynamic');
  22719.         return B.telemetry(i, e)
  22720.       }
  22721.     },
  22722.     initUI: function () {
  22723.       this.applyPublisherClasses(),
  22724.       this.renderLayout(),
  22725.       this.setAlertSelector('#global-alert'),
  22726.       this.bindUIUpdateHandlers(),
  22727.       this.initDeferredViews(),
  22728.       this.postsView.once('render:end', function () {
  22729.         var a = x.getPageHeight();
  22730.         y.frame.sendHostMessage('rendered', {
  22731.           height: a
  22732.         }),
  22733.         this._lastHeight = a,
  22734.         this.initRealtime()
  22735.       }, this),
  22736.       this.once('threadView:prep', this.initUIComponents),
  22737.       this.initThreadView()
  22738.     },
  22739.     initUIComponents: function () {
  22740.       this.initMainPostBox(),
  22741.       this.initTermsOfService(),
  22742.       this.initReactions(),
  22743.       this.initStarRatings(),
  22744.       this.initThreadFooter(),
  22745.       this.initSecondaryNavigation(),
  22746.       this.isInHome() || (this.initTopNavigation(), this.initUserMenu(), this.initOnboardAlert(), this.initNotificationMenu(), this.initFavoriteButton(), this.initThreadShareBar()),
  22747.       M.isFeatureActive('embed_refresh_v2', {
  22748.         forum: this.forum.id
  22749.       }) || this.initBadgesMessage(),
  22750.       this.initHighlightedPost(),
  22751.       this.initEmailSignup(),
  22752.       this.initThreadSubscribe(),
  22753.       this.bindProfileUIListeners(this.session),
  22754.       this.updatePostCount(),
  22755.       this.trigger('threadView:render')
  22756.     },
  22757.     initHighlightedPost: function () {
  22758.       var a = this.thread.get('highlightedPost');
  22759.       a && !M.isFeatureActive('embed_refresh', {
  22760.         forum: this.forum.id
  22761.       }) && this.thread.posts.add(a),
  22762.       this.highlightedPostView = new da.HighlightedPostView({
  22763.         el: this.threadView.$el.find('#highlighted-post'),
  22764.         thread: this.thread,
  22765.         session: this.session,
  22766.         userSuggestions: this.userSuggestions,
  22767.         config: this.config
  22768.       }),
  22769.       this.highlightedPostView.reset()
  22770.     },
  22771.     initReactions: function () {
  22772.       if (this.forum.get('settings')) {
  22773.         if (!this.forum.get('settings').threadReactionsEnabled && !this.forum.channel) return void this.initReactionsPromotion();
  22774.         var a = new w.ReactionsCollection([], {
  22775.           thread: this.thread,
  22776.           userIsAnonymous: this.session.user.isAnonymous()
  22777.         });
  22778.         this.listenTo(a, 'sync', function () {
  22779.           a.length ? this.showReactions(a) : this.removeReactions()
  22780.         }),
  22781.         this.listenTo(a, 'change:enabled', function () {
  22782.           a.enabled ? this.showReactions(a) : this.removeReactions()
  22783.         }),
  22784.         this.thread.set('reactions', a),
  22785.         a.fetch()
  22786.       }
  22787.     },
  22788.     showReactions: function (a) {
  22789.       if (!this.reactionsView) {
  22790.         var b = this.reactionsView = new ia({
  22791.           reactions: a,
  22792.           readonly: this.thread.get('isClosed'),
  22793.           session: this.session,
  22794.           forum: this.thread.forum.id
  22795.         });
  22796.         b.render(),
  22797.         this.threadView.$el.find('#reactions__container').prepend(b.$el)
  22798.       }
  22799.     },
  22800.     removeReactions: function () {
  22801.       this.reactionsView && (this.reactionsView.remove(), this.reactionsView = null)
  22802.     },
  22803.     initReactionsPromotion: function () {
  22804.       if (!this.thread.isModerator(this.session.user)) return void this.listenToOnce(this.session, 'change:id', this.initReactionsPromotion);
  22805.       var b = 'reactionsEmbedPromotion',
  22806.       c = this;
  22807.       l.call('announcements/messages/checkViewed', {
  22808.         data: {
  22809.           message: b
  22810.         }
  22811.       }).success(function (d) {
  22812.         var e = d.response;
  22813.         if (!e[b]) {
  22814.           var f = c.reactionsPromotionView = new ja({
  22815.             forum: c.forum
  22816.           });
  22817.           f.render(),
  22818.           a('#reactions__container').prepend(f.$el)
  22819.         }
  22820.       })
  22821.     },
  22822.     initStarRatings: function () {
  22823.       this.forum.get('features') ? I.isForumModelRatingsEnabled(this.forum) && (this.thread.get('ratingsEnabled') && this.thread.fetchRatings(), this.listenTo(this.thread, 'change', this.showRatings), this.showRatings()) : this.listenToOnce(this.thread.forum, 'change:features', this.initStarRatings)
  22824.     },
  22825.     showRatings: function () {
  22826.       var a = M.isFeatureActive('star_ratings_total_hidden', {
  22827.         forum: this.forum.id
  22828.       });
  22829.       if (!this.ratingsView && this.thread && this.session && !a) {
  22830.         var b = this.ratingsView = new ha({
  22831.           thread: this.thread,
  22832.           session: this.session
  22833.         });
  22834.         b.render(),
  22835.         this.threadView.$el.find('#ratings__container').html(b.$el)
  22836.       }
  22837.     },
  22838.     bindUIUpdateHandlers: function () {
  22839.       var a = this,
  22840.       b = a.thread,
  22841.       c = a.session;
  22842.       a.listenTo(b, {
  22843.         'change:posts': a.updatePostCount
  22844.       }),
  22845.       a.listenTo(b.queue, 'add reset', a.toggleRealtimeNotifications),
  22846.       a.postsView.bindUIUpdateHandlers(),
  22847.       a.listenTo(c, 'change:id', a.updateThreadSessionData),
  22848.       a.listenTo(a, 'scrollOffViewport', function () {
  22849.         this.states.realtimeIndicatorsCreated && y.frame.sendHostMessage('indicator:hide')
  22850.       }),
  22851.       a.listenTo(a, 'scroll', function (a) {
  22852.         this.position = a
  22853.       }),
  22854.       a.listenTo(a, 'scroll', a.handleRealtimeScroll),
  22855.       a.listenTo(a.postsView, 'render:end', function () {
  22856.         a.toggleRealtimeNotifications(),
  22857.         a.config.inthreadPlacementUrl && a.loadInthreadAd()
  22858.       }),
  22859.       a.listenToOnce(a, 'threadView:render', function () {
  22860.         a.loadInEmbedAd()
  22861.       })
  22862.     },
  22863.     whenFullyVisible: function () {
  22864.       var b = a.Deferred();
  22865.       return this.states.fullyVisible ? b.resolve() : this.listenTo(this, 'frame.visible', function () {
  22866.         b.resolve()
  22867.       }),
  22868.       b.promise()
  22869.     },
  22870.     canShowInthreadAd: function (a, b) {
  22871.       if (!this.config.inthreadMultipleAds && a > 0) return !1;
  22872.       var c = this.config.inthreadLeadingCommentCount + this.config.inthreadRepeatCommentCount * a,
  22873.       d = c + this.config.inthreadTrailingCommentCount;
  22874.       return b >= d
  22875.     },
  22876.     inthreadAdInit: function (b, c) {
  22877.       var d = a.Deferred();
  22878.       return this.inthreadAdApps[b].init(),
  22879.       this.listenToOnce(this.inthreadAdApps[b], 'frame:ready', function () {
  22880.         c.css({
  22881.           height: 'auto',
  22882.           'margin-bottom': '24px'
  22883.         }),
  22884.         d.resolve()
  22885.       }),
  22886.       this.listenToOnce(this.inthreadAdApps[b], 'ad-placement-empty', function () {
  22887.         c.css({
  22888.           height: '',
  22889.           'margin-bottom': ''
  22890.         })
  22891.       }),
  22892.       d.promise()
  22893.     },
  22894.     loadInEmbedAd: function () {
  22895.       var c = this.config.topInEmbedPlacementUrl;
  22896.       if (c) {
  22897.         var d = a(sa());
  22898.         d.prependTo(this.postsView.$el);
  22899.         var e = j.Ads(b.extend({
  22900.           adUrl: c,
  22901.           placement: 'top_in_embed',
  22902.           container: d[0],
  22903.           isInHome: !1,
  22904.           isOnHostPage: !1,
  22905.           forumId: this.forum.get('pk'),
  22906.           version: this.config.version
  22907.         }, this.config));
  22908.         e.init()
  22909.       }
  22910.       var f = this.config.bottomInEmbedPlacementUrl;
  22911.       if (f) {
  22912.         var g = a(sa());
  22913.         g.appendTo(this.postsView.$el);
  22914.         var h = j.Ads(b.extend({
  22915.           adUrl: f,
  22916.           placement: 'bottom_in_embed',
  22917.           container: g[0],
  22918.           isInHome: !1,
  22919.           isOnHostPage: !1,
  22920.           forumId: this.forum.get('pk'),
  22921.           version: this.config.version
  22922.         }, this.config));
  22923.         h.init()
  22924.       }
  22925.     },
  22926.     loadInthreadAd: function () {
  22927.       var c = this.postsView.$el.find('#post-list');
  22928.       if (!(this.config.adBlockEnabled && !this.config.defaultPlacementUrl || c.hasClass('loading'))) {
  22929.         var d = this.config.inthreadCountChildren ? c.find('.post:not(.advertisement)') : c.children(':not(.advertisement)'),
  22930.         e = {
  22931.         };
  22932.         0 === this.config.experiment.experiment.indexOf('googlewidemargins') && 'fallthrough' !== this.config.experiment.variant && (e.margin = '0 ' + this.config.experiment.variant, e['min-width'] = 'calc(100% - ' + 2 * parseInt(this.config.experiment.variant, 10) + 'px)');
  22933.         var f;
  22934.         f = this.config.adBlockEnabled && this.config.defaultPlacementUrl ? J(this.config.defaultPlacementUrl, {
  22935.           position: 'inthread'
  22936.         }) : this.config.inthreadPlacementUrl;
  22937.         for (var g = this.inthreadAdApps.length; this.canShowInthreadAd(g, d.length); g++) {
  22938.           var h = this.config.inthreadLeadingCommentCount + this.config.inthreadRepeatCommentCount * g,
  22939.           i = a(ta());
  22940.           d && d.length && d[h] ? i.insertBefore(d[h]) : i.appendTo(a('#post-list')),
  22941.           this.inthreadAdApps[g] = j.Ads(b.extend({
  22942.             adUrl: f,
  22943.             placement: 'inthread',
  22944.             container: i.find('[data-role=post-content]') [0],
  22945.             isInHome: this.isInHome(),
  22946.             isOnHostPage: !1,
  22947.             forumId: this.forum.get('pk'),
  22948.             version: this.config.version,
  22949.             styles: e
  22950.           }, this.config));
  22951.           var k = this.inthreadAdInit.bind(this, g, i);
  22952.           0 === g ? this.adPromise = this.whenFullyVisible().then(k) : this.adPromise = this.adPromise.then(k)
  22953.         }
  22954.       }
  22955.     },
  22956.     relayScrollToStance: function (a) {
  22957.       f.scroll({
  22958.         top: a.pageOffset - a.frameOffset.top,
  22959.         height: a.height
  22960.       })
  22961.     },
  22962.     initDeferredViews: function () {
  22963.       this.listenTo(this, 'scroll', this.createDeferredViewsForImages),
  22964.       this.listenTo(this, 'domReflow', function () {
  22965.         f.invalidate(),
  22966.         this.position && (this.createDeferredViewsForImages(), this.relayScrollToStance(this.position))
  22967.       })
  22968.     },
  22969.     bindBusListeners: function () {
  22970.       this.listenTo(y.frame, {
  22971.         'window.hashchange': function (a) {
  22972.           var b = this.getPermalinkOptions(a);
  22973.           b && this.scrollToPost(b.postId, b.options)
  22974.         },
  22975.         'window.scroll': function (a) {
  22976.           this.trigger('scroll', a),
  22977.           this.relayScrollToStance(a)
  22978.         },
  22979.         'window.inViewport': function () {
  22980.           this.states.behindClick || (this.states.inViewport = !0, this.trigger('inViewport'))
  22981.         },
  22982.         'window.scrollOffViewport': function () {
  22983.           this.states.inViewport = !1,
  22984.           this.trigger('scrollOffViewport')
  22985.         },
  22986.         'frame.visible': function () {
  22987.           this.states.fullyVisible = !0,
  22988.           this.trigger('frame.visible')
  22989.         },
  22990.         error: function (a) {
  22991.           a = JSON.parse(a),
  22992.           e.captureException(a.error, {
  22993.             extra: {
  22994.               details: a.details
  22995.             },
  22996.             culprit: a.culprit
  22997.           })
  22998.         },
  22999.         'window.resize': this.resize,
  23000.         'indicator:click': this.handleRealtimeClick
  23001.       }),
  23002.       this.listenToOnce(this.session, 'change:id', this.initSidebar)
  23003.     },
  23004.     isLinkAffiliatorEnabled: function () {
  23005.       return this.forum.get('settings').linkAffiliationEnabled && !this.isInHome()
  23006.     },
  23007.     initLinkHandler: function () {
  23008.       this.outboundLinkHandler = new P,
  23009.       this.outboundLinkHandler.registerBeforeNavigationHandler(this.logLinkClick, this)
  23010.     },
  23011.     handleLinkClick: function (a) {
  23012.       this.outboundLinkHandler.handleClick(a)
  23013.     },
  23014.     initRealtimeIndicators: function () {
  23015.       var a = this;
  23016.       if (!a.states.realtimeIndicatorsCreated) {
  23017.         var c = [
  23018.           'north',
  23019.           'south'
  23020.         ].reduce(function (c, d) {
  23021.           return c[d] = {
  23022.             contents: '\n<!DOCTYPE html>\n<html lang="' + b.escape(a.language) + '">\n    <head>\n        <meta charset="utf-8">\n        <title>Disqus Realtime Notification</title>\n    </head>\n    <body>\n        <link rel="stylesheet" href="' + b.escape('https://c.disquscdn.com/next/embed/styles/realtime.b23ff3c36dd0169627f8e54ca1621eca.css') + '">\n        <div class="' + b.escape(d) + '" id="message">-</div>\n    </body>\n</html>\n'
  23023.           },
  23024.           c
  23025.         }, {
  23026.         });
  23027.         y.frame.sendHostMessage('indicator:init', c),
  23028.         a.states.realtimeIndicatorsCreated = !0
  23029.       }
  23030.     },
  23031.     insertStreamingComments: b.throttle(function () {
  23032.       var a = this.thread.queue;
  23033.       a.drain(),
  23034.       b.each(a.counters.replies, function (b, c) {
  23035.         a.drain(c)
  23036.       })
  23037.     }, 1000),
  23038.     updateModeratorBadgeText: function () {
  23039.       var a = this.forum.get('moderatorBadgeText');
  23040.       a && (z.translations.Mod = a)
  23041.     },
  23042.     logLinkClick: function (b) {
  23043.       var c = a(b.currentTarget);
  23044.       if (F.clickShouldBeLogged(b, c)) return B.client.emit({
  23045.         verb: 'click',
  23046.         object_type: 'link',
  23047.         object_id: c[0].href,
  23048.         area: oa.getEventTrackingArea(b)
  23049.       })
  23050.     },
  23051.     handleRealtimeScroll: function (a) {
  23052.       if (this.states.inViewport && this.states.realtimeIndicatorsCreated) {
  23053.         var c = b.union([this.queueView], b.values(this.postsView.subViews)),
  23054.         d = 0,
  23055.         e = 0;
  23056.         b.each(c, function (b) {
  23057.           if (b && !b.getDirection && (b = b.queueView), b && !(b.options.count <= 0)) {
  23058.             var c = b.getDirection(a);
  23059.             1 === c ? d += b.options.count : c === - 1 && (e += b.options.count)
  23060.           }
  23061.         });
  23062.         var f,
  23063.         g,
  23064.         h = function (a) {
  23065.           var c = a.orientation,
  23066.           d = a.num,
  23067.           e = void 0;
  23068.           return e = 'north' === c ? 1 === d ? za('One new comment above.') : z.interpolate(za('%(num)s new comments above.'), {
  23069.             num: d
  23070.           }) : 1 === d ? za('One new comment below.') : z.interpolate(za('%(num)s new comments below.'), {
  23071.             num: d
  23072.           }),
  23073.           '<p>' + b.escape(e) + '</p>'
  23074.         };
  23075.         g = {
  23076.           type: 'north'
  23077.         },
  23078.         d > 0 ? (f = 'indicator:show', g.content = h({
  23079.           num: d,
  23080.           orientation: 'north'
  23081.         })) : f = 'indicator:hide',
  23082.         y.frame.sendHostMessage(f, g),
  23083.         g = {
  23084.           type: 'south'
  23085.         },
  23086.         e > 0 ? (g.content = h({
  23087.           num: e,
  23088.           orientation: 'south'
  23089.         }), f = 'indicator:show') : f = 'indicator:hide',
  23090.         y.frame.sendHostMessage(f, g)
  23091.       }
  23092.     },
  23093.     handleRealtimeClick: function (a) {
  23094.       var c = this;
  23095.       y.frame.sendHostMessage('indicator:hide', {
  23096.         type: a
  23097.       });
  23098.       var d,
  23099.       e,
  23100.       f,
  23101.       g = b.union([c], b.toArray(c.postsView.subViews));
  23102.       g = b.filter(g, function (b) {
  23103.         if (b = b.queueView, !b || b.options.count <= 0) return !1;
  23104.         var d = 'north' === a ? 1 : - 1;
  23105.         return b.getDirection(c.position) === d
  23106.       }),
  23107.       g = b.sortBy(g, function (a) {
  23108.         return a === c ? 0 : a.offset.top
  23109.       }),
  23110.       d = 'north' === a ? b.last(g) : b.first(g),
  23111.       e = d.queueView,
  23112.       d === c ? (f = 0, e.handleDrain()) : (f = d.offset.top - 100, e.handleDrain()),
  23113.       U.getLounge().once('domReflow', b.bind(y.frame.sendHostMessage, y.frame, 'scrollTo', {
  23114.         top: f
  23115.       }))
  23116.     },
  23117.     toggleRealtimeNotifications: function () {
  23118.       var a = this,
  23119.       c = a.thread.queue;
  23120.       if (b.defer(function () {
  23121.         y.frame.sendHostMessage('fakeScroll')
  23122.       }), !c.length) return void a.$el.find('[data-role=realtime-notification]').hide();
  23123.       if (a.thread.get('hasStreaming')) return void a.insertStreamingComments();
  23124.       if (c.counters.comments) {
  23125.         var d = a.queueView || new ea.QueuedPostView({
  23126.           model: a.thread,
  23127.           el: a.$el.find('button[data-role=realtime-notification]')
  23128.         });
  23129.         a.queueView = d,
  23130.         d.setCount(c.counters.comments),
  23131.         d.render()
  23132.       }
  23133.       b.each(c.counters.replies, function (b, c) {
  23134.         var d = a.thread.posts.get(c);
  23135.         if (d) {
  23136.           var e = a.postsView.getPostView(d.cid);
  23137.           if (e) {
  23138.             var f = e.queueView;
  23139.             f || (f = new ea.QueuedReplyView({
  23140.               thread: a.thread,
  23141.               postView: e,
  23142.               model: d,
  23143.               el: e.$el.find('[data-role=realtime-notification\\:' + c + '] a')
  23144.             }), e.queueView = f),
  23145.             f.setCount(b),
  23146.             f.render()
  23147.           }
  23148.         }
  23149.       })
  23150.     },
  23151.     initBehindClick: function () {
  23152.       var c = this;
  23153.       if (!c.behindClickView && c.thread && a('#behindclick__container').length) {
  23154.         var d = {
  23155.           title_enabled: !1,
  23156.           title_text: null,
  23157.           title_css: null,
  23158.           button_text: null,
  23159.           button_css: null
  23160.         };
  23161.         l.call('forums/behindClick/details', {
  23162.           data: {
  23163.             forum: this.forum.id
  23164.           }
  23165.         }).success(function (a) {
  23166.           var e = a.response;
  23167.           c.showBehindClick(b.defaults({
  23168.           }, e, d))
  23169.         })
  23170.       }
  23171.     },
  23172.     showBehindClick: function (b) {
  23173.       var c = a('#behindclick__container'),
  23174.       d = new Ia({
  23175.         thread: this.thread,
  23176.         settings: b
  23177.       });
  23178.       d.render(),
  23179.       c.html(d.$el),
  23180.       y.frame.sendHostMessage('rendered', {
  23181.         height: x.getPageHeight()
  23182.       })
  23183.     },
  23184.     toggleBehindClick: function () {
  23185.       this.$('#behindclick__container').hide(),
  23186.       this.states.behindClick = !1,
  23187.       y.frame.trigger('window.inViewport'),
  23188.       y.trigger('uiAction:behindClickButton'),
  23189.       this.trigger('threadView:prep')
  23190.     },
  23191.     initThreadView: function () {
  23192.       this.createThreadView(),
  23193.       this.forum.get('settings').behindClickEnabled ? (this.initBehindClick(), this.states.behindClick = !0) : this.trigger('threadView:prep')
  23194.     },
  23195.     createThreadView: function () {
  23196.       if (!this.threadView && this.thread && this.session) {
  23197.         var a,
  23198.         b = this.isInHome();
  23199.         this.thread.posts.buffer && (a = this.thread.posts.getOrder());
  23200.         var c = this.threadView = new Ja({
  23201.           thread: this.thread,
  23202.           forum: this.forum,
  23203.           order: a,
  23204.           inHome: b,
  23205.           hideFooter: b,
  23206.           posts: this.initialData.posts
  23207.         });
  23208.         c.render(),
  23209.         this.trigger('threadView:init'),
  23210.         this.once('threadView:render', function () {
  23211.           this.$('#thread__container').html(this.threadView.$el)
  23212.         })
  23213.       }
  23214.     },
  23215.     renderDebugInfo: Aa(function () {
  23216.       if (this.session.user.get('isGlobalAdmin')) {
  23217.         var a = this.thread.forum.get('settings', {
  23218.         }),
  23219.         b = new Ea({
  23220.           Shortname: this.thread.get('forum'),
  23221.           'Thread ID': this.thread.get('id'),
  23222.           'Org ID': this.forum.get('organizationId'),
  23223.           'Thread slug': this.thread.get('slug'),
  23224.           'Anchor color': H(this.config.anchorColor),
  23225.           Language: this.thread.forum.get('language'),
  23226.           Recommendations: a.organicDiscoveryEnabled,
  23227.           'Ads enabled': a.adsEnabled,
  23228.           'Ads top enabled': a.adsPositionTopEnabled,
  23229.           'Ads bottom enabled': a.adsPositionBottomEnabled,
  23230.           'Ads in-thread enabled': a.adsPositionInthreadEnabled,
  23231.           'Ads recommendations enabled': a.adsPositionRecommendationsEnabled,
  23232.           'Ads Product Display enabled': a.adsProductDisplayEnabled,
  23233.           'Ads Product Links enabled': a.adsProductLinksEnabled,
  23234.           'Ads Product Video enabled': a.adsProductVideoEnabled,
  23235.           'In iframe': this.config.isHostIframed,
  23236.           'Behind click': this.config.isBehindClick,
  23237.           'Height restricted': this.config.isHeightRestricted
  23238.         });
  23239.         b.render();
  23240.         var c = ya.body;
  23241.         c.insertBefore(b.el, c.firstChild)
  23242.       }
  23243.     }),
  23244.     repairThread: Aa(function () {
  23245.       this.session.user.get('isGlobalAdmin') && l.call('internal/threads/repair.json', {
  23246.         method: 'GET',
  23247.         data: {
  23248.           thread: this.thread.get('id')
  23249.         },
  23250.         success: b.bind(this.alert, this, 'Thread repair has been queued. Refresh in a few seconds.'),
  23251.         error: b.bind(this.alert, this, 'An error occurred while repairing thread. Please try again.', {
  23252.           type: 'error'
  23253.         })
  23254.       })
  23255.     }),
  23256.     getPermalinkOptions: function (a) {
  23257.       var b = a && a.match(/(comment|reply|edit)-([0-9]+)/);
  23258.       if (b) return {
  23259.         postId: b[2],
  23260.         options: {
  23261.           highlight: !0,
  23262.           openReply: 'reply' === b[1],
  23263.           openEdit: 'edit' === b[1]
  23264.         }
  23265.       }
  23266.     },
  23267.     scrollToPost: function (a, c) {
  23268.       c = c || {
  23269.       },
  23270.       c.padding = c.padding || 90;
  23271.       var d = this,
  23272.       e = d.$el.find('#post-' + a);
  23273.       if (M.isFeatureActive('embed_refresh', {
  23274.         forum: this.forum.id
  23275.       }) && !e.length && d.highlightedPostView && d.highlightedPostView.post && d.highlightedPostView.post.id === a) e = d.highlightedPostView.$el.find('.post');
  23276.        else if (!e.length) return void v.Post.fetchContext(a, d.thread, {
  23277.         requestedByPermalink: !0
  23278.       }).done(function () {
  23279.         d.postsView.once('render:end', b.bind(d.scrollToPost, d, a, c)),
  23280.         y.frame.once('embed.resized', b.bind(d.scrollToPost, d, a, c))
  23281.       });
  23282.       c.highlight && (d.$el.find('.post-content.target').removeClass('target'), e.find('.post-content').first().addClass('target')),
  23283.       c.openReply && d.postsView.openReply(a),
  23284.       c.openEdit && d.postsView.openEdit(a),
  23285.       y.frame.sendHostMessage('scrollTo', {
  23286.         top: e.offset().top - c.padding,
  23287.         force: c.force || null
  23288.       })
  23289.     },
  23290.     updateThreadSessionData: function (a) {
  23291.       if (a) {
  23292.         a.get('thread') && this.thread.set(a.get('thread'));
  23293.         var c = a.get('votes');
  23294.         c && 'object' === ('undefined' == typeof c ? 'undefined' : _typeof(c)) && b.each(c, function (a, b) {
  23295.           var c = this.postsView.posts.get(b);
  23296.           c && c.set('userScore', a)
  23297.         }, this);
  23298.         var d = a.get('blockedUserIdSet');
  23299.         if (d && 0 !== d.size) {
  23300.           var e = this.postsView.posts.models;
  23301.           if (e && 'object' === ('undefined' == typeof e ? 'undefined' : _typeof(e))) {
  23302.             var f = {
  23303.             };
  23304.             b.each(e, function (a) {
  23305.               var b = a.attributes.id,
  23306.               c = a.author.id;
  23307.               if (f[b] = c, a.attributes.parent) {
  23308.                 var e = a.attributes.parent,
  23309.                 g = f[e];
  23310.                 d.has(g) && a.set('hideReplyPreview', !0)
  23311.               }
  23312.             }, this)
  23313.           }
  23314.         }
  23315.       }
  23316.     },
  23317.     initSidebar: function () {
  23318.       this.sidebar = new ga({
  23319.         session: this.session,
  23320.         forum: this.forum,
  23321.         config: this.config
  23322.       })
  23323.     },
  23324.     initNotificationMenu: function () {
  23325.       var a = this.notificationMenu = new ca.NotificationMenuView({
  23326.         el: this.threadView.$el.find('[data-role=notification-menu]') [0],
  23327.         session: this.session,
  23328.         forum: this.forum
  23329.       });
  23330.       a.render()
  23331.     },
  23332.     initUserMenu: function () {
  23333.       var a = this.userMenu = new Fa({
  23334.         el: this.threadView.$el.find('[data-role=logout]') [0],
  23335.         forum: this.forum,
  23336.         session: this.session,
  23337.         thread: this.thread,
  23338.         isInHome: this.isInHome()
  23339.       });
  23340.       a.render()
  23341.     },
  23342.     initThreadShareBar: function () {
  23343.       if (!this.thread.forum.get('settings').disableSocialShare) {
  23344.         var a = this.threadShareBar = new Ga({
  23345.           el: this.threadView.$el.find('#thread-share-bar') [0],
  23346.           model: this.thread
  23347.         });
  23348.         a.render()
  23349.       }
  23350.     },
  23351.     isRealtimeEnabled: function () {
  23352.       var a = u.lounge.REALTIME || {
  23353.       },
  23354.       b = a.THREAD_STALE_DAYS || 7,
  23355.       c = g.unix(this.initialData.lastModified);
  23356.       return !this.thread.get('isClosed') && g().diff(c, 'days') <= b
  23357.     },
  23358.     realtimeHandlers: {
  23359.       Post: function (a) {
  23360.         var b = a.data,
  23361.         c = this.thread;
  23362.         if (!this.thread.get('hasStreaming') || !this.states.streamingPaused) {
  23363.           if (!b.id) return void d.warn('RT: no post ID');
  23364.           if (!b.author || !b.author.id) return void d.warn('RT: no author or author ID');
  23365.           if (!b.author.name) return void d.warn('RT: no author name or email hash');
  23366.           if (!b.author.username) return void d.warn('RT: no author username');
  23367.           if (!b.post || !b.post.message) return void d.warn('RT: no post message');
  23368.           if (c.posts.get(b.id) || c.queue.get(b.id)) return void d.info('RT: duplicate: ', b.id);
  23369.           if ('approved' !== b.type) return void d.info('RT: unapproved: ', b.id);
  23370.           if (b.sb) return void d.info('RT: shadowbanned: ', b.id);
  23371.           if (b.type === b.type_prev) return void d.info('RT: Post change message, ignoring for now ', b.id);
  23372.           this.thread.incrementPostCount(1);
  23373.           var e = b.post.parent_post.id;
  23374.           if ('0' === e && (e = null), e && !c.posts.get(e) && !c.queue.get(e)) return void d.info('RT: parent is not on this page: ', b.id);
  23375.           var f = b.author.name,
  23376.           g = b.author.username,
  23377.           h = b.author.avatar,
  23378.           i = b.author.id,
  23379.           j = b.author.is_private;
  23380.           '0' === i && (i = void 0);
  23381.           var k = new n(v.User, {
  23382.             id: i,
  23383.             name: f,
  23384.             username: g,
  23385.             profileUrl: A.root + '/by/' + g + '/',
  23386.             isAnonymous: !i,
  23387.             isPrivate: j,
  23388.             avatar: {
  23389.               cache: h,
  23390.               permalink: h
  23391.             }
  23392.           });
  23393.           if (k.get('isBlocked')) return void d.info('RT: blocked: ', b.id);
  23394.           c.users.add(k, {
  23395.             merge: !0
  23396.           }),
  23397.           c.queue.add({
  23398.             id: b.id,
  23399.             user: k,
  23400.             parentId: e,
  23401.             message: b.post.message,
  23402.             createdAt: b.date,
  23403.             media: b.post.media
  23404.           })
  23405.         }
  23406.       },
  23407.       Vote: function (a) {
  23408.         var b = a.data;
  23409.         if (b.id && b.vote) {
  23410.           var c = this.thread,
  23411.           e = c.posts.get(b.vote.recipient_post_id);
  23412.           if (e) {
  23413.             d.debug('RT: Vote for post ', e.id);
  23414.             var f = e.votes.get(b.id);
  23415.             f || (d.debug('RT: Creating new vote with id ', b.id), f = new r({
  23416.               id: b.id
  23417.             }), e.votes.add(f));
  23418.             var g = e._vote(b.vote.vote, f.get('score'), b.voter);
  23419.             0 !== g && f.set('score', g)
  23420.           }
  23421.         }
  23422.       },
  23423.       ThreadVote: function (a) {
  23424.         var b = a.data,
  23425.         c = this.thread;
  23426.         if (b.id && b.vote && (!this.session.user.id || b.vote.voter_id !== this.session.user.id)) {
  23427.           var d = c.votes.get(b.id);
  23428.           if (d || (d = new q({
  23429.             id: b.id
  23430.           }), c.votes.add(d)), !d.get('currentUser')) {
  23431.             var e = c._vote(b.vote.vote, d.get('score'));
  23432.             0 !== e && d.set('score', e)
  23433.           }
  23434.         }
  23435.       },
  23436.       typing: function (a) {
  23437.         var c = a.data,
  23438.         d = this.thread,
  23439.         e = c.typing,
  23440.         f = c.post;
  23441.         if (c.thread === d.id && f) {
  23442.           var g = d.posts.get(f);
  23443.           g && (g.usersTyping.count() <= 0 && !e || g.usersTyping.add(v.TypingUser.make(b.extend({
  23444.             client_context: a.lastEventId
  23445.           }, c))))
  23446.         }
  23447.       }
  23448.     },
  23449.     initRealtime: function () {
  23450.       var a = X.Manager;
  23451.       if (!a.pipe && this.isRealtimeEnabled()) {
  23452.         this.initRealtimeIndicators(),
  23453.         a.initialize('thread/' + this.thread.id, this.realtimeHandlers, this);
  23454.         var b = function (a) {
  23455.           return 'POST' === a.method
  23456.         },
  23457.         c = 0;
  23458.         this.listenTo(l, 'call', function (d) {
  23459.           b(d) && (c += 1, a.pause())
  23460.         }),
  23461.         this.listenTo(l, 'complete', function (d) {
  23462.           !b(d) || c <= 0 || (c -= 1, c || a.resume())
  23463.         })
  23464.       }
  23465.     },
  23466.     initTopNavigation: function () {
  23467.       var a = this.topNavigation = new la({
  23468.         inHome: this.isInHome(),
  23469.         thread: this.thread
  23470.       });
  23471.       a.render(),
  23472.       this.threadView.$el.find('#main-nav').append(a.el)
  23473.     },
  23474.     initThreadFooter: function () {
  23475.       var a = this.threadFooter = new ma({
  23476.         forum: this.forum
  23477.       });
  23478.       a.render(),
  23479.       this.threadView.$el.find('#footer').append(a.el)
  23480.     },
  23481.     initSecondaryNavigation: function () {
  23482.       var a,
  23483.       b = this.forum.get('votingType') || s.VOTING_TYPES.DEFAULT_VOTING_TYPE,
  23484.       c = b === s.VOTING_TYPES.DISABLED;
  23485.       this.thread.posts.buffer && (a = this.thread.posts.getOrder());
  23486.       var d = this.secondaryNavigation = new na({
  23487.         inHome: this.isInHome(),
  23488.         order: a,
  23489.         votingDisabled: c,
  23490.         forum: this.thread.forum.id
  23491.       });
  23492.       d.render(),
  23493.       this.threadView.$el.find('#secondary-navigation').append(d.el)
  23494.     },
  23495.     initFavoriteButton: function () {
  23496.       if (this.favoriteButton && this.favoriteButton.remove(), !M.isFeatureActive('sso_less_branding', {
  23497.         forum: this.forum.id
  23498.       })) {
  23499.         var a = this.favoriteButton = new ka({
  23500.           thread: this.thread,
  23501.           session: this.session
  23502.         });
  23503.         this.listenTo(a, {
  23504.           'vote:like': b.bind(this.trigger, this, 'uiAction:threadLike'),
  23505.           'vote:unlike': b.bind(this.trigger, this, 'uiAction:threadUnlike')
  23506.         }),
  23507.         a.render(),
  23508.         this.threadView.$el.find('#favorite-button').append(a.el)
  23509.       }
  23510.     },
  23511.     initThreadSubscribe: function () {
  23512.       this.threadSubscribeButton = new Ca({
  23513.         session: this.session,
  23514.         thread: this.thread,
  23515.         el: this.threadView.$el.find('#thread-subscribe-button') [0]
  23516.       })
  23517.     },
  23518.     initBadgesMessage: function () {
  23519.       this.badgesMessageView = new Y({
  23520.         forum: this.forum,
  23521.         session: this.session,
  23522.         el: this.threadView.$el.find('#badges-message__container') [0]
  23523.       }).render()
  23524.     },
  23525.     initEmailSignup: function () {
  23526.       this.emailSignupForm = new Z({
  23527.         forum: this.forum,
  23528.         session: this.session,
  23529.         el: this.threadView.$el.find('#email-signup') [0]
  23530.       }).render()
  23531.     },
  23532.     updatePostCount: function () {
  23533.       var a = this.thread.get('posts');
  23534.       this.isInHome() || (this.$postCountContainer = this.$postCountContainer || this.threadView.$el.find('li[data-role=post-count]'), this.$postCountContainer.html(va({
  23535.         count: a
  23536.       }))),
  23537.       y.frame.sendHostMessage('posts.count', a)
  23538.     },
  23539.     renderLayout: function () {
  23540.       this.addFeatureDetectionClasses(),
  23541.       V.init(this);
  23542.       var b = a(ra({
  23543.         forum: this.forum.toJSON(),
  23544.         thread: this.thread.toJSON()
  23545.       }));
  23546.       b.appendTo(this.$el),
  23547.       this.postsView.renderLayout(),
  23548.       u.readonly ? this.alert(za('The Disqus comment system is temporarily in maintenance mode. You can still read comments during this time, however posting comments and other actions are temporarily delayed.'), {
  23549.         type: 'info'
  23550.       }) : this.listenToOnce(this.session, 'change:id', this.showPremoderationAlert)
  23551.     },
  23552.     showPremoderationAlert: function () {
  23553.       this.thread.isModerator(this.session.user) && !this.getAlert() && (this.forum.get('settings').validateAllPosts ? this.alert(b.escape(za('Comments on this entire site are premoderated (only moderators can see this message).')) + (' <a href="' + b.escape('https://' + this.forum.id + '.disqus.com/admin/settings/community/') + '" target="_blank" rel="noopener noreferrer">' + b.escape(za('Change site settings.')) + '</a>'), {
  23554.         safe: !0,
  23555.         isPremoderateStatus: !0
  23556.       }) : this.thread.get('validateAllPosts') && this.alert(za('Comments on this thread are premoderated (only moderators can see this message).'), {
  23557.         isPremoderateStatus: !0
  23558.       }))
  23559.     },
  23560.     dismissPremoderationAlert: function () {
  23561.       this.dismissAlert(function (a) {
  23562.         return a.options && a.options.isPremoderateStatus
  23563.       })
  23564.     },
  23565.     addFeatureDetectionClasses: function () {
  23566.       var b = a(ya.documentElement);
  23567.       (this.config.forceMobile || F.isMobileUserAgent()) && b.addClass('mobile'),
  23568.       F.isMobileUserAgent() || b.addClass('use-opacity-transitions'),
  23569.       M.isFeatureActive('embed_refresh', {
  23570.         forum: this.forum.id
  23571.       }) && (b.addClass('embed-refresh'), M.isFeatureActive('embed_refresh_v2', {
  23572.         forum: this.forum.id
  23573.       }) && b.addClass('embed-refresh-v2'))
  23574.     },
  23575.     initMainPostBox: function () {
  23576.       if (this.form && (this.form.remove(), this.form = null), this.thread.get('isClosed')) return this.threadView.$el.find('#secondary-navigation').addClass('no-postbox'),
  23577.       void this.showClosedAlert();
  23578.       if (!this.session.get('canReply')) return this.threadView.$el.find('#secondary-navigation').addClass('no-postbox'),
  23579.       void this.session.once('change:id', this.initMainPostBox, this);
  23580.       this.threadView.$el.find('#secondary-navigation').removeClass('no-postbox');
  23581.       var a = this.form = new $({
  23582.         thread: this.thread,
  23583.         userSuggestions: this.userSuggestions,
  23584.         session: this.session
  23585.       });
  23586.       a.render(),
  23587.       this.threadView.$el.find('#form').prepend(a.$el),
  23588.       a.resize()
  23589.     },
  23590.     showClosedAlert: function () {
  23591.       if (this.thread.get('isClosed')) {
  23592.         var a = this.thread.get('reactions');
  23593.         a ? (this.listenToOnce(a, 'sync change:enabled', this.showClosedAlert), this.alert(za(a.enabled ? 'Comments and reactions for this thread are now closed.' : 'Comments for this thread are now closed'))) : (this.listenToOnce(this.thread, 'change:reactions', this.showClosedAlert), this.alert(za('Comments for this thread are now closed')))
  23594.       }
  23595.     },
  23596.     initTermsOfService: function () {
  23597.       if (this.tos && (this.tos.remove(), this.tos = null), this.listenToOnce(this.session, 'change:id', this.initTermsOfService), !(this.session.user.isAnonymous() || this.session.user.get('hasAcceptedGdprTerms') || !this.config.isPrivate && this.session.isSSO() || u.tos_exempt_forums_shortnames.includes(this.forum.id))) {
  23598.         var a = this.tos = new Ha({
  23599.           isPrivate: this.config.isPrivate,
  23600.           session: this.session
  23601.         });
  23602.         a.render(),
  23603.         this.threadView.$el.find('#tos__container').prepend(a.$el)
  23604.       }
  23605.     },
  23606.     initUserSuggestionsManager: function () {
  23607.       this.userSuggestions = new fa({
  23608.         threadId: this.thread.id
  23609.       }),
  23610.       this.userSuggestions.addRemote(this.thread.users),
  23611.       this.listenTo(this.session, 'change:id', function () {
  23612.         this.session.isLoggedIn() && (this.session.user.getFollowing(), this.session.user.following.PER_PAGE = 100, this.userSuggestions.addRemote(this.session.user.following))
  23613.       })
  23614.     },
  23615.     handleShowProfile: function (b) {
  23616.       if (!(b.ctrlKey || b.metaKey || b.shiftKey || b.altKey || !this.isInHome() && !this.sidebar)) {
  23617.         b.preventDefault();
  23618.         var c = a(b.currentTarget).attr('data-username'),
  23619.         d = a(b.currentTarget).attr('data-tab') || '';
  23620.         this.isInHome() ? y.frame.sendHostMessage('home.open', T.apps.home + 'by/' + c + '/' + d) : this.showProfileSidebar(c, d)
  23621.       }
  23622.     },
  23623.     handleShowCommunitySidebar: function (b) {
  23624.       if (!F.willOpenNewWindow(b)) {
  23625.         b.preventDefault();
  23626.         var c = a(b.currentTarget).attr('data-forum');
  23627.         y.trigger('sidebar:open', 'home/forums/' + c + '/')
  23628.       }
  23629.     },
  23630.     handleSort: Aa(function (b) {
  23631.       var c = a(b.currentTarget).attr('data-sort'),
  23632.       d = this.forum.get('votingType') === s.VOTING_TYPES.DISABLED;
  23633.       'popular' === c && d && (c = 'desc'),
  23634.       this.$el.find('[data-role="post-sort"]').replaceWith(wa({
  23635.         order: c,
  23636.         votingDisabled: d,
  23637.         forum: this.thread.forum.id
  23638.       })),
  23639.       this.thread.posts.setOrder(c),
  23640.       this.thread.posts.fetch({
  23641.         reset: !0
  23642.       }),
  23643.       y.frame.sendHostMessage('change:sort', c),
  23644.       this.inthreadAdApps = [
  23645.       ],
  23646.       this.postsView.handleSort()
  23647.     }),
  23648.     toggleThread: Aa(function () {
  23649.       var a = this.thread.get('isClosed'),
  23650.       c = za(a ? 'An error occurred while opening the thread. Please try again.' : 'An error occurred while closing the thread. Please try again.'),
  23651.       d = {
  23652.         success: function () {
  23653.           window.location.reload(!0)
  23654.         },
  23655.         error: b.bind(this.alert, this, c, {
  23656.           type: 'error'
  23657.         })
  23658.       };
  23659.       a ? this.thread.open(d) : this.thread.close(d)
  23660.     }),
  23661.     toggleThreadPremoderate: Aa(function () {
  23662.       var a = this;
  23663.       this.dismissAlert(function (a) {
  23664.         return a.options && a.options.isPremoderateError
  23665.       });
  23666.       var b = this.thread.get('validateAllPosts');
  23667.       this.thread.premoderate(!b).then(function () {
  23668.         b ? a.dismissPremoderationAlert() : a.showPremoderationAlert()
  23669.       }, function () {
  23670.         a.alert(za('An error occurred while updating the thread. Please try again.'), {
  23671.           type: 'error',
  23672.           isPremoderateError: !0
  23673.         }),
  23674.         a.thread.set('validateAllPosts', b)
  23675.       }),
  23676.       y.trigger('uiAction:clickThreadPremoderate')
  23677.     }),
  23678.     toggleThreadRatingsEnabled: Aa(function () {
  23679.       var a = this;
  23680.       I.isForumModelRatingsEnabled(this.forum) && this.thread.toggleRatingsEnabled().then(function () {
  23681.         I.isThreadModelRatingsEnabled(a.thread) && (a.session.fetchThreadDetails({
  23682.           thread: a.thread
  23683.         }), a.thread.fetchRatings())
  23684.       })
  23685.     }),
  23686.     createDeferredViewsForImages: function () {
  23687.       a('img[data-src]').each(function (b, c) {
  23688.         var d = a(c),
  23689.         e = new Da({
  23690.           el: c,
  23691.           url: d.attr('data-src')
  23692.         });
  23693.         e.relatedPost = d.attr('data-post'),
  23694.         d.removeAttr('data-src')
  23695.       })
  23696.     },
  23697.     getPosition: function () {
  23698.       return this.position
  23699.     },
  23700.     showProfileSidebar: function (a, b) {
  23701.       y.trigger('sidebar:open', 'by/' + a + '/' + b)
  23702.     },
  23703.     initResizeHandler: function () {
  23704.       var a,
  23705.       b = this;
  23706.       if (window.MutationObserver) new window.MutationObserver(function () {
  23707.         a || (a = window.requestAnimationFrame(function () {
  23708.           a = null,
  23709.           b.resize()
  23710.         }))
  23711.       }).observe(ya.body, {
  23712.         attributes: !0,
  23713.         characterData: !0,
  23714.         childList: !0,
  23715.         subtree: !0,
  23716.         attributeFilter: [
  23717.           'class',
  23718.           'style'
  23719.         ]
  23720.       });
  23721.        else {
  23722.         var c = function d() {
  23723.           b.resize(),
  23724.           window.requestAnimationFrame(d)
  23725.         };
  23726.         window.requestAnimationFrame(c)
  23727.       }
  23728.     },
  23729.     resize: function () {
  23730.       var a = x.getPageHeight();
  23731.       this._lastHeight !== a && (this._lastHeight = a, this.trigger('domReflow'), y.frame.sendHostMessage('resize', {
  23732.         height: a
  23733.       }))
  23734.     },
  23735.     handleAuth: Aa(function (a) {
  23736.       this.session.authenticate(x.extractService(a.target, 'auth'))
  23737.     }),
  23738.     handleLogout: Aa(function () {
  23739.       this.session.logout()
  23740.     }),
  23741.     audienceSync: Aa(function () {
  23742.       this.session.audienceSync()
  23743.     }),
  23744.     toggleMedia: Aa(function () {
  23745.       var a = aa.settings,
  23746.       b = !a.get('collapsed');
  23747.       a.set('collapsed', b)
  23748.     }),
  23749.     toggleReactions: Aa(function () {
  23750.       this.thread.get('reactions').toggleEnabled()
  23751.     }),
  23752.     toggleEmbedRefresh: Aa(function () {
  23753.       null === K.get('switch:embed_refresh') || K.get('switch:embed_refresh') === !0 ? (K.set('switch:embed_refresh', !1), y.trigger('uiAction:toggleClassicDisqus', !0)) : (K.remove('switch:embed_refresh'), y.trigger('uiAction:toggleClassicDisqus', !1)),
  23754.       y.frame.sendHostMessage('reset', {
  23755.         reload: !0
  23756.       })
  23757.     }),
  23758.     initTopics: function () {
  23759.       var a = this;
  23760.       if ('browsingTopics' in ya && ya.featurePolicy && ya.featurePolicy.allowsFeature && ya.featurePolicy.allowsFeature('browsing-topics')) try {
  23761.         ya.browsingTopics().then(function (b) {
  23762.           a.meta.topics = b
  23763.         })
  23764.       } catch (b) {
  23765.       }
  23766.     }
  23767.   });
  23768.   return b.extend(Ka.prototype, W.ShareMixin),
  23769.   p.call(Ka.prototype),
  23770.   x.mixin(Ka, C.UiActionEventProxy),
  23771.   o.call(Ka.prototype),
  23772.   x.mixin(Ka, C.ProfileHtmlHelpers),
  23773.   Q.call(Ka.prototype),
  23774.   {
  23775.     Lounge: Ka,
  23776.     UserMenuView: Fa,
  23777.     ThreadSubscribeButton: Ca,
  23778.     RatingsView: ha,
  23779.     ReactionsView: ia,
  23780.     BehindClickView: Ia,
  23781.     ThreadView: Ja,
  23782.     DeferredMediaView: Da,
  23783.     DebugInfoView: Ea
  23784.   }
  23785. }),
  23786. define('lounge/main', [
  23787.   'jquery',
  23788.   'core/utils/getEmbeddedData',
  23789.   'lounge/tracking',
  23790.   'lounge/views'
  23791. ], function (a, b, c, d) {
  23792.   'use strict';
  23793.   return {
  23794.     init: function () {
  23795.       var e = b('threadData');
  23796.       if (!e) return {
  23797.         code: 'no_thread_data'
  23798.       };
  23799.       if (e.code) return 2 === e.code ? 'Endpoint resource not valid.' === e.response && (e.code = 'invalid_endpoint_resource') : 15 === e.code && 'Thread creations from embed disabled.' === e.response && (e.code = 'thread_creations_disabled'),
  23800.       e;
  23801.       a.extend(e.response, b('forumData')),
  23802.       a('#postCompatContainer').remove();
  23803.       var f = new d.Lounge({
  23804.         jsonData: e,
  23805.         el: window.document.body
  23806.       });
  23807.       c.init(f)
  23808.     }
  23809.   }
  23810. }),
  23811. define('lounge.bundle', function () {
  23812. });
  23813.