From 093ba7da0832f0396e0a6d1ec7bd19cafa4f202f Mon Sep 17 00:00:00 2001 From: 10001shh Date: Thu, 6 Sep 2018 19:17:34 -0500 Subject: [PATCH] fixed calendar time bug --- calendar.html | 3 +- js/calendar.js | 62 +- js/content.js | 42 +- js/highcharts.js | 9135 ++++++++++++++++++++++++++++++++++++++++++++-- js/ics.min.js | 231 ++ 5 files changed, 9031 insertions(+), 442 deletions(-) create mode 100644 js/ics.min.js diff --git a/calendar.html b/calendar.html index f882d61a..9b32b2b9 100644 --- a/calendar.html +++ b/calendar.html @@ -12,4 +12,5 @@
- \ No newline at end of file + + \ No newline at end of file diff --git a/js/calendar.js b/js/calendar.js index 739f996e..20526aff 100644 --- a/js/calendar.js +++ b/js/calendar.js @@ -72,6 +72,33 @@ $(function () { } else { $("#register").text("Register").css("background-color", "#4CAF50"); } + var cal = ics(); + for (i in savedCourses) { + let course = savedCourses[i]; + var dtmap = makeMap(course.datetimearr); + var timearr = Array.from(dtmap.keys()); + var dayarr = Array.from(dtmap.values()); + console.log(timearr); + console.log(dayarr); + for (var i = 0; i < dayarr.length; i++) { + var place = findLoc(dayarr[i], timearr[i], course.datetimearr); + var building = place.substring(0, place.search(/\d/) - 1); + if (building == "") { + building = "Undecided Location"; + } + //cal.addEvent(subject, description, location, begin, end, rrule) + let rrurle = { + freq: "WEEKLY", + interval: 1, + byday: [""] + + } + // cal.addEvent(course.coursename, `with${course.profname}`, building, '', '', ''); + // output += `

${dayarr[i]}: ${timearr[i].split(",")[0]} to ${timearr[i].split(",")[1]}${place}

`; + } + + } + cal.download(); } }); }); @@ -119,20 +146,8 @@ $(function () { function makeLine(datetimearr) { $(".time").remove(); //converted times back - console.log(datetimearr); - var dtmap = new Map([]); - for (var i = 0; i < datetimearr.length; i++) { - datetimearr[i][1][0] = moment(datetimearr[i][1][0], ["HH:mm"]).format("h:mm A"); - datetimearr[i][1][1] = moment(datetimearr[i][1][1], ["HH:mm"]).format("h:mm A"); - } - for (var i = 0; i < datetimearr.length; i++) { - if (dtmap.has(String(datetimearr[i][1]))) { - dtmap.set(String(datetimearr[i][1]), dtmap.get(String(datetimearr[i][1])) + datetimearr[i][0]); - } else { - dtmap.set(String(datetimearr[i][1]), datetimearr[i][0]); - } - } var output = ""; + var dtmap = makeMap(datetimearr); var timearr = Array.from(dtmap.keys()); var dayarr = Array.from(dtmap.values()); for (var i = 0; i < dayarr.length; i++) { @@ -146,6 +161,23 @@ $(function () { return output; } + function makeMap(datetimearr) { + var dtmap = new Map([]); + for (var i = 0; i < datetimearr.length; i++) { + console.log(datetimearr[i][1][0]); + datetimearr[i][1][0] = moment(datetimearr[i][1][0], ["HH:mm A"]).format("h:mm a"); + datetimearr[i][1][1] = moment(datetimearr[i][1][1], ["HH:mm A"]).format("h:mm a"); + } + for (var i = 0; i < datetimearr.length; i++) { + if (dtmap.has(String(datetimearr[i][1]))) { + dtmap.set(String(datetimearr[i][1]), dtmap.get(String(datetimearr[i][1])) + datetimearr[i][0]); + } else { + dtmap.set(String(datetimearr[i][1]), datetimearr[i][0]); + } + } + return dtmap + } + /*Close Modal when hit escape*/ $(document).keydown((e) => { if (e.keyCode == 27) { @@ -164,8 +196,8 @@ $(function () { function findLoc(day, timearr, datetimearr) { for (let i = 0; i < datetimearr.length; i++) { var dtl = datetimearr[i]; - console.log(dtl[1]); - console.log(timearr); + // console.log(dtl[1]); + // console.log(timearr); if (day.includes(dtl[0])) { if (JSON.stringify(timearr) == JSON.stringify(fixDtl1(dtl[1]))) { return dtl[2]; diff --git a/js/content.js b/js/content.js index 479663a6..d917a631 100644 --- a/js/content.js +++ b/js/content.js @@ -23,7 +23,7 @@ const days = new Map([ ["W", "Wednesday"], ["TH", "Thursday"], ["F", "Friday"] - ]); +]); const fadetime = 150; const butdelay = 75; //This extension may be super lit, but you know what's even more lit? @@ -364,18 +364,18 @@ function openDialog(dep, cls, sem, professor, res) { text: 'Grades' }, categories: [ - 'A', - 'A-', - 'B+', - 'B', - 'B-', - 'C+', - 'C', - 'C-', - 'D+', - 'D', - 'D-', - 'F' + 'A', + 'A-', + 'B+', + 'B', + 'B-', + 'C+', + 'C', + 'C-', + 'D+', + 'D', + 'D-', + 'F' ], crosshair: true }, @@ -453,13 +453,13 @@ function openDialog(dep, cls, sem, professor, res) { if (data.length == 0) { //if no data, then show the message and hide the series chart.renderer.text('Could not find distribution for this Instructor teaching this Course.', 100, 120) - .css({ - fontSize: '20px', - align: 'center', - width: '300px', - left: '160px' - }) - .add(); + .css({ + fontSize: '20px', + align: 'center', + width: '300px', + left: '160px' + }) + .add(); $.each(chart.series, function (i, ser) { ser.hide(); }); @@ -564,7 +564,7 @@ function loadBinaryFile(path, success) { var data = new Uint8Array(xhr.response); var arr = new Array(); for (var i = 0; i != data.length; ++i) arr[i] = String.fromCharCode(data[i]); - success(arr.join("")); + success(arr.join("")); }; xhr.send(); }; \ No newline at end of file diff --git a/js/highcharts.js b/js/highcharts.js index 7a3ffff7..3a243b48 100644 --- a/js/highcharts.js +++ b/js/highcharts.js @@ -5,408 +5,8733 @@ License: www.highcharts.com/license */ -(function(T,K){"object"===typeof module&&module.exports?module.exports=T.document?K(T):K:T.Highcharts=K(T)})("undefined"!==typeof window?window:this,function(T){var K=function(){var a="undefined"===typeof T?window:T,C=a.document,E=a.navigator&&a.navigator.userAgent||"",F=C&&C.createElementNS&&!!C.createElementNS("http://www.w3.org/2000/svg","svg").createSVGRect,n=/(edge|msie|trident)/i.test(E)&&!a.opera,h=-1!==E.indexOf("Firefox"),e=-1!==E.indexOf("Chrome"),u=h&&4>parseInt(E.split("Firefox/")[1], -10);return a.Highcharts?a.Highcharts.error(16,!0):{product:"Highcharts",version:"6.1.1",deg2rad:2*Math.PI/360,doc:C,hasBidiBug:u,hasTouch:C&&void 0!==C.documentElement.ontouchstart,isMS:n,isWebKit:-1!==E.indexOf("AppleWebKit"),isFirefox:h,isChrome:e,isSafari:!e&&-1!==E.indexOf("Safari"),isTouchDevice:/(Mobile|Android|Windows Phone)/.test(E),SVG_NS:"http://www.w3.org/2000/svg",chartCount:0,seriesTypes:{},symbolSizes:{},svg:F,win:a,marginNames:["plotTop","marginRight","marginBottom","plotLeft"],noop:function(){}, -charts:[]}}();(function(a){a.timers=[];var C=a.charts,E=a.doc,F=a.win;a.error=function(n,h){n=a.isNumber(n)?"Highcharts error #"+n+": www.highcharts.com/errors/"+n:n;if(h)throw Error(n);F.console&&console.log(n)};a.Fx=function(a,h,e){this.options=h;this.elem=a;this.prop=e};a.Fx.prototype={dSetter:function(){var a=this.paths[0],h=this.paths[1],e=[],u=this.now,y=a.length,q;if(1===u)e=this.toD;else if(y===h.length&&1>u)for(;y--;)q=parseFloat(a[y]),e[y]=isNaN(q)?h[y]:u*parseFloat(h[y]-q)+q;else e=h;this.elem.attr("d", -e,null,!0)},update:function(){var a=this.elem,h=this.prop,e=this.now,u=this.options.step;if(this[h+"Setter"])this[h+"Setter"]();else a.attr?a.element&&a.attr(h,e,null,!0):a.style[h]=e+this.unit;u&&u.call(a,e,this)},run:function(n,h,e){var u=this,y=u.options,q=function(a){return q.stopped?!1:u.step(a)},x=F.requestAnimationFrame||function(a){setTimeout(a,13)},f=function(){for(var c=0;c=x+this.startTime?(this.now=this.end,this.pos=1,this.update(),e=f[this.prop]=!0,a.objectEach(f,function(a){!0!== -a&&(e=!1)}),e&&q&&q.call(y),n=!1):(this.pos=u.easing((h-this.startTime)/x),this.now=this.start+(this.end-this.start)*this.pos,this.update(),n=!0);return n},initPath:function(n,h,e){function u(a){var d,l;for(b=a.length;b--;)d="M"===a[b]||"L"===a[b],l=/[a-zA-Z]/.test(a[b+3]),d&&l&&a.splice(b+1,0,a[b+1],a[b+2],a[b+1],a[b+2])}function y(a,d){for(;a.lengtha&&-Infinity=e&&(h=[1/e])));for(u=0;u=n|| -!y&&q<=(h[u]+(h[u+1]||h[u]))/2);u++);return x=a.correctFloat(x*e,-Math.round(Math.log(.001)/Math.LN10))};a.stableSort=function(a,h){var e=a.length,n,y;for(y=0;ye&&(e=a[h]);return e};a.destroyObjectProperties=function(n,h){a.objectEach(n,function(a, -u){a&&a!==h&&a.destroy&&a.destroy();delete n[u]})};a.discardElement=function(n){var h=a.garbageBin;h||(h=a.createElement("div"));n&&h.appendChild(n);h.innerHTML=""};a.correctFloat=function(a,h){return parseFloat(a.toPrecision(h||14))};a.setAnimation=function(n,h){h.renderer.globalAnimation=a.pick(n,h.options.chart.animation,!0)};a.animObject=function(n){return a.isObject(n)?a.merge(n):{duration:n?500:0}};a.timeUnits={millisecond:1,second:1E3,minute:6E4,hour:36E5,day:864E5,week:6048E5,month:24192E5, -year:314496E5};a.numberFormat=function(n,h,e,u){n=+n||0;h=+h;var y=a.defaultOptions.lang,q=(n.toString().split(".")[1]||"").split("e")[0].length,x,f,c=n.toString().split("e");-1===h?h=Math.min(q,20):a.isNumber(h)?h&&c[1]&&0>c[1]&&(x=h+ +c[1],0<=x?(c[0]=(+c[0]).toExponential(x).split("e")[0],h=x):(c[0]=c[0].split(".")[0]||0,n=20>h?(c[0]*Math.pow(10,c[1])).toFixed(h):0,c[1]=0)):h=2;f=(Math.abs(c[1]?c[0]:n)+Math.pow(10,-Math.max(h,q)-1)).toFixed(h);q=String(a.pInt(f));x=3n?"-":"")+(x?q.substr(0,x)+u:"");n+=q.substr(x).replace(/(\d{3})(?=\d)/g,"$1"+u);h&&(n+=e+f.slice(-h));c[1]&&0!==+n&&(n+="e"+c[1]);return n};Math.easeInOutSine=function(a){return-.5*(Math.cos(Math.PI*a)-1)};a.getStyle=function(n,h,e){if("width"===h)return Math.max(0,Math.min(n.offsetWidth,n.scrollWidth)-a.getStyle(n,"padding-left")-a.getStyle(n,"padding-right"));if("height"===h)return Math.max(0,Math.min(n.offsetHeight,n.scrollHeight)-a.getStyle(n,"padding-top")- -a.getStyle(n,"padding-bottom"));F.getComputedStyle||a.error(27,!0);if(n=F.getComputedStyle(n,void 0))n=n.getPropertyValue(h),a.pick(e,"opacity"!==h)&&(n=a.pInt(n));return n};a.inArray=function(n,h,e){return(a.indexOfPolyfill||Array.prototype.indexOf).call(h,n,e)};a.grep=function(n,h){return(a.filterPolyfill||Array.prototype.filter).call(n,h)};a.find=Array.prototype.find?function(a,h){return a.find(h)}:function(a,h){var e,u=a.length;for(e=0;e>16,(e&65280)>>8,e&255,1]:4===h&&(y=[(e&3840)>>4|(e&3840)>>8,(e&240)>>4|e&240,(e&15)<<4|e&15,1])),!y)for(q=this.parsers.length;q--&&!y;)x=this.parsers[q],(h=x.regex.exec(e))&&(y=x.parse(h));this.rgba=y||[]},get:function(a){var e=this.input,h=this.rgba,q;this.stops?(q=n(e),q.stops=[].concat(q.stops),C(this.stops,function(e,f){q.stops[f]=[q.stops[f][0],e.get(a)]})):q=h&&E(h[0])?"rgb"===a||!a&&1===h[3]?"rgb("+h[0]+","+h[1]+","+h[2]+")":"a"===a?h[3]:"rgba("+h.join(",")+")":e; -return q},brighten:function(a){var e,y=this.rgba;if(this.stops)C(this.stops,function(e){e.brighten(a)});else if(E(a)&&0!==a)for(e=0;3>e;e++)y[e]+=h(255*a),0>y[e]&&(y[e]=0),255z.width)z={width:0,height:0}}else z=this.htmlGetBBox();b.isSVG&&(a=z.width,b=z.height,c&&"11px"===c.fontSize&&17===Math.round(b)&&(z.height=b=14),g&&(z.width=Math.abs(b*Math.sin(d))+Math.abs(a*Math.cos(d)),z.height=Math.abs(b*Math.cos(d))+Math.abs(a*Math.sin(d))));if(p&&0]*>/g,"").replace(/</g,"\x3c").replace(/>/g,"\x3e")))},textSetter:function(a){a!==this.textStr&&(delete this.bBox,this.textStr=a,this.added&&this.renderer.buildText(this))},fillSetter:function(a,g,b){"string"===typeof a?b.setAttribute(g,a):a&&this.complexColor(a,g,b)},visibilitySetter:function(a,g,b){"inherit"===a?b.removeAttribute(g):this[g]!==a&&b.setAttribute(g, -a);this[g]=a},zIndexSetter:function(a,b){var d=this.renderer,w=this.parentGroup,z=(w||d).element||d.box,c,l=this.element,m,f,d=z===d.box;c=this.added;var J;x(a)?(l.setAttribute("data-z-index",a),a=+a,this[b]===a&&(c=!1)):x(this[b])&&l.removeAttribute("data-z-index");this[b]=a;if(c){(a=this.zIndex)&&w&&(w.handleZ=!0);b=z.childNodes;for(J=b.length-1;0<=J&&!m;J--)if(w=b[J],c=w.getAttribute("data-z-index"),f=!x(c),w!==l)if(0>a&&f&&!d&&!J)z.insertBefore(l,b[J]),m=!0;else if(g(c)<=a||f&&(!x(a)||0<=a))z.insertBefore(l, -b[J+1]||null),m=!0;m||(z.insertBefore(l,b[d?3:0]||null),m=!0)}return m},_defaultSetter:function(a,g,b){b.setAttribute(g,a)}});C.prototype.yGetter=C.prototype.xGetter;C.prototype.translateXSetter=C.prototype.translateYSetter=C.prototype.rotationSetter=C.prototype.verticalAlignSetter=C.prototype.rotationOriginXSetter=C.prototype.rotationOriginYSetter=C.prototype.scaleXSetter=C.prototype.scaleYSetter=C.prototype.matrixSetter=function(a,g){this[g]=a;this.doTransform=!0};C.prototype["stroke-widthSetter"]= -C.prototype.strokeSetter=function(a,g,b){this[g]=a;this.stroke&&this["stroke-width"]?(C.prototype.fillSetter.call(this,this.stroke,"stroke",b),b.setAttribute("stroke-width",this["stroke-width"]),this.hasStroke=!0):"stroke-width"===g&&0===a&&this.hasStroke&&(b.removeAttribute("stroke"),this.hasStroke=!1)};E=a.SVGRenderer=function(){this.init.apply(this,arguments)};l(E.prototype,{Element:C,SVG_NS:J,init:function(a,g,b,d,w,c){var z;d=this.createElement("svg").attr({version:"1.1","class":"highcharts-root"}).css(this.getStyle(d)); -z=d.element;a.appendChild(z);h(a,"dir","ltr");-1===a.innerHTML.indexOf("xmlns")&&h(z,"xmlns",this.SVG_NS);this.isSVG=!0;this.box=z;this.boxWrapper=d;this.alignedObjects=[];this.url=(t||m)&&k.getElementsByTagName("base").length?N.location.href.replace(/#.*?$/,"").replace(/<[^>]*>/g,"").replace(/([\('\)])/g,"\\$1").replace(/ /g,"%20"):"";this.createElement("desc").add().element.appendChild(k.createTextNode("Created with Highcharts 6.1.1"));this.defs=this.createElement("defs").add();this.allowHTML=c; -this.forExport=w;this.gradients={};this.cache={};this.cacheKeys=[];this.imgCount=0;this.setSize(g,b,!1);var l;t&&a.getBoundingClientRect&&(g=function(){y(a,{left:0,top:0});l=a.getBoundingClientRect();y(a,{left:Math.ceil(l.left)-l.left+"px",top:Math.ceil(l.top)-l.top+"px"})},g(),this.unSubPixelFix=F(N,"resize",g))},getStyle:function(a){return this.style=l({fontFamily:'"Lucida Grande", "Lucida Sans Unicode", Arial, Helvetica, sans-serif',fontSize:"12px"},a)},setStyle:function(a){this.boxWrapper.css(this.getStyle(a))}, -isHidden:function(){return!this.boxWrapper.getBBox().width},destroy:function(){var a=this.defs;this.box=null;this.boxWrapper=this.boxWrapper.destroy();c(this.gradients||{});this.gradients=null;a&&(this.defs=a.destroy());this.unSubPixelFix&&this.unSubPixelFix();return this.alignedObjects=null},createElement:function(a){var g=new this.Element;g.init(this,a);return g},draw:B,getRadialAttr:function(a,g){return{cx:a[0]-a[2]/2+g.cx*a[2],cy:a[1]-a[2]/2+g.cy*a[2],r:g.r*a[2]}},getSpanWidth:function(a){return a.getBBox(!0).width}, -applyEllipsis:function(a,g,b,d){var w=a.rotation,c=b,z,l=0,m=b.length,J=function(a){g.removeChild(g.firstChild);a&&g.appendChild(k.createTextNode(a))},f;a.rotation=0;c=this.getSpanWidth(a,g);if(f=c>d){for(;l<=m;)z=Math.ceil((l+m)/2),c=b.substring(0,z)+"\u2026",J(c),c=this.getSpanWidth(a,g),l===m?l=m+1:c>d?m=z-1:l=z;0===m&&J("")}a.rotation=w;return f},escapes:{"\x26":"\x26amp;","\x3c":"\x26lt;","\x3e":"\x26gt;","'":"\x26#39;",'"':"\x26quot;"},buildText:function(a){var d=a.element,w=this,c=w.forExport, -l=G(a.textStr,"").toString(),z=-1!==l.indexOf("\x3c"),m=d.childNodes,f,B=h(d,"x"),v=a.styles,D=a.textWidth,t=v&&v.lineHeight,A=v&&v.textOutline,e=v&&"ellipsis"===v.textOverflow,P=v&&"nowrap"===v.whiteSpace,O=v&&v.fontSize,q,x,I=m.length,v=D&&!a.added&&this.box,H=function(a){var b;b=/(px|em)$/.test(a&&a.style.fontSize)?a.style.fontSize:O||w.style.fontSize||12;return t?g(t):w.fontMetrics(b,a.getAttribute("style")?a:d).h},N=function(a,g){M(w.escapes,function(b,d){g&&-1!==p(b,g)||(a=a.toString().replace(new RegExp(b, -"g"),d))});return a},u=function(a,g){var b;b=a.indexOf("\x3c");a=a.substring(b,a.indexOf("\x3e")-b);b=a.indexOf(g+"\x3d");if(-1!==b&&(b=b+g.length+1,g=a.charAt(b),'"'===g||"'"===g))return a=a.substring(b+1),a.substring(0,a.indexOf(g))};q=[l,e,P,t,A,O,D].join();if(q!==a.textCache){for(a.textCache=q;I--;)d.removeChild(m[I]);z||A||e||D||-1!==l.indexOf(" ")?(v&&v.appendChild(d),l=z?l.replace(/<(b|strong)>/g,'\x3cspan style\x3d"font-weight:bold"\x3e').replace(/<(i|em)>/g,'\x3cspan style\x3d"font-style:italic"\x3e').replace(//g,"\x3c/span\x3e").split(//g):[l],l=b(l,function(a){return""!==a}),r(l,function(g,b){var l,z=0;g=g.replace(/^\s+|\s+$/g,"").replace(//g,"\x3c/span\x3e|||");l=g.split("|||");r(l,function(g){if(""!==g||1===l.length){var m={},v=k.createElementNS(w.SVG_NS,"tspan"),p,r;(p=u(g,"class"))&&h(v,"class",p);if(p=u(g,"style"))p=p.replace(/(;| |^)color([ :])/,"$1fill$2"),h(v,"style",p);(r=u(g,"href"))&&!c&&(h(v,"onclick", -'location.href\x3d"'+r+'"'),h(v,"class","highcharts-anchor"),y(v,{cursor:"pointer"}));g=N(g.replace(/<[a-zA-Z\/](.|\n)*?>/g,"")||" ");if(" "!==g){v.appendChild(k.createTextNode(g));z?m.dx=0:b&&null!==B&&(m.x=B);h(v,m);d.appendChild(v);!z&&x&&(!Q&&c&&y(v,{display:"block"}),h(v,"dy",H(v)));if(D){m=g.replace(/([^\^])-/g,"$1- ").split(" ");r=1D,void 0===f&&(f=g),g&&1!==m.length?(v.removeChild(v.firstChild),t.unshift(m.pop())):(m=t,t=[],m.length&&!P&&(v=k.createElementNS(J,"tspan"),h(v,{dy:O,x:B}),p&&h(v,"style",p),d.appendChild(v)),A>D&&(D=A+1)),m.length&&v.appendChild(k.createTextNode(m.join(" ").replace(/- /g,"-")));a.rotation=q}z++}}});x=x||d.childNodes.length}),e&&f&&a.attr("title",N(a.textStr,["\x26lt;","\x26gt;"])),v&&v.removeChild(d),A&&a.applyTextOutline&&a.applyTextOutline(A)):d.appendChild(k.createTextNode(N(l)))}},getContrast:function(a){a= -u(a).rgba;return 510Math.abs(w.end-w.start-2*Math.PI));var J=Math.cos(c),v=Math.sin(c),z=Math.cos(f),f=Math.sin(f);w=.001>w.end-c-Math.PI?0:1;l=["M",a+l*J,g+m*v,"A",l,m,0,w,1,a+l*z,g+m*f];x(b)&&l.push(d?"M":"L",a+b*z,g+b*f,"A",b,b,0,w,0,a+b*J,g+b*v);l.push(d?"":"Z");return l},callout:function(a, -g,b,d,w){var c=Math.min(w&&w.r||0,b,d),l=c+6,m=w&&w.anchorX;w=w&&w.anchorY;var f;f=["M",a+c,g,"L",a+b-c,g,"C",a+b,g,a+b,g,a+b,g+c,"L",a+b,g+d-c,"C",a+b,g+d,a+b,g+d,a+b-c,g+d,"L",a+c,g+d,"C",a,g+d,a,g+d,a,g+d-c,"L",a,g+c,"C",a,g,a,g,a+c,g];m&&m>b?w>g+l&&wm?w>g+l&&wd&&m>a+l&&mw&&m>a+l&&ma?a+3:Math.round(1.2*a);return{h:b,b:Math.round(.8*b),f:a}},rotCorr:function(a,g,b){var d=a;g&&b&&(d=Math.max(d*Math.cos(g*f), -4));return{x:-a/3*Math.sin(g*f),y:d}},label:function(g,b,d,c,m,f,J,v,B){var k=this,p=k.g("button"!==B&&"label"),t=p.text=k.text("",0,0,J).attr({zIndex:1}),z,A,Q=0,e=3,P=0,h,O,q,G,I,H={},N,y,M=/^url\((.*?)\)$/.test(c),u=M,n,L,R,U;B&&p.addClass("highcharts-"+B);u=M;n=function(){return(N||0)%2/2};L=function(){var a=t.element.style,g={};A=(void 0===h||void 0===O||I)&&x(t.textStr)&&t.getBBox();p.width=(h||A.width||0)+2*e+P;p.height=(O||A.height||0)+2*e;y=e+k.fontMetrics(a&&a.fontSize,t).b;u&&(z||(p.box= -z=k.symbols[c]||M?k.symbol(c):k.rect(),z.addClass(("button"===B?"":"highcharts-label-box")+(B?" highcharts-"+B+"-box":"")),z.add(p),a=n(),g.x=a,g.y=(v?-y:0)+a),g.width=Math.round(p.width),g.height=Math.round(p.height),z.attr(l(g,H)),H={})};R=function(){var a=P+e,g;g=v?0:y;x(h)&&A&&("center"===I||"right"===I)&&(a+={center:.5,right:1}[I]*(h-A.width));if(a!==t.x||g!==t.y)t.attr("x",a),t.hasBoxWidthChanged&&(A=t.getBBox(!0),L()),void 0!==g&&t.attr("y",g);t.x=a;t.y=g};U=function(a,g){z?z.attr(a,g):H[a]= -g};p.onAdd=function(){t.add(p);p.attr({text:g||0===g?g:"",x:b,y:d});z&&x(m)&&p.attr({anchorX:m,anchorY:f})};p.widthSetter=function(g){h=a.isNumber(g)?g:null};p.heightSetter=function(a){O=a};p["text-alignSetter"]=function(a){I=a};p.paddingSetter=function(a){x(a)&&a!==e&&(e=p.padding=a,R())};p.paddingLeftSetter=function(a){x(a)&&a!==P&&(P=a,R())};p.alignSetter=function(a){a={left:0,center:.5,right:1}[a];a!==Q&&(Q=a,A&&p.attr({x:q}))};p.textSetter=function(a){void 0!==a&&t.textSetter(a);L();R()};p["stroke-widthSetter"]= -function(a,g){a&&(u=!0);N=this["stroke-width"]=a;U(g,a)};p.strokeSetter=p.fillSetter=p.rSetter=function(a,g){"r"!==g&&("fill"===g&&a&&(u=!0),p[g]=a);U(g,a)};p.anchorXSetter=function(a,g){m=p.anchorX=a;U(g,Math.round(a)-n()-q)};p.anchorYSetter=function(a,g){f=p.anchorY=a;U(g,a-G)};p.xSetter=function(a){p.x=a;Q&&(a-=Q*((h||A.width)+2*e),p["forceAnimate:x"]=!0);q=Math.round(a);p.attr("translateX",q)};p.ySetter=function(a){G=p.y=Math.round(a);p.attr("translateY",G)};var S=p.css;return l(p,{css:function(a){if(a){var g= -{};a=D(a);r(p.textProps,function(b){void 0!==a[b]&&(g[b]=a[b],delete a[b])});t.css(g);"width"in g&&L()}return S.call(p,a)},getBBox:function(){return{width:A.width+2*e,height:A.height+2*e,x:A.x-e,y:A.y-e}},shadow:function(a){a&&(L(),z&&z.shadow(a));return p},destroy:function(){w(p.element,"mouseenter");w(p.element,"mouseleave");t&&(t=t.destroy());z&&(z=z.destroy());C.prototype.destroy.call(p);p=k=L=R=U=null}})}});a.Renderer=E})(K);(function(a){var C=a.attr,E=a.createElement,F=a.css,n=a.defined,h=a.each, -e=a.extend,u=a.isFirefox,y=a.isMS,q=a.isWebKit,x=a.pick,f=a.pInt,c=a.SVGRenderer,k=a.win,r=a.wrap;e(a.SVGElement.prototype,{htmlCss:function(a){var d=this.element;if(d=a&&"SPAN"===d.tagName&&a.width)delete a.width,this.textWidth=d,this.htmlUpdateTransform();a&&"ellipsis"===a.textOverflow&&(a.whiteSpace="nowrap",a.overflow="hidden");this.styles=e(this.styles,a);F(this.element,a);return this},htmlGetBBox:function(){var a=this.element;return{x:a.offsetLeft,y:a.offsetTop,width:a.offsetWidth,height:a.offsetHeight}}, -htmlUpdateTransform:function(){if(this.added){var a=this.renderer,d=this.element,b=this.translateX||0,c=this.translateY||0,p=this.x||0,k=this.y||0,t=this.textAlign||"left",r={left:0,center:.5,right:1}[t],A=this.styles,e=A&&A.whiteSpace;F(d,{marginLeft:b,marginTop:c});this.shadows&&h(this.shadows,function(a){F(a,{marginLeft:b+1,marginTop:c+1})});this.inverted&&h(d.childNodes,function(b){a.invertChild(b,d)});if("SPAN"===d.tagName){var A=this.rotation,m=this.textWidth&&f(this.textWidth),D=[A,t,d.innerHTML, -this.textWidth,this.textAlign].join(),B;(B=m!==this.oldTextWidth)&&!(B=m>this.oldTextWidth)&&((B=this.textPxLength)||(F(d,{width:"",whiteSpace:e||"nowrap"}),B=d.offsetWidth),B=B>m);B&&/[ \-]/.test(d.textContent||d.innerText)?(F(d,{width:m+"px",display:"block",whiteSpace:e||"normal"}),this.oldTextWidth=m,this.hasBoxWidthChanged=!0):this.hasBoxWidthChanged=!1;D!==this.cTT&&(e=a.fontMetrics(d.style.fontSize).b,n(A)&&A!==(this.oldRotation||0)&&this.setSpanRotation(A,r,e),this.getSpanCorrection(!n(A)&& -this.textPxLength||d.offsetWidth,e,r,A,t));F(d,{left:p+(this.xCorr||0)+"px",top:k+(this.yCorr||0)+"px"});this.cTT=D;this.oldRotation=A}}else this.alignOnAdd=!0},setSpanRotation:function(a,d,b){var c={},l=this.renderer.getTransformKey();c[l]=c.transform="rotate("+a+"deg)";c[l+(u?"Origin":"-origin")]=c.transformOrigin=100*d+"% "+b+"px";F(this.element,c)},getSpanCorrection:function(a,d,b){this.xCorr=-a*b;this.yCorr=-d}});e(c.prototype,{getTransformKey:function(){return y&&!/Edge/.test(k.navigator.userAgent)? -"-ms-transform":q?"-webkit-transform":u?"MozTransform":k.opera?"-o-transform":""},html:function(a,d,b){var c=this.createElement("span"),l=c.element,f=c.renderer,k=f.isSVG,q=function(a,b){h(["opacity","visibility"],function(d){r(a,d+"Setter",function(a,d,c,m){a.call(this,d,c,m);b[c]=d})});a.addedSetters=!0};c.textSetter=function(a){a!==l.innerHTML&&delete this.bBox;this.textStr=a;l.innerHTML=x(a,"");c.doTransform=!0};k&&q(c,c.element.style);c.xSetter=c.ySetter=c.alignSetter=c.rotationSetter=function(a, -b){"align"===b&&(b="textAlign");c[b]=a;c.doTransform=!0};c.afterSetters=function(){this.doTransform&&(this.htmlUpdateTransform(),this.doTransform=!1)};c.attr({text:a,x:Math.round(d),y:Math.round(b)}).css({fontFamily:this.style.fontFamily,fontSize:this.style.fontSize,position:"absolute"});l.style.whiteSpace="nowrap";c.css=c.htmlCss;k&&(c.add=function(a){var b,d=f.box.parentNode,p=[];if(this.parentGroup=a){if(b=a.div,!b){for(;a;)p.push(a),a=a.parentGroup;h(p.reverse(),function(a){function m(g,b){a[b]= -g;"translateX"===b?l.left=g+"px":l.top=g+"px";a.doTransform=!0}var l,g=C(a.element,"class");g&&(g={className:g});b=a.div=a.div||E("div",g,{position:"absolute",left:(a.translateX||0)+"px",top:(a.translateY||0)+"px",display:a.display,opacity:a.opacity,pointerEvents:a.styles&&a.styles.pointerEvents},b||d);l=b.style;e(a,{classSetter:function(a){return function(g){this.element.setAttribute("class",g);a.className=g}}(b),on:function(){p[0].div&&c.on.apply({element:p[0].div},arguments);return a},translateXSetter:m, -translateYSetter:m});a.addedSetters||q(a,l)})}}else b=d;b.appendChild(l);c.added=!0;c.alignOnAdd&&c.htmlUpdateTransform();return c});return c}})})(K);(function(a){var C=a.defined,E=a.each,F=a.extend,n=a.merge,h=a.pick,e=a.timeUnits,u=a.win;a.Time=function(a){this.update(a,!1)};a.Time.prototype={defaultOptions:{},update:function(e){var q=h(e&&e.useUTC,!0),x=this;this.options=e=n(!0,this.options||{},e);this.Date=e.Date||u.Date;this.timezoneOffset=(this.useUTC=q)&&e.timezoneOffset;this.getTimezoneOffset= -this.timezoneOffsetFunction();(this.variableTimezone=!(q&&!e.getTimezoneOffset&&!e.timezone))||this.timezoneOffset?(this.get=function(a,c){var f=c.getTime(),r=f-x.getTimezoneOffset(c);c.setTime(r);a=c["getUTC"+a]();c.setTime(f);return a},this.set=function(f,c,k){var r;if(-1!==a.inArray(f,["Milliseconds","Seconds","Minutes"]))c["set"+f](k);else r=x.getTimezoneOffset(c),r=c.getTime()-r,c.setTime(r),c["setUTC"+f](k),f=x.getTimezoneOffset(c),r=c.getTime()+f,c.setTime(r)}):q?(this.get=function(a,c){return c["getUTC"+ -a]()},this.set=function(a,c,k){return c["setUTC"+a](k)}):(this.get=function(a,c){return c["get"+a]()},this.set=function(a,c,k){return c["set"+a](k)})},makeTime:function(e,q,x,f,c,k){var r,l,d;this.useUTC?(r=this.Date.UTC.apply(0,arguments),l=this.getTimezoneOffset(r),r+=l,d=this.getTimezoneOffset(r),l!==d?r+=d-l:l-36E5!==this.getTimezoneOffset(r-36E5)||a.isSafari||(r-=36E5)):r=(new this.Date(e,q,h(x,1),h(f,0),h(c,0),h(k,0))).getTime();return r},timezoneOffsetFunction:function(){var e=this,h=this.options, -x=u.moment;if(!this.useUTC)return function(a){return 6E4*(new Date(a)).getTimezoneOffset()};if(h.timezone){if(x)return function(a){return 6E4*-x.tz(a,h.timezone).utcOffset()};a.error(25)}return this.useUTC&&h.getTimezoneOffset?function(a){return 6E4*h.getTimezoneOffset(a)}:function(){return 6E4*(e.timezoneOffset||0)}},dateFormat:function(e,h,x){if(!a.defined(h)||isNaN(h))return a.defaultOptions.lang.invalidDate||"";e=a.pick(e,"%Y-%m-%d %H:%M:%S");var f=this,c=new this.Date(h),k=this.get("Hours",c), -r=this.get("Day",c),l=this.get("Date",c),d=this.get("Month",c),b=this.get("FullYear",c),v=a.defaultOptions.lang,p=v.weekdays,q=v.shortWeekdays,t=a.pad,c=a.extend({a:q?q[r]:p[r].substr(0,3),A:p[r],d:t(l),e:t(l,2," "),w:r,b:v.shortMonths[d],B:v.months[d],m:t(d+1),o:d+1,y:b.toString().substr(2,2),Y:b,H:t(k),k:k,I:t(k%12||12),l:k%12||12,M:t(f.get("Minutes",c)),p:12>k?"AM":"PM",P:12>k?"am":"pm",S:t(c.getSeconds()),L:t(Math.round(h%1E3),3)},a.dateFormats);a.objectEach(c,function(a,b){for(;-1!==e.indexOf("%"+ -b);)e=e.replace("%"+b,"function"===typeof a?a.call(f,h):a)});return x?e.substr(0,1).toUpperCase()+e.substr(1):e},getTimeTicks:function(a,q,x,f){var c=this,k=[],r={},l,d=new c.Date(q),b=a.unitRange,v=a.count||1,p;if(C(q)){c.set("Milliseconds",d,b>=e.second?0:v*Math.floor(c.get("Milliseconds",d)/v));b>=e.second&&c.set("Seconds",d,b>=e.minute?0:v*Math.floor(c.get("Seconds",d)/v));b>=e.minute&&c.set("Minutes",d,b>=e.hour?0:v*Math.floor(c.get("Minutes",d)/v));b>=e.hour&&c.set("Hours",d,b>=e.day?0:v*Math.floor(c.get("Hours", -d)/v));b>=e.day&&c.set("Date",d,b>=e.month?1:v*Math.floor(c.get("Date",d)/v));b>=e.month&&(c.set("Month",d,b>=e.year?0:v*Math.floor(c.get("Month",d)/v)),l=c.get("FullYear",d));b>=e.year&&c.set("FullYear",d,l-l%v);b===e.week&&c.set("Date",d,c.get("Date",d)-c.get("Day",d)+h(f,1));l=c.get("FullYear",d);f=c.get("Month",d);var I=c.get("Date",d),t=c.get("Hours",d);q=d.getTime();c.variableTimezone&&(p=x-q>4*e.month||c.getTimezoneOffset(q)!==c.getTimezoneOffset(x));d=d.getTime();for(q=1;dk.length&&E(k,function(a){0===a%18E5&&"000000000"===c.dateFormat("%H%M%S%L",a)&&(r[a]="day")})}k.info=F(a,{higherRanks:r,totalRange:b*v});return k}}})(K);(function(a){var C=a.color,E=a.merge;a.defaultOptions={colors:"#7cb5ec #434348 #90ed7d #f7a35c #8085e9 #f15c80 #e4d354 #2b908f #f45b5b #91e8e1".split(" "), -symbols:["circle","diamond","square","triangle","triangle-down"],lang:{loading:"Loading...",months:"January February March April May June July August September October November December".split(" "),shortMonths:"Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "),weekdays:"Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" "),decimalPoint:".",numericSymbols:"kMGTPE".split(""),resetZoom:"Reset zoom",resetZoomTitle:"Reset zoom level 1:1",thousandsSep:" "},global:{},time:a.Time.prototype.defaultOptions, -chart:{borderRadius:0,defaultSeriesType:"line",ignoreHiddenSeries:!0,spacing:[10,10,15,10],resetZoomButton:{theme:{zIndex:6},position:{align:"right",x:-10,y:10}},width:null,height:null,borderColor:"#335cad",backgroundColor:"#ffffff",plotBorderColor:"#cccccc"},title:{text:"Chart title",align:"center",margin:15,widthAdjust:-44},subtitle:{text:"",align:"center",widthAdjust:-44},plotOptions:{},labels:{style:{position:"absolute",color:"#333333"}},legend:{enabled:!0,align:"center",alignColumns:!0,layout:"horizontal", -labelFormatter:function(){return this.name},borderColor:"#999999",borderRadius:0,navigation:{activeColor:"#003399",inactiveColor:"#cccccc"},itemStyle:{color:"#333333",fontSize:"12px",fontWeight:"bold",textOverflow:"ellipsis"},itemHoverStyle:{color:"#000000"},itemHiddenStyle:{color:"#cccccc"},shadow:!1,itemCheckboxStyle:{position:"absolute",width:"13px",height:"13px"},squareSymbol:!0,symbolPadding:5,verticalAlign:"bottom",x:0,y:0,title:{style:{fontWeight:"bold"}}},loading:{labelStyle:{fontWeight:"bold", -position:"relative",top:"45%"},style:{position:"absolute",backgroundColor:"#ffffff",opacity:.5,textAlign:"center"}},tooltip:{enabled:!0,animation:a.svg,borderRadius:3,dateTimeLabelFormats:{millisecond:"%A, %b %e, %H:%M:%S.%L",second:"%A, %b %e, %H:%M:%S",minute:"%A, %b %e, %H:%M",hour:"%A, %b %e, %H:%M",day:"%A, %b %e, %Y",week:"Week from %A, %b %e, %Y",month:"%B %Y",year:"%Y"},footerFormat:"",padding:8,snap:a.isTouchDevice?25:10,backgroundColor:C("#f7f7f7").setOpacity(.85).get(),borderWidth:1,headerFormat:'\x3cspan style\x3d"font-size: 10px"\x3e{point.key}\x3c/span\x3e\x3cbr/\x3e', -pointFormat:'\x3cspan style\x3d"color:{point.color}"\x3e\u25cf\x3c/span\x3e {series.name}: \x3cb\x3e{point.y}\x3c/b\x3e\x3cbr/\x3e',shadow:!0,style:{color:"#333333",cursor:"default",fontSize:"12px",pointerEvents:"none",whiteSpace:"nowrap"}},credits:{enabled:!0,href:"http://www.highcharts.com",position:{align:"right",x:-10,verticalAlign:"bottom",y:-5},style:{cursor:"pointer",color:"#999999",fontSize:"9px"},text:"Highcharts.com"}};a.setOptions=function(C){a.defaultOptions=E(!0,a.defaultOptions,C);a.time.update(E(a.defaultOptions.global, -a.defaultOptions.time),!1);return a.defaultOptions};a.getOptions=function(){return a.defaultOptions};a.defaultPlotOptions=a.defaultOptions.plotOptions;a.time=new a.Time(E(a.defaultOptions.global,a.defaultOptions.time));a.dateFormat=function(C,n,h){return a.time.dateFormat(C,n,h)}})(K);(function(a){var C=a.correctFloat,E=a.defined,F=a.destroyObjectProperties,n=a.fireEvent,h=a.isNumber,e=a.merge,u=a.pick,y=a.deg2rad;a.Tick=function(a,e,f,c){this.axis=a;this.pos=e;this.type=f||"";this.isNewLabel=this.isNew= -!0;f||c||this.addLabel()};a.Tick.prototype={addLabel:function(){var a=this.axis,h=a.options,f=a.chart,c=a.categories,k=a.names,r=this.pos,l=h.labels,d=a.tickPositions,b=r===d[0],v=r===d[d.length-1],k=c?u(c[r],k[r],r):r,c=this.label,d=d.info,p;a.isDatetimeAxis&&d&&(p=h.dateTimeLabelFormats[d.higherRanks[r]||d.unitName]);this.isFirst=b;this.isLast=v;h=a.labelFormatter.call({axis:a,chart:f,isFirst:b,isLast:v,dateTimeLabelFormat:p,value:a.isLog?C(a.lin2log(k)):k,pos:r});if(E(c))c&&c.attr({text:h});else{if(this.label= -c=E(h)&&l.enabled?f.renderer.text(h,0,0,l.useHTML).css(e(l.style)).add(a.labelGroup):null)c.textPxLength=c.getBBox().width;this.rotation=0}},getLabelSize:function(){return this.label?this.label.getBBox()[this.axis.horiz?"height":"width"]:0},handleOverflow:function(a){var e=this.axis,f=e.options.labels,c=a.x,k=e.chart.chartWidth,r=e.chart.spacing,l=u(e.labelLeft,Math.min(e.pos,r[3])),r=u(e.labelRight,Math.max(e.isRadial?0:e.pos+e.len,k-r[1])),d=this.label,b=this.rotation,v={left:0,center:.5,right:1}[e.labelAlign|| -d.attr("align")],p=d.getBBox().width,h=e.getSlotWidth(this),t=h,q=1,A,H={};if(b||!1===f.overflow)0>b&&c-v*pr&&(A=Math.round((k-c)/Math.cos(b*y)));else if(k=c+(1-v)*p,c-v*pr&&(t=r-a.x+t*v,q=-1),t=Math.min(h,t),tt||e.autoRotation&&(d.styles||{}).width)A=t;A&&(H.width=A,(f.style||{}).textOverflow||(H.textOverflow="ellipsis"),d.css(H))},getPosition:function(e,h,f,c){var k= -this.axis,r=k.chart,l=c&&r.oldChartHeight||r.chartHeight;e={x:e?a.correctFloat(k.translate(h+f,null,null,c)+k.transB):k.left+k.offset+(k.opposite?(c&&r.oldChartWidth||r.chartWidth)-k.right-k.left:0),y:e?l-k.bottom+k.offset-(k.opposite?k.height:0):a.correctFloat(l-k.translate(h+f,null,null,c)-k.transB)};n(this,"afterGetPosition",{pos:e});return e},getLabelPosition:function(a,e,f,c,k,r,l,d){var b=this.axis,v=b.transA,p=b.reversed,h=b.staggerLines,t=b.tickRotCorr||{x:0,y:0},q=k.y,A=c||b.reserveSpaceDefault? -0:-b.labelOffset*("center"===b.labelAlign?.5:1),x={};E(q)||(q=0===b.side?f.rotation?-8:-f.getBBox().height:2===b.side?t.y+8:Math.cos(f.rotation*y)*(t.y-f.getBBox(!1,0).height/2));a=a+k.x+A+t.x-(r&&c?r*v*(p?-1:1):0);e=e+q-(r&&!c?r*v*(p?1:-1):0);h&&(f=l/(d||1)%h,b.opposite&&(f=h-f-1),e+=b.labelOffset/h*f);x.x=a;x.y=Math.round(e);n(this,"afterGetLabelPosition",{pos:x});return x},getMarkPath:function(a,e,f,c,k,r){return r.crispLine(["M",a,e,"L",a+(k?0:-f),e+(k?f:0)],c)},renderGridLine:function(a,e,f){var c= -this.axis,k=c.options,r=this.gridLine,l={},d=this.pos,b=this.type,v=c.tickmarkOffset,p=c.chart.renderer,h=b?b+"Grid":"grid",t=k[h+"LineWidth"],q=k[h+"LineColor"],k=k[h+"LineDashStyle"];r||(l.stroke=q,l["stroke-width"]=t,k&&(l.dashstyle=k),b||(l.zIndex=1),a&&(l.opacity=0),this.gridLine=r=p.path().attr(l).addClass("highcharts-"+(b?b+"-":"")+"grid-line").add(c.gridGroup));if(!a&&r&&(a=c.getPlotLinePath(d+v,r.strokeWidth()*f,a,!0)))r[this.isNew?"attr":"animate"]({d:a,opacity:e})},renderMark:function(a, -e,f){var c=this.axis,k=c.options,r=c.chart.renderer,l=this.type,d=l?l+"Tick":"tick",b=c.tickSize(d),v=this.mark,p=!v,h=a.x;a=a.y;var t=u(k[d+"Width"],!l&&c.isXAxis?1:0),k=k[d+"Color"];b&&(c.opposite&&(b[0]=-b[0]),p&&(this.mark=v=r.path().addClass("highcharts-"+(l?l+"-":"")+"tick").add(c.axisGroup),v.attr({stroke:k,"stroke-width":t})),v[p?"attr":"animate"]({d:this.getMarkPath(h,a,b[0],v.strokeWidth()*f,c.horiz,r),opacity:e}))},renderLabel:function(a,e,f,c){var k=this.axis,r=k.horiz,l=k.options,d=this.label, -b=l.labels,v=b.step,k=k.tickmarkOffset,p=!0,I=a.x;a=a.y;d&&h(I)&&(d.xy=a=this.getLabelPosition(I,a,d,r,b,k,c,v),this.isFirst&&!this.isLast&&!u(l.showFirstLabel,1)||this.isLast&&!this.isFirst&&!u(l.showLastLabel,1)?p=!1:!r||b.step||b.rotation||e||0===f||this.handleOverflow(a),v&&c%v&&(p=!1),p&&h(a.y)?(a.opacity=f,d[this.isNewLabel?"attr":"animate"](a),this.isNewLabel=!1):(d.attr("y",-9999),this.isNewLabel=!0))},render:function(e,h,f){var c=this.axis,k=c.horiz,r=this.getPosition(k,this.pos,c.tickmarkOffset, -h),l=r.x,d=r.y,c=k&&l===c.pos+c.len||!k&&d===c.pos?-1:1;f=u(f,1);this.isActive=!0;this.renderGridLine(h,f,c);this.renderMark(r,f,c);this.renderLabel(r,h,f,e);this.isNew=!1;a.fireEvent(this,"afterRender")},destroy:function(){F(this,this.axis)}}})(K);var V=function(a){var C=a.addEvent,E=a.animObject,F=a.arrayMax,n=a.arrayMin,h=a.color,e=a.correctFloat,u=a.defaultOptions,y=a.defined,q=a.deg2rad,x=a.destroyObjectProperties,f=a.each,c=a.extend,k=a.fireEvent,r=a.format,l=a.getMagnitude,d=a.grep,b=a.inArray, -v=a.isArray,p=a.isNumber,I=a.isString,t=a.merge,L=a.normalizeTickInterval,A=a.objectEach,H=a.pick,m=a.removeEvent,D=a.splat,B=a.syncTimeout,M=a.Tick,G=function(){this.init.apply(this,arguments)};a.extend(G.prototype,{defaultOptions:{dateTimeLabelFormats:{millisecond:"%H:%M:%S.%L",second:"%H:%M:%S",minute:"%H:%M",hour:"%H:%M",day:"%e. %b",week:"%e. %b",month:"%b '%y",year:"%Y"},endOnTick:!1,labels:{enabled:!0,style:{color:"#666666",cursor:"default",fontSize:"11px"},x:0},maxPadding:.01,minorTickLength:2, -minorTickPosition:"outside",minPadding:.01,startOfWeek:1,startOnTick:!1,tickLength:10,tickmarkPlacement:"between",tickPixelInterval:100,tickPosition:"outside",title:{align:"middle",style:{color:"#666666"}},type:"linear",minorGridLineColor:"#f2f2f2",minorGridLineWidth:1,minorTickColor:"#999999",lineColor:"#ccd6eb",lineWidth:1,gridLineColor:"#e6e6e6",tickColor:"#ccd6eb"},defaultYAxisOptions:{endOnTick:!0,tickPixelInterval:72,showLastLabel:!0,labels:{x:-8},maxPadding:.05,minPadding:.05,startOnTick:!0, -title:{rotation:270,text:"Values"},stackLabels:{allowOverlap:!1,enabled:!1,formatter:function(){return a.numberFormat(this.total,-1)},style:{fontSize:"11px",fontWeight:"bold",color:"#000000",textOutline:"1px contrast"}},gridLineWidth:1,lineWidth:0},defaultLeftAxisOptions:{labels:{x:-15},title:{rotation:270}},defaultRightAxisOptions:{labels:{x:15},title:{rotation:90}},defaultBottomAxisOptions:{labels:{autoRotation:[-45],x:0},title:{rotation:0}},defaultTopAxisOptions:{labels:{autoRotation:[-45],x:0}, -title:{rotation:0}},init:function(a,d){var g=d.isX,w=this;w.chart=a;w.horiz=a.inverted&&!w.isZAxis?!g:g;w.isXAxis=g;w.coll=w.coll||(g?"xAxis":"yAxis");k(this,"init",{userOptions:d});w.opposite=d.opposite;w.side=d.side||(w.horiz?w.opposite?0:2:w.opposite?1:3);w.setOptions(d);var c=this.options,m=c.type;w.labelFormatter=c.labels.formatter||w.defaultLabelFormatter;w.userOptions=d;w.minPixelPadding=0;w.reversed=c.reversed;w.visible=!1!==c.visible;w.zoomEnabled=!1!==c.zoomEnabled;w.hasNames="category"=== -m||!0===c.categories;w.categories=c.categories||w.hasNames;w.names||(w.names=[],w.names.keys={});w.plotLinesAndBandsGroups={};w.isLog="logarithmic"===m;w.isDatetimeAxis="datetime"===m;w.positiveValuesOnly=w.isLog&&!w.allowNegativeLog;w.isLinked=y(c.linkedTo);w.ticks={};w.labelEdge=[];w.minorTicks={};w.plotLinesAndBands=[];w.alternateBands={};w.len=0;w.minRange=w.userMinRange=c.minRange||c.maxZoom;w.range=c.range;w.offset=c.offset||0;w.stacks={};w.oldStacks={};w.stacksTouched=0;w.max=null;w.min=null; -w.crosshair=H(c.crosshair,D(a.options.tooltip.crosshairs)[g?0:1],!1);d=w.options.events;-1===b(w,a.axes)&&(g?a.axes.splice(a.xAxis.length,0,w):a.axes.push(w),a[w.coll].push(w));w.series=w.series||[];a.inverted&&!w.isZAxis&&g&&void 0===w.reversed&&(w.reversed=!0);A(d,function(a,g){C(w,g,a)});w.lin2log=c.linearToLogConverter||w.lin2log;w.isLog&&(w.val2lin=w.log2lin,w.lin2val=w.lin2log);k(this,"afterInit")},setOptions:function(a){this.options=t(this.defaultOptions,"yAxis"===this.coll&&this.defaultYAxisOptions, -[this.defaultTopAxisOptions,this.defaultRightAxisOptions,this.defaultBottomAxisOptions,this.defaultLeftAxisOptions][this.side],t(u[this.coll],a));k(this,"afterSetOptions",{userOptions:a})},defaultLabelFormatter:function(){var g=this.axis,b=this.value,d=g.chart.time,c=g.categories,m=this.dateTimeLabelFormat,l=u.lang,f=l.numericSymbols,l=l.numericSymbolMagnitude||1E3,p=f&&f.length,k,v=g.options.labels.format,g=g.isLog?Math.abs(b):g.tickInterval;if(v)k=r(v,this,d);else if(c)k=b;else if(m)k=d.dateFormat(m, -b);else if(p&&1E3<=g)for(;p--&&void 0===k;)d=Math.pow(l,p+1),g>=d&&0===10*b%d&&null!==f[p]&&0!==b&&(k=a.numberFormat(b/d,-1)+f[p]);void 0===k&&(k=1E4<=Math.abs(b)?a.numberFormat(b,-1):a.numberFormat(b,-1,void 0,""));return k},getSeriesExtremes:function(){var a=this,b=a.chart;k(this,"getSeriesExtremes",null,function(){a.hasVisibleSeries=!1;a.dataMin=a.dataMax=a.threshold=null;a.softThreshold=!a.isXAxis;a.buildStacks&&a.buildStacks();f(a.series,function(g){if(g.visible||!b.options.chart.ignoreHiddenSeries){var w= -g.options,c=w.threshold,m;a.hasVisibleSeries=!0;a.positiveValuesOnly&&0>=c&&(c=null);if(a.isXAxis)w=g.xData,w.length&&(g=n(w),m=F(w),p(g)||g instanceof Date||(w=d(w,p),g=n(w),m=F(w)),w.length&&(a.dataMin=Math.min(H(a.dataMin,w[0],g),g),a.dataMax=Math.max(H(a.dataMax,w[0],m),m)));else if(g.getExtremes(),m=g.dataMax,g=g.dataMin,y(g)&&y(m)&&(a.dataMin=Math.min(H(a.dataMin,g),g),a.dataMax=Math.max(H(a.dataMax,m),m)),y(c)&&(a.threshold=c),!w.softThreshold||a.positiveValuesOnly)a.softThreshold=!1}})}); -k(this,"afterGetSeriesExtremes")},translate:function(a,b,d,c,m,l){var g=this.linkedParent||this,w=1,f=0,J=c?g.oldTransA:g.transA;c=c?g.oldMin:g.min;var k=g.minPixelPadding;m=(g.isOrdinal||g.isBroken||g.isLog&&m)&&g.lin2val;J||(J=g.transA);d&&(w*=-1,f=g.len);g.reversed&&(w*=-1,f-=w*(g.sector||g.len));b?(a=(a*w+f-k)/J+c,m&&(a=g.lin2val(a))):(m&&(a=g.val2lin(a)),a=p(c)?w*(a-c)*J+f+w*k+(p(l)?J*l:0):void 0);return a},toPixels:function(a,b){return this.translate(a,!1,!this.horiz,null,!0)+(b?0:this.pos)}, -toValue:function(a,b){return this.translate(a-(b?0:this.pos),!0,!this.horiz,null,!0)},getPlotLinePath:function(a,b,d,c,m){var g=this.chart,w=this.left,l=this.top,f,J,k=d&&g.oldChartHeight||g.chartHeight,v=d&&g.oldChartWidth||g.chartWidth,e;f=this.transB;var B=function(a,g,b){if(ab)c?a=Math.min(Math.max(g,a),b):e=!0;return a};m=H(m,this.translate(a,null,null,d));m=Math.min(Math.max(-1E5,m),1E5);a=d=Math.round(m+f);f=J=Math.round(k-m-f);p(m)?this.horiz?(f=l,J=k-this.bottom,a=d=B(a,w,w+this.width)): -(a=w,d=v-this.right,f=J=B(f,l,l+this.height)):(e=!0,c=!1);return e&&!c?null:g.renderer.crispLine(["M",a,f,"L",d,J],b||1)},getLinearTickPositions:function(a,b,d){var g,w=e(Math.floor(b/a)*a);d=e(Math.ceil(d/a)*a);var c=[],m;e(w+a)===w&&(m=20);if(this.single)return[b];for(b=w;b<=d;){c.push(b);b=e(b+a,m);if(b===g)break;g=b}return c},getMinorTickInterval:function(){var a=this.options;return!0===a.minorTicks?H(a.minorTickInterval,"auto"):!1===a.minorTicks?null:a.minorTickInterval},getMinorTickPositions:function(){var a= -this,b=a.options,d=a.tickPositions,c=a.minorTickInterval,m=[],l=a.pointRangePadding||0,p=a.min-l,l=a.max+l,k=l-p;if(k&&k/c=this.minRange,B=this.minRange,c=(B-d+b)/2,c=[b-c,H(a.min,b-c)],m&&(c[2]=this.isLog?this.log2lin(this.dataMin):this.dataMin),b=F(c),d=[b+B, -H(a.max,b+B)],m&&(d[2]=this.isLog?this.log2lin(this.dataMax):this.dataMax),d=n(d),d-b=I?(q=I,D=0):g.dataMax<=I&&(u=I,r=0)),g.min=H(M,q,g.dataMin),g.max=H(n,u,g.dataMax));m&&(g.positiveValuesOnly&&!b&&0>=Math.min(g.min,H(g.dataMin,g.min))&&a.error(10,1),g.min= -e(g.log2lin(g.min),15),g.max=e(g.log2lin(g.max),15));g.range&&y(g.max)&&(g.userMin=g.min=M=Math.max(g.dataMin,g.minFromRange()),g.userMax=n=g.max,g.range=null);k(g,"foundExtremes");g.beforePadding&&g.beforePadding();g.adjustForMinRange();!(G||g.axisPointRange||g.usePercentage||t)&&y(g.min)&&y(g.max)&&(d=g.max-g.min)&&(!y(M)&&D&&(g.min-=d*D),!y(n)&&r&&(g.max+=d*r));p(c.softMin)&&!p(g.userMin)&&(g.min=Math.min(g.min,c.softMin));p(c.softMax)&&!p(g.userMax)&&(g.max=Math.max(g.max,c.softMax));p(c.floor)&& -(g.min=Math.max(g.min,c.floor));p(c.ceiling)&&(g.max=Math.min(g.max,c.ceiling));x&&y(g.dataMin)&&(I=I||0,!y(M)&&g.min=I?g.min=I:!y(n)&&g.max>I&&g.dataMax<=I&&(g.max=I));g.tickInterval=g.min===g.max||void 0===g.min||void 0===g.max?1:t&&!h&&A===g.linkedParent.options.tickPixelInterval?h=g.linkedParent.tickInterval:H(h,this.tickAmount?(g.max-g.min)/Math.max(this.tickAmount-1,1):void 0,G?1:(g.max-g.min)*A/Math.max(g.len,A));B&&!b&&f(g.series,function(a){a.processData(g.min!==g.oldMin||g.max!== -g.oldMax)});g.setAxisTranslation(!0);g.beforeSetTickPositions&&g.beforeSetTickPositions();g.postProcessTickInterval&&(g.tickInterval=g.postProcessTickInterval(g.tickInterval));g.pointRange&&!h&&(g.tickInterval=Math.max(g.pointRange,g.tickInterval));b=H(c.minTickInterval,g.isDatetimeAxis&&g.closestPointRange);!h&&g.tickIntervalg.tickInterval&&1E3g.max)),!!this.tickAmount)); -this.tickAmount||(g.tickInterval=g.unsquish());this.setTickPositions()},setTickPositions:function(){var a=this.options,b,d=a.tickPositions;b=this.getMinorTickInterval();var c=a.tickPositioner,m=a.startOnTick,l=a.endOnTick;this.tickmarkOffset=this.categories&&"between"===a.tickmarkPlacement&&1===this.tickInterval?.5:0;this.minorTickInterval="auto"===b&&this.tickInterval?this.tickInterval/5:b;this.single=this.min===this.max&&y(this.min)&&!this.tickAmount&&(parseInt(this.min,10)===this.min||!1!==a.allowDecimals); -this.tickPositions=b=d&&d.slice();!b&&(b=this.isDatetimeAxis?this.getTimeTicks(this.normalizeTimeTickInterval(this.tickInterval,a.units),this.min,this.max,a.startOfWeek,this.ordinalPositions,this.closestPointRange,!0):this.isLog?this.getLogTickPositions(this.tickInterval,this.min,this.max):this.getLinearTickPositions(this.tickInterval,this.min,this.max),b.length>this.len&&(b=[b[0],b.pop()],b[0]===b[1]&&(b.length=1)),this.tickPositions=b,c&&(c=c.apply(this,[this.min,this.max])))&&(this.tickPositions= -b=c);this.paddedTicks=b.slice(0);this.trimTicks(b,m,l);this.isLinked||(this.single&&2>b.length&&(this.min-=.5,this.max+=.5),d||c||this.adjustTickAmount());k(this,"afterSetTickPositions")},trimTicks:function(a,b,d){var g=a[0],c=a[a.length-1],m=this.minPointOffset||0;if(!this.isLinked){if(b&&-Infinity!==g)this.min=g;else for(;this.min-m>a[0];)a.shift();if(d)this.max=c;else for(;this.max+mb&&(this.finalTickAmt=b,b=5);this.tickAmount=b},adjustTickAmount:function(){var a=this.tickInterval,b=this.tickPositions,d=this.tickAmount,c=this.finalTickAmt,m=b&&b.length,l=H(this.threshold,this.softThreshold?0:null);if(this.hasData()){if(md&&(this.tickInterval*=2,this.setTickPositions());if(y(c)){for(a=d=b.length;a--;)(3===c&& -1===a%2||2>=c&&0c&&(a=c)),y(d)&&(bc&&(b=c))),this.displayBtn=void 0!==a||void 0!==b,this.setExtremes(a,b,!1,void 0,{trigger:"zoom"});return!0},setAxisSize:function(){var b=this.chart,d=this.options,c=d.offsets||[0,0,0,0],m=this.horiz,l=this.width=Math.round(a.relativeLength(H(d.width,b.plotWidth-c[3]+c[1]),b.plotWidth)),f=this.height=Math.round(a.relativeLength(H(d.height,b.plotHeight- -c[0]+c[2]),b.plotHeight)),p=this.top=Math.round(a.relativeLength(H(d.top,b.plotTop+c[0]),b.plotHeight,b.plotTop)),d=this.left=Math.round(a.relativeLength(H(d.left,b.plotLeft+c[3]),b.plotWidth,b.plotLeft));this.bottom=b.chartHeight-f-p;this.right=b.chartWidth-l-d;this.len=Math.max(m?l:f,0);this.pos=m?d:p},getExtremes:function(){var a=this.isLog;return{min:a?e(this.lin2log(this.min)):this.min,max:a?e(this.lin2log(this.max)):this.max,dataMin:this.dataMin,dataMax:this.dataMax,userMin:this.userMin,userMax:this.userMax}}, -getThreshold:function(a){var b=this.isLog,g=b?this.lin2log(this.min):this.min,b=b?this.lin2log(this.max):this.max;null===a||-Infinity===a?a=g:Infinity===a?a=b:g>a?a=g:ba?"right":195a?"left":"center"},tickSize:function(a){var b=this.options,g=b[a+"Length"],d=H(b[a+"Width"],"tick"===a&&this.isXAxis?1:0);if(d&&g)return"inside"===b[a+"Position"]&&(g=-g),[g,d]},labelMetrics:function(){var a= -this.tickPositions&&this.tickPositions[0]||0;return this.chart.renderer.fontMetrics(this.options.labels.style&&this.options.labels.style.fontSize,this.ticks[a]&&this.ticks[a].label)},unsquish:function(){var a=this.options.labels,b=this.horiz,d=this.tickInterval,c=d,m=this.len/(((this.categories?1:0)+this.max-this.min)/d),l,p=a.rotation,k=this.labelMetrics(),v,B=Number.MAX_VALUE,t,r=function(a){a/=m||1;a=1=a)v=r(Math.abs(k.h/Math.sin(q*a))),b=v+Math.abs(a/360),b(d.step||0)&&!d.rotation&&(this.staggerLines||1)*this.len/c||!b&&(d.style&&parseInt(d.style.width,10)||m&&m-a.spacing[3]|| -.33*a.chartWidth)},renderUnsquish:function(){var a=this.chart,b=a.renderer,d=this.tickPositions,c=this.ticks,m=this.options.labels,l=m&&m.style||{},p=this.horiz,k=this.getSlotWidth(),v=Math.max(1,Math.round(k-2*(m.padding||5))),B={},e=this.labelMetrics(),t=m.style&&m.style.textOverflow,r,D,h=0,A;I(m.rotation)||(B.rotation=m.rotation||0);f(d,function(a){(a=c[a])&&a.label&&a.label.textPxLength>h&&(h=a.label.textPxLength)});this.maxLabelLength=h;if(this.autoRotation)h>v&&h>e.h?B.rotation=this.labelRotation: -this.labelRotation=0;else if(k&&(r=v,!t))for(D="clip",v=d.length;!p&&v--;)if(A=d[v],A=c[A].label)A.styles&&"ellipsis"===A.styles.textOverflow?A.css({textOverflow:"clip"}):A.textPxLength>k&&A.css({width:k+"px"}),A.getBBox().height>this.len/d.length-(e.h-e.f)&&(A.specificTextOverflow="ellipsis");B.rotation&&(r=h>.5*a.chartHeight?.33*a.chartHeight:a.chartHeight,t||(D="ellipsis"));if(this.labelAlign=m.align||this.autoLabelAlign(this.labelRotation))B.align=this.labelAlign;f(d,function(a){var b=(a=c[a])&& -a.label,g=l.width,d={};b&&(b.attr(B),r&&!g&&"nowrap"!==l.whiteSpace&&(r=this.min&&a<=this.max)g[a]||(g[a]=new M(this,a)),c&&g[a].isNew&&g[a].render(b,!0,.1),g[a].render(b)},render:function(){var b=this,d=b.chart,c=b.options,m=b.isLog,l=b.isLinked,v=b.tickPositions,e=b.axisTitle,t=b.ticks,r=b.minorTicks,D=b.alternateBands,h=c.stackLabels,G=c.alternateGridColor,I=b.tickmarkOffset,x=b.axisLine,q=b.showAxis,H=E(d.renderer.globalAnimation),u,n;b.labelEdge.length=0;b.overlap=!1;f([t,r,D],function(a){A(a,function(a){a.isActive= -!1})});if(b.hasData()||l)b.minorTickInterval&&!b.categories&&f(b.getMinorTickPositions(),function(a){b.renderMinorTick(a)}),v.length&&(f(v,function(a,d){b.renderTick(a,d)}),I&&(0===b.min||b.single)&&(t[-1]||(t[-1]=new M(b,-1,null,!0)),t[-1].render(-1))),G&&f(v,function(c,g){n=void 0!==v[g+1]?v[g+1]+I:b.max-I;0===g%2&&cu&&(!q||d<=y)&&void 0!==d&&c.push(d),d>y&&(b=!0),d=l;else u=this.lin2log(u),y=this.lin2log(y),a=q?this.getMinorTickInterval():e.tickInterval,a=h("auto"===a?null:a,this._minorAutoInterval,e.tickPixelInterval/(q?5:1)*(y-u)/((q?f/this.tickPositions.length:f)||1)),a=n(a,null,E(a)),c=F(this.getLinearTickPositions(a,u,y),this.log2lin),q||(this._minorAutoInterval=a/5);q||(this.tickInterval=a);return c};C.prototype.log2lin=function(a){return Math.log(a)/ -Math.LN10};C.prototype.lin2log=function(a){return Math.pow(10,a)}})(K);(function(a,C){var E=a.arrayMax,F=a.arrayMin,n=a.defined,h=a.destroyObjectProperties,e=a.each,u=a.erase,y=a.merge,q=a.pick;a.PlotLineOrBand=function(a,f){this.axis=a;f&&(this.options=f,this.id=f.id)};a.PlotLineOrBand.prototype={render:function(){var e=this,f=e.axis,c=f.horiz,k=e.options,r=k.label,l=e.label,d=k.to,b=k.from,v=k.value,p=n(b)&&n(d),h=n(v),t=e.svgElem,u=!t,A=[],H=k.color,m=q(k.zIndex,0),D=k.events,A={"class":"highcharts-plot-"+ -(p?"band ":"line ")+(k.className||"")},B={},M=f.chart.renderer,G=p?"bands":"lines";f.isLog&&(b=f.log2lin(b),d=f.log2lin(d),v=f.log2lin(v));h?(A.stroke=H,A["stroke-width"]=k.width,k.dashStyle&&(A.dashstyle=k.dashStyle)):p&&(H&&(A.fill=H),k.borderWidth&&(A.stroke=k.borderColor,A["stroke-width"]=k.borderWidth));B.zIndex=m;G+="-"+m;(H=f.plotLinesAndBandsGroups[G])||(f.plotLinesAndBandsGroups[G]=H=M.g("plot-"+G).attr(B).add());u&&(e.svgElem=t=M.path().attr(A).add(H));if(h)A=f.getPlotLinePath(v,t.strokeWidth()); -else if(p)A=f.getPlotBandPath(b,d,k);else return;u&&A&&A.length?(t.attr({d:A}),D&&a.objectEach(D,function(a,b){t.on(b,function(a){D[b].apply(e,[a])})})):t&&(A?(t.show(),t.animate({d:A})):(t.hide(),l&&(e.label=l=l.destroy())));r&&n(r.text)&&A&&A.length&&0this.max&&f>this.max;if(k&&c)for(a&&(b=k.toString()===c.toString(),d=0),a=0;aB-v?B:B-v);else if(e)b[a]=Math.max(l,m+v+g>c?m:m+v);else return!1},q=function(a,c,g,m){var l;mc-d?l=!1:b[a]=mc-g/2?c-g-2:m-g/2;return l},G=function(a){var b=r;r=m;m=b;p=a},g=function(){!1!==B.apply(0,r)?!1!==q.apply(0,m)||p||(G(!0),g()):p?b.x=b.y=0:(G(!0),g())};(c.inverted||1D&&(v=!1);a=(c.series&&c.series.yAxis&&c.series.yAxis.pos)+(c.plotY||0);a-=d.plotTop;l.push({target:c.isHeader?d.plotHeight+k:a,rank:c.isHeader?1:0,size:h.tt.getBBox().height+1,point:c,x:D,tt:m})}});this.cleanSplit(); -a.distribute(l,d.plotHeight+k);E(l,function(a){var b=a.point,c=b.series;a.tt.attr({visibility:void 0===a.pos?"hidden":"inherit",x:v||b.isHeader?a.x:b.plotX+d.plotLeft+y(p.distance,16),y:a.pos+d.plotTop,anchorX:b.isHeader?b.plotX+d.plotLeft:b.plotX+c.xAxis.pos,anchorY:b.isHeader?a.pos+d.plotTop-15:b.plotY+c.yAxis.pos})})},updatePosition:function(a){var c=this.chart,f=this.getLabel(),l=(this.options.positioner||this.getPosition).call(this,f.width,f.height,a),d=a.plotX+c.plotLeft;a=a.plotY+c.plotTop; -var b;this.outside&&(b=(this.options.borderWidth||0)+2*this.distance,this.renderer.setSize(f.width+b,f.height+b,!1),d+=c.pointer.chartPosition.left-l.x,a+=c.pointer.chartPosition.top-l.y);this.move(Math.round(l.x),Math.round(l.y||0),d,a)},getDateFormat:function(a,e,h,l){var d=this.chart.time,b=d.dateFormat("%m-%d %H:%M:%S.%L",e),c,p,k={millisecond:15,second:12,minute:9,hour:6,day:3},t="millisecond";for(p in f){if(a===f.week&&+d.dateFormat("%w",e)===h&&"00:00:00.000"===b.substr(6)){p="week";break}if(f[p]> -a){p=t;break}if(k[p]&&b.substr(k[p])!=="01-01 00:00:00.000".substr(k[p]))break;"week"!==p&&(t=p)}p&&(c=l[p]);return c},getXDateFormat:function(a,f,e){f=f.dateTimeLabelFormats;var c=e&&e.closestPointRange;return(c?this.getDateFormat(c,a.x,e.options.startOfWeek,f):f.day)||f.year},tooltipFooterHeaderFormatter:function(a,f){f=f?"footer":"header";var c=a.series,l=c.tooltipOptions,d=l.xDateFormat,b=c.xAxis,e=b&&"datetime"===b.options.type&&h(a.key),p=l[f+"Format"];e&&!d&&(d=this.getXDateFormat(a,l,b)); -e&&d&&E(a.point&&a.point.tooltipDateKeys||["key"],function(a){p=p.replace("{point."+a+"}","{point."+a+":"+d+"}")});return n(p,{point:a,series:c},this.chart.time)},bodyFormatter:function(a){return e(a,function(a){var c=a.series.tooltipOptions;return(c[(a.point.formatPrefix||"point")+"Formatter"]||a.point.tooltipFormatter).call(a.point,c[(a.point.formatPrefix||"point")+"Format"])})}}})(K);(function(a){var C=a.addEvent,E=a.attr,F=a.charts,n=a.color,h=a.css,e=a.defined,u=a.each,y=a.extend,q=a.find,x= -a.fireEvent,f=a.isNumber,c=a.isObject,k=a.offset,r=a.pick,l=a.splat,d=a.Tooltip;a.Pointer=function(a,d){this.init(a,d)};a.Pointer.prototype={init:function(a,c){this.options=c;this.chart=a;this.runChartClick=c.chart.events&&!!c.chart.events.click;this.pinchDown=[];this.lastValidTouch={};d&&(a.tooltip=new d(a,c.tooltip),this.followTouchMove=r(c.tooltip.followTouchMove,!0));this.setDOMEvents()},zoomOption:function(a){var b=this.chart,d=b.options.chart,c=d.zoomType||"",b=b.inverted;/touch/.test(a.type)&& -(c=r(d.pinchType,c));this.zoomX=a=/x/.test(c);this.zoomY=c=/y/.test(c);this.zoomHor=a&&!b||c&&b;this.zoomVert=c&&!b||a&&b;this.hasZoom=a||c},normalize:function(a,c){var b;b=a.touches?a.touches.length?a.touches.item(0):a.changedTouches[0]:a;c||(this.chartPosition=c=k(this.chart.container));return y(a,{chartX:Math.round(b.pageX-c.left),chartY:Math.round(b.pageY-c.top)})},getCoordinates:function(a){var b={xAxis:[],yAxis:[]};u(this.chart.axes,function(c){b[c.isXAxis?"xAxis":"yAxis"].push({axis:c,value:c.toValue(a[c.horiz? -"chartX":"chartY"])})});return b},findNearestKDPoint:function(a,d,f){var b;u(a,function(a){var l=!(a.noSharedTooltip&&d)&&0>a.options.findNearestPointBy.indexOf("y");a=a.searchPoint(f,l);if((l=c(a,!0))&&!(l=!c(b,!0)))var l=b.distX-a.distX,e=b.dist-a.dist,p=(a.series.group&&a.series.group.zIndex)-(b.series.group&&b.series.group.zIndex),l=0<(0!==l&&d?l:0!==e?e:0!==p?p:b.series.index>a.series.index?-1:1);l&&(b=a)});return b},getPointFromEvent:function(a){a=a.target;for(var b;a&&!b;)b=a.point,a=a.parentNode; -return b},getChartCoordinatesFromPoint:function(a,c){var b=a.series,d=b.xAxis,b=b.yAxis,f=r(a.clientX,a.plotX),l=a.shapeArgs;if(d&&b)return c?{chartX:d.len+d.pos-f,chartY:b.len+b.pos-a.plotY}:{chartX:f+d.pos,chartY:a.plotY+b.pos};if(l&&l.x&&l.y)return{chartX:l.x,chartY:l.y}},getHoverData:function(b,d,f,l,e,k,h){var p,m=[],v=h&&h.isBoosting;l=!(!l||!b);h=d&&!d.stickyTracking?[d]:a.grep(f,function(a){return a.visible&&!(!e&&a.directTouch)&&r(a.options.enableMouseTracking,!0)&&a.stickyTracking});d=(p= -l?b:this.findNearestKDPoint(h,e,k))&&p.series;p&&(e&&!d.noSharedTooltip?(h=a.grep(f,function(a){return a.visible&&!(!e&&a.directTouch)&&r(a.options.enableMouseTracking,!0)&&!a.noSharedTooltip}),u(h,function(a){var b=q(a.points,function(a){return a.x===p.x&&!a.isNull});c(b)&&(v&&(b=a.getPoint(b)),m.push(b))})):m.push(p));return{hoverPoint:p,hoverSeries:d,hoverPoints:m}},runPointActions:function(b,d){var c=this.chart,f=c.tooltip&&c.tooltip.options.enabled?c.tooltip:void 0,l=f?f.shared:!1,e=d||c.hoverPoint, -k=e&&e.series||c.hoverSeries,k=this.getHoverData(e,k,c.series,!!d||k&&k.directTouch&&this.isDirectTouch,l,b,{isBoosting:c.isBoosting}),h,e=k.hoverPoint;h=k.hoverPoints;d=(k=k.hoverSeries)&&k.tooltipOptions.followPointer;l=l&&k&&!k.noSharedTooltip;if(e&&(e!==c.hoverPoint||f&&f.isHidden)){u(c.hoverPoints||[],function(b){-1===a.inArray(b,h)&&b.setState()});u(h||[],function(a){a.setState("hover")});if(c.hoverSeries!==k)k.onMouseOver();c.hoverPoint&&c.hoverPoint.firePointEvent("mouseOut");if(!e.series)return; -e.firePointEvent("mouseOver");c.hoverPoints=h;c.hoverPoint=e;f&&f.refresh(l?h:e,b)}else d&&f&&!f.isHidden&&(e=f.getAnchor([{}],b),f.updatePosition({plotX:e[0],plotY:e[1]}));this.unDocMouseMove||(this.unDocMouseMove=C(c.container.ownerDocument,"mousemove",function(b){var c=F[a.hoverChartIndex];if(c)c.pointer.onDocumentMouseMove(b)}));u(c.axes,function(c){var d=r(c.crosshair.snap,!0),m=d?a.find(h,function(a){return a.series[c.coll]===c}):void 0;m||!d?c.drawCrosshair(b,m):c.hideCrosshair()})},reset:function(a, -c){var b=this.chart,d=b.hoverSeries,f=b.hoverPoint,e=b.hoverPoints,k=b.tooltip,h=k&&k.shared?e:f;a&&h&&u(l(h),function(b){b.series.isCartesian&&void 0===b.plotX&&(a=!1)});if(a)k&&h&&(k.refresh(h),f&&(f.setState(f.state,!0),u(b.axes,function(a){a.crosshair&&a.drawCrosshair(null,f)})));else{if(f)f.onMouseOut();e&&u(e,function(a){a.setState()});if(d)d.onMouseOut();k&&k.hide(c);this.unDocMouseMove&&(this.unDocMouseMove=this.unDocMouseMove());u(b.axes,function(a){a.hideCrosshair()});this.hoverX=b.hoverPoints= -b.hoverPoint=null}},scaleGroups:function(a,c){var b=this.chart,d;u(b.series,function(f){d=a||f.getPlotBox();f.xAxis&&f.xAxis.zoomEnabled&&f.group&&(f.group.attr(d),f.markerGroup&&(f.markerGroup.attr(d),f.markerGroup.clip(c?b.clipRect:null)),f.dataLabelsGroup&&f.dataLabelsGroup.attr(d))});b.clipRect.attr(c||b.clipBox)},dragStart:function(a){var b=this.chart;b.mouseIsDown=a.type;b.cancelClick=!1;b.mouseDownX=this.mouseDownX=a.chartX;b.mouseDownY=this.mouseDownY=a.chartY},drag:function(a){var b=this.chart, -c=b.options.chart,d=a.chartX,f=a.chartY,l=this.zoomHor,e=this.zoomVert,k=b.plotLeft,m=b.plotTop,h=b.plotWidth,B=b.plotHeight,r,G=this.selectionMarker,g=this.mouseDownX,w=this.mouseDownY,q=c.panKey&&a[c.panKey+"Key"];G&&G.touch||(dk+h&&(d=k+h),fm+B&&(f=m+B),this.hasDragged=Math.sqrt(Math.pow(g-d,2)+Math.pow(w-f,2)),10m.max&&(e=m.max-t,w=!0);w?(M-=.8*(M-k[d][0]),D||(g-=.8*(g-k[d][1])),h()):k[d]=[M,g];y||(c[d]=u-q,c[p]=t);c=y?1/A:A;f[p]= -t;f[d]=e;n[y?a?"scaleY":"scaleX":"scale"+b]=A;n["translate"+b]=c*q+(M-c*B)},pinch:function(a){var u=this,q=u.chart,x=u.pinchDown,f=a.touches,c=f.length,k=u.lastValidTouch,r=u.hasZoom,l=u.selectionMarker,d={},b=1===c&&(u.inClass(a.target,"highcharts-tracker")&&q.runTrackerClick||u.runChartClick),v={};1c-6&&e -q?this.maxItemWidth:a.itemWidth;f&&this.itemX-b+c>q&&(this.itemX=b,this.itemY+=k+this.lastLineHeight+l,this.lastLineHeight=0);this.lastItemY=k+this.itemY+l;this.lastLineHeight=Math.max(e,this.lastLineHeight);a._legendItemPos=[this.itemX,this.itemY];f?this.itemX+=c:(this.itemY+=k+e+l,this.lastLineHeight=e);this.offsetWidth=r||Math.max((f?this.itemX-b-(a.checkbox?0:h):c)+b,this.offsetWidth)},getAllItems:function(){var a=[];h(this.chart.series,function(c){var b=c&&c.options;c&&x(b.showInLegend,n(b.linkedTo)? -!1:void 0,!0)&&(a=a.concat(c.legendItems||("point"===b.legendType?c.data:c)))});e(this,"afterGetAllItems",{allItems:a});return a},getAlignment:function(){var a=this.options;return this.proximate?a.align.charAt(0)+"tv":a.floating?"":a.align.charAt(0)+a.verticalAlign.charAt(0)+a.layout.charAt(0)},adjustMargins:function(a,c){var b=this.chart,d=this.options,f=this.getAlignment();f&&h([/(lth|ct|rth)/,/(rtv|rm|rbv)/,/(rbh|cb|lbh)/,/(lbv|lm|ltv)/],function(e,l){e.test(f)&&!n(a[l])&&(b[y[l]]=Math.max(b[y[l]], -b.legend[(l+1)%2?"legendHeight":"legendWidth"]+[1,-1,-1,1][l]*d[l%2?"x":"y"]+x(d.margin,12)+c[l]+(0===l&&void 0!==b.options.title.margin?b.titleOffset+b.options.title.margin:0)))})},proximatePositions:function(){var c=this.chart,d=[],b="left"===this.options.align;h(this.allItems,function(f){var e,l;e=b;f.xAxis&&f.points&&(f.xAxis.options.reversed&&(e=!e),e=a.find(e?f.points:f.points.slice(0).reverse(),function(b){return a.isNumber(b.plotY)}),l=f.legendGroup.getBBox().height,d.push({target:f.visible? -e.plotY-.3*l:c.plotHeight,size:l,item:f}))},this);a.distribute(d,c.plotHeight);h(d,function(a){a.item._legendItemPos[1]=c.plotTop-c.spacing[0]+a.pos})},render:function(){var a=this.chart,d=a.renderer,b=this.group,f,e,k,r=this.box,n=this.options,A=this.padding;this.itemX=A;this.itemY=this.initialItemY;this.lastItemY=this.offsetWidth=0;b||(this.group=b=d.g("legend").attr({zIndex:7}).add(),this.contentGroup=d.g().attr({zIndex:1}).add(b),this.scrollGroup=d.g().add(this.contentGroup));this.renderTitle(); -f=this.getAllItems();c(f,function(a,b){return(a.options&&a.options.legendIndex||0)-(b.options&&b.options.legendIndex||0)});n.reversed&&f.reverse();this.allItems=f;this.display=e=!!f.length;this.itemHeight=this.totalItemWidth=this.maxItemWidth=this.lastLineHeight=0;h(f,this.renderItem,this);h(f,this.layoutItem,this);f=(n.width||this.offsetWidth)+A;k=this.lastItemY+this.lastLineHeight+this.titleHeight;k=this.handleOverflow(k);k+=A;r||(this.box=r=d.rect().addClass("highcharts-legend-box").attr({r:n.borderRadius}).add(b), -r.isNew=!0);r.attr({stroke:n.borderColor,"stroke-width":n.borderWidth||0,fill:n.backgroundColor||"none"}).shadow(n.shadow);0b&&!1!==q.enabled?(this.clipHeight=r=Math.max(b-20-this.titleHeight-k,0),this.currentPage=x(this.currentPage,1),this.fullHeight=a,h(g,function(a,b){var c=a._legendItemPos[1],d=Math.round(a.legendItem.getBBox().height),f=n.length;if(!f||c-n[f-1]>r&&(G||c)!==n[f-1])n.push(G||c),f++;a.pageIx=f-1;G&&(g[b-1].pageIx=f-1);b===g.length-1&&c+d-n[f-1]>r&&(n.push(c),a.pageIx=f);c!==G&&(G=c)}),A||(A=c.clipRect= -f.clipRect(0,k,9999,0),c.contentGroup.clip(A)),w(r),B||(this.nav=B=f.g().attr({zIndex:1}).add(this.group),this.up=f.symbol("triangle",0,0,D,D).on("click",function(){c.scroll(-1,m)}).add(B),this.pager=f.text("",15,10).addClass("highcharts-legend-navigation").css(q.style).add(B),this.down=f.symbol("triangle-down",0,0,D,D).on("click",function(){c.scroll(1,m)}).add(B)),c.scroll(0),a=b):B&&(w(),this.nav=B.destroy(),this.scrollGroup.attr({translateY:1}),this.clipHeight=0);return a},scroll:function(a,c){var b= -this.pages,d=b.length;a=this.currentPage+a;var e=this.clipHeight,l=this.options.navigation,k=this.pager,h=this.padding;a>d&&(a=d);0d&&(e=typeof f[0],"string"===e?c.name=f[0]:"number"===e&&(c.x=f[0]),b++);n=h.value;)h=c[++e];this.nonZonedColor||(this.nonZonedColor=this.color);this.color=h&&h.color&&!this.options.color?h.color:this.nonZonedColor;return h},destroy:function(){var a=this.series.chart,c=a.hoverPoints,e;a.pointCount--;c&&(this.setState(),n(c,this),c.length||(a.hoverPoints=null));if(this===a.hoverPoint)this.onMouseOut();if(this.graphic||this.dataLabel)x(this),this.destroyElements();this.legendItem&& -a.legend.destroyItem(this);for(e in this)this[e]=null},destroyElements:function(){for(var a=["graphic","dataLabel","dataLabelUpper","connector","shadowGroup"],c,e=6;e--;)c=a[e],this[c]&&(this[c]=this[c].destroy())},getLabelConfig:function(){return{x:this.category,y:this.y,color:this.color,colorIndex:this.colorIndex,key:this.name||this.category,series:this.series,point:this,percentage:this.percentage,total:this.total||this.stackTotal}},tooltipFormatter:function(a){var c=this.series,f=c.tooltipOptions, -h=q(f.valueDecimals,""),l=f.valuePrefix||"",d=f.valueSuffix||"";E(c.pointArrayMap||["y"],function(b){b="{point."+b;if(l||d)a=a.replace(RegExp(b+"}","g"),l+b+"}"+d);a=a.replace(RegExp(b+"}","g"),b+":,."+h+"f}")});return e(a,{point:this,series:this.series},c.chart.time)},firePointEvent:function(a,c,e){var f=this,l=this.series.options;(l.point.events[a]||f.options&&f.options.events&&f.options.events[a])&&this.importEvents();"click"===a&&l.allowPointSelect&&(e=function(a){f.select&&f.select(null,a.ctrlKey|| -a.metaKey||a.shiftKey)});h(this,a,c,e)},visible:!0}})(K);(function(a){var C=a.addEvent,E=a.animObject,F=a.arrayMax,n=a.arrayMin,h=a.correctFloat,e=a.defaultOptions,u=a.defaultPlotOptions,y=a.defined,q=a.each,x=a.erase,f=a.extend,c=a.fireEvent,k=a.grep,r=a.isArray,l=a.isNumber,d=a.isString,b=a.merge,v=a.objectEach,p=a.pick,I=a.removeEvent,t=a.splat,L=a.SVGElement,A=a.syncTimeout,H=a.win;a.Series=a.seriesType("line",null,{lineWidth:2,allowPointSelect:!1,showCheckbox:!1,animation:{duration:1E3},events:{}, -marker:{lineWidth:0,lineColor:"#ffffff",enabledThreshold:2,radius:4,states:{normal:{animation:!0},hover:{animation:{duration:50},enabled:!0,radiusPlus:2,lineWidthPlus:1},select:{fillColor:"#cccccc",lineColor:"#000000",lineWidth:2}}},point:{events:{}},dataLabels:{align:"center",formatter:function(){return null===this.y?"":a.numberFormat(this.y,-1)},style:{fontSize:"11px",fontWeight:"bold",color:"contrast",textOutline:"1px contrast"},verticalAlign:"bottom",x:0,y:0,padding:5},cropThreshold:300,pointRange:0, -softThreshold:!0,states:{normal:{animation:!0},hover:{animation:{duration:50},lineWidthPlus:1,marker:{},halo:{size:10,opacity:.25}},select:{marker:{}}},stickyTracking:!0,turboThreshold:1E3,findNearestPointBy:"x"},{isCartesian:!0,pointClass:a.Point,sorted:!0,requireSorting:!0,directTouch:!1,axisTypes:["xAxis","yAxis"],colorCounter:0,parallelArrays:["x","y"],coll:"series",init:function(a,b){var d=this,m,e=a.series,g;d.chart=a;d.options=b=d.setOptions(b);d.linkedSeries=[];d.bindAxes();f(d,{name:b.name, -state:"",visible:!1!==b.visible,selected:!0===b.selected});m=b.events;v(m,function(a,b){C(d,b,a)});if(m&&m.click||b.point&&b.point.events&&b.point.events.click||b.allowPointSelect)a.runTrackerClick=!0;d.getColor();d.getSymbol();q(d.parallelArrays,function(a){d[a+"Data"]=[]});d.setData(b.data,!1);d.isCartesian&&(a.hasCartesianSeries=!0);e.length&&(g=e[e.length-1]);d._i=p(g&&g._i,-1)+1;a.orderSeries(this.insert(e));c(this,"afterInit")},insert:function(a){var b=this.options.index,c;if(l(b)){for(c=a.length;c--;)if(b>= -p(a[c].options.index,a[c]._i)){a.splice(c+1,0,this);break}-1===c&&a.unshift(this);c+=1}else a.push(this);return p(c,a.length-1)},bindAxes:function(){var b=this,c=b.options,d=b.chart,f;q(b.axisTypes||[],function(m){q(d[m],function(a){f=a.options;if(c[m]===f.index||void 0!==c[m]&&c[m]===f.id||void 0===c[m]&&0===f.index)b.insert(a.series),b[m]=a,a.isDirty=!0});b[m]||b.optionalAxis===m||a.error(18,!0)})},updateParallelArrays:function(a,b){var c=a.series,d=arguments,f=l(b)?function(d){var g="y"===d&&c.toYData? -c.toYData(a):a[d];c[d+"Data"][b]=g}:function(a){Array.prototype[b].apply(c[a+"Data"],Array.prototype.slice.call(d,2))};q(c.parallelArrays,f)},autoIncrement:function(){var a=this.options,b=this.xIncrement,c,d=a.pointIntervalUnit,f=this.chart.time,b=p(b,a.pointStart,0);this.pointInterval=c=p(this.pointInterval,a.pointInterval,1);d&&(a=new f.Date(b),"day"===d?f.set("Date",a,f.get("Date",a)+c):"month"===d?f.set("Month",a,f.get("Month",a)+c):"year"===d&&f.set("FullYear",a,f.get("FullYear",a)+c),c=a.getTime()- -b);this.xIncrement=b+c;return b},setOptions:function(a){var d=this.chart,f=d.options,m=f.plotOptions,h=(d.userOptions||{}).plotOptions||{},g=m[this.type];this.userOptions=a;d=b(g,m.series,a);this.tooltipOptions=b(e.tooltip,e.plotOptions.series&&e.plotOptions.series.tooltip,e.plotOptions[this.type].tooltip,f.tooltip.userOptions,m.series&&m.series.tooltip,m[this.type].tooltip,a.tooltip);this.stickyTracking=p(a.stickyTracking,h[this.type]&&h[this.type].stickyTracking,h.series&&h.series.stickyTracking, -this.tooltipOptions.shared&&!this.noSharedTooltip?!0:d.stickyTracking);null===g.marker&&delete d.marker;this.zoneAxis=d.zoneAxis;a=this.zones=(d.zones||[]).slice();!d.negativeColor&&!d.negativeFillColor||d.zones||a.push({value:d[this.zoneAxis+"Threshold"]||d.threshold||0,className:"highcharts-negative",color:d.negativeColor,fillColor:d.negativeFillColor});a.length&&y(a[a.length-1].value)&&a.push({color:this.color,fillColor:this.fillColor});c(this,"afterSetOptions",{options:d});return d},getName:function(){return this.name|| -"Series "+(this.index+1)},getCyclic:function(a,b,c){var d,f=this.chart,g=this.userOptions,m=a+"Index",e=a+"Counter",h=c?c.length:p(f.options.chart[a+"Count"],f[a+"Count"]);b||(d=p(g[m],g["_"+m]),y(d)||(f.series.length||(f[e]=0),g["_"+m]=d=f[e]%h,f[e]+=1),c&&(b=c[d]));void 0!==d&&(this[m]=d);this[a]=b},getColor:function(){this.options.colorByPoint?this.options.color=null:this.getCyclic("color",this.options.color||u[this.type].color,this.chart.options.colors)},getSymbol:function(){this.getCyclic("symbol", -this.options.marker.symbol,this.chart.options.symbols)},drawLegendSymbol:a.LegendSymbolMixin.drawLineMarker,updateData:function(b){var c=this.options,d=this.points,f=[],m,g,e,h=this.requireSorting;q(b,function(b){var g;g=a.defined(b)&&this.pointClass.prototype.optionsToObject.call({series:this},b).x;l(g)&&(g=a.inArray(g,this.xData,e),-1===g?f.push(b):b!==c.data[g]?(d[g].update(b,!1,null,!1),d[g].touched=!0,h&&(e=g)):d[g]&&(d[g].touched=!0),m=!0)},this);if(m)for(b=d.length;b--;)g=d[b],g.touched||g.remove(!1), -g.touched=!1;else if(b.length===d.length)q(b,function(a,b){d[b].update&&a!==c.data[b]&&d[b].update(a,!1,null,!1)});else return!1;q(f,function(a){this.addPoint(a,!1)},this);return!0},setData:function(b,c,f,e){var m=this,g=m.points,h=g&&g.length||0,k,B=m.options,D=m.chart,t=null,A=m.xAxis,n=B.turboThreshold,v=this.xData,u=this.yData,y=(k=m.pointArrayMap)&&k.length,H;b=b||[];k=b.length;c=p(c,!0);!1!==e&&k&&h&&!m.cropped&&!m.hasGroupedData&&m.visible&&(H=this.updateData(b));if(!H){m.xIncrement=null;m.colorCounter= -0;q(this.parallelArrays,function(a){m[a+"Data"].length=0});if(n&&k>n){for(f=0;null===t&&fl||this.forceCrop))if(c[f-1]q)c=[],d=[];else if(c[0]q)m=this.cropData(this.xData,this.yData,n,q),c=m.xData,d=m.yData,m=m.start,g=!0;for(l=c.length||1;--l;)f=t?k(c[l])-k(c[l-1]):c[l]-c[l-1],0f&&A&&(a.error(15),A=!1);this.cropped=g;this.cropStart=m;this.processedXData=c;this.processedYData=d;this.closestPointRange=e},cropData:function(a,b,c,d,f){var g=a.length,m=0,e=g,h;f= -p(f,this.cropShoulder,1);for(h=0;h=c){m=Math.max(0,h-f);break}for(c=h;cd){e=c+f;break}return{xData:a.slice(m,e),yData:b.slice(m,e),start:m,end:e}},generatePoints:function(){var a=this.options,b=a.data,c=this.data,d,f=this.processedXData,g=this.processedYData,e=this.pointClass,h=f.length,l=this.cropStart||0,k,p=this.hasGroupedData,a=a.keys,r,n=[],A;c||p||(c=[],c.length=b.length,c=this.data=c);a&&p&&(this.options.keys=!1);for(A=0;A=m&&(c[A-p]||k)<=e,h&&k)if(h=t.length)for(;h--;)"number"===typeof t[h]&&(f[g++]=t[h]);else f[g++]=t;this.dataMin=n(f);this.dataMax=F(f)},translate:function(){this.processedXData||this.processData();this.generatePoints();var a=this.options,b=a.stacking,d=this.xAxis,f=d.categories,e=this.yAxis,g=this.points,k=g.length,r=!!this.modifyValue,t=a.pointPlacement, -A="between"===t||l(t),n=a.threshold,q=a.startFromThreshold?n:0,v,u,H,x,I=Number.MAX_VALUE;"between"===t&&(t=.5);l(t)&&(t*=p(a.pointRange||d.pointRange));for(a=0;a=E&&(L.isNull=!0);L.plotX=v=h(Math.min(Math.max(-1E5,d.translate(C,0,0,0,1,t,"flags"===this.type)),1E5));b&&this.visible&&!L.isNull&&F&&F[C]&&(x=this.getStackIndicator(x,C,this.index),K=F[C],E=K.points[x.key], -u=E[0],E=E[1],u===q&&x.key===F[C].base&&(u=p(l(n)&&n,e.min)),e.positiveValuesOnly&&0>=u&&(u=null),L.total=L.stackTotal=K.total,L.percentage=K.total&&L.y/K.total*100,L.stackY=E,K.setOffset(this.pointXOffset||0,this.barW||0));L.yBottom=y(u)?Math.min(Math.max(-1E5,e.translate(u,0,1,0,1)),1E5):null;r&&(E=this.modifyValue(E,L));L.plotY=u="number"===typeof E&&Infinity!==E?Math.min(Math.max(-1E5,e.translate(E,0,1,0,1)),1E5):void 0;L.isInside=void 0!==u&&0<=u&&u<=e.len&&0<=v&&v<=d.len;L.clientX=A?h(d.translate(C, -0,0,0,1,t)):v;L.negative=L.y<(n||0);L.category=f&&void 0!==f[L.x]?f[L.x]:L.x;L.isNull||(void 0!==H&&(I=Math.min(I,Math.abs(v-H))),H=v);L.zone=this.zones.length&&L.getZone()}this.closestPointRangePx=I;c(this,"afterTranslate")},getValidPoints:function(a,b){var c=this.chart;return k(a||this.points||[],function(a){return b&&!c.isInsidePlot(a.plotX,a.plotY,c.inverted)?!1:!a.isNull})},setClip:function(a){var b=this.chart,c=this.options,d=b.renderer,f=b.inverted,g=this.clipBox,e=g||b.clipBox,m=this.sharedClipKey|| -["_sharedClip",a&&a.duration,a&&a.easing,e.height,c.xAxis,c.yAxis].join(),h=b[m],l=b[m+"m"];h||(a&&(e.width=0,f&&(e.x=b.plotSizeX),b[m+"m"]=l=d.clipRect(f?b.plotSizeX+99:-99,f?-b.plotLeft:-b.plotTop,99,f?b.chartWidth:b.chartHeight)),b[m]=h=d.clipRect(e),h.count={length:0});a&&!h.count[this.index]&&(h.count[this.index]=!0,h.count.length+=1);!1!==c.clip&&(this.group.clip(a||g?h:b.clipRect),this.markerGroup.clip(l),this.sharedClipKey=m);a||(h.count[this.index]&&(delete h.count[this.index],--h.count.length), -0===h.count.length&&m&&b[m]&&(g||(b[m]=b[m].destroy()),b[m+"m"]&&(b[m+"m"]=b[m+"m"].destroy())))},animate:function(a){var b=this.chart,c=E(this.options.animation),d;a?this.setClip(c):(d=this.sharedClipKey,(a=b[d])&&a.animate({width:b.plotSizeX,x:0},c),b[d+"m"]&&b[d+"m"].animate({width:b.plotSizeX+99,x:0},c),this.animate=null)},afterAnimate:function(){this.setClip();c(this,"afterAnimate");this.finishedAnimating=!0},drawPoints:function(){var a=this.points,b=this.chart,c,d,f,g,e=this.options.marker, -h,l,k,r=this[this.specialGroup]||this.markerGroup,t,A=p(e.enabled,this.xAxis.isRadial?!0:null,this.closestPointRangePx>=e.enabledThreshold*e.radius);if(!1!==e.enabled||this._hasPointMarkers)for(c=0;cf&&b.shadow));e&&(e.startX=c.xMap,e.isArea=c.isArea)})},getZonesGraphs:function(a){q(this.zones,function(b,c){a.push(["zone-graph-"+c,"highcharts-graph highcharts-zone-graph-"+c+" "+(b.className||""),b.color||this.color,b.dashStyle||this.options.dashStyle])},this);return a},applyZones:function(){var a=this, -b=this.chart,c=b.renderer,d=this.zones,f,g,e=this.clips||[],h,l=this.graph,k=this.area,r=Math.max(b.chartWidth,b.chartHeight),t=this[(this.zoneAxis||"y")+"Axis"],A,n,v=b.inverted,u,H,y,x,I=!1;d.length&&(l||k)&&t&&void 0!==t.min&&(n=t.reversed,u=t.horiz,l&&!this.showLine&&l.hide(),k&&k.hide(),A=t.getExtremes(),q(d,function(d,m){f=n?u?b.plotWidth:0:u?0:t.toPixels(A.min);f=Math.min(Math.max(p(g,f),0),r);g=Math.min(Math.max(Math.round(t.toPixels(p(d.value,A.max),!0)),0),r);I&&(f=g=t.toPixels(A.max)); -H=Math.abs(f-g);y=Math.min(f,g);x=Math.max(f,g);t.isXAxis?(h={x:v?x:y,y:0,width:H,height:r},u||(h.x=b.plotHeight-h.x)):(h={x:0,y:v?x:y,width:r,height:H},u&&(h.y=b.plotWidth-h.y));v&&c.isVML&&(h=t.isXAxis?{x:0,y:n?y:x,height:h.width,width:b.chartWidth}:{x:h.y-b.plotLeft-b.spacingBox.x,y:0,width:h.height,height:b.chartHeight});e[m]?e[m].animate(h):(e[m]=c.clipRect(h),l&&a["zone-graph-"+m].clip(e[m]),k&&a["zone-area-"+m].clip(e[m]));I=d.value>A.max;a.resetZones&&0===g&&(g=void 0)}),this.clips=e)},invertGroups:function(a){function b(){q(["group", -"markerGroup"],function(b){c[b]&&(d.renderer.isVML&&c[b].attr({width:c.yAxis.len,height:c.xAxis.len}),c[b].width=c.yAxis.len,c[b].height=c.xAxis.len,c[b].invert(a))})}var c=this,d=c.chart,f;c.xAxis&&(f=C(d,"resize",b),C(c,"destroy",f),b(a),c.invertGroups=b)},plotGroup:function(a,b,c,d,f){var g=this[a],e=!g;e&&(this[a]=g=this.chart.renderer.g().attr({zIndex:d||.1}).add(f));g.addClass("highcharts-"+b+" highcharts-series-"+this.index+" highcharts-"+this.type+"-series "+(y(this.colorIndex)?"highcharts-color-"+ -this.colorIndex+" ":"")+(this.options.className||"")+(g.hasClass("highcharts-tracker")?" highcharts-tracker":""),!0);g.attr({visibility:c})[e?"attr":"animate"](this.getPlotBox());return g},getPlotBox:function(){var a=this.chart,b=this.xAxis,c=this.yAxis;a.inverted&&(b=c,c=this.xAxis);return{translateX:b?b.left:a.plotLeft,translateY:c?c.top:a.plotTop,scaleX:1,scaleY:1}},render:function(){var a=this,b=a.chart,d,f=a.options,e=!!a.animate&&b.renderer.isSVG&&E(f.animation).duration,g=a.visible?"inherit": -"hidden",h=f.zIndex,l=a.hasRendered,k=b.seriesGroup,r=b.inverted;d=a.plotGroup("group","series",g,h,k);a.markerGroup=a.plotGroup("markerGroup","markers",g,h,k);e&&a.animate(!0);d.inverted=a.isCartesian?r:!1;a.drawGraph&&(a.drawGraph(),a.applyZones());a.drawDataLabels&&a.drawDataLabels();a.visible&&a.drawPoints();a.drawTracker&&!1!==a.options.enableMouseTracking&&a.drawTracker();a.invertGroups(r);!1===f.clip||a.sharedClipKey||l||d.clip(b.clipRect);e&&a.animate();l||(a.animationTimeout=A(function(){a.afterAnimate()}, -e));a.isDirty=!1;a.hasRendered=!0;c(a,"afterRender")},redraw:function(){var a=this.chart,b=this.isDirty||this.isDirtyData,c=this.group,d=this.xAxis,f=this.yAxis;c&&(a.inverted&&c.attr({width:a.plotWidth,height:a.plotHeight}),c.animate({translateX:p(d&&d.left,a.plotLeft),translateY:p(f&&f.top,a.plotTop)}));this.translate();this.render();b&&delete this.kdTree},kdAxisArray:["clientX","plotY"],searchPoint:function(a,b){var c=this.xAxis,d=this.yAxis,f=this.chart.inverted;return this.searchKDTree({clientX:f? -c.len-a.chartY+c.pos:a.chartX-c.pos,plotY:f?d.len-a.chartX+d.pos:a.chartY-d.pos},b)},buildKDTree:function(){function a(c,d,f){var g,e;if(e=c&&c.length)return g=b.kdAxisArray[d%f],c.sort(function(a,b){return a[g]-b[g]}),e=Math.floor(e/2),{point:c[e],left:a(c.slice(0,e),d+1,f),right:a(c.slice(e+1),d+1,f)}}this.buildingKdTree=!0;var b=this,c=-1k?"left":"right";p=0>k?"right":"left";b[r]&&(r=c(a,b[r],h+1,m),t=r[e]n;)r--;this.updateParallelArrays(k,"splice",r,0,0);this.updateParallelArrays(k,r);g&&k.name&&(g[n]=k.name);l.splice(r,0,a);t&&(this.data.splice(r,0,null),this.processData());"point"===e.legendType&&this.generatePoints();d&&(h[0]&&h[0].remove?h[0].remove(!1):(h.shift(),this.updateParallelArrays(k,"shift"),l.shift()));this.isDirtyData=this.isDirty=!0;c&&m.redraw(f)},removePoint:function(a,c,d){var f=this,e=f.data,h=e[a],m=f.points, -g=f.chart,l=function(){m&&m.length===e.length&&m.splice(a,1);e.splice(a,1);f.options.data.splice(a,1);f.updateParallelArrays(h||{series:f},"splice",a,1);h&&h.destroy();f.isDirty=!0;f.isDirtyData=!0;c&&g.redraw()};t(d,g);c=b(c,!0);h?h.firePointEvent("remove",null,l):l()},remove:function(a,c,d){function f(){e.destroy();h.isDirtyLegend=h.isDirtyBox=!0;h.linkSeries();b(a,!0)&&h.redraw(c)}var e=this,h=e.chart;!1!==d?x(e,"remove",null,f):f()},update:function(c,d){var e=this,h=e.chart,k=e.userOptions,t= -e.oldType||e.type,p=c.type||k.type||h.options.chart.type,g=I[t].prototype,r,n=["group","markerGroup","dataLabelsGroup"],v=["navigatorSeries","baseSeries"],A=e.finishedAnimating&&{animation:!1},y=["data","name","turboThreshold"],H=a.keys(c),z=0a&&q>e?(q=Math.max(a,e),f=2*e-q):qn&&f>e?(f=Math.max(n,e),q=2*e-f):f=Math.abs(c)&&.5a.closestPointRange*a.xAxis.transA,h=a.borderWidth=u(e.borderWidth,h?0:1),l=a.yAxis,d=e.threshold,b=a.translatedThreshold=l.getThreshold(d),n=u(e.minPointLength,5),p=a.getColumnMetrics(),q=p.width,t=a.barW=Math.max(q,1+2*h),x=a.pointXOffset=p.offset;c.inverted&&(b-=.5);e.pointPadding&&(t=Math.ceil(t));y.prototype.translate.apply(a);F(a.points,function(f){var e=u(f.yBottom,b),h=999+Math.abs(e),h=Math.min(Math.max(-h,f.plotY),l.len+h), -k=f.plotX+x,p=t,r=Math.min(h,e),v,g=Math.max(h,e)-r;n&&Math.abs(g)n?e-n:b-(v?n:0));f.barX=k;f.pointWidth=q;f.tooltipPos=c.inverted?[l.len+l.pos-c.plotLeft-h,a.xAxis.len-k-p/2,g]:[k+p/2,h+l.pos-c.plotTop,g];f.shapeType="rect";f.shapeArgs=a.crispCol.apply(a,f.isNull?[k,b,p,0]:[k,r,p,g])})},getSymbol:a.noop,drawLegendSymbol:a.LegendSymbolMixin.drawRectangle,drawGraph:function(){this.group[this.dense? -"addClass":"removeClass"]("highcharts-dense-data")},pointAttribs:function(a,c){var f=this.options,h,l=this.pointAttrToOptions||{};h=l.stroke||"borderColor";var d=l["stroke-width"]||"borderWidth",b=a&&a.color||this.color,n=a&&a[h]||f[h]||this.color||b,p=a&&a[d]||f[d]||this[d]||0,l=f.dashStyle;a&&this.zones.length&&(b=a.getZone(),b=a.options.color||b&&b.color||this.color);c&&(a=e(f.states[c],a.options.states&&a.options.states[c]||{}),c=a.brightness,b=a.color||void 0!==c&&E(b).brighten(a.brightness).get()|| -b,n=a[h]||n,p=a[d]||p,l=a.dashStyle||l);h={fill:b,stroke:n,"stroke-width":p};l&&(h.dashstyle=l);return h},drawPoints:function(){var a=this,c=this.chart,k=a.options,r=c.renderer,l=k.animationLimit||250,d;F(a.points,function(b){var f=b.graphic,p=f&&c.pointCountf;++f)c=q[f],a=2>f||2===f&&/%$/.test(c),q[f]=n(c,[y,e,x,q[2]][f])+(a?u:0);q[3]>q[2]&&(q[3]=q[2]);return q},getStartAndEndRadians:function(a,e){a=E(a)?a:0;e=E(e)&&e>a&&360>e-a?e:a+360;return{start:C*(a+-90),end:C*(e+-90)}}}})(K);(function(a){var C=a.addEvent,E=a.CenteredSeriesMixin,F=a.defined,n=a.each,h=a.extend,e=E.getStartAndEndRadians,u=a.inArray,y=a.noop,q=a.pick,x=a.Point, -f=a.Series,c=a.seriesType,k=a.setAnimation;c("pie","line",{center:[null,null],clip:!1,colorByPoint:!0,dataLabels:{allowOverlap:!0,distance:30,enabled:!0,formatter:function(){return this.point.isNull?void 0:this.point.name},x:0},ignoreHiddenPoint:!0,legendType:"point",marker:null,size:null,showInLegend:!1,slicedOffset:10,stickyTracking:!1,tooltip:{followPointer:!0},borderColor:"#ffffff",borderWidth:1,states:{hover:{brightness:.1}}},{isCartesian:!1,requireSorting:!1,directTouch:!0,noSharedTooltip:!0, -trackerGroups:["group","dataLabelsGroup"],axisTypes:[],pointAttribs:a.seriesTypes.column.prototype.pointAttribs,animate:function(a){var c=this,d=c.points,b=c.startAngleRad;a||(n(d,function(a){var d=a.graphic,f=a.shapeArgs;d&&(d.attr({r:a.startR||c.center[3]/2,start:b,end:b}),d.animate({r:f.r,start:f.start,end:f.end},c.options.animation))}),c.animate=null)},updateTotals:function(){var a,c=0,d=this.points,b=d.length,f,e=this.options.ignoreHiddenPoint;for(a=0;a1.5*Math.PI? -t-=2*Math.PI:t<-Math.PI/2&&(t+=2*Math.PI);G.slicedTranslation={translateX:Math.round(Math.cos(t)*b),translateY:Math.round(Math.sin(t)*b)};k=Math.cos(t)*a[2]/2;m=Math.sin(t)*a[2]/2;G.tooltipPos=[a[0]+.7*k,a[1]+.7*m];G.half=t<-Math.PI/2||t>Math.PI/2?1:0;G.angle=t;h=Math.min(f,G.labelDistance/5);G.labelPos=[a[0]+k+Math.cos(t)*G.labelDistance,a[1]+m+Math.sin(t)*G.labelDistance,a[0]+k+Math.cos(t)*h,a[1]+m+Math.sin(t)*h,a[0]+k,a[1]+m,0>G.labelDistance?"center":G.half?"right":"left",t]}},drawGraph:null, -drawPoints:function(){var a=this,c=a.chart.renderer,d,b,f,e,k=a.options.shadow;k&&!a.shadowGroup&&(a.shadowGroup=c.g("shadow").add(a.group));n(a.points,function(l){b=l.graphic;if(l.isNull)b&&(l.graphic=b.destroy());else{e=l.shapeArgs;d=l.getTranslate();var t=l.shadowGroup;k&&!t&&(t=l.shadowGroup=c.g("shadow").add(a.shadowGroup));t&&t.attr(d);f=a.pointAttribs(l,l.selected&&"select");b?b.setRadialReference(a.center).attr(f).animate(h(e,d)):(l.graphic=b=c[l.shapeType](e).setRadialReference(a.center).attr(d).add(a.group), -b.attr(f).attr({"stroke-linejoin":"round"}).shadow(k,t));b.attr({visibility:l.visible?"inherit":"hidden"});b.addClass(l.getClassName())}})},searchPoint:y,sortByAngle:function(a,c){a.sort(function(a,b){return void 0!==a.angle&&(b.angle-a.angle)*c})},drawLegendSymbol:a.LegendSymbolMixin.drawRectangle,getCenter:E.getCenter,getSymbol:y},{init:function(){x.prototype.init.apply(this,arguments);var a=this,c;a.name=q(a.name,"Slice");c=function(c){a.slice("select"===c.type)};C(a,"select",c);C(a,"unselect", -c);return a},isValid:function(){return a.isNumber(this.y,!0)&&0<=this.y},setVisible:function(a,c){var d=this,b=d.series,f=b.chart,e=b.options.ignoreHiddenPoint;c=q(c,e);a!==d.visible&&(d.visible=d.options.visible=a=void 0===a?!d.visible:a,b.options.data[u(d,b.data)]=d.options,n(["graphic","dataLabel","connector","shadowGroup"],function(b){if(d[b])d[b][a?"show":"hide"](!0)}),d.legendItem&&f.legend.colorizeItem(d,a),a||"hover"!==d.state||d.setState(""),e&&(b.isDirty=!0),c&&f.redraw())},slice:function(a, -c,d){var b=this.series;k(d,b.chart);q(c,!0);this.sliced=this.options.sliced=F(a)?a:!this.sliced;b.options.data[u(this,b.data)]=this.options;this.graphic.animate(this.getTranslate());this.shadowGroup&&this.shadowGroup.animate(this.getTranslate())},getTranslate:function(){return this.sliced?this.slicedTranslation:{translateX:0,translateY:0}},haloPath:function(a){var c=this.shapeArgs;return this.sliced||!this.visible?[]:this.series.chart.renderer.symbols.arc(c.x,c.y,c.r+a,c.r+a,{innerR:this.shapeArgs.r- -1,start:c.start,end:c.end})}})})(K);(function(a){var C=a.addEvent,E=a.arrayMax,F=a.defined,n=a.each,h=a.extend,e=a.format,u=a.map,y=a.merge,q=a.noop,x=a.pick,f=a.relativeLength,c=a.Series,k=a.seriesTypes,r=a.some,l=a.stableSort;a.distribute=function(c,b,f){function d(a,b){return a.target-b.target}var e,h=!0,k=c,q=[],v;v=0;var m=k.reducedLen||b;for(e=c.length;e--;)v+=c[e].size;if(v>m){l(c,function(a,b){return(b.rank||0)-(a.rank||0)});for(v=e=0;v<=m;)v+=c[e].size,e++;q=c.splice(e-1,c.length)}l(c,d); -for(c=u(c,function(a){return{size:a.size,targets:[a.target],align:x(a.align,.5)}});h;){for(e=c.length;e--;)h=c[e],v=(Math.min.apply(0,h.targets)+Math.max.apply(0,h.targets))/2,h.pos=Math.min(Math.max(0,v-h.size*h.align),b-h.size);e=c.length;for(h=!1;e--;)0c[e].pos&&(c[e-1].size+=c[e].size,c[e-1].targets=c[e-1].targets.concat(c[e].targets),c[e-1].align=.5,c[e-1].pos+c[e-1].size>b&&(c[e-1].pos=b-c[e-1].size),c.splice(e,1),h=!0)}k.push.apply(k,q);e=0;r(c,function(c){var d= -0;if(r(c.targets,function(){k[e].pos=c.pos+d;if(Math.abs(k[e].pos-k[e].target)>f)return n(k.slice(0,e+1),function(a){delete a.pos}),k.reducedLen=(k.reducedLen||b)-.1*b,k.reducedLen>.1*b&&a.distribute(k,b,f),!0;d+=k[e].size;e++}))return!0});l(k,d)};c.prototype.drawDataLabels=function(){function c(a,b){var c=b.filter;return c?(b=c.operator,a=a[c.property],c=c.value,"\x3e"===b&&a>c||"\x3c"===b&&a=c||"\x3c\x3d"===b&&a<=c||"\x3d\x3d"===b&&a==c||"\x3d\x3d\x3d"===b&&a===c?!0:!1):!0} -var b=this,f=b.chart,h=b.options,l=h.dataLabels,k=b.points,r,q,u=b.hasRendered||0,m,D,B=x(l.defer,!!h.animation),E=f.renderer;if(l.enabled||b._hasPointLabels)b.dlProcessOptions&&b.dlProcessOptions(l),D=b.plotGroup("dataLabelsGroup","data-labels",B&&!u?"hidden":"visible",l.zIndex||6),B&&(D.attr({opacity:+u}),u||C(b,"afterAnimate",function(){b.visible&&D.show(!0);D[h.animation?"animate":"attr"]({opacity:1},{duration:200})})),q=l,n(k,function(d){var g,k=d.dataLabel,t,p,n=d.connector,u=!k,v;r=d.dlOptions|| -d.options&&d.options.dataLabels;(g=x(r&&r.enabled,q.enabled)&&!d.isNull)&&(g=!0===c(d,r||l));g&&(l=y(q,r),t=d.getLabelConfig(),v=l[d.formatPrefix+"Format"]||l.format,m=F(v)?e(v,t,f.time):(l[d.formatPrefix+"Formatter"]||l.formatter).call(t,l),v=l.style,t=l.rotation,v.color=x(l.color,v.color,b.color,"#000000"),"contrast"===v.color&&(d.contrastColor=E.getContrast(d.color||b.color),v.color=l.inside||0>x(d.labelDistance,l.distance)||h.stacking?d.contrastColor:"#000000"),h.cursor&&(v.cursor=h.cursor),p= -{fill:l.backgroundColor,stroke:l.borderColor,"stroke-width":l.borderWidth,r:l.borderRadius||0,rotation:t,padding:l.padding,zIndex:1},a.objectEach(p,function(a,b){void 0===a&&delete p[b]}));!k||g&&F(m)?g&&F(m)&&(k?p.text=m:(k=d.dataLabel=t?E.text(m,0,-9999).addClass("highcharts-data-label"):E.label(m,0,-9999,l.shape,null,null,l.useHTML,null,"data-label"),k.addClass(" highcharts-data-label-color-"+d.colorIndex+" "+(l.className||"")+(l.useHTML?" highcharts-tracker":""))),k.attr(p),k.css(v).shadow(l.shadow), -k.added||k.add(D),b.alignDataLabel(d,k,l,null,u)):(d.dataLabel=k=k.destroy(),n&&(d.connector=n.destroy()))});a.fireEvent(this,"afterDrawDataLabels")};c.prototype.alignDataLabel=function(a,b,c,e,f){var d=this.chart,l=d.inverted,k=x(a.dlBox&&a.dlBox.centerX,a.plotX,-9999),n=x(a.plotY,-9999),m=b.getBBox(),p,r=c.rotation,q=c.align,u=this.visible&&(a.series.forceDL||d.isInsidePlot(k,Math.round(n),l)||e&&d.isInsidePlot(k,l?e.x+1:e.y+e.height-1,l)),g="justify"===x(c.overflow,"justify");if(u&&(p=c.style.fontSize, -p=d.renderer.fontMetrics(p,b).b,e=h({x:l?this.yAxis.len-n:k,y:Math.round(l?this.xAxis.len-k:n),width:0,height:0},e),h(c,{width:m.width,height:m.height}),r?(g=!1,k=d.renderer.rotCorr(p,r),k={x:e.x+c.x+e.width/2+k.x,y:e.y+c.y+{top:0,middle:.5,bottom:1}[c.verticalAlign]*e.height},b[f?"attr":"animate"](k).attr({align:q}),n=(r+720)%360,n=180n,"left"===q?k.y-=n?m.height:0:"center"===q?(k.x-=m.width/2,k.y-=m.height/2):"right"===q&&(k.x-=m.width,k.y-=n?0:m.height),b.placed=!0,b.alignAttr=k):(b.align(c, -null,e),k=b.alignAttr),g?a.isLabelJustified=this.justifyDataLabel(b,c,k,m,e,f):x(c.crop,!0)&&(u=d.isInsidePlot(k.x,k.y)&&d.isInsidePlot(k.x+m.width,k.y+m.height)),c.shape&&!r))b[f?"attr":"animate"]({anchorX:l?d.plotWidth-a.plotY:a.plotX,anchorY:l?d.plotHeight-a.plotX:a.plotY});u||(b.attr({y:-9999}),b.placed=!1)};c.prototype.justifyDataLabel=function(a,b,c,e,f,h){var d=this.chart,l=b.align,k=b.verticalAlign,m,t,n=a.box?0:a.padding||0;m=c.x+n;0>m&&("right"===l?b.align="left":b.x=-m,t=!0);m=c.x+e.width- -n;m>d.plotWidth&&("left"===l?b.align="right":b.x=d.plotWidth-m,t=!0);m=c.y+n;0>m&&("bottom"===k?b.verticalAlign="top":b.y=-m,t=!0);m=c.y+e.height-n;m>d.plotHeight&&("top"===k?b.verticalAlign="bottom":b.y=d.plotHeight-m,t=!0);t&&(a.placed=!h,a.align(b,null,f));return t};k.pie&&(k.pie.prototype.drawDataLabels=function(){var d=this,b=d.data,e,f=d.chart,h=d.options.dataLabels,l=x(h.connectorPadding,10),k=x(h.connectorWidth,1),r=f.plotWidth,q=f.plotHeight,m=Math.round(f.chartWidth/3),u,y=d.center,C=y[2]/ -2,G=y[1],g,w,K,Q,J=[[],[]],O,N,z,R,S=[0,0,0,0];d.visible&&(h.enabled||d._hasPointLabels)&&(n(b,function(a){a.dataLabel&&a.visible&&a.dataLabel.shortened&&(a.dataLabel.attr({width:"auto"}).css({width:"auto",textOverflow:"clip"}),a.dataLabel.shortened=!1)}),c.prototype.drawDataLabels.apply(d),n(b,function(a){a.dataLabel&&(a.visible?(J[a.half].push(a),a.dataLabel._pos=null,!F(h.style.width)&&!F(a.options.dataLabels&&a.options.dataLabels.style&&a.options.dataLabels.style.width)&&a.dataLabel.getBBox().width> -m&&(a.dataLabel.css({width:.7*m}),a.dataLabel.shortened=!0)):a.dataLabel=a.dataLabel.destroy())}),n(J,function(b,c){var k,m,t=b.length,p=[],u;if(t)for(d.sortByAngle(b,c-.5),0e.bottom-2?k:N,c,e),g._attr={visibility:z,align:K[6]},g._pos={x:O+h.x+({left:l,right:-l}[K[6]]||0),y:N+h.y-10},K.x=O,K.y=N,x(h.crop, -!0)&&(w=g.getBBox().width,k=null,O-wr-l&&0===c&&(k=Math.round(O+w-r+l),S[1]=Math.max(k,S[1])),0>N-Q/2?S[0]=Math.max(Math.round(-N+Q/2),S[0]):N+Q/2>q&&(S[2]=Math.max(Math.round(N+Q/2-q),S[2])),g.sideOverflow=k)}),0===E(S)||this.verifyDataLabelOverflow(S))&&(this.placeDataLabels(),k&&n(this.points,function(a){var b;u=a.connector;if((g=a.dataLabel)&&g._pos&&a.visible&&0x(this.translatedThreshold,l.yAxis.len)),m=x(e.inside,!!this.options.stacking);k&&(f=y(k),0>f.y&&(f.height+=f.y,f.y=0),k=f.y+f.height-l.yAxis.len,0a+d||e+hc+b||f+kthis.pointCount))},pan:function(a,b){var c=this,d=c.hoverPoints,e;d&&u(d,function(a){a.setState()});u("xy"===b?[1,0]: -[1],function(b){b=c[b?"xAxis":"yAxis"][0];var d=b.horiz,f=a[d?"chartX":"chartY"],d=d?"mouseDownX":"mouseDownY",h=c[d],g=(b.pointRange||0)/2,k=b.reversed&&!c.inverted||!b.reversed&&c.inverted?-1:1,l=b.getExtremes(),m=b.toValue(h-f,!0)+g*k,k=b.toValue(h+b.len-f,!0)-g*k,n=k=e(n.minWidth,0)&&this.chartHeight>=e(n.minHeight,0)}).call(this)&&h.push(a._id)};C.prototype.currentOptions= -function(e){function q(e,c,k,r){var f;a.objectEach(e,function(a,b){if(!r&&-1 parseInt(E.split("Firefox/")[1], + 10); + return a.Highcharts ? a.Highcharts.error(16, !0) : { + product: "Highcharts", + version: "6.1.1", + deg2rad: 2 * Math.PI / 360, + doc: C, + hasBidiBug: u, + hasTouch: C && void 0 !== C.documentElement.ontouchstart, + isMS: n, + isWebKit: -1 !== E.indexOf("AppleWebKit"), + isFirefox: h, + isChrome: e, + isSafari: !e && -1 !== E.indexOf("Safari"), + isTouchDevice: /(Mobile|Android|Windows Phone)/.test(E), + SVG_NS: "http://www.w3.org/2000/svg", + chartCount: 0, + seriesTypes: {}, + symbolSizes: {}, + svg: F, + win: a, + marginNames: ["plotTop", "marginRight", "marginBottom", "plotLeft"], + noop: function () {}, + charts: [] + } + }(); + (function (a) { + a.timers = []; + var C = a.charts, + E = a.doc, + F = a.win; + a.error = function (n, h) { + n = a.isNumber(n) ? "Highcharts error #" + n + ": www.highcharts.com/errors/" + n : n; + if (h) throw Error(n); + F.console && console.log(n) + }; + a.Fx = function (a, h, e) { + this.options = h; + this.elem = a; + this.prop = e + }; + a.Fx.prototype = { + dSetter: function () { + var a = this.paths[0], + h = this.paths[1], + e = [], + u = this.now, + y = a.length, + q; + if (1 === u) e = this.toD; + else if (y === h.length && 1 > u) + for (; y--;) q = parseFloat(a[y]), e[y] = isNaN(q) ? h[y] : u * parseFloat(h[y] - q) + q; + else e = h; + this.elem.attr("d", + e, null, !0) + }, + update: function () { + var a = this.elem, + h = this.prop, + e = this.now, + u = this.options.step; + if (this[h + "Setter"]) this[h + "Setter"](); + else a.attr ? a.element && a.attr(h, e, null, !0) : a.style[h] = e + this.unit; + u && u.call(a, e, this) + }, + run: function (n, h, e) { + var u = this, + y = u.options, + q = function (a) { + return q.stopped ? !1 : u.step(a) + }, + x = F.requestAnimationFrame || function (a) { + setTimeout(a, 13) + }, + f = function () { + for (var c = 0; c < a.timers.length; c++) a.timers[c]() || a.timers.splice(c--, 1); + a.timers.length && x(f) + }; + n !== h || this.elem["forceAnimate:" + + this.prop] ? (this.startTime = +new Date, this.start = n, this.end = h, this.unit = e, this.now = this.start, this.pos = 0, q.elem = this.elem, q.prop = this.prop, q() && 1 === a.timers.push(q) && x(f)) : (delete y.curAnim[this.prop], y.complete && 0 === a.keys(y.curAnim).length && y.complete.call(this.elem)) + }, + step: function (n) { + var h = +new Date, + e, u = this.options, + y = this.elem, + q = u.complete, + x = u.duration, + f = u.curAnim; + y.attr && !y.element ? n = !1 : n || h >= x + this.startTime ? (this.now = this.end, this.pos = 1, this.update(), e = f[this.prop] = !0, a.objectEach(f, function (a) { + !0 !== + a && (e = !1) + }), e && q && q.call(y), n = !1) : (this.pos = u.easing((h - this.startTime) / x), this.now = this.start + (this.end - this.start) * this.pos, this.update(), n = !0); + return n + }, + initPath: function (n, h, e) { + function u(a) { + var d, l; + for (b = a.length; b--;) d = "M" === a[b] || "L" === a[b], l = /[a-zA-Z]/.test(a[b + 3]), d && l && a.splice(b + 1, 0, a[b + 1], a[b + 2], a[b + 1], a[b + 2]) + } + + function y(a, d) { + for (; a.length < l;) { + a[0] = d[l - a.length]; + var c = a.slice(0, r); + [].splice.apply(a, [0, 0].concat(c)); + v && (c = a.slice(a.length - r), [].splice.apply(a, [a.length, 0].concat(c)), b--) + } + a[0] = + "M" + } + + function q(a, b) { + for (var c = (l - a.length) / r; 0 < c && c--;) d = a.slice().splice(a.length / p - r, r * p), d[0] = b[l - r - c * r], k && (d[r - 6] = d[r - 2], d[r - 5] = d[r - 1]), [].splice.apply(a, [a.length / p, 0].concat(d)), v && c-- + } + h = h || ""; + var x, f = n.startX, + c = n.endX, + k = -1 < h.indexOf("C"), + r = k ? 7 : 3, + l, d, b; + h = h.split(" "); + e = e.slice(); + var v = n.isArea, + p = v ? 2 : 1, + I; + k && (u(h), u(e)); + if (f && c) { + for (b = 0; b < f.length; b++) + if (f[b] === c[0]) { + x = b; + break + } else if (f[0] === c[c.length - f.length + b]) { + x = b; + I = !0; + break + } + void 0 === x && (h = []) + } + h.length && a.isNumber(x) && (l = e.length + x * p * r, + I ? (y(h, e), q(e, h)) : (y(e, h), q(h, e))); + return [h, e] + } + }; + a.Fx.prototype.fillSetter = a.Fx.prototype.strokeSetter = function () { + this.elem.attr(this.prop, a.color(this.start).tweenTo(a.color(this.end), this.pos), null, !0) + }; + a.merge = function () { + var n, h = arguments, + e, u = {}, + y = function (e, n) { + "object" !== typeof e && (e = {}); + a.objectEach(n, function (f, c) { + !a.isObject(f, !0) || a.isClass(f) || a.isDOMElement(f) ? e[c] = n[c] : e[c] = y(e[c] || {}, f) + }); + return e + }; + !0 === h[0] && (u = h[1], h = Array.prototype.slice.call(h, 2)); + e = h.length; + for (n = 0; n < e; n++) u = y(u, + h[n]); + return u + }; + a.pInt = function (a, h) { + return parseInt(a, h || 10) + }; + a.isString = function (a) { + return "string" === typeof a + }; + a.isArray = function (a) { + a = Object.prototype.toString.call(a); + return "[object Array]" === a || "[object Array Iterator]" === a + }; + a.isObject = function (n, h) { + return !!n && "object" === typeof n && (!h || !a.isArray(n)) + }; + a.isDOMElement = function (n) { + return a.isObject(n) && "number" === typeof n.nodeType + }; + a.isClass = function (n) { + var h = n && n.constructor; + return !(!a.isObject(n, !0) || a.isDOMElement(n) || !h || !h.name || "Object" === + h.name) + }; + a.isNumber = function (a) { + return "number" === typeof a && !isNaN(a) && Infinity > a && -Infinity < a + }; + a.erase = function (a, h) { + for (var e = a.length; e--;) + if (a[e] === h) { + a.splice(e, 1); + break + } + }; + a.defined = function (a) { + return void 0 !== a && null !== a + }; + a.attr = function (n, h, e) { + var u; + a.isString(h) ? a.defined(e) ? n.setAttribute(h, e) : n && n.getAttribute && ((u = n.getAttribute(h)) || "class" !== h || (u = n.getAttribute(h + "Name"))) : a.defined(h) && a.isObject(h) && a.objectEach(h, function (a, e) { + n.setAttribute(e, a) + }); + return u + }; + a.splat = function (n) { + return a.isArray(n) ? + n : [n] + }; + a.syncTimeout = function (a, h, e) { + if (h) return setTimeout(a, h, e); + a.call(0, e) + }; + a.clearTimeout = function (n) { + a.defined(n) && clearTimeout(n) + }; + a.extend = function (a, h) { + var e; + a || (a = {}); + for (e in h) a[e] = h[e]; + return a + }; + a.pick = function () { + var a = arguments, + h, e, u = a.length; + for (h = 0; h < u; h++) + if (e = a[h], void 0 !== e && null !== e) return e + }; + a.css = function (n, h) { + a.isMS && !a.svg && h && void 0 !== h.opacity && (h.filter = "alpha(opacity\x3d" + 100 * h.opacity + ")"); + a.extend(n.style, h) + }; + a.createElement = function (n, h, e, u, y) { + n = E.createElement(n); + var q = + a.css; + h && a.extend(n, h); + y && q(n, { + padding: 0, + border: "none", + margin: 0 + }); + e && q(n, e); + u && u.appendChild(n); + return n + }; + a.extendClass = function (n, h) { + var e = function () {}; + e.prototype = new n; + a.extend(e.prototype, h); + return e + }; + a.pad = function (a, h, e) { + return Array((h || 2) + 1 - String(a).replace("-", "").length).join(e || 0) + a + }; + a.relativeLength = function (a, h, e) { + return /%$/.test(a) ? h * parseFloat(a) / 100 + (e || 0) : parseFloat(a) + }; + a.wrap = function (a, h, e) { + var n = a[h]; + a[h] = function () { + var a = Array.prototype.slice.call(arguments), + q = arguments, + x = this; + x.proceed = function () { + n.apply(x, arguments.length ? arguments : q) + }; + a.unshift(n); + a = e.apply(this, a); + x.proceed = null; + return a + } + }; + a.formatSingle = function (n, h, e) { + var u = /\.([0-9])/, + y = a.defaultOptions.lang; + /f$/.test(n) ? (e = (e = n.match(u)) ? e[1] : -1, null !== h && (h = a.numberFormat(h, e, y.decimalPoint, -1 < n.indexOf(",") ? y.thousandsSep : ""))) : h = (e || a.time).dateFormat(n, h); + return h + }; + a.format = function (n, h, e) { + for (var u = "{", y = !1, q, x, f, c, k = [], r; n;) { + u = n.indexOf(u); + if (-1 === u) break; + q = n.slice(0, u); + if (y) { + q = q.split(":"); + x = q.shift().split("."); + c = x.length; + r = h; + for (f = 0; f < c; f++) r && (r = r[x[f]]); + q.length && (r = a.formatSingle(q.join(":"), r, e)); + k.push(r) + } else k.push(q); + n = n.slice(u + 1); + u = (y = !y) ? "}" : "{" + } + k.push(n); + return k.join("") + }; + a.getMagnitude = function (a) { + return Math.pow(10, Math.floor(Math.log(a) / Math.LN10)) + }; + a.normalizeTickInterval = function (n, h, e, u, y) { + var q, x = n; + e = a.pick(e, 1); + q = n / e; + h || (h = y ? [1, 1.2, 1.5, 2, 2.5, 3, 4, 5, 6, 8, 10] : [1, 2, 2.5, 5, 10], !1 === u && (1 === e ? h = a.grep(h, function (a) { + return 0 === a % 1 + }) : .1 >= e && (h = [1 / e]))); + for (u = 0; u < h.length && !(x = h[u], y && x * e >= n || + !y && q <= (h[u] + (h[u + 1] || h[u])) / 2); u++); + return x = a.correctFloat(x * e, -Math.round(Math.log(.001) / Math.LN10)) + }; + a.stableSort = function (a, h) { + var e = a.length, + n, y; + for (y = 0; y < e; y++) a[y].safeI = y; + a.sort(function (a, e) { + n = h(a, e); + return 0 === n ? a.safeI - e.safeI : n + }); + for (y = 0; y < e; y++) delete a[y].safeI + }; + a.arrayMin = function (a) { + for (var h = a.length, e = a[0]; h--;) a[h] < e && (e = a[h]); + return e + }; + a.arrayMax = function (a) { + for (var h = a.length, e = a[0]; h--;) a[h] > e && (e = a[h]); + return e + }; + a.destroyObjectProperties = function (n, h) { + a.objectEach(n, function (a, + u) { + a && a !== h && a.destroy && a.destroy(); + delete n[u] + }) + }; + a.discardElement = function (n) { + var h = a.garbageBin; + h || (h = a.createElement("div")); + n && h.appendChild(n); + h.innerHTML = "" + }; + a.correctFloat = function (a, h) { + return parseFloat(a.toPrecision(h || 14)) + }; + a.setAnimation = function (n, h) { + h.renderer.globalAnimation = a.pick(n, h.options.chart.animation, !0) + }; + a.animObject = function (n) { + return a.isObject(n) ? a.merge(n) : { + duration: n ? 500 : 0 + } + }; + a.timeUnits = { + millisecond: 1, + second: 1E3, + minute: 6E4, + hour: 36E5, + day: 864E5, + week: 6048E5, + month: 24192E5, + year: 314496E5 + }; + a.numberFormat = function (n, h, e, u) { + n = +n || 0; + h = +h; + var y = a.defaultOptions.lang, + q = (n.toString().split(".")[1] || "").split("e")[0].length, + x, f, c = n.toString().split("e"); - 1 === h ? h = Math.min(q, 20) : a.isNumber(h) ? h && c[1] && 0 > c[1] && (x = h + +c[1], 0 <= x ? (c[0] = (+c[0]).toExponential(x).split("e")[0], h = x) : (c[0] = c[0].split(".")[0] || 0, n = 20 > h ? (c[0] * Math.pow(10, c[1])).toFixed(h) : 0, c[1] = 0)) : h = 2; + f = (Math.abs(c[1] ? c[0] : n) + Math.pow(10, -Math.max(h, q) - 1)).toFixed(h); + q = String(a.pInt(f)); + x = 3 < q.length ? q.length % 3 : 0; + e = a.pick(e, + y.decimalPoint); + u = a.pick(u, y.thousandsSep); + n = (0 > n ? "-" : "") + (x ? q.substr(0, x) + u : ""); + n += q.substr(x).replace(/(\d{3})(?=\d)/g, "$1" + u); + h && (n += e + f.slice(-h)); + c[1] && 0 !== +n && (n += "e" + c[1]); + return n + }; + Math.easeInOutSine = function (a) { + return -.5 * (Math.cos(Math.PI * a) - 1) + }; + a.getStyle = function (n, h, e) { + if ("width" === h) return Math.max(0, Math.min(n.offsetWidth, n.scrollWidth) - a.getStyle(n, "padding-left") - a.getStyle(n, "padding-right")); + if ("height" === h) return Math.max(0, Math.min(n.offsetHeight, n.scrollHeight) - a.getStyle(n, "padding-top") - + a.getStyle(n, "padding-bottom")); + F.getComputedStyle || a.error(27, !0); + if (n = F.getComputedStyle(n, void 0)) n = n.getPropertyValue(h), a.pick(e, "opacity" !== h) && (n = a.pInt(n)); + return n + }; + a.inArray = function (n, h, e) { + return (a.indexOfPolyfill || Array.prototype.indexOf).call(h, n, e) + }; + a.grep = function (n, h) { + return (a.filterPolyfill || Array.prototype.filter).call(n, h) + }; + a.find = Array.prototype.find ? function (a, h) { + return a.find(h) + } : function (a, h) { + var e, u = a.length; + for (e = 0; e < u; e++) + if (h(a[e], e)) return a[e] + }; + a.some = function (n, h, e) { + return (a.somePolyfill || + Array.prototype.some).call(n, h, e) + }; + a.map = function (a, h) { + for (var e = [], u = 0, y = a.length; u < y; u++) e[u] = h.call(a[u], a[u], u, a); + return e + }; + a.keys = function (n) { + return (a.keysPolyfill || Object.keys).call(void 0, n) + }; + a.reduce = function (n, h, e) { + return (a.reducePolyfill || Array.prototype.reduce).apply(n, 2 < arguments.length ? [h, e] : [h]) + }; + a.offset = function (a) { + var h = E.documentElement; + a = a.parentElement || a.parentNode ? a.getBoundingClientRect() : { + top: 0, + left: 0 + }; + return { + top: a.top + (F.pageYOffset || h.scrollTop) - (h.clientTop || 0), + left: a.left + + (F.pageXOffset || h.scrollLeft) - (h.clientLeft || 0) + } + }; + a.stop = function (n, h) { + for (var e = a.timers.length; e--;) a.timers[e].elem !== n || h && h !== a.timers[e].prop || (a.timers[e].stopped = !0) + }; + a.each = function (n, h, e) { + return (a.forEachPolyfill || Array.prototype.forEach).call(n, h, e) + }; + a.objectEach = function (a, h, e) { + for (var u in a) a.hasOwnProperty(u) && h.call(e || a[u], a[u], u, a) + }; + a.addEvent = function (n, h, e, u) { + var y, q = n.addEventListener || a.addEventListenerPolyfill; + y = "function" === typeof n && n.prototype ? n.prototype.protoEvents = n.prototype.protoEvents || {} : n.hcEvents = n.hcEvents || {}; + a.Point && n instanceof a.Point && n.series && n.series.chart && (n.series.chart.runTrackerClick = !0); + q && q.call(n, h, e, !1); + y[h] || (y[h] = []); + y[h].push(e); + u && a.isNumber(u.order) && (e.order = u.order, y[h].sort(function (a, f) { + return a.order - f.order + })); + return function () { + a.removeEvent(n, h, e) + } + }; + a.removeEvent = function (n, h, e) { + function u(f, c) { + var k = n.removeEventListener || a.removeEventListenerPolyfill; + k && k.call(n, f, c, !1) + } + + function y(f) { + var c, k; + n.nodeName && (h ? (c = {}, c[h] = !0) : c = f, a.objectEach(c, function (a, + c) { + if (f[c]) + for (k = f[c].length; k--;) u(c, f[c][k]) + })) + } + var q, x; + a.each(["protoEvents", "hcEvents"], function (f) { + var c = n[f]; + c && (h ? (q = c[h] || [], e ? (x = a.inArray(e, q), -1 < x && (q.splice(x, 1), c[h] = q), u(h, e)) : (y(c), c[h] = [])) : (y(c), n[f] = {})) + }) + }; + a.fireEvent = function (n, h, e, u) { + var y, q, x, f, c; + e = e || {}; + E.createEvent && (n.dispatchEvent || n.fireEvent) ? (y = E.createEvent("Events"), y.initEvent(h, !0, !0), a.extend(y, e), n.dispatchEvent ? n.dispatchEvent(y) : n.fireEvent(h, y)) : a.each(["protoEvents", "hcEvents"], function (k) { + if (n[k]) + for (q = n[k][h] || [], x = q.length, e.target || a.extend(e, { + preventDefault: function () { + e.defaultPrevented = !0 + }, + target: n, + type: h + }), f = 0; f < x; f++)(c = q[f]) && !1 === c.call(n, e) && e.preventDefault() + }); + u && !e.defaultPrevented && u.call(n, e) + }; + a.animate = function (n, h, e) { + var u, y = "", + q, x, f; + a.isObject(e) || (f = arguments, e = { + duration: f[2], + easing: f[3], + complete: f[4] + }); + a.isNumber(e.duration) || (e.duration = 400); + e.easing = "function" === typeof e.easing ? e.easing : Math[e.easing] || Math.easeInOutSine; + e.curAnim = a.merge(h); + a.objectEach(h, function (c, f) { + a.stop(n, f); + x = new a.Fx(n, e, f); + q = null; + "d" === f ? (x.paths = x.initPath(n, n.d, h.d), x.toD = h.d, u = 0, q = 1) : n.attr ? u = n.attr(f) : (u = parseFloat(a.getStyle(n, f)) || 0, "opacity" !== f && (y = "px")); + q || (q = c); + q && q.match && q.match("px") && (q = q.replace(/px/g, "")); + x.run(u, q, y) + }) + }; + a.seriesType = function (n, h, e, u, y) { + var q = a.getOptions(), + x = a.seriesTypes; + q.plotOptions[n] = a.merge(q.plotOptions[h], e); + x[n] = a.extendClass(x[h] || function () {}, u); + x[n].prototype.type = n; + y && (x[n].prototype.pointClass = a.extendClass(a.Point, y)); + return x[n] + }; + a.uniqueKey = function () { + var a = + Math.random().toString(36).substring(2, 9), + h = 0; + return function () { + return "highcharts-" + a + "-" + h++ + } + }(); + F.jQuery && (F.jQuery.fn.highcharts = function () { + var n = [].slice.call(arguments); + if (this[0]) return n[0] ? (new(a[a.isString(n[0]) ? n.shift() : "Chart"])(this[0], n[0], n[1]), this) : C[a.attr(this[0], "data-highcharts-chart")] + }) + })(K); + (function (a) { + var C = a.each, + E = a.isNumber, + F = a.map, + n = a.merge, + h = a.pInt; + a.Color = function (e) { + if (!(this instanceof a.Color)) return new a.Color(e); + this.init(e) + }; + a.Color.prototype = { + parsers: [{ + regex: /rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]?(?:\.[0-9]+)?)\s*\)/, + parse: function (a) { + return [h(a[1]), h(a[2]), h(a[3]), parseFloat(a[4], 10)] + } + }, { + regex: /rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/, + parse: function (a) { + return [h(a[1]), h(a[2]), h(a[3]), 1] + } + }], + names: { + none: "rgba(255,255,255,0)", + white: "#ffffff", + black: "#000000" + }, + init: function (e) { + var h, y, q, x; + if ((this.input = e = this.names[e && e.toLowerCase ? e.toLowerCase() : ""] || e) && e.stops) this.stops = F(e.stops, function (f) { + return new a.Color(f[1]) + }); + else if (e && e.charAt && "#" === e.charAt() && (h = e.length, e = parseInt(e.substr(1), + 16), 7 === h ? y = [(e & 16711680) >> 16, (e & 65280) >> 8, e & 255, 1] : 4 === h && (y = [(e & 3840) >> 4 | (e & 3840) >> 8, (e & 240) >> 4 | e & 240, (e & 15) << 4 | e & 15, 1])), !y) + for (q = this.parsers.length; q-- && !y;) x = this.parsers[q], (h = x.regex.exec(e)) && (y = x.parse(h)); + this.rgba = y || [] + }, + get: function (a) { + var e = this.input, + h = this.rgba, + q; + this.stops ? (q = n(e), q.stops = [].concat(q.stops), C(this.stops, function (e, f) { + q.stops[f] = [q.stops[f][0], e.get(a)] + })) : q = h && E(h[0]) ? "rgb" === a || !a && 1 === h[3] ? "rgb(" + h[0] + "," + h[1] + "," + h[2] + ")" : "a" === a ? h[3] : "rgba(" + h.join(",") + ")" : e; + return q + }, + brighten: function (a) { + var e, y = this.rgba; + if (this.stops) C(this.stops, function (e) { + e.brighten(a) + }); + else if (E(a) && 0 !== a) + for (e = 0; 3 > e; e++) y[e] += h(255 * a), 0 > y[e] && (y[e] = 0), 255 < y[e] && (y[e] = 255); + return this + }, + setOpacity: function (a) { + this.rgba[3] = a; + return this + }, + tweenTo: function (a, h) { + var e = this.rgba, + q = a.rgba; + q.length && e && e.length ? (a = 1 !== q[3] || 1 !== e[3], h = (a ? "rgba(" : "rgb(") + Math.round(q[0] + (e[0] - q[0]) * (1 - h)) + "," + Math.round(q[1] + (e[1] - q[1]) * (1 - h)) + "," + Math.round(q[2] + (e[2] - q[2]) * (1 - h)) + (a ? "," + (q[3] + (e[3] - + q[3]) * (1 - h)) : "") + ")") : h = a.input || "none"; + return h + } + }; + a.color = function (e) { + return new a.Color(e) + } + })(K); + (function (a) { + var C, E, F = a.addEvent, + n = a.animate, + h = a.attr, + e = a.charts, + u = a.color, + y = a.css, + q = a.createElement, + x = a.defined, + f = a.deg2rad, + c = a.destroyObjectProperties, + k = a.doc, + r = a.each, + l = a.extend, + d = a.erase, + b = a.grep, + v = a.hasTouch, + p = a.inArray, + I = a.isArray, + t = a.isFirefox, + L = a.isMS, + A = a.isObject, + H = a.isString, + m = a.isWebKit, + D = a.merge, + B = a.noop, + M = a.objectEach, + G = a.pick, + g = a.pInt, + w = a.removeEvent, + P = a.stop, + Q = a.svg, + J = a.SVG_NS, + O = a.symbolSizes, + N = a.win; + C = a.SVGElement = function () { + return this + }; + l(C.prototype, { + opacity: 1, + SVG_NS: J, + textProps: "direction fontSize fontWeight fontFamily fontStyle color lineHeight width textAlign textDecoration textOverflow textOutline".split(" "), + init: function (a, g) { + this.element = "span" === g ? q(g) : k.createElementNS(this.SVG_NS, g); + this.renderer = a + }, + animate: function (z, g, b) { + g = a.animObject(G(g, this.renderer.globalAnimation, !0)); + 0 !== g.duration ? (b && (g.complete = b), n(this, z, g)) : (this.attr(z, null, b), g.step && g.step.call(this)); + return this + }, + complexColor: function (z, g, b) { + var d = this.renderer, + w, c, l, J, f, m, B, k, R, v, p, t = [], + A; + a.fireEvent(this.renderer, "complexColor", { + args: arguments + }, function () { + z.radialGradient ? c = "radialGradient" : z.linearGradient && (c = "linearGradient"); + c && (l = z[c], f = d.gradients, B = z.stops, v = b.radialReference, I(l) && (z[c] = l = { + x1: l[0], + y1: l[1], + x2: l[2], + y2: l[3], + gradientUnits: "userSpaceOnUse" + }), "radialGradient" === c && v && !x(l.gradientUnits) && (J = l, l = D(l, d.getRadialAttr(v, J), { + gradientUnits: "userSpaceOnUse" + })), M(l, function (a, z) { + "id" !== z && t.push(z, + a) + }), M(B, function (a) { + t.push(a) + }), t = t.join(","), f[t] ? p = f[t].attr("id") : (l.id = p = a.uniqueKey(), f[t] = m = d.createElement(c).attr(l).add(d.defs), m.radAttr = J, m.stops = [], r(B, function (z) { + 0 === z[1].indexOf("rgba") ? (w = a.color(z[1]), k = w.get("rgb"), R = w.get("a")) : (k = z[1], R = 1); + z = d.createElement("stop").attr({ + offset: z[0], + "stop-color": k, + "stop-opacity": R + }).add(m); + m.stops.push(z) + })), A = "url(" + d.url + "#" + p + ")", b.setAttribute(g, A), b.gradient = t, z.toString = function () { + return A + }) + }) + }, + applyTextOutline: function (z) { + var g = this.element, + b, w, c, l, m; - 1 !== z.indexOf("contrast") && (z = z.replace(/contrast/g, this.renderer.getContrast(g.style.fill))); + z = z.split(" "); + w = z[z.length - 1]; + if ((c = z[0]) && "none" !== c && a.svg) { + this.fakeTS = !0; + z = [].slice.call(g.getElementsByTagName("tspan")); + this.ySetter = this.xSetter; + c = c.replace(/(^[\d\.]+)(.*?)$/g, function (a, z, g) { + return 2 * z + g + }); + for (m = z.length; m--;) b = z[m], "highcharts-text-outline" === b.getAttribute("class") && d(z, g.removeChild(b)); + l = g.firstChild; + r(z, function (a, z) { + 0 === z && (a.setAttribute("x", g.getAttribute("x")), + z = g.getAttribute("y"), a.setAttribute("y", z || 0), null === z && g.setAttribute("y", 0)); + a = a.cloneNode(1); + h(a, { + "class": "highcharts-text-outline", + fill: w, + stroke: w, + "stroke-width": c, + "stroke-linejoin": "round" + }); + g.insertBefore(a, l) + }) + } + }, + attr: function (a, g, b, d) { + var z, w = this.element, + c, l = this, + m, f; + "string" === typeof a && void 0 !== g && (z = a, a = {}, a[z] = g); + "string" === typeof a ? l = (this[a + "Getter"] || this._defaultGetter).call(this, a, w) : (M(a, function (z, g) { + m = !1; + d || P(this, g); + this.symbolName && /^(x|y|width|height|r|start|end|innerR|anchorX|anchorY)$/.test(g) && + (c || (this.symbolAttr(a), c = !0), m = !0); + !this.rotation || "x" !== g && "y" !== g || (this.doTransform = !0); + m || (f = this[g + "Setter"] || this._defaultSetter, f.call(this, z, g, w), this.shadows && /^(width|height|visibility|x|y|d|transform|cx|cy|r)$/.test(g) && this.updateShadows(g, z, f)) + }, this), this.afterSetters()); + b && b.call(this); + return l + }, + afterSetters: function () { + this.doTransform && (this.updateTransform(), this.doTransform = !1) + }, + updateShadows: function (a, g, b) { + for (var z = this.shadows, d = z.length; d--;) b.call(z[d], "height" === a ? Math.max(g - + (z[d].cutHeight || 0), 0) : "d" === a ? this.d : g, a, z[d]) + }, + addClass: function (a, g) { + var z = this.attr("class") || ""; - 1 === z.indexOf(a) && (g || (a = (z + (z ? " " : "") + a).replace(" ", " ")), this.attr("class", a)); + return this + }, + hasClass: function (a) { + return -1 !== p(a, (this.attr("class") || "").split(" ")) + }, + removeClass: function (a) { + return this.attr("class", (this.attr("class") || "").replace(a, "")) + }, + symbolAttr: function (a) { + var z = this; + r("x y r start end width height innerR anchorX anchorY".split(" "), function (g) { + z[g] = G(a[g], z[g]) + }); + z.attr({ + d: z.renderer.symbols[z.symbolName](z.x, + z.y, z.width, z.height, z) + }) + }, + clip: function (a) { + return this.attr("clip-path", a ? "url(" + this.renderer.url + "#" + a.id + ")" : "none") + }, + crisp: function (a, g) { + var z; + g = g || a.strokeWidth || 0; + z = Math.round(g) % 2 / 2; + a.x = Math.floor(a.x || this.x || 0) + z; + a.y = Math.floor(a.y || this.y || 0) + z; + a.width = Math.floor((a.width || this.width || 0) - 2 * z); + a.height = Math.floor((a.height || this.height || 0) - 2 * z); + x(a.strokeWidth) && (a.strokeWidth = g); + return a + }, + css: function (a) { + var z = this.styles, + b = {}, + d = this.element, + w, c = "", + m, f = !z, + J = ["textOutline", "textOverflow", + "width" + ]; + a && a.color && (a.fill = a.color); + z && M(a, function (a, g) { + a !== z[g] && (b[g] = a, f = !0) + }); + f && (z && (a = l(z, b)), a && (null === a.width || "auto" === a.width ? delete this.textWidth : "text" === d.nodeName.toLowerCase() && a.width && (w = this.textWidth = g(a.width))), this.styles = a, w && !Q && this.renderer.forExport && delete a.width, d.namespaceURI === this.SVG_NS ? (m = function (a, z) { + return "-" + z.toLowerCase() + }, M(a, function (a, z) { + -1 === p(z, J) && (c += z.replace(/([A-Z])/g, m) + ":" + a + ";") + }), c && h(d, "style", c)) : y(d, a), this.added && ("text" === this.element.nodeName && + this.renderer.buildText(this), a && a.textOutline && this.applyTextOutline(a.textOutline))); + return this + }, + strokeWidth: function () { + return this["stroke-width"] || 0 + }, + on: function (a, g) { + var z = this, + b = z.element; + v && "click" === a ? (b.ontouchstart = function (a) { + z.touchEventFired = Date.now(); + a.preventDefault(); + g.call(b, a) + }, b.onclick = function (a) { + (-1 === N.navigator.userAgent.indexOf("Android") || 1100 < Date.now() - (z.touchEventFired || 0)) && g.call(b, a) + }) : b["on" + a] = g; + return this + }, + setRadialReference: function (a) { + var z = this.renderer.gradients[this.element.gradient]; + this.element.radialReference = a; + z && z.radAttr && z.animate(this.renderer.getRadialAttr(a, z.radAttr)); + return this + }, + translate: function (a, g) { + return this.attr({ + translateX: a, + translateY: g + }) + }, + invert: function (a) { + this.inverted = a; + this.updateTransform(); + return this + }, + updateTransform: function () { + var a = this.translateX || 0, + g = this.translateY || 0, + b = this.scaleX, + d = this.scaleY, + w = this.inverted, + c = this.rotation, + l = this.matrix, + m = this.element; + w && (a += this.width, g += this.height); + a = ["translate(" + a + "," + g + ")"]; + x(l) && a.push("matrix(" + l.join(",") + + ")"); + w ? a.push("rotate(90) scale(-1,1)") : c && a.push("rotate(" + c + " " + G(this.rotationOriginX, m.getAttribute("x"), 0) + " " + G(this.rotationOriginY, m.getAttribute("y") || 0) + ")"); + (x(b) || x(d)) && a.push("scale(" + G(b, 1) + " " + G(d, 1) + ")"); + a.length && m.setAttribute("transform", a.join(" ")) + }, + toFront: function () { + var a = this.element; + a.parentNode.appendChild(a); + return this + }, + align: function (a, g, b) { + var z, w, c, l, m = {}; + w = this.renderer; + c = w.alignedObjects; + var f, J; + if (a) { + if (this.alignOptions = a, this.alignByTranslate = g, !b || H(b)) this.alignTo = + z = b || "renderer", d(c, this), c.push(this), b = null + } else a = this.alignOptions, g = this.alignByTranslate, z = this.alignTo; + b = G(b, w[z], w); + z = a.align; + w = a.verticalAlign; + c = (b.x || 0) + (a.x || 0); + l = (b.y || 0) + (a.y || 0); + "right" === z ? f = 1 : "center" === z && (f = 2); + f && (c += (b.width - (a.width || 0)) / f); + m[g ? "translateX" : "x"] = Math.round(c); + "bottom" === w ? J = 1 : "middle" === w && (J = 2); + J && (l += (b.height - (a.height || 0)) / J); + m[g ? "translateY" : "y"] = Math.round(l); + this[this.placed ? "animate" : "attr"](m); + this.placed = !0; + this.alignAttr = m; + return this + }, + getBBox: function (a, + g) { + var z, b = this.renderer, + d, w = this.element, + c = this.styles, + m, J = this.textStr, + B, k = b.cache, + v = b.cacheKeys, + p; + g = G(g, this.rotation); + d = g * f; + m = c && c.fontSize; + x(J) && (p = J.toString(), -1 === p.indexOf("\x3c") && (p = p.replace(/[0-9]/g, "0")), p += ["", g || 0, m, this.textWidth, c && c.textOverflow].join()); + p && !a && (z = k[p]); + if (!z) { + if (w.namespaceURI === this.SVG_NS || b.forExport) { + try { + (B = this.fakeTS && function (a) { + r(w.querySelectorAll(".highcharts-text-outline"), function (z) { + z.style.display = a + }) + }) && B("none"), z = w.getBBox ? l({}, w.getBBox()) : { + width: w.offsetWidth, + height: w.offsetHeight + }, B && B("") + } catch (W) {} + if (!z || 0 > z.width) z = { + width: 0, + height: 0 + } + } else z = this.htmlGetBBox(); + b.isSVG && (a = z.width, b = z.height, c && "11px" === c.fontSize && 17 === Math.round(b) && (z.height = b = 14), g && (z.width = Math.abs(b * Math.sin(d)) + Math.abs(a * Math.cos(d)), z.height = Math.abs(b * Math.cos(d)) + Math.abs(a * Math.sin(d)))); + if (p && 0 < z.height) { + for (; 250 < v.length;) delete k[v.shift()]; + k[p] || v.push(p); + k[p] = z + } + } + return z + }, + show: function (a) { + return this.attr({ + visibility: a ? "inherit" : "visible" + }) + }, + hide: function () { + return this.attr({ + visibility: "hidden" + }) + }, + fadeOut: function (a) { + var z = this; + z.animate({ + opacity: 0 + }, { + duration: a || 150, + complete: function () { + z.attr({ + y: -9999 + }) + } + }) + }, + add: function (a) { + var z = this.renderer, + g = this.element, + b; + a && (this.parentGroup = a); + this.parentInverted = a && a.inverted; + void 0 !== this.textStr && z.buildText(this); + this.added = !0; + if (!a || a.handleZ || this.zIndex) b = this.zIndexSetter(); + b || (a ? a.element : z.box).appendChild(g); + if (this.onAdd) this.onAdd(); + return this + }, + safeRemoveChild: function (a) { + var z = a.parentNode; + z && z.removeChild(a) + }, + destroy: function () { + var a = + this, + g = a.element || {}, + b = a.renderer.isSVG && "SPAN" === g.nodeName && a.parentGroup, + w = g.ownerSVGElement, + c = a.clipPath; + g.onclick = g.onmouseout = g.onmouseover = g.onmousemove = g.point = null; + P(a); + c && w && (r(w.querySelectorAll("[clip-path],[CLIP-PATH]"), function (a) { + var g = a.getAttribute("clip-path"), + z = c.element.id; + (-1 < g.indexOf("(#" + z + ")") || -1 < g.indexOf('("#' + z + '")')) && a.removeAttribute("clip-path") + }), a.clipPath = c.destroy()); + if (a.stops) { + for (w = 0; w < a.stops.length; w++) a.stops[w] = a.stops[w].destroy(); + a.stops = null + } + a.safeRemoveChild(g); + for (a.destroyShadows(); b && b.div && 0 === b.div.childNodes.length;) g = b.parentGroup, a.safeRemoveChild(b.div), delete b.div, b = g; + a.alignTo && d(a.renderer.alignedObjects, a); + M(a, function (g, z) { + delete a[z] + }); + return null + }, + shadow: function (a, g, b) { + var z = [], + d, w, c = this.element, + l, m, f, J; + if (!a) this.destroyShadows(); + else if (!this.shadows) { + m = G(a.width, 3); + f = (a.opacity || .15) / m; + J = this.parentInverted ? "(-1,-1)" : "(" + G(a.offsetX, 1) + ", " + G(a.offsetY, 1) + ")"; + for (d = 1; d <= m; d++) w = c.cloneNode(0), l = 2 * m + 1 - 2 * d, h(w, { + isShadow: "true", + stroke: a.color || + "#000000", + "stroke-opacity": f * d, + "stroke-width": l, + transform: "translate" + J, + fill: "none" + }), b && (h(w, "height", Math.max(h(w, "height") - l, 0)), w.cutHeight = l), g ? g.element.appendChild(w) : c.parentNode && c.parentNode.insertBefore(w, c), z.push(w); + this.shadows = z + } + return this + }, + destroyShadows: function () { + r(this.shadows || [], function (a) { + this.safeRemoveChild(a) + }, this); + this.shadows = void 0 + }, + xGetter: function (a) { + "circle" === this.element.nodeName && ("x" === a ? a = "cx" : "y" === a && (a = "cy")); + return this._defaultGetter(a) + }, + _defaultGetter: function (a) { + a = + G(this[a + "Value"], this[a], this.element ? this.element.getAttribute(a) : null, 0); + /^[\-0-9\.]+$/.test(a) && (a = parseFloat(a)); + return a + }, + dSetter: function (a, g, b) { + a && a.join && (a = a.join(" ")); + /(NaN| {2}|^$)/.test(a) && (a = "M 0 0"); + this[g] !== a && (b.setAttribute(g, a), this[g] = a) + }, + dashstyleSetter: function (a) { + var b, z = this["stroke-width"]; + "inherit" === z && (z = 1); + if (a = a && a.toLowerCase()) { + a = a.replace("shortdashdotdot", "3,1,1,1,1,1,").replace("shortdashdot", "3,1,1,1").replace("shortdot", "1,1,").replace("shortdash", "3,1,").replace("longdash", + "8,3,").replace(/dot/g, "1,3,").replace("dash", "4,3,").replace(/,$/, "").split(","); + for (b = a.length; b--;) a[b] = g(a[b]) * z; + a = a.join(",").replace(/NaN/g, "none"); + this.element.setAttribute("stroke-dasharray", a) + } + }, + alignSetter: function (a) { + this.alignValue = a; + this.element.setAttribute("text-anchor", { + left: "start", + center: "middle", + right: "end" + } [a]) + }, + opacitySetter: function (a, g, b) { + this[g] = a; + b.setAttribute(g, a) + }, + titleSetter: function (a) { + var g = this.element.getElementsByTagName("title")[0]; + g || (g = k.createElementNS(this.SVG_NS, + "title"), this.element.appendChild(g)); + g.firstChild && g.removeChild(g.firstChild); + g.appendChild(k.createTextNode(String(G(a), "").replace(/<[^>]*>/g, "").replace(/</g, "\x3c").replace(/>/g, "\x3e"))) + }, + textSetter: function (a) { + a !== this.textStr && (delete this.bBox, this.textStr = a, this.added && this.renderer.buildText(this)) + }, + fillSetter: function (a, g, b) { + "string" === typeof a ? b.setAttribute(g, a) : a && this.complexColor(a, g, b) + }, + visibilitySetter: function (a, g, b) { + "inherit" === a ? b.removeAttribute(g) : this[g] !== a && b.setAttribute(g, + a); + this[g] = a + }, + zIndexSetter: function (a, b) { + var d = this.renderer, + w = this.parentGroup, + z = (w || d).element || d.box, + c, l = this.element, + m, f, d = z === d.box; + c = this.added; + var J; + x(a) ? (l.setAttribute("data-z-index", a), a = +a, this[b] === a && (c = !1)) : x(this[b]) && l.removeAttribute("data-z-index"); + this[b] = a; + if (c) { + (a = this.zIndex) && w && (w.handleZ = !0); + b = z.childNodes; + for (J = b.length - 1; 0 <= J && !m; J--) + if (w = b[J], c = w.getAttribute("data-z-index"), f = !x(c), w !== l) + if (0 > a && f && !d && !J) z.insertBefore(l, b[J]), m = !0; + else if (g(c) <= a || f && (!x(a) || 0 <= a)) z.insertBefore(l, + b[J + 1] || null), m = !0; + m || (z.insertBefore(l, b[d ? 3 : 0] || null), m = !0) + } + return m + }, + _defaultSetter: function (a, g, b) { + b.setAttribute(g, a) + } + }); + C.prototype.yGetter = C.prototype.xGetter; + C.prototype.translateXSetter = C.prototype.translateYSetter = C.prototype.rotationSetter = C.prototype.verticalAlignSetter = C.prototype.rotationOriginXSetter = C.prototype.rotationOriginYSetter = C.prototype.scaleXSetter = C.prototype.scaleYSetter = C.prototype.matrixSetter = function (a, g) { + this[g] = a; + this.doTransform = !0 + }; + C.prototype["stroke-widthSetter"] = + C.prototype.strokeSetter = function (a, g, b) { + this[g] = a; + this.stroke && this["stroke-width"] ? (C.prototype.fillSetter.call(this, this.stroke, "stroke", b), b.setAttribute("stroke-width", this["stroke-width"]), this.hasStroke = !0) : "stroke-width" === g && 0 === a && this.hasStroke && (b.removeAttribute("stroke"), this.hasStroke = !1) + }; + E = a.SVGRenderer = function () { + this.init.apply(this, arguments) + }; + l(E.prototype, { + Element: C, + SVG_NS: J, + init: function (a, g, b, d, w, c) { + var z; + d = this.createElement("svg").attr({ + version: "1.1", + "class": "highcharts-root" + }).css(this.getStyle(d)); + z = d.element; + a.appendChild(z); + h(a, "dir", "ltr"); - 1 === a.innerHTML.indexOf("xmlns") && h(z, "xmlns", this.SVG_NS); + this.isSVG = !0; + this.box = z; + this.boxWrapper = d; + this.alignedObjects = []; + this.url = (t || m) && k.getElementsByTagName("base").length ? N.location.href.replace(/#.*?$/, "").replace(/<[^>]*>/g, "").replace(/([\('\)])/g, "\\$1").replace(/ /g, "%20") : ""; + this.createElement("desc").add().element.appendChild(k.createTextNode("Created with Highcharts 6.1.1")); + this.defs = this.createElement("defs").add(); + this.allowHTML = c; + this.forExport = w; + this.gradients = {}; + this.cache = {}; + this.cacheKeys = []; + this.imgCount = 0; + this.setSize(g, b, !1); + var l; + t && a.getBoundingClientRect && (g = function () { + y(a, { + left: 0, + top: 0 + }); + l = a.getBoundingClientRect(); + y(a, { + left: Math.ceil(l.left) - l.left + "px", + top: Math.ceil(l.top) - l.top + "px" + }) + }, g(), this.unSubPixelFix = F(N, "resize", g)) + }, + getStyle: function (a) { + return this.style = l({ + fontFamily: '"Lucida Grande", "Lucida Sans Unicode", Arial, Helvetica, sans-serif', + fontSize: "12px" + }, a) + }, + setStyle: function (a) { + this.boxWrapper.css(this.getStyle(a)) + }, + isHidden: function () { + return !this.boxWrapper.getBBox().width + }, + destroy: function () { + var a = this.defs; + this.box = null; + this.boxWrapper = this.boxWrapper.destroy(); + c(this.gradients || {}); + this.gradients = null; + a && (this.defs = a.destroy()); + this.unSubPixelFix && this.unSubPixelFix(); + return this.alignedObjects = null + }, + createElement: function (a) { + var g = new this.Element; + g.init(this, a); + return g + }, + draw: B, + getRadialAttr: function (a, g) { + return { + cx: a[0] - a[2] / 2 + g.cx * a[2], + cy: a[1] - a[2] / 2 + g.cy * a[2], + r: g.r * a[2] + } + }, + getSpanWidth: function (a) { + return a.getBBox(!0).width + }, + applyEllipsis: function (a, g, b, d) { + var w = a.rotation, + c = b, + z, l = 0, + m = b.length, + J = function (a) { + g.removeChild(g.firstChild); + a && g.appendChild(k.createTextNode(a)) + }, + f; + a.rotation = 0; + c = this.getSpanWidth(a, g); + if (f = c > d) { + for (; l <= m;) z = Math.ceil((l + m) / 2), c = b.substring(0, z) + "\u2026", J(c), c = this.getSpanWidth(a, g), l === m ? l = m + 1 : c > d ? m = z - 1 : l = z; + 0 === m && J("") + } + a.rotation = w; + return f + }, + escapes: { + "\x26": "\x26amp;", + "\x3c": "\x26lt;", + "\x3e": "\x26gt;", + "'": "\x26#39;", + '"': "\x26quot;" + }, + buildText: function (a) { + var d = a.element, + w = this, + c = w.forExport, + l = G(a.textStr, "").toString(), + z = -1 !== l.indexOf("\x3c"), + m = d.childNodes, + f, B = h(d, "x"), + v = a.styles, + D = a.textWidth, + t = v && v.lineHeight, + A = v && v.textOutline, + e = v && "ellipsis" === v.textOverflow, + P = v && "nowrap" === v.whiteSpace, + O = v && v.fontSize, + q, x, I = m.length, + v = D && !a.added && this.box, + H = function (a) { + var b; + b = /(px|em)$/.test(a && a.style.fontSize) ? a.style.fontSize : O || w.style.fontSize || 12; + return t ? g(t) : w.fontMetrics(b, a.getAttribute("style") ? a : d).h + }, + N = function (a, g) { + M(w.escapes, function (b, d) { + g && -1 !== p(b, g) || (a = a.toString().replace(new RegExp(b, + "g"), d)) + }); + return a + }, + u = function (a, g) { + var b; + b = a.indexOf("\x3c"); + a = a.substring(b, a.indexOf("\x3e") - b); + b = a.indexOf(g + "\x3d"); + if (-1 !== b && (b = b + g.length + 1, g = a.charAt(b), '"' === g || "'" === g)) return a = a.substring(b + 1), a.substring(0, a.indexOf(g)) + }; + q = [l, e, P, t, A, O, D].join(); + if (q !== a.textCache) { + for (a.textCache = q; I--;) d.removeChild(m[I]); + z || A || e || D || -1 !== l.indexOf(" ") ? (v && v.appendChild(d), l = z ? l.replace(/<(b|strong)>/g, '\x3cspan style\x3d"font-weight:bold"\x3e').replace(/<(i|em)>/g, '\x3cspan style\x3d"font-style:italic"\x3e').replace(//g, "\x3c/span\x3e").split(//g) : [l], l = b(l, function (a) { + return "" !== a + }), r(l, function (g, b) { + var l, z = 0; + g = g.replace(/^\s+|\s+$/g, "").replace(//g, "\x3c/span\x3e|||"); + l = g.split("|||"); + r(l, function (g) { + if ("" !== g || 1 === l.length) { + var m = {}, + v = k.createElementNS(w.SVG_NS, "tspan"), + p, r; + (p = u(g, "class")) && h(v, "class", p); + if (p = u(g, "style")) p = p.replace(/(;| |^)color([ :])/, "$1fill$2"), h(v, "style", p); + (r = u(g, "href")) && !c && (h(v, "onclick", + 'location.href\x3d"' + r + '"'), h(v, "class", "highcharts-anchor"), y(v, { + cursor: "pointer" + })); + g = N(g.replace(/<[a-zA-Z\/](.|\n)*?>/g, "") || " "); + if (" " !== g) { + v.appendChild(k.createTextNode(g)); + z ? m.dx = 0 : b && null !== B && (m.x = B); + h(v, m); + d.appendChild(v); + !z && x && (!Q && c && y(v, { + display: "block" + }), h(v, "dy", H(v))); + if (D) { + m = g.replace(/([^\^])-/g, "$1- ").split(" "); + r = 1 < l.length || b || 1 < m.length && !P; + var t = [], + A, O = H(v), + q = a.rotation; + for (e && (f = w.applyEllipsis(a, v, g, D)); !e && r && (m.length || t.length);) a.rotation = 0, A = w.getSpanWidth(a, v), + g = A > D, void 0 === f && (f = g), g && 1 !== m.length ? (v.removeChild(v.firstChild), t.unshift(m.pop())) : (m = t, t = [], m.length && !P && (v = k.createElementNS(J, "tspan"), h(v, { + dy: O, + x: B + }), p && h(v, "style", p), d.appendChild(v)), A > D && (D = A + 1)), m.length && v.appendChild(k.createTextNode(m.join(" ").replace(/- /g, "-"))); + a.rotation = q + } + z++ + } + } + }); + x = x || d.childNodes.length + }), e && f && a.attr("title", N(a.textStr, ["\x26lt;", "\x26gt;"])), v && v.removeChild(d), A && a.applyTextOutline && a.applyTextOutline(A)) : d.appendChild(k.createTextNode(N(l))) + } + }, + getContrast: function (a) { + a = + u(a).rgba; + return 510 < a[0] + a[1] + a[2] ? "#000000" : "#FFFFFF" + }, + button: function (a, g, b, d, w, c, m, f, J) { + var z = this.label(a, g, b, J, null, null, null, null, "button"), + v = 0; + z.attr(D({ + padding: 8, + r: 2 + }, w)); + var B, k, p, r; + w = D({ + fill: "#f7f7f7", + stroke: "#cccccc", + "stroke-width": 1, + style: { + color: "#333333", + cursor: "pointer", + fontWeight: "normal" + } + }, w); + B = w.style; + delete w.style; + c = D(w, { + fill: "#e6e6e6" + }, c); + k = c.style; + delete c.style; + m = D(w, { + fill: "#e6ebf5", + style: { + color: "#000000", + fontWeight: "bold" + } + }, m); + p = m.style; + delete m.style; + f = D(w, { + style: { + color: "#cccccc" + } + }, + f); + r = f.style; + delete f.style; + F(z.element, L ? "mouseover" : "mouseenter", function () { + 3 !== v && z.setState(1) + }); + F(z.element, L ? "mouseout" : "mouseleave", function () { + 3 !== v && z.setState(v) + }); + z.setState = function (a) { + 1 !== a && (z.state = v = a); + z.removeClass(/highcharts-button-(normal|hover|pressed|disabled)/).addClass("highcharts-button-" + ["normal", "hover", "pressed", "disabled"][a || 0]); + z.attr([w, c, m, f][a || 0]).css([B, k, p, r][a || 0]) + }; + z.attr(w).css(l({ + cursor: "default" + }, B)); + return z.on("click", function (a) { + 3 !== v && d.call(z, a) + }) + }, + crispLine: function (a, + g) { + a[1] === a[4] && (a[1] = a[4] = Math.round(a[1]) - g % 2 / 2); + a[2] === a[5] && (a[2] = a[5] = Math.round(a[2]) + g % 2 / 2); + return a + }, + path: function (a) { + var g = { + fill: "none" + }; + I(a) ? g.d = a : A(a) && l(g, a); + return this.createElement("path").attr(g) + }, + circle: function (a, g, b) { + a = A(a) ? a : { + x: a, + y: g, + r: b + }; + g = this.createElement("circle"); + g.xSetter = g.ySetter = function (a, g, b) { + b.setAttribute("c" + g, a) + }; + return g.attr(a) + }, + arc: function (a, g, b, d, w, c) { + A(a) ? (d = a, g = d.y, b = d.r, a = d.x) : d = { + innerR: d, + start: w, + end: c + }; + a = this.symbol("arc", a, g, b, b, d); + a.r = b; + return a + }, + rect: function (a, + g, b, d, w, c) { + w = A(a) ? a.r : w; + var l = this.createElement("rect"); + a = A(a) ? a : void 0 === a ? {} : { + x: a, + y: g, + width: Math.max(b, 0), + height: Math.max(d, 0) + }; + void 0 !== c && (a.strokeWidth = c, a = l.crisp(a)); + a.fill = "none"; + w && (a.r = w); + l.rSetter = function (a, g, b) { + h(b, { + rx: a, + ry: a + }) + }; + return l.attr(a) + }, + setSize: function (a, g, b) { + var d = this.alignedObjects, + w = d.length; + this.width = a; + this.height = g; + for (this.boxWrapper.animate({ + width: a, + height: g + }, { + step: function () { + this.attr({ + viewBox: "0 0 " + this.attr("width") + " " + this.attr("height") + }) + }, + duration: G(b, !0) ? + void 0 : 0 + }); w--;) d[w].align() + }, + g: function (a) { + var g = this.createElement("g"); + return a ? g.attr({ + "class": "highcharts-" + a + }) : g + }, + image: function (a, g, b, d, w, c) { + var m = { + preserveAspectRatio: "none" + }, + f, J = function (a, g) { + a.setAttributeNS ? a.setAttributeNS("http://www.w3.org/1999/xlink", "href", g) : a.setAttribute("hc-svg-href", g) + }, + z = function (g) { + J(f.element, a); + c.call(f, g) + }; + 1 < arguments.length && l(m, { + x: g, + y: b, + width: d, + height: w + }); + f = this.createElement("image").attr(m); + c ? (J(f.element, "data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw\x3d\x3d"), + m = new N.Image, F(m, "load", z), m.src = a, m.complete && z({})) : J(f.element, a); + return f + }, + symbol: function (a, g, b, d, w, c) { + var m = this, + f, J = /^url\((.*?)\)$/, + z = J.test(a), + v = !z && (this.symbols[a] ? a : "circle"), + B = v && this.symbols[v], + p = x(g) && B && B.call(this.symbols, Math.round(g), Math.round(b), d, w, c), + D, t; + B ? (f = this.path(p), f.attr("fill", "none"), l(f, { + symbolName: v, + x: g, + y: b, + width: d, + height: w + }), c && l(f, c)) : z && (D = a.match(J)[1], f = this.image(D), f.imgwidth = G(O[D] && O[D].width, c && c.width), f.imgheight = G(O[D] && O[D].height, c && c.height), t = function () { + f.attr({ + width: f.width, + height: f.height + }) + }, r(["width", "height"], function (a) { + f[a + "Setter"] = function (a, g) { + var b = {}, + d = this["img" + g], + w = "width" === g ? "translateX" : "translateY"; + this[g] = a; + x(d) && (this.element && this.element.setAttribute(g, d), this.alignByTranslate || (b[w] = ((this[g] || 0) - d) / 2, this.attr(b))) + } + }), x(g) && f.attr({ + x: g, + y: b + }), f.isImg = !0, x(f.imgwidth) && x(f.imgheight) ? t() : (f.attr({ + width: 0, + height: 0 + }), q("img", { + onload: function () { + var a = e[m.chartIndex]; + 0 === this.width && (y(this, { + position: "absolute", + top: "-999em" + }), k.body.appendChild(this)); + O[D] = { + width: this.width, + height: this.height + }; + f.imgwidth = this.width; + f.imgheight = this.height; + f.element && t(); + this.parentNode && this.parentNode.removeChild(this); + m.imgCount--; + if (!m.imgCount && a && a.onload) a.onload() + }, + src: D + }), this.imgCount++)); + return f + }, + symbols: { + circle: function (a, g, b, d) { + return this.arc(a + b / 2, g + d / 2, b / 2, d / 2, { + start: 0, + end: 2 * Math.PI, + open: !1 + }) + }, + square: function (a, g, b, d) { + return ["M", a, g, "L", a + b, g, a + b, g + d, a, g + d, "Z"] + }, + triangle: function (a, g, b, d) { + return ["M", a + b / 2, g, "L", a + b, g + d, a, g + d, "Z"] + }, + "triangle-down": function (a, + g, b, d) { + return ["M", a, g, "L", a + b, g, a + b / 2, g + d, "Z"] + }, + diamond: function (a, g, b, d) { + return ["M", a + b / 2, g, "L", a + b, g + d / 2, a + b / 2, g + d, a, g + d / 2, "Z"] + }, + arc: function (a, g, b, d, w) { + var c = w.start, + l = w.r || b, + m = w.r || d || b, + f = w.end - .001; + b = w.innerR; + d = G(w.open, .001 > Math.abs(w.end - w.start - 2 * Math.PI)); + var J = Math.cos(c), + v = Math.sin(c), + z = Math.cos(f), + f = Math.sin(f); + w = .001 > w.end - c - Math.PI ? 0 : 1; + l = ["M", a + l * J, g + m * v, "A", l, m, 0, w, 1, a + l * z, g + m * f]; + x(b) && l.push(d ? "M" : "L", a + b * z, g + b * f, "A", b, b, 0, w, 0, a + b * J, g + b * v); + l.push(d ? "" : "Z"); + return l + }, + callout: function (a, + g, b, d, w) { + var c = Math.min(w && w.r || 0, b, d), + l = c + 6, + m = w && w.anchorX; + w = w && w.anchorY; + var f; + f = ["M", a + c, g, "L", a + b - c, g, "C", a + b, g, a + b, g, a + b, g + c, "L", a + b, g + d - c, "C", a + b, g + d, a + b, g + d, a + b - c, g + d, "L", a + c, g + d, "C", a, g + d, a, g + d, a, g + d - c, "L", a, g + c, "C", a, g, a, g, a + c, g]; + m && m > b ? w > g + l && w < g + d - l ? f.splice(13, 3, "L", a + b, w - 6, a + b + 6, w, a + b, w + 6, a + b, g + d - c) : f.splice(13, 3, "L", a + b, d / 2, m, w, a + b, d / 2, a + b, g + d - c) : m && 0 > m ? w > g + l && w < g + d - l ? f.splice(33, 3, "L", a, w + 6, a - 6, w, a, w - 6, a, g + c) : f.splice(33, 3, "L", a, d / 2, m, w, a, d / 2, a, g + c) : w && w > d && m > a + l && m < a + b - l ? f.splice(23, + 3, "L", m + 6, g + d, m, g + d + 6, m - 6, g + d, a + c, g + d) : w && 0 > w && m > a + l && m < a + b - l && f.splice(3, 3, "L", m - 6, g, m, g - 6, m + 6, g, b - c, g); + return f + } + }, + clipRect: function (g, b, d, w) { + var c = a.uniqueKey(), + l = this.createElement("clipPath").attr({ + id: c + }).add(this.defs); + g = this.rect(g, b, d, w, 0).add(l); + g.id = c; + g.clipPath = l; + g.count = 0; + return g + }, + text: function (a, g, b, d) { + var w = {}; + if (d && (this.allowHTML || !this.forExport)) return this.html(a, g, b); + w.x = Math.round(g || 0); + b && (w.y = Math.round(b)); + if (a || 0 === a) w.text = a; + a = this.createElement("text").attr(w); + d || (a.xSetter = + function (a, g, b) { + var d = b.getElementsByTagName("tspan"), + w, c = b.getAttribute(g), + l; + for (l = 0; l < d.length; l++) w = d[l], w.getAttribute(g) === c && w.setAttribute(g, a); + b.setAttribute(g, a) + }); + return a + }, + fontMetrics: function (a, b) { + a = a || b && b.style && b.style.fontSize || this.style && this.style.fontSize; + a = /px/.test(a) ? g(a) : /em/.test(a) ? parseFloat(a) * (b ? this.fontMetrics(null, b.parentNode).f : 16) : 12; + b = 24 > a ? a + 3 : Math.round(1.2 * a); + return { + h: b, + b: Math.round(.8 * b), + f: a + } + }, + rotCorr: function (a, g, b) { + var d = a; + g && b && (d = Math.max(d * Math.cos(g * f), + 4)); + return { + x: -a / 3 * Math.sin(g * f), + y: d + } + }, + label: function (g, b, d, c, m, f, J, v, B) { + var k = this, + p = k.g("button" !== B && "label"), + t = p.text = k.text("", 0, 0, J).attr({ + zIndex: 1 + }), + z, A, Q = 0, + e = 3, + P = 0, + h, O, q, G, I, H = {}, + N, y, M = /^url\((.*?)\)$/.test(c), + u = M, + n, L, R, U; + B && p.addClass("highcharts-" + B); + u = M; + n = function () { + return (N || 0) % 2 / 2 + }; + L = function () { + var a = t.element.style, + g = {}; + A = (void 0 === h || void 0 === O || I) && x(t.textStr) && t.getBBox(); + p.width = (h || A.width || 0) + 2 * e + P; + p.height = (O || A.height || 0) + 2 * e; + y = e + k.fontMetrics(a && a.fontSize, t).b; + u && (z || (p.box = + z = k.symbols[c] || M ? k.symbol(c) : k.rect(), z.addClass(("button" === B ? "" : "highcharts-label-box") + (B ? " highcharts-" + B + "-box" : "")), z.add(p), a = n(), g.x = a, g.y = (v ? -y : 0) + a), g.width = Math.round(p.width), g.height = Math.round(p.height), z.attr(l(g, H)), H = {}) + }; + R = function () { + var a = P + e, + g; + g = v ? 0 : y; + x(h) && A && ("center" === I || "right" === I) && (a += { + center: .5, + right: 1 + } [I] * (h - A.width)); + if (a !== t.x || g !== t.y) t.attr("x", a), t.hasBoxWidthChanged && (A = t.getBBox(!0), L()), void 0 !== g && t.attr("y", g); + t.x = a; + t.y = g + }; + U = function (a, g) { + z ? z.attr(a, g) : H[a] = + g + }; + p.onAdd = function () { + t.add(p); + p.attr({ + text: g || 0 === g ? g : "", + x: b, + y: d + }); + z && x(m) && p.attr({ + anchorX: m, + anchorY: f + }) + }; + p.widthSetter = function (g) { + h = a.isNumber(g) ? g : null + }; + p.heightSetter = function (a) { + O = a + }; + p["text-alignSetter"] = function (a) { + I = a + }; + p.paddingSetter = function (a) { + x(a) && a !== e && (e = p.padding = a, R()) + }; + p.paddingLeftSetter = function (a) { + x(a) && a !== P && (P = a, R()) + }; + p.alignSetter = function (a) { + a = { + left: 0, + center: .5, + right: 1 + } [a]; + a !== Q && (Q = a, A && p.attr({ + x: q + })) + }; + p.textSetter = function (a) { + void 0 !== a && t.textSetter(a); + L(); + R() + }; + p["stroke-widthSetter"] = + function (a, g) { + a && (u = !0); + N = this["stroke-width"] = a; + U(g, a) + }; + p.strokeSetter = p.fillSetter = p.rSetter = function (a, g) { + "r" !== g && ("fill" === g && a && (u = !0), p[g] = a); + U(g, a) + }; + p.anchorXSetter = function (a, g) { + m = p.anchorX = a; + U(g, Math.round(a) - n() - q) + }; + p.anchorYSetter = function (a, g) { + f = p.anchorY = a; + U(g, a - G) + }; + p.xSetter = function (a) { + p.x = a; + Q && (a -= Q * ((h || A.width) + 2 * e), p["forceAnimate:x"] = !0); + q = Math.round(a); + p.attr("translateX", q) + }; + p.ySetter = function (a) { + G = p.y = Math.round(a); + p.attr("translateY", G) + }; + var S = p.css; + return l(p, { + css: function (a) { + if (a) { + var g = {}; + a = D(a); + r(p.textProps, function (b) { + void 0 !== a[b] && (g[b] = a[b], delete a[b]) + }); + t.css(g); + "width" in g && L() + } + return S.call(p, a) + }, + getBBox: function () { + return { + width: A.width + 2 * e, + height: A.height + 2 * e, + x: A.x - e, + y: A.y - e + } + }, + shadow: function (a) { + a && (L(), z && z.shadow(a)); + return p + }, + destroy: function () { + w(p.element, "mouseenter"); + w(p.element, "mouseleave"); + t && (t = t.destroy()); + z && (z = z.destroy()); + C.prototype.destroy.call(p); + p = k = L = R = U = null + } + }) + } + }); + a.Renderer = E + })(K); + (function (a) { + var C = a.attr, + E = a.createElement, + F = a.css, + n = a.defined, + h = a.each, + e = a.extend, + u = a.isFirefox, + y = a.isMS, + q = a.isWebKit, + x = a.pick, + f = a.pInt, + c = a.SVGRenderer, + k = a.win, + r = a.wrap; + e(a.SVGElement.prototype, { + htmlCss: function (a) { + var d = this.element; + if (d = a && "SPAN" === d.tagName && a.width) delete a.width, this.textWidth = d, this.htmlUpdateTransform(); + a && "ellipsis" === a.textOverflow && (a.whiteSpace = "nowrap", a.overflow = "hidden"); + this.styles = e(this.styles, a); + F(this.element, a); + return this + }, + htmlGetBBox: function () { + var a = this.element; + return { + x: a.offsetLeft, + y: a.offsetTop, + width: a.offsetWidth, + height: a.offsetHeight + } + }, + htmlUpdateTransform: function () { + if (this.added) { + var a = this.renderer, + d = this.element, + b = this.translateX || 0, + c = this.translateY || 0, + p = this.x || 0, + k = this.y || 0, + t = this.textAlign || "left", + r = { + left: 0, + center: .5, + right: 1 + } [t], + A = this.styles, + e = A && A.whiteSpace; + F(d, { + marginLeft: b, + marginTop: c + }); + this.shadows && h(this.shadows, function (a) { + F(a, { + marginLeft: b + 1, + marginTop: c + 1 + }) + }); + this.inverted && h(d.childNodes, function (b) { + a.invertChild(b, d) + }); + if ("SPAN" === d.tagName) { + var A = this.rotation, + m = this.textWidth && f(this.textWidth), + D = [A, t, d.innerHTML, + this.textWidth, this.textAlign + ].join(), + B; + (B = m !== this.oldTextWidth) && !(B = m > this.oldTextWidth) && ((B = this.textPxLength) || (F(d, { + width: "", + whiteSpace: e || "nowrap" + }), B = d.offsetWidth), B = B > m); + B && /[ \-]/.test(d.textContent || d.innerText) ? (F(d, { + width: m + "px", + display: "block", + whiteSpace: e || "normal" + }), this.oldTextWidth = m, this.hasBoxWidthChanged = !0) : this.hasBoxWidthChanged = !1; + D !== this.cTT && (e = a.fontMetrics(d.style.fontSize).b, n(A) && A !== (this.oldRotation || 0) && this.setSpanRotation(A, r, e), this.getSpanCorrection(!n(A) && + this.textPxLength || d.offsetWidth, e, r, A, t)); + F(d, { + left: p + (this.xCorr || 0) + "px", + top: k + (this.yCorr || 0) + "px" + }); + this.cTT = D; + this.oldRotation = A + } + } else this.alignOnAdd = !0 + }, + setSpanRotation: function (a, d, b) { + var c = {}, + l = this.renderer.getTransformKey(); + c[l] = c.transform = "rotate(" + a + "deg)"; + c[l + (u ? "Origin" : "-origin")] = c.transformOrigin = 100 * d + "% " + b + "px"; + F(this.element, c) + }, + getSpanCorrection: function (a, d, b) { + this.xCorr = -a * b; + this.yCorr = -d + } + }); + e(c.prototype, { + getTransformKey: function () { + return y && !/Edge/.test(k.navigator.userAgent) ? + "-ms-transform" : q ? "-webkit-transform" : u ? "MozTransform" : k.opera ? "-o-transform" : "" + }, + html: function (a, d, b) { + var c = this.createElement("span"), + l = c.element, + f = c.renderer, + k = f.isSVG, + q = function (a, b) { + h(["opacity", "visibility"], function (d) { + r(a, d + "Setter", function (a, d, c, m) { + a.call(this, d, c, m); + b[c] = d + }) + }); + a.addedSetters = !0 + }; + c.textSetter = function (a) { + a !== l.innerHTML && delete this.bBox; + this.textStr = a; + l.innerHTML = x(a, ""); + c.doTransform = !0 + }; + k && q(c, c.element.style); + c.xSetter = c.ySetter = c.alignSetter = c.rotationSetter = function (a, + b) { + "align" === b && (b = "textAlign"); + c[b] = a; + c.doTransform = !0 + }; + c.afterSetters = function () { + this.doTransform && (this.htmlUpdateTransform(), this.doTransform = !1) + }; + c.attr({ + text: a, + x: Math.round(d), + y: Math.round(b) + }).css({ + fontFamily: this.style.fontFamily, + fontSize: this.style.fontSize, + position: "absolute" + }); + l.style.whiteSpace = "nowrap"; + c.css = c.htmlCss; + k && (c.add = function (a) { + var b, d = f.box.parentNode, + p = []; + if (this.parentGroup = a) { + if (b = a.div, !b) { + for (; a;) p.push(a), a = a.parentGroup; + h(p.reverse(), function (a) { + function m(g, b) { + a[b] = + g; + "translateX" === b ? l.left = g + "px" : l.top = g + "px"; + a.doTransform = !0 + } + var l, g = C(a.element, "class"); + g && (g = { + className: g + }); + b = a.div = a.div || E("div", g, { + position: "absolute", + left: (a.translateX || 0) + "px", + top: (a.translateY || 0) + "px", + display: a.display, + opacity: a.opacity, + pointerEvents: a.styles && a.styles.pointerEvents + }, b || d); + l = b.style; + e(a, { + classSetter: function (a) { + return function (g) { + this.element.setAttribute("class", g); + a.className = g + } + }(b), + on: function () { + p[0].div && c.on.apply({ + element: p[0].div + }, arguments); + return a + }, + translateXSetter: m, + translateYSetter: m + }); + a.addedSetters || q(a, l) + }) + } + } else b = d; + b.appendChild(l); + c.added = !0; + c.alignOnAdd && c.htmlUpdateTransform(); + return c + }); + return c + } + }) + })(K); + (function (a) { + var C = a.defined, + E = a.each, + F = a.extend, + n = a.merge, + h = a.pick, + e = a.timeUnits, + u = a.win; + a.Time = function (a) { + this.update(a, !1) + }; + a.Time.prototype = { + defaultOptions: {}, + update: function (e) { + var q = h(e && e.useUTC, !0), + x = this; + this.options = e = n(!0, this.options || {}, e); + this.Date = e.Date || u.Date; + this.timezoneOffset = (this.useUTC = q) && e.timezoneOffset; + this.getTimezoneOffset = + this.timezoneOffsetFunction(); + (this.variableTimezone = !(q && !e.getTimezoneOffset && !e.timezone)) || this.timezoneOffset ? (this.get = function (a, c) { + var f = c.getTime(), + r = f - x.getTimezoneOffset(c); + c.setTime(r); + a = c["getUTC" + a](); + c.setTime(f); + return a + }, this.set = function (f, c, k) { + var r; + if (-1 !== a.inArray(f, ["Milliseconds", "Seconds", "Minutes"])) c["set" + f](k); + else r = x.getTimezoneOffset(c), r = c.getTime() - r, c.setTime(r), c["setUTC" + f](k), f = x.getTimezoneOffset(c), r = c.getTime() + f, c.setTime(r) + }) : q ? (this.get = function (a, c) { + return c["getUTC" + + a]() + }, this.set = function (a, c, k) { + return c["setUTC" + a](k) + }) : (this.get = function (a, c) { + return c["get" + a]() + }, this.set = function (a, c, k) { + return c["set" + a](k) + }) + }, + makeTime: function (e, q, x, f, c, k) { + var r, l, d; + this.useUTC ? (r = this.Date.UTC.apply(0, arguments), l = this.getTimezoneOffset(r), r += l, d = this.getTimezoneOffset(r), l !== d ? r += d - l : l - 36E5 !== this.getTimezoneOffset(r - 36E5) || a.isSafari || (r -= 36E5)) : r = (new this.Date(e, q, h(x, 1), h(f, 0), h(c, 0), h(k, 0))).getTime(); + return r + }, + timezoneOffsetFunction: function () { + var e = this, + h = this.options, + x = u.moment; + if (!this.useUTC) return function (a) { + return 6E4 * (new Date(a)).getTimezoneOffset() + }; + if (h.timezone) { + if (x) return function (a) { + return 6E4 * -x.tz(a, h.timezone).utcOffset() + }; + a.error(25) + } + return this.useUTC && h.getTimezoneOffset ? function (a) { + return 6E4 * h.getTimezoneOffset(a) + } : function () { + return 6E4 * (e.timezoneOffset || 0) + } + }, + dateFormat: function (e, h, x) { + if (!a.defined(h) || isNaN(h)) return a.defaultOptions.lang.invalidDate || ""; + e = a.pick(e, "%Y-%m-%d %H:%M:%S"); + var f = this, + c = new this.Date(h), + k = this.get("Hours", c), + r = this.get("Day", c), + l = this.get("Date", c), + d = this.get("Month", c), + b = this.get("FullYear", c), + v = a.defaultOptions.lang, + p = v.weekdays, + q = v.shortWeekdays, + t = a.pad, + c = a.extend({ + a: q ? q[r] : p[r].substr(0, 3), + A: p[r], + d: t(l), + e: t(l, 2, " "), + w: r, + b: v.shortMonths[d], + B: v.months[d], + m: t(d + 1), + o: d + 1, + y: b.toString().substr(2, 2), + Y: b, + H: t(k), + k: k, + I: t(k % 12 || 12), + l: k % 12 || 12, + M: t(f.get("Minutes", c)), + p: 12 > k ? "AM" : "PM", + P: 12 > k ? "am" : "pm", + S: t(c.getSeconds()), + L: t(Math.round(h % 1E3), 3) + }, a.dateFormats); + a.objectEach(c, function (a, b) { + for (; - 1 !== e.indexOf("%" + + b);) e = e.replace("%" + b, "function" === typeof a ? a.call(f, h) : a) + }); + return x ? e.substr(0, 1).toUpperCase() + e.substr(1) : e + }, + getTimeTicks: function (a, q, x, f) { + var c = this, + k = [], + r = {}, + l, d = new c.Date(q), + b = a.unitRange, + v = a.count || 1, + p; + if (C(q)) { + c.set("Milliseconds", d, b >= e.second ? 0 : v * Math.floor(c.get("Milliseconds", d) / v)); + b >= e.second && c.set("Seconds", d, b >= e.minute ? 0 : v * Math.floor(c.get("Seconds", d) / v)); + b >= e.minute && c.set("Minutes", d, b >= e.hour ? 0 : v * Math.floor(c.get("Minutes", d) / v)); + b >= e.hour && c.set("Hours", d, b >= e.day ? 0 : v * Math.floor(c.get("Hours", + d) / v)); + b >= e.day && c.set("Date", d, b >= e.month ? 1 : v * Math.floor(c.get("Date", d) / v)); + b >= e.month && (c.set("Month", d, b >= e.year ? 0 : v * Math.floor(c.get("Month", d) / v)), l = c.get("FullYear", d)); + b >= e.year && c.set("FullYear", d, l - l % v); + b === e.week && c.set("Date", d, c.get("Date", d) - c.get("Day", d) + h(f, 1)); + l = c.get("FullYear", d); + f = c.get("Month", d); + var I = c.get("Date", d), + t = c.get("Hours", d); + q = d.getTime(); + c.variableTimezone && (p = x - q > 4 * e.month || c.getTimezoneOffset(q) !== c.getTimezoneOffset(x)); + d = d.getTime(); + for (q = 1; d < x;) k.push(d), d = + b === e.year ? c.makeTime(l + q * v, 0) : b === e.month ? c.makeTime(l, f + q * v) : !p || b !== e.day && b !== e.week ? p && b === e.hour && 1 < v ? c.makeTime(l, f, I, t + q * v) : d + b * v : c.makeTime(l, f, I + q * v * (b === e.day ? 1 : 7)), q++; + k.push(d); + b <= e.hour && 1E4 > k.length && E(k, function (a) { + 0 === a % 18E5 && "000000000" === c.dateFormat("%H%M%S%L", a) && (r[a] = "day") + }) + } + k.info = F(a, { + higherRanks: r, + totalRange: b * v + }); + return k + } + } + })(K); + (function (a) { + var C = a.color, + E = a.merge; + a.defaultOptions = { + colors: "#7cb5ec #434348 #90ed7d #f7a35c #8085e9 #f15c80 #e4d354 #2b908f #f45b5b #91e8e1".split(" "), + symbols: ["circle", "diamond", "square", "triangle", "triangle-down"], + lang: { + loading: "Loading...", + months: "January February March April May June July August September October November December".split(" "), + shortMonths: "Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "), + weekdays: "Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" "), + decimalPoint: ".", + numericSymbols: "kMGTPE".split(""), + resetZoom: "Reset zoom", + resetZoomTitle: "Reset zoom level 1:1", + thousandsSep: " " + }, + global: {}, + time: a.Time.prototype.defaultOptions, + chart: { + borderRadius: 0, + defaultSeriesType: "line", + ignoreHiddenSeries: !0, + spacing: [10, 10, 15, 10], + resetZoomButton: { + theme: { + zIndex: 6 + }, + position: { + align: "right", + x: -10, + y: 10 + } + }, + width: null, + height: null, + borderColor: "#335cad", + backgroundColor: "#ffffff", + plotBorderColor: "#cccccc" + }, + title: { + text: "Chart title", + align: "center", + margin: 15, + widthAdjust: -44 + }, + subtitle: { + text: "", + align: "center", + widthAdjust: -44 + }, + plotOptions: {}, + labels: { + style: { + position: "absolute", + color: "#333333" + } + }, + legend: { + enabled: !0, + align: "center", + alignColumns: !0, + layout: "horizontal", + labelFormatter: function () { + return this.name + }, + borderColor: "#999999", + borderRadius: 0, + navigation: { + activeColor: "#003399", + inactiveColor: "#cccccc" + }, + itemStyle: { + color: "#333333", + fontSize: "12px", + fontWeight: "bold", + textOverflow: "ellipsis" + }, + itemHoverStyle: { + color: "#000000" + }, + itemHiddenStyle: { + color: "#cccccc" + }, + shadow: !1, + itemCheckboxStyle: { + position: "absolute", + width: "13px", + height: "13px" + }, + squareSymbol: !0, + symbolPadding: 5, + verticalAlign: "bottom", + x: 0, + y: 0, + title: { + style: { + fontWeight: "bold" + } + } + }, + loading: { + labelStyle: { + fontWeight: "bold", + position: "relative", + top: "45%" + }, + style: { + position: "absolute", + backgroundColor: "#ffffff", + opacity: .5, + textAlign: "center" + } + }, + tooltip: { + enabled: !0, + animation: a.svg, + borderRadius: 3, + dateTimeLabelFormats: { + millisecond: "%A, %b %e, %H:%M:%S.%L", + second: "%A, %b %e, %H:%M:%S", + minute: "%A, %b %e, %H:%M", + hour: "%A, %b %e, %H:%M", + day: "%A, %b %e, %Y", + week: "Week from %A, %b %e, %Y", + month: "%B %Y", + year: "%Y" + }, + footerFormat: "", + padding: 8, + snap: a.isTouchDevice ? 25 : 10, + backgroundColor: C("#f7f7f7").setOpacity(.85).get(), + borderWidth: 1, + headerFormat: '\x3cspan style\x3d"font-size: 10px"\x3e{point.key}\x3c/span\x3e\x3cbr/\x3e', + pointFormat: '\x3cspan style\x3d"color:{point.color}"\x3e\u25cf\x3c/span\x3e {series.name}: \x3cb\x3e{point.y}\x3c/b\x3e\x3cbr/\x3e', + shadow: !0, + style: { + color: "#333333", + cursor: "default", + fontSize: "12px", + pointerEvents: "none", + whiteSpace: "nowrap" + } + }, + credits: { + enabled: !0, + href: "http://www.highcharts.com", + position: { + align: "right", + x: -10, + verticalAlign: "bottom", + y: -5 + }, + style: { + cursor: "pointer", + color: "#999999", + fontSize: "9px" + }, + text: "Highcharts.com" + } + }; + a.setOptions = function (C) { + a.defaultOptions = E(!0, a.defaultOptions, C); + a.time.update(E(a.defaultOptions.global, + a.defaultOptions.time), !1); + return a.defaultOptions + }; + a.getOptions = function () { + return a.defaultOptions + }; + a.defaultPlotOptions = a.defaultOptions.plotOptions; + a.time = new a.Time(E(a.defaultOptions.global, a.defaultOptions.time)); + a.dateFormat = function (C, n, h) { + return a.time.dateFormat(C, n, h) + } + })(K); + (function (a) { + var C = a.correctFloat, + E = a.defined, + F = a.destroyObjectProperties, + n = a.fireEvent, + h = a.isNumber, + e = a.merge, + u = a.pick, + y = a.deg2rad; + a.Tick = function (a, e, f, c) { + this.axis = a; + this.pos = e; + this.type = f || ""; + this.isNewLabel = this.isNew = !0; + f || c || this.addLabel() + }; + a.Tick.prototype = { + addLabel: function () { + var a = this.axis, + h = a.options, + f = a.chart, + c = a.categories, + k = a.names, + r = this.pos, + l = h.labels, + d = a.tickPositions, + b = r === d[0], + v = r === d[d.length - 1], + k = c ? u(c[r], k[r], r) : r, + c = this.label, + d = d.info, + p; + a.isDatetimeAxis && d && (p = h.dateTimeLabelFormats[d.higherRanks[r] || d.unitName]); + this.isFirst = b; + this.isLast = v; + h = a.labelFormatter.call({ + axis: a, + chart: f, + isFirst: b, + isLast: v, + dateTimeLabelFormat: p, + value: a.isLog ? C(a.lin2log(k)) : k, + pos: r + }); + if (E(c)) c && c.attr({ + text: h + }); + else { + if (this.label = + c = E(h) && l.enabled ? f.renderer.text(h, 0, 0, l.useHTML).css(e(l.style)).add(a.labelGroup) : null) c.textPxLength = c.getBBox().width; + this.rotation = 0 + } + }, + getLabelSize: function () { + return this.label ? this.label.getBBox()[this.axis.horiz ? "height" : "width"] : 0 + }, + handleOverflow: function (a) { + var e = this.axis, + f = e.options.labels, + c = a.x, + k = e.chart.chartWidth, + r = e.chart.spacing, + l = u(e.labelLeft, Math.min(e.pos, r[3])), + r = u(e.labelRight, Math.max(e.isRadial ? 0 : e.pos + e.len, k - r[1])), + d = this.label, + b = this.rotation, + v = { + left: 0, + center: .5, + right: 1 + } [e.labelAlign || + d.attr("align") + ], + p = d.getBBox().width, + h = e.getSlotWidth(this), + t = h, + q = 1, + A, H = {}; + if (b || !1 === f.overflow) 0 > b && c - v * p < l ? A = Math.round(c / Math.cos(b * y) - l) : 0 < b && c + v * p > r && (A = Math.round((k - c) / Math.cos(b * y))); + else if (k = c + (1 - v) * p, c - v * p < l ? t = a.x + t * (1 - v) - l : k > r && (t = r - a.x + t * v, q = -1), t = Math.min(h, t), t < h && "center" === e.labelAlign && (a.x += q * (h - t - v * (h - Math.min(p, t)))), p > t || e.autoRotation && (d.styles || {}).width) A = t; + A && (H.width = A, (f.style || {}).textOverflow || (H.textOverflow = "ellipsis"), d.css(H)) + }, + getPosition: function (e, h, f, c) { + var k = + this.axis, + r = k.chart, + l = c && r.oldChartHeight || r.chartHeight; + e = { + x: e ? a.correctFloat(k.translate(h + f, null, null, c) + k.transB) : k.left + k.offset + (k.opposite ? (c && r.oldChartWidth || r.chartWidth) - k.right - k.left : 0), + y: e ? l - k.bottom + k.offset - (k.opposite ? k.height : 0) : a.correctFloat(l - k.translate(h + f, null, null, c) - k.transB) + }; + n(this, "afterGetPosition", { + pos: e + }); + return e + }, + getLabelPosition: function (a, e, f, c, k, r, l, d) { + var b = this.axis, + v = b.transA, + p = b.reversed, + h = b.staggerLines, + t = b.tickRotCorr || { + x: 0, + y: 0 + }, + q = k.y, + A = c || b.reserveSpaceDefault ? + 0 : -b.labelOffset * ("center" === b.labelAlign ? .5 : 1), + x = {}; + E(q) || (q = 0 === b.side ? f.rotation ? -8 : -f.getBBox().height : 2 === b.side ? t.y + 8 : Math.cos(f.rotation * y) * (t.y - f.getBBox(!1, 0).height / 2)); + a = a + k.x + A + t.x - (r && c ? r * v * (p ? -1 : 1) : 0); + e = e + q - (r && !c ? r * v * (p ? 1 : -1) : 0); + h && (f = l / (d || 1) % h, b.opposite && (f = h - f - 1), e += b.labelOffset / h * f); + x.x = a; + x.y = Math.round(e); + n(this, "afterGetLabelPosition", { + pos: x + }); + return x + }, + getMarkPath: function (a, e, f, c, k, r) { + return r.crispLine(["M", a, e, "L", a + (k ? 0 : -f), e + (k ? f : 0)], c) + }, + renderGridLine: function (a, e, f) { + var c = + this.axis, + k = c.options, + r = this.gridLine, + l = {}, + d = this.pos, + b = this.type, + v = c.tickmarkOffset, + p = c.chart.renderer, + h = b ? b + "Grid" : "grid", + t = k[h + "LineWidth"], + q = k[h + "LineColor"], + k = k[h + "LineDashStyle"]; + r || (l.stroke = q, l["stroke-width"] = t, k && (l.dashstyle = k), b || (l.zIndex = 1), a && (l.opacity = 0), this.gridLine = r = p.path().attr(l).addClass("highcharts-" + (b ? b + "-" : "") + "grid-line").add(c.gridGroup)); + if (!a && r && (a = c.getPlotLinePath(d + v, r.strokeWidth() * f, a, !0))) r[this.isNew ? "attr" : "animate"]({ + d: a, + opacity: e + }) + }, + renderMark: function (a, + e, f) { + var c = this.axis, + k = c.options, + r = c.chart.renderer, + l = this.type, + d = l ? l + "Tick" : "tick", + b = c.tickSize(d), + v = this.mark, + p = !v, + h = a.x; + a = a.y; + var t = u(k[d + "Width"], !l && c.isXAxis ? 1 : 0), + k = k[d + "Color"]; + b && (c.opposite && (b[0] = -b[0]), p && (this.mark = v = r.path().addClass("highcharts-" + (l ? l + "-" : "") + "tick").add(c.axisGroup), v.attr({ + stroke: k, + "stroke-width": t + })), v[p ? "attr" : "animate"]({ + d: this.getMarkPath(h, a, b[0], v.strokeWidth() * f, c.horiz, r), + opacity: e + })) + }, + renderLabel: function (a, e, f, c) { + var k = this.axis, + r = k.horiz, + l = k.options, + d = this.label, + b = l.labels, + v = b.step, + k = k.tickmarkOffset, + p = !0, + I = a.x; + a = a.y; + d && h(I) && (d.xy = a = this.getLabelPosition(I, a, d, r, b, k, c, v), this.isFirst && !this.isLast && !u(l.showFirstLabel, 1) || this.isLast && !this.isFirst && !u(l.showLastLabel, 1) ? p = !1 : !r || b.step || b.rotation || e || 0 === f || this.handleOverflow(a), v && c % v && (p = !1), p && h(a.y) ? (a.opacity = f, d[this.isNewLabel ? "attr" : "animate"](a), this.isNewLabel = !1) : (d.attr("y", -9999), this.isNewLabel = !0)) + }, + render: function (e, h, f) { + var c = this.axis, + k = c.horiz, + r = this.getPosition(k, this.pos, c.tickmarkOffset, + h), + l = r.x, + d = r.y, + c = k && l === c.pos + c.len || !k && d === c.pos ? -1 : 1; + f = u(f, 1); + this.isActive = !0; + this.renderGridLine(h, f, c); + this.renderMark(r, f, c); + this.renderLabel(r, h, f, e); + this.isNew = !1; + a.fireEvent(this, "afterRender") + }, + destroy: function () { + F(this, this.axis) + } + } + })(K); + var V = function (a) { + var C = a.addEvent, + E = a.animObject, + F = a.arrayMax, + n = a.arrayMin, + h = a.color, + e = a.correctFloat, + u = a.defaultOptions, + y = a.defined, + q = a.deg2rad, + x = a.destroyObjectProperties, + f = a.each, + c = a.extend, + k = a.fireEvent, + r = a.format, + l = a.getMagnitude, + d = a.grep, + b = a.inArray, + v = a.isArray, + p = a.isNumber, + I = a.isString, + t = a.merge, + L = a.normalizeTickInterval, + A = a.objectEach, + H = a.pick, + m = a.removeEvent, + D = a.splat, + B = a.syncTimeout, + M = a.Tick, + G = function () { + this.init.apply(this, arguments) + }; + a.extend(G.prototype, { + defaultOptions: { + dateTimeLabelFormats: { + millisecond: "%H:%M:%S.%L", + second: "%H:%M:%S", + minute: "%H:%M", + hour: "%H:%M", + day: "%e. %b", + week: "%e. %b", + month: "%b '%y", + year: "%Y" + }, + endOnTick: !1, + labels: { + enabled: !0, + style: { + color: "#666666", + cursor: "default", + fontSize: "11px" + }, + x: 0 + }, + maxPadding: .01, + minorTickLength: 2, + minorTickPosition: "outside", + minPadding: .01, + startOfWeek: 1, + startOnTick: !1, + tickLength: 10, + tickmarkPlacement: "between", + tickPixelInterval: 100, + tickPosition: "outside", + title: { + align: "middle", + style: { + color: "#666666" + } + }, + type: "linear", + minorGridLineColor: "#f2f2f2", + minorGridLineWidth: 1, + minorTickColor: "#999999", + lineColor: "#ccd6eb", + lineWidth: 1, + gridLineColor: "#e6e6e6", + tickColor: "#ccd6eb" + }, + defaultYAxisOptions: { + endOnTick: !0, + tickPixelInterval: 72, + showLastLabel: !0, + labels: { + x: -8 + }, + maxPadding: .05, + minPadding: .05, + startOnTick: !0, + title: { + rotation: 270, + text: "Values" + }, + stackLabels: { + allowOverlap: !1, + enabled: !1, + formatter: function () { + return a.numberFormat(this.total, -1) + }, + style: { + fontSize: "11px", + fontWeight: "bold", + color: "#000000", + textOutline: "1px contrast" + } + }, + gridLineWidth: 1, + lineWidth: 0 + }, + defaultLeftAxisOptions: { + labels: { + x: -15 + }, + title: { + rotation: 270 + } + }, + defaultRightAxisOptions: { + labels: { + x: 15 + }, + title: { + rotation: 90 + } + }, + defaultBottomAxisOptions: { + labels: { + autoRotation: [-45], + x: 0 + }, + title: { + rotation: 0 + } + }, + defaultTopAxisOptions: { + labels: { + autoRotation: [-45], + x: 0 + }, + title: { + rotation: 0 + } + }, + init: function (a, d) { + var g = d.isX, + w = this; + w.chart = a; + w.horiz = a.inverted && !w.isZAxis ? !g : g; + w.isXAxis = g; + w.coll = w.coll || (g ? "xAxis" : "yAxis"); + k(this, "init", { + userOptions: d + }); + w.opposite = d.opposite; + w.side = d.side || (w.horiz ? w.opposite ? 0 : 2 : w.opposite ? 1 : 3); + w.setOptions(d); + var c = this.options, + m = c.type; + w.labelFormatter = c.labels.formatter || w.defaultLabelFormatter; + w.userOptions = d; + w.minPixelPadding = 0; + w.reversed = c.reversed; + w.visible = !1 !== c.visible; + w.zoomEnabled = !1 !== c.zoomEnabled; + w.hasNames = "category" === + m || !0 === c.categories; + w.categories = c.categories || w.hasNames; + w.names || (w.names = [], w.names.keys = {}); + w.plotLinesAndBandsGroups = {}; + w.isLog = "logarithmic" === m; + w.isDatetimeAxis = "datetime" === m; + w.positiveValuesOnly = w.isLog && !w.allowNegativeLog; + w.isLinked = y(c.linkedTo); + w.ticks = {}; + w.labelEdge = []; + w.minorTicks = {}; + w.plotLinesAndBands = []; + w.alternateBands = {}; + w.len = 0; + w.minRange = w.userMinRange = c.minRange || c.maxZoom; + w.range = c.range; + w.offset = c.offset || 0; + w.stacks = {}; + w.oldStacks = {}; + w.stacksTouched = 0; + w.max = null; + w.min = null; + w.crosshair = H(c.crosshair, D(a.options.tooltip.crosshairs)[g ? 0 : 1], !1); + d = w.options.events; - 1 === b(w, a.axes) && (g ? a.axes.splice(a.xAxis.length, 0, w) : a.axes.push(w), a[w.coll].push(w)); + w.series = w.series || []; + a.inverted && !w.isZAxis && g && void 0 === w.reversed && (w.reversed = !0); + A(d, function (a, g) { + C(w, g, a) + }); + w.lin2log = c.linearToLogConverter || w.lin2log; + w.isLog && (w.val2lin = w.log2lin, w.lin2val = w.lin2log); + k(this, "afterInit") + }, + setOptions: function (a) { + this.options = t(this.defaultOptions, "yAxis" === this.coll && this.defaultYAxisOptions, + [this.defaultTopAxisOptions, this.defaultRightAxisOptions, this.defaultBottomAxisOptions, this.defaultLeftAxisOptions][this.side], t(u[this.coll], a)); + k(this, "afterSetOptions", { + userOptions: a + }) + }, + defaultLabelFormatter: function () { + var g = this.axis, + b = this.value, + d = g.chart.time, + c = g.categories, + m = this.dateTimeLabelFormat, + l = u.lang, + f = l.numericSymbols, + l = l.numericSymbolMagnitude || 1E3, + p = f && f.length, + k, v = g.options.labels.format, + g = g.isLog ? Math.abs(b) : g.tickInterval; + if (v) k = r(v, this, d); + else if (c) k = b; + else if (m) k = d.dateFormat(m, + b); + else if (p && 1E3 <= g) + for (; p-- && void 0 === k;) d = Math.pow(l, p + 1), g >= d && 0 === 10 * b % d && null !== f[p] && 0 !== b && (k = a.numberFormat(b / d, -1) + f[p]); + void 0 === k && (k = 1E4 <= Math.abs(b) ? a.numberFormat(b, -1) : a.numberFormat(b, -1, void 0, "")); + return k + }, + getSeriesExtremes: function () { + var a = this, + b = a.chart; + k(this, "getSeriesExtremes", null, function () { + a.hasVisibleSeries = !1; + a.dataMin = a.dataMax = a.threshold = null; + a.softThreshold = !a.isXAxis; + a.buildStacks && a.buildStacks(); + f(a.series, function (g) { + if (g.visible || !b.options.chart.ignoreHiddenSeries) { + var w = + g.options, + c = w.threshold, + m; + a.hasVisibleSeries = !0; + a.positiveValuesOnly && 0 >= c && (c = null); + if (a.isXAxis) w = g.xData, w.length && (g = n(w), m = F(w), p(g) || g instanceof Date || (w = d(w, p), g = n(w), m = F(w)), w.length && (a.dataMin = Math.min(H(a.dataMin, w[0], g), g), a.dataMax = Math.max(H(a.dataMax, w[0], m), m))); + else if (g.getExtremes(), m = g.dataMax, g = g.dataMin, y(g) && y(m) && (a.dataMin = Math.min(H(a.dataMin, g), g), a.dataMax = Math.max(H(a.dataMax, m), m)), y(c) && (a.threshold = c), !w.softThreshold || a.positiveValuesOnly) a.softThreshold = !1 + } + }) + }); + k(this, "afterGetSeriesExtremes") + }, + translate: function (a, b, d, c, m, l) { + var g = this.linkedParent || this, + w = 1, + f = 0, + J = c ? g.oldTransA : g.transA; + c = c ? g.oldMin : g.min; + var k = g.minPixelPadding; + m = (g.isOrdinal || g.isBroken || g.isLog && m) && g.lin2val; + J || (J = g.transA); + d && (w *= -1, f = g.len); + g.reversed && (w *= -1, f -= w * (g.sector || g.len)); + b ? (a = (a * w + f - k) / J + c, m && (a = g.lin2val(a))) : (m && (a = g.val2lin(a)), a = p(c) ? w * (a - c) * J + f + w * k + (p(l) ? J * l : 0) : void 0); + return a + }, + toPixels: function (a, b) { + return this.translate(a, !1, !this.horiz, null, !0) + (b ? 0 : this.pos) + }, + toValue: function (a, b) { + return this.translate(a - (b ? 0 : this.pos), !0, !this.horiz, null, !0) + }, + getPlotLinePath: function (a, b, d, c, m) { + var g = this.chart, + w = this.left, + l = this.top, + f, J, k = d && g.oldChartHeight || g.chartHeight, + v = d && g.oldChartWidth || g.chartWidth, + e; + f = this.transB; + var B = function (a, g, b) { + if (a < g || a > b) c ? a = Math.min(Math.max(g, a), b) : e = !0; + return a + }; + m = H(m, this.translate(a, null, null, d)); + m = Math.min(Math.max(-1E5, m), 1E5); + a = d = Math.round(m + f); + f = J = Math.round(k - m - f); + p(m) ? this.horiz ? (f = l, J = k - this.bottom, a = d = B(a, w, w + this.width)) : + (a = w, d = v - this.right, f = J = B(f, l, l + this.height)) : (e = !0, c = !1); + return e && !c ? null : g.renderer.crispLine(["M", a, f, "L", d, J], b || 1) + }, + getLinearTickPositions: function (a, b, d) { + var g, w = e(Math.floor(b / a) * a); + d = e(Math.ceil(d / a) * a); + var c = [], + m; + e(w + a) === w && (m = 20); + if (this.single) return [b]; + for (b = w; b <= d;) { + c.push(b); + b = e(b + a, m); + if (b === g) break; + g = b + } + return c + }, + getMinorTickInterval: function () { + var a = this.options; + return !0 === a.minorTicks ? H(a.minorTickInterval, "auto") : !1 === a.minorTicks ? null : a.minorTickInterval + }, + getMinorTickPositions: function () { + var a = + this, + b = a.options, + d = a.tickPositions, + c = a.minorTickInterval, + m = [], + l = a.pointRangePadding || 0, + p = a.min - l, + l = a.max + l, + k = l - p; + if (k && k / c < a.len / 3) + if (a.isLog) f(this.paddedTicks, function (g, b, d) { + b && m.push.apply(m, a.getLogTickPositions(c, d[b - 1], d[b], !0)) + }); + else if (a.isDatetimeAxis && "auto" === this.getMinorTickInterval()) m = m.concat(a.getTimeTicks(a.normalizeTimeTickInterval(c), p, l, b.startOfWeek)); + else + for (b = p + (d[0] - p) % c; b <= l && b !== m[0]; b += c) m.push(b); + 0 !== m.length && a.trimTicks(m); + return m + }, + adjustForMinRange: function () { + var a = + this.options, + b = this.min, + d = this.max, + c, m, l, p, k, v, e, B; + this.isXAxis && void 0 === this.minRange && !this.isLog && (y(a.min) || y(a.max) ? this.minRange = null : (f(this.series, function (a) { + v = a.xData; + for (p = e = a.xIncrement ? 1 : v.length - 1; 0 < p; p--) + if (k = v[p] - v[p - 1], void 0 === l || k < l) l = k + }), this.minRange = Math.min(5 * l, this.dataMax - this.dataMin))); + d - b < this.minRange && (m = this.dataMax - this.dataMin >= this.minRange, B = this.minRange, c = (B - d + b) / 2, c = [b - c, H(a.min, b - c)], m && (c[2] = this.isLog ? this.log2lin(this.dataMin) : this.dataMin), b = F(c), d = [b + B, + H(a.max, b + B) + ], m && (d[2] = this.isLog ? this.log2lin(this.dataMax) : this.dataMax), d = n(d), d - b < B && (c[0] = d - B, c[1] = H(a.min, d - B), b = F(c))); + this.min = b; + this.max = d + }, + getClosest: function () { + var a; + this.categories ? a = 1 : f(this.series, function (g) { + var b = g.closestPointRange, + d = g.visible || !g.chart.options.chart.ignoreHiddenSeries; + !g.noSharedTooltip && y(b) && d && (a = y(a) ? Math.min(a, b) : b) + }); + return a + }, + nameToX: function (a) { + var g = v(this.categories), + d = g ? this.categories : this.names, + c = a.options.x, + m; + a.series.requireSorting = !1; + y(c) || (c = !1 === + this.options.uniqueNames ? a.series.autoIncrement() : g ? b(a.name, d) : H(d.keys[a.name], -1)); - 1 === c ? g || (m = d.length) : m = c; + void 0 !== m && (this.names[m] = a.name, this.names.keys[a.name] = m); + return m + }, + updateNames: function () { + var g = this, + b = this.names; + 0 < b.length && (f(a.keys(b.keys), function (a) { + delete b.keys[a] + }), b.length = 0, this.minRange = this.userMinRange, f(this.series || [], function (a) { + a.xIncrement = null; + if (!a.points || a.isDirtyData) a.processData(), a.generatePoints(); + f(a.points, function (b, d) { + var c; + b.options && (c = g.nameToX(b), + void 0 !== c && c !== b.x && (b.x = c, a.xData[d] = c)) + }) + })) + }, + setAxisTranslation: function (a) { + var b = this, + g = b.max - b.min, + d = b.axisPointRange || 0, + c, m = 0, + l = 0, + p = b.linkedParent, + v = !!b.categories, + B = b.transA, + e = b.isXAxis; + if (e || v || d) c = b.getClosest(), p ? (m = p.minPointOffset, l = p.pointRangePadding) : f(b.series, function (a) { + var g = v ? 1 : e ? H(a.options.pointRange, c, 0) : b.axisPointRange || 0; + a = a.options.pointPlacement; + d = Math.max(d, g); + b.single || (m = Math.max(m, I(a) ? 0 : g / 2), l = Math.max(l, "on" === a ? 0 : g)) + }), p = b.ordinalSlope && c ? b.ordinalSlope / c : 1, b.minPointOffset = + m *= p, b.pointRangePadding = l *= p, b.pointRange = Math.min(d, g), e && (b.closestPointRange = c); + a && (b.oldTransA = B); + b.translationSlope = b.transA = B = b.options.staticScale || b.len / (g + l || 1); + b.transB = b.horiz ? b.left : b.bottom; + b.minPixelPadding = B * m; + k(this, "afterSetAxisTranslation") + }, + minFromRange: function () { + return this.max - this.range + }, + setTickInterval: function (b) { + var g = this, + d = g.chart, + c = g.options, + m = g.isLog, + v = g.isDatetimeAxis, + B = g.isXAxis, + t = g.isLinked, + r = c.maxPadding, + D = c.minPadding, + h = c.tickInterval, + A = c.tickPixelInterval, + G = g.categories, + I = p(g.threshold) ? g.threshold : null, + x = g.softThreshold, + q, u, M, n; + v || G || t || this.getTickAmount(); + M = H(g.userMin, c.min); + n = H(g.userMax, c.max); + t ? (g.linkedParent = d[g.coll][c.linkedTo], d = g.linkedParent.getExtremes(), g.min = H(d.min, d.dataMin), g.max = H(d.max, d.dataMax), c.type !== g.linkedParent.options.type && a.error(11, 1)) : (!x && y(I) && (g.dataMin >= I ? (q = I, D = 0) : g.dataMax <= I && (u = I, r = 0)), g.min = H(M, q, g.dataMin), g.max = H(n, u, g.dataMax)); + m && (g.positiveValuesOnly && !b && 0 >= Math.min(g.min, H(g.dataMin, g.min)) && a.error(10, 1), g.min = + e(g.log2lin(g.min), 15), g.max = e(g.log2lin(g.max), 15)); + g.range && y(g.max) && (g.userMin = g.min = M = Math.max(g.dataMin, g.minFromRange()), g.userMax = n = g.max, g.range = null); + k(g, "foundExtremes"); + g.beforePadding && g.beforePadding(); + g.adjustForMinRange(); + !(G || g.axisPointRange || g.usePercentage || t) && y(g.min) && y(g.max) && (d = g.max - g.min) && (!y(M) && D && (g.min -= d * D), !y(n) && r && (g.max += d * r)); + p(c.softMin) && !p(g.userMin) && (g.min = Math.min(g.min, c.softMin)); + p(c.softMax) && !p(g.userMax) && (g.max = Math.max(g.max, c.softMax)); + p(c.floor) && + (g.min = Math.max(g.min, c.floor)); + p(c.ceiling) && (g.max = Math.min(g.max, c.ceiling)); + x && y(g.dataMin) && (I = I || 0, !y(M) && g.min < I && g.dataMin >= I ? g.min = I : !y(n) && g.max > I && g.dataMax <= I && (g.max = I)); + g.tickInterval = g.min === g.max || void 0 === g.min || void 0 === g.max ? 1 : t && !h && A === g.linkedParent.options.tickPixelInterval ? h = g.linkedParent.tickInterval : H(h, this.tickAmount ? (g.max - g.min) / Math.max(this.tickAmount - 1, 1) : void 0, G ? 1 : (g.max - g.min) * A / Math.max(g.len, A)); + B && !b && f(g.series, function (a) { + a.processData(g.min !== g.oldMin || g.max !== + g.oldMax) + }); + g.setAxisTranslation(!0); + g.beforeSetTickPositions && g.beforeSetTickPositions(); + g.postProcessTickInterval && (g.tickInterval = g.postProcessTickInterval(g.tickInterval)); + g.pointRange && !h && (g.tickInterval = Math.max(g.pointRange, g.tickInterval)); + b = H(c.minTickInterval, g.isDatetimeAxis && g.closestPointRange); + !h && g.tickInterval < b && (g.tickInterval = b); + v || m || h || (g.tickInterval = L(g.tickInterval, null, l(g.tickInterval), H(c.allowDecimals, !(.5 < g.tickInterval && 5 > g.tickInterval && 1E3 < g.max && 9999 > g.max)), !!this.tickAmount)); + this.tickAmount || (g.tickInterval = g.unsquish()); + this.setTickPositions() + }, + setTickPositions: function () { + var a = this.options, + b, d = a.tickPositions; + b = this.getMinorTickInterval(); + var c = a.tickPositioner, + m = a.startOnTick, + l = a.endOnTick; + this.tickmarkOffset = this.categories && "between" === a.tickmarkPlacement && 1 === this.tickInterval ? .5 : 0; + this.minorTickInterval = "auto" === b && this.tickInterval ? this.tickInterval / 5 : b; + this.single = this.min === this.max && y(this.min) && !this.tickAmount && (parseInt(this.min, 10) === this.min || !1 !== a.allowDecimals); + this.tickPositions = b = d && d.slice(); + !b && (b = this.isDatetimeAxis ? this.getTimeTicks(this.normalizeTimeTickInterval(this.tickInterval, a.units), this.min, this.max, a.startOfWeek, this.ordinalPositions, this.closestPointRange, !0) : this.isLog ? this.getLogTickPositions(this.tickInterval, this.min, this.max) : this.getLinearTickPositions(this.tickInterval, this.min, this.max), b.length > this.len && (b = [b[0], b.pop()], b[0] === b[1] && (b.length = 1)), this.tickPositions = b, c && (c = c.apply(this, [this.min, this.max]))) && (this.tickPositions = + b = c); + this.paddedTicks = b.slice(0); + this.trimTicks(b, m, l); + this.isLinked || (this.single && 2 > b.length && (this.min -= .5, this.max += .5), d || c || this.adjustTickAmount()); + k(this, "afterSetTickPositions") + }, + trimTicks: function (a, b, d) { + var g = a[0], + c = a[a.length - 1], + m = this.minPointOffset || 0; + if (!this.isLinked) { + if (b && -Infinity !== g) this.min = g; + else + for (; this.min - m > a[0];) a.shift(); + if (d) this.max = c; + else + for (; this.max + m < a[a.length - 1];) a.pop(); + 0 === a.length && y(g) && !this.options.tickPositions && a.push((c + g) / 2) + } + }, + alignToOthers: function () { + var a = {}, + b, d = this.options; + !1 === this.chart.options.chart.alignTicks || !1 === d.alignTicks || !1 === d.startOnTick || !1 === d.endOnTick || this.isLog || f(this.chart[this.coll], function (g) { + var d = g.options, + d = [g.horiz ? d.left : d.top, d.width, d.height, d.pane].join(); + g.series.length && (a[d] ? b = !0 : a[d] = 1) + }); + return b + }, + getTickAmount: function () { + var a = this.options, + b = a.tickAmount, + d = a.tickPixelInterval; + !y(a.tickInterval) && this.len < d && !this.isRadial && !this.isLog && a.startOnTick && a.endOnTick && (b = 2); + !b && this.alignToOthers() && (b = Math.ceil(this.len / + d) + 1); + 4 > b && (this.finalTickAmt = b, b = 5); + this.tickAmount = b + }, + adjustTickAmount: function () { + var a = this.tickInterval, + b = this.tickPositions, + d = this.tickAmount, + c = this.finalTickAmt, + m = b && b.length, + l = H(this.threshold, this.softThreshold ? 0 : null); + if (this.hasData()) { + if (m < d) { + for (; b.length < d;) b.length % 2 || this.min === l ? b.push(e(b[b.length - 1] + a)) : b.unshift(e(b[0] - a)); + this.transA *= (m - 1) / (d - 1); + this.min = b[0]; + this.max = b[b.length - 1] + } else m > d && (this.tickInterval *= 2, this.setTickPositions()); + if (y(c)) { + for (a = d = b.length; a--;)(3 === c && + 1 === a % 2 || 2 >= c && 0 < a && a < d - 1) && b.splice(a, 1); + this.finalTickAmt = void 0 + } + } + }, + setScale: function () { + var a, b; + this.oldMin = this.min; + this.oldMax = this.max; + this.oldAxisLength = this.len; + this.setAxisSize(); + b = this.len !== this.oldAxisLength; + f(this.series, function (b) { + if (b.isDirtyData || b.isDirty || b.xAxis.isDirty) a = !0 + }); + b || a || this.isLinked || this.forceRedraw || this.userMin !== this.oldUserMin || this.userMax !== this.oldUserMax || this.alignToOthers() ? (this.resetStacks && this.resetStacks(), this.forceRedraw = !1, this.getSeriesExtremes(), + this.setTickInterval(), this.oldUserMin = this.userMin, this.oldUserMax = this.userMax, this.isDirty || (this.isDirty = b || this.min !== this.oldMin || this.max !== this.oldMax)) : this.cleanStacks && this.cleanStacks(); + k(this, "afterSetScale") + }, + setExtremes: function (a, b, d, m, l) { + var g = this, + p = g.chart; + d = H(d, !0); + f(g.series, function (a) { + delete a.kdTree + }); + l = c(l, { + min: a, + max: b + }); + k(g, "setExtremes", l, function () { + g.userMin = a; + g.userMax = b; + g.eventArgs = l; + d && p.redraw(m) + }) + }, + zoom: function (a, b) { + var g = this.dataMin, + d = this.dataMax, + c = this.options, + m = Math.min(g, H(c.min, g)), + c = Math.max(d, H(c.max, d)); + if (a !== this.min || b !== this.max) this.allowZoomOutside || (y(g) && (a < m && (a = m), a > c && (a = c)), y(d) && (b < m && (b = m), b > c && (b = c))), this.displayBtn = void 0 !== a || void 0 !== b, this.setExtremes(a, b, !1, void 0, { + trigger: "zoom" + }); + return !0 + }, + setAxisSize: function () { + var b = this.chart, + d = this.options, + c = d.offsets || [0, 0, 0, 0], + m = this.horiz, + l = this.width = Math.round(a.relativeLength(H(d.width, b.plotWidth - c[3] + c[1]), b.plotWidth)), + f = this.height = Math.round(a.relativeLength(H(d.height, b.plotHeight - + c[0] + c[2]), b.plotHeight)), + p = this.top = Math.round(a.relativeLength(H(d.top, b.plotTop + c[0]), b.plotHeight, b.plotTop)), + d = this.left = Math.round(a.relativeLength(H(d.left, b.plotLeft + c[3]), b.plotWidth, b.plotLeft)); + this.bottom = b.chartHeight - f - p; + this.right = b.chartWidth - l - d; + this.len = Math.max(m ? l : f, 0); + this.pos = m ? d : p + }, + getExtremes: function () { + var a = this.isLog; + return { + min: a ? e(this.lin2log(this.min)) : this.min, + max: a ? e(this.lin2log(this.max)) : this.max, + dataMin: this.dataMin, + dataMax: this.dataMax, + userMin: this.userMin, + userMax: this.userMax + } + }, + getThreshold: function (a) { + var b = this.isLog, + g = b ? this.lin2log(this.min) : this.min, + b = b ? this.lin2log(this.max) : this.max; + null === a || -Infinity === a ? a = g : Infinity === a ? a = b : g > a ? a = g : b < a && (a = b); + return this.translate(a, 0, 1, 0, 1) + }, + autoLabelAlign: function (a) { + a = (H(a, 0) - 90 * this.side + 720) % 360; + return 15 < a && 165 > a ? "right" : 195 < a && 345 > a ? "left" : "center" + }, + tickSize: function (a) { + var b = this.options, + g = b[a + "Length"], + d = H(b[a + "Width"], "tick" === a && this.isXAxis ? 1 : 0); + if (d && g) return "inside" === b[a + "Position"] && (g = -g), [g, d] + }, + labelMetrics: function () { + var a = + this.tickPositions && this.tickPositions[0] || 0; + return this.chart.renderer.fontMetrics(this.options.labels.style && this.options.labels.style.fontSize, this.ticks[a] && this.ticks[a].label) + }, + unsquish: function () { + var a = this.options.labels, + b = this.horiz, + d = this.tickInterval, + c = d, + m = this.len / (((this.categories ? 1 : 0) + this.max - this.min) / d), + l, p = a.rotation, + k = this.labelMetrics(), + v, B = Number.MAX_VALUE, + t, r = function (a) { + a /= m || 1; + a = 1 < a ? Math.ceil(a) : 1; + return e(a * d) + }; + b ? (t = !a.staggerLines && !a.step && (y(p) ? [p] : m < H(a.autoRotationLimit, + 80) && a.autoRotation)) && f(t, function (a) { + var b; + if (a === p || a && -90 <= a && 90 >= a) v = r(Math.abs(k.h / Math.sin(q * a))), b = v + Math.abs(a / 360), b < B && (B = b, l = a, c = v) + }) : a.step || (c = r(k.h)); + this.autoRotation = t; + this.labelRotation = H(l, p); + return c + }, + getSlotWidth: function () { + var a = this.chart, + b = this.horiz, + d = this.options.labels, + c = Math.max(this.tickPositions.length - (this.categories ? 0 : 1), 1), + m = a.margin[3]; + return b && 2 > (d.step || 0) && !d.rotation && (this.staggerLines || 1) * this.len / c || !b && (d.style && parseInt(d.style.width, 10) || m && m - a.spacing[3] || + .33 * a.chartWidth) + }, + renderUnsquish: function () { + var a = this.chart, + b = a.renderer, + d = this.tickPositions, + c = this.ticks, + m = this.options.labels, + l = m && m.style || {}, + p = this.horiz, + k = this.getSlotWidth(), + v = Math.max(1, Math.round(k - 2 * (m.padding || 5))), + B = {}, + e = this.labelMetrics(), + t = m.style && m.style.textOverflow, + r, D, h = 0, + A; + I(m.rotation) || (B.rotation = m.rotation || 0); + f(d, function (a) { + (a = c[a]) && a.label && a.label.textPxLength > h && (h = a.label.textPxLength) + }); + this.maxLabelLength = h; + if (this.autoRotation) h > v && h > e.h ? B.rotation = this.labelRotation : + this.labelRotation = 0; + else if (k && (r = v, !t)) + for (D = "clip", v = d.length; !p && v--;) + if (A = d[v], A = c[A].label) A.styles && "ellipsis" === A.styles.textOverflow ? A.css({ + textOverflow: "clip" + }) : A.textPxLength > k && A.css({ + width: k + "px" + }), A.getBBox().height > this.len / d.length - (e.h - e.f) && (A.specificTextOverflow = "ellipsis"); + B.rotation && (r = h > .5 * a.chartHeight ? .33 * a.chartHeight : a.chartHeight, t || (D = "ellipsis")); + if (this.labelAlign = m.align || this.autoLabelAlign(this.labelRotation)) B.align = this.labelAlign; + f(d, function (a) { + var b = (a = c[a]) && + a.label, + g = l.width, + d = {}; + b && (b.attr(B), r && !g && "nowrap" !== l.whiteSpace && (r < b.textPxLength || "SPAN" === b.element.tagName) ? (d.width = r, t || (d.textOverflow = b.specificTextOverflow || D), b.css(d)) : b.styles && b.styles.width && !d.width && !g && b.css({ + width: null + }), delete b.specificTextOverflow, a.rotation = B.rotation) + }); + this.tickRotCorr = b.rotCorr(e.b, this.labelRotation || 0, 0 !== this.side) + }, + hasData: function () { + return this.hasVisibleSeries || y(this.min) && y(this.max) && this.tickPositions && 0 < this.tickPositions.length + }, + addTitle: function (a) { + var b = + this.chart.renderer, + g = this.horiz, + d = this.opposite, + c = this.options.title, + m; + this.axisTitle || ((m = c.textAlign) || (m = (g ? { + low: "left", + middle: "center", + high: "right" + } : { + low: d ? "right" : "left", + middle: "center", + high: d ? "left" : "right" + })[c.align]), this.axisTitle = b.text(c.text, 0, 0, c.useHTML).attr({ + zIndex: 7, + rotation: c.rotation || 0, + align: m + }).addClass("highcharts-axis-title").css(t(c.style)).add(this.axisGroup), this.axisTitle.isNew = !0); + c.style.width || this.isRadial || this.axisTitle.css({ + width: this.len + }); + this.axisTitle[a ? "show" : + "hide"](!0) + }, + generateTick: function (a) { + var b = this.ticks; + b[a] ? b[a].addLabel() : b[a] = new M(this, a) + }, + getOffset: function () { + var a = this, + b = a.chart, + d = b.renderer, + c = a.options, + m = a.tickPositions, + l = a.ticks, + p = a.horiz, + k = a.side, + v = b.inverted && !a.isZAxis ? [1, 0, 3, 2][k] : k, + B, e, t = 0, + r, D = 0, + h = c.title, + G = c.labels, + I = 0, + x = b.axisOffset, + b = b.clipOffset, + q = [-1, 1, 1, -1][k], + M = c.className, + u = a.axisParent, + n = this.tickSize("tick"); + B = a.hasData(); + a.showAxis = e = B || H(c.showEmpty, !0); + a.staggerLines = a.horiz && G.staggerLines; + a.axisGroup || (a.gridGroup = + d.g("grid").attr({ + zIndex: c.gridZIndex || 1 + }).addClass("highcharts-" + this.coll.toLowerCase() + "-grid " + (M || "")).add(u), a.axisGroup = d.g("axis").attr({ + zIndex: c.zIndex || 2 + }).addClass("highcharts-" + this.coll.toLowerCase() + " " + (M || "")).add(u), a.labelGroup = d.g("axis-labels").attr({ + zIndex: G.zIndex || 7 + }).addClass("highcharts-" + a.coll.toLowerCase() + "-labels " + (M || "")).add(u)); + B || a.isLinked ? (f(m, function (b, g) { + a.generateTick(b, g) + }), a.renderUnsquish(), a.reserveSpaceDefault = 0 === k || 2 === k || { + 1: "left", + 3: "right" + } [k] === a.labelAlign, + H(G.reserveSpace, "center" === a.labelAlign ? !0 : null, a.reserveSpaceDefault) && f(m, function (a) { + I = Math.max(l[a].getLabelSize(), I) + }), a.staggerLines && (I *= a.staggerLines), a.labelOffset = I * (a.opposite ? -1 : 1)) : A(l, function (a, b) { + a.destroy(); + delete l[b] + }); + h && h.text && !1 !== h.enabled && (a.addTitle(e), e && !1 !== h.reserveSpace && (a.titleOffset = t = a.axisTitle.getBBox()[p ? "height" : "width"], r = h.offset, D = y(r) ? 0 : H(h.margin, p ? 5 : 10))); + a.renderLine(); + a.offset = q * H(c.offset, x[k]); + a.tickRotCorr = a.tickRotCorr || { + x: 0, + y: 0 + }; + d = 0 === k ? -a.labelMetrics().h : + 2 === k ? a.tickRotCorr.y : 0; + D = Math.abs(I) + D; + I && (D = D - d + q * (p ? H(G.y, a.tickRotCorr.y + 8 * q) : G.x)); + a.axisTitleMargin = H(r, D); + x[k] = Math.max(x[k], a.axisTitleMargin + t + q * a.offset, D, B && m.length && n ? n[0] + q * a.offset : 0); + c = c.offset ? 0 : 2 * Math.floor(a.axisLine.strokeWidth() / 2); + b[v] = Math.max(b[v], c) + }, + getLinePath: function (a) { + var b = this.chart, + g = this.opposite, + d = this.offset, + c = this.horiz, + m = this.left + (g ? this.width : 0) + d, + d = b.chartHeight - this.bottom - (g ? this.height : 0) + d; + g && (a *= -1); + return b.renderer.crispLine(["M", c ? this.left : m, c ? d : + this.top, "L", c ? b.chartWidth - this.right : m, c ? d : b.chartHeight - this.bottom + ], a) + }, + renderLine: function () { + this.axisLine || (this.axisLine = this.chart.renderer.path().addClass("highcharts-axis-line").add(this.axisGroup), this.axisLine.attr({ + stroke: this.options.lineColor, + "stroke-width": this.options.lineWidth, + zIndex: 7 + })) + }, + getTitlePosition: function () { + var a = this.horiz, + b = this.left, + d = this.top, + c = this.len, + m = this.options.title, + l = a ? b : d, + f = this.opposite, + p = this.offset, + k = m.x || 0, + v = m.y || 0, + B = this.axisTitle, + e = this.chart.renderer.fontMetrics(m.style && + m.style.fontSize, B), + B = Math.max(B.getBBox(null, 0).height - e.h - 1, 0), + c = { + low: l + (a ? 0 : c), + middle: l + c / 2, + high: l + (a ? c : 0) + } [m.align], + b = (a ? d + this.height : b) + (a ? 1 : -1) * (f ? -1 : 1) * this.axisTitleMargin + [-B, B, e.f, -B][this.side]; + return { + x: a ? c + k : b + (f ? this.width : 0) + p + k, + y: a ? b + v - (f ? this.height : 0) + p : c + v + } + }, + renderMinorTick: function (a) { + var b = this.chart.hasRendered && p(this.oldMin), + d = this.minorTicks; + d[a] || (d[a] = new M(this, a, "minor")); + b && d[a].isNew && d[a].render(null, !0); + d[a].render(null, !1, 1) + }, + renderTick: function (a, b) { + var d = this.isLinked, + g = this.ticks, + c = this.chart.hasRendered && p(this.oldMin); + if (!d || a >= this.min && a <= this.max) g[a] || (g[a] = new M(this, a)), c && g[a].isNew && g[a].render(b, !0, .1), g[a].render(b) + }, + render: function () { + var b = this, + d = b.chart, + c = b.options, + m = b.isLog, + l = b.isLinked, + v = b.tickPositions, + e = b.axisTitle, + t = b.ticks, + r = b.minorTicks, + D = b.alternateBands, + h = c.stackLabels, + G = c.alternateGridColor, + I = b.tickmarkOffset, + x = b.axisLine, + q = b.showAxis, + H = E(d.renderer.globalAnimation), + u, n; + b.labelEdge.length = 0; + b.overlap = !1; + f([t, r, D], function (a) { + A(a, function (a) { + a.isActive = !1 + }) + }); + if (b.hasData() || l) b.minorTickInterval && !b.categories && f(b.getMinorTickPositions(), function (a) { + b.renderMinorTick(a) + }), v.length && (f(v, function (a, d) { + b.renderTick(a, d) + }), I && (0 === b.min || b.single) && (t[-1] || (t[-1] = new M(b, -1, null, !0)), t[-1].render(-1))), G && f(v, function (c, g) { + n = void 0 !== v[g + 1] ? v[g + 1] + I : b.max - I; + 0 === g % 2 && c < b.max && n <= b.max + (d.polar ? -I : I) && (D[c] || (D[c] = new a.PlotLineOrBand(b)), u = c + I, D[c].options = { + from: m ? b.lin2log(u) : u, + to: m ? b.lin2log(n) : n, + color: G + }, D[c].render(), D[c].isActive = !0) + }), b._addedPlotLB || + (f((c.plotLines || []).concat(c.plotBands || []), function (a) { + b.addPlotBandOrLine(a) + }), b._addedPlotLB = !0); + f([t, r, D], function (a) { + var b, c = [], + g = H.duration; + A(a, function (a, b) { + a.isActive || (a.render(b, !1, 0), a.isActive = !1, c.push(b)) + }); + B(function () { + for (b = c.length; b--;) a[c[b]] && !a[c[b]].isActive && (a[c[b]].destroy(), delete a[c[b]]) + }, a !== D && d.hasRendered && g ? g : 0) + }); + x && (x[x.isPlaced ? "animate" : "attr"]({ + d: this.getLinePath(x.strokeWidth()) + }), x.isPlaced = !0, x[q ? "show" : "hide"](!0)); + e && q && (c = b.getTitlePosition(), p(c.y) ? (e[e.isNew ? + "attr" : "animate"](c), e.isNew = !1) : (e.attr("y", -9999), e.isNew = !0)); + h && h.enabled && b.renderStackTotals(); + b.isDirty = !1; + k(this, "afterRender") + }, + redraw: function () { + this.visible && (this.render(), f(this.plotLinesAndBands, function (a) { + a.render() + })); + f(this.series, function (a) { + a.isDirty = !0 + }) + }, + keepProps: "extKey hcEvents names series userMax userMin".split(" "), + destroy: function (a) { + var d = this, + c = d.stacks, + g = d.plotLinesAndBands, + l; + k(this, "destroy", { + keepEvents: a + }); + a || m(d); + A(c, function (a, b) { + x(a); + c[b] = null + }); + f([d.ticks, d.minorTicks, + d.alternateBands + ], function (a) { + x(a) + }); + if (g) + for (a = g.length; a--;) g[a].destroy(); + f("stackTotalGroup axisLine axisTitle axisGroup gridGroup labelGroup cross".split(" "), function (a) { + d[a] && (d[a] = d[a].destroy()) + }); + for (l in d.plotLinesAndBandsGroups) d.plotLinesAndBandsGroups[l] = d.plotLinesAndBandsGroups[l].destroy(); + A(d, function (a, c) { + -1 === b(c, d.keepProps) && delete d[c] + }) + }, + drawCrosshair: function (a, b) { + var d, c = this.crosshair, + g = H(c.snap, !0), + m, l = this.cross; + k(this, "drawCrosshair", { + e: a, + point: b + }); + a || (a = this.cross && + this.cross.e); + if (this.crosshair && !1 !== (y(b) || !g)) { + g ? y(b) && (m = H(b.crosshairPos, this.isXAxis ? b.plotX : this.len - b.plotY)) : m = a && (this.horiz ? a.chartX - this.pos : this.len - a.chartY + this.pos); + y(m) && (d = this.getPlotLinePath(b && (this.isXAxis ? b.x : H(b.stackY, b.y)), null, null, null, m) || null); + if (!y(d)) { + this.hideCrosshair(); + return + } + g = this.categories && !this.isRadial; + l || (this.cross = l = this.chart.renderer.path().addClass("highcharts-crosshair highcharts-crosshair-" + (g ? "category " : "thin ") + c.className).attr({ + zIndex: H(c.zIndex, + 2) + }).add(), l.attr({ + stroke: c.color || (g ? h("#ccd6eb").setOpacity(.25).get() : "#cccccc"), + "stroke-width": H(c.width, 1) + }).css({ + "pointer-events": "none" + }), c.dashStyle && l.attr({ + dashstyle: c.dashStyle + })); + l.show().attr({ + d: d + }); + g && !c.width && l.attr({ + "stroke-width": this.transA + }); + this.cross.e = a + } else this.hideCrosshair(); + k(this, "afterDrawCrosshair", { + e: a, + point: b + }) + }, + hideCrosshair: function () { + this.cross && this.cross.hide() + } + }); + return a.Axis = G + }(K); + (function (a) { + var C = a.Axis, + E = a.getMagnitude, + F = a.normalizeTickInterval, + n = a.timeUnits; + C.prototype.getTimeTicks = function () { + return this.chart.time.getTimeTicks.apply(this.chart.time, arguments) + }; + C.prototype.normalizeTimeTickInterval = function (a, e) { + var h = e || [ + ["millisecond", [1, 2, 5, 10, 20, 25, 50, 100, 200, 500]], + ["second", [1, 2, 5, 10, 15, 30]], + ["minute", [1, 2, 5, 10, 15, 30]], + ["hour", [1, 2, 3, 4, 6, 8, 12]], + ["day", [1, 2]], + ["week", [1, 2]], + ["month", [1, 2, 3, 4, 6]], + ["year", null] + ]; + e = h[h.length - 1]; + var y = n[e[0]], + q = e[1], + x; + for (x = 0; x < h.length && !(e = h[x], y = n[e[0]], q = e[1], h[x + 1] && a <= (y * q[q.length - 1] + n[h[x + 1][0]]) / 2); x++); + y === + n.year && a < 5 * y && (q = [1, 2, 5]); + a = F(a / y, q, "year" === e[0] ? Math.max(E(a / y), 1) : 1); + return { + unitRange: y, + count: a, + unitName: e[0] + } + } + })(K); + (function (a) { + var C = a.Axis, + E = a.getMagnitude, + F = a.map, + n = a.normalizeTickInterval, + h = a.pick; + C.prototype.getLogTickPositions = function (a, u, y, q) { + var e = this.options, + f = this.len, + c = []; + q || (this._minorAutoInterval = null); + if (.5 <= a) a = Math.round(a), c = this.getLinearTickPositions(a, u, y); + else if (.08 <= a) + for (var f = Math.floor(u), k, r, l, d, b, e = .3 < a ? [1, 2, 4] : .15 < a ? [1, 2, 4, 6, 8] : [1, 2, 3, 4, 5, 6, 7, 8, 9]; f < y + 1 && !b; f++) + for (r = + e.length, k = 0; k < r && !b; k++) l = this.log2lin(this.lin2log(f) * e[k]), l > u && (!q || d <= y) && void 0 !== d && c.push(d), d > y && (b = !0), d = l; + else u = this.lin2log(u), y = this.lin2log(y), a = q ? this.getMinorTickInterval() : e.tickInterval, a = h("auto" === a ? null : a, this._minorAutoInterval, e.tickPixelInterval / (q ? 5 : 1) * (y - u) / ((q ? f / this.tickPositions.length : f) || 1)), a = n(a, null, E(a)), c = F(this.getLinearTickPositions(a, u, y), this.log2lin), q || (this._minorAutoInterval = a / 5); + q || (this.tickInterval = a); + return c + }; + C.prototype.log2lin = function (a) { + return Math.log(a) / + Math.LN10 + }; + C.prototype.lin2log = function (a) { + return Math.pow(10, a) + } + })(K); + (function (a, C) { + var E = a.arrayMax, + F = a.arrayMin, + n = a.defined, + h = a.destroyObjectProperties, + e = a.each, + u = a.erase, + y = a.merge, + q = a.pick; + a.PlotLineOrBand = function (a, f) { + this.axis = a; + f && (this.options = f, this.id = f.id) + }; + a.PlotLineOrBand.prototype = { + render: function () { + var e = this, + f = e.axis, + c = f.horiz, + k = e.options, + r = k.label, + l = e.label, + d = k.to, + b = k.from, + v = k.value, + p = n(b) && n(d), + h = n(v), + t = e.svgElem, + u = !t, + A = [], + H = k.color, + m = q(k.zIndex, 0), + D = k.events, + A = { + "class": "highcharts-plot-" + + (p ? "band " : "line ") + (k.className || "") + }, + B = {}, + M = f.chart.renderer, + G = p ? "bands" : "lines"; + f.isLog && (b = f.log2lin(b), d = f.log2lin(d), v = f.log2lin(v)); + h ? (A.stroke = H, A["stroke-width"] = k.width, k.dashStyle && (A.dashstyle = k.dashStyle)) : p && (H && (A.fill = H), k.borderWidth && (A.stroke = k.borderColor, A["stroke-width"] = k.borderWidth)); + B.zIndex = m; + G += "-" + m; + (H = f.plotLinesAndBandsGroups[G]) || (f.plotLinesAndBandsGroups[G] = H = M.g("plot-" + G).attr(B).add()); + u && (e.svgElem = t = M.path().attr(A).add(H)); + if (h) A = f.getPlotLinePath(v, t.strokeWidth()); + else if (p) A = f.getPlotBandPath(b, d, k); + else return; + u && A && A.length ? (t.attr({ + d: A + }), D && a.objectEach(D, function (a, b) { + t.on(b, function (a) { + D[b].apply(e, [a]) + }) + })) : t && (A ? (t.show(), t.animate({ + d: A + })) : (t.hide(), l && (e.label = l = l.destroy()))); + r && n(r.text) && A && A.length && 0 < f.width && 0 < f.height && !A.isFlat ? (r = y({ + align: c && p && "center", + x: c ? !p && 4 : 10, + verticalAlign: !c && p && "middle", + y: c ? p ? 16 : 10 : p ? 6 : -4, + rotation: c && !p && 90 + }, r), this.renderLabel(r, A, p, m)) : l && l.hide(); + return e + }, + renderLabel: function (a, f, c, k) { + var e = this.label, + l = this.axis.chart.renderer; + e || (e = { + align: a.textAlign || a.align, + rotation: a.rotation, + "class": "highcharts-plot-" + (c ? "band" : "line") + "-label " + (a.className || "") + }, e.zIndex = k, this.label = e = l.text(a.text, 0, 0, a.useHTML).attr(e).add(), e.css(a.style)); + k = f.xBounds || [f[1], f[4], c ? f[6] : f[1]]; + f = f.yBounds || [f[2], f[5], c ? f[7] : f[2]]; + c = F(k); + l = F(f); + e.align(a, !1, { + x: c, + y: l, + width: E(k) - c, + height: E(f) - l + }); + e.show() + }, + destroy: function () { + u(this.axis.plotLinesAndBands, this); + delete this.axis; + h(this) + } + }; + a.extend(C.prototype, { + getPlotBandPath: function (a, f) { + var c = this.getPlotLinePath(f, + null, null, !0), + k = this.getPlotLinePath(a, null, null, !0), + e = [], + l = this.horiz, + d = 1, + b; + a = a < this.min && f < this.min || a > this.max && f > this.max; + if (k && c) + for (a && (b = k.toString() === c.toString(), d = 0), a = 0; a < k.length; a += 6) l && c[a + 1] === k[a + 1] ? (c[a + 1] += d, c[a + 4] += d) : l || c[a + 2] !== k[a + 2] || (c[a + 2] += d, c[a + 5] += d), e.push("M", k[a + 1], k[a + 2], "L", k[a + 4], k[a + 5], c[a + 4], c[a + 5], c[a + 1], c[a + 2], "z"), e.isFlat = b; + return e + }, + addPlotBand: function (a) { + return this.addPlotBandOrLine(a, "plotBands") + }, + addPlotLine: function (a) { + return this.addPlotBandOrLine(a, + "plotLines") + }, + addPlotBandOrLine: function (e, f) { + var c = (new a.PlotLineOrBand(this, e)).render(), + k = this.userOptions; + c && (f && (k[f] = k[f] || [], k[f].push(e)), this.plotLinesAndBands.push(c)); + return c + }, + removePlotBandOrLine: function (a) { + for (var f = this.plotLinesAndBands, c = this.options, k = this.userOptions, r = f.length; r--;) f[r].id === a && f[r].destroy(); + e([c.plotLines || [], k.plotLines || [], c.plotBands || [], k.plotBands || []], function (c) { + for (r = c.length; r--;) c[r].id === a && u(c, c[r]) + }) + }, + removePlotBand: function (a) { + this.removePlotBandOrLine(a) + }, + removePlotLine: function (a) { + this.removePlotBandOrLine(a) + } + }) + })(K, V); + (function (a) { + var C = a.doc, + E = a.each, + F = a.extend, + n = a.format, + h = a.isNumber, + e = a.map, + u = a.merge, + y = a.pick, + q = a.splat, + x = a.syncTimeout, + f = a.timeUnits; + a.Tooltip = function () { + this.init.apply(this, arguments) + }; + a.Tooltip.prototype = { + init: function (a, f) { + this.chart = a; + this.options = f; + this.crosshairs = []; + this.now = { + x: 0, + y: 0 + }; + this.isHidden = !0; + this.split = f.split && !a.inverted; + this.shared = f.shared || this.split; + this.outside = f.outside && !this.split + }, + cleanSplit: function (a) { + E(this.chart.series, + function (c) { + var f = c && c.tt; + f && (!f.isActive || a ? c.tt = f.destroy() : f.isActive = !1) + }) + }, + getLabel: function () { + var c = this.chart.renderer, + f = this.options, + e; + this.label || (this.outside && (this.container = e = a.doc.createElement("div"), e.className = "highcharts-tooltip-container", a.css(e, { + position: "absolute", + top: "1px", + pointerEvents: "none" + }), a.doc.body.appendChild(e), this.renderer = c = new a.Renderer(e, 0, 0)), this.split ? this.label = c.g("tooltip") : (this.label = c.label("", 0, 0, f.shape || "callout", null, null, f.useHTML, null, "tooltip").attr({ + padding: f.padding, + r: f.borderRadius + }), this.label.attr({ + fill: f.backgroundColor, + "stroke-width": f.borderWidth + }).css(f.style).shadow(f.shadow)), this.outside && (this.label.attr({ + x: this.distance, + y: this.distance + }), this.label.xSetter = function (a) { + e.style.left = a + "px" + }, this.label.ySetter = function (a) { + e.style.top = a + "px" + }), this.label.attr({ + zIndex: 8 + }).add()); + return this.label + }, + update: function (a) { + this.destroy(); + u(!0, this.chart.options.tooltip.userOptions, a); + this.init(this.chart, u(!0, this.options, a)) + }, + destroy: function () { + this.label && + (this.label = this.label.destroy()); + this.split && this.tt && (this.cleanSplit(this.chart, !0), this.tt = this.tt.destroy()); + this.renderer && (this.renderer = this.renderer.destroy(), a.discardElement(this.container)); + a.clearTimeout(this.hideTimer); + a.clearTimeout(this.tooltipTimeout) + }, + move: function (c, f, e, l) { + var d = this, + b = d.now, + v = !1 !== d.options.animation && !d.isHidden && (1 < Math.abs(c - b.x) || 1 < Math.abs(f - b.y)), + p = d.followPointer || 1 < d.len; + F(b, { + x: v ? (2 * b.x + c) / 3 : c, + y: v ? (b.y + f) / 2 : f, + anchorX: p ? void 0 : v ? (2 * b.anchorX + e) / 3 : e, + anchorY: p ? + void 0 : v ? (b.anchorY + l) / 2 : l + }); + d.getLabel().attr(b); + v && (a.clearTimeout(this.tooltipTimeout), this.tooltipTimeout = setTimeout(function () { + d && d.move(c, f, e, l) + }, 32)) + }, + hide: function (c) { + var f = this; + a.clearTimeout(this.hideTimer); + c = y(c, this.options.hideDelay, 500); + this.isHidden || (this.hideTimer = x(function () { + f.getLabel()[c ? "fadeOut" : "hide"](); + f.isHidden = !0 + }, c)) + }, + getAnchor: function (a, f) { + var c, l = this.chart, + d = l.inverted, + b = l.plotTop, + v = l.plotLeft, + p = 0, + k = 0, + t, h; + a = q(a); + c = a[0].tooltipPos; + this.followPointer && f && (void 0 === + f.chartX && (f = l.pointer.normalize(f)), c = [f.chartX - l.plotLeft, f.chartY - b]); + c || (E(a, function (a) { + t = a.series.yAxis; + h = a.series.xAxis; + p += a.plotX + (!d && h ? h.left - v : 0); + k += (a.plotLow ? (a.plotLow + a.plotHigh) / 2 : a.plotY) + (!d && t ? t.top - b : 0) + }), p /= a.length, k /= a.length, c = [d ? l.plotWidth - k : p, this.shared && !d && 1 < a.length && f ? f.chartY - b : d ? l.plotHeight - p : k]); + return e(c, Math.round) + }, + getPosition: function (a, f, e) { + var c = this.chart, + d = this.distance, + b = {}, + v = c.inverted && e.h || 0, + p, k = this.outside, + t = k ? C.documentElement.clientWidth - 2 * d : c.chartWidth, + h = k ? Math.max(C.body.scrollHeight, C.documentElement.scrollHeight, C.body.offsetHeight, C.documentElement.offsetHeight, C.documentElement.clientHeight) : c.chartHeight, + A = c.pointer.chartPosition, + r = ["y", h, f, (k ? A.top - d : 0) + e.plotY + c.plotTop, k ? 0 : c.plotTop, k ? h : c.plotTop + c.plotHeight], + m = ["x", t, a, (k ? A.left - d : 0) + e.plotX + c.plotLeft, k ? 0 : c.plotLeft, k ? t : c.plotLeft + c.plotWidth], + D = !this.followPointer && y(e.ttBelow, !c.inverted === !!e.negative), + B = function (a, c, g, m, l, f) { + var p = g < m - d, + e = m + d + g < c, + B = m - d - g; + m += d; + if (D && e) b[a] = m; + else if (!D && + p) b[a] = B; + else if (p) b[a] = Math.min(f - g, 0 > B - v ? B : B - v); + else if (e) b[a] = Math.max(l, m + v + g > c ? m : m + v); + else return !1 + }, + q = function (a, c, g, m) { + var l; + m < d || m > c - d ? l = !1 : b[a] = m < g / 2 ? 1 : m > c - g / 2 ? c - g - 2 : m - g / 2; + return l + }, + G = function (a) { + var b = r; + r = m; + m = b; + p = a + }, + g = function () { + !1 !== B.apply(0, r) ? !1 !== q.apply(0, m) || p || (G(!0), g()) : p ? b.x = b.y = 0 : (G(!0), g()) + }; + (c.inverted || 1 < this.len) && G(); + g(); + return b + }, + defaultFormatter: function (a) { + var c = this.points || q(this), + f; + f = [a.tooltipFooterHeaderFormatter(c[0])]; + f = f.concat(a.bodyFormatter(c)); + f.push(a.tooltipFooterHeaderFormatter(c[0], + !0)); + return f + }, + refresh: function (c, f) { + var e, l = this.options, + d, b = c, + v, p = {}, + k = []; + e = l.formatter || this.defaultFormatter; + var p = this.shared, + t; + l.enabled && (a.clearTimeout(this.hideTimer), this.followPointer = q(b)[0].series.tooltipOptions.followPointer, v = this.getAnchor(b, f), f = v[0], d = v[1], !p || b.series && b.series.noSharedTooltip ? p = b.getLabelConfig() : (E(b, function (a) { + a.setState("hover"); + k.push(a.getLabelConfig()) + }), p = { + x: b[0].category, + y: b[0].y + }, p.points = k, b = b[0]), this.len = k.length, p = e.call(p, this), t = b.series, this.distance = + y(t.tooltipOptions.distance, 16), !1 === p ? this.hide() : (e = this.getLabel(), this.isHidden && e.attr({ + opacity: 1 + }).show(), this.split ? this.renderSplit(p, q(c)) : (l.style.width || e.css({ + width: this.chart.spacingBox.width + }), e.attr({ + text: p && p.join ? p.join("") : p + }), e.removeClass(/highcharts-color-[\d]+/g).addClass("highcharts-color-" + y(b.colorIndex, t.colorIndex)), e.attr({ + stroke: l.borderColor || b.color || t.color || "#666666" + }), this.updatePosition({ + plotX: f, + plotY: d, + negative: b.negative, + ttBelow: b.ttBelow, + h: v[2] || 0 + })), this.isHidden = !1)) + }, + renderSplit: function (c, f) { + var e = this, + l = [], + d = this.chart, + b = d.renderer, + v = !0, + p = this.options, + k = 0, + t = this.getLabel(); + a.isString(c) && (c = [!1, c]); + E(c.slice(0, f.length + 1), function (a, c) { + if (!1 !== a) { + c = f[c - 1] || { + isHeader: !0, + plotX: f[0].plotX + }; + var h = c.series || e, + m = h.tt, + D = c.series || {}, + B = "highcharts-color-" + y(c.colorIndex, D.colorIndex, "none"); + m || (h.tt = m = b.label(null, null, null, "callout", null, null, p.useHTML).addClass("highcharts-tooltip-box " + B).attr({ + padding: p.padding, + r: p.borderRadius, + fill: p.backgroundColor, + stroke: p.borderColor || + c.color || D.color || "#333333", + "stroke-width": p.borderWidth + }).add(t)); + m.isActive = !0; + m.attr({ + text: a + }); + m.css(p.style).shadow(p.shadow); + a = m.getBBox(); + D = a.width + m.strokeWidth(); + c.isHeader ? (k = a.height, D = Math.max(0, Math.min(c.plotX + d.plotLeft - D / 2, d.chartWidth - D))) : D = c.plotX + d.plotLeft - y(p.distance, 16) - D; + 0 > D && (v = !1); + a = (c.series && c.series.yAxis && c.series.yAxis.pos) + (c.plotY || 0); + a -= d.plotTop; + l.push({ + target: c.isHeader ? d.plotHeight + k : a, + rank: c.isHeader ? 1 : 0, + size: h.tt.getBBox().height + 1, + point: c, + x: D, + tt: m + }) + } + }); + this.cleanSplit(); + a.distribute(l, d.plotHeight + k); + E(l, function (a) { + var b = a.point, + c = b.series; + a.tt.attr({ + visibility: void 0 === a.pos ? "hidden" : "inherit", + x: v || b.isHeader ? a.x : b.plotX + d.plotLeft + y(p.distance, 16), + y: a.pos + d.plotTop, + anchorX: b.isHeader ? b.plotX + d.plotLeft : b.plotX + c.xAxis.pos, + anchorY: b.isHeader ? a.pos + d.plotTop - 15 : b.plotY + c.yAxis.pos + }) + }) + }, + updatePosition: function (a) { + var c = this.chart, + f = this.getLabel(), + l = (this.options.positioner || this.getPosition).call(this, f.width, f.height, a), + d = a.plotX + c.plotLeft; + a = a.plotY + c.plotTop; + var b; + this.outside && (b = (this.options.borderWidth || 0) + 2 * this.distance, this.renderer.setSize(f.width + b, f.height + b, !1), d += c.pointer.chartPosition.left - l.x, a += c.pointer.chartPosition.top - l.y); + this.move(Math.round(l.x), Math.round(l.y || 0), d, a) + }, + getDateFormat: function (a, e, h, l) { + var d = this.chart.time, + b = d.dateFormat("%m-%d %H:%M:%S.%L", e), + c, p, k = { + millisecond: 15, + second: 12, + minute: 9, + hour: 6, + day: 3 + }, + t = "millisecond"; + for (p in f) { + if (a === f.week && +d.dateFormat("%w", e) === h && "00:00:00.000" === b.substr(6)) { + p = "week"; + break + } + if (f[p] > + a) { + p = t; + break + } + if (k[p] && b.substr(k[p]) !== "01-01 00:00:00.000".substr(k[p])) break; + "week" !== p && (t = p) + } + p && (c = l[p]); + return c + }, + getXDateFormat: function (a, f, e) { + f = f.dateTimeLabelFormats; + var c = e && e.closestPointRange; + return (c ? this.getDateFormat(c, a.x, e.options.startOfWeek, f) : f.day) || f.year + }, + tooltipFooterHeaderFormatter: function (a, f) { + f = f ? "footer" : "header"; + var c = a.series, + l = c.tooltipOptions, + d = l.xDateFormat, + b = c.xAxis, + e = b && "datetime" === b.options.type && h(a.key), + p = l[f + "Format"]; + e && !d && (d = this.getXDateFormat(a, l, b)); + e && d && E(a.point && a.point.tooltipDateKeys || ["key"], function (a) { + p = p.replace("{point." + a + "}", "{point." + a + ":" + d + "}") + }); + return n(p, { + point: a, + series: c + }, this.chart.time) + }, + bodyFormatter: function (a) { + return e(a, function (a) { + var c = a.series.tooltipOptions; + return (c[(a.point.formatPrefix || "point") + "Formatter"] || a.point.tooltipFormatter).call(a.point, c[(a.point.formatPrefix || "point") + "Format"]) + }) + } + } + })(K); + (function (a) { + var C = a.addEvent, + E = a.attr, + F = a.charts, + n = a.color, + h = a.css, + e = a.defined, + u = a.each, + y = a.extend, + q = a.find, + x = + a.fireEvent, + f = a.isNumber, + c = a.isObject, + k = a.offset, + r = a.pick, + l = a.splat, + d = a.Tooltip; + a.Pointer = function (a, d) { + this.init(a, d) + }; + a.Pointer.prototype = { + init: function (a, c) { + this.options = c; + this.chart = a; + this.runChartClick = c.chart.events && !!c.chart.events.click; + this.pinchDown = []; + this.lastValidTouch = {}; + d && (a.tooltip = new d(a, c.tooltip), this.followTouchMove = r(c.tooltip.followTouchMove, !0)); + this.setDOMEvents() + }, + zoomOption: function (a) { + var b = this.chart, + d = b.options.chart, + c = d.zoomType || "", + b = b.inverted; + /touch/.test(a.type) && + (c = r(d.pinchType, c)); + this.zoomX = a = /x/.test(c); + this.zoomY = c = /y/.test(c); + this.zoomHor = a && !b || c && b; + this.zoomVert = c && !b || a && b; + this.hasZoom = a || c + }, + normalize: function (a, c) { + var b; + b = a.touches ? a.touches.length ? a.touches.item(0) : a.changedTouches[0] : a; + c || (this.chartPosition = c = k(this.chart.container)); + return y(a, { + chartX: Math.round(b.pageX - c.left), + chartY: Math.round(b.pageY - c.top) + }) + }, + getCoordinates: function (a) { + var b = { + xAxis: [], + yAxis: [] + }; + u(this.chart.axes, function (c) { + b[c.isXAxis ? "xAxis" : "yAxis"].push({ + axis: c, + value: c.toValue(a[c.horiz ? + "chartX" : "chartY"]) + }) + }); + return b + }, + findNearestKDPoint: function (a, d, f) { + var b; + u(a, function (a) { + var l = !(a.noSharedTooltip && d) && 0 > a.options.findNearestPointBy.indexOf("y"); + a = a.searchPoint(f, l); + if ((l = c(a, !0)) && !(l = !c(b, !0))) var l = b.distX - a.distX, + e = b.dist - a.dist, + p = (a.series.group && a.series.group.zIndex) - (b.series.group && b.series.group.zIndex), + l = 0 < (0 !== l && d ? l : 0 !== e ? e : 0 !== p ? p : b.series.index > a.series.index ? -1 : 1); + l && (b = a) + }); + return b + }, + getPointFromEvent: function (a) { + a = a.target; + for (var b; a && !b;) b = a.point, a = a.parentNode; + return b + }, + getChartCoordinatesFromPoint: function (a, c) { + var b = a.series, + d = b.xAxis, + b = b.yAxis, + f = r(a.clientX, a.plotX), + l = a.shapeArgs; + if (d && b) return c ? { + chartX: d.len + d.pos - f, + chartY: b.len + b.pos - a.plotY + } : { + chartX: f + d.pos, + chartY: a.plotY + b.pos + }; + if (l && l.x && l.y) return { + chartX: l.x, + chartY: l.y + } + }, + getHoverData: function (b, d, f, l, e, k, h) { + var p, m = [], + v = h && h.isBoosting; + l = !(!l || !b); + h = d && !d.stickyTracking ? [d] : a.grep(f, function (a) { + return a.visible && !(!e && a.directTouch) && r(a.options.enableMouseTracking, !0) && a.stickyTracking + }); + d = (p = + l ? b : this.findNearestKDPoint(h, e, k)) && p.series; + p && (e && !d.noSharedTooltip ? (h = a.grep(f, function (a) { + return a.visible && !(!e && a.directTouch) && r(a.options.enableMouseTracking, !0) && !a.noSharedTooltip + }), u(h, function (a) { + var b = q(a.points, function (a) { + return a.x === p.x && !a.isNull + }); + c(b) && (v && (b = a.getPoint(b)), m.push(b)) + })) : m.push(p)); + return { + hoverPoint: p, + hoverSeries: d, + hoverPoints: m + } + }, + runPointActions: function (b, d) { + var c = this.chart, + f = c.tooltip && c.tooltip.options.enabled ? c.tooltip : void 0, + l = f ? f.shared : !1, + e = d || c.hoverPoint, + k = e && e.series || c.hoverSeries, + k = this.getHoverData(e, k, c.series, !!d || k && k.directTouch && this.isDirectTouch, l, b, { + isBoosting: c.isBoosting + }), + h, e = k.hoverPoint; + h = k.hoverPoints; + d = (k = k.hoverSeries) && k.tooltipOptions.followPointer; + l = l && k && !k.noSharedTooltip; + if (e && (e !== c.hoverPoint || f && f.isHidden)) { + u(c.hoverPoints || [], function (b) { + -1 === a.inArray(b, h) && b.setState() + }); + u(h || [], function (a) { + a.setState("hover") + }); + if (c.hoverSeries !== k) k.onMouseOver(); + c.hoverPoint && c.hoverPoint.firePointEvent("mouseOut"); + if (!e.series) return; + e.firePointEvent("mouseOver"); + c.hoverPoints = h; + c.hoverPoint = e; + f && f.refresh(l ? h : e, b) + } else d && f && !f.isHidden && (e = f.getAnchor([{}], b), f.updatePosition({ + plotX: e[0], + plotY: e[1] + })); + this.unDocMouseMove || (this.unDocMouseMove = C(c.container.ownerDocument, "mousemove", function (b) { + var c = F[a.hoverChartIndex]; + if (c) c.pointer.onDocumentMouseMove(b) + })); + u(c.axes, function (c) { + var d = r(c.crosshair.snap, !0), + m = d ? a.find(h, function (a) { + return a.series[c.coll] === c + }) : void 0; + m || !d ? c.drawCrosshair(b, m) : c.hideCrosshair() + }) + }, + reset: function (a, + c) { + var b = this.chart, + d = b.hoverSeries, + f = b.hoverPoint, + e = b.hoverPoints, + k = b.tooltip, + h = k && k.shared ? e : f; + a && h && u(l(h), function (b) { + b.series.isCartesian && void 0 === b.plotX && (a = !1) + }); + if (a) k && h && (k.refresh(h), f && (f.setState(f.state, !0), u(b.axes, function (a) { + a.crosshair && a.drawCrosshair(null, f) + }))); + else { + if (f) f.onMouseOut(); + e && u(e, function (a) { + a.setState() + }); + if (d) d.onMouseOut(); + k && k.hide(c); + this.unDocMouseMove && (this.unDocMouseMove = this.unDocMouseMove()); + u(b.axes, function (a) { + a.hideCrosshair() + }); + this.hoverX = b.hoverPoints = + b.hoverPoint = null + } + }, + scaleGroups: function (a, c) { + var b = this.chart, + d; + u(b.series, function (f) { + d = a || f.getPlotBox(); + f.xAxis && f.xAxis.zoomEnabled && f.group && (f.group.attr(d), f.markerGroup && (f.markerGroup.attr(d), f.markerGroup.clip(c ? b.clipRect : null)), f.dataLabelsGroup && f.dataLabelsGroup.attr(d)) + }); + b.clipRect.attr(c || b.clipBox) + }, + dragStart: function (a) { + var b = this.chart; + b.mouseIsDown = a.type; + b.cancelClick = !1; + b.mouseDownX = this.mouseDownX = a.chartX; + b.mouseDownY = this.mouseDownY = a.chartY + }, + drag: function (a) { + var b = this.chart, + c = b.options.chart, + d = a.chartX, + f = a.chartY, + l = this.zoomHor, + e = this.zoomVert, + k = b.plotLeft, + m = b.plotTop, + h = b.plotWidth, + B = b.plotHeight, + r, G = this.selectionMarker, + g = this.mouseDownX, + w = this.mouseDownY, + q = c.panKey && a[c.panKey + "Key"]; + G && G.touch || (d < k ? d = k : d > k + h && (d = k + h), f < m ? f = m : f > m + B && (f = m + B), this.hasDragged = Math.sqrt(Math.pow(g - d, 2) + Math.pow(w - f, 2)), 10 < this.hasDragged && (r = b.isInsidePlot(g - k, w - m), b.hasCartesianSeries && (this.zoomX || this.zoomY) && r && !q && !G && (this.selectionMarker = G = b.renderer.rect(k, m, l ? 1 : h, e ? 1 : B, 0).attr({ + fill: c.selectionMarkerFill || + n("#335cad").setOpacity(.25).get(), + "class": "highcharts-selection-marker", + zIndex: 7 + }).add()), G && l && (d -= g, G.attr({ + width: Math.abs(d), + x: (0 < d ? 0 : d) + g + })), G && e && (d = f - w, G.attr({ + height: Math.abs(d), + y: (0 < d ? 0 : d) + w + })), r && !G && c.panning && b.pan(a, c.panning))) + }, + drop: function (a) { + var b = this, + c = this.chart, + d = this.hasPinched; + if (this.selectionMarker) { + var l = { + originalEvent: a, + xAxis: [], + yAxis: [] + }, + k = this.selectionMarker, + r = k.attr ? k.attr("x") : k.x, + q = k.attr ? k.attr("y") : k.y, + m = k.attr ? k.attr("width") : k.width, + D = k.attr ? k.attr("height") : + k.height, + B; + if (this.hasDragged || d) u(c.axes, function (c) { + if (c.zoomEnabled && e(c.min) && (d || b[{ + xAxis: "zoomX", + yAxis: "zoomY" + } [c.coll]])) { + var f = c.horiz, + g = "touchend" === a.type ? c.minPixelPadding : 0, + k = c.toValue((f ? r : q) + g), + f = c.toValue((f ? r + m : q + D) - g); + l[c.coll].push({ + axis: c, + min: Math.min(k, f), + max: Math.max(k, f) + }); + B = !0 + } + }), B && x(c, "selection", l, function (a) { + c.zoom(y(a, d ? { + animation: !1 + } : null)) + }); + f(c.index) && (this.selectionMarker = this.selectionMarker.destroy()); + d && this.scaleGroups() + } + c && f(c.index) && (h(c.container, { + cursor: c._cursor + }), + c.cancelClick = 10 < this.hasDragged, c.mouseIsDown = this.hasDragged = this.hasPinched = !1, this.pinchDown = []) + }, + onContainerMouseDown: function (a) { + a = this.normalize(a); + 2 !== a.button && (this.zoomOption(a), a.preventDefault && a.preventDefault(), this.dragStart(a)) + }, + onDocumentMouseUp: function (b) { + F[a.hoverChartIndex] && F[a.hoverChartIndex].pointer.drop(b) + }, + onDocumentMouseMove: function (a) { + var b = this.chart, + c = this.chartPosition; + a = this.normalize(a, c); + !c || this.inClass(a.target, "highcharts-tracker") || b.isInsidePlot(a.chartX - + b.plotLeft, a.chartY - b.plotTop) || this.reset() + }, + onContainerMouseLeave: function (b) { + var c = F[a.hoverChartIndex]; + c && (b.relatedTarget || b.toElement) && (c.pointer.reset(), c.pointer.chartPosition = null) + }, + onContainerMouseMove: function (b) { + var c = this.chart; + e(a.hoverChartIndex) && F[a.hoverChartIndex] && F[a.hoverChartIndex].mouseIsDown || (a.hoverChartIndex = c.index); + b = this.normalize(b); + b.returnValue = !1; + "mousedown" === c.mouseIsDown && this.drag(b); + !this.inClass(b.target, "highcharts-tracker") && !c.isInsidePlot(b.chartX - c.plotLeft, + b.chartY - c.plotTop) || c.openMenu || this.runPointActions(b) + }, + inClass: function (a, c) { + for (var b; a;) { + if (b = E(a, "class")) { + if (-1 !== b.indexOf(c)) return !0; + if (-1 !== b.indexOf("highcharts-container")) return !1 + } + a = a.parentNode + } + }, + onTrackerMouseOut: function (a) { + var b = this.chart.hoverSeries; + a = a.relatedTarget || a.toElement; + this.isDirectTouch = !1; + if (!(!b || !a || b.stickyTracking || this.inClass(a, "highcharts-tooltip") || this.inClass(a, "highcharts-series-" + b.index) && this.inClass(a, "highcharts-tracker"))) b.onMouseOut() + }, + onContainerClick: function (a) { + var b = + this.chart, + c = b.hoverPoint, + d = b.plotLeft, + f = b.plotTop; + a = this.normalize(a); + b.cancelClick || (c && this.inClass(a.target, "highcharts-tracker") ? (x(c.series, "click", y(a, { + point: c + })), b.hoverPoint && c.firePointEvent("click", a)) : (y(a, this.getCoordinates(a)), b.isInsidePlot(a.chartX - d, a.chartY - f) && x(b, "click", a))) + }, + setDOMEvents: function () { + var b = this, + c = b.chart.container, + d = c.ownerDocument; + c.onmousedown = function (a) { + b.onContainerMouseDown(a) + }; + c.onmousemove = function (a) { + b.onContainerMouseMove(a) + }; + c.onclick = function (a) { + b.onContainerClick(a) + }; + this.unbindContainerMouseLeave = C(c, "mouseleave", b.onContainerMouseLeave); + a.unbindDocumentMouseUp || (a.unbindDocumentMouseUp = C(d, "mouseup", b.onDocumentMouseUp)); + a.hasTouch && (c.ontouchstart = function (a) { + b.onContainerTouchStart(a) + }, c.ontouchmove = function (a) { + b.onContainerTouchMove(a) + }, a.unbindDocumentTouchEnd || (a.unbindDocumentTouchEnd = C(d, "touchend", b.onDocumentTouchEnd))) + }, + destroy: function () { + var b = this; + b.unDocMouseMove && b.unDocMouseMove(); + this.unbindContainerMouseLeave(); + a.chartCount || (a.unbindDocumentMouseUp && + (a.unbindDocumentMouseUp = a.unbindDocumentMouseUp()), a.unbindDocumentTouchEnd && (a.unbindDocumentTouchEnd = a.unbindDocumentTouchEnd())); + clearInterval(b.tooltipTimeout); + a.objectEach(b, function (a, c) { + b[c] = null + }) + } + } + })(K); + (function (a) { + var C = a.charts, + E = a.each, + F = a.extend, + n = a.map, + h = a.noop, + e = a.pick; + F(a.Pointer.prototype, { + pinchTranslate: function (a, e, h, n, f, c) { + this.zoomHor && this.pinchTranslateDirection(!0, a, e, h, n, f, c); + this.zoomVert && this.pinchTranslateDirection(!1, a, e, h, n, f, c) + }, + pinchTranslateDirection: function (a, + e, h, n, f, c, k, r) { + var l = this.chart, + d = a ? "x" : "y", + b = a ? "X" : "Y", + v = "chart" + b, + p = a ? "width" : "height", + q = l["plot" + (a ? "Left" : "Top")], + t, u, A = r || 1, + y = l.inverted, + m = l.bounds[a ? "h" : "v"], + D = 1 === e.length, + B = e[0][v], + M = h[0][v], + G = !D && e[1][v], + g = !D && h[1][v], + w; + h = function () { + !D && 20 < Math.abs(B - G) && (A = r || Math.abs(M - g) / Math.abs(B - G)); + u = (q - M) / A + B; + t = l["plot" + (a ? "Width" : "Height")] / A + }; + h(); + e = u; + e < m.min ? (e = m.min, w = !0) : e + t > m.max && (e = m.max - t, w = !0); + w ? (M -= .8 * (M - k[d][0]), D || (g -= .8 * (g - k[d][1])), h()) : k[d] = [M, g]; + y || (c[d] = u - q, c[p] = t); + c = y ? 1 / A : A; + f[p] = + t; + f[d] = e; + n[y ? a ? "scaleY" : "scaleX" : "scale" + b] = A; + n["translate" + b] = c * q + (M - c * B) + }, + pinch: function (a) { + var u = this, + q = u.chart, + x = u.pinchDown, + f = a.touches, + c = f.length, + k = u.lastValidTouch, + r = u.hasZoom, + l = u.selectionMarker, + d = {}, + b = 1 === c && (u.inClass(a.target, "highcharts-tracker") && q.runTrackerClick || u.runChartClick), + v = {}; + 1 < c && (u.initiated = !0); + r && u.initiated && !b && a.preventDefault(); + n(f, function (a) { + return u.normalize(a) + }); + "touchstart" === a.type ? (E(f, function (a, b) { + x[b] = { + chartX: a.chartX, + chartY: a.chartY + } + }), k.x = [x[0].chartX, + x[1] && x[1].chartX + ], k.y = [x[0].chartY, x[1] && x[1].chartY], E(q.axes, function (a) { + if (a.zoomEnabled) { + var b = q.bounds[a.horiz ? "h" : "v"], + c = a.minPixelPadding, + d = a.toPixels(e(a.options.min, a.dataMin)), + f = a.toPixels(e(a.options.max, a.dataMax)), + l = Math.max(d, f); + b.min = Math.min(a.pos, Math.min(d, f) - c); + b.max = Math.max(a.pos + a.len, l + c) + } + }), u.res = !0) : u.followTouchMove && 1 === c ? this.runPointActions(u.normalize(a)) : x.length && (l || (u.selectionMarker = l = F({ + destroy: h, + touch: !0 + }, q.plotBox)), u.pinchTranslate(x, f, d, l, v, k), u.hasPinched = + r, u.scaleGroups(d, v), u.res && (u.res = !1, this.reset(!1, 0))) + }, + touch: function (h, n) { + var q = this.chart, + u, f; + if (q.index !== a.hoverChartIndex) this.onContainerMouseLeave({ + relatedTarget: !0 + }); + a.hoverChartIndex = q.index; + 1 === h.touches.length ? (h = this.normalize(h), (f = q.isInsidePlot(h.chartX - q.plotLeft, h.chartY - q.plotTop)) && !q.openMenu ? (n && this.runPointActions(h), "touchmove" === h.type && (n = this.pinchDown, u = n[0] ? 4 <= Math.sqrt(Math.pow(n[0].chartX - h.chartX, 2) + Math.pow(n[0].chartY - h.chartY, 2)) : !1), e(u, !0) && this.pinch(h)) : n && + this.reset()) : 2 === h.touches.length && this.pinch(h) + }, + onContainerTouchStart: function (a) { + this.zoomOption(a); + this.touch(a, !0) + }, + onContainerTouchMove: function (a) { + this.touch(a) + }, + onDocumentTouchEnd: function (e) { + C[a.hoverChartIndex] && C[a.hoverChartIndex].pointer.drop(e) + } + }) + })(K); + (function (a) { + var C = a.addEvent, + E = a.charts, + F = a.css, + n = a.doc, + h = a.extend, + e = a.noop, + u = a.Pointer, + y = a.removeEvent, + q = a.win, + x = a.wrap; + if (!a.hasTouch && (q.PointerEvent || q.MSPointerEvent)) { + var f = {}, + c = !!q.PointerEvent, + k = function () { + var c = []; + c.item = function (a) { + return this[a] + }; + a.objectEach(f, function (a) { + c.push({ + pageX: a.pageX, + pageY: a.pageY, + target: a.target + }) + }); + return c + }, + r = function (c, d, b, f) { + "touch" !== c.pointerType && c.pointerType !== c.MSPOINTER_TYPE_TOUCH || !E[a.hoverChartIndex] || (f(c), f = E[a.hoverChartIndex].pointer, f[d]({ + type: b, + target: c.currentTarget, + preventDefault: e, + touches: k() + })) + }; + h(u.prototype, { + onContainerPointerDown: function (a) { + r(a, "onContainerTouchStart", "touchstart", function (a) { + f[a.pointerId] = { + pageX: a.pageX, + pageY: a.pageY, + target: a.currentTarget + } + }) + }, + onContainerPointerMove: function (a) { + r(a, + "onContainerTouchMove", "touchmove", + function (a) { + f[a.pointerId] = { + pageX: a.pageX, + pageY: a.pageY + }; + f[a.pointerId].target || (f[a.pointerId].target = a.currentTarget) + }) + }, + onDocumentPointerUp: function (a) { + r(a, "onDocumentTouchEnd", "touchend", function (a) { + delete f[a.pointerId] + }) + }, + batchMSEvents: function (a) { + a(this.chart.container, c ? "pointerdown" : "MSPointerDown", this.onContainerPointerDown); + a(this.chart.container, c ? "pointermove" : "MSPointerMove", this.onContainerPointerMove); + a(n, c ? "pointerup" : "MSPointerUp", this.onDocumentPointerUp) + } + }); + x(u.prototype, "init", function (a, c, b) { + a.call(this, c, b); + this.hasZoom && F(c.container, { + "-ms-touch-action": "none", + "touch-action": "none" + }) + }); + x(u.prototype, "setDOMEvents", function (a) { + a.apply(this); + (this.hasZoom || this.followTouchMove) && this.batchMSEvents(C) + }); + x(u.prototype, "destroy", function (a) { + this.batchMSEvents(y); + a.call(this) + }) + } + })(K); + (function (a) { + var C = a.addEvent, + E = a.css, + F = a.discardElement, + n = a.defined, + h = a.each, + e = a.fireEvent, + u = a.isFirefox, + y = a.marginNames, + q = a.merge, + x = a.pick, + f = a.setAnimation, + c = a.stableSort, + k = a.win, + r = a.wrap; + a.Legend = function (a, c) { + this.init(a, c) + }; + a.Legend.prototype = { + init: function (a, c) { + this.chart = a; + this.setOptions(c); + c.enabled && (this.render(), C(this.chart, "endResize", function () { + this.legend.positionCheckboxes() + }), this.proximate ? this.unchartrender = C(this.chart, "render", function () { + this.legend.proximatePositions(); + this.legend.positionItems() + }) : this.unchartrender && this.unchartrender()) + }, + setOptions: function (a) { + var c = x(a.padding, 8); + this.options = a; + this.itemStyle = a.itemStyle; + this.itemHiddenStyle = + q(this.itemStyle, a.itemHiddenStyle); + this.itemMarginTop = a.itemMarginTop || 0; + this.padding = c; + this.initialItemY = c - 5; + this.symbolWidth = x(a.symbolWidth, 16); + this.pages = []; + this.proximate = "proximate" === a.layout && !this.chart.inverted + }, + update: function (a, c) { + var b = this.chart; + this.setOptions(q(!0, this.options, a)); + this.destroy(); + b.isDirtyLegend = b.isDirtyBox = !0; + x(c, !0) && b.redraw(); + e(this, "afterUpdate") + }, + colorizeItem: function (a, c) { + a.legendGroup[c ? "removeClass" : "addClass"]("highcharts-legend-item-hidden"); + var b = this.options, + d = a.legendItem, + f = a.legendLine, + l = a.legendSymbol, + k = this.itemHiddenStyle.color, + b = c ? b.itemStyle.color : k, + h = c ? a.color || k : k, + r = a.options && a.options.marker, + q = { + fill: h + }; + d && d.css({ + fill: b, + color: b + }); + f && f.attr({ + stroke: h + }); + l && (r && l.isMarker && (q = a.pointAttribs(), c || (q.stroke = q.fill = k)), l.attr(q)); + e(this, "afterColorizeItem", { + item: a, + visible: c + }) + }, + positionItems: function () { + h(this.allItems, this.positionItem, this); + this.chart.isResizing || this.positionCheckboxes() + }, + positionItem: function (a) { + var c = this.options, + b = c.symbolPadding, + c = !c.rtl, + f = a._legendItemPos, + l = f[0], + f = f[1], + e = a.checkbox; + if ((a = a.legendGroup) && a.element) a[n(a.translateY) ? "animate" : "attr"]({ + translateX: c ? l : this.legendWidth - l - 2 * b - 4, + translateY: f + }); + e && (e.x = l, e.y = f) + }, + destroyItem: function (a) { + var c = a.checkbox; + h(["legendItem", "legendLine", "legendSymbol", "legendGroup"], function (b) { + a[b] && (a[b] = a[b].destroy()) + }); + c && F(a.checkbox) + }, + destroy: function () { + function a(a) { + this[a] && (this[a] = this[a].destroy()) + } + h(this.getAllItems(), function (c) { + h(["legendItem", "legendGroup"], a, c) + }); + h("clipRect up down pager nav box title group".split(" "), + a, this); + this.display = null + }, + positionCheckboxes: function () { + var a = this.group && this.group.alignAttr, + c, b = this.clipHeight || this.legendHeight, + f = this.titleHeight; + a && (c = a.translateY, h(this.allItems, function (d) { + var l = d.checkbox, + e; + l && (e = c + f + l.y + (this.scrollOffset || 0) + 3, E(l, { + left: a.translateX + d.checkboxOffset + l.x - 20 + "px", + top: e + "px", + display: e > c - 6 && e < c + b - 6 ? "" : "none" + })) + }, this)) + }, + renderTitle: function () { + var a = this.options, + c = this.padding, + b = a.title, + f = 0; + b.text && (this.title || (this.title = this.chart.renderer.label(b.text, + c - 3, c - 4, null, null, null, a.useHTML, null, "legend-title").attr({ + zIndex: 1 + }).css(b.style).add(this.group)), a = this.title.getBBox(), f = a.height, this.offsetWidth = a.width, this.contentGroup.attr({ + translateY: f + })); + this.titleHeight = f + }, + setText: function (c) { + var d = this.options; + c.legendItem.attr({ + text: d.labelFormat ? a.format(d.labelFormat, c, this.chart.time) : d.labelFormatter.call(c) + }) + }, + renderItem: function (a) { + var c = this.chart, + b = c.renderer, + f = this.options, + e = this.symbolWidth, + l = f.symbolPadding, + k = this.itemStyle, + h = this.itemHiddenStyle, + r = "horizontal" === f.layout ? x(f.itemDistance, 20) : 0, + n = !f.rtl, + m = a.legendItem, + D = !a.series, + B = !D && a.series.drawLegendSymbol ? a.series : a, + u = B.options, + u = this.createCheckboxForItem && u && u.showCheckbox, + r = e + l + r + (u ? 20 : 0), + G = f.useHTML, + g = a.options.className; + m || (a.legendGroup = b.g("legend-item").addClass("highcharts-" + B.type + "-series highcharts-color-" + a.colorIndex + (g ? " " + g : "") + (D ? " highcharts-series-" + a.index : "")).attr({ + zIndex: 1 + }).add(this.scrollGroup), a.legendItem = m = b.text("", n ? e + l : -l, this.baseline || 0, G).css(q(a.visible ? + k : h)).attr({ + align: n ? "left" : "right", + zIndex: 2 + }).add(a.legendGroup), this.baseline || (e = k.fontSize, this.fontMetrics = b.fontMetrics(e, m), this.baseline = this.fontMetrics.f + 3 + this.itemMarginTop, m.attr("y", this.baseline)), this.symbolHeight = f.symbolHeight || this.fontMetrics.f, B.drawLegendSymbol(this, a), this.setItemEvents && this.setItemEvents(a, m, G), u && this.createCheckboxForItem(a)); + this.colorizeItem(a, a.visible); + k.width || m.css({ + width: (f.itemWidth || f.width || c.spacingBox.width) - r + }); + this.setText(a); + c = m.getBBox(); + a.itemWidth = a.checkboxOffset = f.itemWidth || a.legendItemWidth || c.width + r; + this.maxItemWidth = Math.max(this.maxItemWidth, a.itemWidth); + this.totalItemWidth += a.itemWidth; + this.itemHeight = a.itemHeight = Math.round(a.legendItemHeight || c.height || this.symbolHeight) + }, + layoutItem: function (a) { + var c = this.options, + b = this.padding, + f = "horizontal" === c.layout, + e = a.itemHeight, + l = c.itemMarginBottom || 0, + k = this.itemMarginTop, + h = f ? x(c.itemDistance, 20) : 0, + r = c.width, + q = r || this.chart.spacingBox.width - 2 * b - c.x, + c = c.alignColumns && this.totalItemWidth > + q ? this.maxItemWidth : a.itemWidth; + f && this.itemX - b + c > q && (this.itemX = b, this.itemY += k + this.lastLineHeight + l, this.lastLineHeight = 0); + this.lastItemY = k + this.itemY + l; + this.lastLineHeight = Math.max(e, this.lastLineHeight); + a._legendItemPos = [this.itemX, this.itemY]; + f ? this.itemX += c : (this.itemY += k + e + l, this.lastLineHeight = e); + this.offsetWidth = r || Math.max((f ? this.itemX - b - (a.checkbox ? 0 : h) : c) + b, this.offsetWidth) + }, + getAllItems: function () { + var a = []; + h(this.chart.series, function (c) { + var b = c && c.options; + c && x(b.showInLegend, n(b.linkedTo) ? + !1 : void 0, !0) && (a = a.concat(c.legendItems || ("point" === b.legendType ? c.data : c))) + }); + e(this, "afterGetAllItems", { + allItems: a + }); + return a + }, + getAlignment: function () { + var a = this.options; + return this.proximate ? a.align.charAt(0) + "tv" : a.floating ? "" : a.align.charAt(0) + a.verticalAlign.charAt(0) + a.layout.charAt(0) + }, + adjustMargins: function (a, c) { + var b = this.chart, + d = this.options, + f = this.getAlignment(); + f && h([/(lth|ct|rth)/, /(rtv|rm|rbv)/, /(rbh|cb|lbh)/, /(lbv|lm|ltv)/], function (e, l) { + e.test(f) && !n(a[l]) && (b[y[l]] = Math.max(b[y[l]], + b.legend[(l + 1) % 2 ? "legendHeight" : "legendWidth"] + [1, -1, -1, 1][l] * d[l % 2 ? "x" : "y"] + x(d.margin, 12) + c[l] + (0 === l && void 0 !== b.options.title.margin ? b.titleOffset + b.options.title.margin : 0))) + }) + }, + proximatePositions: function () { + var c = this.chart, + d = [], + b = "left" === this.options.align; + h(this.allItems, function (f) { + var e, l; + e = b; + f.xAxis && f.points && (f.xAxis.options.reversed && (e = !e), e = a.find(e ? f.points : f.points.slice(0).reverse(), function (b) { + return a.isNumber(b.plotY) + }), l = f.legendGroup.getBBox().height, d.push({ + target: f.visible ? + e.plotY - .3 * l : c.plotHeight, + size: l, + item: f + })) + }, this); + a.distribute(d, c.plotHeight); + h(d, function (a) { + a.item._legendItemPos[1] = c.plotTop - c.spacing[0] + a.pos + }) + }, + render: function () { + var a = this.chart, + d = a.renderer, + b = this.group, + f, e, k, r = this.box, + n = this.options, + A = this.padding; + this.itemX = A; + this.itemY = this.initialItemY; + this.lastItemY = this.offsetWidth = 0; + b || (this.group = b = d.g("legend").attr({ + zIndex: 7 + }).add(), this.contentGroup = d.g().attr({ + zIndex: 1 + }).add(b), this.scrollGroup = d.g().add(this.contentGroup)); + this.renderTitle(); + f = this.getAllItems(); + c(f, function (a, b) { + return (a.options && a.options.legendIndex || 0) - (b.options && b.options.legendIndex || 0) + }); + n.reversed && f.reverse(); + this.allItems = f; + this.display = e = !!f.length; + this.itemHeight = this.totalItemWidth = this.maxItemWidth = this.lastLineHeight = 0; + h(f, this.renderItem, this); + h(f, this.layoutItem, this); + f = (n.width || this.offsetWidth) + A; + k = this.lastItemY + this.lastLineHeight + this.titleHeight; + k = this.handleOverflow(k); + k += A; + r || (this.box = r = d.rect().addClass("highcharts-legend-box").attr({ + r: n.borderRadius + }).add(b), + r.isNew = !0); + r.attr({ + stroke: n.borderColor, + "stroke-width": n.borderWidth || 0, + fill: n.backgroundColor || "none" + }).shadow(n.shadow); + 0 < f && 0 < k && (r[r.isNew ? "attr" : "animate"](r.crisp.call({}, { + x: 0, + y: 0, + width: f, + height: k + }, r.strokeWidth())), r.isNew = !1); + r[e ? "show" : "hide"](); + this.legendWidth = f; + this.legendHeight = k; + e && (d = a.spacingBox, /(lth|ct|rth)/.test(this.getAlignment()) && (d = q(d, { + y: d.y + a.titleOffset + a.options.title.margin + })), b.align(q(n, { + width: f, + height: k, + verticalAlign: this.proximate ? "top" : n.verticalAlign + }), !0, d)); + this.proximate || + this.positionItems() + }, + handleOverflow: function (a) { + var c = this, + b = this.chart, + f = b.renderer, + e = this.options, + l = e.y, + k = this.padding, + b = b.spacingBox.height + ("top" === e.verticalAlign ? -l : l) - k, + l = e.maxHeight, + r, A = this.clipRect, + q = e.navigation, + m = x(q.animation, !0), + D = q.arrowSize || 12, + B = this.nav, + n = this.pages, + G, g = this.allItems, + w = function (a) { + "number" === typeof a ? A.attr({ + height: a + }) : A && (c.clipRect = A.destroy(), c.contentGroup.clip()); + c.contentGroup.div && (c.contentGroup.div.style.clip = a ? "rect(" + k + "px,9999px," + (k + a) + "px,0)" : "auto") + }; + "horizontal" !== e.layout || "middle" === e.verticalAlign || e.floating || (b /= 2); + l && (b = Math.min(b, l)); + n.length = 0; + a > b && !1 !== q.enabled ? (this.clipHeight = r = Math.max(b - 20 - this.titleHeight - k, 0), this.currentPage = x(this.currentPage, 1), this.fullHeight = a, h(g, function (a, b) { + var c = a._legendItemPos[1], + d = Math.round(a.legendItem.getBBox().height), + f = n.length; + if (!f || c - n[f - 1] > r && (G || c) !== n[f - 1]) n.push(G || c), f++; + a.pageIx = f - 1; + G && (g[b - 1].pageIx = f - 1); + b === g.length - 1 && c + d - n[f - 1] > r && (n.push(c), a.pageIx = f); + c !== G && (G = c) + }), A || (A = c.clipRect = + f.clipRect(0, k, 9999, 0), c.contentGroup.clip(A)), w(r), B || (this.nav = B = f.g().attr({ + zIndex: 1 + }).add(this.group), this.up = f.symbol("triangle", 0, 0, D, D).on("click", function () { + c.scroll(-1, m) + }).add(B), this.pager = f.text("", 15, 10).addClass("highcharts-legend-navigation").css(q.style).add(B), this.down = f.symbol("triangle-down", 0, 0, D, D).on("click", function () { + c.scroll(1, m) + }).add(B)), c.scroll(0), a = b) : B && (w(), this.nav = B.destroy(), this.scrollGroup.attr({ + translateY: 1 + }), this.clipHeight = 0); + return a + }, + scroll: function (a, c) { + var b = + this.pages, + d = b.length; + a = this.currentPage + a; + var e = this.clipHeight, + l = this.options.navigation, + k = this.pager, + h = this.padding; + a > d && (a = d); + 0 < a && (void 0 !== c && f(c, this.chart), this.nav.attr({ + translateX: h, + translateY: e + this.padding + 7 + this.titleHeight, + visibility: "visible" + }), this.up.attr({ + "class": 1 === a ? "highcharts-legend-nav-inactive" : "highcharts-legend-nav-active" + }), k.attr({ + text: a + "/" + d + }), this.down.attr({ + x: 18 + this.pager.getBBox().width, + "class": a === d ? "highcharts-legend-nav-inactive" : "highcharts-legend-nav-active" + }), + this.up.attr({ + fill: 1 === a ? l.inactiveColor : l.activeColor + }).css({ + cursor: 1 === a ? "default" : "pointer" + }), this.down.attr({ + fill: a === d ? l.inactiveColor : l.activeColor + }).css({ + cursor: a === d ? "default" : "pointer" + }), this.scrollOffset = -b[a - 1] + this.initialItemY, this.scrollGroup.animate({ + translateY: this.scrollOffset + }), this.currentPage = a, this.positionCheckboxes()) + } + }; + a.LegendSymbolMixin = { + drawRectangle: function (a, c) { + var b = a.symbolHeight, + d = a.options.squareSymbol; + c.legendSymbol = this.chart.renderer.rect(d ? (a.symbolWidth - b) / 2 : + 0, a.baseline - b + 1, d ? b : a.symbolWidth, b, x(a.options.symbolRadius, b / 2)).addClass("highcharts-point").attr({ + zIndex: 3 + }).add(c.legendGroup) + }, + drawLineMarker: function (a) { + var c = this.options, + b = c.marker, + f = a.symbolWidth, + e = a.symbolHeight, + k = e / 2, + l = this.chart.renderer, + h = this.legendGroup; + a = a.baseline - Math.round(.3 * a.fontMetrics.b); + var r; + r = { + "stroke-width": c.lineWidth || 0 + }; + c.dashStyle && (r.dashstyle = c.dashStyle); + this.legendLine = l.path(["M", 0, a, "L", f, a]).addClass("highcharts-graph").attr(r).add(h); + b && !1 !== b.enabled && f && + (c = Math.min(x(b.radius, k), k), 0 === this.symbol.indexOf("url") && (b = q(b, { + width: e, + height: e + }), c = 0), this.legendSymbol = b = l.symbol(this.symbol, f / 2 - c, a - c, 2 * c, 2 * c, b).addClass("highcharts-point").add(h), b.isMarker = !0) + } + }; + (/Trident\/7\.0/.test(k.navigator.userAgent) || u) && r(a.Legend.prototype, "positionItem", function (a, c) { + var b = this, + d = function () { + c._legendItemPos && a.call(b, c) + }; + d(); + setTimeout(d) + }) + })(K); + (function (a) { + var C = a.addEvent, + E = a.animate, + F = a.animObject, + n = a.attr, + h = a.doc, + e = a.Axis, + u = a.createElement, + y = a.defaultOptions, + q = a.discardElement, + x = a.charts, + f = a.css, + c = a.defined, + k = a.each, + r = a.extend, + l = a.find, + d = a.fireEvent, + b = a.grep, + v = a.isNumber, + p = a.isObject, + I = a.isString, + t = a.Legend, + L = a.marginNames, + A = a.merge, + H = a.objectEach, + m = a.Pointer, + D = a.pick, + B = a.pInt, + M = a.removeEvent, + G = a.seriesTypes, + g = a.splat, + w = a.syncTimeout, + P = a.win, + Q = a.Chart = function () { + this.getArgs.apply(this, arguments) + }; + a.chart = function (a, b, c) { + return new Q(a, b, c) + }; + r(Q.prototype, { + callbacks: [], + getArgs: function () { + var a = [].slice.call(arguments); + if (I(a[0]) || a[0].nodeName) this.renderTo = + a.shift(); + this.init(a[0], a[1]) + }, + init: function (b, c) { + var g, f, m = b.series, + e = b.plotOptions || {}; + d(this, "init", { + args: arguments + }, function () { + b.series = null; + g = A(y, b); + for (f in g.plotOptions) g.plotOptions[f].tooltip = e[f] && A(e[f].tooltip) || void 0; + g.tooltip.userOptions = b.chart && b.chart.forExport && b.tooltip.userOptions || b.tooltip; + g.series = b.series = m; + this.userOptions = b; + var k = g.chart, + l = k.events; + this.margin = []; + this.spacing = []; + this.bounds = { + h: {}, + v: {} + }; + this.labelCollectors = []; + this.callback = c; + this.isResizing = 0; + this.options = + g; + this.axes = []; + this.series = []; + this.time = b.time && a.keys(b.time).length ? new a.Time(b.time) : a.time; + this.hasCartesianSeries = k.showAxes; + var h = this; + h.index = x.length; + x.push(h); + a.chartCount++; + l && H(l, function (a, b) { + C(h, b, a) + }); + h.xAxis = []; + h.yAxis = []; + h.pointCount = h.colorCounter = h.symbolCounter = 0; + d(h, "afterInit"); + h.firstRender() + }) + }, + initSeries: function (b) { + var c = this.options.chart; + (c = G[b.type || c.type || c.defaultSeriesType]) || a.error(17, !0); + c = new c; + c.init(this, b); + return c + }, + orderSeries: function (a) { + var b = this.series; + for (a = a || 0; a < b.length; a++) b[a] && (b[a].index = a, b[a].name = b[a].getName()) + }, + isInsidePlot: function (a, b, c) { + var d = c ? b : a; + a = c ? a : b; + return 0 <= d && d <= this.plotWidth && 0 <= a && a <= this.plotHeight + }, + redraw: function (b) { + d(this, "beforeRedraw"); + var c = this.axes, + g = this.series, + f = this.pointer, + m = this.legend, + e = this.isDirtyLegend, + l, h, B = this.hasCartesianSeries, + D = this.isDirtyBox, + w, p = this.renderer, + t = p.isHidden(), + G = []; + this.setResponsive && this.setResponsive(!1); + a.setAnimation(b, this); + t && this.temporaryDisplay(); + this.layOutTitles(); + for (b = g.length; b--;) + if (w = g[b], w.options.stacking && (l = !0, w.isDirty)) { + h = !0; + break + } + if (h) + for (b = g.length; b--;) w = g[b], w.options.stacking && (w.isDirty = !0); + k(g, function (a) { + a.isDirty && "point" === a.options.legendType && (a.updateTotals && a.updateTotals(), e = !0); + a.isDirtyData && d(a, "updatedData") + }); + e && m.options.enabled && (m.render(), this.isDirtyLegend = !1); + l && this.getStacks(); + B && k(c, function (a) { + a.updateNames(); + a.setScale() + }); + this.getMargins(); + B && (k(c, function (a) { + a.isDirty && (D = !0) + }), k(c, function (a) { + var b = a.min + "," + a.max; + a.extKey !== b && (a.extKey = b, G.push(function () { + d(a, "afterSetExtremes", r(a.eventArgs, a.getExtremes())); + delete a.eventArgs + })); + (D || l) && a.redraw() + })); + D && this.drawChartBox(); + d(this, "predraw"); + k(g, function (a) { + (D || a.isDirty) && a.visible && a.redraw(); + a.isDirtyData = !1 + }); + f && f.reset(!0); + p.draw(); + d(this, "redraw"); + d(this, "render"); + t && this.temporaryDisplay(!0); + k(G, function (a) { + a.call() + }) + }, + get: function (a) { + function b(b) { + return b.id === a || b.options && b.options.id === a + } + var c, d = this.series, + g; + c = l(this.axes, b) || l(this.series, + b); + for (g = 0; !c && g < d.length; g++) c = l(d[g].points || [], b); + return c + }, + getAxes: function () { + var a = this, + b = this.options, + c = b.xAxis = g(b.xAxis || {}), + b = b.yAxis = g(b.yAxis || {}); + d(this, "getAxes"); + k(c, function (a, b) { + a.index = b; + a.isX = !0 + }); + k(b, function (a, b) { + a.index = b + }); + c = c.concat(b); + k(c, function (b) { + new e(a, b) + }); + d(this, "afterGetAxes") + }, + getSelectedPoints: function () { + var a = []; + k(this.series, function (c) { + a = a.concat(b(c.data || [], function (a) { + return a.selected + })) + }); + return a + }, + getSelectedSeries: function () { + return b(this.series, function (a) { + return a.selected + }) + }, + setTitle: function (a, b, c) { + var d = this, + g = d.options, + f; + f = g.title = A({ + style: { + color: "#333333", + fontSize: g.isStock ? "16px" : "18px" + } + }, g.title, a); + g = g.subtitle = A({ + style: { + color: "#666666" + } + }, g.subtitle, b); + k([ + ["title", a, f], + ["subtitle", b, g] + ], function (a, b) { + var c = a[0], + g = d[c], + f = a[1]; + a = a[2]; + g && f && (d[c] = g = g.destroy()); + a && !g && (d[c] = d.renderer.text(a.text, 0, 0, a.useHTML).attr({ + align: a.align, + "class": "highcharts-" + c, + zIndex: a.zIndex || 4 + }).add(), d[c].update = function (a) { + d.setTitle(!b && a, b && a) + }, d[c].css(a.style)) + }); + d.layOutTitles(c) + }, + layOutTitles: function (a) { + var b = 0, + c, d = this.renderer, + g = this.spacingBox; + k(["title", "subtitle"], function (a) { + var c = this[a], + f = this.options[a]; + a = "title" === a ? -3 : f.verticalAlign ? 0 : b + 2; + var m; + c && (m = f.style.fontSize, m = d.fontMetrics(m, c).b, c.css({ + width: (f.width || g.width + f.widthAdjust) + "px" + }).align(r({ + y: a + m + }, f), !1, "spacingBox"), f.floating || f.verticalAlign || (b = Math.ceil(b + c.getBBox(f.useHTML).height))) + }, this); + c = this.titleOffset !== b; + this.titleOffset = b; + !this.isDirtyBox && c && (this.isDirtyBox = this.isDirtyLegend = c, this.hasRendered && + D(a, !0) && this.isDirtyBox && this.redraw()) + }, + getChartSize: function () { + var b = this.options.chart, + d = b.width, + b = b.height, + g = this.renderTo; + c(d) || (this.containerWidth = a.getStyle(g, "width")); + c(b) || (this.containerHeight = a.getStyle(g, "height")); + this.chartWidth = Math.max(0, d || this.containerWidth || 600); + this.chartHeight = Math.max(0, a.relativeLength(b, this.chartWidth) || (1 < this.containerHeight ? this.containerHeight : 400)) + }, + temporaryDisplay: function (b) { + var c = this.renderTo; + if (b) + for (; c && c.style;) c.hcOrigStyle && (a.css(c, c.hcOrigStyle), + delete c.hcOrigStyle), c.hcOrigDetached && (h.body.removeChild(c), c.hcOrigDetached = !1), c = c.parentNode; + else + for (; c && c.style;) { + h.body.contains(c) || c.parentNode || (c.hcOrigDetached = !0, h.body.appendChild(c)); + if ("none" === a.getStyle(c, "display", !1) || c.hcOricDetached) c.hcOrigStyle = { + display: c.style.display, + height: c.style.height, + overflow: c.style.overflow + }, b = { + display: "block", + overflow: "hidden" + }, c !== this.renderTo && (b.height = 0), a.css(c, b), c.offsetWidth || c.style.setProperty("display", "block", "important"); + c = c.parentNode; + if (c === h.body) break + } + }, + setClassName: function (a) { + this.container.className = "highcharts-container " + (a || "") + }, + getContainer: function () { + var b, c = this.options, + g = c.chart, + f, m; + b = this.renderTo; + var e = a.uniqueKey(), + k; + b || (this.renderTo = b = g.renderTo); + I(b) && (this.renderTo = b = h.getElementById(b)); + b || a.error(13, !0); + f = B(n(b, "data-highcharts-chart")); + v(f) && x[f] && x[f].hasRendered && x[f].destroy(); + n(b, "data-highcharts-chart", this.index); + b.innerHTML = ""; + g.skipClone || b.offsetWidth || this.temporaryDisplay(); + this.getChartSize(); + f = this.chartWidth; + m = this.chartHeight; + k = r({ + position: "relative", + overflow: "hidden", + width: f + "px", + height: m + "px", + textAlign: "left", + lineHeight: "normal", + zIndex: 0, + "-webkit-tap-highlight-color": "rgba(0,0,0,0)" + }, g.style); + this.container = b = u("div", { + id: e + }, k, b); + this._cursor = b.style.cursor; + this.renderer = new(a[g.renderer] || a.Renderer)(b, f, m, null, g.forExport, c.exporting && c.exporting.allowHTML); + this.setClassName(g.className); + this.renderer.setStyle(g.style); + this.renderer.chartIndex = this.index; + d(this, "afterGetContainer") + }, + getMargins: function (a) { + var b = this.spacing, + g = this.margin, + f = this.titleOffset; + this.resetMargins(); + f && !c(g[0]) && (this.plotTop = Math.max(this.plotTop, f + this.options.title.margin + b[0])); + this.legend && this.legend.display && this.legend.adjustMargins(g, b); + d(this, "getMargins"); + a || this.getAxisMargins() + }, + getAxisMargins: function () { + var a = this, + b = a.axisOffset = [0, 0, 0, 0], + d = a.margin; + a.hasCartesianSeries && k(a.axes, function (a) { + a.visible && a.getOffset() + }); + k(L, function (g, f) { + c(d[f]) || (a[g] += b[f]) + }); + a.setChartSize() + }, + reflow: function (b) { + var d = + this, + g = d.options.chart, + f = d.renderTo, + m = c(g.width) && c(g.height), + e = g.width || a.getStyle(f, "width"), + g = g.height || a.getStyle(f, "height"), + f = b ? b.target : P; + if (!m && !d.isPrinting && e && g && (f === P || f === h)) { + if (e !== d.containerWidth || g !== d.containerHeight) a.clearTimeout(d.reflowTimeout), d.reflowTimeout = w(function () { + d.container && d.setSize(void 0, void 0, !1) + }, b ? 100 : 0); + d.containerWidth = e; + d.containerHeight = g + } + }, + setReflow: function (a) { + var b = this; + !1 === a || this.unbindReflow ? !1 === a && this.unbindReflow && (this.unbindReflow = this.unbindReflow()) : + (this.unbindReflow = C(P, "resize", function (a) { + b.reflow(a) + }), C(this, "destroy", this.unbindReflow)) + }, + setSize: function (b, c, g) { + var m = this, + e = m.renderer; + m.isResizing += 1; + a.setAnimation(g, m); + m.oldChartHeight = m.chartHeight; + m.oldChartWidth = m.chartWidth; + void 0 !== b && (m.options.chart.width = b); + void 0 !== c && (m.options.chart.height = c); + m.getChartSize(); + b = e.globalAnimation; + (b ? E : f)(m.container, { + width: m.chartWidth + "px", + height: m.chartHeight + "px" + }, b); + m.setChartSize(!0); + e.setSize(m.chartWidth, m.chartHeight, g); + k(m.axes, function (a) { + a.isDirty = !0; + a.setScale() + }); + m.isDirtyLegend = !0; + m.isDirtyBox = !0; + m.layOutTitles(); + m.getMargins(); + m.redraw(g); + m.oldChartHeight = null; + d(m, "resize"); + w(function () { + m && d(m, "endResize", null, function () { + --m.isResizing + }) + }, F(b).duration) + }, + setChartSize: function (a) { + var b = this.inverted, + c = this.renderer, + g = this.chartWidth, + f = this.chartHeight, + m = this.options.chart, + e = this.spacing, + l = this.clipOffset, + h, B, D, r; + this.plotLeft = h = Math.round(this.plotLeft); + this.plotTop = B = Math.round(this.plotTop); + this.plotWidth = D = Math.max(0, Math.round(g - h - this.marginRight)); + this.plotHeight = r = Math.max(0, Math.round(f - B - this.marginBottom)); + this.plotSizeX = b ? r : D; + this.plotSizeY = b ? D : r; + this.plotBorderWidth = m.plotBorderWidth || 0; + this.spacingBox = c.spacingBox = { + x: e[3], + y: e[0], + width: g - e[3] - e[1], + height: f - e[0] - e[2] + }; + this.plotBox = c.plotBox = { + x: h, + y: B, + width: D, + height: r + }; + g = 2 * Math.floor(this.plotBorderWidth / 2); + b = Math.ceil(Math.max(g, l[3]) / 2); + c = Math.ceil(Math.max(g, l[0]) / 2); + this.clipBox = { + x: b, + y: c, + width: Math.floor(this.plotSizeX - Math.max(g, l[1]) / 2 - b), + height: Math.max(0, Math.floor(this.plotSizeY - + Math.max(g, l[2]) / 2 - c)) + }; + a || k(this.axes, function (a) { + a.setAxisSize(); + a.setAxisTranslation() + }); + d(this, "afterSetChartSize", { + skipAxes: a + }) + }, + resetMargins: function () { + var a = this, + b = a.options.chart; + k(["margin", "spacing"], function (c) { + var d = b[c], + g = p(d) ? d : [d, d, d, d]; + k(["Top", "Right", "Bottom", "Left"], function (d, f) { + a[c][f] = D(b[c + d], g[f]) + }) + }); + k(L, function (b, c) { + a[b] = D(a.margin[c], a.spacing[c]) + }); + a.axisOffset = [0, 0, 0, 0]; + a.clipOffset = [0, 0, 0, 0] + }, + drawChartBox: function () { + var a = this.options.chart, + b = this.renderer, + c = this.chartWidth, + g = this.chartHeight, + f = this.chartBackground, + m = this.plotBackground, + e = this.plotBorder, + k, l = this.plotBGImage, + h = a.backgroundColor, + B = a.plotBackgroundColor, + D = a.plotBackgroundImage, + r, w = this.plotLeft, + p = this.plotTop, + t = this.plotWidth, + G = this.plotHeight, + A = this.plotBox, + n = this.clipRect, + q = this.clipBox, + v = "animate"; + f || (this.chartBackground = f = b.rect().addClass("highcharts-background").add(), v = "attr"); + k = a.borderWidth || 0; + r = k + (a.shadow ? 8 : 0); + h = { + fill: h || "none" + }; + if (k || f["stroke-width"]) h.stroke = a.borderColor, h["stroke-width"] = + k; + f.attr(h).shadow(a.shadow); + f[v]({ + x: r / 2, + y: r / 2, + width: c - r - k % 2, + height: g - r - k % 2, + r: a.borderRadius + }); + v = "animate"; + m || (v = "attr", this.plotBackground = m = b.rect().addClass("highcharts-plot-background").add()); + m[v](A); + m.attr({ + fill: B || "none" + }).shadow(a.plotShadow); + D && (l ? l.animate(A) : this.plotBGImage = b.image(D, w, p, t, G).add()); + n ? n.animate({ + width: q.width, + height: q.height + }) : this.clipRect = b.clipRect(q); + v = "animate"; + e || (v = "attr", this.plotBorder = e = b.rect().addClass("highcharts-plot-border").attr({ + zIndex: 1 + }).add()); + e.attr({ + stroke: a.plotBorderColor, + "stroke-width": a.plotBorderWidth || 0, + fill: "none" + }); + e[v](e.crisp({ + x: w, + y: p, + width: t, + height: G + }, -e.strokeWidth())); + this.isDirtyBox = !1; + d(this, "afterDrawChartBox") + }, + propFromSeries: function () { + var a = this, + b = a.options.chart, + c, d = a.options.series, + g, f; + k(["inverted", "angular", "polar"], function (m) { + c = G[b.type || b.defaultSeriesType]; + f = b[m] || c && c.prototype[m]; + for (g = d && d.length; !f && g--;)(c = G[d[g].type]) && c.prototype[m] && (f = !0); + a[m] = f + }) + }, + linkSeries: function () { + var a = this, + b = a.series; + k(b, function (a) { + a.linkedSeries.length = + 0 + }); + k(b, function (b) { + var c = b.options.linkedTo; + I(c) && (c = ":previous" === c ? a.series[b.index - 1] : a.get(c)) && c.linkedParent !== b && (c.linkedSeries.push(b), b.linkedParent = c, b.visible = D(b.options.visible, c.options.visible, b.visible)) + }); + d(this, "afterLinkSeries") + }, + renderSeries: function () { + k(this.series, function (a) { + a.translate(); + a.render() + }) + }, + renderLabels: function () { + var a = this, + b = a.options.labels; + b.items && k(b.items, function (c) { + var d = r(b.style, c.style), + g = B(d.left) + a.plotLeft, + f = B(d.top) + a.plotTop + 12; + delete d.left; + delete d.top; + a.renderer.text(c.html, g, f).attr({ + zIndex: 2 + }).css(d).add() + }) + }, + render: function () { + var a = this.axes, + b = this.renderer, + c = this.options, + d, g, f; + this.setTitle(); + this.legend = new t(this, c.legend); + this.getStacks && this.getStacks(); + this.getMargins(!0); + this.setChartSize(); + c = this.plotWidth; + d = this.plotHeight = Math.max(this.plotHeight - 21, 0); + k(a, function (a) { + a.setScale() + }); + this.getAxisMargins(); + g = 1.1 < c / this.plotWidth; + f = 1.05 < d / this.plotHeight; + if (g || f) k(a, function (a) { + (a.horiz && g || !a.horiz && f) && a.setTickInterval(!0) + }), this.getMargins(); + this.drawChartBox(); + this.hasCartesianSeries && k(a, function (a) { + a.visible && a.render() + }); + this.seriesGroup || (this.seriesGroup = b.g("series-group").attr({ + zIndex: 3 + }).add()); + this.renderSeries(); + this.renderLabels(); + this.addCredits(); + this.setResponsive && this.setResponsive(); + this.hasRendered = !0 + }, + addCredits: function (a) { + var b = this; + a = A(!0, this.options.credits, a); + a.enabled && !this.credits && (this.credits = this.renderer.text(a.text + (this.mapCredits || ""), 0, 0).addClass("highcharts-credits").on("click", function () { + a.href && + (P.location.href = a.href) + }).attr({ + align: a.position.align, + zIndex: 8 + }).css(a.style).add().align(a.position), this.credits.update = function (a) { + b.credits = b.credits.destroy(); + b.addCredits(a) + }) + }, + destroy: function () { + var b = this, + c = b.axes, + g = b.series, + f = b.container, + m, e = f && f.parentNode; + d(b, "destroy"); + b.renderer.forExport ? a.erase(x, b) : x[b.index] = void 0; + a.chartCount--; + b.renderTo.removeAttribute("data-highcharts-chart"); + M(b); + for (m = c.length; m--;) c[m] = c[m].destroy(); + this.scroller && this.scroller.destroy && this.scroller.destroy(); + for (m = g.length; m--;) g[m] = g[m].destroy(); + k("title subtitle chartBackground plotBackground plotBGImage plotBorder seriesGroup clipRect credits pointer rangeSelector legend resetZoomButton tooltip renderer".split(" "), function (a) { + var c = b[a]; + c && c.destroy && (b[a] = c.destroy()) + }); + f && (f.innerHTML = "", M(f), e && q(f)); + H(b, function (a, c) { + delete b[c] + }) + }, + firstRender: function () { + var a = this, + b = a.options; + if (!a.isReadyToRender || a.isReadyToRender()) { + a.getContainer(); + a.resetMargins(); + a.setChartSize(); + a.propFromSeries(); + a.getAxes(); + k(b.series || [], function (b) { + a.initSeries(b) + }); + a.linkSeries(); + d(a, "beforeRender"); + m && (a.pointer = new m(a, b)); + a.render(); + if (!a.renderer.imgCount && a.onload) a.onload(); + a.temporaryDisplay(!0) + } + }, + onload: function () { + k([this.callback].concat(this.callbacks), function (a) { + a && void 0 !== this.index && a.apply(this, [this]) + }, this); + d(this, "load"); + d(this, "render"); + c(this.index) && this.setReflow(this.options.chart.reflow); + this.onload = null + } + }) + })(K); + (function (a) { + var C = a.addEvent, + E = a.Chart, + F = a.each; + C(E, "afterSetChartSize", function (n) { + var h = + this.options.chart.scrollablePlotArea; + (h = h && h.minWidth) && !this.renderer.forExport && (this.scrollablePixels = h = Math.max(0, h - this.chartWidth)) && (this.plotWidth += h, this.clipBox.width += h, n.skipAxes || F(this.axes, function (e) { + 1 === e.side ? e.getPlotLinePath = function () { + var h = this.right, + n; + this.right = h - e.chart.scrollablePixels; + n = a.Axis.prototype.getPlotLinePath.apply(this, arguments); + this.right = h; + return n + } : (e.setAxisSize(), e.setAxisTranslation()) + })) + }); + C(E, "render", function () { + this.scrollablePixels ? (this.setUpScrolling && + this.setUpScrolling(), this.applyFixed()) : this.fixedDiv && this.applyFixed() + }); + E.prototype.setUpScrolling = function () { + this.scrollingContainer = a.createElement("div", { + className: "highcharts-scrolling" + }, { + overflowX: "auto", + WebkitOverflowScrolling: "touch" + }, this.renderTo); + this.innerContainer = a.createElement("div", { + className: "highcharts-inner-container" + }, null, this.scrollingContainer); + this.innerContainer.appendChild(this.container); + this.setUpScrolling = null + }; + E.prototype.applyFixed = function () { + var n = this.container, + h, e, u = !this.fixedDiv; + u && (this.fixedDiv = a.createElement("div", { + className: "highcharts-fixed" + }, { + position: "absolute", + overflow: "hidden", + pointerEvents: "none", + zIndex: 2 + }, null, !0), this.renderTo.insertBefore(this.fixedDiv, this.renderTo.firstChild), this.fixedRenderer = h = new a.Renderer(this.fixedDiv, 0, 0), this.scrollableMask = h.path().attr({ + fill: a.color(this.options.chart.backgroundColor || "#fff").setOpacity(.85).get(), + zIndex: -1 + }).addClass("highcharts-scrollable-mask").add(), a.each([this.inverted ? ".highcharts-xaxis" : + ".highcharts-yaxis", this.inverted ? ".highcharts-xaxis-labels" : ".highcharts-yaxis-labels", ".highcharts-contextbutton", ".highcharts-credits", ".highcharts-legend", ".highcharts-subtitle", ".highcharts-title" + ], function (e) { + a.each(n.querySelectorAll(e), function (a) { + h.box.appendChild(a); + a.style.pointerEvents = "auto" + }) + })); + this.fixedRenderer.setSize(this.chartWidth, this.chartHeight); + e = this.chartWidth + this.scrollablePixels; + this.container.style.width = e + "px"; + this.renderer.boxWrapper.attr({ + width: e, + height: this.chartHeight, + viewBox: [0, 0, e, this.chartHeight].join(" ") + }); + u && (e = this.options.chart.scrollablePlotArea, e.scrollPositionX && (this.scrollingContainer.scrollLeft = this.scrollablePixels * e.scrollPositionX)); + u = this.axisOffset; + e = this.plotTop - u[0] - 1; + var u = this.plotTop + this.plotHeight + u[2], + y = this.plotLeft + this.plotWidth - this.scrollablePixels; + this.scrollableMask.attr({ + d: this.scrollablePixels ? ["M", 0, e, "L", this.plotLeft - 1, e, "L", this.plotLeft - 1, u, "L", 0, u, "Z", "M", y, e, "L", this.chartWidth, e, "L", this.chartWidth, u, "L", y, u, "Z"] : ["M", + 0, 0 + ] + }) + } + })(K); + (function (a) { + var C, E = a.each, + F = a.extend, + n = a.erase, + h = a.fireEvent, + e = a.format, + u = a.isArray, + y = a.isNumber, + q = a.pick, + x = a.removeEvent; + a.Point = C = function () {}; + a.Point.prototype = { + init: function (a, c, e) { + this.series = a; + this.color = a.color; + this.applyOptions(c, e); + a.options.colorByPoint ? (c = a.options.colors || a.chart.options.colors, this.color = this.color || c[a.colorCounter], c = c.length, e = a.colorCounter, a.colorCounter++, a.colorCounter === c && (a.colorCounter = 0)) : e = a.colorIndex; + this.colorIndex = q(this.colorIndex, e); + a.chart.pointCount++; + h(this, "afterInit"); + return this + }, + applyOptions: function (a, c) { + var f = this.series, + e = f.options.pointValKey || f.pointValKey; + a = C.prototype.optionsToObject.call(this, a); + F(this, a); + this.options = this.options ? F(this.options, a) : a; + a.group && delete this.group; + e && (this.y = this[e]); + this.isNull = q(this.isValid && !this.isValid(), null === this.x || !y(this.y, !0)); + this.selected && (this.state = "select"); + "name" in this && void 0 === c && f.xAxis && f.xAxis.hasNames && (this.x = f.xAxis.nameToX(this)); + void 0 === this.x && f && (this.x = + void 0 === c ? f.autoIncrement(this) : c); + return this + }, + setNestedProperty: function (f, c, e) { + e = e.split("."); + a.reduce(e, function (f, e, d, b) { + f[e] = b.length - 1 === d ? c : a.isObject(f[e], !0) ? f[e] : {}; + return f[e] + }, f); + return f + }, + optionsToObject: function (f) { + var c = {}, + e = this.series, + h = e.options.keys, + l = h || e.pointArrayMap || ["y"], + d = l.length, + b = 0, + n = 0; + if (y(f) || null === f) c[l[0]] = f; + else if (u(f)) + for (!h && f.length > d && (e = typeof f[0], "string" === e ? c.name = f[0] : "number" === e && (c.x = f[0]), b++); n < d;) h && void 0 === f[b] || (0 < l[n].indexOf(".") ? a.Point.prototype.setNestedProperty(c, + f[b], l[n]) : c[l[n]] = f[b]), b++, n++; + else "object" === typeof f && (c = f, f.dataLabels && (e._hasPointLabels = !0), f.marker && (e._hasPointMarkers = !0)); + return c + }, + getClassName: function () { + return "highcharts-point" + (this.selected ? " highcharts-point-select" : "") + (this.negative ? " highcharts-negative" : "") + (this.isNull ? " highcharts-null-point" : "") + (void 0 !== this.colorIndex ? " highcharts-color-" + this.colorIndex : "") + (this.options.className ? " " + this.options.className : "") + (this.zone && this.zone.className ? " " + this.zone.className.replace("highcharts-negative", + "") : "") + }, + getZone: function () { + var a = this.series, + c = a.zones, + a = a.zoneAxis || "y", + e = 0, + h; + for (h = c[e]; this[a] >= h.value;) h = c[++e]; + this.nonZonedColor || (this.nonZonedColor = this.color); + this.color = h && h.color && !this.options.color ? h.color : this.nonZonedColor; + return h + }, + destroy: function () { + var a = this.series.chart, + c = a.hoverPoints, + e; + a.pointCount--; + c && (this.setState(), n(c, this), c.length || (a.hoverPoints = null)); + if (this === a.hoverPoint) this.onMouseOut(); + if (this.graphic || this.dataLabel) x(this), this.destroyElements(); + this.legendItem && + a.legend.destroyItem(this); + for (e in this) this[e] = null + }, + destroyElements: function () { + for (var a = ["graphic", "dataLabel", "dataLabelUpper", "connector", "shadowGroup"], c, e = 6; e--;) c = a[e], this[c] && (this[c] = this[c].destroy()) + }, + getLabelConfig: function () { + return { + x: this.category, + y: this.y, + color: this.color, + colorIndex: this.colorIndex, + key: this.name || this.category, + series: this.series, + point: this, + percentage: this.percentage, + total: this.total || this.stackTotal + } + }, + tooltipFormatter: function (a) { + var c = this.series, + f = c.tooltipOptions, + h = q(f.valueDecimals, ""), + l = f.valuePrefix || "", + d = f.valueSuffix || ""; + E(c.pointArrayMap || ["y"], function (b) { + b = "{point." + b; + if (l || d) a = a.replace(RegExp(b + "}", "g"), l + b + "}" + d); + a = a.replace(RegExp(b + "}", "g"), b + ":,." + h + "f}") + }); + return e(a, { + point: this, + series: this.series + }, c.chart.time) + }, + firePointEvent: function (a, c, e) { + var f = this, + l = this.series.options; + (l.point.events[a] || f.options && f.options.events && f.options.events[a]) && this.importEvents(); + "click" === a && l.allowPointSelect && (e = function (a) { + f.select && f.select(null, a.ctrlKey || + a.metaKey || a.shiftKey) + }); + h(this, a, c, e) + }, + visible: !0 + } + })(K); + (function (a) { + var C = a.addEvent, + E = a.animObject, + F = a.arrayMax, + n = a.arrayMin, + h = a.correctFloat, + e = a.defaultOptions, + u = a.defaultPlotOptions, + y = a.defined, + q = a.each, + x = a.erase, + f = a.extend, + c = a.fireEvent, + k = a.grep, + r = a.isArray, + l = a.isNumber, + d = a.isString, + b = a.merge, + v = a.objectEach, + p = a.pick, + I = a.removeEvent, + t = a.splat, + L = a.SVGElement, + A = a.syncTimeout, + H = a.win; + a.Series = a.seriesType("line", null, { + lineWidth: 2, + allowPointSelect: !1, + showCheckbox: !1, + animation: { + duration: 1E3 + }, + events: {}, + marker: { + lineWidth: 0, + lineColor: "#ffffff", + enabledThreshold: 2, + radius: 4, + states: { + normal: { + animation: !0 + }, + hover: { + animation: { + duration: 50 + }, + enabled: !0, + radiusPlus: 2, + lineWidthPlus: 1 + }, + select: { + fillColor: "#cccccc", + lineColor: "#000000", + lineWidth: 2 + } + } + }, + point: { + events: {} + }, + dataLabels: { + align: "center", + formatter: function () { + return null === this.y ? "" : a.numberFormat(this.y, -1) + }, + style: { + fontSize: "11px", + fontWeight: "bold", + color: "contrast", + textOutline: "1px contrast" + }, + verticalAlign: "bottom", + x: 0, + y: 0, + padding: 5 + }, + cropThreshold: 300, + pointRange: 0, + softThreshold: !0, + states: { + normal: { + animation: !0 + }, + hover: { + animation: { + duration: 50 + }, + lineWidthPlus: 1, + marker: {}, + halo: { + size: 10, + opacity: .25 + } + }, + select: { + marker: {} + } + }, + stickyTracking: !0, + turboThreshold: 1E3, + findNearestPointBy: "x" + }, { + isCartesian: !0, + pointClass: a.Point, + sorted: !0, + requireSorting: !0, + directTouch: !1, + axisTypes: ["xAxis", "yAxis"], + colorCounter: 0, + parallelArrays: ["x", "y"], + coll: "series", + init: function (a, b) { + var d = this, + m, e = a.series, + g; + d.chart = a; + d.options = b = d.setOptions(b); + d.linkedSeries = []; + d.bindAxes(); + f(d, { + name: b.name, + state: "", + visible: !1 !== b.visible, + selected: !0 === b.selected + }); + m = b.events; + v(m, function (a, b) { + C(d, b, a) + }); + if (m && m.click || b.point && b.point.events && b.point.events.click || b.allowPointSelect) a.runTrackerClick = !0; + d.getColor(); + d.getSymbol(); + q(d.parallelArrays, function (a) { + d[a + "Data"] = [] + }); + d.setData(b.data, !1); + d.isCartesian && (a.hasCartesianSeries = !0); + e.length && (g = e[e.length - 1]); + d._i = p(g && g._i, -1) + 1; + a.orderSeries(this.insert(e)); + c(this, "afterInit") + }, + insert: function (a) { + var b = this.options.index, + c; + if (l(b)) { + for (c = a.length; c--;) + if (b >= + p(a[c].options.index, a[c]._i)) { + a.splice(c + 1, 0, this); + break + } - 1 === c && a.unshift(this); + c += 1 + } else a.push(this); + return p(c, a.length - 1) + }, + bindAxes: function () { + var b = this, + c = b.options, + d = b.chart, + f; + q(b.axisTypes || [], function (m) { + q(d[m], function (a) { + f = a.options; + if (c[m] === f.index || void 0 !== c[m] && c[m] === f.id || void 0 === c[m] && 0 === f.index) b.insert(a.series), b[m] = a, a.isDirty = !0 + }); + b[m] || b.optionalAxis === m || a.error(18, !0) + }) + }, + updateParallelArrays: function (a, b) { + var c = a.series, + d = arguments, + f = l(b) ? function (d) { + var g = "y" === d && c.toYData ? + c.toYData(a) : a[d]; + c[d + "Data"][b] = g + } : function (a) { + Array.prototype[b].apply(c[a + "Data"], Array.prototype.slice.call(d, 2)) + }; + q(c.parallelArrays, f) + }, + autoIncrement: function () { + var a = this.options, + b = this.xIncrement, + c, d = a.pointIntervalUnit, + f = this.chart.time, + b = p(b, a.pointStart, 0); + this.pointInterval = c = p(this.pointInterval, a.pointInterval, 1); + d && (a = new f.Date(b), "day" === d ? f.set("Date", a, f.get("Date", a) + c) : "month" === d ? f.set("Month", a, f.get("Month", a) + c) : "year" === d && f.set("FullYear", a, f.get("FullYear", a) + c), c = a.getTime() - + b); + this.xIncrement = b + c; + return b + }, + setOptions: function (a) { + var d = this.chart, + f = d.options, + m = f.plotOptions, + h = (d.userOptions || {}).plotOptions || {}, + g = m[this.type]; + this.userOptions = a; + d = b(g, m.series, a); + this.tooltipOptions = b(e.tooltip, e.plotOptions.series && e.plotOptions.series.tooltip, e.plotOptions[this.type].tooltip, f.tooltip.userOptions, m.series && m.series.tooltip, m[this.type].tooltip, a.tooltip); + this.stickyTracking = p(a.stickyTracking, h[this.type] && h[this.type].stickyTracking, h.series && h.series.stickyTracking, + this.tooltipOptions.shared && !this.noSharedTooltip ? !0 : d.stickyTracking); + null === g.marker && delete d.marker; + this.zoneAxis = d.zoneAxis; + a = this.zones = (d.zones || []).slice(); + !d.negativeColor && !d.negativeFillColor || d.zones || a.push({ + value: d[this.zoneAxis + "Threshold"] || d.threshold || 0, + className: "highcharts-negative", + color: d.negativeColor, + fillColor: d.negativeFillColor + }); + a.length && y(a[a.length - 1].value) && a.push({ + color: this.color, + fillColor: this.fillColor + }); + c(this, "afterSetOptions", { + options: d + }); + return d + }, + getName: function () { + return this.name || + "Series " + (this.index + 1) + }, + getCyclic: function (a, b, c) { + var d, f = this.chart, + g = this.userOptions, + m = a + "Index", + e = a + "Counter", + h = c ? c.length : p(f.options.chart[a + "Count"], f[a + "Count"]); + b || (d = p(g[m], g["_" + m]), y(d) || (f.series.length || (f[e] = 0), g["_" + m] = d = f[e] % h, f[e] += 1), c && (b = c[d])); + void 0 !== d && (this[m] = d); + this[a] = b + }, + getColor: function () { + this.options.colorByPoint ? this.options.color = null : this.getCyclic("color", this.options.color || u[this.type].color, this.chart.options.colors) + }, + getSymbol: function () { + this.getCyclic("symbol", + this.options.marker.symbol, this.chart.options.symbols) + }, + drawLegendSymbol: a.LegendSymbolMixin.drawLineMarker, + updateData: function (b) { + var c = this.options, + d = this.points, + f = [], + m, g, e, h = this.requireSorting; + q(b, function (b) { + var g; + g = a.defined(b) && this.pointClass.prototype.optionsToObject.call({ + series: this + }, b).x; + l(g) && (g = a.inArray(g, this.xData, e), -1 === g ? f.push(b) : b !== c.data[g] ? (d[g].update(b, !1, null, !1), d[g].touched = !0, h && (e = g)) : d[g] && (d[g].touched = !0), m = !0) + }, this); + if (m) + for (b = d.length; b--;) g = d[b], g.touched || g.remove(!1), + g.touched = !1; + else if (b.length === d.length) q(b, function (a, b) { + d[b].update && a !== c.data[b] && d[b].update(a, !1, null, !1) + }); + else return !1; + q(f, function (a) { + this.addPoint(a, !1) + }, this); + return !0 + }, + setData: function (b, c, f, e) { + var m = this, + g = m.points, + h = g && g.length || 0, + k, B = m.options, + D = m.chart, + t = null, + A = m.xAxis, + n = B.turboThreshold, + v = this.xData, + u = this.yData, + y = (k = m.pointArrayMap) && k.length, + H; + b = b || []; + k = b.length; + c = p(c, !0); + !1 !== e && k && h && !m.cropped && !m.hasGroupedData && m.visible && (H = this.updateData(b)); + if (!H) { + m.xIncrement = null; + m.colorCounter = + 0; + q(this.parallelArrays, function (a) { + m[a + "Data"].length = 0 + }); + if (n && k > n) { + for (f = 0; null === t && f < k;) t = b[f], f++; + if (l(t)) + for (f = 0; f < k; f++) v[f] = this.autoIncrement(), u[f] = b[f]; + else if (r(t)) + if (y) + for (f = 0; f < k; f++) t = b[f], v[f] = t[0], u[f] = t.slice(1, y + 1); + else + for (f = 0; f < k; f++) t = b[f], v[f] = t[0], u[f] = t[1]; + else a.error(12) + } else + for (f = 0; f < k; f++) void 0 !== b[f] && (t = { + series: m + }, m.pointClass.prototype.applyOptions.apply(t, [b[f]]), m.updateParallelArrays(t, f)); + u && d(u[0]) && a.error(14, !0); + m.data = []; + m.options.data = m.userOptions.data = + b; + for (f = h; f--;) g[f] && g[f].destroy && g[f].destroy(); + A && (A.minRange = A.userMinRange); + m.isDirty = D.isDirtyBox = !0; + m.isDirtyData = !!g; + f = !1 + } + "point" === B.legendType && (this.processData(), this.generatePoints()); + c && D.redraw(f) + }, + processData: function (b) { + var c = this.xData, + d = this.yData, + f = c.length, + m; + m = 0; + var g, e, h = this.xAxis, + l, k = this.options; + l = k.cropThreshold; + var p = this.getExtremesFromAll || k.getExtremesFromAll, + r = this.isCartesian, + k = h && h.val2lin, + t = h && h.isLog, + A = this.requireSorting, + n, q; + if (r && !this.isDirty && !h.isDirty && !this.yAxis.isDirty && + !b) return !1; + h && (b = h.getExtremes(), n = b.min, q = b.max); + if (r && this.sorted && !p && (!l || f > l || this.forceCrop)) + if (c[f - 1] < n || c[0] > q) c = [], d = []; + else if (c[0] < n || c[f - 1] > q) m = this.cropData(this.xData, this.yData, n, q), c = m.xData, d = m.yData, m = m.start, g = !0; + for (l = c.length || 1; --l;) f = t ? k(c[l]) - k(c[l - 1]) : c[l] - c[l - 1], 0 < f && (void 0 === e || f < e) ? e = f : 0 > f && A && (a.error(15), A = !1); + this.cropped = g; + this.cropStart = m; + this.processedXData = c; + this.processedYData = d; + this.closestPointRange = e + }, + cropData: function (a, b, c, d, f) { + var g = a.length, + m = 0, + e = g, + h; + f = + p(f, this.cropShoulder, 1); + for (h = 0; h < g; h++) + if (a[h] >= c) { + m = Math.max(0, h - f); + break + } + for (c = h; c < g; c++) + if (a[c] > d) { + e = c + f; + break + } + return { + xData: a.slice(m, e), + yData: b.slice(m, e), + start: m, + end: e + } + }, + generatePoints: function () { + var a = this.options, + b = a.data, + c = this.data, + d, f = this.processedXData, + g = this.processedYData, + e = this.pointClass, + h = f.length, + l = this.cropStart || 0, + k, p = this.hasGroupedData, + a = a.keys, + r, n = [], + A; + c || p || (c = [], c.length = b.length, c = this.data = c); + a && p && (this.options.keys = !1); + for (A = 0; A < h; A++) k = l + A, p ? (r = (new e).init(this, [f[A]].concat(t(g[A]))), + r.dataGroup = this.groupMap[A]) : (r = c[k]) || void 0 === b[k] || (c[k] = r = (new e).init(this, b[k], f[A])), r && (r.index = k, n[A] = r); + this.options.keys = a; + if (c && (h !== (d = c.length) || p)) + for (A = 0; A < d; A++) A !== l || p || (A += h), c[A] && (c[A].destroyElements(), c[A].plotX = void 0); + this.data = c; + this.points = n + }, + getExtremes: function (a) { + var b = this.yAxis, + c = this.processedXData, + d, f = [], + g = 0; + d = this.xAxis.getExtremes(); + var m = d.min, + e = d.max, + h, k, p = this.requireSorting ? 1 : 0, + t, A; + a = a || this.stackedYData || this.processedYData || []; + d = a.length; + for (A = 0; A < d; A++) + if (k = + c[A], t = a[A], h = (l(t, !0) || r(t)) && (!b.positiveValuesOnly || t.length || 0 < t), k = this.getExtremesFromAll || this.options.getExtremesFromAll || this.cropped || (c[A + p] || k) >= m && (c[A - p] || k) <= e, h && k) + if (h = t.length) + for (; h--;) "number" === typeof t[h] && (f[g++] = t[h]); + else f[g++] = t; + this.dataMin = n(f); + this.dataMax = F(f) + }, + translate: function () { + this.processedXData || this.processData(); + this.generatePoints(); + var a = this.options, + b = a.stacking, + d = this.xAxis, + f = d.categories, + e = this.yAxis, + g = this.points, + k = g.length, + r = !!this.modifyValue, + t = a.pointPlacement, + A = "between" === t || l(t), + n = a.threshold, + q = a.startFromThreshold ? n : 0, + v, u, H, x, I = Number.MAX_VALUE; + "between" === t && (t = .5); + l(t) && (t *= p(a.pointRange || d.pointRange)); + for (a = 0; a < k; a++) { + var L = g[a], + C = L.x, + E = L.y; + u = L.low; + var F = b && e.stacks[(this.negStacks && E < (q ? 0 : n) ? "-" : "") + this.stackKey], + K; + e.positiveValuesOnly && null !== E && 0 >= E && (L.isNull = !0); + L.plotX = v = h(Math.min(Math.max(-1E5, d.translate(C, 0, 0, 0, 1, t, "flags" === this.type)), 1E5)); + b && this.visible && !L.isNull && F && F[C] && (x = this.getStackIndicator(x, C, this.index), K = F[C], E = K.points[x.key], + u = E[0], E = E[1], u === q && x.key === F[C].base && (u = p(l(n) && n, e.min)), e.positiveValuesOnly && 0 >= u && (u = null), L.total = L.stackTotal = K.total, L.percentage = K.total && L.y / K.total * 100, L.stackY = E, K.setOffset(this.pointXOffset || 0, this.barW || 0)); + L.yBottom = y(u) ? Math.min(Math.max(-1E5, e.translate(u, 0, 1, 0, 1)), 1E5) : null; + r && (E = this.modifyValue(E, L)); + L.plotY = u = "number" === typeof E && Infinity !== E ? Math.min(Math.max(-1E5, e.translate(E, 0, 1, 0, 1)), 1E5) : void 0; + L.isInside = void 0 !== u && 0 <= u && u <= e.len && 0 <= v && v <= d.len; + L.clientX = A ? h(d.translate(C, + 0, 0, 0, 1, t)) : v; + L.negative = L.y < (n || 0); + L.category = f && void 0 !== f[L.x] ? f[L.x] : L.x; + L.isNull || (void 0 !== H && (I = Math.min(I, Math.abs(v - H))), H = v); + L.zone = this.zones.length && L.getZone() + } + this.closestPointRangePx = I; + c(this, "afterTranslate") + }, + getValidPoints: function (a, b) { + var c = this.chart; + return k(a || this.points || [], function (a) { + return b && !c.isInsidePlot(a.plotX, a.plotY, c.inverted) ? !1 : !a.isNull + }) + }, + setClip: function (a) { + var b = this.chart, + c = this.options, + d = b.renderer, + f = b.inverted, + g = this.clipBox, + e = g || b.clipBox, + m = this.sharedClipKey || ["_sharedClip", a && a.duration, a && a.easing, e.height, c.xAxis, c.yAxis].join(), + h = b[m], + l = b[m + "m"]; + h || (a && (e.width = 0, f && (e.x = b.plotSizeX), b[m + "m"] = l = d.clipRect(f ? b.plotSizeX + 99 : -99, f ? -b.plotLeft : -b.plotTop, 99, f ? b.chartWidth : b.chartHeight)), b[m] = h = d.clipRect(e), h.count = { + length: 0 + }); + a && !h.count[this.index] && (h.count[this.index] = !0, h.count.length += 1); + !1 !== c.clip && (this.group.clip(a || g ? h : b.clipRect), this.markerGroup.clip(l), this.sharedClipKey = m); + a || (h.count[this.index] && (delete h.count[this.index], --h.count.length), + 0 === h.count.length && m && b[m] && (g || (b[m] = b[m].destroy()), b[m + "m"] && (b[m + "m"] = b[m + "m"].destroy()))) + }, + animate: function (a) { + var b = this.chart, + c = E(this.options.animation), + d; + a ? this.setClip(c) : (d = this.sharedClipKey, (a = b[d]) && a.animate({ + width: b.plotSizeX, + x: 0 + }, c), b[d + "m"] && b[d + "m"].animate({ + width: b.plotSizeX + 99, + x: 0 + }, c), this.animate = null) + }, + afterAnimate: function () { + this.setClip(); + c(this, "afterAnimate"); + this.finishedAnimating = !0 + }, + drawPoints: function () { + var a = this.points, + b = this.chart, + c, d, f, g, e = this.options.marker, + h, l, k, r = this[this.specialGroup] || this.markerGroup, + t, A = p(e.enabled, this.xAxis.isRadial ? !0 : null, this.closestPointRangePx >= e.enabledThreshold * e.radius); + if (!1 !== e.enabled || this._hasPointMarkers) + for (c = 0; c < a.length; c++) d = a[c], g = d.graphic, h = d.marker || {}, l = !!d.marker, f = A && void 0 === h.enabled || h.enabled, k = d.isInside, f && !d.isNull ? (f = p(h.symbol, this.symbol), t = this.markerAttribs(d, d.selected && "select"), g ? g[k ? "show" : "hide"](!0).animate(t) : k && (0 < t.width || d.hasImage) && (d.graphic = g = b.renderer.symbol(f, t.x, t.y, t.width, + t.height, l ? h : e).add(r)), g && g.attr(this.pointAttribs(d, d.selected && "select")), g && g.addClass(d.getClassName(), !0)) : g && (d.graphic = g.destroy()) + }, + markerAttribs: function (a, b) { + var c = this.options.marker, + d = a.marker || {}, + f = d.symbol || c.symbol, + g = p(d.radius, c.radius); + b && (c = c.states[b], b = d.states && d.states[b], g = p(b && b.radius, c && c.radius, g + (c && c.radiusPlus || 0))); + a.hasImage = f && 0 === f.indexOf("url"); + a.hasImage && (g = 0); + a = { + x: Math.floor(a.plotX) - g, + y: a.plotY - g + }; + g && (a.width = a.height = 2 * g); + return a + }, + pointAttribs: function (a, + b) { + var c = this.options.marker, + d = a && a.options, + f = d && d.marker || {}, + g = this.color, + e = d && d.color, + m = a && a.color, + d = p(f.lineWidth, c.lineWidth); + a = a && a.zone && a.zone.color; + g = e || a || m || g; + a = f.fillColor || c.fillColor || g; + g = f.lineColor || c.lineColor || g; + b && (c = c.states[b], b = f.states && f.states[b] || {}, d = p(b.lineWidth, c.lineWidth, d + p(b.lineWidthPlus, c.lineWidthPlus, 0)), a = b.fillColor || c.fillColor || a, g = b.lineColor || c.lineColor || g); + return { + stroke: g, + "stroke-width": d, + fill: a + } + }, + destroy: function () { + var b = this, + d = b.chart, + f = /AppleWebKit\/533/.test(H.navigator.userAgent), + e, h, g = b.data || [], + l, k; + c(b, "destroy"); + I(b); + q(b.axisTypes || [], function (a) { + (k = b[a]) && k.series && (x(k.series, b), k.isDirty = k.forceRedraw = !0) + }); + b.legendItem && b.chart.legend.destroyItem(b); + for (h = g.length; h--;)(l = g[h]) && l.destroy && l.destroy(); + b.points = null; + a.clearTimeout(b.animationTimeout); + v(b, function (a, b) { + a instanceof L && !a.survive && (e = f && "group" === b ? "hide" : "destroy", a[e]()) + }); + d.hoverSeries === b && (d.hoverSeries = null); + x(d.series, b); + d.orderSeries(); + v(b, function (a, c) { + delete b[c] + }) + }, + getGraphPath: function (a, b, + c) { + var d = this, + f = d.options, + g = f.step, + e, m = [], + h = [], + l; + a = a || d.points; + (e = a.reversed) && a.reverse(); + (g = { + right: 1, + center: 2 + } [g] || g && 3) && e && (g = 4 - g); + !f.connectNulls || b || c || (a = this.getValidPoints(a)); + q(a, function (e, k) { + var p = e.plotX, + r = e.plotY, + t = a[k - 1]; + (e.leftCliff || t && t.rightCliff) && !c && (l = !0); + e.isNull && !y(b) && 0 < k ? l = !f.connectNulls : e.isNull && !b ? l = !0 : (0 === k || l ? k = ["M", e.plotX, e.plotY] : d.getPointSpline ? k = d.getPointSpline(a, e, k) : g ? (k = 1 === g ? ["L", t.plotX, r] : 2 === g ? ["L", (t.plotX + p) / 2, t.plotY, "L", (t.plotX + p) / 2, r] : ["L", p, + t.plotY + ], k.push("L", p, r)) : k = ["L", p, r], h.push(e.x), g && (h.push(e.x), 2 === g && h.push(e.x)), m.push.apply(m, k), l = !1) + }); + m.xMap = h; + return d.graphPath = m + }, + drawGraph: function () { + var a = this, + b = this.options, + c = (this.gappedPath || this.getGraphPath).call(this), + d = [ + ["graph", "highcharts-graph", b.lineColor || this.color, b.dashStyle] + ], + d = a.getZonesGraphs(d); + q(d, function (d, f) { + var g = d[0], + e = a[g]; + e ? (e.endX = a.preventGraphAnimation ? null : c.xMap, e.animate({ + d: c + })) : c.length && (a[g] = a.chart.renderer.path(c).addClass(d[1]).attr({ + zIndex: 1 + }).add(a.group), + e = { + stroke: d[2], + "stroke-width": b.lineWidth, + fill: a.fillGraph && a.color || "none" + }, d[3] ? e.dashstyle = d[3] : "square" !== b.linecap && (e["stroke-linecap"] = e["stroke-linejoin"] = "round"), e = a[g].attr(e).shadow(2 > f && b.shadow)); + e && (e.startX = c.xMap, e.isArea = c.isArea) + }) + }, + getZonesGraphs: function (a) { + q(this.zones, function (b, c) { + a.push(["zone-graph-" + c, "highcharts-graph highcharts-zone-graph-" + c + " " + (b.className || ""), b.color || this.color, b.dashStyle || this.options.dashStyle]) + }, this); + return a + }, + applyZones: function () { + var a = this, + b = this.chart, + c = b.renderer, + d = this.zones, + f, g, e = this.clips || [], + h, l = this.graph, + k = this.area, + r = Math.max(b.chartWidth, b.chartHeight), + t = this[(this.zoneAxis || "y") + "Axis"], + A, n, v = b.inverted, + u, H, y, x, I = !1; + d.length && (l || k) && t && void 0 !== t.min && (n = t.reversed, u = t.horiz, l && !this.showLine && l.hide(), k && k.hide(), A = t.getExtremes(), q(d, function (d, m) { + f = n ? u ? b.plotWidth : 0 : u ? 0 : t.toPixels(A.min); + f = Math.min(Math.max(p(g, f), 0), r); + g = Math.min(Math.max(Math.round(t.toPixels(p(d.value, A.max), !0)), 0), r); + I && (f = g = t.toPixels(A.max)); + H = Math.abs(f - g); + y = Math.min(f, g); + x = Math.max(f, g); + t.isXAxis ? (h = { + x: v ? x : y, + y: 0, + width: H, + height: r + }, u || (h.x = b.plotHeight - h.x)) : (h = { + x: 0, + y: v ? x : y, + width: r, + height: H + }, u && (h.y = b.plotWidth - h.y)); + v && c.isVML && (h = t.isXAxis ? { + x: 0, + y: n ? y : x, + height: h.width, + width: b.chartWidth + } : { + x: h.y - b.plotLeft - b.spacingBox.x, + y: 0, + width: h.height, + height: b.chartHeight + }); + e[m] ? e[m].animate(h) : (e[m] = c.clipRect(h), l && a["zone-graph-" + m].clip(e[m]), k && a["zone-area-" + m].clip(e[m])); + I = d.value > A.max; + a.resetZones && 0 === g && (g = void 0) + }), this.clips = e) + }, + invertGroups: function (a) { + function b() { + q(["group", + "markerGroup" + ], function (b) { + c[b] && (d.renderer.isVML && c[b].attr({ + width: c.yAxis.len, + height: c.xAxis.len + }), c[b].width = c.yAxis.len, c[b].height = c.xAxis.len, c[b].invert(a)) + }) + } + var c = this, + d = c.chart, + f; + c.xAxis && (f = C(d, "resize", b), C(c, "destroy", f), b(a), c.invertGroups = b) + }, + plotGroup: function (a, b, c, d, f) { + var g = this[a], + e = !g; + e && (this[a] = g = this.chart.renderer.g().attr({ + zIndex: d || .1 + }).add(f)); + g.addClass("highcharts-" + b + " highcharts-series-" + this.index + " highcharts-" + this.type + "-series " + (y(this.colorIndex) ? "highcharts-color-" + + this.colorIndex + " " : "") + (this.options.className || "") + (g.hasClass("highcharts-tracker") ? " highcharts-tracker" : ""), !0); + g.attr({ + visibility: c + })[e ? "attr" : "animate"](this.getPlotBox()); + return g + }, + getPlotBox: function () { + var a = this.chart, + b = this.xAxis, + c = this.yAxis; + a.inverted && (b = c, c = this.xAxis); + return { + translateX: b ? b.left : a.plotLeft, + translateY: c ? c.top : a.plotTop, + scaleX: 1, + scaleY: 1 + } + }, + render: function () { + var a = this, + b = a.chart, + d, f = a.options, + e = !!a.animate && b.renderer.isSVG && E(f.animation).duration, + g = a.visible ? "inherit" : + "hidden", + h = f.zIndex, + l = a.hasRendered, + k = b.seriesGroup, + r = b.inverted; + d = a.plotGroup("group", "series", g, h, k); + a.markerGroup = a.plotGroup("markerGroup", "markers", g, h, k); + e && a.animate(!0); + d.inverted = a.isCartesian ? r : !1; + a.drawGraph && (a.drawGraph(), a.applyZones()); + a.drawDataLabels && a.drawDataLabels(); + a.visible && a.drawPoints(); + a.drawTracker && !1 !== a.options.enableMouseTracking && a.drawTracker(); + a.invertGroups(r); + !1 === f.clip || a.sharedClipKey || l || d.clip(b.clipRect); + e && a.animate(); + l || (a.animationTimeout = A(function () { + a.afterAnimate() + }, + e)); + a.isDirty = !1; + a.hasRendered = !0; + c(a, "afterRender") + }, + redraw: function () { + var a = this.chart, + b = this.isDirty || this.isDirtyData, + c = this.group, + d = this.xAxis, + f = this.yAxis; + c && (a.inverted && c.attr({ + width: a.plotWidth, + height: a.plotHeight + }), c.animate({ + translateX: p(d && d.left, a.plotLeft), + translateY: p(f && f.top, a.plotTop) + })); + this.translate(); + this.render(); + b && delete this.kdTree + }, + kdAxisArray: ["clientX", "plotY"], + searchPoint: function (a, b) { + var c = this.xAxis, + d = this.yAxis, + f = this.chart.inverted; + return this.searchKDTree({ + clientX: f ? + c.len - a.chartY + c.pos : a.chartX - c.pos, + plotY: f ? d.len - a.chartX + d.pos : a.chartY - d.pos + }, b) + }, + buildKDTree: function () { + function a(c, d, f) { + var g, e; + if (e = c && c.length) return g = b.kdAxisArray[d % f], c.sort(function (a, b) { + return a[g] - b[g] + }), e = Math.floor(e / 2), { + point: c[e], + left: a(c.slice(0, e), d + 1, f), + right: a(c.slice(e + 1), d + 1, f) + } + } + this.buildingKdTree = !0; + var b = this, + c = -1 < b.options.findNearestPointBy.indexOf("y") ? 2 : 1; + delete b.kdTree; + A(function () { + b.kdTree = a(b.getValidPoints(null, !b.directTouch), c, c); + b.buildingKdTree = !1 + }, b.options.kdNow ? + 0 : 1) + }, + searchKDTree: function (a, b) { + function c(a, b, h, m) { + var l = b.point, + k = d.kdAxisArray[h % m], + r, p, t = l; + p = y(a[f]) && y(l[f]) ? Math.pow(a[f] - l[f], 2) : null; + r = y(a[g]) && y(l[g]) ? Math.pow(a[g] - l[g], 2) : null; + r = (p || 0) + (r || 0); + l.dist = y(r) ? Math.sqrt(r) : Number.MAX_VALUE; + l.distX = y(p) ? Math.sqrt(p) : Number.MAX_VALUE; + k = a[k] - l[k]; + r = 0 > k ? "left" : "right"; + p = 0 > k ? "right" : "left"; + b[r] && (r = c(a, b[r], h + 1, m), t = r[e] < t[e] ? r : l); + b[p] && Math.sqrt(k * k) < t[e] && (a = c(a, b[p], h + 1, m), t = a[e] < t[e] ? a : t); + return t + } + var d = this, + f = this.kdAxisArray[0], + g = this.kdAxisArray[1], + e = b ? "distX" : "dist"; + b = -1 < d.options.findNearestPointBy.indexOf("y") ? 2 : 1; + this.kdTree || this.buildingKdTree || this.buildKDTree(); + if (this.kdTree) return c(a, this.kdTree, b, b) + } + }) + })(K); + (function (a) { + var C = a.Axis, + E = a.Chart, + F = a.correctFloat, + n = a.defined, + h = a.destroyObjectProperties, + e = a.each, + u = a.format, + y = a.objectEach, + q = a.pick, + x = a.Series; + a.StackItem = function (a, c, e, h, l) { + var d = a.chart.inverted; + this.axis = a; + this.isNegative = e; + this.options = c; + this.x = h; + this.total = null; + this.points = {}; + this.stack = l; + this.rightCliff = this.leftCliff = + 0; + this.alignOptions = { + align: c.align || (d ? e ? "left" : "right" : "center"), + verticalAlign: c.verticalAlign || (d ? "middle" : e ? "bottom" : "top"), + y: q(c.y, d ? 4 : e ? 14 : -6), + x: q(c.x, d ? e ? -6 : 6 : 0) + }; + this.textAlign = c.textAlign || (d ? e ? "right" : "left" : "center") + }; + a.StackItem.prototype = { + destroy: function () { + h(this, this.axis) + }, + render: function (a) { + var c = this.axis.chart, + f = this.options, + e = f.format, + e = e ? u(e, this, c.time) : f.formatter.call(this); + this.label ? this.label.attr({ + text: e, + visibility: "hidden" + }) : this.label = c.renderer.text(e, null, null, f.useHTML).css(f.style).attr({ + align: this.textAlign, + rotation: f.rotation, + visibility: "hidden" + }).add(a) + }, + setOffset: function (a, c) { + var f = this.axis, + e = f.chart, + h = f.translate(f.usePercentage ? 100 : this.total, 0, 0, 0, 1), + d = f.translate(0), + d = Math.abs(h - d); + a = e.xAxis[0].translate(this.x) + a; + f = this.getStackBox(e, this, a, h, c, d, f); + if (c = this.label) c.align(this.alignOptions, null, f), f = c.alignAttr, c[!1 === this.options.crop || e.isInsidePlot(f.x, f.y) ? "show" : "hide"](!0) + }, + getStackBox: function (a, c, e, h, l, d, b) { + var f = c.axis.reversed, + k = a.inverted; + a = b.height + b.pos - (k ? a.plotLeft : a.plotTop); + c = c.isNegative && !f || !c.isNegative && f; + return { + x: k ? c ? h : h - d : e, + y: k ? a - e - l : c ? a - h - d : a - h, + width: k ? d : l, + height: k ? l : d + } + } + }; + E.prototype.getStacks = function () { + var a = this; + e(a.yAxis, function (a) { + a.stacks && a.hasVisibleSeries && (a.oldStacks = a.stacks) + }); + e(a.series, function (c) { + !c.options.stacking || !0 !== c.visible && !1 !== a.options.chart.ignoreHiddenSeries || (c.stackKey = c.type + q(c.options.stack, "")) + }) + }; + C.prototype.buildStacks = function () { + var a = this.series, + c = q(this.options.reversedStacks, !0), + e = a.length, + h; + if (!this.isXAxis) { + this.usePercentage = !1; + for (h = e; h--;) a[c ? h : e - h - 1].setStackedPoints(); + for (h = 0; h < e; h++) a[h].modifyStacks() + } + }; + C.prototype.renderStackTotals = function () { + var a = this.chart, + c = a.renderer, + e = this.stacks, + h = this.stackTotalGroup; + h || (this.stackTotalGroup = h = c.g("stack-labels").attr({ + visibility: "visible", + zIndex: 6 + }).add()); + h.translate(a.plotLeft, a.plotTop); + y(e, function (a) { + y(a, function (a) { + a.render(h) + }) + }) + }; + C.prototype.resetStacks = function () { + var a = this, + c = a.stacks; + a.isXAxis || y(c, function (c) { + y(c, function (f, e) { + f.touched < a.stacksTouched ? (f.destroy(), + delete c[e]) : (f.total = null, f.cumulative = null) + }) + }) + }; + C.prototype.cleanStacks = function () { + var a; + this.isXAxis || (this.oldStacks && (a = this.stacks = this.oldStacks), y(a, function (a) { + y(a, function (a) { + a.cumulative = a.total + }) + })) + }; + x.prototype.setStackedPoints = function () { + if (this.options.stacking && (!0 === this.visible || !1 === this.chart.options.chart.ignoreHiddenSeries)) { + var f = this.processedXData, + c = this.processedYData, + e = [], + h = c.length, + l = this.options, + d = l.threshold, + b = q(l.startFromThreshold && d, 0), + v = l.stack, + l = l.stacking, + p = this.stackKey, + u = "-" + p, + t = this.negStacks, + y = this.yAxis, + A = y.stacks, + H = y.oldStacks, + m, D, B, x, G, g, w; + y.stacksTouched += 1; + for (G = 0; G < h; G++) g = f[G], w = c[G], m = this.getStackIndicator(m, g, this.index), x = m.key, B = (D = t && w < (b ? 0 : d)) ? u : p, A[B] || (A[B] = {}), A[B][g] || (H[B] && H[B][g] ? (A[B][g] = H[B][g], A[B][g].total = null) : A[B][g] = new a.StackItem(y, y.options.stackLabels, D, g, v)), B = A[B][g], null !== w ? (B.points[x] = B.points[this.index] = [q(B.cumulative, b)], n(B.cumulative) || (B.base = x), B.touched = y.stacksTouched, 0 < m.index && !1 === this.singleStacks && (B.points[x][0] = + B.points[this.index + "," + g + ",0"][0])) : B.points[x] = B.points[this.index] = null, "percent" === l ? (D = D ? p : u, t && A[D] && A[D][g] ? (D = A[D][g], B.total = D.total = Math.max(D.total, B.total) + Math.abs(w) || 0) : B.total = F(B.total + (Math.abs(w) || 0))) : B.total = F(B.total + (w || 0)), B.cumulative = q(B.cumulative, b) + (w || 0), null !== w && (B.points[x].push(B.cumulative), e[G] = B.cumulative); + "percent" === l && (y.usePercentage = !0); + this.stackedYData = e; + y.oldStacks = {} + } + }; + x.prototype.modifyStacks = function () { + var a = this, + c = a.stackKey, + h = a.yAxis.stacks, + r = a.processedXData, + l, d = a.options.stacking; + a[d + "Stacker"] && e([c, "-" + c], function (b) { + for (var c = r.length, f, e; c--;) + if (f = r[c], l = a.getStackIndicator(l, f, a.index, b), e = (f = h[b] && h[b][f]) && f.points[l.key]) a[d + "Stacker"](e, f, c) + }) + }; + x.prototype.percentStacker = function (a, c, e) { + c = c.total ? 100 / c.total : 0; + a[0] = F(a[0] * c); + a[1] = F(a[1] * c); + this.stackedYData[e] = a[1] + }; + x.prototype.getStackIndicator = function (a, c, e, h) { + !n(a) || a.x !== c || h && a.key !== h ? a = { + x: c, + index: 0, + key: h + } : a.index++; + a.key = [e, c, a.index].join(); + return a + } + })(K); + (function (a) { + var C = a.addEvent, + E = a.animate, + F = a.Axis, + n = a.createElement, + h = a.css, + e = a.defined, + u = a.each, + y = a.erase, + q = a.extend, + x = a.fireEvent, + f = a.inArray, + c = a.isNumber, + k = a.isObject, + r = a.isArray, + l = a.merge, + d = a.objectEach, + b = a.pick, + v = a.Point, + p = a.Series, + I = a.seriesTypes, + t = a.setAnimation, + L = a.splat; + q(a.Chart.prototype, { + addSeries: function (a, c, d) { + var f, e = this; + a && (c = b(c, !0), x(e, "addSeries", { + options: a + }, function () { + f = e.initSeries(a); + e.isDirtyLegend = !0; + e.linkSeries(); + x(e, "afterAddSeries"); + c && e.redraw(d) + })); + return f + }, + addAxis: function (a, c, d, f) { + var e = c ? "xAxis" : + "yAxis", + h = this.options; + a = l(a, { + index: this[e].length, + isX: c + }); + c = new F(this, a); + h[e] = L(h[e] || {}); + h[e].push(a); + b(d, !0) && this.redraw(f); + return c + }, + showLoading: function (a) { + var b = this, + c = b.options, + d = b.loadingDiv, + f = c.loading, + e = function () { + d && h(d, { + left: b.plotLeft + "px", + top: b.plotTop + "px", + width: b.plotWidth + "px", + height: b.plotHeight + "px" + }) + }; + d || (b.loadingDiv = d = n("div", { + className: "highcharts-loading highcharts-loading-hidden" + }, null, b.container), b.loadingSpan = n("span", { + className: "highcharts-loading-inner" + }, null, d), C(b, + "redraw", e)); + d.className = "highcharts-loading"; + b.loadingSpan.innerHTML = a || c.lang.loading; + h(d, q(f.style, { + zIndex: 10 + })); + h(b.loadingSpan, f.labelStyle); + b.loadingShown || (h(d, { + opacity: 0, + display: "" + }), E(d, { + opacity: f.style.opacity || .5 + }, { + duration: f.showDuration || 0 + })); + b.loadingShown = !0; + e() + }, + hideLoading: function () { + var a = this.options, + b = this.loadingDiv; + b && (b.className = "highcharts-loading highcharts-loading-hidden", E(b, { + opacity: 0 + }, { + duration: a.loading.hideDuration || 100, + complete: function () { + h(b, { + display: "none" + }) + } + })); + this.loadingShown = !1 + }, + propsRequireDirtyBox: "backgroundColor borderColor borderWidth margin marginTop marginRight marginBottom marginLeft spacing spacingTop spacingRight spacingBottom spacingLeft borderRadius plotBackgroundColor plotBackgroundImage plotBorderColor plotBorderWidth plotShadow shadow".split(" "), + propsRequireUpdateSeries: "chart.inverted chart.polar chart.ignoreHiddenSeries chart.type colors plotOptions time tooltip".split(" "), + update: function (a, h, m, k) { + var t = this, + p = { + credits: "addCredits", + title: "setTitle", + subtitle: "setSubtitle" + }, + r = a.chart, + g, n, A = []; + x(t, "update", { + options: a + }); + if (r) { + l(!0, t.options.chart, r); + "className" in r && t.setClassName(r.className); + "reflow" in r && t.setReflow(r.reflow); + if ("inverted" in r || "polar" in r || "type" in r) t.propFromSeries(), g = !0; + "alignTicks" in r && (g = !0); + d(r, function (a, b) { + -1 !== f("chart." + b, t.propsRequireUpdateSeries) && (n = !0); - 1 !== f(b, t.propsRequireDirtyBox) && (t.isDirtyBox = !0) + }); + "style" in r && t.renderer.setStyle(r.style) + } + a.colors && (this.options.colors = a.colors); + a.plotOptions && + l(!0, this.options.plotOptions, a.plotOptions); + d(a, function (a, b) { + if (t[b] && "function" === typeof t[b].update) t[b].update(a, !1); + else if ("function" === typeof t[p[b]]) t[p[b]](a); + "chart" !== b && -1 !== f(b, t.propsRequireUpdateSeries) && (n = !0) + }); + u("xAxis yAxis zAxis series colorAxis pane".split(" "), function (b) { + var c; + a[b] && ("series" === b && (c = [], u(t[b], function (a, b) { + a.options.isInternal || c.push(b) + })), u(L(a[b]), function (a, d) { + (d = e(a.id) && t.get(a.id) || t[b][c ? c[d] : d]) && d.coll === b && (d.update(a, !1), m && (d.touched = !0)); + if (!d && + m) + if ("series" === b) t.addSeries(a, !1).touched = !0; + else if ("xAxis" === b || "yAxis" === b) t.addAxis(a, "xAxis" === b, !1).touched = !0 + }), m && u(t[b], function (a) { + a.touched || a.options.isInternal ? delete a.touched : A.push(a) + })) + }); + u(A, function (a) { + a.remove(!1) + }); + g && u(t.axes, function (a) { + a.update({}, !1) + }); + n && u(t.series, function (a) { + a.update({}, !1) + }); + a.loading && l(!0, t.options.loading, a.loading); + g = r && r.width; + r = r && r.height; + c(g) && g !== t.chartWidth || c(r) && r !== t.chartHeight ? t.setSize(g, r, k) : b(h, !0) && t.redraw(k); + x(t, "afterUpdate", { + options: a + }) + }, + setSubtitle: function (a) { + this.setTitle(void 0, a) + } + }); + q(v.prototype, { + update: function (a, c, d, f) { + function e() { + h.applyOptions(a); + null === h.y && g && (h.graphic = g.destroy()); + k(a, !0) && (g && g.element && a && a.marker && void 0 !== a.marker.symbol && (h.graphic = g.destroy()), a && a.dataLabels && h.dataLabel && (h.dataLabel = h.dataLabel.destroy()), h.connector && (h.connector = h.connector.destroy())); + l = h.index; + m.updateParallelArrays(h, l); + p.data[l] = k(p.data[l], !0) || k(a, !0) ? h.options : b(a, p.data[l]); + m.isDirty = m.isDirtyData = !0; + !m.fixedBox && + m.hasCartesianSeries && (t.isDirtyBox = !0); + "point" === p.legendType && (t.isDirtyLegend = !0); + c && t.redraw(d) + } + var h = this, + m = h.series, + g = h.graphic, + l, t = m.chart, + p = m.options; + c = b(c, !0); + !1 === f ? e() : h.firePointEvent("update", { + options: a + }, e) + }, + remove: function (a, b) { + this.series.removePoint(f(this, this.series.data), a, b) + } + }); + q(p.prototype, { + addPoint: function (a, c, d, f) { + var e = this.options, + h = this.data, + m = this.chart, + g = this.xAxis, + g = g && g.hasNames && g.names, + l = e.data, + k, t, p = this.xData, + r, n; + c = b(c, !0); + k = { + series: this + }; + this.pointClass.prototype.applyOptions.apply(k, + [a]); + n = k.x; + r = p.length; + if (this.requireSorting && n < p[r - 1]) + for (t = !0; r && p[r - 1] > n;) r--; + this.updateParallelArrays(k, "splice", r, 0, 0); + this.updateParallelArrays(k, r); + g && k.name && (g[n] = k.name); + l.splice(r, 0, a); + t && (this.data.splice(r, 0, null), this.processData()); + "point" === e.legendType && this.generatePoints(); + d && (h[0] && h[0].remove ? h[0].remove(!1) : (h.shift(), this.updateParallelArrays(k, "shift"), l.shift())); + this.isDirtyData = this.isDirty = !0; + c && m.redraw(f) + }, + removePoint: function (a, c, d) { + var f = this, + e = f.data, + h = e[a], + m = f.points, + g = f.chart, + l = function () { + m && m.length === e.length && m.splice(a, 1); + e.splice(a, 1); + f.options.data.splice(a, 1); + f.updateParallelArrays(h || { + series: f + }, "splice", a, 1); + h && h.destroy(); + f.isDirty = !0; + f.isDirtyData = !0; + c && g.redraw() + }; + t(d, g); + c = b(c, !0); + h ? h.firePointEvent("remove", null, l) : l() + }, + remove: function (a, c, d) { + function f() { + e.destroy(); + h.isDirtyLegend = h.isDirtyBox = !0; + h.linkSeries(); + b(a, !0) && h.redraw(c) + } + var e = this, + h = e.chart; + !1 !== d ? x(e, "remove", null, f) : f() + }, + update: function (c, d) { + var e = this, + h = e.chart, + k = e.userOptions, + t = + e.oldType || e.type, + p = c.type || k.type || h.options.chart.type, + g = I[t].prototype, + r, n = ["group", "markerGroup", "dataLabelsGroup"], + v = ["navigatorSeries", "baseSeries"], + A = e.finishedAnimating && { + animation: !1 + }, + y = ["data", "name", "turboThreshold"], + H = a.keys(c), + z = 0 < H.length; + u(H, function (a) { + -1 === f(a, y) && (z = !1) + }); + if (z) c.data && this.setData(c.data, !1), c.name && this.setName(c.name, !1); + else { + v = n.concat(v); + u(v, function (a) { + v[a] = e[a]; + delete e[a] + }); + c = l(k, A, { + index: e.index, + pointStart: b(k.pointStart, e.xData[0]) + }, { + data: e.options.data + }, + c); + e.remove(!1, null, !1); + for (r in g) e[r] = void 0; + I[p || t] ? q(e, I[p || t].prototype) : a.error(17, !0); + u(v, function (a) { + e[a] = v[a] + }); + e.init(h, c); + c.zIndex !== k.zIndex && u(n, function (a) { + e[a] && e[a].attr({ + zIndex: c.zIndex + }) + }); + e.oldType = t; + h.linkSeries() + } + x(this, "afterUpdate"); + b(d, !0) && h.redraw(!1) + }, + setName: function (a) { + this.name = this.options.name = this.userOptions.name = a; + this.chart.isDirtyLegend = !0 + } + }); + q(F.prototype, { + update: function (a, c) { + var f = this.chart, + e = a && a.events || {}; + a = l(this.userOptions, a); + f.options[this.coll].indexOf && + (f.options[this.coll][f.options[this.coll].indexOf(this.userOptions)] = a); + d(f.options[this.coll].events, function (a, b) { + "undefined" === typeof e[b] && (e[b] = void 0) + }); + this.destroy(!0); + this.init(f, q(a, { + events: e + })); + f.isDirtyBox = !0; + b(c, !0) && f.redraw() + }, + remove: function (a) { + for (var c = this.chart, d = this.coll, f = this.series, e = f.length; e--;) f[e] && f[e].remove(!1); + y(c.axes, this); + y(c[d], this); + r(c.options[d]) ? c.options[d].splice(this.options.index, 1) : delete c.options[d]; + u(c[d], function (a, b) { + a.options.index = a.userOptions.index = + b + }); + this.destroy(); + c.isDirtyBox = !0; + b(a, !0) && c.redraw() + }, + setTitle: function (a, b) { + this.update({ + title: a + }, b) + }, + setCategories: function (a, b) { + this.update({ + categories: a + }, b) + } + }) + })(K); + (function (a) { + var C = a.color, + E = a.each, + F = a.map, + n = a.pick, + h = a.Series, + e = a.seriesType; + e("area", "line", { + softThreshold: !1, + threshold: 0 + }, { + singleStacks: !1, + getStackPoints: function (e) { + var h = [], + q = [], + u = this.xAxis, + f = this.yAxis, + c = f.stacks[this.stackKey], + k = {}, + r = this.index, + l = f.series, + d = l.length, + b, v = n(f.options.reversedStacks, !0) ? 1 : -1, + p; + e = e || this.points; + if (this.options.stacking) { + for (p = 0; p < e.length; p++) e[p].leftNull = e[p].rightNull = null, k[e[p].x] = e[p]; + a.objectEach(c, function (a, b) { + null !== a.total && q.push(b) + }); + q.sort(function (a, b) { + return a - b + }); + b = F(l, function () { + return this.visible + }); + E(q, function (a, e) { + var l = 0, + t, n; + if (k[a] && !k[a].isNull) h.push(k[a]), E([-1, 1], function (f) { + var h = 1 === f ? "rightNull" : "leftNull", + l = 0, + m = c[q[e + f]]; + if (m) + for (p = r; 0 <= p && p < d;) t = m.points[p], t || (p === r ? k[a][h] = !0 : b[p] && (n = c[a].points[p]) && (l -= n[1] - n[0])), p += v; + k[a][1 === f ? "rightCliff" : "leftCliff"] = + l + }); + else { + for (p = r; 0 <= p && p < d;) { + if (t = c[a].points[p]) { + l = t[1]; + break + } + p += v + } + l = f.translate(l, 0, 1, 0, 1); + h.push({ + isNull: !0, + plotX: u.translate(a, 0, 0, 0, 1), + x: a, + plotY: l, + yBottom: l + }) + } + }) + } + return h + }, + getGraphPath: function (a) { + var e = h.prototype.getGraphPath, + q = this.options, + u = q.stacking, + f = this.yAxis, + c, k, r = [], + l = [], + d = this.index, + b, v = f.stacks[this.stackKey], + p = q.threshold, + I = f.getThreshold(q.threshold), + t, q = q.connectNulls || "percent" === u, + L = function (c, e, h) { + var m = a[c]; + c = u && v[m.x].points[d]; + var k = m[h + "Null"] || 0; + h = m[h + "Cliff"] || 0; + var t, + n, m = !0; + h || k ? (t = (k ? c[0] : c[1]) + h, n = c[0] + h, m = !!k) : !u && a[e] && a[e].isNull && (t = n = p); + void 0 !== t && (l.push({ + plotX: b, + plotY: null === t ? I : f.getThreshold(t), + isNull: m, + isCliff: !0 + }), r.push({ + plotX: b, + plotY: null === n ? I : f.getThreshold(n), + doCurve: !1 + })) + }; + a = a || this.points; + u && (a = this.getStackPoints(a)); + for (c = 0; c < a.length; c++) + if (k = a[c].isNull, b = n(a[c].rectPlotX, a[c].plotX), t = n(a[c].yBottom, I), !k || q) q || L(c, c - 1, "left"), k && !u && q || (l.push(a[c]), r.push({ + x: c, + plotX: b, + plotY: t + })), q || L(c, c + 1, "right"); + c = e.call(this, l, !0, !0); + r.reversed = !0; + k = e.call(this, r, !0, !0); + k.length && (k[0] = "L"); + k = c.concat(k); + e = e.call(this, l, !1, q); + k.xMap = c.xMap; + this.areaPath = k; + return e + }, + drawGraph: function () { + this.areaPath = []; + h.prototype.drawGraph.apply(this); + var a = this, + e = this.areaPath, + q = this.options, + x = [ + ["area", "highcharts-area", this.color, q.fillColor] + ]; + E(this.zones, function (f, c) { + x.push(["zone-area-" + c, "highcharts-area highcharts-zone-area-" + c + " " + f.className, f.color || a.color, f.fillColor || q.fillColor]) + }); + E(x, function (f) { + var c = f[0], + h = a[c]; + h ? (h.endX = a.preventGraphAnimation ? + null : e.xMap, h.animate({ + d: e + })) : (h = a[c] = a.chart.renderer.path(e).addClass(f[1]).attr({ + fill: n(f[3], C(f[2]).setOpacity(n(q.fillOpacity, .75)).get()), + zIndex: 0 + }).add(a.group), h.isArea = !0); + h.startX = e.xMap; + h.shiftUnit = q.step ? 2 : 1 + }) + }, + drawLegendSymbol: a.LegendSymbolMixin.drawRectangle + }) + })(K); + (function (a) { + var C = a.pick; + a = a.seriesType; + a("spline", "line", {}, { + getPointSpline: function (a, F, n) { + var h = F.plotX, + e = F.plotY, + u = a[n - 1]; + n = a[n + 1]; + var y, q, x, f; + if (u && !u.isNull && !1 !== u.doCurve && !F.isCliff && n && !n.isNull && !1 !== n.doCurve && + !F.isCliff) { + a = u.plotY; + x = n.plotX; + n = n.plotY; + var c = 0; + y = (1.5 * h + u.plotX) / 2.5; + q = (1.5 * e + a) / 2.5; + x = (1.5 * h + x) / 2.5; + f = (1.5 * e + n) / 2.5; + x !== y && (c = (f - q) * (x - h) / (x - y) + e - f); + q += c; + f += c; + q > a && q > e ? (q = Math.max(a, e), f = 2 * e - q) : q < a && q < e && (q = Math.min(a, e), f = 2 * e - q); + f > n && f > e ? (f = Math.max(n, e), q = 2 * e - f) : f < n && f < e && (f = Math.min(n, e), q = 2 * e - f); + F.rightContX = x; + F.rightContY = f + } + F = ["C", C(u.rightContX, u.plotX), C(u.rightContY, u.plotY), C(y, h), C(q, e), h, e]; + u.rightContX = u.rightContY = null; + return F + } + }) + })(K); + (function (a) { + var C = a.seriesTypes.area.prototype, + E = a.seriesType; + E("areaspline", "spline", a.defaultPlotOptions.area, { + getStackPoints: C.getStackPoints, + getGraphPath: C.getGraphPath, + drawGraph: C.drawGraph, + drawLegendSymbol: a.LegendSymbolMixin.drawRectangle + }) + })(K); + (function (a) { + var C = a.animObject, + E = a.color, + F = a.each, + n = a.extend, + h = a.isNumber, + e = a.merge, + u = a.pick, + y = a.Series, + q = a.seriesType, + x = a.svg; + q("column", "line", { + borderRadius: 0, + crisp: !0, + groupPadding: .2, + marker: null, + pointPadding: .1, + minPointLength: 0, + cropThreshold: 50, + pointRange: null, + states: { + hover: { + halo: !1, + brightness: .1 + }, + select: { + color: "#cccccc", + borderColor: "#000000" + } + }, + dataLabels: { + align: null, + verticalAlign: null, + y: null + }, + softThreshold: !1, + startFromThreshold: !0, + stickyTracking: !1, + tooltip: { + distance: 6 + }, + threshold: 0, + borderColor: "#ffffff" + }, { + cropShoulder: 0, + directTouch: !0, + trackerGroups: ["group", "dataLabelsGroup"], + negStacks: !0, + init: function () { + y.prototype.init.apply(this, arguments); + var a = this, + c = a.chart; + c.hasRendered && F(c.series, function (c) { + c.type === a.type && (c.isDirty = !0) + }) + }, + getColumnMetrics: function () { + var a = this, + c = a.options, + e = a.xAxis, + h = a.yAxis, + l = e.options.reversedStacks, + l = e.reversed && !l || !e.reversed && l, + d, b = {}, + n = 0; + !1 === c.grouping ? n = 1 : F(a.chart.series, function (c) { + var f = c.options, + e = c.yAxis, + l; + c.type !== a.type || !c.visible && a.chart.options.chart.ignoreHiddenSeries || h.len !== e.len || h.pos !== e.pos || (f.stacking ? (d = c.stackKey, void 0 === b[d] && (b[d] = n++), l = b[d]) : !1 !== f.grouping && (l = n++), c.columnIndex = l) + }); + var p = Math.min(Math.abs(e.transA) * (e.ordinalSlope || c.pointRange || e.closestPointRange || e.tickInterval || 1), e.len), + q = p * c.groupPadding, + t = (p - 2 * + q) / (n || 1), + c = Math.min(c.maxPointWidth || e.len, u(c.pointWidth, t * (1 - 2 * c.pointPadding))); + a.columnMetrics = { + width: c, + offset: (t - c) / 2 + (q + ((a.columnIndex || 0) + (l ? 1 : 0)) * t - p / 2) * (l ? -1 : 1) + }; + return a.columnMetrics + }, + crispCol: function (a, c, e, h) { + var f = this.chart, + d = this.borderWidth, + b = -(d % 2 ? .5 : 0), + d = d % 2 ? .5 : 1; + f.inverted && f.renderer.isVML && (d += 1); + this.options.crisp && (e = Math.round(a + e) + b, a = Math.round(a) + b, e -= a); + h = Math.round(c + h) + d; + b = .5 >= Math.abs(c) && .5 < h; + c = Math.round(c) + d; + h -= c; + b && h && (--c, h += 1); + return { + x: a, + y: c, + width: e, + height: h + } + }, + translate: function () { + var a = this, + c = a.chart, + e = a.options, + h = a.dense = 2 > a.closestPointRange * a.xAxis.transA, + h = a.borderWidth = u(e.borderWidth, h ? 0 : 1), + l = a.yAxis, + d = e.threshold, + b = a.translatedThreshold = l.getThreshold(d), + n = u(e.minPointLength, 5), + p = a.getColumnMetrics(), + q = p.width, + t = a.barW = Math.max(q, 1 + 2 * h), + x = a.pointXOffset = p.offset; + c.inverted && (b -= .5); + e.pointPadding && (t = Math.ceil(t)); + y.prototype.translate.apply(a); + F(a.points, function (f) { + var e = u(f.yBottom, b), + h = 999 + Math.abs(e), + h = Math.min(Math.max(-h, f.plotY), l.len + h), + k = f.plotX + x, + p = t, + r = Math.min(h, e), + v, g = Math.max(h, e) - r; + n && Math.abs(g) < n && (g = n, v = !l.reversed && !f.negative || l.reversed && f.negative, f.y === d && a.dataMax <= d && l.min < d && (v = !v), r = Math.abs(r - b) > n ? e - n : b - (v ? n : 0)); + f.barX = k; + f.pointWidth = q; + f.tooltipPos = c.inverted ? [l.len + l.pos - c.plotLeft - h, a.xAxis.len - k - p / 2, g] : [k + p / 2, h + l.pos - c.plotTop, g]; + f.shapeType = "rect"; + f.shapeArgs = a.crispCol.apply(a, f.isNull ? [k, b, p, 0] : [k, r, p, g]) + }) + }, + getSymbol: a.noop, + drawLegendSymbol: a.LegendSymbolMixin.drawRectangle, + drawGraph: function () { + this.group[this.dense ? + "addClass" : "removeClass"]("highcharts-dense-data") + }, + pointAttribs: function (a, c) { + var f = this.options, + h, l = this.pointAttrToOptions || {}; + h = l.stroke || "borderColor"; + var d = l["stroke-width"] || "borderWidth", + b = a && a.color || this.color, + n = a && a[h] || f[h] || this.color || b, + p = a && a[d] || f[d] || this[d] || 0, + l = f.dashStyle; + a && this.zones.length && (b = a.getZone(), b = a.options.color || b && b.color || this.color); + c && (a = e(f.states[c], a.options.states && a.options.states[c] || {}), c = a.brightness, b = a.color || void 0 !== c && E(b).brighten(a.brightness).get() || + b, n = a[h] || n, p = a[d] || p, l = a.dashStyle || l); + h = { + fill: b, + stroke: n, + "stroke-width": p + }; + l && (h.dashstyle = l); + return h + }, + drawPoints: function () { + var a = this, + c = this.chart, + k = a.options, + r = c.renderer, + l = k.animationLimit || 250, + d; + F(a.points, function (b) { + var f = b.graphic, + p = f && c.pointCount < l ? "animate" : "attr"; + if (h(b.plotY) && null !== b.y) { + d = b.shapeArgs; + if (f) f[p](e(d)); + else b.graphic = f = r[b.shapeType](d).add(b.group || a.group); + k.borderRadius && f.attr({ + r: k.borderRadius + }); + f[p](a.pointAttribs(b, b.selected && "select")).shadow(k.shadow, null, + k.stacking && !k.borderRadius); + f.addClass(b.getClassName(), !0) + } else f && (b.graphic = f.destroy()) + }) + }, + animate: function (a) { + var c = this, + f = this.yAxis, + e = c.options, + h = this.chart.inverted, + d = {}, + b = h ? "translateX" : "translateY", + q; + x && (a ? (d.scaleY = .001, a = Math.min(f.pos + f.len, Math.max(f.pos, f.toPixels(e.threshold))), h ? d.translateX = a - f.len : d.translateY = a, c.group.attr(d)) : (q = c.group.attr(b), c.group.animate({ + scaleY: 1 + }, n(C(c.options.animation), { + step: function (a, e) { + d[b] = q + e.pos * (f.pos - q); + c.group.attr(d) + } + })), c.animate = null)) + }, + remove: function () { + var a = this, + c = a.chart; + c.hasRendered && F(c.series, function (c) { + c.type === a.type && (c.isDirty = !0) + }); + y.prototype.remove.apply(a, arguments) + } + }) + })(K); + (function (a) { + a = a.seriesType; + a("bar", "column", null, { + inverted: !0 + }) + })(K); + (function (a) { + var C = a.Series; + a = a.seriesType; + a("scatter", "line", { + lineWidth: 0, + findNearestPointBy: "xy", + marker: { + enabled: !0 + }, + tooltip: { + headerFormat: '\x3cspan style\x3d"color:{point.color}"\x3e\u25cf\x3c/span\x3e \x3cspan style\x3d"font-size: 0.85em"\x3e {series.name}\x3c/span\x3e\x3cbr/\x3e', + pointFormat: "x: \x3cb\x3e{point.x}\x3c/b\x3e\x3cbr/\x3ey: \x3cb\x3e{point.y}\x3c/b\x3e\x3cbr/\x3e" + } + }, { + sorted: !1, + requireSorting: !1, + noSharedTooltip: !0, + trackerGroups: ["group", "markerGroup", "dataLabelsGroup"], + takeOrdinalPosition: !1, + drawGraph: function () { + this.options.lineWidth && C.prototype.drawGraph.call(this) + } + }) + })(K); + (function (a) { + var C = a.deg2rad, + E = a.isNumber, + F = a.pick, + n = a.relativeLength; + a.CenteredSeriesMixin = { + getCenter: function () { + var a = this.options, + e = this.chart, + u = 2 * (a.slicedOffset || 0), + y = e.plotWidth - 2 * u, + e = e.plotHeight - 2 * u, + q = a.center, + q = [F(q[0], "50%"), F(q[1], "50%"), a.size || "100%", a.innerSize || 0], + x = Math.min(y, e), + f, c; + for (f = 0; 4 > f; ++f) c = q[f], a = 2 > f || 2 === f && /%$/.test(c), q[f] = n(c, [y, e, x, q[2]][f]) + (a ? u : 0); + q[3] > q[2] && (q[3] = q[2]); + return q + }, + getStartAndEndRadians: function (a, e) { + a = E(a) ? a : 0; + e = E(e) && e > a && 360 > e - a ? e : a + 360; + return { + start: C * (a + -90), + end: C * (e + -90) + } + } + } + })(K); + (function (a) { + var C = a.addEvent, + E = a.CenteredSeriesMixin, + F = a.defined, + n = a.each, + h = a.extend, + e = E.getStartAndEndRadians, + u = a.inArray, + y = a.noop, + q = a.pick, + x = a.Point, + f = a.Series, + c = a.seriesType, + k = a.setAnimation; + c("pie", "line", { + center: [null, null], + clip: !1, + colorByPoint: !0, + dataLabels: { + allowOverlap: !0, + distance: 30, + enabled: !0, + formatter: function () { + return this.point.isNull ? void 0 : this.point.name + }, + x: 0 + }, + ignoreHiddenPoint: !0, + legendType: "point", + marker: null, + size: null, + showInLegend: !1, + slicedOffset: 10, + stickyTracking: !1, + tooltip: { + followPointer: !0 + }, + borderColor: "#ffffff", + borderWidth: 1, + states: { + hover: { + brightness: .1 + } + } + }, { + isCartesian: !1, + requireSorting: !1, + directTouch: !0, + noSharedTooltip: !0, + trackerGroups: ["group", "dataLabelsGroup"], + axisTypes: [], + pointAttribs: a.seriesTypes.column.prototype.pointAttribs, + animate: function (a) { + var c = this, + d = c.points, + b = c.startAngleRad; + a || (n(d, function (a) { + var d = a.graphic, + f = a.shapeArgs; + d && (d.attr({ + r: a.startR || c.center[3] / 2, + start: b, + end: b + }), d.animate({ + r: f.r, + start: f.start, + end: f.end + }, c.options.animation)) + }), c.animate = null) + }, + updateTotals: function () { + var a, c = 0, + d = this.points, + b = d.length, + f, e = this.options.ignoreHiddenPoint; + for (a = 0; a < b; a++) f = d[a], c += e && !f.visible ? 0 : f.isNull ? + 0 : f.y; + this.total = c; + for (a = 0; a < b; a++) f = d[a], f.percentage = 0 < c && (f.visible || !e) ? f.y / c * 100 : 0, f.total = c + }, + generatePoints: function () { + f.prototype.generatePoints.call(this); + this.updateTotals() + }, + translate: function (a) { + this.generatePoints(); + var c = 0, + d = this.options, + b = d.slicedOffset, + f = b + (d.borderWidth || 0), + h, k, t, n = e(d.startAngle, d.endAngle), + r = this.startAngleRad = n.start, + n = (this.endAngleRad = n.end) - r, + u = this.points, + m, x = d.dataLabels.distance, + d = d.ignoreHiddenPoint, + y, C = u.length, + G; + a || (this.center = a = this.getCenter()); + this.getX = + function (b, c, d) { + t = Math.asin(Math.min((b - a[1]) / (a[2] / 2 + d.labelDistance), 1)); + return a[0] + (c ? -1 : 1) * Math.cos(t) * (a[2] / 2 + d.labelDistance) + }; + for (y = 0; y < C; y++) { + G = u[y]; + G.labelDistance = q(G.options.dataLabels && G.options.dataLabels.distance, x); + this.maxLabelDistance = Math.max(this.maxLabelDistance || 0, G.labelDistance); + h = r + c * n; + if (!d || G.visible) c += G.percentage / 100; + k = r + c * n; + G.shapeType = "arc"; + G.shapeArgs = { + x: a[0], + y: a[1], + r: a[2] / 2, + innerR: a[3] / 2, + start: Math.round(1E3 * h) / 1E3, + end: Math.round(1E3 * k) / 1E3 + }; + t = (k + h) / 2; + t > 1.5 * Math.PI ? + t -= 2 * Math.PI : t < -Math.PI / 2 && (t += 2 * Math.PI); + G.slicedTranslation = { + translateX: Math.round(Math.cos(t) * b), + translateY: Math.round(Math.sin(t) * b) + }; + k = Math.cos(t) * a[2] / 2; + m = Math.sin(t) * a[2] / 2; + G.tooltipPos = [a[0] + .7 * k, a[1] + .7 * m]; + G.half = t < -Math.PI / 2 || t > Math.PI / 2 ? 1 : 0; + G.angle = t; + h = Math.min(f, G.labelDistance / 5); + G.labelPos = [a[0] + k + Math.cos(t) * G.labelDistance, a[1] + m + Math.sin(t) * G.labelDistance, a[0] + k + Math.cos(t) * h, a[1] + m + Math.sin(t) * h, a[0] + k, a[1] + m, 0 > G.labelDistance ? "center" : G.half ? "right" : "left", t] + } + }, + drawGraph: null, + drawPoints: function () { + var a = this, + c = a.chart.renderer, + d, b, f, e, k = a.options.shadow; + k && !a.shadowGroup && (a.shadowGroup = c.g("shadow").add(a.group)); + n(a.points, function (l) { + b = l.graphic; + if (l.isNull) b && (l.graphic = b.destroy()); + else { + e = l.shapeArgs; + d = l.getTranslate(); + var t = l.shadowGroup; + k && !t && (t = l.shadowGroup = c.g("shadow").add(a.shadowGroup)); + t && t.attr(d); + f = a.pointAttribs(l, l.selected && "select"); + b ? b.setRadialReference(a.center).attr(f).animate(h(e, d)) : (l.graphic = b = c[l.shapeType](e).setRadialReference(a.center).attr(d).add(a.group), + b.attr(f).attr({ + "stroke-linejoin": "round" + }).shadow(k, t)); + b.attr({ + visibility: l.visible ? "inherit" : "hidden" + }); + b.addClass(l.getClassName()) + } + }) + }, + searchPoint: y, + sortByAngle: function (a, c) { + a.sort(function (a, b) { + return void 0 !== a.angle && (b.angle - a.angle) * c + }) + }, + drawLegendSymbol: a.LegendSymbolMixin.drawRectangle, + getCenter: E.getCenter, + getSymbol: y + }, { + init: function () { + x.prototype.init.apply(this, arguments); + var a = this, + c; + a.name = q(a.name, "Slice"); + c = function (c) { + a.slice("select" === c.type) + }; + C(a, "select", c); + C(a, "unselect", + c); + return a + }, + isValid: function () { + return a.isNumber(this.y, !0) && 0 <= this.y + }, + setVisible: function (a, c) { + var d = this, + b = d.series, + f = b.chart, + e = b.options.ignoreHiddenPoint; + c = q(c, e); + a !== d.visible && (d.visible = d.options.visible = a = void 0 === a ? !d.visible : a, b.options.data[u(d, b.data)] = d.options, n(["graphic", "dataLabel", "connector", "shadowGroup"], function (b) { + if (d[b]) d[b][a ? "show" : "hide"](!0) + }), d.legendItem && f.legend.colorizeItem(d, a), a || "hover" !== d.state || d.setState(""), e && (b.isDirty = !0), c && f.redraw()) + }, + slice: function (a, + c, d) { + var b = this.series; + k(d, b.chart); + q(c, !0); + this.sliced = this.options.sliced = F(a) ? a : !this.sliced; + b.options.data[u(this, b.data)] = this.options; + this.graphic.animate(this.getTranslate()); + this.shadowGroup && this.shadowGroup.animate(this.getTranslate()) + }, + getTranslate: function () { + return this.sliced ? this.slicedTranslation : { + translateX: 0, + translateY: 0 + } + }, + haloPath: function (a) { + var c = this.shapeArgs; + return this.sliced || !this.visible ? [] : this.series.chart.renderer.symbols.arc(c.x, c.y, c.r + a, c.r + a, { + innerR: this.shapeArgs.r - + 1, + start: c.start, + end: c.end + }) + } + }) + })(K); + (function (a) { + var C = a.addEvent, + E = a.arrayMax, + F = a.defined, + n = a.each, + h = a.extend, + e = a.format, + u = a.map, + y = a.merge, + q = a.noop, + x = a.pick, + f = a.relativeLength, + c = a.Series, + k = a.seriesTypes, + r = a.some, + l = a.stableSort; + a.distribute = function (c, b, f) { + function d(a, b) { + return a.target - b.target + } + var e, h = !0, + k = c, + q = [], + v; + v = 0; + var m = k.reducedLen || b; + for (e = c.length; e--;) v += c[e].size; + if (v > m) { + l(c, function (a, b) { + return (b.rank || 0) - (a.rank || 0) + }); + for (v = e = 0; v <= m;) v += c[e].size, e++; + q = c.splice(e - 1, c.length) + } + l(c, d); + for (c = u(c, function (a) { + return { + size: a.size, + targets: [a.target], + align: x(a.align, .5) + } + }); h;) { + for (e = c.length; e--;) h = c[e], v = (Math.min.apply(0, h.targets) + Math.max.apply(0, h.targets)) / 2, h.pos = Math.min(Math.max(0, v - h.size * h.align), b - h.size); + e = c.length; + for (h = !1; e--;) 0 < e && c[e - 1].pos + c[e - 1].size > c[e].pos && (c[e - 1].size += c[e].size, c[e - 1].targets = c[e - 1].targets.concat(c[e].targets), c[e - 1].align = .5, c[e - 1].pos + c[e - 1].size > b && (c[e - 1].pos = b - c[e - 1].size), c.splice(e, 1), h = !0) + } + k.push.apply(k, q); + e = 0; + r(c, function (c) { + var d = + 0; + if (r(c.targets, function () { + k[e].pos = c.pos + d; + if (Math.abs(k[e].pos - k[e].target) > f) return n(k.slice(0, e + 1), function (a) { + delete a.pos + }), k.reducedLen = (k.reducedLen || b) - .1 * b, k.reducedLen > .1 * b && a.distribute(k, b, f), !0; + d += k[e].size; + e++ + })) return !0 + }); + l(k, d) + }; + c.prototype.drawDataLabels = function () { + function c(a, b) { + var c = b.filter; + return c ? (b = c.operator, a = a[c.property], c = c.value, "\x3e" === b && a > c || "\x3c" === b && a < c || "\x3e\x3d" === b && a >= c || "\x3c\x3d" === b && a <= c || "\x3d\x3d" === b && a == c || "\x3d\x3d\x3d" === b && a === c ? !0 : !1) : !0 + } + var b = this, + f = b.chart, + h = b.options, + l = h.dataLabels, + k = b.points, + r, q, u = b.hasRendered || 0, + m, D, B = x(l.defer, !!h.animation), + E = f.renderer; + if (l.enabled || b._hasPointLabels) b.dlProcessOptions && b.dlProcessOptions(l), D = b.plotGroup("dataLabelsGroup", "data-labels", B && !u ? "hidden" : "visible", l.zIndex || 6), B && (D.attr({ + opacity: +u + }), u || C(b, "afterAnimate", function () { + b.visible && D.show(!0); + D[h.animation ? "animate" : "attr"]({ + opacity: 1 + }, { + duration: 200 + }) + })), q = l, n(k, function (d) { + var g, k = d.dataLabel, + t, p, n = d.connector, + u = !k, + v; + r = d.dlOptions || + d.options && d.options.dataLabels; + (g = x(r && r.enabled, q.enabled) && !d.isNull) && (g = !0 === c(d, r || l)); + g && (l = y(q, r), t = d.getLabelConfig(), v = l[d.formatPrefix + "Format"] || l.format, m = F(v) ? e(v, t, f.time) : (l[d.formatPrefix + "Formatter"] || l.formatter).call(t, l), v = l.style, t = l.rotation, v.color = x(l.color, v.color, b.color, "#000000"), "contrast" === v.color && (d.contrastColor = E.getContrast(d.color || b.color), v.color = l.inside || 0 > x(d.labelDistance, l.distance) || h.stacking ? d.contrastColor : "#000000"), h.cursor && (v.cursor = h.cursor), p = { + fill: l.backgroundColor, + stroke: l.borderColor, + "stroke-width": l.borderWidth, + r: l.borderRadius || 0, + rotation: t, + padding: l.padding, + zIndex: 1 + }, a.objectEach(p, function (a, b) { + void 0 === a && delete p[b] + })); + !k || g && F(m) ? g && F(m) && (k ? p.text = m : (k = d.dataLabel = t ? E.text(m, 0, -9999).addClass("highcharts-data-label") : E.label(m, 0, -9999, l.shape, null, null, l.useHTML, null, "data-label"), k.addClass(" highcharts-data-label-color-" + d.colorIndex + " " + (l.className || "") + (l.useHTML ? " highcharts-tracker" : ""))), k.attr(p), k.css(v).shadow(l.shadow), + k.added || k.add(D), b.alignDataLabel(d, k, l, null, u)) : (d.dataLabel = k = k.destroy(), n && (d.connector = n.destroy())) + }); + a.fireEvent(this, "afterDrawDataLabels") + }; + c.prototype.alignDataLabel = function (a, b, c, e, f) { + var d = this.chart, + l = d.inverted, + k = x(a.dlBox && a.dlBox.centerX, a.plotX, -9999), + n = x(a.plotY, -9999), + m = b.getBBox(), + p, r = c.rotation, + q = c.align, + u = this.visible && (a.series.forceDL || d.isInsidePlot(k, Math.round(n), l) || e && d.isInsidePlot(k, l ? e.x + 1 : e.y + e.height - 1, l)), + g = "justify" === x(c.overflow, "justify"); + if (u && (p = c.style.fontSize, + p = d.renderer.fontMetrics(p, b).b, e = h({ + x: l ? this.yAxis.len - n : k, + y: Math.round(l ? this.xAxis.len - k : n), + width: 0, + height: 0 + }, e), h(c, { + width: m.width, + height: m.height + }), r ? (g = !1, k = d.renderer.rotCorr(p, r), k = { + x: e.x + c.x + e.width / 2 + k.x, + y: e.y + c.y + { + top: 0, + middle: .5, + bottom: 1 + } [c.verticalAlign] * e.height + }, b[f ? "attr" : "animate"](k).attr({ + align: q + }), n = (r + 720) % 360, n = 180 < n && 360 > n, "left" === q ? k.y -= n ? m.height : 0 : "center" === q ? (k.x -= m.width / 2, k.y -= m.height / 2) : "right" === q && (k.x -= m.width, k.y -= n ? 0 : m.height), b.placed = !0, b.alignAttr = k) : (b.align(c, + null, e), k = b.alignAttr), g ? a.isLabelJustified = this.justifyDataLabel(b, c, k, m, e, f) : x(c.crop, !0) && (u = d.isInsidePlot(k.x, k.y) && d.isInsidePlot(k.x + m.width, k.y + m.height)), c.shape && !r)) b[f ? "attr" : "animate"]({ + anchorX: l ? d.plotWidth - a.plotY : a.plotX, + anchorY: l ? d.plotHeight - a.plotX : a.plotY + }); + u || (b.attr({ + y: -9999 + }), b.placed = !1) + }; + c.prototype.justifyDataLabel = function (a, b, c, e, f, h) { + var d = this.chart, + l = b.align, + k = b.verticalAlign, + m, t, n = a.box ? 0 : a.padding || 0; + m = c.x + n; + 0 > m && ("right" === l ? b.align = "left" : b.x = -m, t = !0); + m = c.x + e.width - + n; + m > d.plotWidth && ("left" === l ? b.align = "right" : b.x = d.plotWidth - m, t = !0); + m = c.y + n; + 0 > m && ("bottom" === k ? b.verticalAlign = "top" : b.y = -m, t = !0); + m = c.y + e.height - n; + m > d.plotHeight && ("top" === k ? b.verticalAlign = "bottom" : b.y = d.plotHeight - m, t = !0); + t && (a.placed = !h, a.align(b, null, f)); + return t + }; + k.pie && (k.pie.prototype.drawDataLabels = function () { + var d = this, + b = d.data, + e, f = d.chart, + h = d.options.dataLabels, + l = x(h.connectorPadding, 10), + k = x(h.connectorWidth, 1), + r = f.plotWidth, + q = f.plotHeight, + m = Math.round(f.chartWidth / 3), + u, y = d.center, + C = y[2] / + 2, + G = y[1], + g, w, K, Q, J = [ + [], + [] + ], + O, N, z, R, S = [0, 0, 0, 0]; + d.visible && (h.enabled || d._hasPointLabels) && (n(b, function (a) { + a.dataLabel && a.visible && a.dataLabel.shortened && (a.dataLabel.attr({ + width: "auto" + }).css({ + width: "auto", + textOverflow: "clip" + }), a.dataLabel.shortened = !1) + }), c.prototype.drawDataLabels.apply(d), n(b, function (a) { + a.dataLabel && (a.visible ? (J[a.half].push(a), a.dataLabel._pos = null, !F(h.style.width) && !F(a.options.dataLabels && a.options.dataLabels.style && a.options.dataLabels.style.width) && a.dataLabel.getBBox().width > + m && (a.dataLabel.css({ + width: .7 * m + }), a.dataLabel.shortened = !0)) : a.dataLabel = a.dataLabel.destroy()) + }), n(J, function (b, c) { + var k, m, t = b.length, + p = [], + u; + if (t) + for (d.sortByAngle(b, c - .5), 0 < d.maxLabelDistance && (k = Math.max(0, G - C - d.maxLabelDistance), m = Math.min(G + C + d.maxLabelDistance, f.plotHeight), n(b, function (a) { + 0 < a.labelDistance && a.dataLabel && (a.top = Math.max(0, G - C - a.labelDistance), a.bottom = Math.min(G + C + a.labelDistance, f.plotHeight), u = a.dataLabel.getBBox().height || 21, a.distributeBox = { + target: a.labelPos[1] - a.top + u / + 2, + size: u, + rank: a.y + }, p.push(a.distributeBox)) + }), k = m + u - k, a.distribute(p, k, k / 5)), R = 0; R < t; R++) e = b[R], K = e.labelPos, g = e.dataLabel, z = !1 === e.visible ? "hidden" : "inherit", N = k = K[1], p && F(e.distributeBox) && (void 0 === e.distributeBox.pos ? z = "hidden" : (Q = e.distributeBox.size, N = e.top + e.distributeBox.pos)), delete e.positionIndex, O = h.justify ? y[0] + (c ? -1 : 1) * (C + e.labelDistance) : d.getX(N < e.top + 2 || N > e.bottom - 2 ? k : N, c, e), g._attr = { + visibility: z, + align: K[6] + }, g._pos = { + x: O + h.x + ({ + left: l, + right: -l + } [K[6]] || 0), + y: N + h.y - 10 + }, K.x = O, K.y = N, x(h.crop, + !0) && (w = g.getBBox().width, k = null, O - w < l && 1 === c ? (k = Math.round(w - O + l), S[3] = Math.max(k, S[3])) : O + w > r - l && 0 === c && (k = Math.round(O + w - r + l), S[1] = Math.max(k, S[1])), 0 > N - Q / 2 ? S[0] = Math.max(Math.round(-N + Q / 2), S[0]) : N + Q / 2 > q && (S[2] = Math.max(Math.round(N + Q / 2 - q), S[2])), g.sideOverflow = k) + }), 0 === E(S) || this.verifyDataLabelOverflow(S)) && (this.placeDataLabels(), k && n(this.points, function (a) { + var b; + u = a.connector; + if ((g = a.dataLabel) && g._pos && a.visible && 0 < a.labelDistance) { + z = g._attr.visibility; + if (b = !u) a.connector = u = f.renderer.path().addClass("highcharts-data-label-connector highcharts-color-" + + a.colorIndex + (a.className ? " " + a.className : "")).add(d.dataLabelsGroup), u.attr({ + "stroke-width": k, + stroke: h.connectorColor || a.color || "#666666" + }); + u[b ? "attr" : "animate"]({ + d: d.connectorPath(a.labelPos) + }); + u.attr("visibility", z) + } else u && (a.connector = u.destroy()) + })) + }, k.pie.prototype.connectorPath = function (a) { + var b = a.x, + c = a.y; + return x(this.options.dataLabels.softConnector, !0) ? ["M", b + ("left" === a[6] ? 5 : -5), c, "C", b, c, 2 * a[2] - a[4], 2 * a[3] - a[5], a[2], a[3], "L", a[4], a[5]] : ["M", b + ("left" === a[6] ? 5 : -5), c, "L", a[2], a[3], "L", + a[4], a[5] + ] + }, k.pie.prototype.placeDataLabels = function () { + n(this.points, function (a) { + var b = a.dataLabel; + b && a.visible && ((a = b._pos) ? (b.sideOverflow && (b._attr.width = b.getBBox().width - b.sideOverflow, b.css({ + width: b._attr.width + "px", + textOverflow: this.options.dataLabels.style.textOverflow || "ellipsis" + }), b.shortened = !0), b.attr(b._attr), b[b.moved ? "animate" : "attr"](a), b.moved = !0) : b && b.attr({ + y: -9999 + })) + }, this) + }, k.pie.prototype.alignDataLabel = q, k.pie.prototype.verifyDataLabelOverflow = function (a) { + var b = this.center, + c = + this.options, + d = c.center, + e = c.minSize || 80, + h, l = null !== c.size; + l || (null !== d[0] ? h = Math.max(b[2] - Math.max(a[1], a[3]), e) : (h = Math.max(b[2] - a[1] - a[3], e), b[0] += (a[3] - a[1]) / 2), null !== d[1] ? h = Math.max(Math.min(h, b[2] - Math.max(a[0], a[2])), e) : (h = Math.max(Math.min(h, b[2] - a[0] - a[2]), e), b[1] += (a[0] - a[2]) / 2), h < b[2] ? (b[2] = h, b[3] = Math.min(f(c.innerSize || 0, h), h), this.translate(b), this.drawDataLabels && this.drawDataLabels()) : l = !0); + return l + }); + k.column && (k.column.prototype.alignDataLabel = function (a, b, e, f, h) { + var d = this.chart.inverted, + l = a.series, + k = a.dlBox || a.shapeArgs, + n = x(a.below, a.plotY > x(this.translatedThreshold, l.yAxis.len)), + m = x(e.inside, !!this.options.stacking); + k && (f = y(k), 0 > f.y && (f.height += f.y, f.y = 0), k = f.y + f.height - l.yAxis.len, 0 < k && (f.height -= k), d && (f = { + x: l.yAxis.len - f.y - f.height, + y: l.xAxis.len - f.x - f.width, + width: f.height, + height: f.width + }), m || (d ? (f.x += n ? 0 : f.width, f.width = 0) : (f.y += n ? f.height : 0, f.height = 0))); + e.align = x(e.align, !d || m ? "center" : n ? "right" : "left"); + e.verticalAlign = x(e.verticalAlign, d || m ? "middle" : n ? "top" : "bottom"); + c.prototype.alignDataLabel.call(this, + a, b, e, f, h); + a.isLabelJustified && a.contrastColor && a.dataLabel.css({ + color: a.contrastColor + }) + }) + })(K); + (function (a) { + var C = a.Chart, + E = a.each, + F = a.objectEach, + n = a.pick; + a = a.addEvent; + a(C, "render", function () { + var a = []; + E(this.labelCollectors || [], function (e) { + a = a.concat(e()) + }); + E(this.yAxis || [], function (e) { + e.options.stackLabels && !e.options.stackLabels.allowOverlap && F(e.stacks, function (e) { + F(e, function (e) { + a.push(e.label) + }) + }) + }); + E(this.series || [], function (e) { + var h = e.options.dataLabels, + y = e.dataLabelCollections || ["dataLabel"]; + (h.enabled || e._hasPointLabels) && !h.allowOverlap && e.visible && E(y, function (h) { + E(e.points, function (e) { + e[h] && (e[h].labelrank = n(e.labelrank, e.shapeArgs && e.shapeArgs.height), a.push(e[h])) + }) + }) + }); + this.hideOverlappingLabels(a) + }); + C.prototype.hideOverlappingLabels = function (a) { + var e = a.length, + h, n, q, x, f, c, k = function (a, c, d, b, e, f, h, k) { + return !(e > a + d || e + h < a || f > c + b || f + k < c) + }; + q = function (a) { + var c, d, b, e = 2 * (a.box ? 0 : a.padding || 0); + if (a && (!a.alignAttr || a.placed)) return c = a.alignAttr || { + x: a.attr("x"), + y: a.attr("y") + }, d = a.parentGroup, + a.width || (b = a.getBBox(), a.width = b.width, a.height = b.height), { + x: c.x + (d.translateX || 0), + y: c.y + (d.translateY || 0), + width: a.width - e, + height: a.height - e + } + }; + for (n = 0; n < e; n++) + if (h = a[n]) h.oldOpacity = h.opacity, h.newOpacity = 1, h.absoluteBox = q(h); + a.sort(function (a, c) { + return (c.labelrank || 0) - (a.labelrank || 0) + }); + for (n = 0; n < e; n++) + for (c = (q = a[n]) && q.absoluteBox, h = n + 1; h < e; ++h) + if (f = (x = a[h]) && x.absoluteBox, c && f && q !== x && 0 !== q.newOpacity && 0 !== x.newOpacity && (f = k(c.x, c.y, c.width, c.height, f.x, f.y, f.width, f.height)))(q.labelrank < x.labelrank ? + q : x).newOpacity = 0; + E(a, function (a) { + var c, d; + a && (d = a.newOpacity, a.oldOpacity !== d && (a.alignAttr && a.placed ? (d ? a.show(!0) : c = function () { + a.hide() + }, a.alignAttr.opacity = d, a[a.isOld ? "animate" : "attr"](a.alignAttr, null, c)) : a.attr({ + opacity: d + })), a.isOld = !0) + }) + } + })(K); + (function (a) { + var C = a.addEvent, + E = a.Chart, + F = a.createElement, + n = a.css, + h = a.defaultOptions, + e = a.defaultPlotOptions, + u = a.each, + y = a.extend, + q = a.fireEvent, + x = a.hasTouch, + f = a.inArray, + c = a.isObject, + k = a.Legend, + r = a.merge, + l = a.pick, + d = a.Point, + b = a.Series, + v = a.seriesTypes, + p = a.svg, + I; + I = a.TrackerMixin = { + drawTrackerPoint: function () { + var a = this, + b = a.chart.pointer, + c = function (a) { + var c = b.getPointFromEvent(a); + void 0 !== c && (b.isDirectTouch = !0, c.onMouseOver(a)) + }; + u(a.points, function (a) { + a.graphic && (a.graphic.element.point = a); + a.dataLabel && (a.dataLabel.div ? a.dataLabel.div.point = a : a.dataLabel.element.point = a) + }); + a._hasTracking || (u(a.trackerGroups, function (d) { + if (a[d]) { + a[d].addClass("highcharts-tracker").on("mouseover", c).on("mouseout", function (a) { + b.onTrackerMouseOut(a) + }); + if (x) a[d].on("touchstart", + c); + a.options.cursor && a[d].css(n).css({ + cursor: a.options.cursor + }) + } + }), a._hasTracking = !0); + q(this, "afterDrawTracker") + }, + drawTrackerGraph: function () { + var a = this, + b = a.options, + c = b.trackByArea, + d = [].concat(c ? a.areaPath : a.graphPath), + e = d.length, + f = a.chart, + h = f.pointer, + l = f.renderer, + k = f.options.tooltip.snap, + g = a.tracker, + n, r = function () { + if (f.hoverSeries !== a) a.onMouseOver() + }, + v = "rgba(192,192,192," + (p ? .0001 : .002) + ")"; + if (e && !c) + for (n = e + 1; n--;) "M" === d[n] && d.splice(n + 1, 0, d[n + 1] - k, d[n + 2], "L"), (n && "M" === d[n] || n === e) && d.splice(n, + 0, "L", d[n - 2] + k, d[n - 1]); + g ? g.attr({ + d: d + }) : a.graph && (a.tracker = l.path(d).attr({ + "stroke-linejoin": "round", + visibility: a.visible ? "visible" : "hidden", + stroke: v, + fill: c ? v : "none", + "stroke-width": a.graph.strokeWidth() + (c ? 0 : 2 * k), + zIndex: 2 + }).add(a.group), u([a.tracker, a.markerGroup], function (a) { + a.addClass("highcharts-tracker").on("mouseover", r).on("mouseout", function (a) { + h.onTrackerMouseOut(a) + }); + b.cursor && a.css({ + cursor: b.cursor + }); + if (x) a.on("touchstart", r) + })); + q(this, "afterDrawTracker") + } + }; + v.column && (v.column.prototype.drawTracker = + I.drawTrackerPoint); + v.pie && (v.pie.prototype.drawTracker = I.drawTrackerPoint); + v.scatter && (v.scatter.prototype.drawTracker = I.drawTrackerPoint); + y(k.prototype, { + setItemEvents: function (a, b, c) { + var e = this, + f = e.chart.renderer.boxWrapper, + h = "highcharts-legend-" + (a instanceof d ? "point" : "series") + "-active"; + (c ? b : a.legendGroup).on("mouseover", function () { + a.setState("hover"); + f.addClass(h); + b.css(e.options.itemHoverStyle) + }).on("mouseout", function () { + b.css(r(a.visible ? e.itemStyle : e.itemHiddenStyle)); + f.removeClass(h); + a.setState() + }).on("click", + function (b) { + var c = function () { + a.setVisible && a.setVisible() + }; + f.removeClass(h); + b = { + browserEvent: b + }; + a.firePointEvent ? a.firePointEvent("legendItemClick", b, c) : q(a, "legendItemClick", b, c) + }) + }, + createCheckboxForItem: function (a) { + a.checkbox = F("input", { + type: "checkbox", + checked: a.selected, + defaultChecked: a.selected + }, this.options.itemCheckboxStyle, this.chart.container); + C(a.checkbox, "click", function (b) { + q(a.series || a, "checkboxClick", { + checked: b.target.checked, + item: a + }, function () { + a.select() + }) + }) + } + }); + h.legend.itemStyle.cursor = + "pointer"; + y(E.prototype, { + showResetZoom: function () { + function a() { + b.zoomOut() + } + var b = this, + c = h.lang, + d = b.options.chart.resetZoomButton, + e = d.theme, + f = e.states, + k = "chart" === d.relativeTo ? null : "plotBox"; + q(this, "beforeShowResetZoom", null, function () { + b.resetZoomButton = b.renderer.button(c.resetZoom, null, null, a, e, f && f.hover).attr({ + align: d.position.align, + title: c.resetZoomTitle + }).addClass("highcharts-reset-zoom").add().align(d.position, !1, k) + }) + }, + zoomOut: function () { + q(this, "selection", { + resetSelection: !0 + }, this.zoom) + }, + zoom: function (a) { + var b, + d = this.pointer, + e = !1, + f; + !a || a.resetSelection ? (u(this.axes, function (a) { + b = a.zoom() + }), d.initiated = !1) : u(a.xAxis.concat(a.yAxis), function (a) { + var c = a.axis; + d[c.isXAxis ? "zoomX" : "zoomY"] && (b = c.zoom(a.min, a.max), c.displayBtn && (e = !0)) + }); + f = this.resetZoomButton; + e && !f ? this.showResetZoom() : !e && c(f) && (this.resetZoomButton = f.destroy()); + b && this.redraw(l(this.options.chart.animation, a && a.animation, 100 > this.pointCount)) + }, + pan: function (a, b) { + var c = this, + d = c.hoverPoints, + e; + d && u(d, function (a) { + a.setState() + }); + u("xy" === b ? [1, 0] : [1], function (b) { + b = c[b ? "xAxis" : "yAxis"][0]; + var d = b.horiz, + f = a[d ? "chartX" : "chartY"], + d = d ? "mouseDownX" : "mouseDownY", + h = c[d], + g = (b.pointRange || 0) / 2, + k = b.reversed && !c.inverted || !b.reversed && c.inverted ? -1 : 1, + l = b.getExtremes(), + m = b.toValue(h - f, !0) + g * k, + k = b.toValue(h + b.len - f, !0) - g * k, + n = k < m, + h = n ? k : m, + m = n ? m : k, + k = Math.min(l.dataMin, g ? l.min : b.toValue(b.toPixels(l.min) - b.minPixelPadding)), + g = Math.max(l.dataMax, g ? l.max : b.toValue(b.toPixels(l.max) + b.minPixelPadding)), + n = k - h; + 0 < n && (m += n, h = k); + n = m - g; + 0 < n && (m = g, h -= n); + b.series.length && + h !== l.min && m !== l.max && (b.setExtremes(h, m, !1, !1, { + trigger: "pan" + }), e = !0); + c[d] = f + }); + e && c.redraw(!1); + n(c.container, { + cursor: "move" + }) + } + }); + y(d.prototype, { + select: function (a, b) { + var c = this, + d = c.series, + e = d.chart; + a = l(a, !c.selected); + c.firePointEvent(a ? "select" : "unselect", { + accumulate: b + }, function () { + c.selected = c.options.selected = a; + d.options.data[f(c, d.data)] = c.options; + c.setState(a && "select"); + b || u(e.getSelectedPoints(), function (a) { + a.selected && a !== c && (a.selected = a.options.selected = !1, d.options.data[f(a, d.data)] = a.options, + a.setState(""), a.firePointEvent("unselect")) + }) + }) + }, + onMouseOver: function (a) { + var b = this.series.chart, + c = b.pointer; + a = a ? c.normalize(a) : c.getChartCoordinatesFromPoint(this, b.inverted); + c.runPointActions(a, this) + }, + onMouseOut: function () { + var a = this.series.chart; + this.firePointEvent("mouseOut"); + u(a.hoverPoints || [], function (a) { + a.setState() + }); + a.hoverPoints = a.hoverPoint = null + }, + importEvents: function () { + if (!this.hasImportedEvents) { + var b = this, + c = r(b.series.options.point, b.options).events; + b.events = c; + a.objectEach(c, function (a, + c) { + C(b, c, a) + }); + this.hasImportedEvents = !0 + } + }, + setState: function (a, b) { + var c = Math.floor(this.plotX), + d = this.plotY, + f = this.series, + h = f.options.states[a || "normal"] || {}, + k = e[f.type].marker && f.options.marker, + n = k && !1 === k.enabled, + p = k && k.states && k.states[a || "normal"] || {}, + g = !1 === p.enabled, + t = f.stateMarkerGraphic, + r = this.marker || {}, + u = f.chart, + v = f.halo, + x, C = k && f.markerAttribs; + a = a || ""; + if (!(a === this.state && !b || this.selected && "select" !== a || !1 === h.enabled || a && (g || n && !1 === p.enabled) || a && r.states && r.states[a] && !1 === r.states[a].enabled)) { + C && + (x = f.markerAttribs(this, a)); + if (this.graphic) this.state && this.graphic.removeClass("highcharts-point-" + this.state), a && this.graphic.addClass("highcharts-point-" + a), this.graphic.animate(f.pointAttribs(this, a), l(u.options.chart.animation, h.animation)), x && this.graphic.animate(x, l(u.options.chart.animation, p.animation, k.animation)), t && t.hide(); + else { + if (a && p) { + k = r.symbol || f.symbol; + t && t.currentSymbol !== k && (t = t.destroy()); + if (t) t[b ? "animate" : "attr"]({ + x: x.x, + y: x.y + }); + else k && (f.stateMarkerGraphic = t = u.renderer.symbol(k, + x.x, x.y, x.width, x.height).add(f.markerGroup), t.currentSymbol = k); + t && t.attr(f.pointAttribs(this, a)) + } + t && (t[a && u.isInsidePlot(c, d, u.inverted) ? "show" : "hide"](), t.element.point = this) + }(c = h.halo) && c.size ? (v || (f.halo = v = u.renderer.path().add((this.graphic || t).parentGroup)), v.show()[b ? "animate" : "attr"]({ + d: this.haloPath(c.size) + }), v.attr({ + "class": "highcharts-halo highcharts-color-" + l(this.colorIndex, f.colorIndex) + (this.className ? " " + this.className : ""), + zIndex: -1 + }), v.point = this, v.attr(y({ + fill: this.color || f.color, + "fill-opacity": c.opacity + }, c.attributes))) : v && v.point && v.point.haloPath && v.animate({ + d: v.point.haloPath(0) + }, null, v.hide); + this.state = a; + q(this, "afterSetState") + } + }, + haloPath: function (a) { + return this.series.chart.renderer.symbols.circle(Math.floor(this.plotX) - a, this.plotY - a, 2 * a, 2 * a) + } + }); + y(b.prototype, { + onMouseOver: function () { + var a = this.chart, + b = a.hoverSeries; + if (b && b !== this) b.onMouseOut(); + this.options.events.mouseOver && q(this, "mouseOver"); + this.setState("hover"); + a.hoverSeries = this + }, + onMouseOut: function () { + var a = + this.options, + b = this.chart, + c = b.tooltip, + d = b.hoverPoint; + b.hoverSeries = null; + if (d) d.onMouseOut(); + this && a.events.mouseOut && q(this, "mouseOut"); + !c || this.stickyTracking || c.shared && !this.noSharedTooltip || c.hide(); + this.setState() + }, + setState: function (a) { + var b = this, + c = b.options, + d = b.graph, + e = c.states, + f = c.lineWidth, + c = 0; + a = a || ""; + if (b.state !== a && (u([b.group, b.markerGroup, b.dataLabelsGroup], function (c) { + c && (b.state && c.removeClass("highcharts-series-" + b.state), a && c.addClass("highcharts-series-" + a)) + }), b.state = a, !e[a] || !1 !== + e[a].enabled) && (a && (f = e[a].lineWidth || f + (e[a].lineWidthPlus || 0)), d && !d.dashstyle)) + for (f = { + "stroke-width": f + }, d.animate(f, l(e[a || "normal"] && e[a || "normal"].animation, b.chart.options.chart.animation)); b["zone-graph-" + c];) b["zone-graph-" + c].attr(f), c += 1 + }, + setVisible: function (a, b) { + var c = this, + d = c.chart, + e = c.legendItem, + f, h = d.options.chart.ignoreHiddenSeries, + k = c.visible; + f = (c.visible = a = c.options.visible = c.userOptions.visible = void 0 === a ? !k : a) ? "show" : "hide"; + u(["group", "dataLabelsGroup", "markerGroup", "tracker", "tt"], + function (a) { + if (c[a]) c[a][f]() + }); + if (d.hoverSeries === c || (d.hoverPoint && d.hoverPoint.series) === c) c.onMouseOut(); + e && d.legend.colorizeItem(c, a); + c.isDirty = !0; + c.options.stacking && u(d.series, function (a) { + a.options.stacking && a.visible && (a.isDirty = !0) + }); + u(c.linkedSeries, function (b) { + b.setVisible(a, !1) + }); + h && (d.isDirtyBox = !0); + q(c, f); + !1 !== b && d.redraw() + }, + show: function () { + this.setVisible(!0) + }, + hide: function () { + this.setVisible(!1) + }, + select: function (a) { + this.selected = a = void 0 === a ? !this.selected : a; + this.checkbox && (this.checkbox.checked = + a); + q(this, a ? "select" : "unselect") + }, + drawTracker: I.drawTrackerGraph + }) + })(K); + (function (a) { + var C = a.Chart, + E = a.each, + F = a.inArray, + n = a.isArray, + h = a.isObject, + e = a.pick, + u = a.splat; + C.prototype.setResponsive = function (e) { + var h = this.options.responsive, + n = [], + f = this.currentResponsive; + h && h.rules && E(h.rules, function (c) { + void 0 === c._id && (c._id = a.uniqueKey()); + this.matchResponsiveRule(c, n, e) + }, this); + var c = a.merge.apply(0, a.map(n, function (c) { + return a.find(h.rules, function (a) { + return a._id === c + }).chartOptions + })), + n = n.toString() || void 0; + n !== (f && f.ruleIds) && (f && this.update(f.undoOptions, e), n ? (this.currentResponsive = { + ruleIds: n, + mergedOptions: c, + undoOptions: this.currentOptions(c) + }, this.update(c, e)) : this.currentResponsive = void 0) + }; + C.prototype.matchResponsiveRule = function (a, h) { + var n = a.condition; + (n.callback || function () { + return this.chartWidth <= e(n.maxWidth, Number.MAX_VALUE) && this.chartHeight <= e(n.maxHeight, Number.MAX_VALUE) && this.chartWidth >= e(n.minWidth, 0) && this.chartHeight >= e(n.minHeight, 0) + }).call(this) && h.push(a._id) + }; + C.prototype.currentOptions = + function (e) { + function q(e, c, k, r) { + var f; + a.objectEach(e, function (a, b) { + if (!r && -1 < F(b, ["series", "xAxis", "yAxis"])) + for (a = u(a), k[b] = [], f = 0; f < a.length; f++) c[b][f] && (k[b][f] = {}, q(a[f], c[b][f], k[b][f], r + 1)); + else h(a) ? (k[b] = n(a) ? [] : {}, q(a, c[b] || {}, k[b], r + 1)) : k[b] = c[b] || null + }) + } + var x = {}; + q(e, this.options, x, 0); + return x + } + })(K); + return K +}); \ No newline at end of file diff --git a/js/ics.min.js b/js/ics.min.js new file mode 100644 index 00000000..24dcaec1 --- /dev/null +++ b/js/ics.min.js @@ -0,0 +1,231 @@ +/*! ics.js Wed Aug 20 2014 17:23:02 */ +var saveAs = saveAs || function (e) { + "use strict"; + if (typeof e === "undefined" || typeof navigator !== "undefined" && /MSIE [1-9]\./.test(navigator.userAgent)) { + return + } + var t = e.document, + n = function () { + return e.URL || e.webkitURL || e + }, + r = t.createElementNS("http://www.w3.org/1999/xhtml", "a"), + o = "download" in r, + a = function (e) { + var t = new MouseEvent("click"); + e.dispatchEvent(t) + }, + i = /constructor/i.test(e.HTMLElement) || e.safari, + f = /CriOS\/[\d]+/.test(navigator.userAgent), + u = function (t) { + (e.setImmediate || e.setTimeout)(function () { + throw t + }, 0) + }, + s = "application/octet-stream", + d = 1e3 * 40, + c = function (e) { + var t = function () { + if (typeof e === "string") { + n().revokeObjectURL(e) + } else { + e.remove() + } + }; + setTimeout(t, d) + }, + l = function (e, t, n) { + t = [].concat(t); + var r = t.length; + while (r--) { + var o = e["on" + t[r]]; + if (typeof o === "function") { + try { + o.call(e, n || e) + } catch (a) { + u(a) + } + } + } + }, + p = function (e) { + if (/^\s*(?:text\/\S*|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(e.type)) { + return new Blob([String.fromCharCode(65279), e], { + type: e.type + }) + } + return e + }, + v = function (t, u, d) { + if (!d) { + t = p(t) + } + var v = this, + w = t.type, + m = w === s, + y, h = function () { + l(v, "writestart progress write writeend".split(" ")) + }, + S = function () { + if ((f || m && i) && e.FileReader) { + var r = new FileReader; + r.onloadend = function () { + var t = f ? r.result : r.result.replace(/^data:[^;]*;/, "data:attachment/file;"); + var n = e.open(t, "_blank"); + if (!n) e.location.href = t; + t = undefined; + v.readyState = v.DONE; + h() + }; + r.readAsDataURL(t); + v.readyState = v.INIT; + return + } + if (!y) { + y = n().createObjectURL(t) + } + if (m) { + e.location.href = y + } else { + var o = e.open(y, "_blank"); + if (!o) { + e.location.href = y + } + } + v.readyState = v.DONE; + h(); + c(y) + }; + v.readyState = v.INIT; + if (o) { + y = n().createObjectURL(t); + setTimeout(function () { + r.href = y; + r.download = u; + a(r); + h(); + c(y); + v.readyState = v.DONE + }); + return + } + S() + }, + w = v.prototype, + m = function (e, t, n) { + return new v(e, t || e.name || "download", n) + }; + if (typeof navigator !== "undefined" && navigator.msSaveOrOpenBlob) { + return function (e, t, n) { + t = t || e.name || "download"; + if (!n) { + e = p(e) + } + return navigator.msSaveOrOpenBlob(e, t) + } + } + w.abort = function () {}; + w.readyState = w.INIT = 0; + w.WRITING = 1; + w.DONE = 2; + w.error = w.onwritestart = w.onprogress = w.onwrite = w.onabort = w.onerror = w.onwriteend = null; + return m +}(typeof self !== "undefined" && self || typeof window !== "undefined" && window || this.content); +if (typeof module !== "undefined" && module.exports) { + module.exports.saveAs = saveAs +} else if (typeof define !== "undefined" && define !== null && define.amd !== null) { + define("FileSaver.js", function () { + return saveAs + }) +} + +var ics = function (e, t) { + "use strict"; { + if (!(navigator.userAgent.indexOf("MSIE") > -1 && -1 == navigator.userAgent.indexOf("MSIE 10"))) { + void 0 === e && (e = "default"), void 0 === t && (t = "Calendar"); + var r = -1 !== navigator.appVersion.indexOf("Win") ? "\r\n" : "\n", + n = [], + i = ["BEGIN:VCALENDAR", "PRODID:" + t, "VERSION:2.0"].join(r), + o = r + "END:VCALENDAR", + a = ["SU", "MO", "TU", "WE", "TH", "FR", "SA"]; + return { + events: function () { + return n + }, + calendar: function () { + return i + r + n.join(r) + o + }, + addEvent: function (t, i, o, l, u, s) { + if (void 0 === t || void 0 === i || void 0 === o || void 0 === l || void 0 === u) return !1; + if (s && !s.rrule) { + if ("YEARLY" !== s.freq && "MONTHLY" !== s.freq && "WEEKLY" !== s.freq && "DAILY" !== s.freq) throw "Recurrence rrule frequency must be provided and be one of the following: 'YEARLY', 'MONTHLY', 'WEEKLY', or 'DAILY'"; + if (s.until && isNaN(Date.parse(s.until))) throw "Recurrence rrule 'until' must be a valid date string"; + if (s.interval && isNaN(parseInt(s.interval))) throw "Recurrence rrule 'interval' must be an integer"; + if (s.count && isNaN(parseInt(s.count))) throw "Recurrence rrule 'count' must be an integer"; + if (void 0 !== s.byday) { + if ("[object Array]" !== Object.prototype.toString.call(s.byday)) throw "Recurrence rrule 'byday' must be an array"; + if (s.byday.length > 7) throw "Recurrence rrule 'byday' array must not be longer than the 7 days in a week"; + s.byday = s.byday.filter(function (e, t) { + return s.byday.indexOf(e) == t + }); + for (var c in s.byday) + if (a.indexOf(s.byday[c]) < 0) throw "Recurrence rrule 'byday' values must include only the following: 'SU', 'MO', 'TU', 'WE', 'TH', 'FR', 'SA'" + } + } + var g = new Date(l), + d = new Date(u), + f = new Date, + S = ("0000" + g.getFullYear().toString()).slice(-4), + E = ("00" + (g.getMonth() + 1).toString()).slice(-2), + v = ("00" + g.getDate().toString()).slice(-2), + y = ("00" + g.getHours().toString()).slice(-2), + A = ("00" + g.getMinutes().toString()).slice(-2), + T = ("00" + g.getSeconds().toString()).slice(-2), + b = ("0000" + d.getFullYear().toString()).slice(-4), + D = ("00" + (d.getMonth() + 1).toString()).slice(-2), + N = ("00" + d.getDate().toString()).slice(-2), + h = ("00" + d.getHours().toString()).slice(-2), + I = ("00" + d.getMinutes().toString()).slice(-2), + R = ("00" + d.getMinutes().toString()).slice(-2), + M = ("0000" + f.getFullYear().toString()).slice(-4), + w = ("00" + (f.getMonth() + 1).toString()).slice(-2), + L = ("00" + f.getDate().toString()).slice(-2), + O = ("00" + f.getHours().toString()).slice(-2), + p = ("00" + f.getMinutes().toString()).slice(-2), + Y = ("00" + f.getMinutes().toString()).slice(-2), + U = "", + V = ""; + y + A + T + h + I + R != 0 && (U = "T" + y + A + T, V = "T" + h + I + R); + var B, C = S + E + v + U, + j = b + D + N + V, + m = M + w + L + ("T" + O + p + Y); + if (s) + if (s.rrule) B = s.rrule; + else { + if (B = "rrule:FREQ=" + s.freq, s.until) { + var x = new Date(Date.parse(s.until)).toISOString(); + B += ";UNTIL=" + x.substring(0, x.length - 13).replace(/[-]/g, "") + "000000Z" + } + s.interval && (B += ";INTERVAL=" + s.interval), s.count && (B += ";COUNT=" + s.count), s.byday && s.byday.length > 0 && (B += ";BYDAY=" + s.byday.join(",")) + }(new Date).toISOString(); + var H = ["BEGIN:VEVENT", "UID:" + n.length + "@" + e, "CLASS:PUBLIC", "DESCRIPTION:" + i, "DTSTAMP;VALUE=DATE-TIME:" + m, "DTSTART;VALUE=DATE-TIME:" + C, "DTEND;VALUE=DATE-TIME:" + j, "LOCATION:" + o, "SUMMARY;LANGUAGE=en-us:" + t, "TRANSP:TRANSPARENT", "END:VEVENT"]; + return B && H.splice(4, 0, B), H = H.join(r), n.push(H), H + }, + download: function (e, t) { + if (n.length < 1) return !1; + t = void 0 !== t ? t : ".ics", e = void 0 !== e ? e : "calendar"; + var a, l = i + r + n.join(r) + o; + if (-1 === navigator.userAgent.indexOf("MSIE 10")) a = new Blob([l]); + else { + var u = new BlobBuilder; + u.append(l), a = u.getBlob("text/x-vCalendar;charset=" + document.characterSet) + } + return saveAs(a, e + t), l + }, + build: function () { + return !(n.length < 1) && i + r + n.join(r) + o + } + } + } + console.log("Unsupported Browser") + } +}; \ No newline at end of file