1
0
Fork 0
mirror of https://github.com/FrankerFaceZ/FrankerFaceZ.git synced 2025-06-28 05:15:54 +00:00
FrankerFaceZ/script.min.js
2015-08-09 23:35:19 -07:00

9 lines
No EOL
246 KiB
JavaScript
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

!function(t){!function e(t,s,n){function i(a,r){if(!s[a]){if(!t[a]){var d="function"==typeof require&&require;if(!r&&d)return d(a,!0);if(o)return o(a,!0);throw new Error("Cannot find module '"+a+"'")}var u=s[a]={exports:{}};t[a][0].call(u.exports,function(e){var s=t[a][1][e];return i(s?s:e)},u,u.exports,e,t,s,n)}return s[a].exports}for(var o="function"==typeof require&&require,a=0;a<n.length;a++)i(n[a]);return i}({1:[function(e,s,n){var i=i||function(t){"use strict";if("undefined"==typeof navigator||!/MSIE [1-9]\./.test(navigator.userAgent)){var e=t.document,s=function(){return t.URL||t.webkitURL||t},n=e.createElementNS("http://www.w3.org/1999/xhtml","a"),i="download"in n,o=function(t){var e=new MouseEvent("click");t.dispatchEvent(e)},a=t.webkitRequestFileSystem,r=t.requestFileSystem||a||t.mozRequestFileSystem,d=function(e){(t.setImmediate||t.setTimeout)(function(){throw e},0)},u="application/octet-stream",c=0,l=500,h=function(e){var n=function(){"string"==typeof e?s().revokeObjectURL(e):e.remove()};t.chrome?n():setTimeout(n,l)},f=function(t,e,s){e=[].concat(e);for(var n=e.length;n--;){var i=t["on"+e[n]];if("function"==typeof i)try{i.call(t,s||t)}catch(o){d(o)}}},m=function(t){return/^\s*(?:text\/\S*|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(t.type)?new Blob(["\ufeff",t],{type:t.type}):t},_=function(e,d,l){l||(e=m(e));var _,p,g,v=this,b=e.type,y=!1,w=function(){f(v,"writestart progress write writeend".split(" "))},z=function(){if((y||!_)&&(_=s().createObjectURL(e)),p)p.location.href=_;else{var n=t.open(_,"_blank");void 0==n&&"undefined"!=typeof safari&&(t.location.href=_)}v.readyState=v.DONE,w(),h(_)},k=function(t){return function(){return v.readyState!==v.DONE?t.apply(this,arguments):void 0}},C={create:!0,exclusive:!1};return v.readyState=v.INIT,d||(d="download"),i?(_=s().createObjectURL(e),n.href=_,n.download=d,void setTimeout(function(){o(n),w(),h(_),v.readyState=v.DONE})):(t.chrome&&b&&b!==u&&(g=e.slice||e.webkitSlice,e=g.call(e,0,e.size,u),y=!0),a&&"download"!==d&&(d+=".download"),(b===u||a)&&(p=t),r?(c+=e.size,void r(t.TEMPORARY,c,k(function(t){t.root.getDirectory("saved",C,k(function(t){var s=function(){t.getFile(d,C,k(function(t){t.createWriter(k(function(s){s.onwriteend=function(e){p.location.href=t.toURL(),v.readyState=v.DONE,f(v,"writeend",e),h(t)},s.onerror=function(){var t=s.error;t.code!==t.ABORT_ERR&&z()},"writestart progress write abort".split(" ").forEach(function(t){s["on"+t]=v["on"+t]}),s.write(e),v.abort=function(){s.abort(),v.readyState=v.DONE},v.readyState=v.WRITING}),z)}),z)};t.getFile(d,{create:!1},k(function(t){t.remove(),s()}),k(function(t){t.code===t.NOT_FOUND_ERR?s():z()}))}),z)}),z)):void z())},p=_.prototype,g=function(t,e,s){return new _(t,e,s)};return"undefined"!=typeof navigator&&navigator.msSaveOrOpenBlob?function(t,e,s){return s||(t=m(t)),navigator.msSaveOrOpenBlob(t,e||"download")}:(p.abort=function(){var t=this;t.readyState=t.DONE,f(t,"abort")},p.readyState=p.INIT=0,p.WRITING=1,p.DONE=2,p.error=p.onwritestart=p.onprogress=p.onwrite=p.onabort=p.onerror=p.onwriteend=null,g)}}("undefined"!=typeof self&&self||"undefined"!=typeof t&&t||this.content);"undefined"!=typeof s&&s.exports?s.exports.saveAs=i:"undefined"!=typeof define&&null!==define&&null!=define.amd&&define([],function(){return i})},{}],2:[function(e,s,n){var i=t.FrankerFaceZ,o=e("./constants"),a=e("./utils");i.settings_info.show_badges={type:"boolean",value:!0,category:"Chat Appearance",name:"Additional Badges",help:"Show additional badges for bots, FrankerFaceZ donors, and other special users."},i.settings_info.transparent_badges={type:"boolean",value:!1,category:"Chat Appearance",no_bttv:!0,name:"Transparent Badges",help:"Make chat badges transparent for a nice, clean look. On light chat, non-subscriber badges are inverted to remain visible.",on_update:function(t){this.has_bttv||document.body.classList.toggle("ffz-transparent-badges",t)}},i.prototype.setup_badges=function(){this.has_bttv||document.body.classList.toggle("ffz-transparent-badges",this.settings.transparent_badges),this.log("Preparing badge system."),this.badges={},this.log("Creating badge style element.");var t=this._badge_style=document.createElement("style");t.id="ffz-badge-css",document.head.appendChild(t),this.log("Adding legacy donor badges."),this._legacy_add_donors()},i.ws_commands.reload_badges=function(){this._legacy_load_bots(),this._legacy_load_donors()},i.ws_commands.set_badge=function(t){var e=t[0],s=t[1],n=t[2],i=this.users[e]=this.users[e]||{},o=i.badges=i.badges||{};void 0===n||null===n?delete o[s]:o[s]=n};var r=function(t){var e=".badges .ffz-badge-"+t.id+" { background-color: "+t.color+'; background-image: url("'+t.image+'"); '+(t.extra_css||"")+"}";return t.transparent_image&&(e+=".ffz-transparent-badges .badges .ffz-badge-"+t.id+' { background-image: url("'+t.transparent_image+'"); }'),e};i.prototype.bttv_badges=function(t){if(this.settings.show_badges){var e=t.sender,s=this.users[e],n=[],i=-1,o=BetterTTV.settings.get("alphaTags");if(s&&s.badges){t.badges||(t.badges=[]);for(var a=0;a<t.badges.length;a++){var r=t.badges[a];if("subscriber"==r.type||"turbo"==r.type){i=a;break}}for(var d in s.badges)if(s.badges.hasOwnProperty(d)){var r=s.badges[d],u=this.badges[r.id]||{},c=r.title||u.title,l="";if(void 0!==u.visible){var h=u.visible;if("function"==typeof h&&(h=h.bind(this)(null,e)),!h)continue}if(u.replaces){for(var f=!1,a=0;a<t.badges.length;a++){var m=t.badges[a];if(m.type===u.replaces_type){m.type="ffz-badge-replacement "+m.type,m.description+=", "+(r.title||u.title)+'" style="background-image: url(&quot;'+(r.image||u.image)+"&quot;)",f=!0;break}}if(f)continue}r.image&&(l+="background-image: url(&quot;"+r.image+"&quot;); "),r.color&&!o&&(l+="background-color: "+r.color+"; "),r.extra_css&&(l+=r.extra_css),l&&(c+='" style="'+l),n.push([(-1==i?1:-1)*d,{type:"ffz-badge-"+r.id+(o?" alpha":""),name:"",description:c}])}if(n.sort(function(t,e){return t[0]-e[0]}),-1==i)for(;n.length;)t.badges.push(n.shift()[1]);else for(;n.length;)t.badges.insertAt(i,n.shift()[1])}}},i.prototype.render_badges=function(t,e){if(!this.settings.show_badges)return e;var s=t.get("msgObject.from"),n=t.get("msgObject.room")||App.__container__.lookup("controller:chat").get("currentRoom.id"),i=this.users[s];if(!i||!i.badges)return e;for(var o in i.badges)if(i.badges.hasOwnProperty(o)){var a=i.badges[o],r=this.badges[a.id]||{},d=e[o];if(void 0!==r.visible){var u=r.visible;if("function"==typeof u&&(u=u.bind(this)(n,s,t,e)),!u)continue}if(d){var c=a.hasOwnProperty("replaces")?a.replaces:r.replaces;if(!c)continue;d.image=a.image||r.image,d.klass+=" ffz-badge-replacement",d.title+=", "+(a.title||r.title)}else e[o]={klass:"ffz-badge-"+a.id,title:a.title||r.title,image:a.image,color:a.color,extra_css:a.extra_css}}return e},i.prototype.render_badge=function(t){if(this.settings.show_badges){var e=t.get("msgObject.from"),s=App.__container__.lookup("controller:chat").get("currentRoom.id"),n=t.$(".badges"),i=this.users[e];if(i&&i.badges){if(!n.length){var o=document.createElement("span"),a=t.$(".from");if(o.className="badges float-left",!a)return;a.before(o),n=$(o)}var r=n.find(".badge").filter(function(t){var e=this.title.toLowerCase();return"subscriber"==e||"turbo"==e}).first(),d=[],u=!!r.length;for(var c in i.badges)if(i.badges.hasOwnProperty(c)){var l=i.badges[c],h=this.badges[l.id]||{};if(void 0!==h.visible){var f=h.visible;if("function"==typeof f&&(f=f.bind(this)(s,e)),!f)continue}if(h.replaces){var m=n[0].querySelector(".badge."+h.replaces);if(m){m.style.backgroundImage='url("'+(l.image||h.image)+'")',m.classList.add("ffz-badge-replacement"),m.title+=", "+(l.title||h.title);continue}}var m=document.createElement("div");m.className="badge float-left tooltip ffz-badge-"+l.id,m.setAttribute("title",l.title||h.title),l.image&&(m.style.backgroundImage='url("'+l.image+'")'),l.color&&(m.style.backgroundColor=l.color),l.extra_css&&(m.style.cssText+=l.extra_css),d.push([(u?1:-1)*c,m])}if(d.sort(function(t,e){return t[0]-e[0]}),u)for(;d.length;)r.before(d.shift()[1]);else for(;d.length;)n.append(d.shift()[1])}}},i.bttv_known_bots=["nightbot","moobot","sourbot","xanbot","manabot","mtgbot","ackbot","baconrobot","tardisbot","deejbot","valuebot","stahpbot"],i.prototype._legacy_add_donors=function(){this.badges[0]={id:0,title:"FFZ Developer",color:"#FAAF19",image:"//cdn.frankerfacez.com/script/devicon.png",transparent_image:"//cdn.frankerfacez.com/script/devtransicon.png"},a.update_css(this._badge_style,0,r(this.badges[0])),this.badges[1]={id:1,title:"FFZ Donor",color:"#755000",image:"//cdn.frankerfacez.com/script/devicon.png"},a.update_css(this._badge_style,1,r(this.badges[1])),this.badges[2]={id:2,title:"Bot",color:"#595959",image:"//cdn.frankerfacez.com/script/boticon.png",replaces:!0,replaces_type:"moderator",visible:function(t,e){return!(this.has_bttv&&-1!==i.bttv_known_bots.indexOf(e))}},a.update_css(this._badge_style,2,r(this.badges[2]));for(var t=0;t<i.bttv_known_bots.length;t++){var e=i.bttv_known_bots[t],s=this.users[e]=this.users[e]||{},n=s.badges=s.badges||{};n[0]||(n[0]={id:2})}this.users.sirstendec={badges:{1:{id:0}},sets:[4330]},this.users.zenwan={badges:{0:{id:2,image:"//cdn.frankerfacez.com/script/momiglee_badge.png",title:"WAN"}}},this._legacy_load_bots(),this._legacy_load_donors()},i.prototype._legacy_load_bots=function(t){jQuery.ajax(o.SERVER+"script/bots.txt",{cache:!1,context:this}).done(function(t){this._legacy_parse_badges(t,0,2,"Bot (By: {})")}).fail(function(e){404!=e.status&&(t=(t||0)+1,10>t&&this._legacy_load_bots(t))})},i.prototype._legacy_load_donors=function(t){jQuery.ajax(o.SERVER+"script/donors.txt",{cache:!1,context:this}).done(function(t){this._legacy_parse_badges(t,1,1)}).fail(function(e){return 404!=e.status?(t=(t||0)+1,10>t?this._legacy_load_donors(t):void 0):void 0})},i.prototype._legacy_parse_badges=function(t,e,s,n){var i=this.badges[s].title,o=0;if(ds=null,n=n||"{}",null!=t)for(var r=t.trim().split(/\W+/),d=0;d<r.length;d++){var u=r[d].split(";"),c=u[0],l=this.users[c]=this.users[c]||{},h=l.badges=l.badges||{},f=l.sets=l.sets||[];null!==ds&&-1===f.indexOf(ds)&&f.push(ds),h[e]||(h[e]={id:s},u.length>1&&(h[e].title=n.replace("{}",u[1])),o+=1)}this.log('Added "'+i+'" badge to '+a.number_commas(o)+" users.")}},{"./constants":5,"./utils":35}],3:[function(e,s,n){var i=t.FrankerFaceZ,o=function(t,e,s){return 0>s&&(s+=1),s>1&&(s-=1),1/6>s?t+6*(e-t)*s:.5>s?e:2/3>s?t+(e-t)*(2/3-s)*6:t};i.settings_info.fix_color={type:"select",options:{"-1":"Disabled",0:"Default Colors",1:"Luv Adjustment",2:"HSL Adjustment (Depreciated)",3:"HSV Adjustment (Depreciated)",4:"RGB Adjustment (Depreciated)"},value:"1",category:"Chat Appearance",no_bttv:!0,name:"Username Colors - Brightness",help:"Ensure that username colors contrast with the background enough to be readable.",process_value:function(t){return t===!1?"0":t===!0?"1":t},on_update:function(t){document.body.classList.toggle("ffz-chat-colors-gray",!this.has_bttv&&"-1"===t),this.has_bttv||"-1"===t||this._rebuild_colors()}},i.settings_info.luv_contrast={type:"button",value:4.5,category:"Chat Appearance",no_bttv:!0,name:"Username Colors - Luv Minimum Contrast",help:"Set the minimum contrast ratio used by Luv Adjustment to ensure colors are readable.",method:function(){var t=this.settings.luv_contrast,e=prompt("Luv Adjustment Minimum Contrast Ratio\n\nPlease enter a new value for the minimum contrast ratio required between username colors and the background. The default is: 4.5",t);if(null!==e&&void 0!==e){var s=parseFloat(e);(s===0/0||1>s)&&(s=4.5),this.settings.set("luv_contrast",s)}},on_update:function(t){this._rebuild_contrast(),this.has_bttv||"1"!=this.settings.fix_color||this._rebuild_colors()}},i.settings_info.color_blind={type:"select",options:{0:"Disabled",protanope:"Protanope",deuteranope:"Deuteranope",tritanope:"Tritanope"},value:"0",category:"Chat Appearance",no_bttv:!0,name:"Username Colors - Color Blindness",help:"Adjust username colors in an attempt to make them more distinct for people with color blindness.",on_update:function(t){this.has_bttv||"-1"===this.settings.fix_color||this._rebuild_colors()}},i.prototype.setup_colors=function(){this._colors={},this._rebuild_contrast(),this._update_colors();var e=t.App&&App.__container__.lookup("controller:layout"),s=t.App&&App.__container__.lookup("controller:settings");e&&e.addObserver("isTheatreMode",this._update_colors.bind(this,!0)),s&&s.addObserver("model.darkMode",this._update_colors.bind(this,!0)),this._color_old_darkness=e&&e.get("isTheatreMode")||s&&s.get("model.darkMode")},i.Color={},i.Color.CVDMatrix={protanope:[0,2.02344,-2.52581,0,1,0,0,0,1],deuteranope:[1,0,0,.494207,0,1.24827,0,0,1],tritanope:[1,0,0,0,1,0,-.395913,.801109,0]};var a=i.Color.RGB=function(t,e,s){this.r=t||0,this.g=e||0,this.b=s||0},r=i.Color.HSV=function(t,e,s){this.h=t||0,this.s=e||0,this.v=s||0},d=i.Color.HSL=function(t,e,s){this.h=t||0,this.s=e||0,this.l=s||0},u=i.Color.XYZ=function(t,e,s){this.x=t||0,this.y=e||0,this.z=s||0},c=i.Color.LUV=function(t,e,s){this.l=t||0,this.u=e||0,this.v=s||0};a.prototype.eq=function(t){return t.r===this.r&&t.g===this.g&&t.b===this.b},a.fromHex=function(t){var e=parseInt("#"===t.charAt(0)?t.substr(1):t,16);return new a(e>>16,e>>8&255,255&e)},a.fromHSV=function(t,e,s){var n,i,o,r=Math.floor(6*t),d=6*t-r,u=s*(1-e),c=s*(1-d*e),l=s*(1-(1-d)*e);switch(r%6){case 0:n=s,i=l,o=u;break;case 1:n=c,i=s,o=u;break;case 2:n=u,i=s,o=l;break;case 3:n=u,i=c,o=s;break;case 4:n=l,i=u,o=s;break;case 5:n=s,i=u,o=c}return new a(Math.round(Math.min(Math.max(0,255*n),255)),Math.round(Math.min(Math.max(0,255*i),255)),Math.round(Math.min(Math.max(0,255*o),255)))},a.fromXYZ=function(t,e,s){var n=3.240479*t-1.53715*e-.498535*s,i=-.969256*t+1.875992*e+.041556*s,o=.055648*t-.204043*e+1.057311*s;return new a(Math.max(0,Math.min(255,255*u.channelConverter(n))),Math.max(0,Math.min(255,255*u.channelConverter(i))),Math.max(0,Math.min(255,255*u.channelConverter(o))))},a.fromHSL=function(t,e,s){if(0===e){var n=Math.round(Math.min(Math.max(0,255*s),255));return new a(n,n,n)}var i=.5>s?s*(1+e):s+e-s*e,r=2*s-i;return new a(Math.round(Math.min(Math.max(0,255*o(r,i,t+1/3)),255)),Math.round(Math.min(Math.max(0,255*o(r,i,t)),255)),Math.round(Math.min(Math.max(0,255*o(r,i,t-1/3)),255)))},a.prototype.toHSV=function(){return r.fromRGB(this.r,this.g,this.b)},a.prototype.toHSL=function(){return d.fromRGB(this.r,this.g,this.b)},a.prototype.toCSS=function(){return"rgb("+Math.round(this.r)+","+Math.round(this.g)+","+Math.round(this.b)+")"},a.prototype.toXYZ=function(){return u.fromRGB(this.r,this.g,this.b)},a.prototype.toLUV=function(){return this.toXYZ().toLUV()},a.prototype.toHex=function(){var t=this.b|this.g<<8|this.r<<16;return"#"+(16777216+t).toString(16).slice(1)},a.prototype.luminance=function(){for(var t=[this.r/255,this.g/255,this.b/255],e=0,s=t.length;s>e;e++)t[e]=t[e]<=.03928?t[e]/12.92:Math.pow((t[e]+.055)/1.055,2.4);return.2126*t[0]+.7152*t[1]+.0722*t[2]},a.prototype.brighten=function(t){return t="number"==typeof t?t:1,t=Math.round(255*(t/100)),new a(Math.max(0,Math.min(255,this.r+t)),Math.max(0,Math.min(255,this.g+t)),Math.max(0,Math.min(255,this.b+t)))},a.prototype.daltonize=function(t,e){e="number"==typeof e?e:1;var s;if("string"==typeof t){if(!i.Color.CVDMatrix.hasOwnProperty(t))throw"Invalid CVD matrix.";s=i.Color.CVDMatrix[t]}else s=t;var n,o,r,d,u,c,l,h,f,m,_,p,g=s[0],v=s[1],b=s[2],y=s[3],w=s[4],z=s[5],k=s[6],C=s[7],E=s[8];return n=17.8824*this.r+43.5161*this.g+4.11935*this.b,o=3.45565*this.r+27.1554*this.g+3.86714*this.b,r=.0299566*this.r+.184309*this.g+1.46709*this.b,d=g*n+v*o+b*r,u=y*n+w*o+z*r,c=k*n+C*o+E*r,l=.0809444479*d+-.130504409*u+.116721066*c,h=-.0102485335*d+.0540193266*u+-.113614708*c,f=-.000365296938*d+-.00412161469*u+.693511405*c,l=this.r-l,h=this.g-h,f=this.b-f,m=0*l+0*h+0*f,_=.7*l+1*h+0*f,p=.7*l+0*h+1*f,l=Math.min(Math.max(0,m+this.r),255),h=Math.min(Math.max(0,_+this.g),255),f=Math.min(Math.max(0,p+this.b),255),new a(l,h,f)},a.prototype._r=function(t){return new a(t,this.g,this.b)},a.prototype._g=function(t){return new a(this.r,t,this.b)},a.prototype._b=function(t){return new a(this.r,this.g,t)},d.prototype.eq=function(t){return t.h===this.h&&t.s===this.s&&t.l===this.l},d.fromRGB=function(t,e,s){t/=255,e/=255,s/=255;var n,i,o=Math.max(t,e,s),a=Math.min(t,e,s),r=Math.min(Math.max(0,(o+a)/2),1),u=Math.min(Math.max(0,o-a),1);if(0===u)n=i=0;else{switch(i=r>.5?u/(2-o-a):u/(o+a),o){case t:n=(e-s)/u+(s>e?6:0);break;case e:n=(s-t)/u+2;break;case s:n=(t-e)/u+4}n/=6}return new d(n,i,r)},d.prototype.toRGB=function(){return a.fromHSL(this.h,this.s,this.l)},d.prototype.toCSS=function(){return"hsl("+Math.round(360*this.h)+","+Math.round(100*this.s)+"%,"+Math.round(100*this.l)+"%)"},d.prototype.toHex=function(){return a.fromHSL(this.h,this.s,this.l).toHex()},d.prototype.toHSV=function(){return a.fromHSL(this.h,this.s,this.l).toHSV()},d.prototype.toXYZ=function(){return a.fromHSL(this.h,this.s,this.l).toXYZ()},d.prototype.toLUV=function(){return a.fromHSL(this.h,this.s,this.l).toLUV()},d.prototype._h=function(t){return new d(t,this.s,this.l)},d.prototype._s=function(t){return new d(this.h,t,this.l)},d.prototype._l=function(t){return new d(this.h,this.s,t)},r.prototype.eq=function(t){return t.h===this.h&&t.s===this.s&&t.v===this.v},r.fromRGB=function(t,e,s){t/=255,e/=255,s/=255;var n,i=Math.max(t,e,s),o=Math.min(t,e,s),a=Math.min(Math.max(0,i-o),1),d=0===i?0:a/i,u=i;if(0===a)n=0;else{switch(i){case t:n=(e-s)/a+(s>e?6:0);break;case e:n=(s-t)/a+2;break;case s:n=(t-e)/a+4}n/=6}return new r(n,d,u)},r.prototype.toRGB=function(){return a.fromHSV(this.h,this.s,this.v)},r.prototype.toHSL=function(){return a.fromHSV(this.h,this.s,this.v).toHSL()},r.prototype.toXYZ=function(){return a.fromHSV(this.h,this.s,this.v).toXYZ()},r.prototype.toLUV=function(){return a.fromHSV(this.h,this.s,this.v).toLUV()},r.prototype._h=function(t){return new r(t,this.s,this.v)},r.prototype._s=function(t){return new r(this.h,t,this.v)},r.prototype._v=function(t){return new r(this.h,this.s,t)},a.channelConverter=function(t){return Math.pow(t,2.2)},u.channelConverter=function(t){return Math.pow(t,1/2.2)},u.prototype.eq=function(t){return t.x===this.x&&t.y===this.y&&t.z===this.z},u.fromRGB=function(t,e,s){var n=a.channelConverter(t/255),i=a.channelConverter(e/255),o=a.channelConverter(s/255);return new u(.412453*n+.35758*i+.180423*o,.212671*n+.71516*i+.072169*o,.019334*n+.119193*i+.950227*o)},u.fromLUV=function(t,e,s){var n=1/(u.WHITE.x+15*u.WHITE.y+3*u.WHITE.z),i=4*u.WHITE.x*n,o=9*u.WHITE.y*n,a=t>8?Math.pow((t+16)/116,3):t/u.KAPPA,r=1/3*(52*t/(e+13*t*i)-1),d=-5*a,c=-1/3,l=a*(39*t/(s+13*t*o)-5),h=(l-d)/(r-c),f=h*r+d;return new u(h,a,f)},u.prototype.toRGB=function(){return a.fromXYZ(this.x,this.y,this.z)},u.prototype.toLUV=function(){return c.fromXYZ(this.x,this.y,this.z)},u.prototype.toHSL=function(){return a.fromXYZ(this.x,this.y,this.z).toHSL()},u.prototype.toHSV=function(){return a.fromXYZ(this.x,this.y,this.z).toHSV()},u.prototype._x=function(t){return new u(t,this.y,this.z)},u.prototype._y=function(t){return new u(this.x,t,this.z)},u.prototype._z=function(t){return new u(this.x,this.y,t)},u.EPSILON=Math.pow(6/29,3),u.KAPPA=Math.pow(29/3,3),u.WHITE=new a(255,255,255).toXYZ(),c.prototype.eq=function(t){return t.l===this.l&&t.u===this.u&&t.v===this.v},c.fromXYZ=function(t,e,s){var n=1/(u.WHITE.x+15*u.WHITE.y+3*u.WHITE.z),i=4*u.WHITE.x*n,o=9*u.WHITE.y*n,a=e/u.WHITE.y,r=t+15*e+3*s;0===r&&(r=1);var d=1/r,l=4*t*d,h=9*e*d,f=a>u.EPSILON?116*Math.pow(a,1/3)-16:u.KAPPA*a,m=13*f*(l-i),_=13*f*(h-o);return new c(f,m,_)},c.prototype.toXYZ=function(){return u.fromLUV(this.l,this.u,this.v)},c.prototype.toRGB=function(){return u.fromLUV(this.l,this.u,this.v).toRGB()},c.prototype.toHSL=function(){return u.fromLUV(this.l,this.u,this.v).toHSL()},c.prototype.toHSV=function(){return u.fromLUV(this.l,this.u,this.v).toHSV()},c.prototype._l=function(t){return new c(t,this.u,this.v)},c.prototype._u=function(t){return new c(this.l,t,this.v)},c.prototype._v=function(t){return new c(this.l,this.u,t)},i.prototype._rebuild_contrast=function(){this._luv_required_bright=new u(0,this.settings.luv_contrast*(new a(35,35,35).toXYZ().y+.05)-.05,0).toLUV().l,this._luv_required_dark=new u(0,(new a(217,217,217).toXYZ().y+.05)/this.settings.luv_contrast-.05,0).toLUV().l},i.prototype._rebuild_colors=function(){this.has_bttv||(this._colors={},this._update_colors())},i.prototype._update_colors=function(e){var s=t.App&&App.__container__.lookup("controller:layout"),n=t.App&&App.__container__.lookup("controller:settings"),i=s&&s.get("isTheatreMode")||n&&n.get("model.darkMode");if(!e||this._color_old_darkness!==i){this._color_old_darkness=i;for(var o=document.querySelectorAll(".chat-line .has-color"),a=0,r=o.length;r>a;a++){var d=o[a],u=d.getAttribute("data-color"),c=u&&this._handle_color(u);c&&(d.style.color=i?c[1]:c[0])}}},i.prototype._handle_color=function(t){if(!t||this._colors.hasOwnProperty(t))return this._colors[t];var e=a.fromHex(t),s=t,n=t;if("0"!==this.settings.color_blind){var i=e.daltonize(this.settings.color_blind);e.eq(i)||(e=i,s=n=e.toHex())}if("4"===this.settings.fix_color){var o=e.luminance();if(o>.3){for(var r=127,d=e;r--&&(d=d.brighten(-1),!(d.luminance()<=.3)););s=d.toHex()}if(.15>o){for(var r=127,d=e;r--&&(d=d.brighten(),!(d.luminance()>=.15)););n=d.toHex()}}if("2"===this.settings.fix_color){var u=e.toHSL();s=u._l(Math.min(Math.max(0,.7*u.l),1)).toHex(),n=u._l(Math.min(Math.max(0,.3+.7*u.l),1)).toHex()}if("3"===this.settings.fix_color){var c=e.toHSV();0===c.s?(s=c._v(Math.min(Math.max(.5,.5*c.v),1)).toRGB().toHex(),n=c._v(Math.min(Math.max(.5,.5+.5*c.v),1)).toRGB().toHex()):(s=a.fromHSV(c.h,Math.min(Math.max(.7,.7+.3*c.s),1),Math.min(.7,c.v)).toHex(),n=a.fromHSV(c.h,Math.min(.7,c.s),Math.min(Math.max(.7,.7+.3*c.v),1)).toHex())}if("1"===this.settings.fix_color){var l=e.toLUV();l.l>this._luv_required_dark&&(s=l._l(this._luv_required_dark).toRGB().toHex()),l.l<this._luv_required_bright&&(n=l._l(this._luv_required_bright).toRGB().toHex())}var h=this._colors[t]=[s,n];return h}},{}],4:[function(e,s,n){var i=t.FrankerFaceZ;i.ffz_commands.log=function(t,e){this._pastebin(this._log_data.join("\n"),function(e){return e?void this.room_message(t,"Your FrankerFaceZ log has been pasted to: "+e):this.room_message(t,"There was an error uploading the FrankerFaceZ log.")})},i.ffz_commands.massunmod=function(t,e){if(e=e.join(" ").trim(),!e.length)return"You must provide a list of users to unmod.";e=e.split(/\W*,\W*/);var s=this.get_user();if(!s||!s.login==t.id)return"You must be the broadcaster to use massunmod.";if(e.length>50)return"Each user you unmod counts as a single message. To avoid being globally banned, please limit yourself to 50 at a time and wait between uses.";for(var n=e.length;e.length;){var i=e.shift();t.room.tmiRoom.sendMessage("/unmod "+i)}return"Sent unmod command for "+n+" users."},i.ffz_commands.massunmod.help="Usage: /ffz massunmod <list, of, users>\nBroadcaster only. Unmod all the users in the provided list.",i.ffz_commands.massmod=function(t,e){if(e=e.join(" ").trim(),!e.length)return"You must provide a list of users to mod.";e=e.split(/\W*,\W*/);var s=this.get_user();if(!s||!s.login==t.id)return"You must be the broadcaster to use massmod.";if(e.length>50)return"Each user you mod counts as a single message. To avoid being globally banned, please limit yourself to 50 at a time and wait between uses.";for(var n=e.length;e.length;){var i=e.shift();t.room.tmiRoom.sendMessage("/mod "+i)}return"Sent mod command for "+n+" users."},i.ffz_commands.massmod.help="Usage: /ffz massmod <list, of, users>\nBroadcaster only. Mod all the users in the provided list."},{}],5:[function(t,e,s){var n='<path d="m120.95 1.74c4.08-0.09 8.33-0.84 12.21 0.82 3.61 1.8 7 4.16 11.01 5.05 2.08 3.61 6.12 5.46 8.19 9.07 3.6 5.67 7.09 11.66 8.28 18.36 1.61 9.51 7.07 17.72 12.69 25.35 3.43 7.74 1.97 16.49 3.6 24.62 2.23 5.11 4.09 10.39 6.76 15.31 1.16 2 4.38 0.63 4.77-1.32 1.2-7.1-2.39-13.94-1.97-21.03 0.38-3.64-0.91-7.48 0.25-10.99 2.74-3.74 4.57-8.05 7.47-11.67 3.55-5.47 10.31-8.34 16.73-7.64 2.26 2.89 5.13 5.21 7.58 7.92 2.88 4.3 6.52 8.01 9.83 11.97 1.89 2.61 3.06 5.64 4.48 8.52 2.81 4.9 4 10.5 6.63 15.49 2.16 6.04 5.56 11.92 5.37 18.5 0.65 1.95 0.78 4 0.98 6.03 1.01 3.95 2.84 8.55 0.63 12.42-2.4 5.23-7.03 8.97-11.55 12.33-6.06 4.66-11.62 10.05-18.37 13.75-4.06 2.65-8.24 5.17-12.71 7.08-3.59 1.57-6.06 4.94-9.85 6.09-2.29 1.71-3.98 4.51-6.97 5.02-4.56 1.35-8.98-3.72-13.5-1.25-2.99 1.83-6.19 3.21-9.39 4.6-8.5 5.61-18.13 9.48-28.06 11.62-8.36-0.2-16.69 0.62-25.05 0.47-3.5-1.87-7.67-1.08-11.22-2.83-6.19-1.52-10.93-6.01-16.62-8.61-2.87-1.39-5.53-3.16-8.11-4.99-2.58-1.88-4.17-4.85-6.98-6.44-3.83-0.11-6.54 3.42-10.24 3.92-2.31 0.28-4.64 0.32-6.96 0.31-3.5-3.65-5.69-8.74-10.59-10.77-5.01-3.68-10.57-6.67-14.84-11.25-2.52-2.55-5.22-4.87-8.24-6.8-4.73-4.07-7.93-9.51-11.41-14.62-3.08-4.41-5.22-9.73-4.6-15.19 0.65-8.01 0.62-16.18 2.55-24.02 4.06-10.46 11.15-19.34 18.05-28.06 3.71-5.31 9.91-10.21 16.8-8.39 3.25 1.61 5.74 4.56 7.14 7.89 1.19 2.7 3.49 4.93 3.87 7.96 0.97 5.85 1.6 11.86 0.74 17.77-1.7 6.12-2.98 12.53-2.32 18.9 0.01 2.92 2.9 5.36 5.78 4.57 3.06-0.68 3.99-4.07 5.32-6.48 1.67-4.06 4.18-7.66 6.69-11.23 3.61-5.28 5.09-11.57 7.63-17.37 2.07-4.56 1.7-9.64 2.56-14.46 0.78-7.65-0.62-15.44 0.7-23.04 1.32-3.78 1.79-7.89 3.8-11.4 3.01-3.66 6.78-6.63 9.85-10.26 1.72-2.12 4.21-3.32 6.55-4.6 7.89-2.71 15.56-6.75 24.06-7z"/>',i="true"==localStorage.ffzDebugMode&&document.body.classList.contains("ffz-dev"),o=i?"//localhost:8000/":"//cdn.frankerfacez.com/";e.exports={DEBUG:i,SERVER:o,API_SERVER:"//api.frankerfacez.com/",API_SERVER_2:"//direct-api.frankerfacez.com/",KNOWN_CODES:{"#-?[\\\\/]":"#-/",":-?(?:7|L)":":-7","\\&lt\\;\\]":"<]","\\:-?(S|s)":":-S","\\:-?\\\\":":-\\","\\:\\&gt\\;":":>","B-?\\)":"B-)","\\:-?[z|Z|\\|]":":-Z","\\:-?\\)":":-)","\\:-?\\(":":-(","\\:-?(p|P)":":-P","\\;-?(p|P)":";-P","\\&lt\\;3":"<3","\\:-?[\\\\/]":":-/","\\;-?\\)":";-)","R-?\\)":"R-)","[o|O](_|\\.)[o|O]":"O.o","\\:-?D":":-D","\\:-?(o|O)":":-O","\\&gt\\;\\(":">(","Gr(a|e)yFace":"GrayFace"},EMOTE_REPLACEMENT_BASE:o+"script/replacements/",EMOTE_REPLACEMENTS:{15:"15-JKanStyle.png",16:"16-OptimizePrime.png",17:"17-StoneLightning.png",18:"18-TheRinger.png",19:"19-PazPazowitz.png",20:"20-EagleEye.png",21:"21-CougarHunt.png",22:"22-RedCoat.png",26:"26-JonCarnage.png",27:"27-PicoMause.png",30:"30-BCWarrior.png",33:"33-DansGame.png",36:"36-PJSalt.png"},EMOJI_REGEX:/((?:\ud83c\udde8\ud83c\uddf3|\ud83c\uddfa\ud83c\uddf8|\ud83c\uddf7\ud83c\uddfa|\ud83c\uddf0\ud83c\uddf7|\ud83c\uddef\ud83c\uddf5|\ud83c\uddee\ud83c\uddf9|\ud83c\uddec\ud83c\udde7|\ud83c\uddeb\ud83c\uddf7|\ud83c\uddea\ud83c\uddf8|\ud83c\udde9\ud83c\uddea|\u0039\ufe0f?\u20e3|\u0038\ufe0f?\u20e3|\u0037\ufe0f?\u20e3|\u0036\ufe0f?\u20e3|\u0035\ufe0f?\u20e3|\u0034\ufe0f?\u20e3|\u0033\ufe0f?\u20e3|\u0032\ufe0f?\u20e3|\u0031\ufe0f?\u20e3|\u0030\ufe0f?\u20e3|\u0023\ufe0f?\u20e3|\ud83d\udeb3|\ud83d\udeb1|\ud83d\udeb0|\ud83d\udeaf|\ud83d\udeae|\ud83d\udea6|\ud83d\udea3|\ud83d\udea1|\ud83d\udea0|\ud83d\ude9f|\ud83d\ude9e|\ud83d\ude9d|\ud83d\ude9c|\ud83d\ude9b|\ud83d\ude98|\ud83d\ude96|\ud83d\ude94|\ud83d\ude90|\ud83d\ude8e|\ud83d\ude8d|\ud83d\ude8b|\ud83d\ude8a|\ud83d\ude88|\ud83d\ude86|\ud83d\ude82|\ud83d\ude81|\ud83d\ude36|\ud83d\ude34|\ud83d\ude2f|\ud83d\ude2e|\ud83d\ude2c|\ud83d\ude27|\ud83d\ude26|\ud83d\ude1f|\ud83d\ude1b|\ud83d\ude19|\ud83d\ude17|\ud83d\ude15|\ud83d\ude11|\ud83d\ude10|\ud83d\ude0e|\ud83d\ude08|\ud83d\ude07|\ud83d\ude00|\ud83d\udd67|\ud83d\udd66|\ud83d\udd65|\ud83d\udd64|\ud83d\udd63|\ud83d\udd62|\ud83d\udd61|\ud83d\udd60|\ud83d\udd5f|\ud83d\udd5e|\ud83d\udd5d|\ud83d\udd5c|\ud83d\udd2d|\ud83d\udd2c|\ud83d\udd15|\ud83d\udd09|\ud83d\udd08|\ud83d\udd07|\ud83d\udd06|\ud83d\udd05|\ud83d\udd04|\ud83d\udd02|\ud83d\udd01|\ud83d\udd00|\ud83d\udcf5|\ud83d\udcef|\ud83d\udced|\ud83d\udcec|\ud83d\udcb7|\ud83d\udcb6|\ud83d\udcad|\ud83d\udc6d|\ud83d\udc6c|\ud83d\udc65|\ud83d\udc2a|\ud83d\udc16|\ud83d\udc15|\ud83d\udc13|\ud83d\udc10|\ud83d\udc0f|\ud83d\udc0b|\ud83d\udc0a|\ud83d\udc09|\ud83d\udc08|\ud83d\udc07|\ud83d\udc06|\ud83d\udc05|\ud83d\udc04|\ud83d\udc03|\ud83d\udc02|\ud83d\udc01|\ud83d\udc00|\ud83c\udfe4|\ud83c\udfc9|\ud83c\udfc7|\ud83c\udf7c|\ud83c\udf50|\ud83c\udf4b|\ud83c\udf33|\ud83c\udf32|\ud83c\udf1e|\ud83c\udf1d|\ud83c\udf1c|\ud83c\udf1a|\ud83c\udf18|\ud83c\udccf|\ud83c\udd70|\ud83c\udd71|\ud83c\udd7e|\ud83c\udd8e|\ud83c\udd91|\ud83c\udd92|\ud83c\udd93|\ud83c\udd94|\ud83c\udd95|\ud83c\udd96|\ud83c\udd97|\ud83c\udd98|\ud83c\udd99|\ud83c\udd9a|\ud83d\udc77|\ud83d\udec5|\ud83d\udec4|\ud83d\udec3|\ud83d\udec2|\ud83d\udec1|\ud83d\udebf|\ud83d\udeb8|\ud83d\udeb7|\ud83d\udeb5|\ud83c\ude01|\ud83c\ude02|\ud83c\ude32|\ud83c\ude33|\ud83c\ude34|\ud83c\ude35|\ud83c\ude36|\ud83c\ude37|\ud83c\ude38|\ud83c\ude39|\ud83c\ude3a|\ud83c\ude50|\ud83c\ude51|\ud83c\udf00|\ud83c\udf01|\ud83c\udf02|\ud83c\udf03|\ud83c\udf04|\ud83c\udf05|\ud83c\udf06|\ud83c\udf07|\ud83c\udf08|\ud83c\udf09|\ud83c\udf0a|\ud83c\udf0b|\ud83c\udf0c|\ud83c\udf0f|\ud83c\udf11|\ud83c\udf13|\ud83c\udf14|\ud83c\udf15|\ud83c\udf19|\ud83c\udf1b|\ud83c\udf1f|\ud83c\udf20|\ud83c\udf30|\ud83c\udf31|\ud83c\udf34|\ud83c\udf35|\ud83c\udf37|\ud83c\udf38|\ud83c\udf39|\ud83c\udf3a|\ud83c\udf3b|\ud83c\udf3c|\ud83c\udf3d|\ud83c\udf3e|\ud83c\udf3f|\ud83c\udf40|\ud83c\udf41|\ud83c\udf42|\ud83c\udf43|\ud83c\udf44|\ud83c\udf45|\ud83c\udf46|\ud83c\udf47|\ud83c\udf48|\ud83c\udf49|\ud83c\udf4a|\ud83c\udf4c|\ud83c\udf4d|\ud83c\udf4e|\ud83c\udf4f|\ud83c\udf51|\ud83c\udf52|\ud83c\udf53|\ud83c\udf54|\ud83c\udf55|\ud83c\udf56|\ud83c\udf57|\ud83c\udf58|\ud83c\udf59|\ud83c\udf5a|\ud83c\udf5b|\ud83c\udf5c|\ud83c\udf5d|\ud83c\udf5e|\ud83c\udf5f|\ud83c\udf60|\ud83c\udf61|\ud83c\udf62|\ud83c\udf63|\ud83c\udf64|\ud83c\udf65|\ud83c\udf66|\ud83c\udf67|\ud83c\udf68|\ud83c\udf69|\ud83c\udf6a|\ud83c\udf6b|\ud83c\udf6c|\ud83c\udf6d|\ud83c\udf6e|\ud83c\udf6f|\ud83c\udf70|\ud83c\udf71|\ud83c\udf72|\ud83c\udf73|\ud83c\udf74|\ud83c\udf75|\ud83c\udf76|\ud83c\udf77|\ud83c\udf78|\ud83c\udf79|\ud83c\udf7a|\ud83c\udf7b|\ud83c\udf80|\ud83c\udf81|\ud83c\udf82|\ud83c\udf83|\ud83c\udf84|\ud83c\udf85|\ud83c\udf86|\ud83c\udf87|\ud83c\udf88|\ud83c\udf89|\ud83c\udf8a|\ud83c\udf8b|\ud83c\udf8c|\ud83c\udf8d|\ud83c\udf8e|\ud83c\udf8f|\ud83c\udf90|\ud83c\udf91|\ud83c\udf92|\ud83c\udf93|\ud83c\udfa0|\ud83c\udfa1|\ud83c\udfa2|\ud83c\udfa3|\ud83c\udfa4|\ud83c\udfa5|\ud83c\udfa6|\ud83c\udfa7|\ud83c\udfa8|\ud83c\udfa9|\ud83c\udfaa|\ud83c\udfab|\ud83c\udfac|\ud83c\udfad|\ud83c\udfae|\ud83c\udfaf|\ud83c\udfb0|\ud83c\udfb1|\ud83c\udfb2|\ud83c\udfb3|\ud83c\udfb4|\ud83c\udfb5|\ud83c\udfb6|\ud83c\udfb7|\ud83c\udfb8|\ud83c\udfb9|\ud83c\udfba|\ud83c\udfbb|\ud83c\udfbc|\ud83c\udfbd|\ud83c\udfbe|\ud83c\udfbf|\ud83c\udfc0|\ud83c\udfc1|\ud83c\udfc2|\ud83c\udfc3|\ud83c\udfc4|\ud83c\udfc6|\ud83c\udfc8|\ud83c\udfca|\ud83c\udfe0|\ud83c\udfe1|\ud83c\udfe2|\ud83c\udfe3|\ud83c\udfe5|\ud83c\udfe6|\ud83c\udfe7|\ud83c\udfe8|\ud83c\udfe9|\ud83c\udfea|\ud83c\udfeb|\ud83c\udfec|\ud83c\udfed|\ud83c\udfee|\ud83c\udfef|\ud83c\udff0|\ud83d\udc0c|\ud83d\udc0d|\ud83d\udc0e|\ud83d\udc11|\ud83d\udc12|\ud83d\udc14|\ud83d\udc17|\ud83d\udc18|\ud83d\udc19|\ud83d\udc1a|\ud83d\udc1b|\ud83d\udc1c|\ud83d\udc1d|\ud83d\udc1e|\ud83d\udc1f|\ud83d\udc20|\ud83d\udc21|\ud83d\udc22|\ud83d\udc23|\ud83d\udc24|\ud83d\udc25|\ud83d\udc26|\ud83d\udc27|\ud83d\udc28|\ud83d\udc29|\ud83d\udc2b|\ud83d\udc2c|\ud83d\udc2d|\ud83d\udc2e|\ud83d\udc2f|\ud83d\udc30|\ud83d\udc31|\ud83d\udc32|\ud83d\udc33|\ud83d\udc34|\ud83d\udc35|\ud83d\udc36|\ud83d\udc37|\ud83d\udc38|\ud83d\udc39|\ud83d\udc3a|\ud83d\udc3b|\ud83d\udc3c|\ud83d\udc3d|\ud83d\udc3e|\ud83d\udc40|\ud83d\udc42|\ud83d\udc43|\ud83d\udc44|\ud83d\udc45|\ud83d\udc46|\ud83d\udc47|\ud83d\udc48|\ud83d\udc49|\ud83d\udc4a|\ud83d\udc4b|\ud83d\udc4c|\ud83d\udc4d|\ud83d\udc4e|\ud83d\udc4f|\ud83d\udc50|\ud83d\udc51|\ud83d\udc52|\ud83d\udc53|\ud83d\udc54|\ud83d\udc55|\ud83d\udc56|\ud83d\udc57|\ud83d\udc58|\ud83d\udc59|\ud83d\udc5a|\ud83d\udc5b|\ud83d\udc5c|\ud83d\udc5d|\ud83d\udc5e|\ud83d\udc5f|\ud83d\udc60|\ud83d\udc61|\ud83d\udc62|\ud83d\udc63|\ud83d\udc64|\ud83d\udc66|\ud83d\udc67|\ud83d\udc68|\ud83d\udc69|\ud83d\udc6a|\ud83d\udc6b|\ud83d\udc6e|\ud83d\udc6f|\ud83d\udc70|\ud83d\udc71|\ud83d\udc72|\ud83d\udc73|\ud83d\udc74|\ud83d\udc75|\ud83d\udc76|\ud83d\udeb4|\ud83d\udc78|\ud83d\udc79|\ud83d\udc7a|\ud83d\udc7b|\ud83d\udc7c|\ud83d\udc7d|\ud83d\udc7e|\ud83d\udc7f|\ud83d\udc80|\ud83d\udc81|\ud83d\udc82|\ud83d\udc83|\ud83d\udc84|\ud83d\udc85|\ud83d\udc86|\ud83d\udc87|\ud83d\udc88|\ud83d\udc89|\ud83d\udc8a|\ud83d\udc8b|\ud83d\udc8c|\ud83d\udc8d|\ud83d\udc8e|\ud83d\udc8f|\ud83d\udc90|\ud83d\udc91|\ud83d\udc92|\ud83d\udc93|\ud83d\udc94|\ud83d\udc95|\ud83d\udc96|\ud83d\udc97|\ud83d\udc98|\ud83d\udc99|\ud83d\udc9a|\ud83d\udc9b|\ud83d\udc9c|\ud83d\udc9d|\ud83d\udc9e|\ud83d\udc9f|\ud83d\udca0|\ud83d\udca1|\ud83d\udca2|\ud83d\udca3|\ud83d\udca4|\ud83d\udca5|\ud83d\udca6|\ud83d\udca7|\ud83d\udca8|\ud83d\udca9|\ud83d\udcaa|\ud83d\udcab|\ud83d\udcac|\ud83d\udcae|\ud83d\udcaf|\ud83d\udcb0|\ud83d\udcb1|\ud83d\udcb2|\ud83d\udcb3|\ud83d\udcb4|\ud83d\udcb5|\ud83d\udcb8|\ud83d\udcb9|\ud83d\udcba|\ud83d\udcbb|\ud83d\udcbc|\ud83d\udcbd|\ud83d\udcbe|\ud83d\udcbf|\ud83d\udcc0|\ud83d\udcc1|\ud83d\udcc2|\ud83d\udcc3|\ud83d\udcc4|\ud83d\udcc5|\ud83d\udcc6|\ud83d\udcc7|\ud83d\udcc8|\ud83d\udcc9|\ud83d\udcca|\ud83d\udccb|\ud83d\udccc|\ud83d\udccd|\ud83d\udcce|\ud83d\udccf|\ud83d\udcd0|\ud83d\udcd1|\ud83d\udcd2|\ud83d\udcd3|\ud83d\udcd4|\ud83d\udcd5|\ud83d\udcd6|\ud83d\udcd7|\ud83d\udcd8|\ud83d\udcd9|\ud83d\udcda|\ud83d\udcdb|\ud83d\udcdc|\ud83d\udcdd|\ud83d\udcde|\ud83d\udcdf|\ud83d\udce0|\ud83d\udce1|\ud83d\udce2|\ud83d\udce3|\ud83d\udce4|\ud83d\udce5|\ud83d\udce6|\ud83d\udce7|\ud83d\udce8|\ud83d\udce9|\ud83d\udcea|\ud83d\udceb|\ud83d\udcee|\ud83d\udcf0|\ud83d\udcf1|\ud83d\udcf2|\ud83d\udcf3|\ud83d\udcf4|\ud83d\udcf6|\ud83d\udcf7|\ud83d\udcf9|\ud83d\udcfa|\ud83d\udcfb|\ud83d\udcfc|\ud83d\udd03|\ud83d\udd0a|\ud83d\udd0b|\ud83d\udd0c|\ud83d\udd0d|\ud83d\udd0e|\ud83d\udd0f|\ud83d\udd10|\ud83d\udd11|\ud83d\udd12|\ud83d\udd13|\ud83d\udd14|\ud83d\udd16|\ud83d\udd17|\ud83d\udd18|\ud83d\udd19|\ud83d\udd1a|\ud83d\udd1b|\ud83d\udd1c|\ud83d\udd1d|\ud83d\udd1e|\ud83d\udd1f|\ud83d\udd20|\ud83d\udd21|\ud83d\udd22|\ud83d\udd23|\ud83d\udd24|\ud83d\udd25|\ud83d\udd26|\ud83d\udd27|\ud83d\udd28|\ud83d\udd29|\ud83d\udd2a|\ud83d\udd2b|\ud83d\udd2e|\ud83d\udd2f|\ud83d\udd30|\ud83d\udd31|\ud83d\udd32|\ud83d\udd33|\ud83d\udd34|\ud83d\udd35|\ud83d\udd36|\ud83d\udd37|\ud83d\udd38|\ud83d\udd39|\ud83d\udd3a|\ud83d\udd3b|\ud83d\udd3c|\ud83d\udd3d|\ud83d\udd50|\ud83d\udd51|\ud83d\udd52|\ud83d\udd53|\ud83d\udd54|\ud83d\udd55|\ud83d\udd56|\ud83d\udd57|\ud83d\udd58|\ud83d\udd59|\ud83d\udd5a|\ud83d\udd5b|\ud83d\uddfb|\ud83d\uddfc|\ud83d\uddfd|\ud83d\uddfe|\ud83d\uddff|\ud83d\ude01|\ud83d\ude02|\ud83d\ude03|\ud83d\ude04|\ud83d\ude05|\ud83d\ude06|\ud83d\ude09|\ud83d\ude0a|\ud83d\ude0b|\ud83d\ude0c|\ud83d\ude0d|\ud83d\ude0f|\ud83d\ude12|\ud83d\ude13|\ud83d\ude14|\ud83d\ude16|\ud83d\ude18|\ud83d\ude1a|\ud83d\ude1c|\ud83d\ude1d|\ud83d\ude1e|\ud83d\ude20|\ud83d\ude21|\ud83d\ude22|\ud83d\ude23|\ud83d\ude24|\ud83d\ude25|\ud83d\ude28|\ud83d\ude29|\ud83d\ude2a|\ud83d\ude2b|\ud83d\ude2d|\ud83d\ude30|\ud83d\ude31|\ud83d\ude32|\ud83d\ude33|\ud83d\ude35|\ud83d\ude37|\ud83d\ude38|\ud83d\ude39|\ud83d\ude3a|\ud83d\ude3b|\ud83d\ude3c|\ud83d\ude3d|\ud83d\ude3e|\ud83d\ude3f|\ud83d\ude40|\ud83d\ude45|\ud83d\ude46|\ud83d\ude47|\ud83d\ude48|\ud83d\ude49|\ud83d\ude4a|\ud83d\ude4b|\ud83d\ude4c|\ud83d\ude4d|\ud83d\ude4e|\ud83d\ude4f|\ud83d\ude80|\ud83d\ude83|\ud83d\ude84|\ud83d\ude85|\ud83d\ude87|\ud83d\ude89|\ud83d\ude8c|\ud83d\ude8f|\ud83d\ude91|\ud83d\ude92|\ud83d\ude93|\ud83d\ude95|\ud83d\ude97|\ud83d\ude99|\ud83d\ude9a|\ud83d\udea2|\ud83d\udea4|\ud83d\udea5|\ud83d\udea7|\ud83d\udea8|\ud83d\udea9|\ud83d\udeaa|\ud83d\udeab|\ud83d\udeac|\ud83d\udead|\ud83d\udeb2|\ud83d\udeb6|\ud83d\udeb9|\ud83d\udeba|\ud83d\udebb|\ud83d\udebc|\ud83d\udebd|\ud83d\udebe|\ud83d\udec0|\ud83c\udde6|\ud83c\udde7|\ud83c\udde8|\ud83c\udde9|\ud83c\uddea|\ud83c\uddeb|\ud83c\uddec|\ud83c\udded|\ud83c\uddee|\ud83c\uddef|\ud83c\uddf0|\ud83c\uddf1|\ud83c\uddf2|\ud83c\uddf3|\ud83c\uddf4|\ud83c\uddf5|\ud83c\uddf6|\ud83c\uddf7|\ud83c\uddf8|\ud83c\uddf9|\ud83c\uddfa|\ud83c\uddfb|\ud83c\uddfc|\ud83c\uddfd|\ud83c\uddfe|\ud83c\uddff|\ud83c\udf0d|\ud83c\udf0e|\ud83c\udf10|\ud83c\udf12|\ud83c\udf16|\ud83c\udf17|\ue50a|\u3030|\u27b0|\u2797|\u2796|\u2795|\u2755|\u2754|\u2753|\u274e|\u274c|\u2728|\u270b|\u270a|\u2705|\u26ce|\u23f3|\u23f0|\u23ec|\u23eb|\u23ea|\u23e9|\u2122|\u27bf|\u00a9|\u00ae)|(?:(?:\ud83c\udc04|\ud83c\udd7f|\ud83c\ude1a|\ud83c\ude2f|\u3299|\u303d|\u2b55|\u2b50|\u2b1c|\u2b1b|\u2b07|\u2b06|\u2b05|\u2935|\u2934|\u27a1|\u2764|\u2757|\u2747|\u2744|\u2734|\u2733|\u2716|\u2714|\u2712|\u270f|\u270c|\u2709|\u2708|\u2702|\u26fd|\u26fa|\u26f5|\u26f3|\u26f2|\u26ea|\u26d4|\u26c5|\u26c4|\u26be|\u26bd|\u26ab|\u26aa|\u26a1|\u26a0|\u2693|\u267f|\u267b|\u3297|\u2666|\u2665|\u2663|\u2660|\u2653|\u2652|\u2651|\u2650|\u264f|\u264e|\u264d|\u264c|\u264b|\u264a|\u2649|\u2648|\u263a|\u261d|\u2615|\u2614|\u2611|\u260e|\u2601|\u2600|\u25fe|\u25fd|\u25fc|\u25fb|\u25c0|\u25b6|\u25ab|\u25aa|\u24c2|\u231b|\u231a|\u21aa|\u21a9|\u2199|\u2198|\u2197|\u2196|\u2195|\u2194|\u2139|\u2049|\u203c|\u2668)([\uFE0E\uFE0F]?)))/g,
SVGPATH:n,ZREKNARF:'<svg style="padding:1.75px 0" class="svg-glyph_views ffz-svg svg-zreknarf" width="16px" viewBox="0 0 249 195" version="1.1" height="12.5px">'+n+"</svg>",CHAT_BUTTON:'<svg class="svg-emoticons ffz-svg" height="18px" width="24px" viewBox="0 0 249 195" version="1.1">'+n+"</svg>",ROOMS:'<svg class="svg-glyph_views svg-roomlist" height="16px" version="1.1" viewBox="0 0 16 16" width="16px" x="0px" y="0px"><path clip-rule="evenodd" d="M1,13v-2h14v2H1z M1,5h13v2H1V5z M1,2h10v2H1V2z M12,10H1V8h11V10z" fill-rule="evenodd"></path></svg>',CAMERA:'<svg class="svg-camera" height="16px" version="1.1" viewBox="0 0 36 36" width="16px" x="0px" y="0px"><path fill-rule="evenodd" clip-rule="evenodd" d="M24,20v6H4V10h20v6l8-6v16L24,20z"/></svg>',INVITE:'<svg class="svg-plus" height="16px" version="1.1" viewBox="0 0 16 16" width="16px" x="0px" y="0px"><path clip-rule="evenodd" d="M15,9h-3v3h-2V9H7V7h3V4h2v3h3V9z M9,6H6v4h2h1v3h4l0,0l0,0v1h-3H4H1v-1l3-3h2L4,8V2h6v1H9V6z" fill-rule="evenodd"></path></svg>',LIVE:'<svg class="svg-glyph_live_small" height="16px" version="1.1" viewbox="0 0 16 16" width="13px" x="0px" y="0px"><path clip-rule="evenodd" d="M11,14H5H2v-1l3-3h2L5,8V2h6v6l-2,2h2l3,3v1H11z" fill-rule="evenodd"></path></svg>',EYE:'<svg class="svg-glyph_views ffz-svg svg-eye" height="16px" version="1.1" viewBox="0 0 16 16" width="16px" x="0px" y="0px"><path clip-rule="evenodd" d="M11,13H5L1,9V8V7l4-4h6l4,4v1v1L11,13z M8,5C6.344,5,5,6.343,5,8c0,1.656,1.344,3,3,3c1.657,0,3-1.344,3-3C11,6.343,9.657,5,8,5z M8,9C7.447,9,7,8.552,7,8s0.447-1,1-1s1,0.448,1,1S8.553,9,8,9z" fill-rule="evenodd"></path></svg>',CLOCK:'<svg class="svg-glyph_views ffz-svg svg-clock" height="16px" version="1.1" viewBox="0 0 16 16" width="16px" x="0px" y="0px"><path fill-rule="evenodd" clip-rule="evenodd" fill="#888888" d="M8,15c-3.866,0-7-3.134-7-7s3.134-7,7-7s7,3.134,7,7 S11.866,15,8,15z M8,3C5.238,3,3,5.238,3,8s2.238,5,5,5s5-2.238,5-5S10.762,3,8,3z M7.293,8.707L7,8l1-4l0.902,3.607L11,11 L7.293,8.707z"/></svg>',GEAR:'<svg class="svg-gear" height="16px" version="1.1" viewBox="0 0 16 16" width="16px" x="0px" y="0px"><path clip-rule="evenodd" d="M15,7v2h-2.115c-0.125,0.615-0.354,1.215-0.713,1.758l1.484,1.484l-1.414,1.414l-1.484-1.484C10.215,12.531,9.615,12.76,9,12.885V15H7v-2.12c-0.614-0.126-1.21-0.356-1.751-0.714l-1.491,1.49l-1.414-1.414l1.491-1.49C3.477,10.211,3.247,9.613,3.12,9H1V7h2.116C3.24,6.384,3.469,5.785,3.829,5.242L2.343,3.757l1.414-1.414l1.485,1.485C5.785,3.469,6.384,3.24,7,3.115V1h2v2.12c0.613,0.126,1.211,0.356,1.752,0.714l1.49-1.491l1.414,1.414l-1.49,1.492C12.523,5.79,12.754,6.387,12.88,7H15z M8,6C6.896,6,6,6.896,6,8s0.896,2,2,2s2-0.896,2-2S9.104,6,8,6z" fill-rule="evenodd"></path></svg>',HEART:'<svg class="svg-heart" height="16px" version="1.1" viewBox="0 0 16 16" width="16px" x="0px" y="0px"><path clip-rule="evenodd" d="M8,13.5L1.5,7V4l2-2h3L8,3.5L9.5,2h3l2,2v3L8,13.5z" fill-rule="evenodd"></path></svg>',EMOTE:'<svg class="svg-emote" height="16px" version="1.1" viewBox="0 0 18 18" width="16px" x="0px" y="0px"><path clip-rule="evenodd" d="M9,18c-4.971,0-9-4.029-9-9s4.029-9,9-9s9,4.029,9,9S13.971,18,9,18z M14,4.111V4h-0.111C12.627,2.766,10.904,2,9,2C7.095,2,5.373,2.766,4.111,4H4v0.111C2.766,5.373,2,7.096,2,9s0.766,3.627,2,4.889V14l0.05-0.051C5.317,15.217,7.067,16,9,16c1.934,0,3.684-0.783,4.949-2.051L14,14v-0.111c1.234-1.262,2-2.984,2-4.889S15.234,5.373,14,4.111zM11,6h2v4h-2V6z M12.535,12.535C11.631,13.44,10.381,14,9,14s-2.631-0.56-3.536-1.465l0.707-0.707C6.896,12.553,7.896,13,9,13s2.104-0.447,2.828-1.172L12.535,12.535z M5,6h2v4H5V6z" fill-rule="evenodd"></path></svg>',STAR:'<svg class="svg-star" height="16px" version="1.1" viewbox="0 0 16 16" width="16px" x="0px" y="0px"><path clip-rule="evenodd" d="M15,6l-4.041,2.694L13,14l-5-3.333L3,14l2.041-5.306L1,6h5.077L8,1l1.924,5H15z" fill-rule="evenodd"></path></svg>',CLOSE:'<svg class="svg-close_small" height="16px" version="1.1" viewbox="0 0 16 16" width="16px" x="0px" y="0px"><path clip-rule="evenodd" d="M12.657,4.757L9.414,8l3.243,3.242l-1.415,1.415L8,9.414l-3.243,3.243l-1.414-1.415L6.586,8L3.343,4.757l1.414-1.414L8,6.586l3.242-3.243L12.657,4.757z" fill-rule="evenodd"></path></svg>',EDIT:'<svg class="svg-edit" height="16px" version="1.1" viewbox="0 0 16 16" width="16px" x="0px" y="0px"><path clip-rule="evenodd" d="M6.414,12.414L3.586,9.586l8-8l2.828,2.828L6.414,12.414z M4.829,14H2l0,0v-2.828l0.586-0.586l2.828,2.828L4.829,14z" fill-rule="evenodd"></path></svg>',GRAPH:'<svg class="svg-graph" height="16px" version="1.1" viewbox="0 0 18 18" width="16px" x="0px" y="0px"><path clip-rule="evenodd" d="M1,16V2h16v14H1z M5,4H3v1h2V4z M5,7H3v1h2V7z M5,10H3v1h2V10zM5,13H3v1h2V13z M9,7H7v7h2V7z M12,10h-2v4h2V10z M15,4h-2v10h2V4z" fill-rule="evenodd"></path></svg>'}},{}],6:[function(e,s,n){var i=t.FrankerFaceZ;i.settings_info.developer_mode={type:"boolean",value:!1,storage_key:"ffzDebugMode",visible:function(){return this.settings.developer_mode||Date.now()-parseInt(localStorage.ffzLastDevMode||"0")<6048e5},category:"Debugging",name:"Developer Mode",help:"Load FrankerFaceZ from the local development server instead of the CDN. Please refresh after changing this setting.",on_update:function(){localStorage.ffzLastDevMode=Date.now()}},i.ffz_commands.developer_mode=function(t,e){var s,e=e&&e.length?e[0].toLowerCase():null;return"y"==e||"yes"==e||"true"==e||"on"==e?s=!0:("n"==e||"no"==e||"false"==e||"off"==e)&&(s=!1),void 0===s?"Developer Mode is currently "+(this.settings.developer_mode?"enabled.":"disabled."):(this.settings.set("developer_mode",s),"Developer Mode is now "+(s?"enabled":"disabled")+". Please refresh your browser.")},i.ffz_commands.developer_mode.help="Usage: /ffz developer_mode <on|off>\nEnable or disable Developer Mode. When Developer Mode is enabled, the script will be reloaded from //localhost:8000/script.js instead of from the CDN."},{}],7:[function(e,s,n){var i=t.FrankerFaceZ,o=e("../utils"),a=e("../constants");i.prototype.setup_channel=function(){this.log("Creating channel style element.");var t=this._channel_style=document.createElement("style");t.id="ffz-channel-css",document.head.appendChild(t),document.body.classList.toggle("ffz-hide-view-count",!this.settings.channel_views),this.log("Creating channel style element.");var t=this._channel_style=document.createElement("style");t.id="ffz-channel-css",document.head.appendChild(t),this.log("Hooking the Ember Channel Index view.");var e=App.__container__.resolve("view:channel/index"),s=this;if(e){this._modify_cindex(e);try{e.create().destroy()}catch(n){}for(var o in Ember.View.views)if(Ember.View.views.hasOwnProperty(o)){var a=Ember.View.views[o];a instanceof e&&(this.log("Manually updating Channel Index view.",a),this._modify_cindex(a),a.ffzInit())}this.log("Hooking the Ember Channel model."),e=App.__container__.resolve("model:channel"),e&&(e.reopen({ffz_host_target:void 0,setHostMode:function(t){return s.settings.hosted_channels?(this.set("ffz_host_target",t.target),this._super(t)):(this.set("ffz_host_target",void 0),this._super({target:void 0,delay:0}))}}),this.log("Hooking the Ember Channel controller."),e=App.__container__.lookup("controller:channel"),e&&(e.reopen({ffzUpdateUptime:function(){s._cindex&&s._cindex.ffzUpdateUptime()}.observes("isLive","content.id"),ffzUpdateInfo:function(){this._ffz_update_timer&&clearTimeout(this._ffz_update_timer),this.get("content.id")&&(this._ffz_update_timer=setTimeout(this.ffzCheckUpdate.bind(this),6e4))}.observes("content.id"),ffzCheckUpdate:function(){var t=this,e=t.get("content.id");e&&Twitch.api&&Twitch.api.get("streams/"+e,{},{version:3}).done(function(e){if(!e||!e.stream)return t.set("stream.created_at",null),void t.set("stream.viewers",0);t.set("stream.created_at",e.stream.created_at||null),t.set("stream.viewers",e.stream.viewers||0);var s=e.stream.game||e.stream.channel&&e.stream.channel.game;s&&(t.set("game",s),t.set("rollbackData.game",s)),e.stream.channel&&(e.stream.channel.status&&t.set("status",e.stream.channel.status),e.stream.channel.views&&t.set("views",e.stream.channel.views),e.stream.channel.followers&&t.get("content.followers.isLoaded")&&t.set("content.followers.total",e.stream.channel.followers))}).always(function(e){t.ffzUpdateInfo()})},ffzUpdateTitle:function(){var t=this.get("content.name"),e=this.get("content.display_name");e&&(i.capitalization[t]=[e,Date.now()]),s._cindex&&s._cindex.ffzFixTitle()}.observes("content.status","content.id"),ffzHostTarget:function(){var t=this.get("content.hostModeTarget"),e=t&&t.get("name"),n=t&&t.get("id"),o=t&&t.get("display_name");n!==s.__old_host_target&&(s.__old_host_target&&s.ws_send("unsub_channel",s.__old_host_target),n?(s.ws_send("sub_channel",n),s.__old_host_target=n):delete s.__old_host_target),o&&(i.capitalization[e]=[o,Date.now()]),s.settings.group_tabs&&s._chatv&&s._chatv.ffzRebuildTabs(),s.settings.follow_buttons&&s.rebuild_following_ui(),s.settings.srl_races&&s.rebuild_race_ui()}.observes("content.hostModeTarget")}),e.ffzUpdateInfo()))}},i.prototype._modify_cindex=function(t){var e=this;t.reopen({didInsertElement:function(){this._super();try{this.ffzInit()}catch(t){e.error("CIndex didInsertElement: "+t)}},willClearRender:function(){try{this.ffzTeardown()}catch(t){e.error("CIndex willClearRender: "+t)}return this._super()},ffzInit:function(){var t=this.get("controller.id"),s=this.get("element");e._cindex=this,e.ws_send("sub_channel",t),s.setAttribute("data-channel",t),s.classList.add("ffz-channel"),this.$(".theatre-button a").attr("title","Theater Mode (Alt+T)"),this.ffzFixTitle(),this.ffzUpdateUptime(),this.ffzUpdateChatters(),this.ffzUpdateHostButton(),this.ffzUpdatePlayerStats();var n=this.get("element").querySelector(".svg-glyph_views:not(.ffz-svg)");if(n&&n.parentNode.classList.add("twitch-channel-views"),e.settings.follow_buttons&&e.rebuild_following_ui(),e.settings.srl_races&&e.rebuild_race_ui(),e.settings.auto_theater){var i=App.__container__.lookup("controller:layout");i&&i.set("isTheatreMode",!0)}},ffzFixTitle:function(){if(!e.has_bttv&&e.settings.stream_title){var t=this.get("controller.status"),s=this.get("controller.id");t=e.render_tokens(e.tokenize_line(s,s,t,!0)),this.$(".title span").each(function(e,s){var n=s.querySelectorAll("script");s.innerHTML=n.length?n[0].outerHTML+t+n[1].outerHTML:t})}},ffzUpdateHostButton:function(){var t=this.get("controller.id"),s=this.get("controller.hostModeTarget.id"),n=e.get_user(),a=n&&e.rooms&&e.rooms[n.login]&&e.rooms[n.login].room,r=a&&a.ffz_host_target,d=a&&a.ffz_hosts_left,u=this.get("element");if(this.set("ffz_host_updating",!1),t){var c=u&&u.querySelector(".stats-and-actions .channel-actions"),l=c&&c.querySelector("#ffz-ui-host-button");if(c&&e.settings.stream_host_button&&n&&n.login!==t){if(!l){l=document.createElement("span"),l.id="ffz-ui-host-button",l.className="button action tooltip",l.addEventListener("click",this.ffzClickHost.bind(l,this,!1));var h;try{h=c.querySelector(":scope > .theatre-button")}catch(f){h=void 0}h?c.insertBefore(l,h):c.appendChild(l)}l.classList.remove("disabled"),l.innerHTML=t===r?"Unhost":"Host",l.title=r?"You are now hosting "+o.sanitize(i.get_capitalization(r))+".":"You are not hosting any channel.","number"==typeof d&&(l.title+=" You have "+d+" host command"+o.pluralize(d)+" remaining this half hour.")}else l&&l.parentElement.removeChild(l)}if(s){var c=u&&u.querySelector("#hostmode .channel-actions"),l=c&&c.querySelector("#ffz-ui-host-button");if(c&&e.settings.stream_host_button&&n&&n.login!==s){if(!l){l=document.createElement("span"),l.id="ffz-ui-host-button",l.className="button action tooltip",l.addEventListener("click",this.ffzClickHost.bind(l,this,!0));var h;try{h=c.querySelector(":scope > .theatre-button")}catch(f){h=void 0}h?c.insertBefore(l,h):c.appendChild(l)}l.classList.remove("disabled"),l.innerHTML=s===r?"Unhost":"Host",l.title=r?"You are currently hosting "+o.sanitize(i.get_capitalization(r))+". Click to "+(s===r?"unhost":"host")+" this channel.":"You are not currently hosting any channel. Click to host this channel.","number"==typeof d&&(l.title+=" You have "+d+" host command"+o.pluralize(d)+" remaining this half hour.")}else l&&l.parentElement.removeChild(l)}},ffzClickHost:function(t,s){var n=t.get(s?"controller.hostModeTarget.id":"controller.id"),i=e.get_user(),o=i&&e.rooms&&e.rooms[i.login]&&e.rooms[i.login].room,a=o&&o.ffz_host_target;o&&!t.get("ffz_host_updating")&&(this.classList.add("disabled"),this.title="Updating...",t.set("ffz_host_updating",!0),o.send(a===n?"/unhost":"/host "+n))},ffzUpdateChatters:function(){var t=this.get("controller.id"),s=e.rooms&&e.rooms[t];if(!s||!e.settings.chatter_count){var n=this.get("element").querySelector("#ffz-chatter-display");return n&&n.parentElement.removeChild(n),n=this.get("element").querySelector("#ffz-ffzchatter-display"),void(n&&n.parentElement.removeChild(n))}var i=Object.keys(s.room.get("ffz_chatters")||{}).length,r=s.ffz_chatters||0,d=s.ffz_viewers||0,n=this.get("element").querySelector("#ffz-chatter-display span");if(!n){var u=this.get("element").querySelector(".stats-and-actions .channel-stats");if(!u)return;var c=document.createElement("span");c.className="ffz stat",c.id="ffz-chatter-display",c.title="Currently in Chat",c.innerHTML=a.ROOMS+" ",n=document.createElement("span"),c.appendChild(n);var l=u.querySelector("#ffz-ffzchatter-display");l?u.insertBefore(c,l):u.appendChild(c),jQuery(c).tipsy()}if(n.innerHTML=o.number_commas(i),!r&&!d)return n=this.get("element").querySelector("#ffz-ffzchatter-display"),void(n&&n.parentNode.removeChild(n));if(n=this.get("element").querySelector("#ffz-ffzchatter-display span"),!n){var u=this.get("element").querySelector(".stats-and-actions .channel-stats");if(!u)return;var c=document.createElement("span");c.className="ffz stat",c.id="ffz-ffzchatter-display",c.title="Viewers (In Chat) with FrankerFaceZ",c.innerHTML=a.ZREKNARF+" ",n=document.createElement("span"),c.appendChild(n);var l=u.querySelector("#ffz-chatter-display");l?u.insertBefore(c,l.nextSibling):u.appendChild(c),jQuery(c).tipsy()}n.innerHTML=o.number_commas(d)+" ("+o.number_commas(r)+")"},ffzUpdatePlayerStats:function(){var t=this.get("controller.id"),s=this.get("controller.hostModeTarget.id"),n=this.get("element");if(t){var i=n&&n.querySelector(".stats-and-actions .channel-stats"),o=i&&i.querySelector("#ffz-ui-player-stats"),n=o&&o.querySelector("span"),r=e.players&&e.players[t],d=r&&r.player,u=d&&d.stats;if(i&&e.settings.player_stats&&u&&"NaN"!==u.hlsLatencyBroadcaster&&u.hlsLatencyBroadcaster!==0/0){if(!o){o=document.createElement("span"),o.id="ffz-ui-player-stats",o.className="ffz stat tooltip",o.innerHTML=a.GRAPH+" ",n=document.createElement("span"),o.appendChild(n);var c=i.querySelector("#ffz-uptime-display");c?i.insertBefore(o,c.nextSibling):i.appendChild(o)}o.title="Stream Latency\nFPS: "+u.fps+"\nPlayback Rate: "+u.playbackRate+" Kbps",n.textContent=u.hlsLatencyBroadcaster+"s"}else o&&o.parentElement.removeChild(o)}if(s){var i=n&&n.querySelector("#hostmode .channel-stats"),o=i&&i.querySelector("#ffz-ui-player-stats"),n=o&&o.querySelector("span"),r=e.players&&e.players[s],d=r&&r.player,u=d&&d.stats;if(i&&e.settings.player_stats&&u&&"NaN"!==u.hlsLatencyBroadcaster&&u.hlsLatencyBroadcaster!==0/0){if(!o){o=document.createElement("span"),o.id="ffz-ui-player-stats",o.className="ffz stat tooltip",o.innerHTML=a.GRAPH+" ",n=document.createElement("span"),o.appendChild(n);var c=i.querySelector("#ffz-uptime-display");c?i.insertBefore(o,c.nextSibling):i.appendChild(o)}o.title="Stream Latency\nFPS: "+u.fps+"\nPlayback Rate: "+u.playbackRate+" Kbps",n.textContent=u.hlsLatencyBroadcaster+"s"}else o&&o.parentElement.removeChild(o)}},ffzUpdateUptime:function(){if(this._ffz_update_uptime&&(clearTimeout(this._ffz_update_uptime),delete this._ffz_update_uptime),!e.settings.stream_uptime||!this.get("controller.isLiveAccordingToKraken")){var t=this.get("element").querySelector("#ffz-uptime-display");return void(t&&t.parentElement.removeChild(t))}this._ffz_update_uptime=setTimeout(this.ffzUpdateUptime.bind(this),1e3);var s=this.get("controller.content.stream.created_at");s=s&&o.parse_date(s);var n=s&&Math.floor((Date.now()-s.getTime())/1e3)||-1;if(0>n){var t=this.get("element").querySelector("#ffz-uptime-display");return void(t&&t.parentElement.removeChild(t))}var t=this.get("element").querySelector("#ffz-uptime-display span");if(!t){var i=this.get("element").querySelector(".stats-and-actions .channel-stats");if(!i)return;var r=document.createElement("span");r.className="ffz stat",r.id="ffz-uptime-display",r.title="Stream Uptime <nobr>(since "+s.toLocaleString()+")</nobr>",r.innerHTML=a.CLOCK+" ",t=document.createElement("span"),r.appendChild(t);var d=i.querySelector(".live-count");if(d)i.insertBefore(r,d.nextSibling);else try{d=i.querySelector("script:nth-child(0n+2)"),i.insertBefore(r,d.nextSibling)}catch(u){i.insertBefore(r,i.childNodes[0])}jQuery(r).tipsy({html:!0})}t.innerHTML=o.time_to_string(n)},ffzTeardown:function(){var t=this.get("controller.id");t&&e.ws_send("unsub_channel",t),this.get("element").setAttribute("data-channel",""),e._cindex=void 0,this._ffz_update_uptime&&clearTimeout(this._ffz_update_uptime),o.update_css(e._channel_style,t,null)}})},i.settings_info.auto_theater={type:"boolean",value:!1,category:"Appearance",no_mobile:!0,no_bttv:!0,name:"Automatic Theater Mode",help:"Automatically enter theater mode when opening a channel."},i.settings_info.chatter_count={type:"boolean",value:!1,no_mobile:!0,category:"Channel Metadata",name:"Chatter Count",help:"Display the current number of users connected to chat beneath the channel.",on_update:function(t){if(this._cindex&&this._cindex.ffzUpdateChatters(),t&&this.rooms)for(var e in this.rooms)this.rooms.hasOwnProperty(e)&&this.rooms[e].room&&this.rooms[e].room.ffzInitChatterCount()}},i.settings_info.channel_views={type:"boolean",value:!0,no_mobile:!0,category:"Channel Metadata",name:"Channel Views",help:"Display the number of times the channel has been viewed beneath the stream.",on_update:function(t){document.body.classList.toggle("ffz-hide-view-count",!t)}},i.settings_info.hosted_channels={type:"boolean",value:!0,no_mobile:!0,category:"Channel Metadata",name:"Channel Hosting",help:"Display other channels that have been featured by the current channel.",on_update:function(t){var e=document.querySelector("input.ffz-setting-hosted-channels");if(e&&(e.checked=t),this._cindex){var s=this._cindex.get("controller.model"),n=s&&this.rooms&&this.rooms[s.get("id")],i=n&&n.room&&n.room.get("ffz_host_target");s&&n&&s.setHostMode({target:i,delay:0})}}},i.settings_info.stream_host_button={type:"boolean",value:!0,no_mobile:!0,category:"Channel Metadata",name:"Host This Channel Button",help:"Display a button underneath streams that make it easy to host them with your own channel.",on_update:function(t){this._cindex&&this._cindex.ffzUpdateHostButton()}},i.settings_info.stream_uptime={type:"boolean",value:!1,no_mobile:!0,category:"Channel Metadata",name:"Stream Uptime",help:"Display the stream uptime under a channel by the viewer count.",on_update:function(t){this._cindex&&this._cindex.ffzUpdateUptime()}},i.settings_info.stream_title={type:"boolean",value:!0,no_bttv:!0,no_mobile:!0,category:"Channel Metadata",name:"Title Links",help:"Make links in stream titles clickable.",on_update:function(t){this._cindex&&this._cindex.ffzFixTitle()}}},{"../constants":5,"../utils":35}],8:[function(e,s,n){var i=t.FrankerFaceZ,o=e("../utils"),a=(e("../constants"),-1!==navigator.userAgent.indexOf("Android")),r={BACKSPACE:8,TAB:9,ENTER:13,ESC:27,SPACE:32,LEFT:37,UP:38,RIGHT:39,DOWN:40,TWO:50,COLON:59,FAKE_COLON:186},d=function(t){if("number"==typeof t.selectionStart)return t.selectionStart;if(!t.createTextRange)return-1;var e=document.selection.createRange(),s=t.createTextRange();return s.moveToBookmark(e.getBookmark()),s.moveStart("character",-t.value.length),s.text.length},u=function(t,e){if(t.setSelectionRange)t.setSelectionRange(e,e);else if(t.createTextRange){var s=t.createTextRange();s.move("character",-t.value.length),s.move("character",e),s.select()}};i.settings_info.input_quick_reply={type:"boolean",value:!0,category:"Chat Input",no_bttv:!0,name:"Reply to Whispers with /r",help:"Automatically replace /r at the start of the line with the command to whisper to the person you've whispered with most recently."},i.settings_info.input_mru={type:"boolean",value:!0,category:"Chat Input",no_bttv:!0,name:"Chat Input History",help:"Use the Up and Down arrows in chat to select previously sent chat messages."},i.settings_info.input_emoji={type:"boolean",value:!1,category:"Chat Input",no_bttv:!0,name:"Enter Emoji By Name",help:"Replace emoji that you type by name with the character. :+1: becomes 👍."},i.prototype.setup_chat_input=function(){this.log("Hooking the Ember Chat Input controller.");var t=App.__container__.resolve("component:twitch-chat-input");if(t&&(this._modify_chat_input(t),this._roomv))for(var e=0;e<this._roomv._childViews.length;e++){var s=this._roomv._childViews[e];s instanceof t&&(this._modify_chat_input(s),s.ffzInit())}},i.prototype._modify_chat_input=function(e){var s=this;e.reopen({ffz_mru_index:-1,didInsertElement:function(){this._super();try{this.ffzInit()}catch(t){s.error("ChatInput didInsertElement: "+t)}},willClearRender:function(){try{this.ffzTeardown()}catch(t){s.error("ChatInput willClearRender: "+t)}return this._super()},ffzInit:function(){s._inputv=this;var t=this._ffz_minimal_style=document.createElement("style");t.id="ffz-minimal-chat-textarea-height",document.head.appendChild(t);var e=this.$("textarea");e.off("keydown"),e.on("keydown",this._ffzKeyDown.bind(this)),e.attr("rows",1),this.ffzResizeInput(),setTimeout(this.ffzResizeInput.bind(this),500)},ffzTeardown:function(){s._inputv===this&&(s._inputv=void 0),this.ffzResizeInput(),this._ffz_minimal_style&&(this._ffz_minimal_style.parentElement.removeChild(this._ffz_minimal_style),this._ffz_minimal_style=void 0);var t=this.$("textarea");t.attr("rows",void 0),t.off("keydown"),t.on("keydown",this._onKeyDown.bind(this))},ffzOnInput:function(){if(s._chat_style&&s.settings.minimal_chat&&!a){var t=Date.now(),e=t-(this._ffz_last_resize||0);e>500&&this.ffzResizeInput()}}.observes("textareaValue"),ffzResizeInput:function(){this._ffz_last_resize=Date.now();var t=this.get("element"),e=t&&t.querySelector("textarea");if(e&&s._chat_style&&s.settings.minimal_chat){this._ffz_minimal_style.innerHTML="body.ffz-minimal-chat .ember-chat .chat-interface .textarea-contain textarea { height: auto !important; }";var n=Math.max(32,Math.min(128,e.scrollHeight));this._ffz_minimal_style.innerHTML="body.ffz-minimal-chat .ember-chat .chat-interface .textarea-contain textarea { height: "+n+"px !important; }",n!==this._ffz_last_height&&(o.update_css(s._chat_style,"input_height","body.ffz-minimal-chat .ember-chat .chat-interface { height: "+n+"px !important; }body.ffz-minimal-chat .ember-chat .chat-messages, body.ffz-minimal-chat .ember-chat .chat-interface .emoticon-selector { bottom: "+n+"px !important; }"),s._roomv&&s._roomv.get("stuckToBottom")&&s._roomv._scrollToBottom()),this._ffz_last_height=n}},_ffzKeyDown:function(e){var n=e||t.event,i=n.charCode||n.keyCode;switch(i){case r.UP:case r.DOWN:if(n.shiftKey||n.shiftLeft||n.ctrlKey||n.metaKey)return;if(this.get("isShowingSuggestions"))n.preventDefault();else{if(!s.settings.input_mru)return this._onKeyDown(e);Ember.run.next(this.ffzCycleMRU.bind(this,i,d(this.get("chatTextArea"))))}break;case r.SPACE:if(!s.settings.input_quick_reply||2!==d(this.get("chatTextArea"))||"/r"!==this.get("textareaValue").substring(0,2))return this._onKeyDown(e);var o=this;Ember.run.next(function(){var t=o.get("uniqueWhisperSuggestions.0");if(t){var e="/w "+t+o.get("textareaValue").substr(2);o.set("_currentWhisperTarget",0),o.set("textareaValue",e),Ember.run.next(function(){u(o.get("chatTextArea"),4+t.length)})}});break;case r.COLON:case r.FAKE_COLON:if(s.settings.input_emoji&&(n.shiftKey||n.shiftLeft)){var o=this,a=d(this.get("chatTextArea"));return void(a>0&&Ember.run.next(function(){var t=o.get("textareaValue"),e=t.lastIndexOf(":",a-1);if(-1!==e&&-1!==a&&":"===t.charAt(a)){var n=t.substr(e+1,a-e-1),i=s.emoji_names[n],r=s.emoji_data[i];if(r){var d=t.substr(0,e)+r.raw;o.set("textareaValue",d+t.substr(a+1)),Ember.run.next(function(){u(o.get("chatTextArea"),d.length)})}}}))}return this._onKeyDown(e);case r.ENTER:n.shiftKey||n.shiftLeft||this.set("ffz_mru_index",-1);default:return this._onKeyDown(e)}},ffzCycleMRU:function(t,e){var s=d(this.get("chatTextArea"));if(e===s){var n=this.get("ffz_mru_index"),i=this._parentView.get("context.model.mru_list")||[];n=t===r.UP?(n+1)%(i.length+1):(n+i.length)%(i.length+1);var o=this.get("ffz_old_mru");(void 0===o||null===o)&&(o=this.get("textareaValue"),this.set("ffz_old_mru",o));var a=i[n];void 0===a&&(this.set("ffz_old_mru",void 0),a=o),this.set("ffz_mru_index",n),this.set("textareaValue",a)}},completeSuggestion:function(t){var e,s,n=this,o=this.get("textareaValue"),a=this.get("partialNameStartIndex");e=o.substring(0,a)+("/"===o.charAt(0)?t:i.get_capitalization(t)),s=o.substring(a+this.get("partialName").length),s||(e+=" "),this.set("textareaValue",e+s),this.set("isShowingSuggestions",!1),this.set("partialName",""),this.trackSuggestionsCompleted(),Ember.run.next(function(){u(n.get("chatTextArea"),e.length)})}})}},{"../constants":5,"../utils":35}],9:[function(e,s,n){var i=t.FrankerFaceZ,o=e("../utils"),a=e("../constants");i.basic_settings.cure_cancer={type:"boolean",category:"Chat",name:"Cure Cancer",help:"Destroys all cancerous chat messages before they can even be seen.",get:function(){return this.settings.remove_deleted&&this.settings.remove_bot_ban_notices&&+this.settings.chat_delay},set:function(t){this.settings.set("remove_deleted",t),this.settings.set("remove_bot_ban_notices",t),this.settings.set("chat_delay",t?""+(+this.settings.chat_delay||300):"0")}},i.settings_info.minimal_chat={type:"boolean",value:!1,category:"Chat Appearance",name:"Minimalistic Chat",help:"Hide all of the chat user interface, only showing messages and an input box.",on_update:function(t){if(document.body.classList.toggle("ffz-minimal-chat",t),this.settings.group_tabs&&this._chatv&&this._chatv._ffz_tabs){var e=this;setTimeout(function(){e._chatv&&e._chatv.$(".chat-room").css("top",e._chatv._ffz_tabs.offsetHeight+"px"),e._roomv&&e._roomv.get("stuckToBottom")&&e._roomv._scrollToBottom()},0)}this._chatv&&this._chatv.get("controller.showList")&&this._chatv.set("controller.showList",!1),!t&&this._chat_style?(this._inputv&&(this._inputv._ffz_minimal_style&&(this._inputv._ffz_minimal_style.innerHTML=""),this._inputv._ffz_last_height=void 0),o.update_css(this._chat_style,"input_height",""),this._roomv&&this._roomv.get("stuckToBottom")&&this._roomv._scrollToBottom()):this._inputv&&this._inputv.ffzResizeInput()}},i.settings_info.chat_delay={type:"select",options:{0:"No Delay",300:"Wait for bot auto-bans (300ms)",1200:"Wait for human mods (1200ms)",5e3:" (5000ms)"},value:0,category:"Chat Appearance",name:"Artificial Chat Delay",help:"Delay messages allowing moderators to ban them before you see them.",on_update:function(t){var e=document.querySelector("#ffz-stat-delay");e.title=o.number_commas(+t||300)+"ms of artifical chat delay added.",e.classList.toggle("hidden",!+t)}},i.settings_info.remove_deleted={type:"boolean",value:!1,no_bttv:!0,category:"Chat Filtering",name:"Remove Deleted Messages",help:"Remove deleted messages from chat entirely rather than leaving behind a clickable &lt;deleted message&gt;.",on_update:function(t){if(!this.has_bttv&&this.rooms&&t)for(var e in this.rooms){var s=this.rooms[e],n=s&&s.room;if(n)for(var i,o=n.get("messages"),a=o.get("length"),r=a;r--;){var d=o.get(r);d.ffz_deleted||d.deleted?(void 0===i&&(i=d.ffz_alternate),o.removeAt(r)):void 0===i?i=d.ffz_alternate:(i=!i,n.set("messages."+r+".ffz_alternate",i))}}}},i.settings_info.remove_bot_ban_notices={type:"boolean",value:!1,category:"Chat Filtering",name:"Remove Bot Ban Notices",help:"Remove messages from bots announcing who was banned for what reason and for how long."},i.settings_info.prevent_clear={type:"boolean",value:!1,no_bttv:!0,category:"Chat Filtering",name:"Show Deleted Messages",help:"Fade deleted messages instead of replacing them, and prevent chat from being cleared.",on_update:function(t){if(!this.has_bttv&&this.rooms)for(var e in this.rooms){var s=this.rooms[e],n=s&&s.room;n&&n.get("messages").forEach(function(e,s){t&&!e.ffz_deleted&&e.deleted?n.set("messages."+s+".deleted",!1):!e.ffz_deleted||t||e.deleted||n.set("messages."+s+".deleted",!0)})}}},i.settings_info.chat_history={type:"boolean",value:!0,visible:!1,category:"Chat Appearance",name:"Chat History <span>Alpha</span>",help:"Load previous chat messages when loading a chat room so you can see what people have been talking about. <b>This currently only works in a handful of channels due to server capacity.</b>"},i.settings_info.group_tabs={type:"boolean",value:!1,no_bttv:!0,category:"Chat Moderation",name:"Chat Room Tabs <span>Beta</span>",help:"Enhanced UI for switching the current chat room and noticing new messages.",on_update:function(t){var e=!this.has_bttv&&t;this._chatv&&e!==this._group_tabs_state&&(e?this._chatv.ffzEnableTabs():this._chatv.ffzDisableTabs())}},i.settings_info.pinned_rooms={value:[],visible:!1},i.settings_info.visible_rooms={value:[],visible:!1},i.prototype.setup_chatview=function(){document.body.classList.toggle("ffz-minimal-chat",this.settings.minimal_chat),this.log("Hooking the Ember Chat controller.");var t=App.__container__.lookup("controller:chat"),e=this;t&&t.reopen({ffzUpdateChannels:function(){e._chatv&&(e._chatv.ffzRebuildMenu(),e.settings.group_tabs&&e._chatv.ffzRebuildTabs())}.observes("currentChannelRoom","connectedPrivateGroupRooms"),removeCurrentChannelRoom:function(){if(!e.settings.group_tabs||e.has_bttv)return this._super();var t=this.get("currentChannelRoom"),s=t&&t.get("id"),n=e.get_user();e.settings.pinned_rooms&&-1!==e.settings.pinned_rooms.indexOf(s)||(t===this.get("currentRoom")&&this.blurRoom(),t&&n&&n.login===s&&t.destroy()),this.set("currentChannelRoom",void 0)}}),this.log("Hooking the Ember Chat view.");var t=App.__container__.resolve("view:chat");this._modify_cview(t);try{t.create().destroy()}catch(s){}for(var n in Ember.View.views)if(Ember.View.views.hasOwnProperty(n)){var i=Ember.View.views[n];if(i instanceof t){this.log("Manually updating existing Chat view.",i);try{i.ffzInit()}catch(s){this.error("setup: build_ui_link: "+s)}}}this.log("Hooking the Ember 'Right Column' controller. Seriously...");var o=App.__container__.lookup("controller:right-column");o&&o.reopen({ffzFixTabs:function(){e.settings.group_tabs&&e._chatv&&e._chatv._ffz_tabs&&setTimeout(function(){e._chatv&&e._chatv.$(".chat-room").css("top",e._chatv._ffz_tabs.offsetHeight+"px")},0)}.observes("firstTabSelected")})},i.prototype._modify_cview=function(t){var e=this;t.reopen({didInsertElement:function(){this._super();try{this.ffzInit()}catch(t){e.error("ChatView didInsertElement: "+t)}},willClearRender:function(){try{this.ffzTeardown()}catch(t){e.error("ChatView willClearRender: "+t)}this._super()},ffzInit:function(){e._chatv=this,this.$(".textarea-contain").append(e.build_ui_link(this)),this.$(".chat-messages").find(".html-tooltip").tipsy({live:!0,html:!0,gravity:jQuery.fn.tipsy.autoNS}),!e.has_bttv&&e.settings.group_tabs&&this.ffzEnableTabs(),this.ffzRebuildMenu(),setTimeout(function(){e.settings.group_tabs&&e._chatv&&e._chatv._ffz_tabs&&e._chatv.$(".chat-room").css("top",e._chatv._ffz_tabs.offsetHeight+"px");var t=e._chatv.get("controller");t&&t.set("showList",!1)},1e3)},ffzTeardown:function(){e._chatv===this&&(e._chatv=null),this.$(".textarea-contain .ffz-ui-toggle").remove(),e.settings.group_tabs&&this.ffzDisableTabs()},ffzChangeRoom:Ember.observer("controller.currentRoom",function(){e.update_ui_link();var t,s=this.get("controller.currentRoom");if(s&&s.resetUnreadCount(),this._ffz_chan_table&&(t=jQuery(this._ffz_chan_table),
t.children(".ffz-room-row").removeClass("active"),s&&t.children('.ffz-room-row[data-room="'+s.get("id")+'"]').addClass("active").children("span").text("")),this._ffz_group_table&&(t=jQuery(this._ffz_group_table),t.children(".ffz-room-row").removeClass("active"),s&&t.children('.ffz-room-row[data-room="'+s.get("id")+'"]').addClass("active").children("span").text("")),!e.has_bttv&&e.settings.group_tabs&&this._ffz_tabs){var n=jQuery(this._ffz_tabs);if(n.children(".ffz-chat-tab").removeClass("active"),s&&s._ffz_tab){s._ffz_tab.classList.remove("tab-mentioned"),s._ffz_tab.classList.remove("hidden"),s._ffz_tab.classList.add("active");var i=s._ffz_tab.querySelector("span");i&&(i.innerHTML="")}var o=s&&s.get("canInvite");this._ffz_invite&&this._ffz_invite.classList.toggle("hidden",!o),this.set("controller.showInviteUser",o&&this.get("controller.showInviteUser")),this.$(".chat-room").css("top",this._ffz_tabs.offsetHeight+"px")}}),ffzRebuildMenu:function(){return},ffzBuildRow:function(t,s,n,r){var d,u=document.createElement("tr"),c=document.createElement("td"),l=document.createElement("td"),h=document.createElement("td"),f=document.createElement("td"),m=s.get("isGroupRoom"),_=s===t.get("controller.currentRoom"),p=s.get("tmiRoom.displayName")||(m?s.get("tmiRoom.name"):i.get_capitalization(s.get("id"),function(t){e.log("Name for Row: "+t),l.innerHTML=o.sanitize(t)}));return l.className="ffz-room",l.innerHTML=o.sanitize(p),n?(c.innerHTML=a.CAMERA,c.title=l.title="Current Channel",c.className=l.className="tooltip"):r&&(c.innerHTML=a.EYE,c.title=l.title="Hosted Channel",c.className=l.className="tooltip"),h.className=f.className="ffz-row-switch",h.innerHTML='<a class="switch'+(-1!==e.settings.pinned_rooms.indexOf(s.get("id"))?" active":"")+'"><span></span></a>',f.innerHTML='<a class="switch'+(-1!==e.settings.visible_rooms.indexOf(s.get("id"))?" active":"")+'"><span></span></a>',u.setAttribute("data-room",s.get("id")),u.className="ffz-room-row",u.classList.toggle("current-channel",n),u.classList.toggle("host-channel",r),u.classList.toggle("group-chat",m),u.classList.toggle("active",_),u.appendChild(c),u.appendChild(l),m?(d=document.createElement("a"),d.className="leave-chat tooltip",d.innerHTML=a.CLOSE,d.title="Leave Group",l.appendChild(d),d.addEventListener("click",function(t){t.preventDefault(),t.stopPropagation&&t.stopPropagation(),confirm('Are you sure you want to leave the group room "'+p+'"?')&&s.get("isGroupRoom")&&s.del()})):(u.appendChild(h),d=h.querySelector("a.switch"),d.addEventListener("click",function(t){t.preventDefault(),t.stopPropagation&&t.stopPropagation();var n=s.get("id"),i=-1!==e.settings.pinned_rooms.indexOf(n);i?e._leave_room(n):e._join_room(n),this.classList.toggle("active",!i)})),u.appendChild(f),d=f.querySelector("a.switch"),d.addEventListener("click",function(n){n.preventDefault(),n.stopPropagation&&n.stopPropagation();var i=s.get("id"),o=e.settings.visible_rooms,a=-1!==o.indexOf(i);a?o.removeObject(i):o.push(i),e.settings.set("visible_rooms",o),this.classList.toggle("active",!a),t.ffzRebuildTabs()}),u.addEventListener("click",function(){var e=t.get("controller");e.focusRoom(s),e.set("showList",!1)}),u},ffzEnableTabs:function(){if(!e.has_bttv&&e.settings.group_tabs){this.$(".chat-header").addClass("hidden");var t=this._ffz_tabs=document.createElement("div");t.id="ffz-group-tabs",this.$(".chat-header").after(t),this.ffzRebuildTabs()}},ffzRebuildTabs:function(){if(!e.has_bttv&&e.settings.group_tabs){var t=this._ffz_tabs||this.get("element").querySelector("#ffz-group-tabs");if(t){t.innerHTML="";var s=document.createElement("a"),n=this;s.className="button glyph-only tooltip",s.title="Chat Room Management",s.innerHTML=a.ROOMS,s.addEventListener("click",function(){var t=n.get("controller");t&&t.set("showList",!t.get("showList"))}),t.appendChild(s),s=document.createElement("a"),s.className="button glyph-only tooltip invite",s.title="Invite a User",s.innerHTML=a.INVITE,s.addEventListener("click",function(){var t=n.get("controller");t&&t.set("showInviteUser",t.get("currentRoom.canInvite")&&!t.get("showInviteUser"))}),s.classList.toggle("hidden",!this.get("controller.currentRoom.canInvite")),n._ffz_invite=s,t.appendChild(s);var i,o=this.get("controller.currentChannelRoom");o&&(i=this.ffzBuildTab(n,o,!0),i&&t.appendChild(i));var r=App.__container__.lookup("controller:channel"),d=App.__container__.resolve("model:room");if(target=r&&r.get("hostModeTarget"),target&&d){var u=target.get("id");this._ffz_host!==u&&(-1===e.settings.pinned_rooms.indexOf(this._ffz_host)&&this._ffz_host_room&&(this.get("controller.currentRoom")===this._ffz_host_room&&this.get("controller").blurRoom(),this._ffz_host_room.destroy()),this._ffz_host=u,this._ffz_host_room=d.findOne(u))}else this._ffz_host&&(-1===e.settings.pinned_rooms.indexOf(this._ffz_host)&&this._ffz_host_room&&(this.get("controller.currentRoom")===this._ffz_host_room&&this.get("controller").blurRoom(),this._ffz_host_room.destroy()),delete this._ffz_host,delete this._ffz_host_room);this._ffz_host_room&&(i=n.ffzBuildTab(n,this._ffz_host_room,!1,!0),i&&t.appendChild(i));for(var c=0;c<e.settings.pinned_rooms.length;c++){var l=e.settings.pinned_rooms[c];if(o&&o.get("id")!==l&&this._ffz_host!==l&&e.rooms[l]&&e.rooms[l].room){var i=n.ffzBuildTab(n,e.rooms[l].room,!1,!1);i&&t.appendChild(i)}}_.each(this.get("controller.connectedPrivateGroupRooms"),function(e){var s=n.ffzBuildTab(n,e);s&&t.appendChild(s)}),this.$(".chat-room").css("top",t.offsetHeight+"px")}}},ffzTabUnread:function(t){if(!e.has_bttv&&e.settings.group_tabs){var s=this._ffz_tabs||this.get("element").querySelector("#ffz-group-tabs"),n=this.get("controller.currentRoom.id");if(s){if(t){var i=e.rooms&&e.rooms[t]&&e.rooms[t].room,a=i&&i._ffz_tab;if(a){var r=o.format_unread(t===n?0:i.get("unreadCount"));a.querySelector("span").innerHTML=r}}for(var d=s.querySelectorAll(".ffz-chat-tab"),u=0;u<d.length;u++){var a=d[u],t=a.getAttribute("data-room"),i=e.rooms&&e.rooms[t]&&e.rooms[t];if(i){var r=o.format_unread(t===n?0:i.room.get("unreadCount"));a.querySelector("span").innerHTML=r}}}}},ffzBuildTab:function(t,s,n,r){{var d,u,c=document.createElement("span"),l="",h=s.get("id"),f=s.get("isGroupRoom"),m=s===t.get("controller.currentRoom");m||-1!==e.settings.visible_rooms.indexOf(h)}return c.setAttribute("data-room",s.id),c.className="ffz-chat-tab tooltip",c.classList.toggle("current-channel",n),c.classList.toggle("host-channel",r),c.classList.toggle("group-chat",f),c.classList.toggle("active",m),u=o.format_unread(m?0:s.get("unreadCount")),d=s.get("tmiRoom.displayName")||(f?s.get("tmiRoom.name"):i.get_capitalization(s.get("id"),function(t){u=o.format_unread(m?0:s.get("unreadCount")),c.innerHTML=l+o.sanitize(t)+"<span>"+u+"</span>"})),n?(l=a.CAMERA,c.title="Current Channel"):r?(l=a.EYE,c.title="Hosted Channel"):c.title=f?"Group Chat":"Pinned Channel",c.innerHTML=l+o.sanitize(d)+"<span>"+u+"</span>",c.addEventListener("click",function(){var e=t.get("controller");e.focusRoom(s),e.set("showList",!1)}),s._ffz_tab=c,c},ffzDisableTabs:function(){this._ffz_tabs&&(this._ffz_tabs.parentElement.removeChild(this._ffz_tabs),delete this._ffz_tabs,delete this._ffz_invite),this._ffz_host&&(-1===e.settings.pinned_rooms.indexOf(this._ffz_host)&&this._ffz_host_room&&(this.get("controller.currentRoom")===this._ffz_host_room&&this.get("controller").blurRoom(),this._ffz_host_room.destroy()),delete this._ffz_host,delete this._ffz_host_room),this.$(".chat-room").css("top",""),this.$(".chat-header").removeClass("hidden")}})},i.prototype.connect_extra_chat=function(){var t=this.get_user();if(t&&t.login&&(!this.rooms[t.login]||this.rooms[t.login].room)){var e=App.__container__.resolve("model:room");e&&e.findOne(t.login)}if(!this.has_bttv){for(var s=0;s<this.settings.pinned_rooms.length;s++)this._join_room(this.settings.pinned_rooms[s],!0);this._chatv&&(!this.has_bttv&&this.settings.group_tabs&&this._chatv.ffzRebuildTabs(),this._chatv.ffzRebuildMenu())}},i.prototype._join_room=function(t,e){var s=!1;if(-1===this.settings.pinned_rooms.indexOf(t)&&(this.settings.pinned_rooms.push(t),this.settings.set("pinned_rooms",this.settings.pinned_rooms),s=!0),this.rooms[t]&&this.rooms[t].room)return s&&!e&&!this.has_bttv&&this._chatv&&this.settings.group_tabs&&this._chatv.ffzRebuildTabs(),s;{var n=App.__container__.resolve("model:room");n&&n.findOne(t)}return!e&&!this.has_bttv&&this._chatv&&this.settings.group_tabs&&this._chatv.ffzRebuildTabs(),!e&&this._chatv&&this._chatv.ffzRebuildMenu(),s},i.prototype._leave_room=function(t,e){var s=!1;if(-1!==this.settings.pinned_rooms.indexOf(t)&&(this.settings.pinned_rooms.removeObject(t),this.settings.set("pinned_rooms",this.settings.pinned_rooms),s=!0),!this.rooms[t]||!this.rooms[t].room)return s;var n=App.__container__.lookup("controller:chat"),i=this.rooms[t].room,o=this.get_user();return!n||n.get("currentChannelRoom.id")===t||this._chatv&&this._chatv._ffz_host===t?s:(n.get("currentRoom.id")===t&&n.blurRoom(),o&&o.login===t||i.destroy(),!e&&!this.has_bttv&&this._chatv&&this.settings.group_tabs&&this._chatv.ffzRebuildTabs(),!e&&this._chatv&&this._chatv.ffzRebuildMenu(),s)},i.chat_commands.join=function(t,e){if(!e||!e.length||e.length>1)return"Join Usage: /join <channel>";var s=e[0].toLowerCase();return"#"===s.charAt(0)&&(s=s.substr(1)),this._join_room(s)?"Joining "+s+". You will always connect to this channel's chat unless you later /part from it.":"You have already joined "+s+'. Please use "/part '+s+'" to leave it.'},i.chat_commands.part=function(t,e){if(!e||!e.length||e.length>1)return"Part Usage: /part <channel>";var s=e[0].toLowerCase();return"#"===s.charAt(0)&&(s=s.substr(1)),this._leave_room(s)?"Leaving "+s+".":this.rooms[s]?"You do not have "+s+" pinned and you cannot leave the current channel or hosted channels via /part.":"You are not in "+s+"."}},{"../constants":5,"../utils":35}],10:[function(e,s,n){var i=t.FrankerFaceZ;i.settings_info.swap_sidebars={type:"boolean",value:!1,category:"Appearance",no_mobile:!0,no_bttv:!0,name:"Swap Sidebar Positions",help:"Swap the positions of the left and right sidebars, placing chat on the left.",on_update:function(t){this.has_bttv||(document.body.classList.toggle("ffz-sidebar-swap",t),this._fix_menu_position())}},i.settings_info.right_column_width={type:"button",value:340,category:"Appearance",no_mobile:!0,no_bttv:!0,name:"Right Sidebar Width",help:"Set the width of the right sidebar for chat.",method:function(){var t=this.settings.right_column_width||340,e=prompt("Right Sidebar Width\n\nPlease enter a new width for the right sidebar, in pixels. Minimum: 250, Default: 340",t);if(null!==e&&void 0!==e){var s=parseInt(e);s&&s!==0/0||(s=340),this.settings.set("right_column_width",Math.max(250,s))}},on_update:function(t){if(!this.has_bttv){var e=App.__container__.lookup("controller:layout");e&&(e.set("rightColumnWidth",t),Ember.propertyDidChange(e,"contentWidth"))}}},i.prototype.setup_layout=function(){if(!this.has_bttv){document.body.classList.toggle("ffz-sidebar-swap",this.settings.swap_sidebars),this.log("Creating layout style element.");var t=this._layout_style=document.createElement("style");t.id="ffz-layout-css",document.head.appendChild(t),this.log("Hooking the Ember Layout controller.");var e=App.__container__.lookup("controller:layout"),s=this;e&&(e.reopen({rightColumnWidth:340,isTooSmallForRightColumn:function(){return this.get("windowWidth")<1090-this.get("rightColumnWidth")}.property("windowWidth","rightColumnWidth"),contentWidth:function(){var t=this.get("isLeftColumnClosed")?50:240,e=this.get("isRightColumnClosed")?0:this.get("rightColumnWidth");return this.get("windowWidth")-t-e-60}.property("windowWidth","isRightColumnClosed","isLeftColumnClosed","rightColumnWidth"),ffzUpdateCss:function(){var t=this.get("rightColumnWidth");s._layout_style.innerHTML="#main_col.expandRight #right_close { left: none !important; } #right_col { width: "+t+"px; } body:not(.ffz-sidebar-swap) #main_col:not(.expandRight) { margin-right: "+t+"px; } body.ffz-sidebar-swap #main_col:not(.expandRight) { margin-left: "+t+"px; }"}.observes("rightColumnWidth"),ffzFixTabs:function(){s.settings.group_tabs&&s._chatv&&s._chatv._ffz_tabs&&setTimeout(function(){s._chatv&&s._chatv.$(".chat-room").css("top",s._chatv._ffz_tabs.offsetHeight+"px")},0)}.observes("isRightColumnClosed","rightColumnWidth")}),e.set("rightColumnWidth",this.settings.right_column_width),Ember.propertyDidChange(e,"contentWidth"))}}},{}],11:[function(e,s,n){var i=t.FrankerFaceZ,o=e("../utils"),a=(e("../constants"),"[\\s`~<>!-#%-\\x2A,-/:;\\x3F@\\x5B-\\x5D_\\x7B}\\u00A1\\u00A7\\u00AB\\u00B6\\u00B7\\u00BB\\u00BF\\u037E\\u0387\\u055A-\\u055F\\u0589\\u058A\\u05BE\\u05C0\\u05C3\\u05C6\\u05F3\\u05F4\\u0609\\u060A\\u060C\\u060D\\u061B\\u061E\\u061F\\u066A-\\u066D\\u06D4\\u0700-\\u070D\\u07F7-\\u07F9\\u0830-\\u083E\\u085E\\u0964\\u0965\\u0970\\u0AF0\\u0DF4\\u0E4F\\u0E5A\\u0E5B\\u0F04-\\u0F12\\u0F14\\u0F3A-\\u0F3D\\u0F85\\u0FD0-\\u0FD4\\u0FD9\\u0FDA\\u104A-\\u104F\\u10FB\\u1360-\\u1368\\u1400\\u166D\\u166E\\u169B\\u169C\\u16EB-\\u16ED\\u1735\\u1736\\u17D4-\\u17D6\\u17D8-\\u17DA\\u1800-\\u180A\\u1944\\u1945\\u1A1E\\u1A1F\\u1AA0-\\u1AA6\\u1AA8-\\u1AAD\\u1B5A-\\u1B60\\u1BFC-\\u1BFF\\u1C3B-\\u1C3F\\u1C7E\\u1C7F\\u1CC0-\\u1CC7\\u1CD3\\u2010-\\u2027\\u2030-\\u2043\\u2045-\\u2051\\u2053-\\u205E\\u207D\\u207E\\u208D\\u208E\\u2329\\u232A\\u2768-\\u2775\\u27C5\\u27C6\\u27E6-\\u27EF\\u2983-\\u2998\\u29D8-\\u29DB\\u29FC\\u29FD\\u2CF9-\\u2CFC\\u2CFE\\u2CFF\\u2D70\\u2E00-\\u2E2E\\u2E30-\\u2E3B\\u3001-\\u3003\\u3008-\\u3011\\u3014-\\u301F\\u3030\\u303D\\u30A0\\u30FB\\uA4FE\\uA4FF\\uA60D-\\uA60F\\uA673\\uA67E\\uA6F2-\\uA6F7\\uA874-\\uA877\\uA8CE\\uA8CF\\uA8F8-\\uA8FA\\uA92E\\uA92F\\uA95F\\uA9C1-\\uA9CD\\uA9DE\\uA9DF\\uAA5C-\\uAA5F\\uAADE\\uAADF\\uAAF0\\uAAF1\\uABEB\\uFD3E\\uFD3F\\uFE10-\\uFE19\\uFE30-\\uFE52\\uFE54-\\uFE61\\uFE63\\uFE68\\uFE6A\\uFE6B\\uFF01-\\uFF03\\uFF05-\\uFF0A\\uFF0C-\\uFF0F\\uFF1A\\uFF1B\\uFF1F\\uFF20\\uFF3B-\\uFF3D\\uFF3F\\uFF5B\\uFF5D\\uFF5F-\\uFF65]"),r=new RegExp(a+"*,"+a+"*");i.settings_info.room_status={type:"boolean",value:!0,category:"Chat Appearance",no_bttv:!0,name:"Room Status Indicators",help:"Display the current room state (slow mode, sub mode, and r9k mode) next to the Chat button.",on_update:function(){this._roomv&&this._roomv.ffzUpdateStatus()}},i.settings_info.line_purge_icon={type:"boolean",value:!1,no_bttv:!0,category:"Chat Moderation",name:"Purge Icon in Mod Icons",help:"Display a Purge Icon in chat line Mod Icons for quickly purging users.",on_update:function(t){this.has_bttv||document.body.classList.toggle("ffz-chat-purge-icon",t)}},i.settings_info.replace_bad_emotes={type:"boolean",value:!0,category:"Chat Appearance",no_bttv:!0,name:"Fix Low Quality Twitch Global Emoticons",help:"Replace emoticons such as DansGame and RedCoat with cleaned up versions that don't have pixels around the edges or white backgrounds for nicer display on dark chat."},i.settings_info.parse_emoji={type:"boolean",value:!0,category:"Chat Appearance",name:"Replace Emoji with Images",help:"Replace emoji in chat messages with nicer looking images from the open-source Twitter Emoji project."},i.settings_info.room_status={type:"boolean",value:!0,category:"Chat Appearance",no_bttv:!0,name:"Room Status Indicators",help:"Display the current room state (slow mode, sub mode, and r9k mode) next to the Chat button.",on_update:function(){this._roomv&&this._roomv.ffzUpdateStatus()}},i.settings_info.scrollback_length={type:"button",value:150,category:"Chat Appearance",no_bttv:!0,name:"Scrollback Length",help:"Set the maximum number of lines to keep in chat.",method:function(){var t=prompt("Scrollback Length\n\nPlease enter a new maximum length for the chat scrollback. Default: 150\n\nNote: Making this too large will cause your browser to lag.",this.settings.scrollback_length);if(null!==t&&void 0!==t&&(t=parseInt(t),t!==0/0)){10>t&&(t=10),this.settings.set("scrollback_length",t);var e=App.__container__.lookup("controller:chat"),s=e&&e.get("currentRoom.id");for(var n in this.rooms){var i=this.rooms[n];i.room.set("messageBufferSize",t+(this._roomv&&!this._roomv.get("stuckToBottom")&&s===n?150:0))}}}},i.settings_info.hosted_sub_notices={type:"boolean",value:!0,category:"Chat Filtering",no_bttv:!0,name:"Show Hosted Channel Subscriber Notices",help:"Display notices in chat when someone subscribes to the hosted channel."},i.settings_info.banned_words={type:"button",value:[],category:"Chat Filtering",no_bttv:!0,name:"Banned Words",help:"Set a list of words that will be locally removed from chat messages.",method:function(){var t=this.settings.banned_words.join(", "),e=prompt("Banned Words\n\nPlease enter a comma-separated list of words that you would like to be removed from chat messages.",t);if(null!==e&&void 0!==e){e=e.trim().split(r);for(var s=[],n=0;n<e.length;n++)e[n]&&s.push(e[n]);1==s.length&&"disable"==s[0]&&(s=[]),this.settings.set("banned_words",s)}}},i.settings_info.keywords={type:"button",value:[],category:"Chat Filtering",no_bttv:!0,name:"Highlight Keywords",help:"Set additional keywords that will be highlighted in chat.",method:function(){var t=this.settings.keywords.join(", "),e=prompt("Highlight Keywords\n\nPlease enter a comma-separated list of words that you would like to be highlighted in chat.",t);if(null!==e&&void 0!==e){e=e.trim().split(r);for(var s=[],n=0;n<e.length;n++)e[n]&&s.push(e[n]);1==s.length&&"disable"==s[0]&&(s=[]),this.settings.set("keywords",s)}}},i.settings_info.clickable_emoticons={type:"boolean",value:!1,category:"Chat Tooltips",no_bttv:!0,no_mobile:!0,name:"Emoticon Information Pages",help:"When enabled, holding shift and clicking on an emoticon will open it on the FrankerFaceZ website or Twitch Emotes."},i.settings_info.link_info={type:"boolean",value:!0,category:"Chat Tooltips",no_bttv:!0,name:"Link Information <span>Beta</span>",help:"Check links against known bad websites, unshorten URLs, and show YouTube info."},i.settings_info.link_image_hover={type:"boolean",value:!1,category:"Chat Tooltips",no_bttv:!0,no_mobile:!0,name:"Image Preview",help:"Display image thumbnails for links to Imgur and YouTube."},i.settings_info.image_hover_all_domains={type:"boolean",value:!1,category:"Chat Tooltips",no_bttv:!0,no_mobile:!0,name:"Image Preview - All Domains",help:"<i>Requires Image Preview.</i> Attempt to show an image preview for any URL ending in the appropriate extension. <b>Warning: This may be used to leak your IP address to malicious users.</b>"},i.settings_info.legacy_badges={type:"boolean",value:!1,category:"Chat Appearance",name:"Legacy Badges",help:"Display the old, pre-vector chat badges from Twitch.",on_update:function(t){document.body.classList.toggle("ffz-legacy-badges",t)}},i.settings_info.chat_rows={type:"boolean",value:!1,category:"Chat Appearance",no_bttv:!0,name:"Chat Line Backgrounds",help:"Display alternating background colors for lines in chat.",on_update:function(t){document.body.classList.toggle("ffz-chat-background",!this.has_bttv&&t)}},i.settings_info.chat_separators={type:"select",options:{0:"Disabled",1:"Basic Line (1px solid)",2:"3D Line (2px groove)"},value:"0",category:"Chat Appearance",no_bttv:!0,process_value:function(t){return t===!1?"0":t===!0?"1":t},name:"Chat Line Separators",help:"Display thin lines between chat messages for further visual separation.",on_update:function(t){document.body.classList.toggle("ffz-chat-separator",!this.has_bttv&&"0"!==t),document.body.classList.toggle("ffz-chat-separator-3d",!this.has_bttv&&"2"===t)}},i.settings_info.chat_padding={type:"boolean",value:!1,category:"Chat Appearance",no_bttv:!0,name:"Reduced Chat Line Padding",help:"Reduce the amount of padding around chat messages to fit more on-screen at once.",on_update:function(t){document.body.classList.toggle("ffz-chat-padding",!this.has_bttv&&t)}},i.settings_info.high_contrast_chat={type:"select",options:{222:"Disabled",212:"Bold",221:"Text",211:"Text + Bold",122:"Background",121:"Background + Text",112:"Background + Bold",111:"All"},value:"222",category:"Chat Appearance",no_bttv:!0,name:"High Contrast",help:"Display chat using white and black for maximum contrast. This is suitable for capturing and chroma keying chat to display on stream.",process_value:function(t){return t===!1?"222":t===!0?"111":t},on_update:function(t){document.body.classList.toggle("ffz-high-contrast-chat-text",!this.has_bttv&&"1"===t[2]),document.body.classList.toggle("ffz-high-contrast-chat-bold",!this.has_bttv&&"1"===t[1]),document.body.classList.toggle("ffz-high-contrast-chat-bg",!this.has_bttv&&"1"===t[0])}},i.settings_info.chat_font_size={type:"button",value:12,category:"Chat Appearance",no_bttv:!0,name:"Font Size",help:"Make the chat font bigger or smaller.",method:function(){var t=this.settings.chat_font_size,e=prompt("Chat Font Size\n\nPlease enter a new size for the chat font. The default is 12.",t);if(null!==e&&void 0!==e){var s=parseInt(e);(!s||s===0/0||1>s)&&(s=12),this.settings.set("chat_font_size",s)}},on_update:function(t){if(!this.has_bttv&&this._chat_style){var e;if(12!==t&&t){var s=Math.max(20,Math.round(20/12*t)),n=Math.floor((s-20)/2);e=".ember-chat .chat-messages .chat-line { font-size: "+t+"px !important; line-height: "+s+"px !important; }",n&&(e+=".ember-chat .chat-messages .chat-line .mod-icons, .ember-chat .chat-messages .chat-line .badges { padding-top: "+n+"px; }")}else e="";o.update_css(this._chat_style,"chat_font_size",e),i.settings_info.chat_ts_size.on_update.bind(this)(this.settings.chat_ts_size)}}},i.settings_info.chat_ts_size={type:"button",value:null,category:"Chat Appearance",no_bttv:!0,name:"Timestamp Font Size",help:"Make the chat timestamp font bigger or smaller.",method:function(){var t=this.settings.chat_ts_size;t||(t=this.settings.chat_font_size);var e=prompt("Chat Timestamp Font Size\n\nPlease enter a new size for the chat timestamp font. The default is to match the regular chat font size.",t);if(null!==e&&void 0!==e){var s=parseInt(e);(!s||s===0/0||1>s)&&(s=null),this.settings.set("chat_ts_size",s)}},on_update:function(t){if(!this.has_bttv&&this._chat_style){var e;if(null===t)e="";else{var s=Math.max(20,Math.round(20/12*t),Math.round(20/12*this.settings.chat_font_size));e=".ember-chat .chat-messages .timestamp { font-size: "+t+"px !important; line-height: "+s+"px !important; }"}o.update_css(this._chat_style,"chat_ts_font_size",e)}}},i.prototype.setup_line=function(){jQuery(document.body).on("mouseleave",".tipsy",function(){this.parentElement.removeChild(this)});try{this.aliases=JSON.parse(localStorage.ffz_aliases||"{}")}catch(t){this.log("Error Loading Aliases: "+t),this.aliases={}}var e=this._chat_style=document.createElement("style");e.id="ffz-style-chat",e.type="text/css",document.head.appendChild(e),i.settings_info.chat_font_size.on_update.bind(this)(this.settings.chat_font_size),document.body.classList.toggle("ffz-chat-colors",!this.has_bttv&&"-1"!==this.settings.fix_color),document.body.classList.toggle("ffz-chat-colors-gray",!this.has_bttv&&"-1"===this.settings.fix_color),document.body.classList.toggle("ffz-legacy-badges",this.settings.legacy_badges),document.body.classList.toggle("ffz-chat-background",!this.has_bttv&&this.settings.chat_rows),document.body.classList.toggle("ffz-chat-separator",!this.has_bttv&&"0"!==this.settings.chat_separators),document.body.classList.toggle("ffz-chat-separator-3d",!this.has_bttv&&"2"===this.settings.chat_separators),document.body.classList.toggle("ffz-chat-padding",!this.has_bttv&&this.settings.chat_padding),document.body.classList.toggle("ffz-chat-purge-icon",!this.has_bttv&&this.settings.line_purge_icon),document.body.classList.toggle("ffz-high-contrast-chat-text",!this.has_bttv&&"1"===this.settings.high_contrast_chat[2]),document.body.classList.toggle("ffz-high-contrast-chat-bold",!this.has_bttv&&"1"===this.settings.high_contrast_chat[1]),document.body.classList.toggle("ffz-high-contrast-chat-bg",!this.has_bttv&&"1"===this.settings.high_contrast_chat[0]),this._last_row={},this.log("Hooking the Ember Whisper Line component.");var s=App.__container__.resolve("component:whisper-line");s&&this._modify_line(s),this.log("Hooking the Ember Message Line component.");var n=App.__container__.resolve("component:message-line");n&&this._modify_line(n);var o=this.get_user();o&&o.name&&(i.capitalization[o.login]=[o.name,Date.now()])},i.prototype.save_aliases=function(){this.log("Saving "+Object.keys(this.aliases).length+" aliases to local storage."),localStorage.ffz_aliases=JSON.stringify(this.aliases)},i.prototype._modify_line=function(e){var s=this,n=App.__container__.lookup("controller:layout"),a=App.__container__.lookup("controller:settings");e.reopen({tokenizedMessage:function(){var t=this.get("msgObject.cachedTokens");if(t)return t;t=this._super();var e=performance.now(),n=s.get_user(),o=n&&this.get("msgObject.from")===n.login;t=s._remove_banned(t),t=s._emoticonize(this,t),s.settings.parse_emoji&&(t=s.tokenize_emoji(t));var a=this.get("msgObject.tags.display-name");a&&a.length&&(i.capitalization[this.get("msgObject.from")]=[a.trim(),Date.now()]),o||(t=s.tokenize_mentions(t));for(var r=0;r<t.length;r++){var d=t[r];if(!_.isString(d)&&d.mentionedUser&&!d.own){this.set("msgObject.ffz_has_mention",!0);break}}var u=performance.now();return u-e>5&&s.log("Tokenizing Message Took Too Long - "+(u-e)+"ms",t,!1,!0),this.set("msgObject.cachedTokens",t),t}.property("msgObject.message","isChannelLinksDisabled","currentUserNick","msgObject.from","msgObject.tags.emotes"),ffzUpdated:Ember.observer("msgObject.ffz_deleted","msgObject.ffz_old_messages",function(){this.rerender()}),click:function(e){if(e.target&&e.target.classList.contains("ffz-old-messages"))return s._show_deleted(this.get("msgObject.room"));if(e.target&&e.target.classList.contains("deleted-link"))return s._deleted_link_click.bind(e.target)(e);if(e.target&&e.target.classList.contains("mod-icon")&&(jQuery(e.target).trigger("mouseout"),e.target.classList.contains("purge"))){var n=this.get("msgObject.from"),i=this.get("msgObject.room"),o=i&&s.rooms[i]&&s.rooms[i].room;return void(o&&(o.send("/timeout "+n+" 1"),o.clearMessages(n)))}if((e.shiftKey||e.shiftLeft)&&s.settings.clickable_emoticons&&e.target&&e.target.classList.contains("emoticon")){var a=e.target.getAttribute("data-emote");a?t.open("https://twitchemotes.com/emote/"+a):(a=e.target.getAttribute("data-ffz-emote"),t.open("https://www.frankerfacez.com/emoticons/"+a))}return this._super(e)},ffzUserLevel:function(){return this.get("isStaff")?5:this.get("isAdmin")?4:this.get("isBroadcaster")?3:this.get("isGlobalModerator")?2:this.get("isModerator")?1:0}.property("msgObject.labels.[]"),render:function(t){var e=this.get("msgObject.deleted"),i={},r=this.get("msgObject.from"),d=this.get("msgObject.room"),u=s.rooms&&s.rooms[d],c=this.get("msgObject.to"),l=c&&c.length,h=this.get("ffzUserLevel"),f=u&&u.room&&u.room.get("ffzUserLevel")||0,m=this.get("msgObject.ffz_alternate"),_=this.get("msgObject.color"),p=_&&s._handle_color(_),g=n&&n.get("isTheatreMode")||a&&a.get("model.darkMode");void 0===m&&(m=s._last_row[d]=s._last_row.hasOwnProperty(d)?!s._last_row[d]:!1,this.set("msgObject.ffz_alternate",m)),t.push('<div class="indicator"></div>'),t.push('<span class="timestamp float-left">'+this.get("timestamp")+"</span> "),!l&&f>h&&(t.push('<span class="mod-icons float-left">'),t.push(e?'<a class="mod-icon float-left tooltip unban" title="Unban User" href="#">Unban</a>':'<a class="mod-icon float-left tooltip ban" title="Ban User" href="#">Ban</a>'),t.push('<a class="mod-icon float-left tooltip timeout" title="Timeout User (10m)" href="#">Timeout</a>'),t.push('<a class="mod-icon float-left tooltip purge" title="Purge User (Timeout 1s)" href="#">Purge</a>'),t.push("</span>")),!l&&this.get("isBroadcaster")?i[0]={klass:"broadcaster",title:"Broadcaster"}:this.get("isStaff")?i[0]={klass:"staff",title:"Staff"}:this.get("isAdmin")?i[0]={klass:"admin",title:"Admin"}:this.get("isGlobalMod")?i[0]={klass:"global-moderator",title:"Global Moderator"}:!l&&this.get("isModerator")&&(i[0]={klass:"moderator",title:"Moderator"}),!l&&this.get("isSubscriber")&&(i[10]={klass:"subscriber",title:"Subscriber"}),this.get("hasTurbo")&&(i[15]={klass:"turbo",title:"Turbo"}),i=s.render_badges(this,i),t.push('<span class="badges float-left">');for(var v in i){var b=i[v],y=b.image?"background-image:url(&quot;"+b.image+"&quot;);":"";b.color&&(y+="background-color:"+b.color+";"),b.extra_css&&(y+=b.extra_css),t.push('<div class="badge float-left tooltip '+b.klass+'"'+(y?' style="'+y+'"':"")+' title="'+b.title+'"></div>')}t.push("</span>");var w=s.aliases[r],z=this.get("msgObject.tags.display-name")||r&&r.capitalize()||"unknown user",k=p&&"color:"+(g?p[1]:p[0]),C=k?" has-color":"";if(t.push(w?'<span class="from ffz-alias tooltip'+C+'" style="'+k+(p?'" data-color="'+_:"")+'" title="'+o.sanitize(z)+'">'+o.sanitize(w)+"</span>":'<span class="from'+C+'" style="'+k+(p?'" data-color="'+_:"")+'">'+o.sanitize(z)+"</span>"),l){var E=s.aliases[c],x=this.get("msgObject.tags.recipient-display-name")||c&&c.capitalize()||"unknown user",T=this.get("msgObject.toColor"),L=T&&s._handle_color(T),M=T&&"color:"+(g?L[1]:L[0]),S=M?" has-color":"";this._renderWhisperArrow(t),t.push(E?'<span class="to ffz-alias tooltip'+S+'" style="'+M+(T?'" data-color="'+T:"")+'" title="'+o.sanitize(x)+'">'+o.sanitize(E)+"</span>":'<span class="to'+S+'" style="'+M+(L?'" data-color="'+T:"")+'">'+o.sanitize(x)+"</span>")}if(t.push('<span class="colon">:</span> '),"action"!==this.get("msgObject.style")&&(k="",C=""),e)t.push('<span class="deleted"><a class="undelete" href="#">&lt;message deleted&gt;</a></span>');else{t.push('<span class="message'+C+'" style="'+k+'">'),t.push(s.render_tokens(this.get("tokenizedMessage"),!0));var A=this.get("msgObject.ffz_old_messages");A&&A.length&&t.push('<div class="button primary float-right ffz-old-messages">Show '+o.number_commas(A.length)+" Old</div>"),t.push("</span>")}},classNameBindings:["msgObject.ffz_alternate:ffz-alternate","msgObject.ffz_has_mention:ffz-mentioned","ffzWasDeleted:ffz-deleted","ffzHasOldMessages:clearfix","ffzHasOldMessages:ffz-has-deleted"],ffzWasDeleted:function(){return s.settings.prevent_clear&&this.get("msgObject.ffz_deleted")}.property("msgObject.ffz_deleted"),ffzHasOldMessages:function(){var t=this.get("msgObject.ffz_old_messages");return t&&t.length}.property("msgObject.ffz_old_messages"),didInsertElement:function(){this._super();var t=this.get("element");t.setAttribute("data-room",this.get("msgObject.room")),t.setAttribute("data-sender",this.get("msgObject.from")),t.setAttribute("data-deleted",this.get("msgObject.deleted")||!1)}})},i.capitalization={},i._cap_fetching=0,i.get_capitalization=function(t,e){if(!t)return t;if(t=t.toLowerCase(),"jtv"==t||"twitchnotify"==t)return t;var s=i.capitalization[t];return s&&Date.now()-s[1]<36e5?s[0]:(i._cap_fetching<25&&(i._cap_fetching++,i.get().ws_send("get_display_name",t,function(s,n){var o=s?n:t;i.capitalization[t]=[o,Date.now()],i._cap_fetching--,"function"==typeof e&&e(o)})),s?s[0]:t)},i.prototype._remove_banned=function(t){var e=this.settings.banned_words,s=["j.mp","bit.ly"],n=e&&e.length;if(!(n||s&&s.length))return t;"string"==typeof t&&(t=[t]);for(var o=i._words_to_regex(e),a=i._words_to_regex(s),r=[],d=0;d<t.length;d++){var u=t[d];r.push(_.isString(u)?n?u.replace(o,"$1***"):u:u.emoticonSrc&&n&&o.test(u.altText)?u.altText.replace(o,"$1***"):u.isLink&&n&&o.test(u.href)?{isLink:!0,href:u.href,isDeleted:!0,isLong:!1,censoredHref:u.href.replace(o,"$1***")}:u.isLink&&a.test(u.href)?{isLink:!0,href:u.href,isDeleted:!0,isLong:!1,censoredHref:u.href.replace(a,"$1***")}:u)}return r},i.prototype._emoticonize=function(t,e){var s=t.get("msgObject.room"),n=t.get("msgObject.from");return this.tokenize_emotes(n,s,e)}},{"../constants":5,"../utils":35}],12:[function(e,s,n){var i,o=t.FrankerFaceZ,a=e("../utils"),r=e("../constants"),d={ESC:27,P:80,B:66,T:84,U:85},u='<svg class="svg-messages" height="16px" version="1.1" viewBox="0 0 18 18" width="16px" x="0px" y="0px"><path clip-rule="evenodd" d="M1,15V3h16v12H1z M15.354,5.354l-0.707-0.707L9,10.293L3.354,4.646L2.646,5.354L6.293,9l-3.646,3.646l0.707,0.707L7,9.707l1.646,1.646h0.707L11,9.707l3.646,3.646l0.707-0.707L11.707,9L15.354,5.354z" fill-rule="evenodd"></path></svg>',c='<svg class="svg-unban" height="16px" version="1.1" viewBox="0 0 16 16" width="16px" x="0px" y="0px"><path fill-rule="evenodd" clip-rule="evenodd" fill="#888888" d="M6.5,12.75L2,8.25l2-2l2.5,2.5l5.5-5.5l2,2L6.5,12.75z"/></svg>',l={},h=function(t){
if(1===t)return"Purge";if(l[t])return l[t];var e,s,n,i,o;e=Math.floor(t/604800),o=t%604800,s=Math.floor(o/86400),o%=86400,n=Math.floor(o/3600),o%=3600,i=Math.floor(o/60),o%=60;var a=l[t]=(e?e+"w":"")+(s||e&&(n||i||o)?s+"d":"")+(n||(e||s)&&(i||o)?n+"h":"")+(i||(e||s||n)&&o?i+"m":"")+(o?o+"s":"");return a};try{i=t.require&&t.require("ember-twitch-chat/helpers/chat-line-helpers")}catch(f){}o.basic_settings.enhanced_moderation_cards={type:"boolean",no_bttv:!0,category:"Chat",name:"Enhanced Moderation Cards",help:"Improve moderation cards with hotkeys, additional buttons, chat history, and other information to make moderating easier.",get:function(){return this.settings.mod_card_hotkeys&&this.settings.mod_card_info&&this.settings.mod_card_history},set:function(t){this.settings.set("mod_card_hotkeys",t),this.settings.set("mod_card_info",t),this.settings.set("mod_card_history",t)}},o.basic_settings.chat_hover_pause={type:"boolean",no_bttv:!0,category:"Chat",name:"Pause Chat Scrolling on Mouse Hover",help:"Automatically prevent the chat from scrolling when moving the mouse over it to prevent moderation mistakes and link misclicks.",get:"chat_hover_pause",set:"chat_hover_pause"},o.settings_info.chat_hover_pause={type:"boolean",value:!1,no_bttv:!0,category:"Chat Moderation",name:"Pause Chat Scrolling on Mouse Hover",help:"Automatically prevent the chat from scrolling when moving the mouse over it to prevent moderation mistakes and link misclicks.",on_update:function(t){this._roomv&&(t?this._roomv.ffzEnableFreeze():this._roomv.ffzDisableFreeze())}},o.settings_info.short_commands={type:"boolean",value:!0,no_bttv:!0,category:"Chat Moderation",name:"Short Moderation Commands",help:"Use /t, /b, and /u in chat in place of /timeout, /ban, /unban for quicker moderation, and use /p for 1 second timeouts."},o.settings_info.mod_card_hotkeys={type:"boolean",value:!1,no_bttv:!0,category:"Chat Moderation",name:"Moderation Card Hotkeys",help:"With a moderation card selected, press B to ban the user, T to time them out for 10 minutes, P to time them out for 1 second, or U to unban them. ESC closes the card."},o.settings_info.mod_card_info={type:"boolean",value:!0,no_bttv:!0,category:"Chat Moderation",name:"Moderation Card Additional Information",help:"Display a channel's follower count, view count, and account age on moderation cards."},o.settings_info.mod_card_history={type:"boolean",value:!1,no_bttv:!0,category:"Chat Moderation",name:"Moderation Card History",help:"Display a few of the user's previously sent messages on moderation cards.",on_update:function(t){if(!t&&this.rooms)for(var e in this.rooms){var s=this.rooms[e];s&&(s.user_history=void 0)}}},o.settings_info.mod_card_buttons={type:"button",value:[],category:"Chat Moderation",no_bttv:!0,name:"Moderation Card Additional Buttons",help:"Add additional buttons to moderation cards for running chat commands on those users.",method:function(){for(var t="",e=0;e<this.settings.mod_card_buttons.length;e++){var s=this.settings.mod_card_buttons[e];t+=-1!==s.indexOf(" ")?' "'+s+'"':" "+s}var n=prompt('Moderation Card Additional Buttons\n\nPlease enter a list of additional commands to display buttons for on moderation cards. Commands are separated by spaces. To include spaces in a command, surround the command with double quotes ("). Use "{user}" to insert the user\'s username into the command, otherwise it will be appended to the end.\n\nExample: !permit "!reg add {user}"',t);if(null!==n&&void 0!==n){var i=[];for(n=n.trim();n;)if('"'===n.charAt(0)){var o=n.indexOf('"',1);-1===o&&(o=n.length);var a=n.substr(1,o-1);a&&i.push(a),n=n.substr(o+1)}else{var r=n.indexOf(" ");if(-1===r)n&&i.push(n),n="";else{var a=n.substr(0,r);a&&i.push(a),n=n.substr(r+1)}}this.settings.set("mod_card_buttons",i)}}},o.settings_info.mod_card_durations={type:"button",value:[300,600,3600,43200,86400,604800],category:"Chat Moderation",no_bttv:!0,name:"Moderation Card Timeout Buttons",help:"Add additional timeout buttons to moderation cards with specific durations.",method:function(){var t=this.settings.mod_card_durations.join(", "),e=prompt('Moderation Card Timeout Buttons\n\nPlease enter a comma-separated list of durations that you would like to have timeout buttons for. Durations must be expressed in seconds.\n\nEnter "reset" without quotes to return to the default value.',t);if(null!==e&&void 0!==e){"reset"===e&&(e=o.settings_info.mod_card_durations.value.join(", ")),e=e.trim().split(/[ ,]+/);for(var s=[],n=0;n<e.length;n++){var i=parseInt(e[n]);0===i&&(i=1),i!==0/0&&i>0&&s.push(i)}this.settings.set("mod_card_durations",s)}}},o.prototype.setup_mod_card=function(){this.log("Modifying Mousetrap stopCallback so we can catch ESC.");var e=Mousetrap.stopCallback;Mousetrap.stopCallback=function(t,s,n){return s.classList.contains("no-mousetrap")?!0:e(t,s,n)},Mousetrap.bind("up up down down left right left right b a enter",function(){var t=document.querySelector(".app-main")||document.querySelector(".ember-chat-container");t&&t.classList.toggle("ffz-flip")}),this.log("Hooking the Ember Moderation Card view.");var s=App.__container__.resolve("component:moderation-card"),n=this;s.reopen({ffzForceRedraw:function(){this.rerender()}.observes("cardInfo.isModeratorOrHigher","cardInfo.user"),ffzRebuildInfo:function(){var t=this.get("element"),e=t&&t.querySelector(".info");if(e){var s='<span class="stat tooltip" title="Total Views">'+r.EYE+" "+a.number_commas(this.get("cardInfo.user.views")||0)+"</span>",n=a.parse_date(this.get("cardInfo.user.created_at")||""),i=this.get("cardInfo.user.ffz_followers");if("number"==typeof i)s+='<span class="stat tooltip" title="Followers">'+r.HEART+" "+a.number_commas(i||0)+"</span>";else if(void 0===i){var o=this;this.set("cardInfo.user.ffz_followers",!1),Twitch.api.get("channels/"+this.get("cardInfo.user.id")+"/follows",{limit:1}).done(function(t){o.set("cardInfo.user.ffz_followers",t._total),o.ffzRebuildInfo()}).fail(function(t){o.set("cardInfo.user.ffz_followers",void 0)})}if(n){var d=Math.floor((Date.now()-n.getTime())/1e3);d>0&&(s+='<span class="stat tooltip" title="Member Since: '+(d>86400?n.toLocaleDateString():n.toLocaleString())+'">'+r.CLOCK+" "+a.human_time(d,10)+"</span>")}e.innerHTML=s}}.observes("cardInfo.user.views"),userName:Ember.computed("cardInfo.user.id","cardInfo.user.display_name",function(){var t=this.get("cardInfo.user.id"),e=n.aliases[t];return e||this.get("cardInfo.user.display_name")||t.capitalize()}),didInsertElement:function(){this._super(),t._card=this;try{if(n.has_bttv)return;var e,s=this.get("element"),o=this.get("controller"),l=o.get("cardInfo.user.id"),f=n.aliases[l];if(f){var m=s.querySelector("h3.name"),p=m&&m.querySelector("a");p&&(m=p),m&&(m.classList.add("ffz-alias"),m.title=a.sanitize(o.get("cardInfo.user.display_name")||l.capitalize()),jQuery(m).tipsy())}if(s.classList.add("ffz-moderation-card"),n.settings.mod_card_info){var g=document.createElement("div"),v=s.querySelector("h3.name");v&&(s.classList.add("ffz-has-info"),g.className="info channel-stats",v.parentElement.insertBefore(g,v.nextSibling),this.ffzRebuildInfo())}if(n.settings.mod_card_buttons&&n.settings.mod_card_buttons.length){e=document.createElement("div"),e.className="extra-interface interface clearfix";for(var b={},y=function(t){var e=o.get("cardInfo.user.id"),s=App.__container__.lookup("controller:chat"),n=s&&s.get("currentRoom");n&&n.send(t.replace(/{user}/g,e))},w=function(t){var e=document.createElement("button"),s=t.split(" ",1)[0],n=b[s]>1?t.split(" ",b[s]):[s];return/^[!~./]/.test(n[0])&&(n[0]=n[0].substr(1)),n=_.map(n,function(t){return t.capitalize()}).join(" "),e.className="button",e.innerHTML=a.sanitize(n),e.title=a.sanitize(t.replace(/{user}/g,o.get("cardInfo.user.id")||"{user}")),jQuery(e).tipsy(),e.addEventListener("click",y.bind(this,t)),e},b={},z=0;z<n.settings.mod_card_buttons.length;z++)b[n.settings.mod_card_buttons[z].split(" ",1)[0]]=(b[n.settings.mod_card_buttons[z].split(" ",1)[0]]||0)+1;for(var z=0;z<n.settings.mod_card_buttons.length;z++){var k=n.settings.mod_card_buttons[z],C=k.indexOf("{user}");-1===C&&(k+=" {user}"),e.appendChild(w(k))}s.appendChild(e)}if(s.setAttribute("tabindex",1),n.settings.mod_card_hotkeys&&(s.classList.add("no-mousetrap"),s.addEventListener("keyup",function(t){var e=t.keyCode||t.which,s=o.get("cardInfo.user.id"),n=o.get("cardInfo.isModeratorOrHigher"),i=App.__container__.lookup("controller:chat").get("currentRoom");if(n&&e==d.P)i.send("/timeout "+s+" 1");else if(n&&e==d.B)i.send("/ban "+s);else if(n&&e==d.T)i.send("/timeout "+s+" 600");else if(n&&e==d.U)i.send("/unban "+s);else if(e!=d.ESC)return;o.send("close")})),o.get("cardInfo.isModeratorOrHigher")){s.classList.add("ffz-is-mod"),n.settings.mod_card_hotkeys&&(s.classList.add("no-mousetrap"),s.addEventListener("keyup",function(t){var e=t.keyCode||t.which,s=o.get("cardInfo.user.id"),n=App.__container__.lookup("controller:chat").get("currentRoom");if(e==d.P)n.send("/timeout "+s+" 1");else if(e==d.B)n.send("/ban "+s);else if(e==d.T)n.send("/timeout "+s+" 600");else if(e==d.U)n.send("/unban "+s);else if(e!=d.ESC)return;o.send("close")}));var E=function(t){var e=o.get("cardInfo.user.id"),s=App.__container__.lookup("controller:chat").get("currentRoom");s.send(-1===t?"/unban "+e:"/timeout "+e+" "+t)},x=function(t){var e=document.createElement("button");return e.className="button",e.innerHTML=h(t),e.title="Timeout User for "+a.number_commas(t)+" Second"+(1!=t?"s":""),n.settings.mod_card_hotkeys&&600===t?e.title="(T)"+e.title.substr(1):n.settings.mod_card_hotkeys&&1===t&&(e.title="(P)urge - "+e.title),jQuery(e).tipsy(),e.addEventListener("click",E.bind(this,t)),e};if(n.settings.mod_card_durations&&n.settings.mod_card_durations.length){e=document.createElement("div"),e.className="extra-interface interface clearfix",e.appendChild(x(1));var T=document.createElement("span");T.className="right",e.appendChild(T);for(var z=0;z<n.settings.mod_card_durations.length;z++)T.appendChild(x(n.settings.mod_card_durations[z]));s.appendChild(e),this.$("button.timeout").remove()}var L=s.querySelector("button.ban");n.settings.mod_card_hotkeys&&L.setAttribute("title","(B)an User");var M=document.createElement("button");M.className="unban button glyph-only light",M.innerHTML=c,M.title=(n.settings.mod_card_hotkeys?"(U)":"U")+"nban User",jQuery(M).tipsy(),M.addEventListener("click",E.bind(this,-1)),jQuery(L).after(M)}var S=s.querySelector("button.mod");if(S){var A=o.get("cardInfo.isChannelOwner"),F=ffz.get_user();can_op=A||F&&F.is_admin||F&&F.is_staff,can_op||S.parentElement.removeChild(S)}var R=s.querySelector(".interface > button.message-button");if(R){R.innerHTML="W",R.classList.add("glyph-only"),R.classList.add("message"),R.title="Whisper User",jQuery(R).tipsy();var H=document.createElement("button");H.className="message-button button glyph-only message tooltip",H.innerHTML=u,H.title="Message User",H.addEventListener("click",function(){t.open("http://www.twitch.tv/message/compose?to="+o.get("cardInfo.user.id"))}),R.parentElement.insertBefore(H,R.nextSibling)}var O=document.createElement("button");if(O.className="alias button glyph-only tooltip",O.innerHTML=r.EDIT,O.title="Set Alias",O.addEventListener("click",function(){var t=o.get("cardInfo.user.id"),e=n.aliases[t],i=prompt("Alias for User: "+t+"\n\nPlease enter an alias for the user. Leave it blank to remove the alias.",e);if(null!==i&&void 0!==i){i=i.trim(),i||(i=void 0),n.aliases[t]=i,n.save_aliases(),n._update_alias(t),Ember.propertyDidChange(o,"userName");var a=s.querySelector("h3.name"),r=a&&a.querySelector("a");r&&(a=r),a&&a.classList.toggle("ffz-alias",i)}}),R)R.parentElement.insertBefore(O,R);else{var I=s.querySelector(".interface > .follow-button");I&&I.parentElement.insertBefore(O,I.nextSibling)}if(n.settings.mod_card_history){var B=App.__container__.lookup("controller:chat"),D=B&&B.get("currentRoom"),N=D&&n.rooms&&n.rooms[D.get("id")],j=N&&N.user_history&&N.user_history[o.get("cardInfo.user.id")];if(j&&j.length){var P=document.createElement("ul"),U=!1;P.className="interface clearfix chat-history";for(var z=0;z<j.length;z++){var e=j[z],q=document.createElement("li");q.className="message-line chat-line clearfix",q.classList.toggle("ffz-alternate",U),U=!U,e.style&&q.classList.add(e.style),q.innerHTML=(i?'<span class="timestamp float-left">'+i.getTime(e.date)+"</span> ":"")+'<span class="message">'+("action"===e.style?"*"+e.from+" ":"")+n.render_tokens(e.cachedTokens)+"</span>";for(var V=q.querySelectorAll("a.deleted-link"),W=0;W<V.length;W++)V[W].addEventListener("click",n._deleted_link_click);jQuery(".html-tooltip",q).tipsy({html:!0}),P.appendChild(q)}s.appendChild(P),P.scrollTop=P.scrollHeight}}var Z=s.getBoundingClientRect(),G=document.body.getBoundingClientRect();if(Z.bottom>G.bottom){var Y=Z.bottom-G.bottom;Z.top-Y>G.top&&(s.style.top=Z.top-Y+"px")}this.$().draggable({start:function(){s.focus()}}),s.focus()}catch($){try{n.error("ModerationCardView didInsertElement: "+$)}catch($){}}}})},o.prototype._update_alias=function(t){var e=this.aliases&&this.aliases[t],s=o.get_capitalization(t),n=e||s,i=this._roomv&&this._roomv.get("element"),a=i&&i.querySelectorAll('.chat-line[data-sender="'+t+'"]');if(a)for(var r=0,d=a.length;d>r;r++){var u=a[r],c=u.querySelector(".from");c.classList.toggle("ffz-alias",e),c.textContent=n,c.title=e?s:""}},o.chat_commands.purge=function(t,e){if(!e||!e.length)return"Purge Usage: /p username [more usernames separated by spaces]";if(e.length>10)return"Please only purge up to 10 users at once.";for(var s=0;s<e.length;s++){var n=e[s];n&&t.room.send("/timeout "+n+" 1")}},o.chat_commands.p=function(t,e){return o.chat_commands.purge.bind(this)(t,e)},o.chat_commands.p.enabled=function(){return this.settings.short_commands},o.chat_commands.t=function(t,e){return e&&e.length?void t.room.send("/timeout "+e.join(" ")):"Timeout Usage: /t username [duration]"},o.chat_commands.t.enabled=function(){return this.settings.short_commands},o.chat_commands.b=function(t,e){if(!e||!e.length)return"Ban Usage: /b username [more usernames separated by spaces]";if(e.length>10)return"Please only ban up to 10 users at once.";for(var s=0;s<e.length;s++){var n=e[s];n&&t.room.send("/ban "+n)}},o.chat_commands.b.enabled=function(){return this.settings.short_commands},o.chat_commands.u=function(t,e){if(!e||!e.length)return"Unban Usage: /u username [more usernames separated by spaces]";if(e.length>10)return"Please only unban up to 10 users at once.";for(var s=0;s<e.length;s++){var n=e[s];n&&t.room.send("/unban "+n)}},o.chat_commands.u.enabled=function(){return this.settings.short_commands}},{"../constants":5,"../utils":35}],13:[function(e,s,n){var i=t.FrankerFaceZ,o=/ subscribed to /,a=e("../constants"),r=e("../utils"),d=-1!==navigator.userAgent.indexOf("Android"),u=function(t){return t.moderator_badge?'.chat-line[data-room="'+t.id+'"] .badges .moderator:not(.ffz-badge-replacement) { background-image:url("'+t.moderator_badge+'") !important; }':""};i.prototype.setup_room=function(){this.rooms={},this.log("Creating room style element.");var t=this._room_style=document.createElement("style");t.id="ffz-room-css",document.head.appendChild(t),this.log("Hooking the Ember Room controller.");var e=App.__container__.lookup("controller:room");if(e){var s=e._actions.banUser,n=e._actions.timeoutUser;e._actions.banUser=function(t){s.bind(this)(t),this.get("model").clearMessages(t.user)},e._actions.timeoutUser=function(t){n.bind(this)(t),this.get("model").clearMessages(t.user)},e._actions.purgeUser=function(t){this.get("model.tmiRoom").sendMessage("/timeout "+t.user+" 1"),this.get("model").clearMessages(t.user)}}this.log("Hooking the Ember Room model.");var i=App.__container__.resolve("model:room");this._modify_room(i);var o=i.instances;for(var a in o)if(o.hasOwnProperty(a)){var r=o[a];this.add_room(r.id,r),this._modify_room(r),r.ffzPatchTMI()}this.log("Hooking the Ember Room view.");var d=App.__container__.resolve("view:room");this._modify_rview(d);try{d.create().destroy()}catch(u){}for(var a in Ember.View.views)if(Ember.View.views.hasOwnProperty(a)){var c=Ember.View.views[a];if(c instanceof d){this.log("Manually updating existing Room view.",c);try{c.ffzInit()}catch(u){this.error("RoomView setup ffzInit: "+u)}}}},i.prototype._modify_rview=function(t){var e=this;t.reopen({didInsertElement:function(){this._super();try{this.ffzInit()}catch(t){e.error("RoomView didInsertElement: "+t)}},willClearRender:function(){try{this.ffzTeardown()}catch(t){e.error("RoomView willClearRender: "+t)}this._super()},ffzInit:function(){e._roomv=this,this.ffz_frozen=!1,this._ffz_mouse_down=this.ffzMouseDown.bind(this),d&&this._$chatMessagesScroller.bind("scroll",this._ffz_mouse_down),this._$chatMessagesScroller.unbind("mousedown"),this._$chatMessagesScroller.bind("mousedown",this._ffz_mouse_down),e.settings.chat_hover_pause&&this.ffzEnableFreeze(),e.settings.room_status&&this.ffzUpdateStatus();var t=this.get("controller");t&&(t.reopen({submitButtonText:function(){if(this.get("model.isWhisperMessage")&&this.get("model.isWhispersEnabled"))return i18n("Whisper");var t=this.get("model.slowWait"),s=this.get("model.messageToSend")||"";return"/"===s.charAt(0)&&"/me "!==s.substr(0,4)||!t||!e.settings.room_status?i18n("Chat"):r.time_to_string(t,!1,!1,!0)}.property("model.isWhisperMessage","model.isWhispersEnabled","model.slowWait")}),Ember.propertyDidChange(t,"submitButtonText"))},ffzTeardown:function(){e._roomv===this&&(e._roomv=void 0),this.ffzDisableFreeze()},ffzUpdateStatus:function(){var t=this.get("controller.model"),s=this.get("element"),n=s&&s.querySelector(".chat-buttons-container");if(n){var i=n.querySelector("#ffz-stat-r9k"),o=n.querySelector("#ffz-stat-sub"),a=n.querySelector("#ffz-stat-slow"),d=n.querySelector("#ffz-stat-banned"),u=n.querySelector("#ffz-stat-delay"),c=n.querySelector("button");if(e.has_bttv||!e.settings.room_status)return i&&i.parentElement.removeChild(i),o&&o.parentElement.removeChild(o),a&&a.parentElement.removeChild(a),void(c&&c.classList.remove("ffz-waiting"));i||(i=document.createElement("span"),i.className="ffz room-state stat float-right",i.id="ffz-stat-r9k",i.innerHTML="R9K",i.title="This room is in R9K-mode.",n.appendChild(i),jQuery(i).tipsy({gravity:"s",offset:15})),o||(o=document.createElement("span"),o.className="ffz room-state stat float-right",o.id="ffz-stat-sub",o.innerHTML="SUB",o.title="This room is in subscribers-only mode.",n.appendChild(o),jQuery(o).tipsy({gravity:"s",offset:15})),a||(a=document.createElement("span"),a.className="ffz room-state stat float-right",a.id="ffz-stat-slow",a.innerHTML="SLOW",a.title="This room is in slow mode. You may send messages every 120 seconds.",n.appendChild(a),jQuery(a).tipsy({gravity:"s",offset:15})),d||(d=document.createElement("span"),d.className="ffz room-state stat float-right",d.id="ffz-stat-banned",d.innerHTML="BAN",d.title="You have been banned from talking in this room.",n.appendChild(d),jQuery(d).tipsy({gravity:"s",offset:15})),u||(u=document.createElement("span"),u.className="ffz room-state stat float-right",u.id="ffz-stat-delay",u.innerHTML="DELAY",u.title="300ms of artifical chat delay added.",n.appendChild(u),jQuery(u).tipsy({gravity:"s",offset:15})),i.classList.toggle("hidden",!(t&&t.get("r9k"))),o.classList.toggle("hidden",!(t&&t.get("subsOnly"))),a.classList.toggle("hidden",!(t&&t.get("slowMode"))),a.title="This room is in slow mode. You may send messages every "+r.number_commas(t&&t.get("slow")||120)+" seconds.",d.classList.toggle("hidden",!(t&&t.get("ffz_banned"))),u.title=r.number_commas(+e.settings.chat_delay||300)+"ms of artifical chat delay added.",u.classList.toggle("hidden",!+e.settings.chat_delay),c&&(c.classList.toggle("ffz-waiting",t&&t.get("slowWait")||0),c.classList.toggle("ffz-banned",t&&t.get("ffz_banned")))}}.observes("controller.model"),ffzEnableFreeze:function(){var t=this.get("element"),e=t.querySelector(".chat-messages");e&&(this._ffz_interval=setInterval(this.ffzPulse.bind(this),200),this._ffz_messages=e,this._ffz_mouse_move=this.ffzMouseMove.bind(this),this._ffz_mouse_out=this.ffzMouseOut.bind(this),e.addEventListener("mousemove",this._ffz_mouse_move),e.addEventListener("touchmove",this._ffz_mouse_move),e.addEventListener("mouseout",this._ffz_mouse_out),document.addEventListener("mouseout",this._ffz_mouse_out))},ffzDisableFreeze:function(){this._ffz_interval&&(clearInterval(this._ffz_interval),this._ffz_interval=void 0),this.ffzUnfreeze();var t=this._ffz_messages;t&&(this._ffz_messages=void 0,this._ffz_mouse_move&&(t.removeEventListener("mousemove",this._ffz_mouse_move),this._ffz_mouse_move=void 0),this._ffz_mouse_out&&(t.removeEventListener("mouseout",this._ffz_mouse_out),this._ffz_mouse_out=void 0))},ffzPulse:function(){if(this.ffz_frozen){var t=Date.now()-this._ffz_last_move;t>750&&this.ffzUnfreeze()}},ffzUnfreeze:function(){this.ffz_frozen=!1,this._ffz_last_move=0,this.ffzUnwarnPaused(),this.get("stuckToBottom")&&this._scrollToBottom()},ffzMouseDown:function(t){var s=this._$chatMessagesScroller;if(s&&s[0]&&(!this.ffz_frozen&&"mousedown"===t.type||"mousewheel"===t.type||d&&"scroll"===t.type)){"mousedown"===t.type&&e.log("Freezing from mouse down!",t);var n=s[0].scrollHeight-s[0].scrollTop-s[0].offsetHeight;this._setStuckToBottom(10>=n)}},ffzMouseOut:function(t){this._ffz_outside=!0;var e=this;setTimeout(function(){e._ffz_outside&&e.ffzUnfreeze()},25)},ffzMouseMove:function(t){this._ffz_last_move=Date.now(),this._ffz_outside=!1,(t.screenX!==this._ffz_last_screenx||t.screenY!==this._ffz_last_screeny)&&(this._ffz_last_screenx=t.screenX,this._ffz_last_screeny=t.screenY,this.ffz_frozen||(this.ffz_frozen=!0,this.get("stuckToBottom")&&(this.set("controller.model.messageBufferSize",e.settings.scrollback_length+150),this.ffzWarnPaused())))},_scrollToBottom:_.throttle(function(){var t=this,e=this._$chatMessagesScroller;Ember.run.next(function(){setTimeout(function(){!t.ffz_frozen&&e&&e.length&&(e[0].scrollTop=e[0].scrollHeight,t._setStuckToBottom(!0))})})},200),_setStuckToBottom:function(t){this.set("stuckToBottom",t),this.get("controller.model")&&this.set("controller.model.messageBufferSize",e.settings.scrollback_length+(t?0:150)),t||this.ffzUnfreeze()},ffzWarnPaused:function(){var t=this.get("element"),e=t&&t.querySelector(".chat-interface .more-messages-indicator.ffz-freeze-indicator");if(t){if(!e){e=document.createElement("div"),e.className="more-messages-indicator ffz-freeze-indicator",e.innerHTML="(Chat Paused Due to Mouse Movement)";var s=t.querySelector(".chat-interface");if(!s)return;s.insertBefore(e,s.childNodes[0])}e.classList.remove("hidden")}},ffzUnwarnPaused:function(){var t=this.get("element"),e=t&&t.querySelector(".chat-interface .more-messages-indicator.ffz-freeze-indicator");e&&e.classList.add("hidden")}})},i.chat_commands={},i.ffz_commands={},i.prototype.room_message=function(t,e){var s=e.split("\n");if(this.has_bttv)for(var n=0;n<s.length;n++)BetterTTV.chat.handlers.onPrivmsg(t.id,{style:"admin",date:new Date,from:"jtv",message:s[n]});else for(var n=0;n<s.length;n++)t.room.addMessage({style:"ffz admin",date:new Date,from:"FFZ",message:s[n]})},i.prototype.run_command=function(t,e){var s=this.rooms[e];if(!s||!s.room)return!1;if(t){var n,o=t.split(" "),a=o.shift().substr(1).toLowerCase(),r=i.chat_commands[a];if(!r)return!1;if(r.hasOwnProperty("enabled")){var d=r.enabled;if("function"==typeof d)try{d=r.enabled.bind(this)(s,o)}catch(u){this.error('command "'+a+'" enabled: '+u),d=!1}if(!d)return!1}this.log("Received Command: "+a,o,!0);try{n=r.bind(this)(s,o)}catch(u){this.error('command "'+a+'" runner: '+u),n="There was an error running the command."}return n&&this.room_message(s,n),!0}},i.prototype.run_ffz_command=function(t,e){var s=this.rooms[e];if(s&&s.room){if(!t){var n=document.querySelector("a.ffz-ui-toggle");if(n)return n.click();t="help"}var o=t.split(" "),a=o.shift().toLowerCase();this.log("Received Command: "+a,o,!0);var r,d=i.ffz_commands[a];if(d)try{r=d.bind(this)(s,o)}catch(u){this.log("Error Running Command - "+a+": "+u,s),r="There was an error running the command."}else r='There is no "'+a+'" command.';r&&this.room_message(s,r)}},i.ffz_commands.help=function(t,e){if(e&&e.length){var s=i.ffz_commands[e[0].toLowerCase()];return s?s.help?s.help:'No help is available for the command "'+e[0]+'".':'There is no "'+e[0]+'" command.'}var n=[];for(var o in i.ffz_commands)i.ffz_commands.hasOwnProperty(o)&&n.push(o);return"The available commands are: "+n.join(", ")},i.ffz_commands.help.help="Usage: /ffz help [command]\nList available commands, or show help for a specific command.",i.prototype.add_room=function(t,e){if(this.rooms[t])return this.log("Tried to add existing room: "+t);this.log("Adding Room: "+t);var s=this.rooms[t]={id:t,room:e,menu_sets:[],sets:[],css:null,needs_history:!1};if(this.follow_sets&&this.follow_sets[t]){s.extra_sets=this.follow_sets[t],delete this.follow_sets[t];for(var n=0;n<s.extra_sets.length;n++){var i=s.extra_sets[n],o=this.emote_sets&&this.emote_sets[i];o?-1===o.users.indexOf(t)&&o.users.push(t):this.load_set(i,function(e,s){e&&s.users.push(t)})}}this.ws_send("sub",t),!this.has_bttv&&this.settings.chat_history&&e&&(e.get("messages.length")||0)<10&&(this.ws_send("chat_history",[t,25],this._load_history.bind(this,t))||(s.needs_history=!0)),e.set("messageBufferSize",this.settings.scrollback_length+(this._roomv&&!this._roomv.get("stuckToBottom")&&this._roomv.get("controller.model.id")===t?150:0)),this.load_room(t)},i.prototype.remove_room=function(t){var e=this.rooms[t];if(e&&(this.log("Removing Room: "+t),(e.css||e.moderator_badge)&&r.update_css(this._room_style,t,null),this.ws_send("unsub",t),delete this.rooms[t],"_"!==t.charAt(0))){var s=this.emote_sets[e.set];s&&(s.users.removeObject(t),this.global_sets.contains(e.set)||s.users.length||this.unload_set(e.set))}},i.prototype._load_history=function(t,e,s){var n=this.rooms[t];if(n&&n.room){if(!e)return this.log("Error retrieving chat history for: "+t);if(this.log("Received "+s.length+" old messages for: "+t),s.length)return this._insert_history(t,s)}},i.prototype._show_deleted=function(t){var e=this.rooms[t];if(e&&e.room){var s=e.room.get("messages.0.ffz_old_messages");s&&s.length&&(e.room.set("messages.0.ffz_old_messages",void 0),this._insert_history(t,s))}},i.prototype._insert_history=function(t,e){var s=this.rooms[t];if(s&&s.room){var n=s.room,i=n.get("messages"),o=n.tmiSession||TMI._sessions&&TMI._sessions[0],a=(n.tmiRoom,0),d=e[e.length-1],u=new Date,c="string"==typeof d.date?r.parse_date(d.date):d.date,l=(u-c)/1e3,h=l>300,f=e.length,m=n.get("messages.0.ffz_alternate")||!1;h&&(m=!m);for(var f=e.length;f--;){var _=e[f];if("string"==typeof _.date&&(_.date=r.parse_date(_.date)),_.ffz_alternate=m=!m,_.room||(_.room=t),_.color||(_.color=_.tags&&_.tags.color?_.tags.color:o&&_.from?o.getColor(_.from.toLowerCase()):"#755000"),!_.labels||!_.labels.length){var p=_.labels=[];if(_.tags)if(_.tags.turbo&&p.push("turbo"),_.tags.subscriber&&p.push("subscriber"),_.from===t)p.push("owner");else{var g=_.tags["user-type"];("mod"===g||"staff"===g||"admin"===g||"global_mod"===g)&&p.push(g)}}if(_.style||("jtv"===_.from?_.style="admin":"twitchnotify"===_.from&&(_.style="notification")),_.cachedTokens&&_.cachedTokens.length||this.tokenize_chat_line(_,!0,n.get("roomProperties.hide_chat_links")),n.shouldShowMessage(_)){if(!(i.length<n.get("messageBufferSize")))break;if(_.ffz_old_messages){var v=n.get("messageBufferSize")-(i.length+1);_.ffz_old_messages.length>v&&(_.ffz_old_messages=_.ffz_old_messages.slice(_.ffz_old_messages.length-v))}i.unshiftObject(_),a+=1}}if(h){var _={ffz_alternate:!m,color:"#755000",date:new Date,from:"frankerfacez_admin",style:"admin",message:"(Last message is "+r.human_time(l)+" old.)",room:t};if(this.tokenize_chat_line(_,!0,n.get("roomProperties.hide_chat_links")),n.shouldShowMessage(_))for(i.insertAt(a,_);i.length>n.get("messageBufferSize");)i.removeAt(0)}}},i.prototype.load_room=function(t,e,s){var n=this;jQuery.getJSON(((s||0)%2===0?a.API_SERVER:a.API_SERVER_2)+"v1/room/"+t).done(function(s){if(s.sets)for(var i in s.sets)s.sets.hasOwnProperty(i)&&n._load_set_json(i,void 0,s.sets[i]);n._load_room_json(t,e,s)}).fail(function(i){return 404==i.status?"function"==typeof e&&e(!1):(s=(s||0)+1,10>s?n.load_room(t,e,s):"function"==typeof e&&e(!1))})},i.prototype._load_room_json=function(t,e,s){if(!s||!s.room)return"function"==typeof e&&e(!1);s=s.room,this.rooms[t]&&(s.room=this.rooms[t].room);for(var n in this.rooms[t])"room"!==n&&this.rooms[t].hasOwnProperty(n)&&!s.hasOwnProperty(n)&&(s[n]=this.rooms[t][n]);s.needs_history=this.rooms[t]&&this.rooms[t].needs_history||!1,this.rooms[t]=s,(s.css||s.moderator_badge)&&r.update_css(this._room_style,t,u(s)+(s.css||"")),this.emote_sets.hasOwnProperty(s.set)?-1===this.emote_sets[s.set].users.indexOf(t)&&this.emote_sets[s.set].users.push(t):this.load_set(s.set,function(e,s){-1===s.users.indexOf(t)&&s.users.push(t)}),this.update_ui_link(),e&&e(!0,s)},i.prototype._modify_room=function(e){var s=this;e.reopen({slowWaiting:!1,slow:0,mru_list:[],updateWait:function(t,e){var n=this.get("slowWait")||0;this.set("slowWait",t),1>n&&t>0?(this._ffz_wait_timer&&clearTimeout(this._ffz_wait_timer),this._ffz_wait_timer=setTimeout(this.ffzUpdateWait.bind(this),1e3),s._roomv&&s._roomv.ffzUpdateStatus()):(n>0&&1>t||e)&&(this.set("ffz_banned",!1),s._roomv&&s._roomv.ffzUpdateStatus())},ffzUpdateWait:function(){this._ffz_wait_timer=void 0;var t=this.get("slowWait")||0;1>t||(this.set("slowWait",--t),t>0?this._ffz_wait_timer=setTimeout(this.ffzUpdateWait.bind(this),1e3):(this.set("ffz_banned",!1),s._roomv&&s._roomv.ffzUpdateStatus()))},ffzUpdateStatus:function(){s._roomv&&s._roomv.ffzUpdateStatus()}.observes("r9k","subsOnly","slow","ffz_banned"),ffzUserLevel:function(){return this.get("isStaff")?5:this.get("isAdmin")?4:this.get("isBroadcaster")?3:this.get("isGlobalModerator")?2:this.get("isModerator")?1:0}.property("id","chatLabels.[]"),init:function(){this._super();try{s.add_room(this.id,this),this.set("ffz_chatters",{})}catch(t){s.error("add_room: "+t)}},willDestroy:function(){this._super();try{s.remove_room(this.id)}catch(t){s.error("remove_room: "+t)}},clearMessages:function(t){var e=this;if(t){for(this.ffzRecentlyBanned||(this.ffzRecentlyBanned=[]),this.ffzRecentlyBanned.push(t);this.ffzRecentlyBanned.length>100;)this.ffzRecentlyBanned.shift();for(var n,i=e.get("messages"),o=i.get("length"),a=o;a--;){var d=i.get(a);if(d.from===t){if(s.settings.remove_deleted){void 0===n&&(n=d.ffz_alternate),i.removeAt(a);continue}e.set("messages."+a+".ffz_deleted",!0),s.settings.prevent_clear||e.set("messages."+a+".deleted",!0)}void 0===n?n=d.ffz_alternate:(n=!n,e.set("messages."+a+".ffz_alternate",n))}if(e.ffzPending)for(i=e.ffzPending,a=i.length;a--;){var d=i.get(a);d.from===t&&(d.ffz_deleted=!0,d.deleted=!s.settings.prevent_clear,d.removed=s.settings.remove_deleted)}if(s.settings.mod_card_history){var u=s.rooms&&s.rooms[e.get("id")],c=u&&u.user_history&&u.user_history[t];if(null!==c&&void 0!==c){var l=!1,h=c.length>0?c[c.length-1]:null;if(l=null!==h&&h.is_delete)h.cachedTokens=["User has been timed out "+r.number_commas(++h.deleted_times)+" times."];else for(c.push({from:"jtv",is_delete:!0,style:"admin",cachedTokens:["User has been timed out."],deleted_times:1,date:new Date});c.length>20;)c.shift()}}}else if(s.settings.prevent_clear)this.addTmiMessage("A moderator's attempt to clear chat was ignored.");else{var i=e.get("messages");e.set("messages",[]),e.addMessage({style:"admin",message:i18n("Chat was cleared by a moderator"),ffz_old_messages:i})}},trimMessages:function(){var t=this.get("messages"),e=t.get("length"),s=this.get("messageBufferSize");e>s&&t.removeAt(0,e-s)},pushMessage:function(t){+s.settings.chat_delay?(this.ffzPending||(this.ffzPending=[]),this.ffzPending.length||setTimeout(this.ffzPendingFlush.bind(this),100),t.time=Date.now(),this.ffzPending.push(t)):this.ffzActualPushMessage(t)},ffzActualPushMessage:function(t){this.shouldShowMessage(t)&&this.ffzShouldShowMessage(t)&&(this.get("messages").pushObject(t),
this.trimMessages(),"admin"===t.style||"whisper"===t.style&&!this.ffz_whisper_room||this.incrementProperty("unreadCount",1))},ffzPendingFlush:function(){for(var t=Date.now(),e=0,n=this.ffzPending.length;n>e;e++){var i=this.ffzPending[e];if(!i.removed){if(+s.settings.chat_delay+i.time>t)break;this.ffzActualPushMessage(i)}}this.ffzPending=this.ffzPending.slice(e),this.ffzPending.length&&setTimeout(this.ffzPendingFlush.bind(this),100)},ffzShouldShowMessage:function(t){if(s.settings.remove_bot_ban_notices&&this.ffzRecentlyBanned){var e="("+this.ffzRecentlyBanned.join("|")+")",n={nightbot:"^"+e,moobot:"\\("+e+"\\)",xanbot:"^"+e};if(t.from in n&&new RegExp(n[t.from]).test(t.message))return!1}return!0},addMessage:function(t){if(t){if(!s.settings.hosted_sub_notices&&"notification"===t.style&&o.test(t.message))return;var e="whisper"===t.style;if(s.settings.group_tabs&&s.settings.whisper_room&&(e&&!this.ffz_whisper_room||!e&&this.ffz_whisper_room))return;if(e||(t.room=this.get("id")),s.tokenize_chat_line(t,!1,this.get("roomProperties.hide_chat_links")),!e&&t.from&&"jtv"!==t.from&&"twitchnotify"!==t.from&&s.settings.mod_card_history){var n=s.rooms&&s.rooms[t.room];if(n){var i=(n.user_history=n.user_history||{},n.user_history[t.from]=n.user_history[t.from]||[]);i.push({from:t.tags&&t.tags["display-name"]||t.from,cachedTokens:t.cachedTokens,style:t.style,date:t.date}),i.length>20&&i.shift()}}if(!e){var a=s.get_user();if(a&&a.login===t.from){var r=this.get("ffz_banned");this.set("ffz_banned",!1),this.get("isSubscriber")||this.get("isModeratorOrHigher")||!this.get("slowMode")?this.updateWait(0,r):this.get("slowMode")&&this.updateWait(this.get("slow"))}}e||!this.chatters||this.chatters[t.from]||"twitchnotify"===t.from||"jtv"===t.from||this.ffzUpdateChatters(t.from)}var d=this._super(t);return t.color&&s._handle_color(t.color),d},setHostMode:function(t){this.set("ffz_host_target",t&&t.hostTarget||null);var e=s.get_user();e&&s._cindex&&this.get("id")===e.login&&s._cindex.ffzUpdateHostButton();var n=App.__container__.lookup("controller:chat");if(n&&n.get("currentChannelRoom")===this)return this._super(t)},send:function(t){if(!(s.settings.group_tabs&&s.settings.whisper_room&&this.ffz_whisper_room)){try{if(t){var e=this.get("mru_list"),n=e.indexOf(t);-1!==n?e.splice(n,1):e.length>20&&e.pop(),e.unshift(t)}var i=t.split(" ",1)[0].toLowerCase();if("/ffz"===i)return this.set("messageToSend",""),void s.run_ffz_command(t.substr(5),this.get("id"));if("/"===i.charAt(0)&&s.run_command(t,this.get("id")))return void this.set("messageToSend","")}catch(o){s.error("send: "+o)}return this._super(t)}},ffzUpdateUnread:function(){if(s.settings.group_tabs){var t=App.__container__.lookup("controller:chat");t&&t.get("currentRoom")===this?this.resetUnreadCount():s._chatv&&s._chatv.ffzTabUnread(this.get("id"))}}.observes("unreadCount"),ffzInitChatterCount:function(){if(this.tmiRoom){this._ffz_chatter_timer&&(clearTimeout(this._ffz_chatter_timer),this._ffz_chatter_timer=void 0);var t=this;this.tmiRoom.list().done(function(e){var s={};e=e.data.chatters;for(var n=0;n<e.admins.length;n++)s[e.admins[n]]=!0;for(var n=0;n<e.global_mods.length;n++)s[e.global_mods[n]]=!0;for(var n=0;n<e.moderators.length;n++)s[e.moderators[n]]=!0;for(var n=0;n<e.staff.length;n++)s[e.staff[n]]=!0;for(var n=0;n<e.viewers.length;n++)s[e.viewers[n]]=!0;t.set("ffz_chatters",s),t.ffzUpdateChatters()}).always(function(){t._ffz_chatter_timer=setTimeout(t.ffzInitChatterCount.bind(t),3e5)})}},ffzUpdateChatters:function(e,n){var i=this.get("ffz_chatters")||{};if(e&&(i[e]=!0),n&&i[n]&&delete i[n],s.settings.chatter_count){s._cindex&&s._cindex.ffzUpdateChatters();try{t.parent&&t.parent.postMessage&&t.parent.postMessage({from_ffz:!0,command:"chatter_count",message:Object.keys(this.get("ffz_chatters")||{}).length},"http://www.twitch.tv/")}catch(o){}}},ffzPatchTMI:function(){if(!this.get("ffz_is_patched")&&this.get("tmiRoom")){s.settings.chatter_count&&this.ffzInitChatterCount();var t=this.get("tmiRoom"),e=this,n=t._roomConn._connection;n.ffz_cap_patched||(n.ffz_cap_patched=!0,n._send("CAP REQ :twitch.tv/membership"),n.on("opened",function(){this._send("CAP REQ :twitch.tv/membership")},n)),t.on("notice",function(t){if("msg_slowmode"===t.msgId){var n=/in (\d+) seconds/.exec(t.message);n&&e.updateWait(parseInt(n[1]))}if("msg_timedout"===t.msgId){var n=/for (\d+) more seconds/.exec(t.message);n&&(e.set("ffz_banned",!0),e.updateWait(parseInt(n[1])))}if("msg_banned"===t.msgId&&(e.set("ffz_banned",!0),s._roomv&&s._roomv.ffzUpdateStatus()),"hosts_remaining"===t.msgId){var n=/(\d+) host command/.exec(t.message);n&&(e.set("ffz_hosts_left",parseInt(n[1]||0)),s._cindex&&s._cindex.ffzUpdateHostButton())}}),t._roomConn._connection.off("message",t._roomConn._onIrcMessage,t._roomConn),t._roomConn._onIrcMessage=function(t){if(t.target==this.ircChannel)switch(t.command){case"JOIN":this._session&&this._session.nickname===t.sender?this._onIrcJoin(t):s.settings.chatter_count&&e.ffzUpdateChatters(t.sender);break;case"PART":this._session&&this._session.nickname===t.sender?(this._resetActiveState(),this._connection._exitedRoomConn(),this._trigger("exited")):s.settings.chatter_count&&e.ffzUpdateChatters(null,t.sender)}},t._roomConn._connection.on("message",t._roomConn._onIrcMessage,t._roomConn),this.set("ffz_is_patched",!0)}}.observes("tmiRoom"),slowMode:function(){return this.get("slow")>0}.property("slow"),onSlowOff:function(){this.get("slowMode")||this.updateWait(0)}.observes("slowMode")})}},{"../constants":5,"../utils":35}],14:[function(e,s,n){var i=t.FrankerFaceZ;i.prototype.setup_viewers=function(){this.log("Hooking the Ember Viewers controller.");var t=App.__container__.resolve("controller:viewers");this._modify_viewers(t)},i.prototype._modify_viewers=function(t){var e=this;t.reopen({lines:function(){var t=this._super();try{var s=[],n={},o=null,a=App.__container__.lookup("controller:channel"),r=this.get("parentController.model.id"),d=a&&a.get("id");if(d){var u=a.get("display_name");u&&(i.capitalization[d]=[u,Date.now()])}r!=d&&(d=null);for(var c=0;c<t.length;c++){var l=t[c];if(l.category)o=l.category,s.push(o),n[o]=[];else{var h=l.chatter.toLowerCase();if(!h)continue;h==d?(s.unshift("Broadcaster"),n.Broadcaster=[h]):n.hasOwnProperty(o)&&n[o].push(h)}}t=[];for(var c=0;c<s.length;c++){var f=s[c],m=n[f];if(m&&m.length)for(t.push({category:f}),t.push({chatter:""}),m.sort();m.length;){var h=m.shift();h=i.get_capitalization(h),t.push({chatter:h})}}}catch(_){e.error("ViewersController lines: "+_)}return t}.property("content.chatters")})}},{}],15:[function(e,s,n){var i=t.FrankerFaceZ,o=e("./constants"),a=e("./utils"),r=function(t){var e=t.margins,s="";return e||(e=(t.height-18)/-2+"px 0"),(t.urls[2]||t.urls[4])&&(s='url("'+t.urls[1]+'") 1x',t.urls[2]&&(s+=', url("'+t.urls[2]+'") 2x'),t.urls[4]&&(s+=', url("'+t.urls[4]+'") 4x'),s="-webkit-image-set("+s+"); image-set("+s+");"),".ffz-emote-"+t.id+' { background-image: url("'+t.urls[1]+'"); height: '+t.height+"px; width: "+t.width+"px; margin: "+e+(s?"; "+s:"")+(t.css?"; "+t.css:"")+"}\n"},d=function(t){return t.margins||t.css?r(t)+'img[src="'+t.urls[1]+'"] { '+(t.margins?"margin: "+t.margins+";":"")+(t.css||"")+" }\n":r(t)},u=d,c=function(t){var e="string"==typeof t?parseInt(t,16):t;return 65536>e?String.fromCharCode(e):(e-=65536,String.fromCharCode(55296+(e>>10),56320+(1023&e)))};i.prototype.setup_emoticons=function(){this.log("Preparing emoticon system."),this.emoji_data={},this.emoji_names={},this.emote_sets={},this.global_sets=[],this.default_sets=[],this._last_emote_id=0,this.emote_usage={},this.log("Creating emoticon style element.");var t=this._emote_style=document.createElement("style");t.id="ffz-emoticon-css",document.head.appendChild(t),this.log("Loading global emote sets."),this.load_global_sets(),this.log("Loading emoji data."),this.load_emoji_data(),this.log("Watching Twitch emoticon parser to ensure it loads."),this._twitch_emote_check=setTimeout(this.check_twitch_emotes.bind(this),1e4)},i.prototype.add_usage=function(t,e,s){var n=this.emote_usage[e]=this.emote_usage[e]||{};n[t]=(n[t]||0)+(s||1),this._emote_report_scheduled||(this._emote_report_scheduled=setTimeout(this._report_emotes.bind(this),3e4))},i.prototype._report_emotes=function(){this._emote_report_scheduled&&delete this._emote_report_scheduled;var t=this.emote_usage;this.emote_usage={},this.ws_send("emoticon_uses",[t],function(){},!0)},i.prototype.check_twitch_emotes=function(){this._twitch_emote_check&&(clearTimeout(this._twitch_emote_check),delete this._twitch_emote_check);var t;if(this.rooms)for(var e in this.rooms)if(this.rooms.hasOwnProperty(e)){t=this.rooms[e];break}if(!t||!t.room||!t.room.tmiSession)return void(this._twitch_emote_check=setTimeout(this.check_twitch_emotes.bind(this),1e4));var s=t.room.tmiSession._emotesParser,n=Object.keys(s.emoticonRegexToIds).length;if(!(n>0)){var i=s.emoticonSetIds;s.emoticonSetIds="",s.updateEmoticons(i),this._twitch_emote_check=setTimeout(this.check_twitch_emotes.bind(this),1e4)}},i.prototype.getEmotes=function(t,e){var s=this.users&&this.users[t],n=this.rooms&&this.rooms[e];return _.union(s&&s.sets||[],n&&n.set&&[n.set]||[],n&&n.extra_sets||[],this.default_sets)},i.ws_commands.reload_set=function(t){this.emote_sets.hasOwnProperty(t)&&this.load_set(t)},i.ws_commands.load_set=function(t){this.load_set(t)},i.prototype._emote_tooltip=function(t){if(!t)return null;if(t._tooltip)return t._tooltip;var e=this.emote_sets[t.set_id],s=t.owner,n=e&&e.title||"Global";return t._tooltip="Emoticon: "+(t.hidden?"???":t.name)+"\nFFZ "+n+(s?"\nBy: "+s.display_name:""),t._tooltip},i.prototype.load_emoji_data=function(t,e){var s=this;jQuery.getJSON(o.SERVER+"emoji/emoji.json").done(function(e){var n={},i={};for(var a in e){var r=e[a];a=a.toLowerCase(),r.code=a,n[a]=r,i[r.short_name]=a,r.raw=_.map(r.code.split("-"),c).join(""),r.src=o.SERVER+"emoji/"+a+"-1x.png",r.srcSet=r.src+" 1x, "+o.SERVER+"emoji/"+a+"-2x.png 2x, "+o.SERVER+"emoji/"+a+"-4x.png 4x",r.token={srcSet:r.srcSet,emoticonSrc:r.src,ffzEmoji:a,altText:r.raw}}s.emoji_data=n,s.emoji_names=i,s.log("Loaded data on "+Object.keys(n).length+" emoji."),"function"==typeof t&&t(!0,e)}).fail(function(n){return 404===n.status?"function"==typeof t&&t(!1):(e=(e||0)+1,50>e?s.load_emoji(t,e):"function"==typeof t&&t(!1))})},i.prototype.load_global_sets=function(t,e){var s=this;jQuery.getJSON(((e||0)%2===0?o.API_SERVER:o.API_SERVER_2)+"v1/set/global").done(function(t){s.default_sets=t.default_sets;var e=s.global_sets=[],n=t.sets||{};s.feature_friday&&s.feature_friday.set&&(-1===s.global_sets.indexOf(s.feature_friday.set)&&s.global_sets.push(s.feature_friday.set),-1===s.default_sets.indexOf(s.feature_friday.set)&&s.default_sets.push(s.feature_friday.set));for(var i in n)if(n.hasOwnProperty(i)){var o=n[i];e.push(i),s._load_set_json(i,void 0,o)}}).fail(function(n){return 404==n.status?"function"==typeof t&&t(!1):(e=e||0,e++,50>e?s.load_global_sets(t,e):"function"==typeof t&&t(!1))})},i.prototype.load_set=function(t,e,s){var n=this;jQuery.getJSON(((s||0)%2===0?o.API_SERVER:o.API_SERVER_2)+"v1/set/"+t).done(function(s){n._load_set_json(t,e,s&&s.set)}).fail(function(i){return 404==i.status?"function"==typeof e&&e(!1):(s=s||0,s++,10>s?n.load_set(t,e,s):"function"==typeof e&&e(!1))})},i.prototype.unload_set=function(t){var e=this.emote_sets[t];e&&(this.log("Unloading emoticons for set: "+t),a.update_css(this._emote_style,t,null),delete this.emote_sets[t])},i.prototype._load_set_json=function(t,e,s){if(!s)return"function"==typeof e&&e(!1);var n=this.emote_sets[t]&&this.emote_sets[t].users||[];this.emote_sets[t]=s,s.users=n,s.count=0;var i="",o=s.emoticons;s.emoticons={};for(var r=0;r<o.length;r++){var d=o[r];d.klass="ffz-emote-"+d.id,d.set_id=t,d.srcSet=d.urls[1]+" 1x",d.urls[2]&&(d.srcSet+=", "+d.urls[2]+" 2x"),d.urls[4]&&(d.srcSet+=", "+d.urls[4]+" 4x"),d.regex="!"===d.name[d.name.length-1]?new RegExp("(^|\\W|\\b)("+d.name+")(?=\\W|$)","g"):new RegExp("(^|\\W|\\b)("+d.name+")\\b","g"),i+=u(d),s.count++,s.emoticons[d.id]=d}a.update_css(this._emote_style,t,i+(s.css||"")),this.log("Updated emoticons for set #"+t+": "+s.title,s),this._cindex&&this._cindex.ffzFixTitle(),this.update_ui_link(),e&&e(!0,s)}},{"./constants":5,"./utils":35}],16:[function(e,s,n){var i=t.FrankerFaceZ,o=(e("../constants"),e("../utils"));i.prototype.find_bttv=function(e,s){return this.has_bttv=!1,t.BTTVLOADED?this.setup_bttv(s||0):void(s>=6e4?this.log("BetterTTV was not detected after 60 seconds."):setTimeout(this.find_bttv.bind(this,e,(s||0)+e),e))},i.prototype.setup_bttv=function(t){this.log("BetterTTV was detected after "+t+"ms. Hooking."),this.has_bttv=!0,document.body.classList.remove("ffz-dark"),this._dark_style&&(this._dark_style.parentElement.removeChild(this._dark_style),this._dark_style=void 0),this._layout_style&&(this._layout_style.parentElement.removeChild(this._layout_style),this._layout_style=void 0),this._chat_style&&(o.update_css(this._chat_style,"chat_font_size",""),o.update_css(this._chat_style,"chat_ts_font_size","")),this.settings.group_tabs&&this._chatv&&this._chatv.ffzDisableTabs(),this._roomv&&(this.settings.chat_hover_pause&&this._roomv.ffzDisableFreeze(),this.settings.room_status&&this._roomv.ffzUpdateStatus()),document.body.classList.remove("ffz-chat-colors"),document.body.classList.remove("ffz-chat-colors-gray"),document.body.classList.remove("ffz-chat-background"),document.body.classList.remove("ffz-chat-padding"),document.body.classList.remove("ffz-chat-separator"),document.body.classList.remove("ffz-chat-separator-3d"),document.body.classList.remove("ffz-sidebar-swap"),document.body.classList.remove("ffz-transparent-badges"),document.body.classList.remove("ffz-high-contrast-chat-text"),document.body.classList.remove("ffz-high-contrast-chat-bg"),document.body.classList.remove("ffz-high-contrast-chat-bold"),this.settings.following_count&&(this._schedule_following_count(),this._draw_following_count(),this._draw_following_channels()),this.is_dashboard&&this._update_subscribers(),document.body.classList.add("ffz-bttv");var e=BetterTTV.chat.helpers.sendMessage,s=this;BetterTTV.chat.helpers.sendMessage=function(t){var n=t.split(" ",1)[0].toLowerCase();return"/ffz"!==n?e(t):void s.run_ffz_command(t.substr(5),BetterTTV.chat.store.currentRoom)};var n,i=BetterTTV.chat.handlers.onPrivmsg;BetterTTV.chat.handlers.onPrivmsg=function(t,e){n=t;var s=i(t,e);return n=null,s};var a=BetterTTV.chat.templates.privmsg;BetterTTV.chat.templates.privmsg=function(t,e,i,o,r){try{return s.bttv_badges(r),'<div class="chat-line'+(t?" highlight":"")+(e?" action":"")+(i?" admin":"")+'" data-sender="'+(r.sender||"").toLowerCase()+'" data-room="'+n+'">'+BetterTTV.chat.templates.timestamp(r.time)+" "+(o?BetterTTV.chat.templates.modicons():"")+" "+BetterTTV.chat.templates.badges(r.badges)+BetterTTV.chat.templates.from(r.nickname,r.color)+BetterTTV.chat.templates.message(r.sender,r.message,r.emotes,e?r.color:!1)+"</div>"}catch(d){return s.log("Error: ",d),a(t,e,i,o,r)}};var r=BetterTTV.chat.templates.whisper;BetterTTV.chat.templates.whisper=function(t){try{return s.bttv_badges(t),'<div class="chat-line whisper" data-sender="'+t.sender+'">'+BetterTTV.chat.templates.timestamp(t.time)+" "+(t.badges&&t.badges.length?BetterTTV.chat.templates.badges(t.badges):"")+BetterTTV.chat.templates.whisperName(t.sender,t.receiver,t.from,t.to,t.fromColor,t.toColor)+BetterTTV.chat.templates.message(t.sender,t.message,t.emotes,!1)+"</div>"}catch(e){return s.log("Error: ",e),r(t)}};var d,u=BetterTTV.chat.templates.message;BetterTTV.chat.templates.message=function(t,e,n,i){try{i=i||!1;var o=encodeURIComponent(e);if("jtv"!==t){d=t;var a=BetterTTV.chat.templates.emoticonize(e,n);d=null;for(var r=0;r<a.length;r++)a[r]="string"==typeof a[r]?BetterTTV.chat.templates.bttvMessageTokenize(t,a[r]):a[r][0];e=a.join(" ")}return'<span class="message" '+(i?'style="color: '+i+'" ':"")+'data-raw="'+o+'" data-emotes="'+(n?encodeURIComponent(JSON.stringify(n)):"false")+'">'+e+"</span>"}catch(c){return s.log("Error: ",c),u(t,e,n,i)}};var c=BetterTTV.chat.templates.emoticonize;BetterTTV.chat.templates.emoticonize=function(t,e){var i=c(t,e),o=n||BetterTTV.getChannel(),a=o&&o.toLowerCase(),r=d&&d.toLowerCase(),u=s.getEmotes(r,a),e=[],l=s.get_user(),h=l&&l.login===r;return _.each(u,function(t){var n=s.emote_sets[t];n&&_.each(n.emoticons,function(t){_.any(i,function(e){return _.isString(e)&&e.match(t.regex)})&&e.push(t)})}),e.length&&_.each(e,function(t){var e=s._emote_tooltip(t),n=['<img class="emoticon" data-ffz-emote="'+t.id+'" srcset="'+(t.srcSet||"")+'" src="'+t.urls[1]+'" data-regex="'+t.name+'" title="'+e+'" />'],o=i;i=[];for(var r=0;r<o.length;r++){var d=o[r];if("string"==typeof d)for(var u=d.split(t.regex);u.length;){var c=u.shift();u.length?(c+=u.shift(),c&&i.push(c),u.shift(),i.push(n),h&&a&&s.add_usage(a,t.id)):i.push(c)}else i.push(d)}}),i},this.update_ui_link()}},{"../constants":5,"../utils":35}],17:[function(e,s,n){var i=t.FrankerFaceZ;i.prototype.find_emote_menu=function(e,s){return this.has_emote_menu=!1,t.emoteMenu&&emoteMenu.registerEmoteGetter?this.setup_emote_menu(s||0):void(s>=6e4?this.log("Emote Menu for Twitch was not detected after 60 seconds."):setTimeout(this.find_emote_menu.bind(this,e,(s||0)+e),e))},i.prototype.setup_emote_menu=function(t){this.log("Emote Menu for Twitch was detected after "+t+"ms. Registering emote enumerator."),emoteMenu.registerEmoteGetter("FrankerFaceZ",this._emote_menu_enumerator.bind(this))},i.prototype._emote_menu_enumerator=function(){for(var t=this.get_user(),e=t?t.login:null,s=App.__container__.lookup("controller:chat"),n=s?s.get("currentRoom.id"):null,i=this.getEmotes(e,n),o=[],a=0;a<i.length;a++){var r=this.emote_sets[i[a]];if(r&&r.emoticons)for(var d in r.emoticons)if(r.emoticons.hasOwnProperty(d)){var u=r.emoticons[d];if(!u.hidden){var c="FrankerFaceZ "+r.title,l=r.icon||"//cdn.frankerfacez.com/script/devicon.png";o.push({text:u.name,url:u.urls[1],hidden:!1,channel:c,badge:l})}}}return o}},{}],18:[function(e,s,n){var i=t.FrankerFaceZ=function(){i.instance=this,this._log_data=[],this.initialize()};i.get=function(){return i.instance};var o=i.version_info={major:3,minor:5,revision:13,toString:function(){return[o.major,o.minor,o.revision].join(".")+(o.extra||"")}};i.prototype.log=function(t,e,s,n){t="FFZ: "+t+(s?" -- "+JSON.stringify(e):""),this._log_data.push(t+(!s&&n?" -- "+JSON.stringify(e):"")),void 0!==e&&console.groupCollapsed&&console.dir?(console.groupCollapsed(t),-1!==navigator.userAgent.indexOf("Firefox/")?console.log(e):console.dir(e),console.groupEnd(t)):console.log(t)},i.prototype.error=function(t,e,s){t="FFZ Error: "+t+(s?" -- "+JSON.stringify(e):""),this._log_data.push(t),void 0!==e&&console.groupCollapsed&&console.dir?(console.groupCollapsed(t),-1!==navigator.userAgent.indexOf("Firefox/")?console.log(e):console.dir(e),console.groupEnd(t)):console.assert(!1,t)},i.prototype.paste_logs=function(){this._pastebin(this._log_data.join("\n"),function(t){return t?void console.log("FFZ: Your FrankerFaceZ log has been pasted to: "+t):console.log("FFZ Error: Unable to upload log to pastebin.")})},i.prototype._pastebin=function(t,e){jQuery.ajax({url:"http://putco.de/",type:"PUT",data:t,context:this}).success(function(t){e.bind(this)(t.trim()+".log")}).fail(function(t){e.bind(this)(null)})},i.prototype.get_user=function(){if(t.PP&&PP.login)return PP;if(t.App){var e=App.__container__.lookup("controller:login");return e?e.get("userData"):void 0}},e("./ui/menu"),e("./settings"),e("./socket"),e("./colors"),e("./emoticons"),e("./badges"),e("./tokenize"),e("./ember/channel"),e("./ember/room"),e("./ember/layout"),e("./ember/line"),e("./ember/chatview"),e("./ember/viewers"),e("./ember/moderation-card"),e("./ember/chat-input"),e("./debug"),e("./ext/betterttv"),e("./ext/emote_menu"),e("./featurefriday"),e("./ui/styles"),e("./ui/dark"),e("./ui/notifications"),e("./ui/viewer_count"),e("./ui/sub_count"),e("./ui/menu_button"),e("./ui/following"),e("./ui/following-count"),e("./ui/races"),e("./ui/my_emotes"),e("./ui/about_page"),e("./commands"),i.prototype.initialize=function(e,s){if("player.twitch.tv"!==location.hostname){if(/^\/(?:$|search$|user\/|p\/|settings|m\/|messages?\/)/.test(location.pathname))return void this.init_normal(s);if("passport"===location.hostname&&/^\/(?:authorize)/.test(location.pathname))return this.log("Running on passport!"),void this.init_normal(s,!0);if(/\/[^\/]+\/dashboard/.test(location.pathname)&&!/bookmarks$/.test(location.pathname))return void this.init_dashboard(s);var n=void 0!=t.App&&void 0!=App.__container__&&void 0!=App.__container__.resolve("model:room");return n?void this.init_ember(s):(e=e||10,void(s>=6e4?this.log('Twitch application not detected in "'+location.toString()+'". Aborting.'):setTimeout(this.initialize.bind(this,e,(s||0)+e),e)))}},i.prototype.init_player=function(e){var s=t.performance&&performance.now?performance.now():Date.now();this.log("Found Twitch Player after "+(e||0)+' ms in "'+location+'". Initializing FrankerFaceZ version '+i.version_info),this.users={},this.is_dashboard=!1;try{this.embed_in_dash=t.top!==t&&/\/[^\/]+\/dashboard/.test(t.top.location.pathname)&&!/bookmarks$/.test(t.top.location.pathname)}catch(n){this.embed_in_dash=!1}this.load_settings(),this.setup_dark();var o=t.performance&&performance.now?performance.now():Date.now(),a=o-s;this.log("Initialization complete in "+a+"ms")},i.prototype.init_normal=function(e,s){var n=t.performance&&performance.now?performance.now():Date.now();this.log("Found non-Ember Twitch after "+(e||0)+' ms in "'+location+'". Initializing FrankerFaceZ version '+i.version_info),this.users={},this.is_dashboard=!1;try{this.embed_in_dash=t.top!==t&&/\/[^\/]+\/dashboard/.test(t.top.location.pathname)&&!/bookmarks$/.test(t.top.location.pathname)}catch(o){this.embed_in_dash=!1}this.load_settings(),this.setup_dark(),s||this.ws_create(),this.setup_colors(),this.setup_emoticons(),this.setup_badges(),this.setup_notifications(),this.setup_following_count(!1),this.setup_css(),this.setup_menu(),this.find_bttv(10);var a=t.performance&&performance.now?performance.now():Date.now(),r=a-n;this.log("Initialization complete in "+r+"ms")},i.prototype.is_dashboard=!1,i.prototype.init_dashboard=function(e){var s=t.performance&&performance.now?performance.now():Date.now();this.log("Found Twitch Dashboard after "+(e||0)+' ms in "'+location+'". Initializing FrankerFaceZ version '+i.version_info),this.users={},this.is_dashboard=!0,this.embed_in_dash=!1,this.load_settings(),this.setup_dark(),this.ws_create(),this.setup_colors(),this.setup_emoticons(),this.setup_badges(),this.setup_tokenization(),this.setup_notifications(),this.setup_css(),this._update_subscribers(),this.setup_message_event(),this.find_bttv(10);var n=t.performance&&performance.now?performance.now():Date.now(),o=n-s;this.log("Initialization complete in "+o+"ms")},i.prototype.init_ember=function(e){var s=t.performance&&performance.now?performance.now():Date.now();this.log("Found Twitch application after "+(e||0)+' ms in "'+location+'". Initializing FrankerFaceZ version '+i.version_info),this.users={},this.is_dashboard=!1;try{this.embed_in_dash=t.top!==t&&/\/[^\/]+\/dashboard/.test(t.top.location.pathname)&&!/bookmarks$/.test(t.top.location.pathname)}catch(n){this.embed_in_dash=!1}this.load_settings(),this.setup_dark(),this.ws_create(),this.setup_emoticons(),this.setup_badges(),this.setup_colors(),this.setup_tokenization(),this.setup_channel(),this.setup_room(),this.setup_line(),this.setup_layout(),this.setup_chatview(),this.setup_viewers(),this.setup_mod_card(),this.setup_chat_input(),this.setup_notifications(),this.setup_css(),this.setup_menu(),this.setup_my_emotes(),this.setup_following(),this.setup_following_count(!0),this.setup_races(),this.connect_extra_chat(),this.find_bttv(10),this.find_emote_menu(10),this.check_ff();var o=t.performance&&performance.now?performance.now():Date.now(),a=o-s;this.log("Initialization complete in "+a+"ms")},i.prototype.setup_message_event=function(){this.log("Listening for Window Messages."),t.addEventListener("message",this._on_window_message.bind(this),!1)},i.prototype._on_window_message=function(t){if(t.data&&t.data.from_ffz){t.data}}},{"./badges":2,"./colors":3,"./commands":4,"./debug":6,"./ember/channel":7,"./ember/chat-input":8,"./ember/chatview":9,"./ember/layout":10,"./ember/line":11,"./ember/moderation-card":12,"./ember/room":13,"./ember/viewers":14,"./emoticons":15,"./ext/betterttv":16,"./ext/emote_menu":17,"./featurefriday":19,"./settings":20,"./socket":21,"./tokenize":22,"./ui/about_page":23,"./ui/dark":24,"./ui/following":26,"./ui/following-count":25,"./ui/menu":27,"./ui/menu_button":28,"./ui/my_emotes":29,"./ui/notifications":30,"./ui/races":31,"./ui/styles":32,"./ui/sub_count":33,"./ui/viewer_count":34}],19:[function(e,s,n){var i=t.FrankerFaceZ,o=e("./constants");i.prototype.feature_friday=null,i.prototype.check_ff=function(t){t||this.log("Checking for Feature Friday data..."),jQuery.ajax(o.SERVER+"script/event.json",{cache:!1,dataType:"json",context:this}).done(function(t){return this._load_ff(t)}).fail(function(e){return 404==e.status?this._load_ff(null):(t=t||0,t++,10>t?setTimeout(this.check_ff.bind(this,t),250):this._load_ff(null))})},i.ws_commands.reload_ff=function(){this.check_ff()},i.prototype._feature_friday_ui=function(t,e,s){if(this.feature_friday&&this.feature_friday.channel!=t){this._emotes_for_sets(e,s,[this.feature_friday.set],this.feature_friday.title,this.feature_friday.icon,"FrankerFaceZ");var n=App.__container__.lookup("controller:channel");if(!n||n.get("id")!=this.feature_friday.channel){var i=this.feature_friday,o=document.createElement("div"),a=document.createElement("a");o.className="chat-menu-content",o.style.textAlign="center";var r=i.display_name+(i.live?" is live now!":"");a.className="button primary",a.classList.toggle("live",i.live),a.classList.toggle("blue",this.has_bttv&&BetterTTV.settings.get("showBlueButtons")),a.href="http://www.twitch.tv/"+i.channel,a.title=r,a.target="_new",a.innerHTML="<span>"+r+"</span>",o.appendChild(a),e.appendChild(o)}}},i.prototype._load_ff=function(t){this.feature_friday&&(this.global_sets.removeObject(this.feature_friday.set),this.default_sets.removeObject(this.feature_friday.set),this.feature_friday=null,this.update_ui_link()),t&&t.set&&t.channel&&(this.feature_friday={set:t.set,channel:t.channel,live:!1,title:t.title||"Feature Friday",display_name:i.get_capitalization(t.channel,this._update_ff_name.bind(this))},this.global_sets.push(t.set),this.default_sets.push(t.set),this.load_set(t.set),this._update_ff_live())},i.prototype._update_ff_live=function(){if(this.feature_friday){var t=this;Twitch.api.get("streams/"+this.feature_friday.channel).done(function(e){t.feature_friday.live=null!=e.stream,t.update_ui_link()}).always(function(){t.feature_friday.timer=setTimeout(t._update_ff_live.bind(t),12e4)})}},i.prototype._update_ff_name=function(t){this.feature_friday&&(this.feature_friday.display_name=t)}},{"./constants":5}],20:[function(e,s,n){var i=t.FrankerFaceZ,o=e("./constants"),a=e("./FileSaver");make_ls=function(t){return"ffz_setting_"+t},toggle_setting=function(t,e){var s=!this.settings.get(e);this.settings.set(e,s),t.classList.toggle("active",s)},option_setting=function(t,e){this.settings.set(e,JSON.parse(t.options[t.selectedIndex].value))},toggle_basic_setting=function(t,e){var s=i.basic_settings[e].get,n=!("function"==typeof s?s.bind(this)():this.settings.get(s)),o=i.basic_settings[e].set;"function"==typeof o?o.bind(this)(n):this.settings.set(o,n),t.classList.toggle("active",n)},option_basic_setting=function(t,e){i.basic_settings[e].set.bind(this)(JSON.parse(t.options[t.selectedIndex].value))},i.settings_info={advanced_settings:{value:!1,visible:!1}},i.basic_settings={},i.prototype.load_settings=function(){this.log("Loading settings."),this.settings={};for(var e in i.settings_info)if(i.settings_info.hasOwnProperty(e)){var s=i.settings_info[e],n=s.storage_key||make_ls(e),o=s.hasOwnProperty("value")?s.value:void 0;if(localStorage.hasOwnProperty(n))try{o=JSON.parse(localStorage.getItem(n))}catch(a){this.log('Error loading value for "'+e+'": '+a)}s.process_value&&(o=s.process_value.bind(this)(o)),this.settings[e]=o}this.settings.get=this._setting_get.bind(this),this.settings.set=this._setting_set.bind(this),this.settings.del=this._setting_del.bind(this),t.addEventListener("storage",this._setting_update.bind(this),!1)},i.prototype.save_settings_file=function(){var t={version:1,script_version:i.version_info+"",aliases:this.aliases,settings:{}};for(var e in i.settings_info)if(i.settings_info.hasOwnProperty(e)){var s=i.settings_info[e],n=s.storage_key||make_ls(e);localStorage.hasOwnProperty(n)&&(t.settings[e]=this.settings[e])}var o=new Blob([JSON.stringify(t,null,4)],{type:"application/json;charset=utf-8"});a.saveAs(o,"ffz-settings.json")},i.prototype.load_settings_file=function(t){if("string"==typeof t)this._load_settings_file(t);else{var e=new FileReader,s=this;e.onload=function(t){s._load_settings_file(t.target.result)},e.readAsText(t)}},i.prototype._load_settings_file=function(t){try{t=JSON.parse(t)}catch(e){return this.error("Error Loading Settings: "+e),alert("There was an error attempting to read the provided settings data.")}this.log("Loading Settings Data",t);var s=[],n=[];if(t.settings)for(var o in t.settings)if(i.settings_info.hasOwnProperty(o)){var a=i.settings_info[o],r=t.settings[o];a.process_value&&(r=a.process_value.bind(this)(r)),r!==this.settings.get(o)&&this.settings.set(o,r),n.push(o)}else s.push(o);setTimeout(function(){alert("Successfully loaded "+n.length+" settings and skipped "+s.length+" settings.")})},i.menu_pages.settings={render:function(t,e){var s=document.createElement("ul"),n=document.createElement("div"),o=document.createElement("li"),a=document.createElement("a"),r=document.createElement("li"),d=document.createElement("a"),u=document.createElement("li"),c=document.createElement("a"),l=parseInt(e.style.maxHeight||"0");l||(l=Math.max(200,t.$().height()-172)),l&&l!==0/0&&(l-=37,n.style.maxHeight=l+"px"),n.className="ffz-ui-sub-menu-page",s.className="menu sub-menu clearfix",o.className="item",o.id="ffz-settings-page-basic",a.innerHTML="Basic",o.appendChild(a),r.className="item",r.id="ffz-settings-page-advanced",d.innerHTML="Advanced",r.appendChild(d),u.className="item",u.id="ffz-settings-page-save",c.textContent="Backup & Restore",u.appendChild(c),s.appendChild(o),s.appendChild(r),s.appendChild(u);var h=i.menu_pages.settings.change_page;a.addEventListener("click",h.bind(this,t,e,s,n,"basic")),d.addEventListener("click",h.bind(this,t,e,s,n,"advanced")),c.addEventListener("click",h.bind(this,t,e,s,n,"save")),this.settings.advanced_settings?d.click():a.click(),e.appendChild(n),e.appendChild(s)},change_page:function(t,e,s,n,o){n.innerHTML="",n.setAttribute("data-page",o);for(var a=s.querySelectorAll("li.active"),r=0,d=a.length;d>r;r++)a[r].classList.remove("active");var u=s.querySelector("#ffz-settings-page-"+o);u&&u.classList.add("active"),i.menu_pages.settings["render_"+o].bind(this)(t,n),"advanced"===o?this.settings.set("advanced_settings",!0):"basic"===o&&this.settings.set("advanced_settings",!1)},render_save:function(t,e){var s=document.createElement("div"),n=document.createElement("div"),i=document.createElement("div"),o=document.createElement("div"),a=document.createElement("p"),r=document.createElement("a"),d=document.createElement("span"),u=document.createElement("p"),c=document.createElement("input"),l=document.createElement("a"),h=document.createElement("span"),f=this;i.className="chat-menu-content",s.className="heading",s.innerHTML="Backup Settings",i.appendChild(s),a.className="clearfix option",r.href="#",r.innerHTML="Save to File",r.addEventListener("click",this.save_settings_file.bind(this)),d.className="help",d.innerHTML="This generates a JSON file containing all of your settings and prompts you to save it.",a.appendChild(r),a.appendChild(d),i.appendChild(a),o.className="chat-menu-content",
n.className="heading",n.innerHTML="Restore Settings",o.appendChild(n),u.className="clearfix option",c.type="file",c.addEventListener("change",function(){f.load_settings_file(this.files[0])}),l.href="#",l.innerHTML="Restore from File",l.addEventListener("click",function(t){t.preventDefault(),c.click()}),h.className="help",h.innerHTML="This loads settings from a previously generated JSON file.",u.appendChild(l),u.appendChild(h),o.appendChild(u),e.appendChild(i),e.appendChild(o)},render_basic:function(t,e){var s={},n=[],o=-1!==navigator.userAgent.indexOf("Android");for(var a in i.basic_settings)if(i.basic_settings.hasOwnProperty(a)){var r=i.basic_settings[a],d=r.category||"Miscellaneous",u=s[d];if(void 0!==r.visible&&null!==r.visible){var c=r.visible;if("function"==typeof r.visible&&(c=r.visible.bind(this)()),!c)continue}o&&r.no_mobile||(u||(n.push(d),u=s[d]=[]),u.push([a,r]))}n.sort(function(t,e){var t=t.toLowerCase(),e=e.toLowerCase();return"debugging"===t&&(t="zzz"+t),"debugging"===e&&(e="zzz"+e),e>t?-1:t>e?1:0});for(var l=(this._ffz_basic_settings_page||n[0],0);l<n.length;l++){var h=n[l],f=s[h],m=document.createElement("div"),_=document.createElement("div");_.className="heading",m.className="chat-menu-content",m.setAttribute("data-category",h),_.innerHTML=h,m.appendChild(_),f.sort(function(t,e){var t=t[1],e=e[1],s="boolean"===t.type?1:2,n="boolean"===e.type?1:2,i=t.name.toLowerCase(),o=e.name.toLowerCase();return n>s?-1:s>n?1:o>i?-1:i>o?1:0});for(var p=0;p<f.length;p++){var a=f[p][0],r=f[p][1],g=document.createElement("p"),v="button"!==r.type&&"function"==typeof r.get?r.get.bind(this)():this.settings.get(r.get);if(g.className="clearfix",this.has_bttv&&r.no_bttv){var b=document.createElement("span"),y=document.createElement("span");b.className="switch-label",b.innerHTML=r.name,y=document.createElement("span"),y.className="help",y.innerHTML="Disabled due to incompatibility with BetterTTV.",g.classList.add("disabled"),g.appendChild(b),g.appendChild(y)}else{if("boolean"==r.type){var w=document.createElement("a"),b=document.createElement("span");w.className="switch",w.classList.toggle("active",v),w.innerHTML="<span></span>",b.className="switch-label",b.innerHTML=r.name,g.appendChild(w),g.appendChild(b),w.addEventListener("click",toggle_basic_setting.bind(this,w,a))}else if("select"===r.type){var z=document.createElement("select"),b=document.createElement("span");b.className="option-label",b.innerHTML=r.name;for(var k in r.options){var C=document.createElement("option");C.value=JSON.stringify(k),v===k&&C.setAttribute("selected",!0),C.innerHTML=r.options[k],z.appendChild(C)}z.addEventListener("change",option_basic_setting.bind(this,z,a)),g.appendChild(b),g.appendChild(z)}else{g.classList.add("option");var E=document.createElement("a");E.innerHTML=r.name,E.href="#",g.appendChild(E),E.addEventListener("click",r.method.bind(this))}if(r.help){var y=document.createElement("span");y.className="help",y.innerHTML=r.help,g.appendChild(y)}}m.appendChild(g)}e.appendChild(m)}},render_advanced:function(t,e){var s={},n=[],o=-1!==navigator.userAgent.indexOf("Android");for(var a in i.settings_info)if(i.settings_info.hasOwnProperty(a)){var r=i.settings_info[a],d=r.category||"Miscellaneous",u=s[d];if(void 0!==r.visible&&null!==r.visible){var c=r.visible;if("function"==typeof r.visible&&(c=r.visible.bind(this)()),!c)continue}o&&r.no_mobile||(u||(n.push(d),u=s[d]=[]),u.push([a,r]))}n.sort(function(t,e){var t=t.toLowerCase(),e=e.toLowerCase();return"debugging"===t&&(t="zzz"+t),"debugging"===e&&(e="zzz"+e),e>t?-1:t>e?1:0});for(var l=this,h=this._ffz_settings_page||n[0],f=0;f<n.length;f++){var m=n[f],_=s[m],p=document.createElement("div"),g=document.createElement("div");g.className="heading",p.className="chat-menu-content collapsable",p.setAttribute("data-category",m),p.classList.toggle("collapsed",h!==m),g.innerHTML=m,p.appendChild(g),p.addEventListener("click",function(){if(this.classList.contains("collapsed")){for(var t=this,s=e.querySelectorAll(".chat-menu-content:not(.collapsed)"),n=0;n<s.length;n++)s[n].classList.add("collapsed");l._ffz_settings_page=t.getAttribute("data-category"),t.classList.remove("collapsed"),setTimeout(function(){t.scrollIntoViewIfNeeded()})}}),_.sort(function(t,e){var t=t[1],e=e[1],s="boolean"===t.type?1:2,n="boolean"===e.type?1:2,i=t.name.toLowerCase(),o=e.name.toLowerCase();return n>s?-1:s>n?1:o>i?-1:i>o?1:0});for(var v=0;v<_.length;v++){var a=_[v][0],r=_[v][1],b=document.createElement("p"),y=this.settings.get(a);if(b.className="clearfix",this.has_bttv&&r.no_bttv){var w=document.createElement("span"),z=document.createElement("span");w.className="switch-label",w.innerHTML=r.name,z=document.createElement("span"),z.className="help",z.innerHTML="Disabled due to incompatibility with BetterTTV.",b.classList.add("disabled"),b.appendChild(w),b.appendChild(z)}else{if("boolean"==r.type){var k=document.createElement("a"),w=document.createElement("span");k.className="switch",k.classList.toggle("active",y),k.innerHTML="<span></span>",w.className="switch-label",w.innerHTML=r.name,b.appendChild(k),b.appendChild(w),k.addEventListener("click",toggle_setting.bind(this,k,a))}else if("select"===r.type){var C=document.createElement("select"),w=document.createElement("span");w.className="option-label",w.innerHTML=r.name;for(var E in r.options){var x=document.createElement("option");x.value=JSON.stringify(E),y===E&&x.setAttribute("selected",!0),x.innerHTML=r.options[E],C.appendChild(x)}C.addEventListener("change",option_setting.bind(this,C,a)),b.appendChild(w),b.appendChild(C)}else{b.classList.add("option");var T=document.createElement("a");T.innerHTML=r.name,T.href="#",b.appendChild(T),T.addEventListener("click",r.method.bind(this))}if(r.help){var z=document.createElement("span");z.className="help",z.innerHTML=r.help,b.appendChild(z)}}p.appendChild(b)}e.appendChild(p)}},name:"Settings",icon:o.GEAR,sort_order:99999,wide:!0,sub_menu:!0},i.prototype._setting_update=function(e){if(e||(e=t.event),e.key&&"ffz_setting_"===e.key.substr(0,12)){var s=e.key,n=s.substr(12),o=void 0,a=i.settings_info[n];if(!a){for(n in i.settings_info)if(i.settings_info.hasOwnProperty(n)&&(a=i.settings_info[n],a.storage_key==s))break;if(a.storage_key!=s)return}this.log("Updated Setting: "+n);try{o=JSON.parse(e.newValue)}catch(r){this.log('Error loading new value for "'+n+'": '+r),o=a.value||void 0}if(this.settings[n]=o,a.on_update)try{a.on_update.bind(this)(o,!1)}catch(r){this.log('Error running updater for setting "'+n+'": '+r)}}},i.prototype._setting_get=function(t){return this.settings[t]},i.prototype._setting_set=function(t,e){var s=i.settings_info[t],n=s.storage_key||make_ls(t),o=JSON.stringify(e);if(this.settings[t]=e,localStorage.setItem(n,o),this.log('Changed Setting "'+t+'" to: '+o),s.on_update)try{s.on_update.bind(this)(e,!0)}catch(a){this.log('Error running updater for setting "'+t+'": '+a)}},i.prototype._setting_del=function(t){var e=i.settings_info[t],s=e.storage_key||make_ls(t),n=void 0;if(localStorage.hasOwnProperty(s)&&localStorage.removeItem(s),delete this.settings[t],e&&(n=this.settings[t]=e.hasOwnProperty("value")?e.value:void 0),e.on_update)try{e.on_update.bind(this)(n,!0)}catch(o){this.log('Error running updater for setting "'+t+'": '+o)}}},{"./FileSaver":1,"./constants":5}],21:[function(e,s,n){var i=t.FrankerFaceZ;i.prototype._ws_open=!1,i.prototype._ws_delay=0,i.prototype._ws_last_iframe=0,i.ws_commands={},i.ws_on_close=[],i.prototype.ws_iframe=function(){this._ws_last_iframe=Date.now();var t=document.createElement("iframe"),e=this;t.src="http://catbag.frankerfacez.com",t.style.visibility="hidden",document.body.appendChild(t),setTimeout(function(){document.body.removeChild(t),e._ws_open||e.ws_create()},2e3)},i.prototype.ws_create=function(){var e,s=this;this._ws_last_req=0,this._ws_callbacks={},this._ws_pending=this._ws_pending||[];try{e=this._ws_sock=new WebSocket("ws://catbag.frankerfacez.com/")}catch(n){return this._ws_exists=!1,this.log("Error Creating WebSocket: "+n)}this._ws_exists=!0,e.onopen=function(e){s._ws_open=!0,s._ws_delay=0,s._ws_last_iframe=Date.now(),s.log("Socket connected.");var n=t.RequestFileSystem||t.webkitRequestFileSystem;n?n(t.TEMPORARY,100,s.ws_send.bind(s,"hello",["ffz_"+i.version_info,localStorage.ffzClientId],s._ws_on_hello.bind(s)),s.log.bind(s,"Operating in Incognito Mode.")):s.ws_send("hello",["ffz_"+i.version_info,localStorage.ffzClientId],s._ws_on_hello.bind(s));var o=s.get_user();if(o&&s.ws_send("setuser",o.login),s.is_dashboard){var a=location.pathname.match(/\/([^\/]+)/);a&&(s.ws_send("sub",a[1]),s.ws_send("sub_channel",a[1]))}for(var r in s.rooms)s.rooms.hasOwnProperty(r)&&s.rooms[r]&&(s.ws_send("sub",r),s.rooms[r].needs_history&&(s.rooms[r].needs_history=!1,!s.has_bttv&&s.settings.chat_history&&s.ws_send("chat_history",[r,25],s._load_history.bind(s,r))));if(s._cindex){var d=s._cindex.get("controller.id"),u=s._cindex.get("controller.hostModeTarget.id");d&&s.ws_send("sub_channel",d),u&&s.ws_send("sub_channel",u)}var c=s._ws_pending;s._ws_pending=[];for(var l=0;l<c.length;l++){var h=c[l];s.ws_send(h[0],h[1],h[2])}},e.onclose=function(t){s.log("Socket closed. (Code: "+t.code+", Reason: "+t.reason+")"),s._ws_open=!1;for(var e=0;e<i.ws_on_close.length;e++)try{i.ws_on_close[e].bind(s)()}catch(n){s.log("Error on Socket Close Callback: "+n)}if(s._ws_delay>1e4){var o=navigator.userAgent.toLowerCase();if(Date.now()-s._ws_last_iframe>18e5&&(-1!==o.indexOf("chrome")||-1===o.indexOf("safari")))return s.ws_iframe()}s._ws_delay<6e4?s._ws_delay+=1e3*(Math.floor(10*Math.random())+5):s._ws_delay=1e3*(Math.floor(60*Math.random())+30),setTimeout(s.ws_create.bind(s),s._ws_delay)},e.onmessage=function(t){var e,n,o=t.data.indexOf(" "),a=t.data.substr(o+1),r=parseInt(t.data.slice(0,o));if(o=a.indexOf(" "),-1===o&&(o=a.length),e=a.slice(0,o),a=a.substr(o+1),a&&(n=JSON.parse(a)),-1===r){var d=i.ws_commands[e];d?d.bind(s)(n):s.log("Invalid command: "+e,n,!1,!0)}else{var u="True"===e,c="function"==typeof s._ws_callbacks[r];if(c){try{s._ws_callbacks[r](u,n)}catch(l){s.error("Callback for "+r+": "+l)}s._ws_callbacks[r]=void 0}else s.log("Socket Reply to "+r+" - "+(u?"SUCCESS":"FAIL"),n,!1,!0)}}},i.prototype.ws_send=function(t,e,s,n){if(!this._ws_open){if(n){var i=this._ws_pending=this._ws_pending||[];return i.push([t,e,s]),!0}return!1}var o=++this._ws_last_req;e=void 0!==e?" "+JSON.stringify(e):"",s&&(this._ws_callbacks[o]=s);try{this._ws_sock.send(o+" "+t+e)}catch(a){return this.log("Socket Send Error: "+a),!1}return o},i.prototype._ws_on_hello=function(t,e){if(!t)return this.log("Error Saying Hello: "+e);localStorage.ffzClientId=e,this.log("Client ID: "+e);var s={},n=s.settings={};for(var o in i.settings_info)n[o]=this.settings[o];n.keywords=this.settings.keywords.length,n.banned_words=this.settings.banned_words.length,s.bttv=this.has_bttv||!!document.head.querySelector('script[src*="betterttv"]'),s["user-agent"]=navigator.userAgent,s.screen=[screen.width,screen.height],s.language=navigator.language,s.platform=navigator.platform,this.ws_send("survey",[s])},i.ws_commands.do_authorize=function(t){var e;for(var s in this.rooms)if(this.rooms.hasOwnProperty(s)){var n=this.rooms[s];if(n&&n.room&&!n.room.get("roomProperties.eventchat")&&!n.room.get("isGroupRoom")&&n.room.tmiRoom){var o=n.room.tmiRoom._getConnection();if(o.isConnected){e=o;break}}}e?e._send("PRIVMSG #frankerfacezauthorizer :AUTH "+t):setTimeout(i.ws_commands.do_authorize.bind(this,t),5e3)}},{}],22:[function(e,s,n){var i,o=t.FrankerFaceZ,a=e("./utils"),r=e("./constants"),d="http://static-cdn.jtvnw.net/emoticons/v1/",u={};build_srcset=function(t){if(u[t])return u[t];var e=u[t]=d+t+"/1.0 1x, "+d+t+"/2.0 2x, "+d+t+"/3.0 4x";return e},data_to_tooltip=function(t){var e=t.set,s=t.set_type,n=t.owner;return void 0===s&&(s="Channel"),e?("--global--"===e?(e="Twitch Global",s=null):("--twitch-turbo--"==e||"turbo"==e||"--turbo-faces--"==e)&&(e="Twitch Turbo",s=null),"Emoticon: "+t.code+"\n"+(s?s+": ":"")+e+(n?"\nBy: "+n.display_name:"")):t.code},build_tooltip=function(t){{var e=this._twitch_emotes[t];e?e.set:null}return e?"string"==typeof e?e:e.tooltip?e.tooltip:e.tooltip=data_to_tooltip(e):"???"},load_emote_data=function(t,e,s,n){if(!s)return e;e&&(n.code=e),this._twitch_emotes[t]=n;for(var i=build_tooltip.bind(this)(t),o=document.querySelectorAll('img[data-emote="'+t+'"]'),a=0;a<o.length;a++)o[a].title=i;return i},reg_escape=function(t){return t.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")},LINK=/(?:https?:\/\/)?(?:[-a-zA-Z0-9@:%_\+~#=]+\.)+[a-z]{2,6}\b(?:[-a-zA-Z0-9@:%_\+.~#!?&//=]*)/g,SEPARATORS="[\\s`~<>!-#%-\\x2A,-/:;\\x3F@\\x5B-\\x5D_\\x7B}\\u00A1\\u00A7\\u00AB\\u00B6\\u00B7\\u00BB\\u00BF\\u037E\\u0387\\u055A-\\u055F\\u0589\\u058A\\u05BE\\u05C0\\u05C3\\u05C6\\u05F3\\u05F4\\u0609\\u060A\\u060C\\u060D\\u061B\\u061E\\u061F\\u066A-\\u066D\\u06D4\\u0700-\\u070D\\u07F7-\\u07F9\\u0830-\\u083E\\u085E\\u0964\\u0965\\u0970\\u0AF0\\u0DF4\\u0E4F\\u0E5A\\u0E5B\\u0F04-\\u0F12\\u0F14\\u0F3A-\\u0F3D\\u0F85\\u0FD0-\\u0FD4\\u0FD9\\u0FDA\\u104A-\\u104F\\u10FB\\u1360-\\u1368\\u1400\\u166D\\u166E\\u169B\\u169C\\u16EB-\\u16ED\\u1735\\u1736\\u17D4-\\u17D6\\u17D8-\\u17DA\\u1800-\\u180A\\u1944\\u1945\\u1A1E\\u1A1F\\u1AA0-\\u1AA6\\u1AA8-\\u1AAD\\u1B5A-\\u1B60\\u1BFC-\\u1BFF\\u1C3B-\\u1C3F\\u1C7E\\u1C7F\\u1CC0-\\u1CC7\\u1CD3\\u2010-\\u2027\\u2030-\\u2043\\u2045-\\u2051\\u2053-\\u205E\\u207D\\u207E\\u208D\\u208E\\u2329\\u232A\\u2768-\\u2775\\u27C5\\u27C6\\u27E6-\\u27EF\\u2983-\\u2998\\u29D8-\\u29DB\\u29FC\\u29FD\\u2CF9-\\u2CFC\\u2CFE\\u2CFF\\u2D70\\u2E00-\\u2E2E\\u2E30-\\u2E3B\\u3001-\\u3003\\u3008-\\u3011\\u3014-\\u301F\\u3030\\u303D\\u30A0\\u30FB\\uA4FE\\uA4FF\\uA60D-\\uA60F\\uA673\\uA67E\\uA6F2-\\uA6F7\\uA874-\\uA877\\uA8CE\\uA8CF\\uA8F8-\\uA8FA\\uA92E\\uA92F\\uA95F\\uA9C1-\\uA9CD\\uA9DE\\uA9DF\\uAA5C-\\uAA5F\\uAADE\\uAADF\\uAAF0\\uAAF1\\uABEB\\uFD3E\\uFD3F\\uFE10-\\uFE19\\uFE30-\\uFE52\\uFE54-\\uFE61\\uFE63\\uFE68\\uFE6A\\uFE6B\\uFF01-\\uFF03\\uFF05-\\uFF0A\\uFF0C-\\uFF0F\\uFF1A\\uFF1B\\uFF1F\\uFF20\\uFF3B-\\uFF3D\\uFF3F\\uFF5B\\uFF5D\\uFF5F-\\uFF65]",SPLITTER=new RegExp(SEPARATORS+"*,"+SEPARATORS+"*"),LINK_SPLIT=/^(?:(https?):\/\/)?(?:(.*?)@)?([^\/:]+)(?::(\d+))?(.*?)(?:\?(.*?))?(?:\#(.*?))?$/,YOUTUBE_CHECK=/^(?:https?:\/\/)?(?:m\.|www\.)?youtu(?:be\.com|\.be)\/(?:v\/|watch\/|.*?(?:embed|watch).*?v=)?([a-zA-Z0-9\-_]+)$/,IMGUR_PATH=/^\/(?:gallery\/)?[A-Za-z0-9]+(?:\.(?:png|jpg|jpeg|gif|gifv|bmp))?$/,IMAGE_EXT=/\.(?:png|jpg|jpeg|gif|bmp)$/i,IMAGE_DOMAINS=[],is_image=function(t,e){var s=t.match(LINK_SPLIT);if(s){var n=s[3].toLowerCase(),i=s[4],o=s[5];return i&&"80"!==i&&"443"!==i?!1:"i.imgur.com"===n||"imgur.com"===n||"www.imgur.com"===n||"m.imgur.com"===n?IMGUR_PATH.test(o):e?IMAGE_EXT.test(o):-1!==IMAGE_DOMAINS.indexOf(n)}},image_iframe=function(t,e){return'<iframe class="ffz-image-hover'+(e?" "+e:"")+'" allowtransparency="true" src="'+r.SERVER+"script/image-proxy.html?"+a.quote_attr(t)+'"></iframe>'},build_link_tooltip=function(t){var e,s=this._link_data[t];if(!s)return"";if(s.tooltip)return s.tooltip;if("youtube"==s.type)e=this.settings.link_image_hover?image_iframe(s.full||t,"ffz-yt-thumb"):"",e+="<b>YouTube: "+a.sanitize(s.title)+"</b><hr>",e+="Channel: "+a.sanitize(s.channel)+" | "+a.time_to_string(s.duration)+"<br>",e+=a.number_commas(s.views||0)+" Views | &#128077; "+a.number_commas(s.likes||0)+" &#128078; "+a.number_commas(s.dislikes||0);else if("strawpoll"==s.type){e="<b>Strawpoll: "+a.sanitize(s.title)+"</b><hr><table><tbody>";for(var n in s.items){{var i=s.items[n];Math.floor(i/s.total*100)}e+='<tr><td style="text-align:left">'+a.sanitize(n)+'</td><td style="text-align:right">'+a.number_commas(i)+"</td></tr>"}e+="</tbody></table><hr>Total: "+a.number_commas(s.total);var o=a.parse_date(s.fetched);if(o){var r=Math.floor((o.getTime()-Date.now())/1e3);r>60&&(e+="<br><small>Data was cached "+a.time_to_string(r)+" ago.</small>")}}else if("twitch"==s.type){e="<b>Twitch: "+a.sanitize(s.display_name)+"</b><hr>";var d=a.parse_date(s.since);d&&(e+="Member Since: "+a.date_string(d)+"<br>"),e+="<nobr>Views: "+a.number_commas(s.views)+"</nobr> | <nobr>Followers: "+a.number_commas(s.followers)+"</nobr>"}else if("twitch_vod"==s.type)e="<b>Twitch "+("highlight"==s.broadcast_type?"Highlight":"Broadcast")+": "+a.sanitize(s.title)+"</b><hr>",e+="By: "+a.sanitize(s.display_name)+(s.game?" | Playing: "+a.sanitize(s.game):" | Not Playing")+"<br>",e+="Views: "+a.number_commas(s.views)+" | "+a.time_to_string(s.length);else if("twitter"==s.type)e="<b>Tweet By: "+a.sanitize(s.user)+"</b><hr>",e+=a.sanitize(s.tweet);else if("reputation"==s.type){if(e=this.settings.link_image_hover&&is_image(s.full||t,this.settings.image_hover_all_domains)?image_iframe(s.full||t):"",e+='<span style="word-wrap: break-word">'+a.sanitize(s.full.toLowerCase())+"</span>",s.trust<50||s.safety<50||s.tags&&s.tags.length>0){e+="<hr>";var u=!1;(s.trust<50||s.safety<50)&&(s.unsafe=!0,e+="<b>Potentially Unsafe Link</b><br>",e+="Trust: "+s.trust+"% | Child Safety: "+s.safety+"%",u=!0),s.tags&&s.tags.length>0&&(e+=(u?"<br>":"")+"Tags: "+s.tags.join(", ")),e+="<br>Data Source: WOT"}}else s.full&&(e=this.settings.link_image_hover&&is_image(s.full||t,this.settings.image_hover_all_domains)?image_iframe(s.full||t):"",e+='<span style="word-wrap: break-word">'+a.sanitize(s.full.toLowerCase())+"</span>");return e||(e='<span style="word-wrap: break-word">'+a.sanitize(t.toLowerCase())+"</span>"),s.tooltip=e,e},load_link_data=function(t,e,s){if(e){this._link_data[t]=s,s.unsafe=!1;var n,i=build_link_tooltip.bind(this)(t),o="/"==t.charAt(t.length-1)?t.substr(0,t.length-1):null;if(n=document.querySelectorAll(o?'span.message a[href="'+t+'"], span.message a[href="'+o+'"], span.message a[data-url="'+t+'"], span.message a[data-url="'+o+'"]':'span.message a[href="'+t+'"], span.message a[data-url="'+t+'"]'),this.settings.link_info)for(var a=0;a<n.length;a++)s.unsafe&&n[a].classList.add("unsafe-link"),n[a].classList.contains("deleted-link")||(n[a].title=i)}},o.SRC_IDS={},o.src_to_id=function(t){if(o.SRC_IDS.hasOwnProperty(t))return o.SRC_IDS[t];var e=/\/emoticons\/v1\/(\d+)\/1\.0/.exec(t),s=e?parseInt(e[1]):null;return s===0/0&&(s=null),o.SRC_IDS[t]=s,s};var c=new Date(0).toLocaleTimeString().toUpperCase();o.settings_info.twenty_four_timestamps={type:"boolean",value:-1===c.lastIndexOf("PM")&&-1===c.lastIndexOf("AM"),category:"Chat Appearance",no_bttv:!0,name:"24hr Timestamps",help:"Display timestamps in chat in the 24 hour format rather than 12 hour."},o.settings_info.show_deleted_links={type:"boolean",value:!1,category:"Chat Moderation",no_bttv:!0,name:"Show Deleted Links",help:"Do not delete links based on room settings or link length."},o.prototype.setup_tokenization=function(){if(this._twitch_emotes={},this._twitch_emote_to_set={},this._twitch_set_to_channel={},this._link_data={},this.load_twitch_emote_data(),i=t.require&&t.require("ember-twitch-chat/helpers/chat-line-helpers"),!i)return this.log("Unable to get chat helper functions.");this.log("Hooking Ember chat line helpers.");var e=this;i.getTime=function(t){if(void 0===t||null===t)return"?:??";var s=t.getHours(),n=t.getMinutes();return s>12&&!e.settings.twenty_four_timestamps?s-=12:0!==s||e.settings.twenty_four_timestamps||(s=12),s+":"+(10>n?"0":"")+n},i.linkifyMessage=function(t,s){var n=e.settings.show_deleted_links;return _.chain(t).map(function(t){if(!_.isString(t))return t;var e=t.match(LINK);return e&&e.length?_.zip(t.split(LINK),_.map(e,function(t){var e=t.length>255;return n||!s&&!e?{isLink:!0,href:t}:{isLink:!0,isDeleted:!0,isLong:e,href:t}})):[t]}).flatten().compact().value()}},o.prototype.load_twitch_emote_data=function(t){jQuery.ajax(r.SERVER+"script/twitch_emotes.json",{cache:!1,context:this}).done(function(t){for(var e in t){var s=t[e];if(s){this._twitch_set_to_channel[e]=s.name;for(var n=0,i=s.emotes.length;i>n;n++)this._twitch_emote_to_set[s.emotes[n]]=e}}this._twitch_set_to_channel[0]="--global--",this._twitch_set_to_channel[33]="--turbo-faces--",this._twitch_set_to_channel[42]="--turbo-faces--"}).fail(function(e){404!==e.status&&(t=(t||0)+1,10>t&&setTimeout(this.load_twitch_emote_data.bind(this,t),1e3))})},o.prototype.tokenize_chat_line=function(e,s,n){if(e.cachedTokens)return e.cachedTokens;var a=e.message,r=this.get_user(),d=e.room,u=r&&e.from===r.login,c=e.tags&&e.tags.emotes,l=[a];if(i&&i.linkifyMessage){var h=a.labels||[],f=-1!==h.indexOf("owner")||-1!==h.indexOf("staff")||-1!==h.indexOf("admin")||-1!==h.indexOf("global_mod")||-1!==h.indexOf("mod")||"admin"===a.style;l=i.linkifyMessage(l,n&&!f)}r&&r.login&&i&&i.mentionizeMessage&&(l=i.mentionizeMessage(l,r.login,u)),i&&i.emoticonizeMessage&&(l=i.emoticonizeMessage(l,c)),this.settings.replace_bad_emotes&&(l=this.tokenize_replace_emotes(l)),l=this._remove_banned(l),l=this.tokenize_emotes(e.from,d,l,u),this.settings.parse_emoji&&(l=this.tokenize_emoji(l));var m=e.tags&&e.tags["display-name"];if(m&&m.length&&(o.capitalization[e.from]=[m.trim(),Date.now()]),!u){l=this.tokenize_mentions(l);for(var p=0;p<l.length;p++){var g=l[p];if("whisper"===e.style||!_.isString(g)&&g.mentionedUser&&!g.own){if(e.ffz_has_mention=!0,d&&!this.has_bttv&&this.settings.group_tabs&&this._chatv&&this._chatv._ffz_tabs){var v=this._chatv._ffz_tabs.querySelector('.ffz-chat-tab[data-room="'+d+'"]');v&&!v.classList.contains("active")&&v.classList.add("tab-mentioned")}if(this._chatv&&this.settings.highlight_notifications&&!this.embed_in_dash&&!document.hasFocus()&&!s){var b,y=this.rooms[d]&&this.rooms[d].room;if(this.settings.group_tabs&&(-1!==this.settings.pinned_rooms.indexOf(d)||this._chatv._ffz_host)||y.get("isGroupRoom")||y===this._chatv.get("controller.currentChannelRoom")){b=y&&y.get("isGroupRoom")?y.get("tmiRoom.displayName"):o.get_capitalization(d),m=m||Twitch.display.capitalize(e.from),a="action"===e.style?"* "+m+" "+a:m+": "+a;"whisper"===e.style?this.show_notification(a,"Twitch Chat Whisper","ffz_whisper_notice",1e3*this.settings.notification_timeout,function(){t.focus()}):this.show_notification(a,"Twitch Chat Mention in "+b,d,1e3*this.settings.notification_timeout,function(){t.focus();var e=App.__container__.lookup("controller:chat");y&&e&&e.focusRoom(y)})}}break}}}return e.cachedTokens=l,l},o.prototype.tokenize_line=function(t,e,s,n,o){if("string"==typeof s&&(s=[s]),i&&i.linkifyMessage&&(s=i.linkifyMessage(s)),i&&i.mentionizeMessage){var a=this.get_user();a&&a.login&&(s=i.mentionizeMessage(s,a.login,t===a.login))}return n||(s=this.tokenize_emotes(t,e,s),this.settings.replace_bad_emotes&&(s=this.tokenize_replace_emotes(s))),this.settings.parse_emoji&&!o&&(s=this.tokenize_emoji(s)),s},o.prototype.render_tokens=function(t,e){var s=this;return _.map(t,function(t){if(t.emoticonSrc){var n,i,d;if(t.ffzEmote){var u=s.emote_sets&&s.emote_sets[t.ffzEmoteSet],c=u&&u.emoticons&&u.emoticons[t.ffzEmote];n=c?a.sanitize(s._emote_tooltip(c)):t.altText,i=c?c.srcSet:t.srcSet,d=' data-ffz-emote="'+c.id+'"'}else if(t.ffzEmoji){var l=t.ffzEmoji,h=s.emoji_data&&s.emoji_data[l];n=h?"Emoji: "+t.altText+"\nName: :"+h.short_name+":":t.altText,i=h?h.srcSet:t.srcSet,d=' data-ffz-emoji="'+l+'"'}else{var f=t.replacedId||o.src_to_id(t.emoticonSrc),m=f&&s._twitch_emotes&&s._twitch_emotes[f];if(m)n=m.tooltip?m.tooltip:t.altText;else try{var _=s._twitch_emote_to_set[f];_?n=load_emote_data.bind(s)(f,t.altText,!0,{code:t.altText,id:f,set:s._twitch_set_to_channel[_],set_id:_}):(n=s._twitch_emotes[f]=t.altText,s.ws_send("twitch_emote",f,load_emote_data.bind(s,f,t.altText)))}catch(p){s.error("Error Generating Emote Tooltip: "+p)}d=' data-emote="'+f+'"',r.EMOTE_REPLACEMENTS[f]||(i=build_srcset(f))}return'<img class="emoticon tooltip"'+(d||"")+' src="'+a.quote_attr(t.emoticonSrc)+'" '+(i?'srcset="'+a.quote_attr(i)+'" ':"")+'alt="'+a.quote_attr(t.altText)+'" title="'+a.quote_attr(n)+'">'}if(t.isLink){var g=t.title||t.isLong&&"<long link>"||t.isDeleted&&"<deleted link>"||t.href;if(!e&&void 0!==e)return a.sanitize(g);var n,v=t.href,b="",y=v.indexOf("@"),w=v.indexOf("/");if(-1!==y&&(-1===w||w>y))b="email-link",s.settings.link_info&&(b+=" tooltip",n="E-Mail "+v),v="mailto:"+v;else if(v.match(/^https?:\/\//)||(v="http://"+v),s.settings.link_info){b="html-tooltip";var m=s._link_data&&s._link_data[v];m?(n=m.tooltip,m.unsafe&&(b+=" unsafe-link")):(s._link_data=s._link_data||{},s._link_data[v]=!0,s.ws_send("get_link",v,load_link_data.bind(s,v)),s.settings.link_image_hover&&is_image(v,s.settings.image_hover_all_domains)&&(n=image_iframe(v)))}else s.settings.link_image_hover&&(b="html-tooltip",is_image(v,s.settings.image_hover_all_domains)&&(n=image_iframe(v)));var z=v;return t.isDeleted&&(b="deleted-link "+b,n=a.sanitize(t.censoredHref||t.href),v="#"),'<a class="'+b+'" data-url="'+a.quote_attr(z)+'" href="'+a.quote_attr(v||"#")+'" title="'+a.quote_attr(n||"")+'" target="_blank">'+a.sanitize(g)+"</a>"}return t.mentionedUser?'<span class="'+(t.own?"mentioning":"mentioned")+'">'+a.sanitize(t.mentionedUser)+"</span>":a.sanitize(t.deletedLink?t.text:t)}).join("")},o.prototype.tokenize_replace_emotes=function(t){_.isString(t)&&(t=[t]);for(var e=0;e<t.length;e++){var s=t[e];if(s&&s.emoticonSrc&&!s.ffzEmote){var n=o.src_to_id(s.emoticonSrc);r.EMOTE_REPLACEMENTS.hasOwnProperty(n)&&(s.replacedId=n,s.emoticonSrc=r.EMOTE_REPLACEMENT_BASE+r.EMOTE_REPLACEMENTS[n])}}return t},o.prototype.tokenize_title_emotes=function(t){var e=this,s=App.__container__.lookup("controller:channel"),n=s&&s.get("product.emoticons"),i=[];return _.isString(t)&&(t=[t]),_.each(_.union(e.__twitch_global_emotes||[],n),function(e){if(e&&"inactive"!==e.state){var s=new RegExp("\\b"+e.regex+"\\b");_.any(t,function(t){return _.isString(t)&&t.match(s)})&&i.push(e)}}),(void 0===e.__twitch_global_emotes||null===e.__twitch_global_emotes)&&(e.__twitch_global_emotes=!1,Twitch.api.get("chat/emoticon_images",{emotesets:"0,42"}).done(function(t){if(!t||!t.emoticon_sets||!t.emoticon_sets[0])return void(e.__twitch_global_emotes=[]);var s=e.__twitch_global_emotes=[];t=t.emoticon_sets[0];for(var n=0;n<t.length;n++){var i=t[n];s.push({regex:i.code,url:d+i.id+"/1.0"})}e._cindex&&e._cindex.ffzFixTitle()}).fail(function(){setTimeout(function(){e.__twitch_global_emotes=null},5e3)})),i.length?("string"==typeof t&&(t=[t]),_.each(i,function(e){var s={isEmoticon:!0,srcSet:e.url+" 1x",emoticonSrc:e.url,altText:e.regex},n=new RegExp("\\b"+e.regex+"\\b");t=_.compact(_.flatten(_.map(t,function(t){if(_.isObject(t))return t;var e=t.split(n),i=[];return e.forEach(function(t,n){i.push(t),n!==e.length-1&&i.push(s)}),i})))}),t):t},o.prototype.tokenize_emotes=function(t,e,s,n){var i=this,o=this.getEmotes(t,e),a=[];return _.each(o,function(t){var e=i.emote_sets[t];e&&_.each(e.emoticons,function(t){_.any(s,function(e){return _.isString(e)&&e.match(t.regex)})&&a.push(t)})}),a.length?("string"==typeof s&&(s=[s]),_.each(a,function(t){var o={srcSet:t.srcSet,emoticonSrc:t.urls[1],ffzEmote:t.id,ffzEmoteSet:t.set_id,altText:t.hidden?"???":t.name};s=_.compact(_.flatten(_.map(s,function(s){if(_.isObject(s))return s;for(var a=s.split(t.regex),r=[];a.length;){var d=a.shift();a.length?(d+=a.shift(),d&&r.push(d),a.shift(),r.push(o),n&&e&&i.add_usage(e,t.id)):r.push(d)}return r})))}),s):s},o.prototype.tokenize_emoji=function(t){if("string"==typeof t&&(t=[t]),!this.emoji_data)return t;var e=this;return _.compact(_.flatten(_.map(t,function(t){if(_.isObject(t))return t;for(var s=t.split(r.EMOJI_REGEX),n=[];s.length;){var i=s.shift();if(i&&n.push(i),s.length){var o=s.shift(),d=s.shift();if(""===d)n.push(o);else{var u=a.emoji_to_codepoint(o,d),c=e.emoji_data[u];n.push(c?c.token:o+(d||""))}}}return n})))},o._regex_cache={},o._get_regex=function(t){return o._regex_cache[t]=o._regex_cache[t]||RegExp("\\b"+reg_escape(t)+"\\b","ig")},o._words_to_regex=function(t){var e=o._regex_cache[t];if(!e){for(var s="",n=0;n<t.length;n++)t[n]&&(s+=(s?"|":"")+reg_escape(t[n]));e=o._regex_cache[t]=new RegExp("(^|.*?"+SEPARATORS+")("+s+")(?=$|"+SEPARATORS+")","ig")}return e},o.prototype.tokenize_mentions=function(t){var e=this.settings.keywords;if(!e||!e.length)return t;"string"==typeof t&&(t=[t]);for(var s=o._words_to_regex(e),n=[],i=0;i<t.length;i++){var a=t[i];_.isString(a)&&a.match(s)?(a=a.replace(s,function(t,e,s){return n.push(e),n.push({mentionedUser:s,own:!1}),""}),a&&n.push(a)):n.push(a)}return n},o.prototype._deleted_link_click=function(t){if(!this.classList.contains("deleted-link"))return!0;var e=this.getAttribute("data-url"),s=e,n=FrankerFaceZ.get();this.classList.remove("deleted-link"),this.removeAttribute("data-url"),this.removeAttribute("title"),this.removeAttribute("original-title"),e.indexOf("@")>-1&&(-1===e.indexOf("/")||e.indexOf("@")<e.indexOf("/"))?e="mailto:"+e:e.match(/^https?:\/\//)||(e="http://"+e),this.href=e,this.target="_new",this.textContent=s;var i=n._link_data[s];i&&"boolean"!=typeof i&&(this.title=i.tooltip,i.unsafe&&this.classList.add("unsafe-link")),t.preventDefault()}},{"./constants":5,"./utils":35}],23:[function(e,s,n){var i=t.FrankerFaceZ,o=e("../constants");i.menu_pages.about_changelog={name:"Changelog",visible:!1,wide:!0,render:function(t,e){var s=document.createElement("div");s.className="chat-menu-content center",s.innerHTML='<h1>FrankerFaceZ</h1><div class="ffz-about-subheading">change log</div>',jQuery.ajax(o.SERVER+"script/changelog.html",{cache:!1,context:this}).done(function(t){e.appendChild(s),e.innerHTML+=t}).fail(function(t){var n=document.createElement("div");n.className="chat-menu-content menu-side-padding",n.textContent="There was an error loading the change log from the server.",e.appendChild(s),e.appendChild(n)})}},i.menu_pages.about={name:"About",icon:o.HEART,sort_order:1e5,render:function(t,e,s,n){var o=this.rooms[t.get("context.currentRoom.id")],a=!1,r=this;if(o&&o.set){var d=this.emote_sets[o.set];d&&d.count>0&&(a=!0)}var u=document.createElement("div"),c="";c+="<h1>FrankerFaceZ</h1>",c+='<div class="ffz-about-subheading">new ways to woof</div>',u.className="chat-menu-content center",u.innerHTML=c,e.appendChild(u);var l=0,h=u.querySelector("h1");h&&h.addEventListener("click",function(){if(h.style.cursor="pointer",l++,l>=3){l=0;var t=document.querySelector(".app-main")||document.querySelector(".ember-chat-container");t&&t.classList.toggle("ffz-flip")}setTimeout(function(){l=0,h.style.cursor=""},2e3)});var f=document.createElement("div"),m=document.createElement("a"),_="To use custom emoticons in "+(a?"this channel":"tons of channels")+", get FrankerFaceZ from http://www.frankerfacez.com";m.className="button primary",m.innerHTML="Advertise in Chat",m.addEventListener("click",this._add_emote.bind(this,t,_)),f.appendChild(m);var p=document.createElement("a");p.className="button ffz-donate",p.href="https://www.frankerfacez.com/donate",p.target="_new",p.innerHTML="Donate",f.appendChild(p),f.className="chat-menu-content center",e.appendChild(f);var g=document.createElement("div");c='<table class="ffz-about-table">',c+='<tr><th colspan="4">Developers</th></tr>',c+='<tr><td>Dan Salvato</td><td><a class="twitch" href="http://www.twitch.tv/dansalvato" title="Twitch" target="_new">&nbsp;</a></td><td><a class="twitter" href="https://twitter.com/dansalvato1" title="Twitter" target="_new">&nbsp;</a></td><td><a class="youtube" href="https://www.youtube.com/user/dansalvato1" title="YouTube" target="_new">&nbsp;</a></td></tr>',c+='<tr><td>Stendec</td><td><a class="twitch" href="http://www.twitch.tv/sirstendec" title="Twitch" target="_new">&nbsp;</a></td><td><a class="twitter" href="https://twitter.com/SirStendec" title="Twitter" target="_new">&nbsp;</a></td><td><a class="youtube" href="https://www.youtube.com/channel/UCnxuvmK1DCPCXSJ-mXIh4KQ" title="YouTube" target="_new">&nbsp;</a></td></tr>',c+='<tr class="debug"><td><a href="#" id="ffz-changelog">Version '+i.version_info+'</a></td><td colspan="3"><a href="#" id="ffz-debug-logs">Logs</a></td></tr>',g.className="chat-menu-content center",g.innerHTML=c,g.querySelector("#ffz-changelog").addEventListener("click",function(){r._ui_change_page(t,s,n,e,"about_changelog")});var v=!1;g.querySelector("#ffz-debug-logs").addEventListener("click",function(){
v||(v=!0,r._pastebin(r._log_data.join("\n"),function(t){v=!1,t?prompt("Your FrankerFaceZ logs have been uploaded to the URL:",t):alert("There was an error uploading the FrankerFaceZ logs.")}))}),e.appendChild(g)}}},{"../constants":5}],24:[function(e,s,n){var i=t.FrankerFaceZ,o=e("../constants");i.basic_settings.dark_twitch={type:"boolean",no_bttv:!0,category:"General",name:"Dark Twitch",help:"Apply a dark background to channels and other related pages for easier viewing.",get:function(){return this.settings.dark_twitch},set:function(t){this.settings.set("dark_twitch",t),this.settings.set("dark_no_blue",t)}},i.basic_settings.separated_chat={type:"boolean",no_bttv:!0,category:"Chat",name:"Separated Lines",help:"Use alternating rows and thin lines to visually separate chat messages for easier reading.",get:function(){return this.settings.chat_rows&&"0"!==this.settings.chat_separators},set:function(t){this.settings.set("chat_rows",t),this.settings.set("chat_separators",t?"2":"0")}},i.basic_settings.minimalistic_chat={type:"boolean",category:"Chat",name:"Minimalistic UI",help:"Hide all of chat except messages and the input box and reduce chat margins.",get:function(){return this.settings.minimal_chat&&this.settings.chat_padding},set:function(t){this.settings.set("minimal_chat",t),this.settings.set("chat_padding",t)}},i.basic_settings.high_contrast={type:"boolean",category:"Chat",no_bttv:!0,name:"High Contrast",help:"Display chat using white and black for maximum contrast. This is suitable for capturing and chroma keying chat to display on stream.",get:function(){return"222"!==this.settings.high_contrast_chat},set:function(t){this.settings.set("high_contrast_chat",t?"111":"222")}},i.basic_settings.keywords={type:"button",category:"Chat",no_bttv:!0,name:"Highlight Keywords",help:"Set additional keywords that will be highlighted in chat.",method:function(){i.settings_info.keywords.method.bind(this)()}},i.basic_settings.banned_words={type:"button",category:"Chat",no_bttv:!0,name:"Banned Keywords",help:"Set a list of words that will be removed from chat messages, locally.",method:function(){i.settings_info.banned_words.method.bind(this)()}},i.settings_info.twitch_chat_dark={type:"boolean",value:!1,visible:!1},i.settings_info.dark_twitch={type:"boolean",value:!1,no_bttv:!0,category:"Appearance",name:"Dark Twitch",help:"Apply a dark background to channels and other related pages for easier viewing.",on_update:function(e){var s=document.querySelector("input.ffz-setting-dark-twitch");if(s&&(s.checked=e),!this.has_bttv){document.body.classList.toggle("ffz-dark",e);var n=t.App?App.__container__.lookup("controller:settings").get("model"):void 0;e?(this._load_dark_css(),n&&this.settings.set("twitch_chat_dark",n.get("darkMode")),n&&n.set("darkMode",!0)):n&&n.set("darkMode",this.settings.twitch_chat_dark)}}},i.settings_info.dark_no_blue={type:"boolean",value:!1,category:"Appearance",name:"Gray Chat (no blue)",help:"Make the dark theme for chat and a few other places on Twitch a bit darker and not at all blue.",on_update:function(t){document.body.classList.toggle("ffz-no-blue",t)}},i.settings_info.hide_recent_past_broadcast={type:"boolean",value:!1,no_mobile:!0,category:"Channel Metadata",name:'Hide "Watch Last Broadcast"',help:'Hide the "Watch Last Broadcast" banner at the top of offline Twitch channels.',on_update:function(t){document.body.classList.toggle("ffz-hide-recent-past-broadcast",t)}},i.prototype.setup_dark=function(){document.body.classList.toggle("ffz-hide-recent-past-broadcast",this.settings.hide_recent_past_broadcast),document.body.classList.toggle("ffz-no-blue",this.settings.dark_no_blue),this.has_bttv||(document.body.classList.toggle("ffz-dark",this.settings.dark_twitch),this.settings.dark_twitch&&(t.App&&App.__container__.lookup("controller:settings").set("model.darkMode",!0),this._load_dark_css()))},i.prototype._load_dark_css=function(){if(!this._dark_style){this.log("Injecting FrankerFaceZ Dark Twitch CSS.");var t=this._dark_style=document.createElement("link");t.id="ffz-dark-css",t.setAttribute("rel","stylesheet"),t.setAttribute("href",o.SERVER+"script/dark.css?_="+(o.DEBUG?Date.now():i.version_info)),document.head.appendChild(t)}}},{"../constants":5}],25:[function(e,s,n){var i=t.FrankerFaceZ,o=e("../utils"),a=e("../constants"),r=function(t,e){return(t.settings.following_count&&"following"===e.parentElement.getAttribute("data-name")?"n":"")+(t.settings.swap_sidebars?"e":"w")},d=function(t,e){return!t.settings.following_count||"header_following"!==e.id&&"following"!==e.parentElement.getAttribute("data-name")?"":"ffz-wide-tip"};i.settings_info.following_count={type:"boolean",value:!0,no_mobile:!0,category:"Appearance",name:"Sidebar Following Data",help:"Display the number of live channels you're following on the sidebar, and list the channels in a tooltip.",on_update:function(e){this._schedule_following_count();var s=t.App&&App.__container__.resolve("model:stream"),n=s&&s.find("live");if(n){var i=n.get("total")||0;this._draw_following_count(i),this._draw_following_channels(n.get("content"),i)}else this._update_following_count(),this._draw_following_channels()}},i.prototype.setup_following_count=function(e){if(this.settings.following_count&&this._schedule_following_count(),this._install_following_tooltips(),!e)return this._update_following_count();this.log("Connecting to Live Streams model.");var s=t.App&&App.__container__.resolve("model:stream");if(!s)return this.log("Unable to find Stream model.");var n=s.find("live"),i=this;if(!n)return this.log("Unable to find Live Streams collection.");n.addObserver("total",function(){i._draw_following_count(this.get("total"))}),n.addObserver("content.length",function(){i._draw_following_channels(this.get("content"),this.get("total"))}),n.load();var o=n.get("total"),a=n.get("content");"number"==typeof o&&(this._draw_following_count(o),a&&a.length&&this._draw_following_channels(a,o))},i.prototype._schedule_following_count=function(){return this.settings.following_count?void(this._following_count_timer||(this._following_count_timer=setTimeout(this._update_following_count.bind(this),55e3+1e4*Math.random()))):void(this._following_count_timer&&(clearTimeout(this._following_count_timer),this._following_count_timer=void 0))},i.prototype._update_following_count=function(){if(!this.settings.following_count)return void(this._following_count_timer&&(clearTimeout(this._following_count_timer),this._following_count_timer=void 0));this._following_count_timer=setTimeout(this._update_following_count.bind(this),55e3+1e4*Math.random());var e=t.App&&App.__container__.resolve("model:stream"),s=e&&e.find("live"),n=this;s?s.load():Twitch.api&&Twitch.api.get("streams/followed",{limit:5,offset:0},{version:3}).done(function(t){n._draw_following_count(t._total),n._draw_following_channels(t.streams,t._total)}).fail(function(){n._draw_following_count(),n._draw_following_channels()})},i.prototype._build_following_tooltip=function(t){if("header_following"!==t.id&&"following"!==t.parentElement.getAttribute("data-name"))return t.getAttribute("original-title");if(!this.settings.following_count)return"Following";var e=(this.has_bttv?'<span class="stat playing">FrankerFaceZ</span>':"")+"Following",s=t.getBoundingClientRect(),n=document.body.clientHeight-(s.bottom+54),i=Math.max(Math.floor(n/36)-1,2),r=this._tooltip_streams,d=this._tooltip_total||r&&r.length||0;if(r&&r.length)for(var u=0,c=0,l=r.length;l>c;c++){var h=r[c];if(h&&h.channel){if(u+=1,u>i){e+="<hr><span>And "+o.number_commas(d-i)+" more...</span>";break}var f=this.settings.stream_uptime&&h.created_at&&o.parse_date(h.created_at),m=f&&Math.floor((Date.now()-f.getTime())/1e3)||0,_=Math.floor(m/60)%60,p=Math.floor(m/3600);e+=(0===c?"<hr>":"")+(m>0?'<span class="stat">'+a.CLOCK+" "+(p>0?p+"h":"")+_+"m</span>":"")+'<span class="stat">'+a.LIVE+" "+o.number_commas(h.viewers)+"</span><b>"+o.sanitize(h.channel.display_name||h.channel.name)+'</b><br><span class="playing">'+(h.channel.game?"Playing "+o.sanitize(h.channel.game):"Not Playing")+"</span>"}}else e+="<hr>No one you're following is online.";return setTimeout(function(){var t=document.querySelector(".tipsy"),e=t.getBoundingClientRect(),s=parseInt(t.style.left||"0"),n=e.left+t.scrollWidth;e.left<5?t.style.left=s-e.left+5+"px":n>document.body.clientWidth-5&&(t.style.left=s-(5+n-document.body.clientWidth)+"px")}),e},i.prototype._install_following_tooltips=function(){var t=this,e={html:!0,className:function(){return d(t,this)},title:function(){return t._build_following_tooltip(this)}},s=jQuery('#small_nav ul.game_filters li[data-name="following"] a');if(s&&s.length){var n=s.data("tipsy");n&&n.options?(n.options=_.extend(n.options,e),n.options.gravity=function(){return r(t,this)}):s.tipsy(_.extend({gravity:function(){return r(t,this)}},e))}var i=jQuery('#large_nav #nav_personal li[data-name="following"] a');if(i&&i.length){var n=i.data("tipsy");n&&n.options?n.options=_.extend(n.options,e):i.tipsy(e)}var o=jQuery("#header_actions #header_following");if(o&&o.length){var n=o.data("tipsy");n&&n.options?n.options=_.extend(n.options,e):o.tipsy(e)}},i.prototype._draw_following_channels=function(t,e){this._tooltip_streams=t,this._tooltip_total=e},i.prototype._draw_following_count=function(t){var e=document.querySelector('#small_nav ul.game_filters li[data-name="following"] a');if(e){var s=e.querySelector(".ffz-follow-count");this.has_bttv||!this.settings.following_count?s&&s.parentElement.removeChild(s):(s||(s=document.createElement("span"),s.className="ffz-follow-count",e.appendChild(s)),s.innerHTML=t?o.format_unread(t):"")}var n=document.querySelector('#large_nav #nav_personal li[data-name="following"] a');if(n){var s=n.querySelector(".ffz-follow-count");this.has_bttv||!this.settings.following_count?s&&s.parentElement.removeChild(s):(s||(s=document.createElement("span"),s.className="ffz-follow-count",n.appendChild(s)),s.innerHTML=t?o.format_unread(t):"")}var i=document.querySelector("#header_actions #header_following");if(i){var s=i.querySelector(".ffz-follow-count");this.has_bttv||!this.settings.following_count?s&&s.parentElement.removeChild(s):(s||(s=document.createElement("span"),s.className="ffz-follow-count",i.appendChild(s)),s.innerHTML=t?o.format_unread(t):"")}}},{"../constants":5,"../utils":35}],26:[function(e,s,n){var i=t.FrankerFaceZ,o=e("../utils"),a=/^[A-Za-z0-9_]+$/,r=/^(?:https?:\/\/)?(?:www\.)?twitch\.tv\/([A-Za-z0-9_]+)/i;i.prototype.setup_following=function(){this.log("Initializing following support."),this.follow_data={},this.follow_sets={}},i.settings_info.follow_buttons={type:"boolean",value:!0,no_mobile:!0,category:"Channel Metadata",name:"Relevant Follow Buttons",help:"Display additional Follow buttons for channels relevant to the stream, such as people participating in co-operative gameplay.",on_update:function(t){this.rebuild_following_ui()}},i.ffz_commands.following=function(t,e){e=e.join(" ").trim().toLowerCase().split(/[ ,]+/);for(var s=[],n=0,i=e.length;i>n;n++){var o=e[n],a=o.match(r);a&&(o=a[1]),""!==o&&-1===s.indexOf(o)&&s.push(o)}var d=this.get_user(),u=this;return!d||d.login!==t.id&&"sirstendec"!==d.login&&"dansalvato"!==d.login?"You must be logged in as the broadcaster to use this command.":this.ws_send("update_follow_buttons",[t.id,s],function(e,s){return e?void(s?u.room_message(t,"The following buttons have been updated."):u.room_message(t,"The following buttons have been disabled.")):void u.room_message(t,"There was an error updating the following buttons.")})?void 0:"There was an error communicating with the server."},i.ws_on_close.push(function(){var e=t.App&&App.__container__.lookup("controller:channel"),s=e&&e.get("id"),n=e&&e.get("hostModeTarget.id"),i=!1;if(this.follow_sets={},e){for(var o in this.follow_data)if(delete this.follow_data[o],(o===s||o===n)&&(i=!0),this.rooms&&this.rooms[o]&&this.rooms[o].extra_sets){var a=this.rooms[o].extra_sets;delete this.rooms[o].extra_sets;for(var r=0;r<a.length;r++){var d=this.emote_sets[a[r]];d&&(d.users.removeObject(o),this.global_sets.contains(a[r])||d.users.length||this.unload_set(a[r]))}}i&&this.rebuild_following_ui()}}),i.ws_commands.follow_buttons=function(e){var s=t.App&&App.__container__.lookup("controller:channel"),n=s&&s.get("id"),i=s&&s.get("hostModeTarget.id"),o=!1;this.follow_data=this.follow_data||{};for(var a in e)this.follow_data[a]=e[a],(a===n||a===i)&&(o=!0);o&&this.rebuild_following_ui()},i.ws_commands.follow_sets=function(t){{var e=App.__container__.lookup("controller:channel");e&&e.get("id"),e&&e.get("hostModeTarget.id")}this.follow_sets=this.follow_sets||{};for(var s in t)if(this.rooms&&this.rooms.hasOwnProperty(s)){for(var n=this.rooms[s].extra_sets||[],i=this.rooms[s].extra_sets=t[s],o=0;o<n.length;o++){var a=n[o];if(-1===i.indexOf(a)){var r=this.emote_sets&&this.emote_sets[a];r&&(r.users.removeObject(s),this.global_sets.contains(a)||r.users.length||this.unload_set(a))}}for(var o=0;o<i.length;o++){var a=i[o],r=this.emote_sets&&this.emote_sets[a];r?-1===r.users.indexOf(s)&&r.users.push(s):setTimeout(this.load_set.bind(this,a,function(t,e){t&&e.users.push(s)}),2500*Math.random())}}else this.follow_sets[s]=t[s]},i.prototype.rebuild_following_ui=function(){var t=App.__container__.lookup("controller:channel"),e=t&&t.get("id"),s=t&&t.get("hostModeTarget.id");if(this._cindex){if(e){var n=this.follow_data&&this.follow_data[e],i=this._cindex.get("element"),o=i&&i.querySelector(".stats-and-actions .channel-actions"),a=o&&o.querySelector("#ffz-ui-following");if(o&&this.settings.follow_buttons&&n&&n.length){if(a)a.innerHTML="";else{a=document.createElement("span"),a.id="ffz-ui-following";var r;try{r=o.querySelector(":scope > span")}catch(d){r=void 0}r?o.insertBefore(a,r):o.appendChild(a)}for(var u=[e],c=0;c<n.length&&10>c;c++){var l=n[c];-1===u.indexOf(l)&&(this._build_following_button(a,l),u.push(l))}}else a&&a.parentElement.removeChild(a)}if(s){var n=this.follow_data&&this.follow_data[s],i=this._cindex.get("element"),o=i&&i.querySelector("#hostmode .channel-actions"),a=o&&o.querySelector("#ffz-ui-following");if(o&&this.settings.follow_buttons&&n&&n.length){if(a)a.innerHTML="";else{a=document.createElement("span"),a.id="ffz-ui-following";var r;try{r=o.querySelector(":scope > span")}catch(d){r=void 0}r?o.insertBefore(a,r):o.appendChild(a)}for(var u=[s],c=0;c<n.length&&10>c;c++){var l=n[c];-1===u.indexOf(l)&&(this._build_following_button(a,l),u.push(l))}}else a&&a.parentElement.removeChild(a)}}},i.prototype._build_following_button=function(e,s){if(!a.test(s))return this.log("Ignoring Invalid Channel: "+o.sanitize(s));var n,r=document.createElement("a"),d=this,u=document.createElement("div"),c=document.createElement("a"),l=document.createElement("div"),h=!1,f=!1,m=function(){u.classList.toggle("is-following",h),r.title=(h?"Unf":"F")+"ollow "+o.sanitize(n),r.innerHTML=(h?"":"Follow ")+o.sanitize(n),l.classList.toggle("hidden",!h)},_=function(){var t=d.get_user();return t&&t.login?void Twitch.api.get("users/"+t.login+"/follows/channels/"+s).done(function(t){h=!0,f=t.notifications,u.classList.add("is-initialized"),m()}).fail(function(t){h=!1,f=!1,u.classList.add("is-initialized"),m()}):(h=!1,notification=!1,u.classList.add("is-initialized"),m())},p=function(t){t!==!1&&(t=!0);var e=d.get_user();return e&&e.login?(f=t,Twitch.api.put("users/:login/follows/channels/"+s,{notifications:f}).fail(_)):null},g=function(t){n=t||s,m()};u.className="ember-follow follow-button",u.appendChild(r),c.className="toggle-notification-menu js-toggle-notification-menu",c.href="#",l.className="notification-controls v2 hidden",l.appendChild(c),r.addEventListener("click",function(t){var e=d.get_user();return e&&e.login?(h=!h,m(),d.ws_send("track_follow",[s,h]),h?p():Twitch.api.del("users/:login/follows/channels/"+s).done(_),!1):Ember.$.login({mpSourceAction:"follow-button",follow:s})}),r.addEventListener("mousedown",function(e){1===e.button&&(e.preventDefault(),t.open(Twitch.uri.profile(s)))}),c.addEventListener("click",function(){var t=d._build_following_popup(l,s,f);return t&&t.addEventListener("click",function(){var e=!f;return t.classList.toggle("active",e),p(e),!1}),!1}),n=i.get_capitalization(s,g),m(),setTimeout(_,5e3*Math.random()),e.appendChild(u),e.appendChild(l)},i.prototype._build_following_popup=function(t,e,s){var n=this._popup,o="",a=t.offsetLeft+t.offsetWidth;return n&&(n.parentElement.removeChild(n),delete this._popup,this._popup_kill&&this._popup_kill(),delete this._popup_kill,"ffz-following-popup"==n.id&&n.getAttribute("data-channel")===e)?null:(n=this._popup=document.createElement("div"),n.id="ffz-following-popup",n.setAttribute("data-channel",e),n.className=(a>=300?"right":"left")+" dropmenu notify-menu js-notify",o='<div class="header">You are following '+i.get_capitalization(e)+"</div>",o+='<p class="clearfix">',o+='<a class="switch'+(s?" active":"")+'"><span></span></a>',o+='<span class="switch-label">Notify me when the broadcaster goes live</span>',o+="</p>",n.innerHTML=o,t.appendChild(n),n.querySelector("a.switch"))}},{"../utils":35}],27:[function(e,s,n){var i=t.FrankerFaceZ,o=e("../constants"),a=e("../utils"),r="http://static-cdn.jtvnw.net/emoticons/v1/",d=function(t){var e=document.body.classList.contains("ffz-sidebar-swap"),s=t.getBoundingClientRect(),n=parseInt(t.style.left||"0"),i=s.left+t.scrollWidth,o=!!t.style.left;e?s.left<20?(t.style.left="",o=!1):i>document.body.clientWidth&&(t.style.left=n-(i-document.body.clientWidth)+"px"):s.left<0?t.style.left=n-s.left+"px":i>document.body.clientWidth-20&&(t.style.left="",o=!1),t.classList.toggle("ui-moved",o)};i.prototype.setup_menu=function(){this.log("Installing mouse-up event to auto-close menus.");var e=this;jQuery(document).mouseup(function(t){var s,n=e._popup;n&&("ffz-chat-menu"===n.id&&n.style&&n.style.left||(n=jQuery(n),s=n.parent(),s.is(t.target)||0!==s.has(t.target).length||(n.remove(),delete e._popup,e._popup_kill&&e._popup_kill(),delete e._popup_kill)))}),document.body.classList.toggle("ffz-menu-replace",this.settings.replace_twitch_menu),this.log("Hooking the Ember Chat Settings view.");var s=t.App&&App.__container__.resolve("view:settings");if(s){s.reopen({didInsertElement:function(){this._super();try{this.ffzInit()}catch(t){e.error("ChatSettings didInsertElement: "+t)}},willClearRender:function(){try{this.ffzTeardown()}catch(t){e.error("ChatSettings willClearRender: "+t)}this._super()},ffzInit:function(){var t=this,s=this.get("element"),n=s&&s.querySelector(".dropmenu");if(n){var i,o,a,r=document.createElement("div"),d=document.createElement("div");r.className="list-header",r.innerHTML="FrankerFaceZ",d.className="chat-menu-content",i=document.createElement("p"),i.className="no-bttv",o=document.createElement("input"),o.type="checkbox",o.className="ember-checkbox ffz-setting-dark-twitch",o.checked=e.settings.dark_twitch,i.appendChild(o),i.appendChild(document.createTextNode("Dark Twitch")),d.appendChild(i),o.addEventListener("change",function(t){e.settings.set("dark_twitch",this.checked)}),i=document.createElement("p"),o=document.createElement("input"),o.type="checkbox",o.className="ember-checkbox ffz-setting-hosted-channels",o.checked=e.settings.hosted_channels,i.appendChild(o),i.appendChild(document.createTextNode("Channel Hosting")),d.appendChild(i),o.addEventListener("change",function(t){e.settings.set("hosted_channels",this.checked)}),i=document.createElement("p"),a=document.createElement("a"),a.href="#",a.innerHTML="More Settings",i.appendChild(a),d.appendChild(i),a.addEventListener("click",function(s){return t.set("controller.model.hidden",!0),e._last_page="settings",e.build_ui_popup(e._chatv),s.stopPropagation(),!1}),n.appendChild(r),n.appendChild(d)}},ffzTeardown:function(){}});try{s.create().destroy()}catch(n){}for(var i in Ember.View.views)if(Ember.View.views.hasOwnProperty(i)){var o=Ember.View.views[i];if(o instanceof s){this.log("Manually updating existing Chat Settings view.",o);try{o.ffzInit()}catch(n){this.error("setup: ChatSettings ffzInit: "+n)}}}}},i.menu_pages={},i.prototype._fix_menu_position=function(){var t=document.querySelector("#ffz-chat-menu");t&&d(t)},i.prototype.build_ui_popup=function(t){var e=this._popup;if(e)return e.parentElement.removeChild(e),delete this._popup,this._popup_kill&&this._popup_kill(),void delete this._popup_kill;var s=document.createElement("div"),n=document.createElement("div"),a=document.createElement("ul"),r=this.has_bttv?BetterTTV.settings.get("darkenedMode"):!1;s.className="emoticon-selector chat-menu ffz-ui-popup",s.id="ffz-chat-menu",n.className="emoticon-selector-box dropmenu",s.appendChild(n),s.classList.toggle("dark",r);var u=document.createElement("div");u.className="ffz-ui-menu-page",n.appendChild(u),a.className="menu clearfix",n.appendChild(a);var c=document.createElement("li");c.className="title",c.innerHTML='<span class="title">Franker'+(o.DEBUG?"Dev":"Face")+"Z</span>";var l=document.createElement("span"),h=this;l.className="ffz-handle ffz-close-button",c.insertBefore(l,c.firstChild);var f=!1;l.addEventListener("mousedown",function(){var t=h._popup;f=t&&"ffz-chat-menu"===t.id&&t.style.left}),l.addEventListener("click",function(){var t=h._popup;f&&t&&(t.parentElement.removeChild(t),delete h._popup,h._popup_kill&&h._popup_kill(),delete h._popup_kill)}),a.appendChild(c),jQuery(s).draggable({handle:a,cancel:"li.item",axis:"x",stop:function(t){d(this)}}),s.style.position="";var m=[];for(var _ in i.menu_pages)if(i.menu_pages.hasOwnProperty(_)){var p=i.menu_pages[_];try{if(!p||p.hasOwnProperty("visible")&&(!p.visible||"function"==typeof p.visible&&!p.visible.bind(this)(t)))continue}catch(g){this.error("menu_pages "+_+" visible: "+g);continue}m.push([p.sort_order||0,_,p])}m.sort(function(t,e){if(t[0]<e[0])return 1;if(t[0]>e[0])return-1;var s=t[1].toLowerCase(),n=e[1].toLowerCase();return n>s?1:s>n?-1:0});for(var v=0;v<m.length;v++){var _=m[v][1],p=m[v][2],b=document.createElement("li"),y=document.createElement("a");b.className="item"+(p.sub_menu?" has-sub-menu":""),b.id="ffz-menu-page-"+_,y.title=p.name,y.innerHTML=p.icon,jQuery(y).tipsy(),y.addEventListener("click",this._ui_change_page.bind(this,t,n,a,u,_)),b.appendChild(y),a.appendChild(b)}var p=(this._last_page||"channel").split("_",1)[0];this._ui_change_page(t,n,a,u,p),this._popup=s,u.style.maxHeight=Math.max(200,t.$().height()-172)+"px",t.$(".chat-interface").append(s)},i.prototype._ui_change_page=function(t,e,s,n,o){this._last_page=o,n.innerHTML="",n.setAttribute("data-page",o);var a=document.querySelector(".app-main")||document.querySelector(".ember-chat-container");e.style.maxWidth=!i.menu_pages[o].wide||"function"==typeof i.menu_pages[o].wide&&!i.menu_pages[o].wide.bind(this)()?"":(a.offsetWidth<640?a.offsetWidth-40:600)+"px";for(var r=s.querySelectorAll("li.active"),d=0;d<r.length;d++)r[d].classList.remove("active");var u=s.querySelector("#ffz-menu-page-"+o);u?u.classList.add("active"):this.log("No matching page: "+o),i.menu_pages[o].render.bind(this)(t,n,e,s);var c=this;setTimeout(function(){c._fix_menu_position()})},i.menu_pages.channel={render:function(e,s){var n=e.get("controller.currentRoom.id"),o=this.rooms[n],d=!1,u=this;if(this.settings.replace_twitch_menu){var c=o.room.get("product");if(c&&!c.get("error")){d=!0;var l=App.__container__.resolve("model:ticket").find("user",{channel:n}),h=l?l.get("content"):!1,f=l?l.get("isLoaded"):!1,m=o.room.get("badgeSet.subscriber.image"),_=document.createElement("div"),p=document.createElement("div"),g=0;h=h&&h.length>0,!l||h||f||(l.addObserver("isLoaded",function(){setTimeout(function(){"channel"===s.getAttribute("data-page")&&(s.innerHTML="",i.menu_pages.channel.render.bind(u)(e,s))},0)}),l.load()),_.className="emoticon-grid",p.className="heading",m&&(p.style.backgroundImage='url("'+m+'")'),p.innerHTML='<span class="right">Twitch</span>Subscriber Emoticons',_.appendChild(p);for(var v=c.get("emoticons")||[],b=0;b<v.length;b++){var y=v[b];if("active"===y.state){var w=document.createElement("span"),z=h||!y.subscriber_only,k='image-set(url("'+r+y.id+'/1.0") 1x, url("'+r+y.id+'/2.0") 2x, url("'+r+y.id+'/3.0") 4x)';w.className="emoticon tooltip"+(z?"":" locked"),w.style.backgroundImage='url("'+r+y.id+'/1.0")',w.style.backgroundImage="-webkit-"+k,w.style.backgroundImage="-moz-"+k,w.style.backgroundImage="-ms-"+k,w.style.backgroundImage=k,w.style.width=y.width+"px",w.style.height=y.height+"px",w.title=y.regex,w.addEventListener("click",function(s,n,i,o){if((o.shiftKey||o.shiftLeft)&&u.settings.clickable_emoticons)t.open("https://twitchemotes.com/emote/"+n);else{if(!s)return;this._add_emote(e,i)}o.preventDefault()}.bind(this,z,y.id,y.regex)),_.appendChild(w),g++}}if(g>0&&s.appendChild(_),g>0&&!h){var C=document.createElement("div"),E=document.createElement("div"),x=document.createElement("span"),T=document.createElement("a");C.className="subscribe-message",E.className="non-subscriber-message",C.appendChild(E),x.className="unlock-text",x.innerHTML="Subscribe to unlock Emoticons",E.appendChild(x),T.className="action subscribe-button button primary",T.href=c.get("product_url"),T.innerHTML='<span class="subscribe-text">Subscribe</span><span class="subscribe-price">'+c.get("price")+"</span>",E.appendChild(T),s.appendChild(C)}else if(g>0){var L=l.get("content");if(L=L.length>0?L[L.length-1]:void 0,L&&L.purchase_profile&&!L.purchase_profile.will_renew){var M=a.parse_date(L.access_end||"");C=document.createElement("div"),E=document.createElement("div"),x=document.createElement("span"),end_time=M?Math.floor((M.getTime()-Date.now())/1e3):null,C.className="subscribe-message",E.className="non-subscriber-message",C.appendChild(E),x.className="unlock-text",x.innerHTML="Subscription expires in "+a.time_to_string(end_time,!0,!0),E.appendChild(x),s.appendChild(C)}}}}var S=o&&o.extra_sets||[];this._emotes_for_sets(s,e,o&&o.set&&[o.set]||[],this.feature_friday||d||S.length?"Channel Emoticons":null,"http://cdn.frankerfacez.com/script/devicon.png","FrankerFaceZ");for(var b=0;b<S.length;b++){var A=this.emote_sets[S[b]],F=A?"Featured "+A.title:"Featured Channel";this._emotes_for_sets(s,e,[S[b]],F,"http://cdn.frankerfacez.com/script/devicon.png","FrankerFaceZ")}this._feature_friday_ui(n,s,e)},name:"Channel",icon:o.ZREKNARF},i.prototype._emotes_for_sets=function(e,s,n,i,o,a){var r=document.createElement("div"),d=0,u=this;if(r.className="emoticon-grid",null!=i){var c=document.createElement("div");if(c.className="heading",a){var l=document.createElement("span");l.className="right",l.appendChild(document.createTextNode(a)),c.appendChild(l)}c.appendChild(document.createTextNode(i)),o&&(c.style.backgroundImage='url("'+o+'")'),r.appendChild(c)}for(var h=[],f=0;f<n.length;f++){var m=this.emote_sets[n[f]];if(m&&m.emoticons)for(var _ in m.emoticons)m.emoticons.hasOwnProperty(_)&&!m.emoticons[_].hidden&&h.push(m.emoticons[_])}h.sort(function(t,e){var s=t.name.toLowerCase(),n=e.name.toLowerCase();return n>s?-1:s>n?1:0});for(var f=0;f<h.length;f++){var p=h[f],g=null;(p.urls[2]||p.urls[4])&&(g='url("'+p.urls[1]+'") 1x',p.urls[2]&&(g+=', url("'+p.urls[2]+'") 2x'),p.urls[4]&&(g+=', url("'+p.urls[4]+'") 4x')),d++;var l=document.createElement("span");if(l.className="emoticon tooltip",l.style.backgroundImage='url("'+p.urls[1]+'")',g){var v="image-set("+g+")";l.style.backgroundImage="-webkit-"+v,l.style.backgroundImage="-moz-"+v,l.style.backgroundImage="-ms-"+v,l.style.backgroundImage=v}l.style.width=p.width+"px",l.style.height=p.height+"px",l.title=this._emote_tooltip(p),l.addEventListener("click",function(e,n,i){i.preventDefault(),(i.shiftKey||i.shiftLeft)&&u.settings.clickable_emoticons?t.open("https://www.frankerfacez.com/emoticons/"+e):this._add_emote(s,n)}.bind(this,p.id,p.name)),r.appendChild(l)}d||(r.innerHTML+="This channel has no emoticons.",r.className="emoticon-grid ffz-no-emotes center"),e.appendChild(r)},i.prototype._add_emote=function(t,e){var s,n,i;this.has_bttv?(s=t.get("element").querySelector("textarea"),n=s.value):(i=t.get("controller.currentRoom"),n=i.get("messageToSend")||""),n+=(n&&" "!==n.substr(-1)?" ":"")+(e.name||e),s?s.value=n:i.set("messageToSend",n)}},{"../constants":5,"../utils":35}],28:[function(e,s,n){var i=t.FrankerFaceZ,o=e("../constants");i.prototype.build_ui_link=function(t){var e=document.createElement("a");return e.className="ffz-ui-toggle",e.innerHTML=o.CHAT_BUTTON,e.addEventListener("click",this.build_ui_popup.bind(this,t)),this.update_ui_link(e),e},i.prototype.update_ui_link=function(e){var s=t.App&&App.__container__.lookup("controller:chat");if(e=e||document.querySelector("a.ffz-ui-toggle"),e&&s){var n=s.get("currentRoom.id"),i=this.rooms[n],o=!1,a=this.has_bttv?BetterTTV.settings.get("darkenedMode"):!1,r=this.has_bttv?BetterTTV.settings.get("showBlueButtons"):!1,d=this.feature_friday&&this.feature_friday.live;if(i&&i.set){var u=this.emote_sets[i.set];u&&u.count>0&&(o=!0)}e.classList.toggle("no-emotes",!o),e.classList.toggle("live",d),e.classList.toggle("dark",a),e.classList.toggle("blue",r)}}},{"../constants":5}],29:[function(e,s,n){var i=t.FrankerFaceZ,o=e("../constants"),a=e("../utils"),r="http://static-cdn.jtvnw.net/emoticons/v1/";i.basic_settings.replace_twitch_menu={type:"boolean",category:"Chat",name:"Unified Emoticons Menu",help:"Completely replace the default Twitch emoticon menu and display global emoticons in the My Emoticons menu.",get:function(){return this.settings.replace_twitch_menu&&this.settings.global_emotes_in_menu&&this.settings.emoji_in_menu},set:function(t){this.settings.set("replace_twitch_menu",t),this.settings.set("global_emotes_in_menu",t),this.settings.set("emoji_in_menu",t)}},i.settings_info.replace_twitch_menu={type:"boolean",value:!1,category:"Chat Input",name:"Replace Twitch Emoticon Menu",help:"Completely replace the default Twitch emoticon menu.",on_update:function(t){document.body.classList.toggle("ffz-menu-replace",t)}},i.settings_info.global_emotes_in_menu={type:"boolean",value:!1,category:"Chat Input",name:"Display Global Emotes in My Emotes",help:"Display the global Twitch emotes in the My Emoticons menu."},i.settings_info.emoji_in_menu={type:"boolean",value:!1,category:"Chat Input",name:"Display Emoji in My Emotes",help:"Display the supported emoji images in the My Emoticons menu."},i.settings_info.emote_menu_collapsed={value:[],visible:!1},i.prototype.setup_my_emotes=function(){this._twitch_badges={},this._twitch_badges["--global--"]="//cdn.frankerfacez.com/script/twitch_logo.png",this._twitch_badges["--turbo-faces--"]=this._twitch_badges.turbo="//cdn.frankerfacez.com/script/turbo_badge.png"},i.menu_pages.myemotes={name:"My Emoticons",icon:o.EMOTE,visible:function(t){var e=this.get_user(),s=t.get("controller.currentRoom.tmiSession"),n=e&&this.users[e.login]&&this.users[e.login].sets||[],i=(s&&s.getEmotes()||{emoticon_sets:{}}).emoticon_sets;return n.length||i&&Object.keys(i).length},render:function(t,e){var s=t.get("controller.currentRoom.tmiSession"),n=(s&&s.getEmotes()||{emoticon_sets:{}}).emoticon_sets;return i.menu_pages.myemotes.draw_menu.bind(this)(t,e,n)},toggle_section:function(t){var e=t.parentElement,s=e.getAttribute("data-set"),n=this.settings.emote_menu_collapsed,i=-1!==n.indexOf(s);i?n.removeObject(s):n.push(s),this.settings.set("emote_menu_collapsed",n),e.classList.toggle("collapsed",!i)},draw_emoji:function(t){var e=document.createElement("div"),s=document.createElement("div"),n=this;e.className="heading",e.innerHTML='<span class="right">FrankerFaceZ</span>Emoji',e.style.backgroundImage='url("'+o.SERVER+'/emoji/1f4af-1x.png")',s.className="emoticon-grid collapsable",s.appendChild(e),s.setAttribute("data-set","emoji"),s.classList.toggle("collapsed",-1!==this.settings.emote_menu_collapsed.indexOf("emoji")),e.addEventListener("click",function(){i.menu_pages.myemotes.toggle_section.bind(n)(this)});var a=[];for(var r in this.emoji_data)a.push(this.emoji_data[r]);a.sort(function(t,e){var s=t.short_name.toLowerCase(),n=e.short_name.toLowerCase();return n>s?-1:s>n?1:t.raw<e.raw?-1:t.raw>e.raw?1:0});for(var d=0;d<a.length;d++){var u=a[d],c=document.createElement("span"),l='image-set(url("'+u.src+'") 1x, url("'+o.SERVER+"emoji/"+u.code+'-2x.png") 2x, url("'+o.SERVER+"emoji/"+u.code+'-4x.png") 4x)';
c.className="emoticon tooltip",c.title="Emoji: "+u.raw+"\nName: :"+u.short_name+":",c.addEventListener("click",this._add_emote.bind(this,t,u.raw)),c.style.backgroundImage='url("'+u.src+'")',c.style.backgroundImage="-webkit-"+l,c.style.backgroundImage="-moz-"+l,c.style.backgroundImage="-ms-"+l,c.style.backgroudnImage=l,s.appendChild(c)}return s},draw_twitch_set:function(e,s,n){var d,u=document.createElement("div"),c=document.createElement("div"),l=this,h=this._twitch_set_to_channel[s];if(d="twitch_unknown"===h?"Unknown Channel":"--global--"===h?"Global Emoticons":"turbo"===h||"--turbo-faces--"===h?"Twitch Turbo":i.get_capitalization(h,function(t){u.innerHTML='<span class="right">Twitch</span>'+a.sanitize(t)}),u.className="heading",u.innerHTML='<span class="right">Twitch</span>'+a.sanitize(d),this._twitch_badges[h])u.style.backgroundImage='url("'+this._twitch_badges[h]+'")';else{var l=this;Twitch.api.get("chat/"+h+"/badges",null,{version:3}).done(function(t){t.subscriber&&t.subscriber.image&&(l._twitch_badges[h]=t.subscriber.image,localStorage.ffzTwitchBadges=JSON.stringify(l._twitch_badges),u.style.backgroundImage='url("'+t.subscriber.image+'")')})}c.className="emoticon-grid collapsable",c.appendChild(u),c.setAttribute("data-set","twitch-"+s),c.classList.toggle("collapsed",-1!==this.settings.emote_menu_collapsed.indexOf("twitch-"+s)),u.addEventListener("click",function(){i.menu_pages.myemotes.toggle_section.bind(l)(this)}),n.sort(function(t,e){var s=t.code.toLowerCase(),n=e.code.toLowerCase();return n>s?-1:s>n?1:t.id<e.id?-1:t.id>e.id?1:0});for(var f=0;f<n.length;f++){var m=n[f],_=o.KNOWN_CODES[m.code]||m.code,p=document.createElement("span"),g='image-set(url("'+r+m.id+'/1.0") 1x, url("'+r+m.id+'/2.0") 2x, url("'+r+m.id+'/3.0") 4x)';p.className="emoticon tooltip",this.settings.replace_bad_emotes&&o.EMOTE_REPLACEMENTS[m.id]?p.style.backgroundImage='url("'+o.EMOTE_REPLACEMENT_BASE+o.EMOTE_REPLACEMENTS[m.id]+'")':(p.style.backgroundImage='url("'+r+m.id+'/1.0")',p.style.backgroundImage="-webkit-"+g,p.style.backgroundImage="-moz-"+g,p.style.backgroundImage="-ms-"+g,p.style.backgroudnImage=g),p.title=_,p.addEventListener("click",function(s,n,i){i.preventDefault(),(i.shiftKey||i.shiftLeft)&&l.settings.clickable_emoticons?t.open("https://twitchemotes.com/emote/"+s):this._add_emote(e,n)}.bind(this,m.id,m.code)),c.appendChild(p)}return c},draw_ffz_set:function(e,s){var n=document.createElement("div"),o=document.createElement("div"),a=this,r=[];n.className="heading",n.innerHTML='<span class="right">FrankerFaceZ</span>'+s.title,n.style.backgroundImage='url("'+(s.icon||"//cdn.frankerfacez.com/script/devicon.png")+'")',o.className="emoticon-grid collapsable",o.appendChild(n),o.setAttribute("data-set","ffz-"+s.id),o.classList.toggle("collapsed",-1!==this.settings.emote_menu_collapsed.indexOf("ffz-"+s.id)),n.addEventListener("click",function(){i.menu_pages.myemotes.toggle_section.bind(a)(this)});for(var d in s.emoticons)s.emoticons.hasOwnProperty(d)&&!s.emoticons[d].hidden&&r.push(s.emoticons[d]);r.sort(function(t,e){var s=t.name.toLowerCase(),n=e.name.toLowerCase();return n>s?-1:s>n?1:t.id<e.id?-1:t.id>e.id?1:0});for(var u=0;u<r.length;u++){var c=r[u],l=document.createElement("span"),h='image-set(url("'+c.urls[1]+'") 1x';c.urls[2]&&(h+=', url("'+c.urls[2]+'") 2x'),c.urls[4]&&(h+=', url("'+c.urls[4]+'") 4x'),h+=")",l.className="emoticon tooltip",l.style.backgroundImage='url("'+c.urls[1]+'")',l.style.backgroundImage="-webkit-"+h,l.style.backgroundImage="-moz-"+h,l.style.backgroundImage="-ms-"+h,l.style.backgroudnImage=h,c.height&&(l.style.height=c.height+"px"),c.width&&(l.style.width=c.width+"px"),l.title=this._emote_tooltip(c),l.addEventListener("click",function(s,n,i){i.preventDefault(),(i.shiftKey||i.shiftLeft)&&a.settings.clickable_emoticons?t.open("https://www.frankerfacez.com/emoticons/"+s):this._add_emote(e,n)}.bind(this,c.id,c.name)),o.appendChild(l)}return o},draw_menu:function(t,e,s){if("myemotes"===e.getAttribute("data-page")){e.innerHTML="";try{var n=this.get_user(),o=this.getEmotes(n&&n.login,null),a=[];for(var r in s)if(s.hasOwnProperty(r)&&(this.settings.global_emotes_in_menu||"0"!==r)){var d=s[r];d.length&&a.push([this._twitch_set_to_channel[r],i.menu_pages.myemotes.draw_twitch_set.bind(this)(t,r,d)])}this.settings.emoji_in_menu&&a.push(["emoji",i.menu_pages.myemotes.draw_emoji.bind(this)(t)]);for(var u=0;u<o.length;u++){var r=o[u],d=this.emote_sets[r];d&&d.count&&(this.settings.global_emotes_in_menu||-1===this.default_sets.indexOf(r))&&a.push([d.title.toLowerCase(),i.menu_pages.myemotes.draw_ffz_set.bind(this)(t,d)])}a.sort(function(t,e){var s=t[0],n=e[0];return"turbo"===s||"--turbo-faces--"===s?s="zza|"+s:"global"===s||"global emoticons"===s||"--global--"===s?s="zzy|"+s:"emoji"===s&&(s="zzz|"+s),"turbo"===n||"--turbo-faces--"===n?n="zza|"+n:"global"===n||"global emoticons"===n||"--global--"===n?n="zzy|"+n:"emoji"===n&&(n="zzz|"+n),n>s?-1:s>n?1:0});for(var u=0;u<a.length;u++)e.appendChild(a[u][1])}catch(c){this.error("myemotes draw_menu: "+c),e.innerHTML="";var l=document.createElement("div"),h=document.createElement("div"),f=document.createElement("p");h.className="heading",h.innerHTML="Error Loading Menu",l.appendChild(h),f.className="clearfix",f.textContent=c,l.appendChild(f),l.className="chat-menu-content",e.appendChild(l)}}}}},{"../constants":5,"../utils":35}],30:[function(e,s,n){var i=t.FrankerFaceZ;i.prototype.setup_notifications=function(){this.log("Adding event handler for window focus."),t.addEventListener("focus",this.clear_notifications.bind(this))},i.settings_info.highlight_notifications={type:"boolean",value:!1,category:"Chat Filtering",no_bttv:!0,no_mobile:!0,name:"Highlight Notifications",help:"Display notifications when a highlighted word appears in chat in an unfocused tab. This is automatically disabled on the dashboard.",on_update:function(t,e){if(t&&e){if("denied"===Notification.permission)return this.log("Notifications have been denied by the user."),void this.settings.set("highlight_notifications",!1);if("granted"!==Notification.permission){var s=this;Notification.requestPermission(function(t){"denied"===t&&(s.log("Notifications have been denied by the user."),s.settings.set("highlight_notifications",!1))})}}}},i.settings_info.notification_timeout={type:"button",value:60,category:"Chat Filtering",no_bttv:!0,no_mobile:!0,name:"Notification Timeout",help:"Specify how long notifications should be displayed before automatically closing.",method:function(){var t=this.settings.notification_timeout,e=prompt("Notification Timeout\n\nPlease enter the time you'd like notifications to be displayed before automatically closing, in seconds.\n\nDefault is: 60",t);if(null!==e&&void 0!==e){var s=parseInt(e);(s===0/0||1>s)&&(s=60),this.settings.set("notification_timeout",s)}}},i.ws_commands.message=function(t){this.show_message(t)},i._notifications={},i._last_notification=0,i.prototype.clear_notifications=function(){for(var t in i._notifications){var e=i._notifications[t];if(e)try{e.close()}catch(s){}}i._notifications={},i._last_notification=0},i.prototype.show_notification=function(t,e,s,n,o,a){var r=Notification.permission;if("denied "===r)return!1;if("granted"===r){e=e||"FrankerFaceZ",n=n||1e3*this.settings.notification_timeout;var d={lang:"en-US",dir:"ltr",body:t,tag:s||"FrankerFaceZ",icon:"http://cdn.frankerfacez.com/icon32.png"},u=this,c=new Notification(e,d),l=i._last_notification++;return i._notifications[l]=c,c.addEventListener("click",function(){delete i._notifications[l],o&&o.bind(u)()}),c.addEventListener("close",function(){delete i._notifications[l],a&&a.bind(u)()}),void("number"==typeof n&&c.addEventListener("show",function(){setTimeout(function(){delete i._notifications[l],c.close()},n)}))}var u=this;Notification.requestPermission(function(n){u.show_notification(t,e,s)})},i.prototype.show_message=function(e){t.noty({text:e,theme:"ffzTheme",layout:"bottomCenter",closeWith:["button"]}).show()}},{}],31:[function(e,s,n){var i=t.FrankerFaceZ,o=e("../utils");i.prototype.setup_races=function(){this.log("Initializing race support."),this.srl_races={}},i.settings_info.srl_races={type:"boolean",value:!0,no_mobile:!0,category:"Channel Metadata",name:"SRL Race Information",help:'Display information about <a href="http://www.speedrunslive.com/" target="_new">SpeedRunsLive</a> races under channels.',on_update:function(t){this.rebuild_race_ui()}},i.ws_on_close.push(function(){var e=t.App&&App.__container__.lookup("controller:channel"),s=e&&e.get("id"),n=e&&e.get("hostModeTarget.id"),i=!1;if(e){for(var o in this.srl_races)delete this.srl_races[o],(o===s||o===n)&&(i=!0);i&&this.rebuild_race_ui()}}),i.ws_commands.srl_race=function(t){var e=App.__container__.lookup("controller:channel"),s=e&&e.get("id"),n=e&&e.get("hostModeTarget.id"),i=!1;this.srl_races=this.srl_races||{};for(var o=0;o<t[0].length;o++){var a=t[0][o];this.srl_races[a]=t[1],(a===s||a===n)&&(i=!0)}if(t[1]){var r=t[1],d=r.twitch_entrants={};for(var u in r.entrants)r.entrants.hasOwnProperty(u)&&(r.entrants[u].channel&&(d[r.entrants[u].channel]=u),r.entrants[u].name=u)}i&&this.rebuild_race_ui()},i.prototype.rebuild_race_ui=function(){var t=App.__container__.lookup("controller:channel"),e=t&&t.get("id"),s=t&&t.get("hostModeTarget.id");if(this._cindex){if(e){var n=this.srl_races&&this.srl_races[e],i=this._cindex.get("element"),o=i&&i.querySelector(".stats-and-actions .channel-actions"),a=o&&o.querySelector("#ffz-ui-race");if(o&&this.settings.srl_races&&n){if(!a){a=document.createElement("span"),a.id="ffz-ui-race",a.setAttribute("data-channel",e);var r=document.createElement("span");r.className="button drop action",r.title="SpeedRunsLive Race",r.innerHTML='<span class="logo"></span>',r.addEventListener("click",this._build_race_popup.bind(this,a,e)),a.appendChild(r),o.appendChild(a)}this._update_race(a,!0)}else a&&a.parentElement.removeChild(a)}if(s){var n=this.srl_races&&this.srl_races[s],i=this._cindex.get("element"),o=i&&i.querySelector("#hostmode .channel-actions"),a=o&&o.querySelector("#ffz-ui-race");if(o&&this.settings.srl_races&&n){if(!a){a=document.createElement("span"),a.id="ffz-ui-race",a.setAttribute("data-channel",s);var r=document.createElement("span");r.className="button drop action",r.title="SpeedRunsLive Race",r.innerHTML='<span class="logo"></span>',r.addEventListener("click",this._build_race_popup.bind(this,a,s)),a.appendChild(r),o.appendChild(a)}this._update_race(a,!0)}else a&&a.parentElement.removeChild(a)}}},i.prototype._race_kill=function(){this._race_timer&&(clearTimeout(this._race_timer),delete this._race_timer),delete this._race_game,delete this._race_goal},i.prototype._build_race_popup=function(t,e){var s=this._popup;if((!s||(s.parentElement.removeChild(s),delete this._popup,this._popup_kill&&this._popup_kill(),delete this._popup_kill,"ffz-race-popup"!==s.id||s.getAttribute("data-channel")!==e))&&t){var n=t.querySelector(".button"),o=n.offsetLeft+n.offsetWidth,a=this.srl_races[e],s=document.createElement("div"),r="";s.id="ffz-race-popup",s.setAttribute("data-channel",e),s.className=(o>=300?"right":"left")+" share dropmenu",this._popup_kill=this._race_kill.bind(this),this._popup=s;var d="http://kadgar.net/live",u=!1;for(var c in a.entrants){var l=a.entrants[c].state;a.entrants.hasOwnProperty(c)&&a.entrants[c].channel&&("racing"==l||"entered"==l)&&(d+="/"+a.entrants[c].channel,u=!0)}var h=document.querySelector(".app-main.theatre")?document.body.clientHeight-300:t.parentElement.offsetTop-175,f=App.__container__.lookup("controller:channel"),m=f?f.get("display_name"):i.get_capitalization(e),_=encodeURIComponent("I'm watching "+m+" race "+a.goal+" in "+a.game+" on SpeedRunsLive!");r='<div class="heading"><div></div><span></span></div>',r+='<div class="table" style="max-height:'+h+'px"><table><thead><tr><th>#</th><th>Entrant</th><th>&nbsp;</th><th>Time</th></tr></thead>',r+="<tbody></tbody></table></div>",r+='<div class="divider"></div>',r+='<iframe class="twitter_share_button" style="width:130px; height:25px" src="https://platform.twitter.com/widgets/tweet_button.html?text='+_+"%20Watch%20at&via=Twitch&url=http://www.twitch.tv/"+e+'"></iframe>',r+='<p class="right"><a target="_new" href="http://www.speedrunslive.com/race/?id='+a.id+'">SRL</a>',u&&(r+=' &nbsp; <a target="_new" href="'+d+'">Multitwitch</a>'),r+="</p>",s.innerHTML=r,t.appendChild(s),this._update_race(t,!0)}},i.prototype._update_race=function(t,e){if(this._race_timer&&e&&(clearTimeout(this._race_timer),delete this._race_timer),t){var s=t.getAttribute("data-channel"),n=this.srl_races[s];if(!n)return t.parentElement.removeChild(t),void(this._popup&&"ffz-race-popup"===this._popup.id&&this._popup.getAttribute("data-channel")===s&&(this._popup_kill&&this._popup_kill(),this._popup&&(delete this._popup,delete this._popup_kill)));var i=n.twitch_entrants[s],a=n.entrants[i],r=t.querySelector("#ffz-race-popup"),d=Date.now()/1e3,u=Math.floor(d-n.time);if(t.querySelector(".logo").innerHTML=o.placement(a),r){var c=r.querySelector("tbody"),l=r.querySelector(".heading span"),h=r.querySelector(".heading div");c.innerHTML="";var f=[],m=!0;for(var _ in n.entrants)n.entrants.hasOwnProperty(_)&&("racing"==n.entrants[_].state&&(m=!1),f.push(n.entrants[_]));f.sort(function(t,e){var s=t.place||9999,n=e.place||9999,i=t.time||u,o=e.time||u;return("forfeit"==t.state||"dq"==t.state)&&(s=1e4),("forfeit"==e.state||"dq"==e.state)&&(n=1e4),n>s?-1:s>n?1:t.name<e.name?-1:t.name>e.name?1:o>i?-1:i>o?1:void 0});for(var p=0;p<f.length;p++){var _=f[p],g='<a target="_new" href="http://www.speedrunslive.com/profiles/#!/'+o.sanitize(_.name)+'">'+_.display_name+"</a>",v=_.channel?'<a target="_new" class="twitch" href="http://www.twitch.tv/'+o.sanitize(_.channel)+'"></a>':"",b=_.hitbox?'<a target="_new" class="hitbox" href="http://www.hitbox.tv/'+o.sanitize(_.hitbox)+'"></a>':"",y=u?o.time_to_string(_.time||u):"",w=o.place_string(_.place),z=_.comment?o.sanitize(_.comment):"";c.innerHTML+="<tr"+(z?' title="'+z+'"':"")+' class="'+_.state+'"><td>'+w+"</td><td>"+g+"</td><td>"+v+b+'</td><td class="time">'+("forfeit"==_.state?"Forfeit":y)+"</td></tr>"}if(this._race_game!=n.game||this._race_goal!=n.goal){this._race_game=n.game,this._race_goal=n.goal;var k=o.sanitize(n.game),C=o.sanitize(n.goal);h.innerHTML='<h2 title="'+k+'">'+k+"</h2><b>Goal: </b>"+C}u?m?l.innerHTML="Done":(l.innerHTML=o.time_to_string(u),this._race_timer=setTimeout(this._update_race.bind(this,t),1e3)):l.innerHTML="Entry Open"}}}},{"../utils":35}],32:[function(e,s,n){var i=t.FrankerFaceZ,o=e("../constants");i.prototype.setup_css=function(){this.log("Injecting main FrankerFaceZ CSS.");var t=this._main_style=document.createElement("link");t.id="ffz-ui-css",t.setAttribute("rel","stylesheet"),t.setAttribute("href",o.SERVER+"script/style.css?_="+(o.DEBUG?Date.now():i.version_info)),document.head.appendChild(t),jQuery.noty.themes.ffzTheme={name:"ffzTheme",style:function(){this.$bar.removeClass().addClass("noty_bar").addClass("ffz-noty").addClass(this.options.type)},callback:{onShow:function(){},onClose:function(){}}}}},{"../constants":5}],33:[function(e,s,n){{var i=t.FrankerFaceZ,o=e("../constants");e("../utils")}i.prototype._update_subscribers=function(){this._update_subscribers_timer&&(clearTimeout(this._update_subscribers_timer),delete this._update_subscribers_timer),this._update_subscribers_timer=setTimeout(this._update_subscribers.bind(this),6e4);var t=this.get_user(),e=this,s=this.is_dashboard?location.pathname.match(/\/([^\/]+)/):void 0,n=this.is_dashboard&&s&&s[1];if(this.has_bttv||!n||n!==t.login){var i=document.querySelector("#ffz-sub-display");return void(i&&i.parentElement.removeChild(i))}jQuery.ajax({url:"/broadcast/dashboard/partnership"}).done(function(t){try{var s,i=document.createElement("span");i.innerHTML=t,s=i.querySelector("#dash_main");var a=s&&s.textContent.match(/([\d,\.]+) total active subscribers/),r=a&&a[1];if(!r){var d=document.querySelector("#ffz-sub-display");return d&&d.parentElement.removeChild(d),void(e._update_subscribers_timer&&(clearTimeout(e._update_subscribers_timer),delete e._update_subscribers_timer))}var d=document.querySelector("#ffz-sub-display span");if(!d){var u=document.querySelector(e.is_dashboard?"#stats":"#channel .stats-and-actions .channel-stats");if(!u)return;var c=document.createElement("span");c.className="ffz stat",c.id="ffz-sub-display",c.title="Active Channel Subscribers",c.innerHTML=o.STAR+" ",d=document.createElement("span"),c.appendChild(d),Twitch.api.get("chat/"+n+"/badges",null,{version:3}).done(function(t){t.subscriber&&t.subscriber.image&&(c.innerHTML="",c.appendChild(d),c.style.backgroundImage='url("'+t.subscriber.image+'")',c.style.backgroundRepeat="no-repeat",c.style.paddingLeft="23px",c.style.backgroundPosition="0 50%")}),u.appendChild(c),jQuery(c).tipsy(e.is_dashboard?{gravity:"s"}:void 0)}d.innerHTML=r}catch(l){e.error("_update_subscribers: "+l)}}).fail(function(){var t=document.querySelector("#ffz-sub-display");t&&t.parentElement.removeChild(t)})}},{"../constants":5,"../utils":35}],34:[function(e,s,n){var i=t.FrankerFaceZ,o=e("../constants"),a=e("../utils");i.ws_commands.chatters=function(e){{var s=e[0],n=e[1],i=t.App&&App.__container__.lookup("controller:channel"),o=this.is_dashboard?location.pathname.match(/\/([^\/]+)/):void 0;this.is_dashboard?o&&o[1]:i&&i.get&&i.get("id")}if(!this.is_dashboard){var a=this.rooms&&this.rooms[s];return void(a&&(a.ffz_chatters=n,this._cindex&&this._cindex.ffzUpdateChatters()))}this._dash_chatters=n},i.ws_commands.viewers=function(e){var s=e[0],n=e[1],i=t.App&&App.__container__.lookup("controller:channel"),r=this.is_dashboard?location.pathname.match(/\/([^\/]+)/):void 0,d=this.is_dashboard?r&&r[1]:i&&i.get&&i.get("id");if(!this.is_dashboard){var u=this.rooms&&this.rooms[s];return void(u&&(u.ffz_viewers=n,this._cindex&&this._cindex.ffzUpdateChatters()))}if(this._dash_viewers=n,this.settings.chatter_count&&d===s){var c=document.querySelector("#ffz-ffzchatter-display"),l=o.ZREKNARF+" "+a.number_commas(n)+("number"==typeof this._dash_chatters?" ("+a.number_commas(this._dash_chatters)+")":"");if(c)c.innerHTML=l;else{var h=document.querySelector("#stats");if(!h)return;c=document.createElement("span"),c.id="ffz-ffzchatter-display",c.className="ffz stat",c.title="Viewers (In Chat) with FrankerFaceZ",c.innerHTML=l,h.appendChild(c),jQuery(c).tipsy(this.is_dashboard?{gravity:"s"}:void 0)}}}},{"../constants":5,"../utils":35}],35:[function(e,s,n){var i=(t.FrankerFaceZ,e("./constants"),document.createElement("span")),o=function(t){return i.textContent=t,i.innerHTML},a=/"/g,r=/'/g,d=/&/g,u=/</g,c=/>/g,l=function(t){return t.replace(d,"&amp;").replace(a,"&quot;").replace(r,"&apos;").replace(u,"&lt;").replace(c,"&gt;")},h=function(t,e,s){return s=s||"s",e=e||"",1===t?e:s},f=function(t){return 1==t?"1st":2==t?"2nd":3==t?"3rd":null==t?"---":t+"th"},m=/^(\d{4}|\+\d{6})(?:-?(\d{2})(?:-?(\d{2})(?:T(\d{2})(?::?(\d{2})(?::?(\d{2})(?:(?:\.|,)(\d{1,}))?)?)?(Z|([\-+])(\d{2})(?::?(\d{2}))?)?)?)?)?$/,_=function(t){var e=t.match(m);if(!e)return null;e[7]=e[7]&&e[7].length?e[7].substr(0,3):0;var s=Date.UTC(e[1],e[2]-1,e[3],e[4],e[5],e[6],e[7]);if(e[9]){var n=6e4*("-"==e[9]?1:-1)*(60*e[10]+1*e[11]);s+=n}return new Date(s)},p=function(t){t=$.trim(t);var e={raw:t},s=-1;"@"===t.charAt(0)&&(s=t.indexOf(" "),e.tags=t.substr(1,s-1));var n=s+1,i=-1;":"===t.charAt(n)&&(i=t.indexOf(" ",n),e.prefix=t.substr(n+1,i-(n+1)));var o=t.indexOf(" :",n);o>=0?e.trailing=t.substr(o+2):o=t.length;var a=t.substr(i+1,o-i-1).split(" ");return e.command=a[0],a.length>1&&(e.params=a.slice(1)),e},g={":":";",s:" ",r:"\r",n:"\n","\\":"\\"},v=function(t){for(var e="",s=0;s<t.length;s++){var n=t.charAt(s);if("\\"===n){if(s===t.length-1)throw"Improperly escaped tag";if(n=g[t.charAt(s+1)],void 0===n)throw"Improperly escaped tag";s++}e+=n}return e},b=function(t,e){switch(t){case"slow":try{return parseInt(e)}catch(s){return 0}case"subs-only":case"r9k":case"subscriber":case"turbo":return"1"===e;default:try{return v(e)}catch(s){return""}}},y=function(t){for(var e={},s=t.split(";"),n=0;n<s.length;++n){var i=s[n].split("=");2===i.length&&(e[i[0]]=b(i[0],i[1]))}return e},w={},z=function(t,e){if(w[t]&&w[t][e])return w[t][e];for(var s=""===e?t.slice(0,-1):3===t.length&&""===t.charAt(1)?t.charAt(0)+t.charAt(2):t,n=[],i=0,o=0,a=0;a<s.length;)i=s.charCodeAt(a++),o?(n.push((65536+(o-55296<<10)+(i-56320)).toString(16)),o=0):i>=55296&&56319>=i?o=i:n.push(i.toString(16));var r=w[t]=w[t]||{},d=r[e]=n.join("-");return d};s.exports={update_css:function(t,e,s){var n=t.innerHTML,i="/*BEGIN "+e+"*/",o="/*END "+e+"*/",a=n.indexOf(i),r=n.indexOf(o),d=-1!==a&&-1!==r&&r>a;(d||s)&&(d&&(n=n.substr(0,a)+n.substr(r+o.length)),s&&(n+=i+s+o),t.innerHTML=n)},splitIRCMessage:p,parseIRCTags:y,emoji_to_codepoint:z,parse_date:_,number_commas:function(t){var e=t.toString().split(".");return e[0]=e[0].replace(/\B(?=(\d{3})+(?!\d))/g,","),e.join(".")},place_string:f,placement:function(t){return"forfeit"==t.state?"Forfeit":"dq"==t.state?"DQed":t.place?f(t.place):""},sanitize:o,quote_attr:l,date_string:function(t){return t.getFullYear()+"-"+(t.getMonth()+1)+"-"+t.getDate()},pluralize:h,human_time:function(t,e){e=e||1,t=Math.floor(t);var s=Math.floor(t*e/31536e3)/e;if(s>=1)return s+" year"+h(s);var n=Math.floor((t%=31536e3)/86400);if(n>=1)return n+" day"+h(n);var i=Math.floor((t%=86400)/3600);if(i>=1)return i+" hour"+h(i);var o=Math.floor((t%=3600)/60);if(o>=1)return o+" minute"+h(o);var a=t%60;return a>=1?a+" second"+h(a):"less than a second"},time_to_string:function(t,e,s,n){var i=t%60,o=Math.floor(t/60),a=Math.floor(o/60),r="";if(o%=60,e){if(r=Math.floor(a/24),a%=24,s&&r>0)return r+" days";r=r>0?r+" days, ":""}return r+(!n||r||a?(10>a?"0":"")+a+":":"")+(10>o?"0":"")+o+":"+(10>i?"0":"")+i},format_unread:function(t){return 1>t?"":t>=99?"99+":""+t}}},{"./constants":5}]},{},[18]),t.ffz=new FrankerFaceZ}(window);