{"version":3,"sources":["webpack:///js/inspinia.191a634ab75a474d0a25.js","webpack:///./src/assets/inspinia/plugins/c3/c3-angular.min.js?07b4","webpack:///./src/assets/inspinia/plugins/c3/c3-angular.min.js","webpack:///./src/assets/inspinia/plugins/d3/d3.min.js?db09","webpack:///./src/assets/inspinia/plugins/d3/d3.min.js","webpack:///./src/assets/inspinia/plugins/c3/c3.js?53fc","webpack:///./src/assets/inspinia/plugins/c3/c3.js","webpack:///./src/assets/inspinia/plugins/morris/raphael.js?0ec8","webpack:///./src/assets/inspinia/plugins/morris/raphael.js","webpack:///./src/assets/inspinia/plugins/morris/morris.js?7e90","webpack:///./src/assets/inspinia/plugins/morris/morris.js","webpack:///./src/assets/inspinia/plugins/ladda/spin.min.js?1bfb","webpack:///./src/assets/inspinia/plugins/ladda/spin.min.js","webpack:///./src/assets/inspinia/plugins/ladda/ladda.min.js?589f","webpack:///./src/assets/inspinia/plugins/ladda/ladda.min.js","webpack:///./src/assets/inspinia/plugins/ladda/angular-ladda.min.js?98dd","webpack:///./src/assets/inspinia/plugins/ladda/angular-ladda.min.js","webpack:///./src/assets/inspinia/inspinia.js?36c4","webpack:///./src/assets/inspinia/inspinia.js","webpack:///./src/assets/inspinia/plugins/metisMenu/jquery.metisMenu.js?2bb2","webpack:///./src/assets/inspinia/plugins/metisMenu/jquery.metisMenu.js?14b5","webpack:///./src/assets/inspinia/plugins/staps/jquery.steps.min.js?15b9","webpack:///./src/assets/inspinia/plugins/staps/jquery.steps.min.js","webpack:///./src/assets/inspinia/plugins/slimscroll/jquery.slimscroll.min.js?c357","webpack:///./src/assets/inspinia/plugins/slimscroll/jquery.slimscroll.min.js","webpack:///./src/assets/inspinia/plugins/pace/pace.min.js?13e8","webpack:///./src/assets/inspinia/plugins/pace/pace.min.js","webpack:///./src/assets/inspinia/plugins/angular-bootstrap-checkbox.js?48f2","webpack:///./src/assets/inspinia/plugins/angular-bootstrap-checkbox.js","webpack:///./src/assets/inspinia/plugins/flot/jquery.flot.js?32a2","webpack:///./src/assets/inspinia/plugins/flot/jquery.flot.js","webpack:///./src/assets/inspinia/plugins/flot/jquery.flot.time.js?68bc","webpack:///./src/assets/inspinia/plugins/flot/jquery.flot.time.js","webpack:///./src/assets/inspinia/plugins/flot/jquery.flot.tooltip.min.js?ee63","webpack:///./src/assets/inspinia/plugins/flot/jquery.flot.tooltip.min.js","webpack:///./src/assets/inspinia/plugins/flot/jquery.flot.spline.js?5f96","webpack:///./src/assets/inspinia/plugins/flot/jquery.flot.spline.js","webpack:///./src/assets/inspinia/plugins/flot/jquery.flot.resize.js?2712","webpack:///./src/assets/inspinia/plugins/flot/jquery.flot.resize.js","webpack:///./src/assets/inspinia/plugins/flot/jquery.flot.pie.js?0539","webpack:///./src/assets/inspinia/plugins/flot/jquery.flot.pie.js","webpack:///./src/assets/inspinia/plugins/flot/curvedLines.js?06b5","webpack:///./src/assets/inspinia/plugins/flot/curvedLines.js","webpack:///./src/assets/inspinia/plugins/flot/angular-flot.js?db51","webpack:///./src/assets/inspinia/plugins/flot/angular-flot.js","webpack:///./src/assets/inspinia/plugins/jvectormap/jquery-jvectormap-2.0.2.min.js?3865","webpack:///./src/assets/inspinia/plugins/jvectormap/jquery-jvectormap-2.0.2.min.js","webpack:///./src/assets/inspinia/plugins/jvectormap/jquery-jvectormap-world-mill-en.js?5d62","webpack:///./src/assets/inspinia/plugins/jvectormap/jquery-jvectormap-world-mill-en.js"],"names":["webpackJsonp","2176","module","exports","__webpack_require__","2177","2178","2179","2180","2181","2182","2183","2184","2185","2186","2187","2188","2189","2190","2191","2192","2193","2194","2195","2196","2197","2198","2199","2200","2201","2202","2203","2204","2205","2206","2207","2208","2209","2210","2211","2212","2213","2214","2215","2216","2217","2218","2219","2220","2221","2222","2223","2224"],"mappings":"AAAAA,cAAc,IAERC,KACA,SAAUC,EAAQC,QAASC,GAEjCA,EAAoB,MACpBA,EAAoB,MACpBA,EAAoB,MACpBA,EAAoB,MACpBA,EAAoB,MACpBA,EAAoB,MACpBA,EAAoB,MACpBA,EAAoB,MACpBA,EAAoB,MACpBA,EAAoB,MACpBA,EAAoB,MACpBA,EAAoB,MACpBA,EAAoB,MACpBA,EAAoB,MACpBA,EAAoB,MACpBA,EAAoB,MACpBA,EAAoB,MACpBA,EAAoB,MACpBA,EAAoB,MACpBA,EAAoB,MACpBA,EAAoB,MACpBA,EAAoB,MACpBA,EAAoB,MACpBF,EAAOC,QAAUC,EAAoB,OAK/BC,KACA,SAAUH,EAAQC,QAASC,GClCjCA,EAAA,GAAAA,EAAA,QDwCME,KACA,SAAUJ,EAAQC,SEzCxBD,EAAAC,QAAA,0nkBF+CMI,KACA,SAAUL,EAAQC,QAASC,GGhDjCA,EAAA,GAAAA,EAAA,QHsDMI,KACA,SAAUN,EAAQC,SIvDxBD,EAAAC,QAAA,osoJJ6DMM,KACA,SAAUP,EAAQC,QAASC,GK9DjCA,EAAA,GAAAA,EAAA,QLoEMM,KACA,SAAUR,EAAQC,SMrExBD,EAAAC,QAAA,qp+VN2EMQ,KACA,SAAUT,EAAQC,QAASC,GO5EjCA,EAAA,GAAAA,EAAA,QPkFMQ,KACA,SAAUV,EAAQC,SQnFxBD,EAAAC,QAAA,02/TRyFMU,KACA,SAAUX,EAAQC,QAASC,GS1FjCA,EAAA,GAAAA,EAAA,QTgGMU,KACA,SAAUZ,EAAQC,SUjGxBD,EAAAC,QAAA,krlEVuGMY,KACA,SAAUb,EAAQC,QAASC,GWxGjCA,EAAA,GAAAA,EAAA,QX8GMY,KACA,SAAUd,EAAQC,SY/GxBD,EAAAC,QAAA,iiIZqHMc,KACA,SAAUf,EAAQC,QAASC,GatHjCA,EAAA,GAAAA,EAAA,Qb4HMc,KACA,SAAUhB,EAAQC,Sc7HxBD,EAAAC,QAAA,k2GdmIMgB,KACA,SAAUjB,EAAQC,QAASC,GepIjCA,EAAA,GAAAA,EAAA,Qf0IMgB,KACA,SAAUlB,EAAQC,SgB3IxBD,EAAAC,QAAA,2hChBiJMkB,KACA,SAAUnB,EAAQC,QAASC,GiBlJjCA,EAAA,GAAAA,EAAA,QjBwJMkB,KACA,SAAUpB,EAAQC,SkBzJxBD,EAAAC,QAAA,8qGlB+JMoB,KACA,SAAUrB,EAAQC,QAASC,GmBhKjCA,EAAA,GAAAA,EAAA,QnBsKMoB,KACA,SAAUtB,EAAQC,SoBvKxBD,EAAAC,QAAA,2tGpB6KMsB,KACA,SAAUvB,EAAQC,QAASC,GqB9KjCA,EAAA,GAAAA,EAAA,QrBoLMsB,KACA,SAAUxB,EAAQC,SsBrLxBD,EAAAC,QAAA,83atB2LMwB,KACA,SAAUzB,EAAQC,QAASC,GuB5LjCA,EAAA,GAAAA,EAAA,QvBkMMwB,KACA,SAAU1B,EAAQC,SwBnMxBD,EAAAC,QAAA,6lJxByMM0B,KACA,SAAU3B,EAAQC,QAASC,GyB1MjCA,EAAA,GAAAA,EAAA,QzBgNM0B,KACA,SAAU5B,EAAQC,S0BjNxBD,EAAAC,QAAA,qlY1BuNM4B,KACA,SAAU7B,EAAQC,QAASC,G2BxNjCA,EAAA,GAAAA,EAAA,Q3B8NM4B,KACA,SAAU9B,EAAQC,S4B/NxBD,EAAAC,QAAA,urH5BqOM8B,KACA,SAAU/B,EAAQC,QAASC,G6BtOjCA,EAAA,GAAAA,EAAA,Q7B4OM8B,KACA,SAAUhC,EAAQC,S8B7OxBD,EAAAC,QAAA,284H9BmPMgC,KACA,SAAUjC,EAAQC,QAASC,G+BpPjCA,EAAA,GAAAA,EAAA,Q/B0PMgC,KACA,SAAUlC,EAAQC,SgC3PxBD,EAAAC,QAAA,2ibhCiQMkC,KACA,SAAUnC,EAAQC,QAASC,GiClQjCA,EAAA,GAAAA,EAAA,QjCwQMkC,KACA,SAAUpC,EAAQC,SkCzQxBD,EAAAC,QAAA,q4HlC+QMoC,KACA,SAAUrC,EAAQC,QAASC,GmChRjCA,EAAA,GAAAA,EAAA,QnCsRMoC,KACA,SAAUtC,EAAQC,SoCvRxBD,EAAAC,QAAA,82NpC6RMsC,KACA,SAAUvC,EAAQC,QAASC,GqC9RjCA,EAAA,GAAAA,EAAA,QrCoSMsC,KACA,SAAUxC,EAAQC,SsCrSxBD,EAAAC,QAAA,uzGtC2SMwC,KACA,SAAUzC,EAAQC,QAASC,GuC5SjCA,EAAA,GAAAA,EAAA,QvCkTMwC,KACA,SAAU1C,EAAQC,SwCnTxBD,EAAAC,QAAA,uq1BxCyTM0C,KACA,SAAU3C,EAAQC,QAASC,GyC1TjCA,EAAA,GAAAA,EAAA,QzCgUM0C,KACA,SAAU5C,EAAQC,S0CjUxBD,EAAAC,QAAA,kha1CuUM4C,KACA,SAAU7C,EAAQC,QAASC,G2CxUjCA,EAAA,GAAAA,EAAA,Q3C8UM4C,KACA,SAAU9C,EAAQC,S4C/UxBD,EAAAC,QAAA,8kE5CqVM8C,KACA,SAAU/C,EAAQC,QAASC,G6CtVjCA,EAAA,GAAAA,EAAA,Q7C4VM8C,KACA,SAAUhD,EAAQC,S8C7VxBD,EAAAC,QAAA,6tzG9CmWMgD,KACA,SAAUjD,EAAQC,QAASC,G+CpWjCA,EAAA,GAAAA,EAAA,Q/C0WMgD,KACA,SAAUlD,EAAQC,SgD3WxBD,EAAAC,QAAA,m85IhDiXG","file":"js/inspinia.191a634ab75a474d0a25.js","sourcesContent":["webpackJsonp([1],{\n\n/***/ 2176:\n/***/ (function(module, exports, __webpack_require__) {\n\n__webpack_require__(2177);\n__webpack_require__(2179);\n__webpack_require__(2181);\n__webpack_require__(2183);\n__webpack_require__(2185);\n__webpack_require__(2187);\n__webpack_require__(2189);\n__webpack_require__(2191);\n__webpack_require__(2193);\n__webpack_require__(2195);\n__webpack_require__(2197);\n__webpack_require__(2199);\n__webpack_require__(2201);\n__webpack_require__(2203);\n__webpack_require__(2205);\n__webpack_require__(2207);\n__webpack_require__(2209);\n__webpack_require__(2211);\n__webpack_require__(2213);\n__webpack_require__(2215);\n__webpack_require__(2217);\n__webpack_require__(2219);\n__webpack_require__(2221);\nmodule.exports = __webpack_require__(2223);\n\n\n/***/ }),\n\n/***/ 2177:\n/***/ (function(module, exports, __webpack_require__) {\n\n__webpack_require__(3)(__webpack_require__(2178))\n\n/***/ }),\n\n/***/ 2178:\n/***/ (function(module, exports) {\n\nmodule.exports = \"/*! c3-angular - v0.7.1 - 2015-09-08\\n* https://github.com/jettro/c3-angular-sample\\n* Copyright (c) 2015 ; Licensed */\\n\\nfunction ChartAxes(){var a=function(a,b,c,d){var e=c.valuesX;e&&d.addXAxisValues(e);var f=c.valuesXs,g={};if(f){xsItems=f.split(\\\",\\\");for(var h in xsItems)xsItem=xsItems[h].split(\\\":\\\"),g[xsItem[0]]=xsItem[1];d.addXSValues(g)}var i=c.y,j=c.y2,k={};if(j){var l=j.split(\\\",\\\");for(var m in l)k[l[m]]=\\\"y2\\\";if(i){var n=i.split(\\\",\\\");for(var o in n)k[n[o]]=\\\"y\\\"}d.addYAxis(k)}};return{require:\\\"^c3chart\\\",restrict:\\\"E\\\",scope:{},replace:!0,link:a}}function ChartAxis(){var a=function(a,b,c,d){var e=c.axisRotate;e&&d.rotateAxis()};return{require:\\\"^c3chart\\\",restrict:\\\"E\\\",scope:{},transclude:!0,template:\\\"
\\\",replace:!0,link:a}}function ChartAxisX(){var a=function(a,b,c,d){var e=c.axisPosition,f=c.axisLabel,g={label:{text:f,position:e}},h=c.paddingLeft,i=c.paddingRight;(h||i)&&(h=h?h:0,i=i?i:0,g.padding={left:parseInt(h),right:parseInt(i)});var j=c.axisHeight;j&&(g.height=parseInt(j)),\\\"false\\\"===c.show&&(g.show=!1),\\\"true\\\"===c.axisLocaltime&&(g.localtime=!0);var k=c.axisMax;k&&(g.max=k);var l=c.axisMin;l&&(g.min=l);var m=c.axisType;m&&(g.type=m),d.addAxisProperties(\\\"x\\\",g)};return{require:\\\"^c3chart\\\",restrict:\\\"E\\\",scope:{},transclude:!0,template:\\\"
\\\",replace:!0,link:a}}function ChartAxisXTick(){var a=function(a,b,c,d){var e={},f=c.tickCount;f&&(e.count=f);var g=c.tickCulling;g&&(g=angular.lowercase(g),\\\"true\\\"===g?e.culling=!0:\\\"false\\\"===g&&(e.culling=!1));var h=c.tickCullingMax;h&&(e.culling={max:parseInt(h)});var i=c.tickMultiline;i&&(i=angular.lowercase(i),\\\"true\\\"===i?e.multiline=!0:\\\"false\\\"===i&&(e.multiline=!1));var j=c.tickCentered;j&&(j=angular.lowercase(j),\\\"true\\\"===j?e.centered=!0:\\\"false\\\"===j&&(e.centered=!1));var k=c.tickRotate;k&&(e.rotate=k);var l=c.tickFit;l&&(l=angular.lowercase(l),\\\"true\\\"===l?e.fit=!0:\\\"false\\\"===l&&(e.fit=!1));var m=c.tickValues;m&&(e.values=m);var n=c.tickOuter;n&&(n=angular.lowercase(n),\\\"true\\\"===n?e.outer=!0:\\\"false\\\"===n&&(e.outer=!1));var o=c.format;o&&(e.format=d3.format(o)),d.addXTick(e),c.tickFormatFunction&&d.addXTickFormatFunction(a.tickFormatFunction())};return{require:\\\"^c3chart\\\",restrict:\\\"E\\\",scope:{tickFormatFunction:\\\"&\\\"},replace:!0,link:a}}function ChartAxisY(){var a=function(a,b,c,d){var e=c.axisId,f=c.axisPosition,g=c.axisLabel;e=void 0==e?\\\"y\\\":e;var h={label:{text:g,position:f}};\\\"false\\\"===c.show?h.show=!1:\\\"y2\\\"===e&&(h.show=!0);var i=c.paddingTop,j=c.paddingBottom;(i||j)&&(i=i?i:0,j=j?j:0,h.padding={top:parseInt(i),bottom:parseInt(j)});var k=c.axisMax,l=c.axisMin;k&&(h.max=parseInt(k)),l&&(h.min=parseInt(l)),\\\"true\\\"===c.axisInverted&&(h.inverted=!0),\\\"true\\\"===c.axisInner&&(h.inner=!0);var m=c.axisCenter;m&&(h.center=parseInt(m)),d.addAxisProperties(e,h)};return{require:\\\"^c3chart\\\",restrict:\\\"E\\\",scope:{},replace:!0,link:a}}function ChartAxisYTick(){var a=function(a,b,c,d){var e={},f=c.tickCount;f&&(e.count=f);var g=c.tickOuter;g&&(g=angular.lowercase(g),\\\"true\\\"===g?e.outer=!0:\\\"false\\\"===g&&(e.outer=!1));var h=c.tickValues;h&&(e.values=h);var i=c.tickFormat;i&&(e.format=d3.format(i)),d.addYTick(e),c.tickFormatFunction&&d.addYTickFormatFunction(a.tickFormatFunction())};return{require:\\\"^c3chart\\\",restrict:\\\"E\\\",scope:{tickFormatFunction:\\\"&\\\"},replace:!0,link:a}}function ChartBar(){var a=function(a,b,c,d){var e={};c.width&&(e.width=parseInt(c.width)),c.ratio&&(e.width||(e.width={}),e.width.ratio=parseFloat(c.ratio)),c.zerobased&&(e.zerobased=\\\"true\\\"===c.zerobased),d.addBar(e)};return{require:\\\"^c3chart\\\",restrict:\\\"E\\\",scope:{},replace:!0,link:a}}function C3Chart(a){var b=function(b,c,d,e){var f=d.paddingTop,g=d.paddingRight,h=d.paddingBottom,i=d.paddingLeft,j=d.sortData;f&&e.addPadding(\\\"top\\\",f),g&&e.addPadding(\\\"right\\\",g),h&&e.addPadding(\\\"bottom\\\",h),i&&e.addPadding(\\\"left\\\",i),j&&e.addSorting(j),d.labelsFormatFunction&&e.addDataLabelsFormatFunction(b.labelsFormatFunction()),d.callbackFunction&&e.addChartCallbackFunction(b.callbackFunction()),a(function(){e.showGraph()})};return{restrict:\\\"E\\\",controller:\\\"ChartController\\\",scope:{bindto:\\\"@bindtoId\\\",showLabels:\\\"@showLabels\\\",labelsFormatFunction:\\\"&\\\",showSubchart:\\\"@showSubchart\\\",enableZoom:\\\"@enableZoom\\\",chartData:\\\"=chartData\\\",chartColumns:\\\"=chartColumns\\\",chartX:\\\"=chartX\\\",callbackFunction:\\\"&\\\"},template:\\\"
\\\",replace:!0,transclude:!0,link:b}}function ChartColors(){var a=function(a,b,c,d){var e=c.colorPattern;e&&d.addColors(e.split(\\\",\\\")),c.colorFunction&&d.addColorFunction(a.colorFunction())};return{require:\\\"^c3chart\\\",restrict:\\\"E\\\",scope:{colorFunction:\\\"&\\\"},replace:!0,link:a}}function ChartColumn(){var a=function(a,b,c,d){var e=c.columnValues.split(\\\",\\\");e.unshift(c.columnId),d.addColumn(e,c.columnType,c.columnName,c.columnColor)};return{require:\\\"^c3chart\\\",restrict:\\\"E\\\",scope:{},replace:!0,link:a}}function ChartDonut(){var a=function(a,b,c,d){var e={};c.showLabel&&(e.label={show:\\\"true\\\"===c.showLabel}),c.thresholdLabel&&(e.label||(e.label={}),e.label.threshold=parseFloat(c.thresholdLabel)),c.expand&&(e.expand=\\\"true\\\"===c.expand),c.width&&(e.width=parseInt(c.width)),c.title&&(e.title=c.title),d.addDonut(e),c.labelFormatFunction&&d.addDonutLabelFormatFunction(a.labelFormatFunction())};return{require:\\\"^c3chart\\\",restrict:\\\"E\\\",scope:{labelFormatFunction:\\\"&\\\"},replace:!0,link:a}}function ChartEvents(){var a=function(a,b,c,d){c.onInit&&d.addOnInitFunction(a.onInit),c.onMouseover&&d.addOnMouseoverFunction(a.onMouseover),c.onMouseout&&d.addOnMouseoutFunction(a.onMouseout),c.onResize&&d.addOnResizeFunction(a.onResize),c.onResized&&d.addOnResizedFunction(a.onResized),c.onRendered&&d.addOnRenderedFunction(a.onRendered),c.onClickData&&d.addDataOnClickFunction(a.onClickData),c.onMouseoverData&&d.addDataOnMouseoverFunction(a.onMouseoverData),c.onMouseoutData&&d.addDataOnMouseoutFunction(a.onMouseoutData)};return{require:\\\"^c3chart\\\",restrict:\\\"E\\\",scope:{onInit:\\\"&\\\",onMouseover:\\\"&\\\",onMouseout:\\\"&\\\",onResize:\\\"&\\\",onResized:\\\"&\\\",onRendered:\\\"&\\\",onClickData:\\\"&\\\",onMouseoverData:\\\"&\\\",onMouseoutData:\\\"&\\\"},replace:!0,link:a}}function ChartGauge(){var a=function(a,b,c,d){var e={};c.min&&(e.min=parseInt(c.min)),c.max&&(e.max=parseInt(c.max)),c.width&&(e.width=parseInt(c.width)),c.units&&(e.units=c.units),c.showLabel&&(e.label={show:\\\"true\\\"===c.showLabel}),c.expand&&(e.expand=\\\"true\\\"===c.expand),d.addGauge(e),c.labelFormatFunction&&d.addGaugeLabelFormatFunction(a.labelFormatFunction())};return{require:\\\"^c3chart\\\",restrict:\\\"E\\\",scope:{labelFormatFunction:\\\"&\\\"},replace:!0,link:a}}function ChartGrid(){var a=function(a,b,c,d){var e=c.showX;e&&\\\"true\\\"===e&&d.addGrid(\\\"x\\\");var f=c.showY;f&&\\\"true\\\"===f&&d.addGrid(\\\"y\\\");var g=c.showY2;g&&\\\"true\\\"===g&&d.addGrid(\\\"y2\\\");var h=c.showFocus;h&&\\\"false\\\"===h&&d.hideGridFocus()};return{require:\\\"^c3chart\\\",restrict:\\\"E\\\",scope:{},replace:!0,link:a,transclude:!0,template:\\\"
\\\"}}function ChartGridOptional(){var a=function(a,b,c,d){var e=c.axisId,f=c.gridValue,g=c.gridText;d.addGridLine(e,f,g)};return{require:\\\"^c3chart\\\",restrict:\\\"E\\\",scope:{},replace:!0,link:a}}function ChartGroup(){var a=function(a,b,c,d){var e=c.groupValues.split(\\\",\\\");d.addGroup(e)};return{require:\\\"^c3chart\\\",restrict:\\\"E\\\",scope:{},replace:!0,link:a}}function ChartLegend(){var a=function(a,b,c,d){var e=null,f=c.showLegend;if(f&&\\\"false\\\"===f)e={show:!1};else{var g=c.legendPosition;g&&(e={position:g});var h=c.legendInset;h&&(e={position:\\\"inset\\\",inset:{anchor:h}})}null!=e&&d.addLegend(e)};return{require:\\\"^c3chart\\\",restrict:\\\"E\\\",scope:{},replace:!0,link:a}}function ChartPie(){var a=function(a,b,c,d){var e={};c.showLabel&&(e.label={show:\\\"true\\\"===c.showLabel}),c.thresholdLabel&&(e.label||(e.label={}),e.label.threshold=parseFloat(c.thresholdLabel)),c.expand&&(e.expand=\\\"true\\\"===c.expand),d.addPie(e),c.labelFormatFunction&&d.addPieLabelFormatFunction(a.labelFormatFunction())};return{require:\\\"^c3chart\\\",restrict:\\\"E\\\",scope:{labelFormatFunction:\\\"&\\\"},replace:!0,link:a}}function ChartPoints(){var a=function(a,b,c,d){var e={};c.showPoint&&(e.show=\\\"true\\\"===c.showPoint),c.pointExpandEnabled&&(e.focus||(e.focus={expand:{}}),e.focus.expand.enabled=\\\"false\\\"!==c.pointsFocusEnabled),c.pointExpandRadius&&(e.focus||(pie.focus={expand:{}}),e.focus.expand.r=parseInt(c.pointFocusRadius)),c.pointRadius&&(e.r=parseInt(c.pointRadius)),c.pointSelectRadius&&(e.select={r:parseInt(c.pointSelectRadius)}),d.addPoint(e)};return{require:\\\"^c3chart\\\",restrict:\\\"E\\\",scope:{},replace:!0,link:a}}function ChartSize(){var a=function(a,b,c,d){var e=null,f=c.chartWidth,g=c.chartHeight;(f||g)&&(e={},f&&(e.width=parseInt(f)),g&&(e.height=parseInt(g)),d.addSize(e))};return{require:\\\"^c3chart\\\",restrict:\\\"E\\\",scope:{},replace:!0,link:a}}function ChartTooltip(){var a=function(a,b,c,d){var e=null,f=c.showTooltip,g=(c.hideTooltipTitle,c.joinedTooltip);if(f&&\\\"false\\\"===f)e={show:!1};else{var h=c.groupTooltip;h&&\\\"false\\\"===h&&(e={grouped:!1})}g&&\\\"true\\\"===g&&(e=e||{},e.contents=function(a,b,c,d){var e,f,g,h,i,j,k,l=this,m=l.config,n=m.tooltip_format_title||b,o=m.tooltip_format_name||function(a){return a},p=m.tooltip_format_value||c;for(k={tooltipContainer:\\\"c3-tooltip-container\\\",tooltip:\\\"c3-tooltip\\\",tooltipName:\\\"c3-tooltip-name\\\"},f=a[0].x;f\\\"+(g||0===g?\\\"\\\"+g+\\\"\\\":\\\"\\\")),h=p(a[f].value,a[f].ratio,a[f].id,a[f].index),void 0!==h&&(i=o(a[f].name,a[f].ratio,a[f].id,a[f].index),j=l.levelColor?l.levelColor(a[f].value):d(a[f].id),e+=\\\"\\\",e+=\\\"\\\"+i+\\\"\\\",e+=\\\"\\\"+h+\\\"\\\",e+=\\\"\\\"));return e+\\\"\\\"}),null!=e&&d.addTooltip(e),c.titleFormatFunction&&d.addTooltipTitleFormatFunction(a.titleFormatFunction()),c.nameFormatFunction&&d.addTooltipNameFormatFunction(a.nameFormatFunction()),c.valueFormatFunction&&d.addTooltipValueFormatFunction(a.valueFormatFunction())};return{require:\\\"^c3chart\\\",restrict:\\\"E\\\",scope:{valueFormatFunction:\\\"&\\\",nameFormatFunction:\\\"&\\\",titleFormatFunction:\\\"&\\\"},replace:!0,link:a}}angular.module(\\\"gridshore.c3js.chart\\\",[]),angular.module(\\\"gridshore.c3js.chart\\\").directive(\\\"chartAxes\\\",ChartAxes),angular.module(\\\"gridshore.c3js.chart\\\").directive(\\\"chartAxis\\\",ChartAxis),angular.module(\\\"gridshore.c3js.chart\\\").directive(\\\"chartAxisX\\\",ChartAxisX),angular.module(\\\"gridshore.c3js.chart\\\").directive(\\\"chartAxisXTick\\\",ChartAxisXTick),angular.module(\\\"gridshore.c3js.chart\\\").directive(\\\"chartAxisY\\\",ChartAxisY),angular.module(\\\"gridshore.c3js.chart\\\").directive(\\\"chartAxisYTick\\\",ChartAxisYTick),angular.module(\\\"gridshore.c3js.chart\\\").directive(\\\"chartBar\\\",ChartBar),angular.module(\\\"gridshore.c3js.chart\\\").directive(\\\"c3chart\\\",[\\\"$timeout\\\",function(a){return C3Chart(a)}]),angular.module(\\\"gridshore.c3js.chart\\\").directive(\\\"chartColors\\\",ChartColors),angular.module(\\\"gridshore.c3js.chart\\\").directive(\\\"chartColumn\\\",ChartColumn),angular.module(\\\"gridshore.c3js.chart\\\").controller(\\\"ChartController\\\",[\\\"$scope\\\",\\\"$timeout\\\",function(a,b){function c(){a.chart=null,a.columns=[],a.types={},a.axis={},a.axes={},a.padding=null,a.xValues=null,a.xsValues=null,a.xTick=null,a.yTick=null,a.names=null,a.colors=null,a.grid=null,a.legend=null,a.tooltip=null,a.chartSize=null,a.colors=null,a.gauge=null,a.jsonKeys=null,a.groups=null,a.sorting=null}function d(b,c,d,e){void 0!==c&&(a.types[b]=c),void 0!==d&&(null===a.names&&(a.names={}),a.names[b]=d),void 0!==e&&(null===a.colors&&(a.colors={}),a.colors[b]=e)}function e(){a.jsonKeys={},a.jsonKeys.value=[],angular.forEach(a.chartColumns,function(b){a.jsonKeys.value.push(b.id),d(b.id,b.type,b.name,b.color)}),a.chartX&&(a.jsonKeys.x=a.chartX.id),a.names&&(a.config.data.names=a.names),a.colors&&(a.config.data.colors=a.colors),a.groups&&(a.config.data.groups=a.groups),a.config.data.keys=a.jsonKeys,a.config.data.json=a.chartData,a.chartIsGenerated?a.chart.load(a.config.data):(a.chart=c3.generate(a.config),a.chartIsGenerated=!0,a.chartCallbackFunction&&a.chartCallbackFunction(a.chart))}c(),this.showGraph=function(){var d={};d.bindto=\\\"#\\\"+a.bindto,d.data={},a.xValues&&(d.data.x=a.xValues),a.xsValues&&(d.data.xs=a.xsValues),a.columns&&(d.data.columns=a.columns),d.data.types=a.types,d.data.axes=a.axes,a.names&&(d.data.names=a.names),null!=a.padding&&(d.padding=a.padding),null!=a.sorting&&(d.data.order=\\\"null\\\"==a.sorting?null:a.sorting),a.colors&&(d.data.colors=a.colors),a.colorFunction&&(d.data.color=a.colorFunction),a.showLabels&&\\\"true\\\"===a.showLabels&&(d.data.labels=!0),a.dataLabelsFormatFunction&&(d.data.labels=d.data.labels||{},d.data.labels.format=a.dataLabelsFormatFunction),null!=a.groups&&(d.data.groups=a.groups),a.showSubchart&&\\\"true\\\"===a.showSubchart&&(d.subchart={show:!0}),a.enableZoom&&\\\"true\\\"===a.enableZoom&&(d.zoom={enabled:!0}),d.axis=a.axis,a.xTick&&(d.axis.x.tick=a.xTick),a.xTickFormatFunction&&(d.axis.x.tick=d.axis.x.tick||{},d.axis.x.tick.format=a.xTickFormatFunction),a.xType&&(d.axis.x.type=a.xType),a.yTick&&(d.axis.y.tick=a.yTick),a.yTickFormatFunction&&(d.axis.y.tick=d.axis.y.tick||{},d.axis.y.tick.format=a.yTickFormatFunction),null!=a.grid&&(d.grid=a.grid),null!=a.legend&&(d.legend=a.legend),d.tooltip=null!=a.tooltip?a.tooltip:{},a.tooltipTitleFormatFunction&&(d.tooltip.format=d.tooltip.format||{},d.tooltip.format.title=a.tooltipTitleFormatFunction),a.tooltipNameFormatFunction&&(d.tooltip.format=d.tooltip.format||{},d.tooltip.format.name=a.tooltipNameFormatFunction),a.tooltipValueFormatFunction&&(d.tooltip.format=d.tooltip.format||{},d.tooltip.format.value=a.tooltipValueFormatFunction),null!=a.chartSize&&(d.size=a.chartSize),null!=a.colors&&(d.color={pattern:a.colors}),d.gauge=null!=a.gauge?a.gauge:{},a.gaugeLabelFormatFunction&&(d.gauge.label=d.gauge.label||{},d.gauge.label.format=a.gaugeLabelFormatFunction),null!=a.point&&(d.point=a.point),null!=a.bar&&(d.bar=a.bar),null!=a.pie&&(d.pie=a.pie),a.pieLabelFormatFunction&&(d.pie.label=d.pie.label||{},d.pie.label.format=a.pieLabelFormatFunction),d.donut=null!=a.donut?a.donut:{},a.donutLabelFormatFunction&&(d.donut.label=d.donut.label||{},d.donut.label.format=a.donutLabelFormatFunction),null!=a.onInit&&(d.oninit=a.onInit),null!=a.onMouseover&&(d.onmouseover=a.onMouseover),null!=a.onMouseout&&(d.onmouseout=a.onMouseout),null!=a.onRendered&&(d.onrendered=a.onRendered),null!=a.onResize&&(d.onresize=a.onResize),null!=a.onResized&&(d.onresized=a.onResized),null!=a.dataOnClick&&(d.data.onclick=function(b){a.$apply(function(){a.dataOnClick({data:b})})}),null!=a.dataOnMouseover&&(d.data.onmouseover=function(b){a.$apply(function(){a.dataOnMouseover({data:b})})}),null!=a.dataOnMouseout&&(d.data.onmouseout=function(b){a.$apply(function(){a.dataOnMouseout({data:b})})}),a.config=d,a.chartData&&a.chartColumns?a.$watchCollection(\\\"chartData\\\",function(){e()}):a.chart=c3.generate(a.config),a.$on(\\\"$destroy\\\",function(){b(function(){angular.isDefined(a.chart)&&(a.chart=a.chart.destroy(),c())},1e4)})},this.addColumn=function(b,c,e,f){a.columns.push(b),d(b[0],c,e,f)},this.addDataLabelsFormatFunction=function(b){a.dataLabelsFormatFunction=b},this.addChartCallbackFunction=function(b){a.chartCallbackFunction=b},this.addYAxis=function(b){a.axes=b,a.axis.y2||(a.axis.y2={show:!0})},this.addXAxisValues=function(b){a.xValues=b},this.addXSValues=function(b){a.xsValues=b},this.addAxisProperties=function(b,c){a.axis[b]=c},this.addXTick=function(b){a.xTick=b},this.addXTickFormatFunction=function(b){a.xTickFormatFunction=b},this.addXType=function(b){a.xType=b},this.addYTick=function(b){a.yTick=b},this.addYTickFormatFunction=function(b){a.yTickFormatFunction=b},this.rotateAxis=function(){a.axis.rotated=!0},this.addPadding=function(b,c){null==a.padding&&(a.padding={}),a.padding[b]=parseInt(c)},this.addSorting=function(b){a.sorting=b},this.addGrid=function(b){null==a.grid&&(a.grid={}),null==a.grid[b]&&(a.grid[b]={}),a.grid[b].show=!0},this.addGridLine=function(b,c,d){null==a.grid&&(a.grid={}),\\\"x\\\"===b?(void 0===a.grid.x&&(a.grid.x={}),void 0===a.grid.x.lines&&(a.grid.x.lines=[])):(void 0===a.grid.y&&(a.grid.y={}),void 0===a.grid.y.lines&&(a.grid.y.lines=[])),\\\"y2\\\"===b?a.grid.y.lines.push({value:c,text:d,axis:\\\"y2\\\"}):a.grid[b].lines.push({value:c,text:d})},this.addLegend=function(b){a.legend=b},this.addTooltip=function(b){a.tooltip=b},this.addTooltipTitleFormatFunction=function(b){a.tooltipTitleFormatFunction=b},this.addTooltipNameFormatFunction=function(b){a.tooltipNameFormatFunction=b},this.addTooltipValueFormatFunction=function(b){a.tooltipValueFormatFunction=b},this.addSize=function(b){a.chartSize=b},this.addColors=function(b){a.colors=b},this.addColorFunction=function(b){a.colorFunction=b},this.addOnInitFunction=function(b){a.onInit=b},this.addOnMouseoverFunction=function(b){a.onMouseover=b},this.addOnMouseoutFunction=function(b){a.onMouseout=b},this.addOnRenderedFunction=function(b){a.onRendered=b},this.addOnResizeFunction=function(b){a.onResize=b},this.addOnResizedFunction=function(b){a.onResized=b},this.addDataOnClickFunction=function(b){a.dataOnClick=b},this.addDataOnMouseoverFunction=function(b){a.dataOnMouseover=b},this.addDataOnMouseoutFunction=function(b){a.dataOnMouseout=b},this.addGauge=function(b){a.gauge=b},this.addGaugeLabelFormatFunction=function(b){a.gaugeLabelFormatFunction=b},this.addBar=function(b){a.bar=b},this.addPie=function(b){a.pie=b},this.addPieLabelFormatFunction=function(b){a.pieLabelFormatFunction=b},this.addDonut=function(b){a.donut=b},this.addDonutLabelFormatFunction=function(b){a.donutLabelFormatFunction=b},this.addGroup=function(b){null==a.groups&&(a.groups=[]),a.groups.push(b)},this.addPoint=function(b){a.point=b},this.hideGridFocus=function(){null==a.grid&&(a.grid={}),a.grid.focus={show:!1}}}]),angular.module(\\\"gridshore.c3js.chart\\\").directive(\\\"chartDonut\\\",ChartDonut),angular.module(\\\"gridshore.c3js.chart\\\").directive(\\\"chartEvents\\\",ChartEvents),angular.module(\\\"gridshore.c3js.chart\\\").directive(\\\"chartGauge\\\",ChartGauge),angular.module(\\\"gridshore.c3js.chart\\\").directive(\\\"chartGrid\\\",ChartGrid),angular.module(\\\"gridshore.c3js.chart\\\").directive(\\\"chartGridOptional\\\",ChartGridOptional),angular.module(\\\"gridshore.c3js.chart\\\").directive(\\\"chartGroup\\\",ChartGroup),angular.module(\\\"gridshore.c3js.chart\\\").directive(\\\"chartLegend\\\",ChartLegend),angular.module(\\\"gridshore.c3js.chart\\\").directive(\\\"chartPie\\\",ChartPie),angular.module(\\\"gridshore.c3js.chart\\\").directive(\\\"chartPoints\\\",ChartPoints),angular.module(\\\"gridshore.c3js.chart\\\").directive(\\\"chartSize\\\",ChartSize),angular.module(\\\"gridshore.c3js.chart\\\").directive(\\\"chartTooltip\\\",ChartTooltip);\\n//# sourceMappingURL=c3-angular.min.js.map\\n\"\n\n/***/ }),\n\n/***/ 2179:\n/***/ (function(module, exports, __webpack_require__) {\n\n__webpack_require__(3)(__webpack_require__(2180))\n\n/***/ }),\n\n/***/ 2180:\n/***/ (function(module, exports) {\n\nmodule.exports = \"!function(){function n(n){return n&&(n.ownerDocument||n.document||n).documentElement}function t(n){return n&&(n.ownerDocument&&n.ownerDocument.defaultView||n.document&&n||n.defaultView)}function e(n,t){return t>n?-1:n>t?1:n>=t?0:NaN}function r(n){return null===n?NaN:+n}function u(n){return!isNaN(n)}function i(n){return{left:function(t,e,r,u){for(arguments.length<3&&(r=0),arguments.length<4&&(u=t.length);u>r;){var i=r+u>>>1;n(t[i],e)<0?r=i+1:u=i}return r},right:function(t,e,r,u){for(arguments.length<3&&(r=0),arguments.length<4&&(u=t.length);u>r;){var i=r+u>>>1;n(t[i],e)>0?u=i:r=i+1}return r}}}function a(n){return n.length}function o(n){for(var t=1;n*t%1;)t*=10;return t}function l(n,t){for(var e in t)Object.defineProperty(n.prototype,e,{value:t[e],enumerable:!1})}function c(){this._=Object.create(null)}function s(n){return(n+=\\\"\\\")===xa||n[0]===ba?ba+n:n}function f(n){return(n+=\\\"\\\")[0]===ba?n.slice(1):n}function h(n){return s(n)in this._}function g(n){return(n=s(n))in this._&&delete this._[n]}function p(){var n=[];for(var t in this._)n.push(f(t));return n}function v(){var n=0;for(var t in this._)++n;return n}function d(){for(var n in this._)return!1;return!0}function m(){this._=Object.create(null)}function y(n){return n}function M(n,t,e){return function(){var r=e.apply(t,arguments);return r===t?n:r}}function x(n,t){if(t in n)return t;t=t.charAt(0).toUpperCase()+t.slice(1);for(var e=0,r=_a.length;r>e;++e){var u=_a[e]+t;if(u in n)return u}}function b(){}function _(){}function w(n){function t(){for(var t,r=e,u=-1,i=r.length;++ue;e++)for(var u,i=n[e],a=0,o=i.length;o>a;a++)(u=i[a])&&t(u,a,e);return n}function Z(n){return Sa(n,za),n}function V(n){var t,e;return function(r,u,i){var a,o=n[i].update,l=o.length;for(i!=e&&(e=i,t=0),u>=t&&(t=u+1);!(a=o[t])&&++t0&&(n=n.slice(0,o));var c=La.get(n);return c&&(n=c,l=B),o?t?u:r:t?b:i}function $(n,t){return function(e){var r=oa.event;oa.event=e,t[0]=this.__data__;try{n.apply(this,t)}finally{oa.event=r}}}function B(n,t){var e=$(n,t);return function(n){var t=this,r=n.relatedTarget;r&&(r===t||8&r.compareDocumentPosition(t))||e.call(t,n)}}function W(e){var r=\\\".dragsuppress-\\\"+ ++Ta,u=\\\"click\\\"+r,i=oa.select(t(e)).on(\\\"touchmove\\\"+r,S).on(\\\"dragstart\\\"+r,S).on(\\\"selectstart\\\"+r,S);if(null==qa&&(qa=\\\"onselectstart\\\"in e?!1:x(e.style,\\\"userSelect\\\")),qa){var a=n(e).style,o=a[qa];a[qa]=\\\"none\\\"}return function(n){if(i.on(r,null),qa&&(a[qa]=o),n){var t=function(){i.on(u,null)};i.on(u,function(){S(),t()},!0),setTimeout(t,0)}}}function J(n,e){e.changedTouches&&(e=e.changedTouches[0]);var r=n.ownerSVGElement||n;if(r.createSVGPoint){var u=r.createSVGPoint();if(0>Ra){var i=t(n);if(i.scrollX||i.scrollY){r=oa.select(\\\"body\\\").append(\\\"svg\\\").style({position:\\\"absolute\\\",top:0,left:0,margin:0,padding:0,border:\\\"none\\\"},\\\"important\\\");var a=r[0][0].getScreenCTM();Ra=!(a.f||a.e),r.remove()}}return Ra?(u.x=e.pageX,u.y=e.pageY):(u.x=e.clientX,u.y=e.clientY),u=u.matrixTransform(n.getScreenCTM().inverse()),[u.x,u.y]}var o=n.getBoundingClientRect();return[e.clientX-o.left-n.clientLeft,e.clientY-o.top-n.clientTop]}function G(){return oa.event.changedTouches[0].identifier}function K(n){return n>0?1:0>n?-1:0}function Q(n,t,e){return(t[0]-n[0])*(e[1]-n[1])-(t[1]-n[1])*(e[0]-n[0])}function nn(n){return n>1?0:-1>n?ja:Math.acos(n)}function tn(n){return n>1?Ha:-1>n?-Ha:Math.asin(n)}function en(n){return((n=Math.exp(n))-1/n)/2}function rn(n){return((n=Math.exp(n))+1/n)/2}function un(n){return((n=Math.exp(2*n))-1)/(n+1)}function an(n){return(n=Math.sin(n/2))*n}function on(){}function ln(n,t,e){return this instanceof ln?(this.h=+n,this.s=+t,void(this.l=+e)):arguments.length<2?n instanceof ln?new ln(n.h,n.s,n.l):_n(\\\"\\\"+n,wn,ln):new ln(n,t,e)}function cn(n,t,e){function r(n){return n>360?n-=360:0>n&&(n+=360),60>n?i+(a-i)*n/60:180>n?a:240>n?i+(a-i)*(240-n)/60:i}function u(n){return Math.round(255*r(n))}var i,a;return n=isNaN(n)?0:(n%=360)<0?n+360:n,t=isNaN(t)?0:0>t?0:t>1?1:t,e=0>e?0:e>1?1:e,a=.5>=e?e*(1+t):e+t-e*t,i=2*e-a,new yn(u(n+120),u(n),u(n-120))}function sn(n,t,e){return this instanceof sn?(this.h=+n,this.c=+t,void(this.l=+e)):arguments.length<2?n instanceof sn?new sn(n.h,n.c,n.l):n instanceof hn?pn(n.l,n.a,n.b):pn((n=Sn((n=oa.rgb(n)).r,n.g,n.b)).l,n.a,n.b):new sn(n,t,e)}function fn(n,t,e){return isNaN(n)&&(n=0),isNaN(t)&&(t=0),new hn(e,Math.cos(n*=Oa)*t,Math.sin(n)*t)}function hn(n,t,e){return this instanceof hn?(this.l=+n,this.a=+t,void(this.b=+e)):arguments.length<2?n instanceof hn?new hn(n.l,n.a,n.b):n instanceof sn?fn(n.h,n.c,n.l):Sn((n=yn(n)).r,n.g,n.b):new hn(n,t,e)}function gn(n,t,e){var r=(n+16)/116,u=r+t/500,i=r-e/200;return u=vn(u)*Ka,r=vn(r)*Qa,i=vn(i)*no,new yn(mn(3.2404542*u-1.5371385*r-.4985314*i),mn(-.969266*u+1.8760108*r+.041556*i),mn(.0556434*u-.2040259*r+1.0572252*i))}function pn(n,t,e){return n>0?new sn(Math.atan2(e,t)*Ia,Math.sqrt(t*t+e*e),n):new sn(NaN,NaN,n)}function vn(n){return n>.206893034?n*n*n:(n-4/29)/7.787037}function dn(n){return n>.008856?Math.pow(n,1/3):7.787037*n+4/29}function mn(n){return Math.round(255*(.00304>=n?12.92*n:1.055*Math.pow(n,1/2.4)-.055))}function yn(n,t,e){return this instanceof yn?(this.r=~~n,this.g=~~t,void(this.b=~~e)):arguments.length<2?n instanceof yn?new yn(n.r,n.g,n.b):_n(\\\"\\\"+n,yn,cn):new yn(n,t,e)}function Mn(n){return new yn(n>>16,n>>8&255,255&n)}function xn(n){return Mn(n)+\\\"\\\"}function bn(n){return 16>n?\\\"0\\\"+Math.max(0,n).toString(16):Math.min(255,n).toString(16)}function _n(n,t,e){var r,u,i,a=0,o=0,l=0;if(r=/([a-z]+)\\\\((.*)\\\\)/.exec(n=n.toLowerCase()))switch(u=r[2].split(\\\",\\\"),r[1]){case\\\"hsl\\\":return e(parseFloat(u[0]),parseFloat(u[1])/100,parseFloat(u[2])/100);case\\\"rgb\\\":return t(Nn(u[0]),Nn(u[1]),Nn(u[2]))}return(i=ro.get(n))?t(i.r,i.g,i.b):(null==n||\\\"#\\\"!==n.charAt(0)||isNaN(i=parseInt(n.slice(1),16))||(4===n.length?(a=(3840&i)>>4,a=a>>4|a,o=240&i,o=o>>4|o,l=15&i,l=l<<4|l):7===n.length&&(a=(16711680&i)>>16,o=(65280&i)>>8,l=255&i)),t(a,o,l))}function wn(n,t,e){var r,u,i=Math.min(n/=255,t/=255,e/=255),a=Math.max(n,t,e),o=a-i,l=(a+i)/2;return o?(u=.5>l?o/(a+i):o/(2-a-i),r=n==a?(t-e)/o+(e>t?6:0):t==a?(e-n)/o+2:(n-t)/o+4,r*=60):(r=NaN,u=l>0&&1>l?0:r),new ln(r,u,l)}function Sn(n,t,e){n=kn(n),t=kn(t),e=kn(e);var r=dn((.4124564*n+.3575761*t+.1804375*e)/Ka),u=dn((.2126729*n+.7151522*t+.072175*e)/Qa),i=dn((.0193339*n+.119192*t+.9503041*e)/no);return hn(116*u-16,500*(r-u),200*(u-i))}function kn(n){return(n/=255)<=.04045?n/12.92:Math.pow((n+.055)/1.055,2.4)}function Nn(n){var t=parseFloat(n);return\\\"%\\\"===n.charAt(n.length-1)?Math.round(2.55*t):t}function En(n){return\\\"function\\\"==typeof n?n:function(){return n}}function An(n){return function(t,e,r){return 2===arguments.length&&\\\"function\\\"==typeof e&&(r=e,e=null),Cn(t,e,n,r)}}function Cn(n,t,e,r){function u(){var n,t=l.status;if(!t&&Ln(l)||t>=200&&300>t||304===t){try{n=e.call(i,l)}catch(r){return void a.error.call(i,r)}a.load.call(i,n)}else a.error.call(i,l)}var i={},a=oa.dispatch(\\\"beforesend\\\",\\\"progress\\\",\\\"load\\\",\\\"error\\\"),o={},l=new XMLHttpRequest,c=null;return!this.XDomainRequest||\\\"withCredentials\\\"in l||!/^(http(s)?:)?\\\\/\\\\//.test(n)||(l=new XDomainRequest),\\\"onload\\\"in l?l.onload=l.onerror=u:l.onreadystatechange=function(){l.readyState>3&&u()},l.onprogress=function(n){var t=oa.event;oa.event=n;try{a.progress.call(i,l)}finally{oa.event=t}},i.header=function(n,t){return n=(n+\\\"\\\").toLowerCase(),arguments.length<2?o[n]:(null==t?delete o[n]:o[n]=t+\\\"\\\",i)},i.mimeType=function(n){return arguments.length?(t=null==n?null:n+\\\"\\\",i):t},i.responseType=function(n){return arguments.length?(c=n,i):c},i.response=function(n){return e=n,i},[\\\"get\\\",\\\"post\\\"].forEach(function(n){i[n]=function(){return i.send.apply(i,[n].concat(ca(arguments)))}}),i.send=function(e,r,u){if(2===arguments.length&&\\\"function\\\"==typeof r&&(u=r,r=null),l.open(e,n,!0),null==t||\\\"accept\\\"in o||(o.accept=t+\\\",*/*\\\"),l.setRequestHeader)for(var s in o)l.setRequestHeader(s,o[s]);return null!=t&&l.overrideMimeType&&l.overrideMimeType(t),null!=c&&(l.responseType=c),null!=u&&i.on(\\\"error\\\",u).on(\\\"load\\\",function(n){u(null,n)}),a.beforesend.call(i,l),l.send(null==r?null:r),i},i.abort=function(){return l.abort(),i},oa.rebind(i,a,\\\"on\\\"),null==r?i:i.get(zn(r))}function zn(n){return 1===n.length?function(t,e){n(null==t?e:null)}:n}function Ln(n){var t=n.responseType;return t&&\\\"text\\\"!==t?n.response:n.responseText}function qn(n,t,e){var r=arguments.length;2>r&&(t=0),3>r&&(e=Date.now());var u=e+t,i={c:n,t:u,n:null};return io?io.n=i:uo=i,io=i,ao||(oo=clearTimeout(oo),ao=1,lo(Tn)),i}function Tn(){var n=Rn(),t=Dn()-n;t>24?(isFinite(t)&&(clearTimeout(oo),oo=setTimeout(Tn,t)),ao=0):(ao=1,lo(Tn))}function Rn(){for(var n=Date.now(),t=uo;t;)n>=t.t&&t.c(n-t.t)&&(t.c=null),t=t.n;return n}function Dn(){for(var n,t=uo,e=1/0;t;)t.c?(t.t8?function(n){return n/e}:function(n){return n*e},symbol:n}}function Un(n){var t=n.decimal,e=n.thousands,r=n.grouping,u=n.currency,i=r&&e?function(n,t){for(var u=n.length,i=[],a=0,o=r[0],l=0;u>0&&o>0&&(l+o+1>t&&(o=Math.max(1,t-l)),i.push(n.substring(u-=o,u+o)),!((l+=o+1)>t));)o=r[a=(a+1)%r.length];return i.reverse().join(e)}:y;return function(n){var e=so.exec(n),r=e[1]||\\\" \\\",a=e[2]||\\\">\\\",o=e[3]||\\\"-\\\",l=e[4]||\\\"\\\",c=e[5],s=+e[6],f=e[7],h=e[8],g=e[9],p=1,v=\\\"\\\",d=\\\"\\\",m=!1,y=!0;switch(h&&(h=+h.substring(1)),(c||\\\"0\\\"===r&&\\\"=\\\"===a)&&(c=r=\\\"0\\\",a=\\\"=\\\"),g){case\\\"n\\\":f=!0,g=\\\"g\\\";break;case\\\"%\\\":p=100,d=\\\"%\\\",g=\\\"f\\\";break;case\\\"p\\\":p=100,d=\\\"%\\\",g=\\\"r\\\";break;case\\\"b\\\":case\\\"o\\\":case\\\"x\\\":case\\\"X\\\":\\\"#\\\"===l&&(v=\\\"0\\\"+g.toLowerCase());case\\\"c\\\":y=!1;case\\\"d\\\":m=!0,h=0;break;case\\\"s\\\":p=-1,g=\\\"r\\\"}\\\"$\\\"===l&&(v=u[0],d=u[1]),\\\"r\\\"!=g||h||(g=\\\"g\\\"),null!=h&&(\\\"g\\\"==g?h=Math.max(1,Math.min(21,h)):(\\\"e\\\"==g||\\\"f\\\"==g)&&(h=Math.max(0,Math.min(20,h)))),g=fo.get(g)||Fn;var M=c&&f;return function(n){var e=d;if(m&&n%1)return\\\"\\\";var u=0>n||0===n&&0>1/n?(n=-n,\\\"-\\\"):\\\"-\\\"===o?\\\"\\\":o;if(0>p){var l=oa.formatPrefix(n,h);n=l.scale(n),e=l.symbol+d}else n*=p;n=g(n,h);var x,b,_=n.lastIndexOf(\\\".\\\");if(0>_){var w=y?n.lastIndexOf(\\\"e\\\"):-1;0>w?(x=n,b=\\\"\\\"):(x=n.substring(0,w),b=n.substring(w))}else x=n.substring(0,_),b=t+n.substring(_+1);!c&&f&&(x=i(x,1/0));var S=v.length+x.length+b.length+(M?0:u.length),k=s>S?new Array(S=s-S+1).join(r):\\\"\\\";return M&&(x=i(k+x,k.length?s-b.length:1/0)),u+=v,n=x+b,(\\\"<\\\"===a?u+n+k:\\\">\\\"===a?k+u+n:\\\"^\\\"===a?k.substring(0,S>>=1)+u+n+k.substring(S):u+(M?n:k+n))+e}}}function Fn(n){return n+\\\"\\\"}function Hn(){this._=new Date(arguments.length>1?Date.UTC.apply(this,arguments):arguments[0])}function On(n,t,e){function r(t){var e=n(t),r=i(e,1);return r-t>t-e?e:r}function u(e){return t(e=n(new go(e-1)),1),e}function i(n,e){return t(n=new go(+n),e),n}function a(n,r,i){var a=u(n),o=[];if(i>1)for(;r>a;)e(a)%i||o.push(new Date(+a)),t(a,1);else for(;r>a;)o.push(new Date(+a)),t(a,1);return o}function o(n,t,e){try{go=Hn;var r=new Hn;return r._=n,a(r,t,e)}finally{go=Date}}n.floor=n,n.round=r,n.ceil=u,n.offset=i,n.range=a;var l=n.utc=In(n);return l.floor=l,l.round=In(r),l.ceil=In(u),l.offset=In(i),l.range=o,n}function In(n){return function(t,e){try{go=Hn;var r=new Hn;return r._=t,n(r,e)._}finally{go=Date}}}function Yn(n){function t(n){function t(t){for(var e,u,i,a=[],o=-1,l=0;++oo;){if(r>=c)return-1;if(u=t.charCodeAt(o++),37===u){if(a=t.charAt(o++),i=C[a in vo?t.charAt(o++):a],!i||(r=i(n,e,r))<0)return-1}else if(u!=e.charCodeAt(r++))return-1}return r}function r(n,t,e){_.lastIndex=0;var r=_.exec(t.slice(e));return r?(n.w=w.get(r[0].toLowerCase()),e+r[0].length):-1}function u(n,t,e){x.lastIndex=0;var r=x.exec(t.slice(e));return r?(n.w=b.get(r[0].toLowerCase()),e+r[0].length):-1}function i(n,t,e){N.lastIndex=0;var r=N.exec(t.slice(e));return r?(n.m=E.get(r[0].toLowerCase()),e+r[0].length):-1}function a(n,t,e){S.lastIndex=0;var r=S.exec(t.slice(e));return r?(n.m=k.get(r[0].toLowerCase()),e+r[0].length):-1}function o(n,t,r){return e(n,A.c.toString(),t,r)}function l(n,t,r){return e(n,A.x.toString(),t,r)}function c(n,t,r){return e(n,A.X.toString(),t,r)}function s(n,t,e){var r=M.get(t.slice(e,e+=2).toLowerCase());return null==r?-1:(n.p=r,e)}var f=n.dateTime,h=n.date,g=n.time,p=n.periods,v=n.days,d=n.shortDays,m=n.months,y=n.shortMonths;t.utc=function(n){function e(n){try{go=Hn;var t=new go;return t._=n,r(t)}finally{go=Date}}var r=t(n);return e.parse=function(n){try{go=Hn;var t=r.parse(n);return t&&t._}finally{go=Date}},e.toString=r.toString,e},t.multi=t.utc.multi=ct;var M=oa.map(),x=Vn(v),b=Xn(v),_=Vn(d),w=Xn(d),S=Vn(m),k=Xn(m),N=Vn(y),E=Xn(y);p.forEach(function(n,t){M.set(n.toLowerCase(),t)});var A={a:function(n){return d[n.getDay()]},A:function(n){return v[n.getDay()]},b:function(n){return y[n.getMonth()]},B:function(n){return m[n.getMonth()]},c:t(f),d:function(n,t){return Zn(n.getDate(),t,2)},e:function(n,t){return Zn(n.getDate(),t,2)},H:function(n,t){return Zn(n.getHours(),t,2)},I:function(n,t){return Zn(n.getHours()%12||12,t,2)},j:function(n,t){return Zn(1+ho.dayOfYear(n),t,3)},L:function(n,t){return Zn(n.getMilliseconds(),t,3)},m:function(n,t){return Zn(n.getMonth()+1,t,2)},M:function(n,t){return Zn(n.getMinutes(),t,2)},p:function(n){return p[+(n.getHours()>=12)]},S:function(n,t){return Zn(n.getSeconds(),t,2)},U:function(n,t){return Zn(ho.sundayOfYear(n),t,2)},w:function(n){return n.getDay()},W:function(n,t){return Zn(ho.mondayOfYear(n),t,2)},x:t(h),X:t(g),y:function(n,t){return Zn(n.getFullYear()%100,t,2)},Y:function(n,t){return Zn(n.getFullYear()%1e4,t,4)},Z:ot,\\\"%\\\":function(){return\\\"%\\\"}},C={a:r,A:u,b:i,B:a,c:o,d:tt,e:tt,H:rt,I:rt,j:et,L:at,m:nt,M:ut,p:s,S:it,U:Bn,w:$n,W:Wn,x:l,X:c,y:Gn,Y:Jn,Z:Kn,\\\"%\\\":lt};return t}function Zn(n,t,e){var r=0>n?\\\"-\\\":\\\"\\\",u=(r?-n:n)+\\\"\\\",i=u.length;return r+(e>i?new Array(e-i+1).join(t)+u:u)}function Vn(n){return new RegExp(\\\"^(?:\\\"+n.map(oa.requote).join(\\\"|\\\")+\\\")\\\",\\\"i\\\")}function Xn(n){for(var t=new c,e=-1,r=n.length;++e68?1900:2e3)}function nt(n,t,e){mo.lastIndex=0;var r=mo.exec(t.slice(e,e+2));return r?(n.m=r[0]-1,e+r[0].length):-1}function tt(n,t,e){mo.lastIndex=0;var r=mo.exec(t.slice(e,e+2));return r?(n.d=+r[0],e+r[0].length):-1}function et(n,t,e){mo.lastIndex=0;var r=mo.exec(t.slice(e,e+3));return r?(n.j=+r[0],e+r[0].length):-1}function rt(n,t,e){mo.lastIndex=0;var r=mo.exec(t.slice(e,e+2));return r?(n.H=+r[0],e+r[0].length):-1}function ut(n,t,e){mo.lastIndex=0;var r=mo.exec(t.slice(e,e+2));return r?(n.M=+r[0],e+r[0].length):-1}function it(n,t,e){mo.lastIndex=0;var r=mo.exec(t.slice(e,e+2));return r?(n.S=+r[0],e+r[0].length):-1}function at(n,t,e){mo.lastIndex=0;var r=mo.exec(t.slice(e,e+3));return r?(n.L=+r[0],e+r[0].length):-1}function ot(n){var t=n.getTimezoneOffset(),e=t>0?\\\"-\\\":\\\"+\\\",r=Ma(t)/60|0,u=Ma(t)%60;return e+Zn(r,\\\"0\\\",2)+Zn(u,\\\"0\\\",2)}function lt(n,t,e){yo.lastIndex=0;var r=yo.exec(t.slice(e,e+1));return r?e+r[0].length:-1}function ct(n){for(var t=n.length,e=-1;++e=0?1:-1,o=a*e,l=Math.cos(t),c=Math.sin(t),s=i*c,f=u*l+s*Math.cos(o),h=s*a*Math.sin(o);So.add(Math.atan2(h,f)),r=n,u=l,i=c}var t,e,r,u,i;ko.point=function(a,o){ko.point=n,r=(t=a)*Oa,u=Math.cos(o=(e=o)*Oa/2+ja/4),i=Math.sin(o)},ko.lineEnd=function(){n(t,e)}}function dt(n){var t=n[0],e=n[1],r=Math.cos(e);return[r*Math.cos(t),r*Math.sin(t),Math.sin(e)]}function mt(n,t){return n[0]*t[0]+n[1]*t[1]+n[2]*t[2]}function yt(n,t){return[n[1]*t[2]-n[2]*t[1],n[2]*t[0]-n[0]*t[2],n[0]*t[1]-n[1]*t[0]]}function Mt(n,t){n[0]+=t[0],n[1]+=t[1],n[2]+=t[2]}function xt(n,t){return[n[0]*t,n[1]*t,n[2]*t]}function bt(n){var t=Math.sqrt(n[0]*n[0]+n[1]*n[1]+n[2]*n[2]);n[0]/=t,n[1]/=t,n[2]/=t}function _t(n){return[Math.atan2(n[1],n[0]),tn(n[2])]}function wt(n,t){return Ma(n[0]-t[0])o;++o)u.point((e=n[o])[0],e[1]);return void u.lineEnd()}var l=new Tt(e,n,null,!0),c=new Tt(e,null,l,!1);l.o=c,i.push(l),a.push(c),l=new Tt(r,n,null,!1),c=new Tt(r,null,l,!0),l.o=c,i.push(l),a.push(c)}}),a.sort(t),qt(i),qt(a),i.length){for(var o=0,l=e,c=a.length;c>o;++o)a[o].e=l=!l;for(var s,f,h=i[0];;){for(var g=h,p=!0;g.v;)if((g=g.n)===h)return;s=g.z,u.lineStart();do{if(g.v=g.o.v=!0,g.e){if(p)for(var o=0,c=s.length;c>o;++o)u.point((f=s[o])[0],f[1]);else r(g.x,g.n.x,1,u);g=g.n}else{if(p){s=g.p.z;for(var o=s.length-1;o>=0;--o)u.point((f=s[o])[0],f[1])}else r(g.x,g.p.x,-1,u);g=g.p}g=g.o,s=g.z,p=!p}while(!g.v);u.lineEnd()}}}function qt(n){if(t=n.length){for(var t,e,r=0,u=n[0];++r0){for(b||(i.polygonStart(),b=!0),i.lineStart();++a1&&2&t&&e.push(e.pop().concat(e.shift())),g.push(e.filter(Dt))}var g,p,v,d=t(i),m=u.invert(r[0],r[1]),y={point:a,lineStart:l,lineEnd:c,polygonStart:function(){y.point=s,y.lineStart=f,y.lineEnd=h,g=[],p=[]},polygonEnd:function(){y.point=a,y.lineStart=l,y.lineEnd=c,g=oa.merge(g);var n=Ot(m,p);g.length?(b||(i.polygonStart(),b=!0),Lt(g,jt,n,e,i)):n&&(b||(i.polygonStart(),b=!0),i.lineStart(),e(null,null,1,i),i.lineEnd()),b&&(i.polygonEnd(),b=!1),g=p=null},sphere:function(){i.polygonStart(),i.lineStart(),e(null,null,1,i),i.lineEnd(),i.polygonEnd()}},M=Pt(),x=t(M),b=!1;return y}}function Dt(n){return n.length>1}function Pt(){var n,t=[];return{lineStart:function(){t.push(n=[])},point:function(t,e){n.push([t,e])},lineEnd:b,buffer:function(){var e=t;return t=[],n=null,e},rejoin:function(){t.length>1&&t.push(t.pop().concat(t.shift()))}}}function jt(n,t){return((n=n.x)[0]<0?n[1]-Ha-Da:Ha-n[1])-((t=t.x)[0]<0?t[1]-Ha-Da:Ha-t[1])}function Ut(n){var t,e=NaN,r=NaN,u=NaN;return{lineStart:function(){n.lineStart(),t=1},point:function(i,a){var o=i>0?ja:-ja,l=Ma(i-e);Ma(l-ja)0?Ha:-Ha),n.point(u,r),n.lineEnd(),n.lineStart(),n.point(o,r),n.point(i,r),t=0):u!==o&&l>=ja&&(Ma(e-u)Da?Math.atan((Math.sin(t)*(i=Math.cos(r))*Math.sin(e)-Math.sin(r)*(u=Math.cos(t))*Math.sin(n))/(u*i*a)):(t+r)/2}function Ht(n,t,e,r){var u;if(null==n)u=e*Ha,r.point(-ja,u),r.point(0,u),r.point(ja,u),r.point(ja,0),r.point(ja,-u),r.point(0,-u),r.point(-ja,-u),r.point(-ja,0),r.point(-ja,u);else if(Ma(n[0]-t[0])>Da){var i=n[0]o;++o){var c=t[o],s=c.length;if(s)for(var f=c[0],h=f[0],g=f[1]/2+ja/4,p=Math.sin(g),v=Math.cos(g),d=1;;){d===s&&(d=0),n=c[d];var m=n[0],y=n[1]/2+ja/4,M=Math.sin(y),x=Math.cos(y),b=m-h,_=b>=0?1:-1,w=_*b,S=w>ja,k=p*M;if(So.add(Math.atan2(k*_*Math.sin(w),v*x+k*Math.cos(w))),i+=S?b+_*Ua:b,S^h>=e^m>=e){var N=yt(dt(f),dt(n));bt(N);var E=yt(u,N);bt(E);var A=(S^b>=0?-1:1)*tn(E[2]);(r>A||r===A&&(N[0]||N[1]))&&(a+=S^b>=0?1:-1)}if(!d++)break;h=m,p=M,v=x,f=n}}return(-Da>i||Da>i&&0>So)^1&a}function It(n){function t(n,t){return Math.cos(n)*Math.cos(t)>i}function e(n){var e,i,l,c,s;return{lineStart:function(){c=l=!1,s=1},point:function(f,h){var g,p=[f,h],v=t(f,h),d=a?v?0:u(f,h):v?u(f+(0>f?ja:-ja),h):0;if(!e&&(c=l=v)&&n.lineStart(),v!==l&&(g=r(e,p),(wt(e,g)||wt(p,g))&&(p[0]+=Da,p[1]+=Da,v=t(p[0],p[1]))),v!==l)s=0,v?(n.lineStart(),g=r(p,e),n.point(g[0],g[1])):(g=r(e,p),n.point(g[0],g[1]),n.lineEnd()),e=g;else if(o&&e&&a^v){var m;d&i||!(m=r(p,e,!0))||(s=0,a?(n.lineStart(),n.point(m[0][0],m[0][1]),n.point(m[1][0],m[1][1]),n.lineEnd()):(n.point(m[1][0],m[1][1]),n.lineEnd(),n.lineStart(),n.point(m[0][0],m[0][1])))}!v||e&&wt(e,p)||n.point(p[0],p[1]),e=p,l=v,i=d},lineEnd:function(){l&&n.lineEnd(),e=null},clean:function(){return s|(c&&l)<<1}}}function r(n,t,e){var r=dt(n),u=dt(t),a=[1,0,0],o=yt(r,u),l=mt(o,o),c=o[0],s=l-c*c;if(!s)return!e&&n;var f=i*l/s,h=-i*c/s,g=yt(a,o),p=xt(a,f),v=xt(o,h);Mt(p,v);var d=g,m=mt(p,d),y=mt(d,d),M=m*m-y*(mt(p,p)-1);if(!(0>M)){var x=Math.sqrt(M),b=xt(d,(-m-x)/y);if(Mt(b,p),b=_t(b),!e)return b;var _,w=n[0],S=t[0],k=n[1],N=t[1];w>S&&(_=w,w=S,S=_);var E=S-w,A=Ma(E-ja)E;if(!A&&k>N&&(_=k,k=N,N=_),C?A?k+N>0^b[1]<(Ma(b[0]-w)ja^(w<=b[0]&&b[0]<=S)){var z=xt(d,(-m+x)/y);return Mt(z,p),[b,_t(z)]}}}function u(t,e){var r=a?n:ja-n,u=0;return-r>t?u|=1:t>r&&(u|=2),-r>e?u|=4:e>r&&(u|=8),u}var i=Math.cos(n),a=i>0,o=Ma(i)>Da,l=ve(n,6*Oa);return Rt(t,e,l,a?[0,-n]:[-ja,n-ja])}function Yt(n,t,e,r){return function(u){var i,a=u.a,o=u.b,l=a.x,c=a.y,s=o.x,f=o.y,h=0,g=1,p=s-l,v=f-c;if(i=n-l,p||!(i>0)){if(i/=p,0>p){if(h>i)return;g>i&&(g=i)}else if(p>0){if(i>g)return;i>h&&(h=i)}if(i=e-l,p||!(0>i)){if(i/=p,0>p){if(i>g)return;i>h&&(h=i)}else if(p>0){if(h>i)return;g>i&&(g=i)}if(i=t-c,v||!(i>0)){if(i/=v,0>v){if(h>i)return;g>i&&(g=i)}else if(v>0){if(i>g)return;i>h&&(h=i)}if(i=r-c,v||!(0>i)){if(i/=v,0>v){if(i>g)return;i>h&&(h=i)}else if(v>0){if(h>i)return;g>i&&(g=i)}return h>0&&(u.a={x:l+h*p,y:c+h*v}),1>g&&(u.b={x:l+g*p,y:c+g*v}),u}}}}}}function Zt(n,t,e,r){function u(r,u){return Ma(r[0]-n)0?0:3:Ma(r[0]-e)0?2:1:Ma(r[1]-t)0?1:0:u>0?3:2}function i(n,t){return a(n.x,t.x)}function a(n,t){var e=u(n,1),r=u(t,1);return e!==r?e-r:0===e?t[1]-n[1]:1===e?n[0]-t[0]:2===e?n[1]-t[1]:t[0]-n[0]}return function(o){function l(n){for(var t=0,e=d.length,r=n[1],u=0;e>u;++u)for(var i,a=1,o=d[u],l=o.length,c=o[0];l>a;++a)i=o[a],c[1]<=r?i[1]>r&&Q(c,i,n)>0&&++t:i[1]<=r&&Q(c,i,n)<0&&--t,c=i;return 0!==t}function c(i,o,l,c){var s=0,f=0;if(null==i||(s=u(i,l))!==(f=u(o,l))||a(i,o)<0^l>0){do c.point(0===s||3===s?n:e,s>1?r:t);while((s=(s+l+4)%4)!==f)}else c.point(o[0],o[1])}function s(u,i){return u>=n&&e>=u&&i>=t&&r>=i}function f(n,t){s(n,t)&&o.point(n,t)}function h(){C.point=p,d&&d.push(m=[]),S=!0,w=!1,b=_=NaN}function g(){v&&(p(y,M),x&&w&&E.rejoin(),v.push(E.buffer())),C.point=f,w&&o.lineEnd()}function p(n,t){n=Math.max(-Fo,Math.min(Fo,n)),t=Math.max(-Fo,Math.min(Fo,t));var e=s(n,t);if(d&&m.push([n,t]),S)y=n,M=t,x=e,S=!1,e&&(o.lineStart(),o.point(n,t));else if(e&&w)o.point(n,t);else{var r={a:{x:b,y:_},b:{x:n,y:t}};A(r)?(w||(o.lineStart(),o.point(r.a.x,r.a.y)),o.point(r.b.x,r.b.y),e||o.lineEnd(),k=!1):e&&(o.lineStart(),o.point(n,t),k=!1)}b=n,_=t,w=e}var v,d,m,y,M,x,b,_,w,S,k,N=o,E=Pt(),A=Yt(n,t,e,r),C={point:f,lineStart:h,lineEnd:g,polygonStart:function(){o=E,v=[],d=[],k=!0},polygonEnd:function(){o=N,v=oa.merge(v);var t=l([n,r]),e=k&&t,u=v.length;(e||u)&&(o.polygonStart(),e&&(o.lineStart(),c(null,null,1,o),o.lineEnd()),u&&Lt(v,i,t,c,o),o.polygonEnd()),v=d=m=null}};return C}}function Vt(n){var t=0,e=ja/3,r=oe(n),u=r(t,e);return u.parallels=function(n){return arguments.length?r(t=n[0]*ja/180,e=n[1]*ja/180):[t/ja*180,e/ja*180]},u}function Xt(n,t){function e(n,t){var e=Math.sqrt(i-2*u*Math.sin(t))/u;return[e*Math.sin(n*=u),a-e*Math.cos(n)]}var r=Math.sin(n),u=(r+Math.sin(t))/2,i=1+r*(2*u-r),a=Math.sqrt(i)/u;return e.invert=function(n,t){var e=a-t;return[Math.atan2(n,e)/u,tn((i-(n*n+e*e)*u*u)/(2*u))]},e}function $t(){function n(n,t){Oo+=u*n-r*t,r=n,u=t}var t,e,r,u;Xo.point=function(i,a){Xo.point=n,t=r=i,e=u=a},Xo.lineEnd=function(){n(t,e)}}function Bt(n,t){Io>n&&(Io=n),n>Zo&&(Zo=n),Yo>t&&(Yo=t),t>Vo&&(Vo=t)}function Wt(){function n(n,t){a.push(\\\"M\\\",n,\\\",\\\",t,i)}function t(n,t){a.push(\\\"M\\\",n,\\\",\\\",t),o.point=e}function e(n,t){a.push(\\\"L\\\",n,\\\",\\\",t)}function r(){o.point=n}function u(){a.push(\\\"Z\\\")}var i=Jt(4.5),a=[],o={point:n,lineStart:function(){o.point=t},lineEnd:r,polygonStart:function(){o.lineEnd=u},polygonEnd:function(){o.lineEnd=r,o.point=n},pointRadius:function(n){return i=Jt(n),o},result:function(){if(a.length){var n=a.join(\\\"\\\");return a=[],n}}};return o}function Jt(n){return\\\"m0,\\\"+n+\\\"a\\\"+n+\\\",\\\"+n+\\\" 0 1,1 0,\\\"+-2*n+\\\"a\\\"+n+\\\",\\\"+n+\\\" 0 1,1 0,\\\"+2*n+\\\"z\\\"}function Gt(n,t){Ao+=n,Co+=t,++zo}function Kt(){function n(n,r){var u=n-t,i=r-e,a=Math.sqrt(u*u+i*i);Lo+=a*(t+n)/2,qo+=a*(e+r)/2,To+=a,Gt(t=n,e=r)}var t,e;Bo.point=function(r,u){Bo.point=n,Gt(t=r,e=u)}}function Qt(){Bo.point=Gt}function ne(){function n(n,t){var e=n-r,i=t-u,a=Math.sqrt(e*e+i*i);Lo+=a*(r+n)/2,qo+=a*(u+t)/2,To+=a,a=u*n-r*t,Ro+=a*(r+n),Do+=a*(u+t),Po+=3*a,Gt(r=n,u=t)}var t,e,r,u;Bo.point=function(i,a){Bo.point=n,Gt(t=r=i,e=u=a)},Bo.lineEnd=function(){n(t,e)}}function te(n){function t(t,e){n.moveTo(t+a,e),n.arc(t,e,a,0,Ua)}function e(t,e){n.moveTo(t,e),o.point=r}function r(t,e){n.lineTo(t,e)}function u(){o.point=t}function i(){n.closePath()}var a=4.5,o={point:t,lineStart:function(){o.point=e},lineEnd:u,polygonStart:function(){o.lineEnd=i},polygonEnd:function(){o.lineEnd=u,o.point=t},pointRadius:function(n){return a=n,o},result:b};return o}function ee(n){function t(n){return(o?r:e)(n)}function e(t){return ie(t,function(e,r){e=n(e,r),t.point(e[0],e[1])})}function r(t){function e(e,r){e=n(e,r),t.point(e[0],e[1])}function r(){M=NaN,S.point=i,t.lineStart()}function i(e,r){var i=dt([e,r]),a=n(e,r);u(M,x,y,b,_,w,M=a[0],x=a[1],y=e,b=i[0],_=i[1],w=i[2],o,t),t.point(M,x)}function a(){S.point=e,t.lineEnd()}function l(){r(),S.point=c,S.lineEnd=s}function c(n,t){\\n i(f=n,h=t),g=M,p=x,v=b,d=_,m=w,S.point=i}function s(){u(M,x,y,b,_,w,g,p,f,v,d,m,o,t),S.lineEnd=a,a()}var f,h,g,p,v,d,m,y,M,x,b,_,w,S={point:e,lineStart:r,lineEnd:a,polygonStart:function(){t.polygonStart(),S.lineStart=l},polygonEnd:function(){t.polygonEnd(),S.lineStart=r}};return S}function u(t,e,r,o,l,c,s,f,h,g,p,v,d,m){var y=s-t,M=f-e,x=y*y+M*M;if(x>4*i&&d--){var b=o+g,_=l+p,w=c+v,S=Math.sqrt(b*b+_*_+w*w),k=Math.asin(w/=S),N=Ma(Ma(w)-1)i||Ma((y*z+M*L)/x-.5)>.3||a>o*g+l*p+c*v)&&(u(t,e,r,o,l,c,A,C,N,b/=S,_/=S,w,d,m),m.point(A,C),u(A,C,N,b,_,w,s,f,h,g,p,v,d,m))}}var i=.5,a=Math.cos(30*Oa),o=16;return t.precision=function(n){return arguments.length?(o=(i=n*n)>0&&16,t):Math.sqrt(i)},t}function re(n){var t=ee(function(t,e){return n([t*Ia,e*Ia])});return function(n){return le(t(n))}}function ue(n){this.stream=n}function ie(n,t){return{point:t,sphere:function(){n.sphere()},lineStart:function(){n.lineStart()},lineEnd:function(){n.lineEnd()},polygonStart:function(){n.polygonStart()},polygonEnd:function(){n.polygonEnd()}}}function ae(n){return oe(function(){return n})()}function oe(n){function t(n){return n=o(n[0]*Oa,n[1]*Oa),[n[0]*h+l,c-n[1]*h]}function e(n){return n=o.invert((n[0]-l)/h,(c-n[1])/h),n&&[n[0]*Ia,n[1]*Ia]}function r(){o=Ct(a=fe(m,M,x),i);var n=i(v,d);return l=g-n[0]*h,c=p+n[1]*h,u()}function u(){return s&&(s.valid=!1,s=null),t}var i,a,o,l,c,s,f=ee(function(n,t){return n=i(n,t),[n[0]*h+l,c-n[1]*h]}),h=150,g=480,p=250,v=0,d=0,m=0,M=0,x=0,b=Uo,_=y,w=null,S=null;return t.stream=function(n){return s&&(s.valid=!1),s=le(b(a,f(_(n)))),s.valid=!0,s},t.clipAngle=function(n){return arguments.length?(b=null==n?(w=n,Uo):It((w=+n)*Oa),u()):w},t.clipExtent=function(n){return arguments.length?(S=n,_=n?Zt(n[0][0],n[0][1],n[1][0],n[1][1]):y,u()):S},t.scale=function(n){return arguments.length?(h=+n,r()):h},t.translate=function(n){return arguments.length?(g=+n[0],p=+n[1],r()):[g,p]},t.center=function(n){return arguments.length?(v=n[0]%360*Oa,d=n[1]%360*Oa,r()):[v*Ia,d*Ia]},t.rotate=function(n){return arguments.length?(m=n[0]%360*Oa,M=n[1]%360*Oa,x=n.length>2?n[2]%360*Oa:0,r()):[m*Ia,M*Ia,x*Ia]},oa.rebind(t,f,\\\"precision\\\"),function(){return i=n.apply(this,arguments),t.invert=i.invert&&e,r()}}function le(n){return ie(n,function(t,e){n.point(t*Oa,e*Oa)})}function ce(n,t){return[n,t]}function se(n,t){return[n>ja?n-Ua:-ja>n?n+Ua:n,t]}function fe(n,t,e){return n?t||e?Ct(ge(n),pe(t,e)):ge(n):t||e?pe(t,e):se}function he(n){return function(t,e){return t+=n,[t>ja?t-Ua:-ja>t?t+Ua:t,e]}}function ge(n){var t=he(n);return t.invert=he(-n),t}function pe(n,t){function e(n,t){var e=Math.cos(t),o=Math.cos(n)*e,l=Math.sin(n)*e,c=Math.sin(t),s=c*r+o*u;return[Math.atan2(l*i-s*a,o*r-c*u),tn(s*i+l*a)]}var r=Math.cos(n),u=Math.sin(n),i=Math.cos(t),a=Math.sin(t);return e.invert=function(n,t){var e=Math.cos(t),o=Math.cos(n)*e,l=Math.sin(n)*e,c=Math.sin(t),s=c*i-l*a;return[Math.atan2(l*i+c*a,o*r+s*u),tn(s*r-o*u)]},e}function ve(n,t){var e=Math.cos(n),r=Math.sin(n);return function(u,i,a,o){var l=a*t;null!=u?(u=de(e,u),i=de(e,i),(a>0?i>u:u>i)&&(u+=a*Ua)):(u=n+a*Ua,i=n-.5*l);for(var c,s=u;a>0?s>i:i>s;s-=l)o.point((c=_t([e,-r*Math.cos(s),-r*Math.sin(s)]))[0],c[1])}}function de(n,t){var e=dt(t);e[0]-=n,bt(e);var r=nn(-e[1]);return((-e[2]<0?-r:r)+2*Math.PI-Da)%(2*Math.PI)}function me(n,t,e){var r=oa.range(n,t-Da,e).concat(t);return function(n){return r.map(function(t){return[n,t]})}}function ye(n,t,e){var r=oa.range(n,t-Da,e).concat(t);return function(n){return r.map(function(t){return[t,n]})}}function Me(n){return n.source}function xe(n){return n.target}function be(n,t,e,r){var u=Math.cos(t),i=Math.sin(t),a=Math.cos(r),o=Math.sin(r),l=u*Math.cos(n),c=u*Math.sin(n),s=a*Math.cos(e),f=a*Math.sin(e),h=2*Math.asin(Math.sqrt(an(r-t)+u*a*an(e-n))),g=1/Math.sin(h),p=h?function(n){var t=Math.sin(n*=h)*g,e=Math.sin(h-n)*g,r=e*l+t*s,u=e*c+t*f,a=e*i+t*o;return[Math.atan2(u,r)*Ia,Math.atan2(a,Math.sqrt(r*r+u*u))*Ia]}:function(){return[n*Ia,t*Ia]};return p.distance=h,p}function _e(){function n(n,u){var i=Math.sin(u*=Oa),a=Math.cos(u),o=Ma((n*=Oa)-t),l=Math.cos(o);Wo+=Math.atan2(Math.sqrt((o=a*Math.sin(o))*o+(o=r*i-e*a*l)*o),e*i+r*a*l),t=n,e=i,r=a}var t,e,r;Jo.point=function(u,i){t=u*Oa,e=Math.sin(i*=Oa),r=Math.cos(i),Jo.point=n},Jo.lineEnd=function(){Jo.point=Jo.lineEnd=b}}function we(n,t){function e(t,e){var r=Math.cos(t),u=Math.cos(e),i=n(r*u);return[i*u*Math.sin(t),i*Math.sin(e)]}return e.invert=function(n,e){var r=Math.sqrt(n*n+e*e),u=t(r),i=Math.sin(u),a=Math.cos(u);return[Math.atan2(n*i,r*a),Math.asin(r&&e*i/r)]},e}function Se(n,t){function e(n,t){a>0?-Ha+Da>t&&(t=-Ha+Da):t>Ha-Da&&(t=Ha-Da);var e=a/Math.pow(u(t),i);return[e*Math.sin(i*n),a-e*Math.cos(i*n)]}var r=Math.cos(n),u=function(n){return Math.tan(ja/4+n/2)},i=n===t?Math.sin(n):Math.log(r/Math.cos(t))/Math.log(u(t)/u(n)),a=r*Math.pow(u(n),i)/i;return i?(e.invert=function(n,t){var e=a-t,r=K(i)*Math.sqrt(n*n+e*e);return[Math.atan2(n,e)/i,2*Math.atan(Math.pow(a/r,1/i))-Ha]},e):Ne}function ke(n,t){function e(n,t){var e=i-t;return[e*Math.sin(u*n),i-e*Math.cos(u*n)]}var r=Math.cos(n),u=n===t?Math.sin(n):(r-Math.cos(t))/(t-n),i=r/u+n;return Ma(u)u;u++){for(;r>1&&Q(n[e[r-2]],n[e[r-1]],n[u])<=0;)--r;e[r++]=u}return e.slice(0,r)}function qe(n,t){return n[0]-t[0]||n[1]-t[1]}function Te(n,t,e){return(e[0]-t[0])*(n[1]-t[1])<(e[1]-t[1])*(n[0]-t[0])}function Re(n,t,e,r){var u=n[0],i=e[0],a=t[0]-u,o=r[0]-i,l=n[1],c=e[1],s=t[1]-l,f=r[1]-c,h=(o*(l-c)-f*(u-i))/(f*a-o*s);return[u+h*a,l+h*s]}function De(n){var t=n[0],e=n[n.length-1];return!(t[0]-e[0]||t[1]-e[1])}function Pe(){rr(this),this.edge=this.site=this.circle=null}function je(n){var t=ll.pop()||new Pe;return t.site=n,t}function Ue(n){Be(n),il.remove(n),ll.push(n),rr(n)}function Fe(n){var t=n.circle,e=t.x,r=t.cy,u={x:e,y:r},i=n.P,a=n.N,o=[n];Ue(n);for(var l=i;l.circle&&Ma(e-l.circle.x)s;++s)c=o[s],l=o[s-1],nr(c.edge,l.site,c.site,u);l=o[0],c=o[f-1],c.edge=Ke(l.site,c.site,null,u),$e(l),$e(c)}function He(n){for(var t,e,r,u,i=n.x,a=n.y,o=il._;o;)if(r=Oe(o,a)-i,r>Da)o=o.L;else{if(u=i-Ie(o,a),!(u>Da)){r>-Da?(t=o.P,e=o):u>-Da?(t=o,e=o.N):t=e=o;break}if(!o.R){t=o;break}o=o.R}var l=je(n);if(il.insert(t,l),t||e){if(t===e)return Be(t),e=je(t.site),il.insert(l,e),l.edge=e.edge=Ke(t.site,l.site),$e(t),void $e(e);if(!e)return void(l.edge=Ke(t.site,l.site));Be(t),Be(e);var c=t.site,s=c.x,f=c.y,h=n.x-s,g=n.y-f,p=e.site,v=p.x-s,d=p.y-f,m=2*(h*d-g*v),y=h*h+g*g,M=v*v+d*d,x={x:(d*y-g*M)/m+s,y:(h*M-v*y)/m+f};nr(e.edge,c,p,x),l.edge=Ke(c,n,null,x),e.edge=Ke(n,p,null,x),$e(t),$e(e)}}function Oe(n,t){var e=n.site,r=e.x,u=e.y,i=u-t;if(!i)return r;var a=n.P;if(!a)return-(1/0);e=a.site;var o=e.x,l=e.y,c=l-t;if(!c)return o;var s=o-r,f=1/i-1/c,h=s/c;return f?(-h+Math.sqrt(h*h-2*f*(s*s/(-2*c)-l+c/2+u-i/2)))/f+r:(r+o)/2}function Ie(n,t){var e=n.N;if(e)return Oe(e,t);var r=n.site;return r.y===t?r.x:1/0}function Ye(n){this.site=n,this.edges=[]}function Ze(n){for(var t,e,r,u,i,a,o,l,c,s,f=n[0][0],h=n[1][0],g=n[0][1],p=n[1][1],v=ul,d=v.length;d--;)if(i=v[d],i&&i.prepare())for(o=i.edges,l=o.length,a=0;l>a;)s=o[a].end(),r=s.x,u=s.y,c=o[++a%l].start(),t=c.x,e=c.y,(Ma(r-t)>Da||Ma(u-e)>Da)&&(o.splice(a,0,new tr(Qe(i.site,s,Ma(r-f)Da?{x:f,y:Ma(t-f)Da?{x:Ma(e-p)Da?{x:h,y:Ma(t-h)Da?{x:Ma(e-g)=-Pa)){var g=l*l+c*c,p=s*s+f*f,v=(f*g-c*p)/h,d=(l*p-s*g)/h,f=d+o,m=cl.pop()||new Xe;m.arc=n,m.site=u,m.x=v+a,m.y=f+Math.sqrt(v*v+d*d),m.cy=f,n.circle=m;for(var y=null,M=ol._;M;)if(m.yd||d>=o)return;if(h>p){if(i){if(i.y>=c)return}else i={x:d,y:l};e={x:d,y:c}}else{if(i){if(i.yr||r>1)if(h>p){if(i){if(i.y>=c)return}else i={x:(l-u)/r,y:l};e={x:(c-u)/r,y:c}}else{if(i){if(i.yg){if(i){if(i.x>=o)return}else i={x:a,y:r*a+u};e={x:o,y:r*o+u}}else{if(i){if(i.xi||f>a||r>h||u>g)){if(p=n.point){var p,v=t-n.x,d=e-n.y,m=v*v+d*d;if(l>m){var y=Math.sqrt(l=m);r=t-y,u=e-y,i=t+y,a=e+y,o=p}}for(var M=n.nodes,x=.5*(s+h),b=.5*(f+g),_=t>=x,w=e>=b,S=w<<1|_,k=S+4;k>S;++S)if(n=M[3&S])switch(3&S){case 0:c(n,s,f,x,b);break;case 1:c(n,x,f,h,b);break;case 2:c(n,s,b,x,g);break;case 3:c(n,x,b,h,g)}}}(n,r,u,i,a),o}function vr(n,t){n=oa.rgb(n),t=oa.rgb(t);var e=n.r,r=n.g,u=n.b,i=t.r-e,a=t.g-r,o=t.b-u;return function(n){return\\\"#\\\"+bn(Math.round(e+i*n))+bn(Math.round(r+a*n))+bn(Math.round(u+o*n))}}function dr(n,t){var e,r={},u={};for(e in n)e in t?r[e]=Mr(n[e],t[e]):u[e]=n[e];for(e in t)e in n||(u[e]=t[e]);return function(n){for(e in r)u[e]=r[e](n);return u}}function mr(n,t){return n=+n,t=+t,function(e){return n*(1-e)+t*e}}function yr(n,t){var e,r,u,i=fl.lastIndex=hl.lastIndex=0,a=-1,o=[],l=[];for(n+=\\\"\\\",t+=\\\"\\\";(e=fl.exec(n))&&(r=hl.exec(t));)(u=r.index)>i&&(u=t.slice(i,u),o[a]?o[a]+=u:o[++a]=u),(e=e[0])===(r=r[0])?o[a]?o[a]+=r:o[++a]=r:(o[++a]=null,l.push({i:a,x:mr(e,r)})),i=hl.lastIndex;return ir;++r)o[(e=l[r]).i]=e.x(n);return o.join(\\\"\\\")})}function Mr(n,t){for(var e,r=oa.interpolators.length;--r>=0&&!(e=oa.interpolators[r](n,t)););return e}function xr(n,t){var e,r=[],u=[],i=n.length,a=t.length,o=Math.min(n.length,t.length);for(e=0;o>e;++e)r.push(Mr(n[e],t[e]));for(;i>e;++e)u[e]=n[e];for(;a>e;++e)u[e]=t[e];return function(n){for(e=0;o>e;++e)u[e]=r[e](n);return u}}function br(n){return function(t){return 0>=t?0:t>=1?1:n(t)}}function _r(n){return function(t){return 1-n(1-t)}}function wr(n){return function(t){return.5*(.5>t?n(2*t):2-n(2-2*t))}}function Sr(n){return n*n}function kr(n){return n*n*n}function Nr(n){if(0>=n)return 0;if(n>=1)return 1;var t=n*n,e=t*n;return 4*(.5>n?e:3*(n-t)+e-.75)}function Er(n){return function(t){return Math.pow(t,n)}}function Ar(n){return 1-Math.cos(n*Ha)}function Cr(n){return Math.pow(2,10*(n-1))}function zr(n){return 1-Math.sqrt(1-n*n)}function Lr(n,t){var e;return arguments.length<2&&(t=.45),arguments.length?e=t/Ua*Math.asin(1/n):(n=1,e=t/4),function(r){return 1+n*Math.pow(2,-10*r)*Math.sin((r-e)*Ua/t)}}function qr(n){return n||(n=1.70158),function(t){return t*t*((n+1)*t-n)}}function Tr(n){return 1/2.75>n?7.5625*n*n:2/2.75>n?7.5625*(n-=1.5/2.75)*n+.75:2.5/2.75>n?7.5625*(n-=2.25/2.75)*n+.9375:7.5625*(n-=2.625/2.75)*n+.984375}function Rr(n,t){n=oa.hcl(n),t=oa.hcl(t);var e=n.h,r=n.c,u=n.l,i=t.h-e,a=t.c-r,o=t.l-u;return isNaN(a)&&(a=0,r=isNaN(r)?t.c:r),isNaN(i)?(i=0,e=isNaN(e)?t.h:e):i>180?i-=360:-180>i&&(i+=360),function(n){return fn(e+i*n,r+a*n,u+o*n)+\\\"\\\"}}function Dr(n,t){n=oa.hsl(n),t=oa.hsl(t);var e=n.h,r=n.s,u=n.l,i=t.h-e,a=t.s-r,o=t.l-u;return isNaN(a)&&(a=0,r=isNaN(r)?t.s:r),isNaN(i)?(i=0,e=isNaN(e)?t.h:e):i>180?i-=360:-180>i&&(i+=360),function(n){return cn(e+i*n,r+a*n,u+o*n)+\\\"\\\"}}function Pr(n,t){n=oa.lab(n),t=oa.lab(t);var e=n.l,r=n.a,u=n.b,i=t.l-e,a=t.a-r,o=t.b-u;return function(n){return gn(e+i*n,r+a*n,u+o*n)+\\\"\\\"}}function jr(n,t){return t-=n,function(e){return Math.round(n+t*e)}}function Ur(n){var t=[n.a,n.b],e=[n.c,n.d],r=Hr(t),u=Fr(t,e),i=Hr(Or(e,t,-u))||0;t[0]*e[1]180?t+=360:t-n>180&&(n+=360),r.push({i:e.push(Ir(e)+\\\"rotate(\\\",null,\\\")\\\")-2,x:mr(n,t)})):t&&e.push(Ir(e)+\\\"rotate(\\\"+t+\\\")\\\")}function Vr(n,t,e,r){n!==t?r.push({i:e.push(Ir(e)+\\\"skewX(\\\",null,\\\")\\\")-2,x:mr(n,t)}):t&&e.push(Ir(e)+\\\"skewX(\\\"+t+\\\")\\\")}function Xr(n,t,e,r){if(n[0]!==t[0]||n[1]!==t[1]){var u=e.push(Ir(e)+\\\"scale(\\\",null,\\\",\\\",null,\\\")\\\");r.push({i:u-4,x:mr(n[0],t[0])},{i:u-2,x:mr(n[1],t[1])})}else(1!==t[0]||1!==t[1])&&e.push(Ir(e)+\\\"scale(\\\"+t+\\\")\\\")}function $r(n,t){var e=[],r=[];return n=oa.transform(n),t=oa.transform(t),Yr(n.translate,t.translate,e,r),Zr(n.rotate,t.rotate,e,r),Vr(n.skew,t.skew,e,r),Xr(n.scale,t.scale,e,r),n=t=null,function(n){for(var t,u=-1,i=r.length;++u=0;)e.push(u[r])}function au(n,t){for(var e=[n],r=[];null!=(n=e.pop());)if(r.push(n),(i=n.children)&&(u=i.length))for(var u,i,a=-1;++ae;++e)(t=n[e][1])>u&&(r=e,u=t);return r}function mu(n){return n.reduce(yu,0)}function yu(n,t){return n+t[1]}function Mu(n,t){return xu(n,Math.ceil(Math.log(t.length)/Math.LN2+1))}function xu(n,t){for(var e=-1,r=+n[0],u=(n[1]-r)/t,i=[];++e<=t;)i[e]=u*e+r;return i}function bu(n){return[oa.min(n),oa.max(n)]}function _u(n,t){return n.value-t.value}function wu(n,t){var e=n._pack_next;n._pack_next=t,t._pack_prev=n,t._pack_next=e,e._pack_prev=t}function Su(n,t){n._pack_next=t,t._pack_prev=n}function ku(n,t){var e=t.x-n.x,r=t.y-n.y,u=n.r+t.r;return.999*u*u>e*e+r*r}function Nu(n){function t(n){s=Math.min(n.x-n.r,s),f=Math.max(n.x+n.r,f),h=Math.min(n.y-n.r,h),g=Math.max(n.y+n.r,g)}if((e=n.children)&&(c=e.length)){var e,r,u,i,a,o,l,c,s=1/0,f=-(1/0),h=1/0,g=-(1/0);if(e.forEach(Eu),r=e[0],r.x=-r.r,r.y=0,t(r),c>1&&(u=e[1],u.x=u.r,u.y=0,t(u),c>2))for(i=e[2],zu(r,u,i),t(i),wu(r,i),r._pack_prev=i,wu(i,u),u=r._pack_next,a=3;c>a;a++){zu(r,u,i=e[a]);var p=0,v=1,d=1;for(o=u._pack_next;o!==u;o=o._pack_next,v++)if(ku(o,i)){p=1;break}if(1==p)for(l=r._pack_prev;l!==o._pack_prev&&!ku(l,i);l=l._pack_prev,d++);p?(d>v||v==d&&u.ra;a++)i=e[a],i.x-=m,i.y-=y,M=Math.max(M,i.r+Math.sqrt(i.x*i.x+i.y*i.y));n.r=M,e.forEach(Au)}}function Eu(n){n._pack_next=n._pack_prev=n}function Au(n){delete n._pack_next,delete n._pack_prev}function Cu(n,t,e,r){var u=n.children;if(n.x=t+=r*n.x,n.y=e+=r*n.y,n.r*=r,u)for(var i=-1,a=u.length;++i=0;)t=u[i],t.z+=e,t.m+=e,e+=t.s+(r+=t.c)}function Pu(n,t,e){return n.a.parent===t.parent?n.a:e}function ju(n){return 1+oa.max(n,function(n){return n.y})}function Uu(n){return n.reduce(function(n,t){return n+t.x},0)/n.length}function Fu(n){var t=n.children;return t&&t.length?Fu(t[0]):n}function Hu(n){var t,e=n.children;return e&&(t=e.length)?Hu(e[t-1]):n}function Ou(n){return{x:n.x,y:n.y,dx:n.dx,dy:n.dy}}function Iu(n,t){var e=n.x+t[3],r=n.y+t[0],u=n.dx-t[1]-t[3],i=n.dy-t[0]-t[2];return 0>u&&(e+=u/2,u=0),0>i&&(r+=i/2,i=0),{x:e,y:r,dx:u,dy:i}}function Yu(n){var t=n[0],e=n[n.length-1];return e>t?[t,e]:[e,t]}function Zu(n){return n.rangeExtent?n.rangeExtent():Yu(n.range())}function Vu(n,t,e,r){var u=e(n[0],n[1]),i=r(t[0],t[1]);return function(n){return i(u(n))}}function Xu(n,t){var e,r=0,u=n.length-1,i=n[r],a=n[u];return i>a&&(e=r,r=u,u=e,e=i,i=a,a=e),n[r]=t.floor(i),n[u]=t.ceil(a),n}function $u(n){return n?{floor:function(t){return Math.floor(t/n)*n},ceil:function(t){return Math.ceil(t/n)*n}}:wl}function Bu(n,t,e,r){var u=[],i=[],a=0,o=Math.min(n.length,t.length)-1;for(n[o]2?Bu:Vu,l=r?Wr:Br;return a=u(n,t,l,e),o=u(t,n,l,Mr),i}function i(n){return a(n)}var a,o;return i.invert=function(n){return o(n)},i.domain=function(t){return arguments.length?(n=t.map(Number),u()):n},i.range=function(n){return arguments.length?(t=n,u()):t},i.rangeRound=function(n){return i.range(n).interpolate(jr)},i.clamp=function(n){return arguments.length?(r=n,u()):r},i.interpolate=function(n){return arguments.length?(e=n,u()):e},i.ticks=function(t){return Qu(n,t)},i.tickFormat=function(t,e){return ni(n,t,e)},i.nice=function(t){return Gu(n,t),u()},i.copy=function(){return Wu(n,t,e,r)},u()}function Ju(n,t){return oa.rebind(n,t,\\\"range\\\",\\\"rangeRound\\\",\\\"interpolate\\\",\\\"clamp\\\")}function Gu(n,t){return Xu(n,$u(Ku(n,t)[2])),Xu(n,$u(Ku(n,t)[2])),n}function Ku(n,t){null==t&&(t=10);var e=Yu(n),r=e[1]-e[0],u=Math.pow(10,Math.floor(Math.log(r/t)/Math.LN10)),i=t/r*u;return.15>=i?u*=10:.35>=i?u*=5:.75>=i&&(u*=2),e[0]=Math.ceil(e[0]/u)*u,e[1]=Math.floor(e[1]/u)*u+.5*u,e[2]=u,e}function Qu(n,t){return oa.range.apply(oa,Ku(n,t))}function ni(n,t,e){var r=Ku(n,t);if(e){var u=so.exec(e);if(u.shift(),\\\"s\\\"===u[8]){var i=oa.formatPrefix(Math.max(Ma(r[0]),Ma(r[1])));return u[7]||(u[7]=\\\".\\\"+ti(i.scale(r[2]))),u[8]=\\\"f\\\",e=oa.format(u.join(\\\"\\\")),function(n){return e(i.scale(n))+i.symbol}}u[7]||(u[7]=\\\".\\\"+ei(u[8],r)),e=u.join(\\\"\\\")}else e=\\\",.\\\"+ti(r[2])+\\\"f\\\";return oa.format(e)}function ti(n){return-Math.floor(Math.log(n)/Math.LN10+.01)}function ei(n,t){var e=ti(t[2]);return n in Sl?Math.abs(e-ti(Math.max(Ma(t[0]),Ma(t[1]))))+ +(\\\"e\\\"!==n):e-2*(\\\"%\\\"===n)}function ri(n,t,e,r){function u(n){return(e?Math.log(0>n?0:n):-Math.log(n>0?0:-n))/Math.log(t)}function i(n){return e?Math.pow(t,n):-Math.pow(t,-n)}function a(t){return n(u(t))}return a.invert=function(t){return i(n.invert(t))},a.domain=function(t){return arguments.length?(e=t[0]>=0,n.domain((r=t.map(Number)).map(u)),a):r},a.base=function(e){return arguments.length?(t=+e,n.domain(r.map(u)),a):t},a.nice=function(){var t=Xu(r.map(u),e?Math:Nl);return n.domain(t),r=t.map(i),a},a.ticks=function(){var n=Yu(r),a=[],o=n[0],l=n[1],c=Math.floor(u(o)),s=Math.ceil(u(l)),f=t%1?2:t;if(isFinite(s-c)){if(e){for(;s>c;c++)for(var h=1;f>h;h++)a.push(i(c)*h);a.push(i(c))}else for(a.push(i(c));c++0;h--)a.push(i(c)*h);for(c=0;a[c]l;s--);a=a.slice(c,s)}return a},a.tickFormat=function(n,e){if(!arguments.length)return kl;arguments.length<2?e=kl:\\\"function\\\"!=typeof e&&(e=oa.format(e));var r=Math.max(1,t*n/a.ticks().length);return function(n){var a=n/i(Math.round(u(n)));return t-.5>a*t&&(a*=t),r>=a?e(n):\\\"\\\"}},a.copy=function(){return ri(n.copy(),t,e,r)},Ju(a,n)}function ui(n,t,e){function r(t){return n(u(t))}var u=ii(t),i=ii(1/t);return r.invert=function(t){return i(n.invert(t))},r.domain=function(t){return arguments.length?(n.domain((e=t.map(Number)).map(u)),r):e},r.ticks=function(n){return Qu(e,n)},r.tickFormat=function(n,t){return ni(e,n,t)},r.nice=function(n){return r.domain(Gu(e,n))},r.exponent=function(a){return arguments.length?(u=ii(t=a),i=ii(1/t),n.domain(e.map(u)),r):t},r.copy=function(){return ui(n.copy(),t,e)},Ju(r,n)}function ii(n){return function(t){return 0>t?-Math.pow(-t,n):Math.pow(t,n)}}function ai(n,t){function e(e){return i[((u.get(e)||(\\\"range\\\"===t.t?u.set(e,n.push(e)):NaN))-1)%i.length]}function r(t,e){return oa.range(n.length).map(function(n){return t+e*n})}var u,i,a;return e.domain=function(r){if(!arguments.length)return n;n=[],u=new c;for(var i,a=-1,o=r.length;++ae?[NaN,NaN]:[e>0?o[e-1]:n[0],et?NaN:t/i+n,[t,t+1/i]},r.copy=function(){return li(n,t,e)},u()}function ci(n,t){function e(e){return e>=e?t[oa.bisect(n,e)]:void 0}return e.domain=function(t){return arguments.length?(n=t,e):n},e.range=function(n){return arguments.length?(t=n,e):t},e.invertExtent=function(e){return e=t.indexOf(e),[n[e-1],n[e]]},e.copy=function(){return ci(n,t)},e}function si(n){function t(n){return+n}return t.invert=t,t.domain=t.range=function(e){return arguments.length?(n=e.map(t),t):n},t.ticks=function(t){return Qu(n,t)},t.tickFormat=function(t,e){return ni(n,t,e)},t.copy=function(){return si(n)},t}function fi(){return 0}function hi(n){return n.innerRadius}function gi(n){return n.outerRadius}function pi(n){return n.startAngle}function vi(n){return n.endAngle}function di(n){return n&&n.padAngle}function mi(n,t,e,r){return(n-e)*t-(t-r)*n>0?0:1}function yi(n,t,e,r,u){var i=n[0]-t[0],a=n[1]-t[1],o=(u?r:-r)/Math.sqrt(i*i+a*a),l=o*a,c=-o*i,s=n[0]+l,f=n[1]+c,h=t[0]+l,g=t[1]+c,p=(s+h)/2,v=(f+g)/2,d=h-s,m=g-f,y=d*d+m*m,M=e-r,x=s*g-h*f,b=(0>m?-1:1)*Math.sqrt(Math.max(0,M*M*y-x*x)),_=(x*m-d*b)/y,w=(-x*d-m*b)/y,S=(x*m+d*b)/y,k=(-x*d+m*b)/y,N=_-p,E=w-v,A=S-p,C=k-v;return N*N+E*E>A*A+C*C&&(_=S,w=k),[[_-l,w-c],[_*e/M,w*e/M]]}function Mi(n){function t(t){function a(){c.push(\\\"M\\\",i(n(s),o))}for(var l,c=[],s=[],f=-1,h=t.length,g=En(e),p=En(r);++f1?n.join(\\\"L\\\"):n+\\\"Z\\\"}function bi(n){return n.join(\\\"L\\\")+\\\"Z\\\"}function _i(n){for(var t=0,e=n.length,r=n[0],u=[r[0],\\\",\\\",r[1]];++t1&&u.push(\\\"H\\\",r[0]),u.join(\\\"\\\")}function wi(n){for(var t=0,e=n.length,r=n[0],u=[r[0],\\\",\\\",r[1]];++t1){o=t[1],i=n[l],l++,r+=\\\"C\\\"+(u[0]+a[0])+\\\",\\\"+(u[1]+a[1])+\\\",\\\"+(i[0]-o[0])+\\\",\\\"+(i[1]-o[1])+\\\",\\\"+i[0]+\\\",\\\"+i[1];for(var c=2;c9&&(u=3*t/Math.sqrt(u),a[o]=u*e,a[o+1]=u*r));for(o=-1;++o<=l;)u=(n[Math.min(l,o+1)][0]-n[Math.max(0,o-1)][0])/(6*(1+a[o]*a[o])),i.push([u||0,a[o]*u||0]);return i}function Fi(n){return n.length<3?xi(n):n[0]+Ai(n,Ui(n))}function Hi(n){for(var t,e,r,u=-1,i=n.length;++u=t?a(n-t):void(s.c=a)}function a(e){var u=p.active,i=p[u];i&&(i.timer.c=null,i.timer.t=NaN,--p.count,delete p[u],i.event&&i.event.interrupt.call(n,n.__data__,i.index));for(var a in p)if(r>+a){var c=p[a];c.timer.c=null,c.timer.t=NaN,--p.count,delete p[a]}s.c=o,qn(function(){return s.c&&o(e||1)&&(s.c=null,s.t=NaN),1},0,l),p.active=r,v.event&&v.event.start.call(n,n.__data__,t),g=[],v.tween.forEach(function(e,r){(r=r.call(n,n.__data__,t))&&g.push(r)}),h=v.ease,f=v.duration}function o(u){for(var i=u/f,a=h(i),o=g.length;o>0;)g[--o].call(n,a);return i>=1?(v.event&&v.event.end.call(n,n.__data__,t),--p.count?delete p[r]:delete n[e],1):void 0}var l,s,f,h,g,p=n[e]||(n[e]={active:0,count:0}),v=p[r];v||(l=u.time,s=qn(i,0,l),v=p[r]={tween:new c,time:l,timer:s,delay:u.delay,duration:u.duration,ease:u.ease,index:t},u=null,++p.count)}function na(n,t,e){n.attr(\\\"transform\\\",function(n){var r=t(n);return\\\"translate(\\\"+(isFinite(r)?r:e(n))+\\\",0)\\\"})}function ta(n,t,e){n.attr(\\\"transform\\\",function(n){var r=t(n);return\\\"translate(0,\\\"+(isFinite(r)?r:e(n))+\\\")\\\"})}function ea(n){return n.toISOString()}function ra(n,t,e){function r(t){return n(t)}function u(n,e){var r=n[1]-n[0],u=r/e,i=oa.bisect(Gl,u);return i==Gl.length?[t.year,Ku(n.map(function(n){return n/31536e6}),e)[2]]:i?t[u/Gl[i-1]1?{floor:function(t){for(;e(t=n.floor(t));)t=ua(t-1);return t},ceil:function(t){for(;e(t=n.ceil(t));)t=ua(+t+1);return t}}:n))},r.ticks=function(n,t){var e=Yu(r.domain()),i=null==n?u(e,10):\\\"number\\\"==typeof n?u(e,n):!n.range&&[{range:n},t];return i&&(n=i[0],t=i[1]),n.range(e[0],ua(+e[1]+1),1>t?1:t)},r.tickFormat=function(){return e},r.copy=function(){return ra(n.copy(),t,e)},Ju(r,n)}function ua(n){return new Date(n)}function ia(n){return JSON.parse(n.responseText)}function aa(n){var t=sa.createRange();return t.selectNode(sa.body),t.createContextualFragment(n.responseText)}var oa={version:\\\"3.5.12\\\"},la=[].slice,ca=function(n){return la.call(n)},sa=this.document;if(sa)try{ca(sa.documentElement.childNodes)[0].nodeType}catch(fa){ca=function(n){for(var t=n.length,e=new Array(t);t--;)e[t]=n[t];return e}}if(Date.now||(Date.now=function(){return+new Date}),sa)try{sa.createElement(\\\"DIV\\\").style.setProperty(\\\"opacity\\\",0,\\\"\\\")}catch(ha){var ga=this.Element.prototype,pa=ga.setAttribute,va=ga.setAttributeNS,da=this.CSSStyleDeclaration.prototype,ma=da.setProperty;ga.setAttribute=function(n,t){pa.call(this,n,t+\\\"\\\")},ga.setAttributeNS=function(n,t,e){va.call(this,n,t,e+\\\"\\\")},da.setProperty=function(n,t,e){ma.call(this,n,t+\\\"\\\",e)}}oa.ascending=e,oa.descending=function(n,t){return n>t?-1:t>n?1:t>=n?0:NaN},oa.min=function(n,t){var e,r,u=-1,i=n.length;if(1===arguments.length){for(;++u=r){e=r;break}for(;++ur&&(e=r)}else{for(;++u=r){e=r;break}for(;++ur&&(e=r)}return e},oa.max=function(n,t){var e,r,u=-1,i=n.length;if(1===arguments.length){for(;++u=r){e=r;break}for(;++ue&&(e=r)}else{for(;++u=r){e=r;break}for(;++ue&&(e=r)}return e},oa.extent=function(n,t){var e,r,u,i=-1,a=n.length;if(1===arguments.length){for(;++i=r){e=u=r;break}for(;++ir&&(e=r),r>u&&(u=r))}else{for(;++i=r){e=u=r;break}for(;++ir&&(e=r),r>u&&(u=r))}return[e,u]},oa.sum=function(n,t){var e,r=0,i=n.length,a=-1;if(1===arguments.length)for(;++a1?l/(s-1):void 0},oa.deviation=function(){var n=oa.variance.apply(this,arguments);return n?Math.sqrt(n):n};var ya=i(e);oa.bisectLeft=ya.left,oa.bisect=oa.bisectRight=ya.right,oa.bisector=function(n){return i(1===n.length?function(t,r){return e(n(t),r)}:n)},oa.shuffle=function(n,t,e){(i=arguments.length)<3&&(e=n.length,2>i&&(t=0));for(var r,u,i=e-t;i;)u=Math.random()*i--|0,r=n[i+t],n[i+t]=n[u+t],n[u+t]=r;return n},oa.permute=function(n,t){for(var e=t.length,r=new Array(e);e--;)r[e]=n[t[e]];return r},oa.pairs=function(n){for(var t,e=0,r=n.length-1,u=n[0],i=new Array(0>r?0:r);r>e;)i[e]=[t=u,u=n[++e]];return i},oa.zip=function(){if(!(r=arguments.length))return[];for(var n=-1,t=oa.min(arguments,a),e=new Array(t);++n=0;)for(r=n[u],t=r.length;--t>=0;)e[--a]=r[t];return e};var Ma=Math.abs;oa.range=function(n,t,e){if(arguments.length<3&&(e=1,arguments.length<2&&(t=n,n=0)),(t-n)/e===1/0)throw new Error(\\\"infinite range\\\");var r,u=[],i=o(Ma(e)),a=-1;if(n*=i,t*=i,e*=i,0>e)for(;(r=n+e*++a)>t;)u.push(r/i);else for(;(r=n+e*++a)=i.length)return r?r.call(u,a):e?a.sort(e):a;for(var l,s,f,h,g=-1,p=a.length,v=i[o++],d=new c;++g=i.length)return n;var r=[],u=a[e++];return n.forEach(function(n,u){r.push({key:n,values:t(u,e)})}),u?r.sort(function(n,t){return u(n.key,t.key)}):r}var e,r,u={},i=[],a=[];return u.map=function(t,e){return n(e,t,0)},u.entries=function(e){return t(n(oa.map,e,0),0)},u.key=function(n){return i.push(n),u},u.sortKeys=function(n){return a[i.length-1]=n,u},u.sortValues=function(n){return e=n,u},u.rollup=function(n){return r=n,u},u},oa.set=function(n){var t=new m;if(n)for(var e=0,r=n.length;r>e;++e)t.add(n[e]);return t},l(m,{has:h,add:function(n){return this._[s(n+=\\\"\\\")]=!0,n},remove:g,values:p,size:v,empty:d,forEach:function(n){for(var t in this._)n.call(this,f(t))}}),oa.behavior={},oa.rebind=function(n,t){for(var e,r=1,u=arguments.length;++r=0&&(r=n.slice(e+1),n=n.slice(0,e)),n)return arguments.length<2?this[n].on(r):this[n].on(r,t);if(2===arguments.length){if(null==t)for(n in this)this.hasOwnProperty(n)&&this[n].on(r,null);return this}},oa.event=null,oa.requote=function(n){return n.replace(wa,\\\"\\\\\\\\$&\\\")};var wa=/[\\\\\\\\\\\\^\\\\$\\\\*\\\\+\\\\?\\\\|\\\\[\\\\]\\\\(\\\\)\\\\.\\\\{\\\\}]/g,Sa={}.__proto__?function(n,t){n.__proto__=t}:function(n,t){for(var e in t)n[e]=t[e]},ka=function(n,t){return t.querySelector(n)},Na=function(n,t){return t.querySelectorAll(n)},Ea=function(n,t){var e=n.matches||n[x(n,\\\"matchesSelector\\\")];return(Ea=function(n,t){return e.call(n,t)})(n,t)};\\\"function\\\"==typeof Sizzle&&(ka=function(n,t){return Sizzle(n,t)[0]||null},Na=Sizzle,Ea=Sizzle.matchesSelector),oa.selection=function(){return oa.select(sa.documentElement)};var Aa=oa.selection.prototype=[];Aa.select=function(n){var t,e,r,u,i=[];n=A(n);for(var a=-1,o=this.length;++a=0&&\\\"xmlns\\\"!==(e=n.slice(0,t))&&(n=n.slice(t+1)),Ca.hasOwnProperty(e)?{space:Ca[e],local:n}:n}},Aa.attr=function(n,t){if(arguments.length<2){if(\\\"string\\\"==typeof n){var e=this.node();return n=oa.ns.qualify(n),n.local?e.getAttributeNS(n.space,n.local):e.getAttribute(n)}for(t in n)this.each(z(t,n[t]));return this}return this.each(z(n,t))},Aa.classed=function(n,t){if(arguments.length<2){if(\\\"string\\\"==typeof n){var e=this.node(),r=(n=T(n)).length,u=-1;if(t=e.classList){for(;++uu){if(\\\"string\\\"!=typeof n){2>u&&(e=\\\"\\\");for(r in n)this.each(P(r,n[r],e));return this}if(2>u){var i=this.node();return t(i).getComputedStyle(i,null).getPropertyValue(n)}r=\\\"\\\"}return this.each(P(n,e,r))},Aa.property=function(n,t){if(arguments.length<2){if(\\\"string\\\"==typeof n)return this.node()[n];for(t in n)this.each(j(t,n[t]));return this}return this.each(j(n,t))},Aa.text=function(n){return arguments.length?this.each(\\\"function\\\"==typeof n?function(){var t=n.apply(this,arguments);this.textContent=null==t?\\\"\\\":t}:null==n?function(){this.textContent=\\\"\\\"}:function(){this.textContent=n}):this.node().textContent},Aa.html=function(n){return arguments.length?this.each(\\\"function\\\"==typeof n?function(){var t=n.apply(this,arguments);this.innerHTML=null==t?\\\"\\\":t}:null==n?function(){this.innerHTML=\\\"\\\"}:function(){this.innerHTML=n}):this.node().innerHTML},Aa.append=function(n){return n=U(n),this.select(function(){return this.appendChild(n.apply(this,arguments))})},Aa.insert=function(n,t){return n=U(n),t=A(t),this.select(function(){return this.insertBefore(n.apply(this,arguments),t.apply(this,arguments)||null)})},Aa.remove=function(){return this.each(F)},Aa.data=function(n,t){function e(n,e){var r,u,i,a=n.length,f=e.length,h=Math.min(a,f),g=new Array(f),p=new Array(f),v=new Array(a);if(t){var d,m=new c,y=new Array(a);for(r=-1;++rr;++r)p[r]=H(e[r]);for(;a>r;++r)v[r]=n[r]}p.update=g,p.parentNode=g.parentNode=v.parentNode=n.parentNode,o.push(p),l.push(g),s.push(v)}var r,u,i=-1,a=this.length;if(!arguments.length){for(n=new Array(a=(r=this[0]).length);++ii;i++){u.push(t=[]),t.parentNode=(e=this[i]).parentNode;for(var o=0,l=e.length;l>o;o++)(r=e[o])&&n.call(r,r.__data__,o,i)&&t.push(r)}return E(u)},Aa.order=function(){for(var n=-1,t=this.length;++n=0;)(e=r[u])&&(i&&i!==e.nextSibling&&i.parentNode.insertBefore(e,i),i=e);return this},Aa.sort=function(n){n=I.apply(this,arguments);for(var t=-1,e=this.length;++tn;n++)for(var e=this[n],r=0,u=e.length;u>r;r++){var i=e[r];if(i)return i}return null},Aa.size=function(){var n=0;return Y(this,function(){++n}),n};var za=[];oa.selection.enter=Z,oa.selection.enter.prototype=za,za.append=Aa.append,za.empty=Aa.empty,za.node=Aa.node,za.call=Aa.call,za.size=Aa.size,za.select=function(n){for(var t,e,r,u,i,a=[],o=-1,l=this.length;++or){if(\\\"string\\\"!=typeof n){2>r&&(t=!1);for(e in n)this.each(X(e,n[e],t));return this}if(2>r)return(r=this.node()[\\\"__on\\\"+n])&&r._;e=!1}return this.each(X(n,t,e))};var La=oa.map({mouseenter:\\\"mouseover\\\",mouseleave:\\\"mouseout\\\"});sa&&La.forEach(function(n){\\\"on\\\"+n in sa&&La.remove(n)});var qa,Ta=0;oa.mouse=function(n){return J(n,k())};var Ra=this.navigator&&/WebKit/.test(this.navigator.userAgent)?-1:0;oa.touch=function(n,t,e){if(arguments.length<3&&(e=t,t=k().changedTouches),t)for(var r,u=0,i=t.length;i>u;++u)if((r=t[u]).identifier===e)return J(n,r)},oa.behavior.drag=function(){function n(){this.on(\\\"mousedown.drag\\\",i).on(\\\"touchstart.drag\\\",a)}function e(n,t,e,i,a){return function(){function o(){var n,e,r=t(h,v);r&&(n=r[0]-M[0],e=r[1]-M[1],p|=n|e,M=r,g({type:\\\"drag\\\",x:r[0]+c[0],y:r[1]+c[1],dx:n,dy:e}))}function l(){t(h,v)&&(m.on(i+d,null).on(a+d,null),y(p),g({type:\\\"dragend\\\"}))}var c,s=this,f=oa.event.target,h=s.parentNode,g=r.of(s,arguments),p=0,v=n(),d=\\\".drag\\\"+(null==v?\\\"\\\":\\\"-\\\"+v),m=oa.select(e(f)).on(i+d,o).on(a+d,l),y=W(f),M=t(h,v);u?(c=u.apply(s,arguments),c=[c.x-M[0],c.y-M[1]]):c=[0,0],g({type:\\\"dragstart\\\"})}}var r=N(n,\\\"drag\\\",\\\"dragstart\\\",\\\"dragend\\\"),u=null,i=e(b,oa.mouse,t,\\\"mousemove\\\",\\\"mouseup\\\"),a=e(G,oa.touch,y,\\\"touchmove\\\",\\\"touchend\\\");return n.origin=function(t){return arguments.length?(u=t,n):u},oa.rebind(n,r,\\\"on\\\")},oa.touches=function(n,t){return arguments.length<2&&(t=k().touches),t?ca(t).map(function(t){var e=J(n,t);return e.identifier=t.identifier,e}):[]};var Da=1e-6,Pa=Da*Da,ja=Math.PI,Ua=2*ja,Fa=Ua-Da,Ha=ja/2,Oa=ja/180,Ia=180/ja,Ya=Math.SQRT2,Za=2,Va=4;oa.interpolateZoom=function(n,t){var e,r,u=n[0],i=n[1],a=n[2],o=t[0],l=t[1],c=t[2],s=o-u,f=l-i,h=s*s+f*f;if(Pa>h)r=Math.log(c/a)/Ya,e=function(n){return[u+n*s,i+n*f,a*Math.exp(Ya*n*r)]};else{var g=Math.sqrt(h),p=(c*c-a*a+Va*h)/(2*a*Za*g),v=(c*c-a*a-Va*h)/(2*c*Za*g),d=Math.log(Math.sqrt(p*p+1)-p),m=Math.log(Math.sqrt(v*v+1)-v);r=(m-d)/Ya,e=function(n){var t=n*r,e=rn(d),o=a/(Za*g)*(e*un(Ya*t+d)-en(d));return[u+o*s,i+o*f,a*e/rn(Ya*t+d)]}}return e.duration=1e3*r,e},oa.behavior.zoom=function(){function n(n){n.on(L,f).on($a+\\\".zoom\\\",g).on(\\\"dblclick.zoom\\\",p).on(R,h)}function e(n){return[(n[0]-k.x)/k.k,(n[1]-k.y)/k.k]}function r(n){return[n[0]*k.k+k.x,n[1]*k.k+k.y]}function u(n){k.k=Math.max(A[0],Math.min(A[1],n))}function i(n,t){t=r(t),k.x+=n[0]-t[0],k.y+=n[1]-t[1]}function a(t,e,r,a){t.__chart__={x:k.x,y:k.y,k:k.k},u(Math.pow(2,a)),i(d=e,r),t=oa.select(t),C>0&&(t=t.transition().duration(C)),t.call(n.event)}function o(){b&&b.domain(x.range().map(function(n){return(n-k.x)/k.k}).map(x.invert)),w&&w.domain(_.range().map(function(n){return(n-k.y)/k.k}).map(_.invert))}function l(n){z++||n({type:\\\"zoomstart\\\"})}function c(n){o(),n({type:\\\"zoom\\\",scale:k.k,translate:[k.x,k.y]})}function s(n){--z||(n({type:\\\"zoomend\\\"}),d=null)}function f(){function n(){o=1,i(oa.mouse(u),h),c(a)}function r(){f.on(q,null).on(T,null),g(o),s(a)}var u=this,a=D.of(u,arguments),o=0,f=oa.select(t(u)).on(q,n).on(T,r),h=e(oa.mouse(u)),g=W(u);Ol.call(u),l(a)}function h(){function n(){var n=oa.touches(p);return g=k.k,n.forEach(function(n){n.identifier in d&&(d[n.identifier]=e(n))}),n}function t(){var t=oa.event.target;oa.select(t).on(x,r).on(b,o),_.push(t);for(var e=oa.event.changedTouches,u=0,i=e.length;i>u;++u)d[e[u].identifier]=null;var l=n(),c=Date.now();if(1===l.length){if(500>c-M){var s=l[0];a(p,s,d[s.identifier],Math.floor(Math.log(k.k)/Math.LN2)+1),S()}M=c}else if(l.length>1){var s=l[0],f=l[1],h=s[0]-f[0],g=s[1]-f[1];m=h*h+g*g}}function r(){var n,t,e,r,a=oa.touches(p);Ol.call(p);for(var o=0,l=a.length;l>o;++o,r=null)if(e=a[o],r=d[e.identifier]){if(t)break;n=e,t=r}if(r){var s=(s=e[0]-n[0])*s+(s=e[1]-n[1])*s,f=m&&Math.sqrt(s/m);n=[(n[0]+e[0])/2,(n[1]+e[1])/2],t=[(t[0]+r[0])/2,(t[1]+r[1])/2],u(f*g)}M=null,i(n,t),c(v)}function o(){if(oa.event.touches.length){for(var t=oa.event.changedTouches,e=0,r=t.length;r>e;++e)delete d[t[e].identifier];for(var u in d)return void n()}oa.selectAll(_).on(y,null),w.on(L,f).on(R,h),N(),s(v)}var g,p=this,v=D.of(p,arguments),d={},m=0,y=\\\".zoom-\\\"+oa.event.changedTouches[0].identifier,x=\\\"touchmove\\\"+y,b=\\\"touchend\\\"+y,_=[],w=oa.select(p),N=W(p);t(),l(v),w.on(L,null).on(R,t)}function g(){var n=D.of(this,arguments);y?clearTimeout(y):(Ol.call(this),v=e(d=m||oa.mouse(this)),l(n)),y=setTimeout(function(){y=null,s(n)},50),S(),u(Math.pow(2,.002*Xa())*k.k),i(d,v),c(n)}function p(){var n=oa.mouse(this),t=Math.log(k.k)/Math.LN2;a(this,n,e(n),oa.event.shiftKey?Math.ceil(t)-1:Math.floor(t)+1)}var v,d,m,y,M,x,b,_,w,k={x:0,y:0,k:1},E=[960,500],A=Ba,C=250,z=0,L=\\\"mousedown.zoom\\\",q=\\\"mousemove.zoom\\\",T=\\\"mouseup.zoom\\\",R=\\\"touchstart.zoom\\\",D=N(n,\\\"zoomstart\\\",\\\"zoom\\\",\\\"zoomend\\\");return $a||($a=\\\"onwheel\\\"in sa?(Xa=function(){return-oa.event.deltaY*(oa.event.deltaMode?120:1)},\\\"wheel\\\"):\\\"onmousewheel\\\"in sa?(Xa=function(){return oa.event.wheelDelta},\\\"mousewheel\\\"):(Xa=function(){return-oa.event.detail},\\\"MozMousePixelScroll\\\")),n.event=function(n){n.each(function(){var n=D.of(this,arguments),t=k;Fl?oa.select(this).transition().each(\\\"start.zoom\\\",function(){k=this.__chart__||{x:0,y:0,k:1},l(n)}).tween(\\\"zoom:zoom\\\",function(){var e=E[0],r=E[1],u=d?d[0]:e/2,i=d?d[1]:r/2,a=oa.interpolateZoom([(u-k.x)/k.k,(i-k.y)/k.k,e/k.k],[(u-t.x)/t.k,(i-t.y)/t.k,e/t.k]);return function(t){var r=a(t),o=e/r[2];this.__chart__=k={x:u-r[0]*o,y:i-r[1]*o,k:o},c(n)}}).each(\\\"interrupt.zoom\\\",function(){s(n)}).each(\\\"end.zoom\\\",function(){s(n)}):(this.__chart__=k,l(n),c(n),s(n))})},n.translate=function(t){return arguments.length?(k={x:+t[0],y:+t[1],k:k.k},o(),n):[k.x,k.y]},n.scale=function(t){return arguments.length?(k={x:k.x,y:k.y,k:null},u(+t),o(),n):k.k},n.scaleExtent=function(t){return arguments.length?(A=null==t?Ba:[+t[0],+t[1]],n):A},n.center=function(t){return arguments.length?(m=t&&[+t[0],+t[1]],n):m},n.size=function(t){return arguments.length?(E=t&&[+t[0],+t[1]],n):E},n.duration=function(t){return arguments.length?(C=+t,n):C},n.x=function(t){return arguments.length?(b=t,x=t.copy(),k={x:0,y:0,k:1},n):b},n.y=function(t){return arguments.length?(w=t,_=t.copy(),k={x:0,y:0,k:1},n):w},oa.rebind(n,D,\\\"on\\\")};var Xa,$a,Ba=[0,1/0];oa.color=on,on.prototype.toString=function(){return this.rgb()+\\\"\\\"},oa.hsl=ln;var Wa=ln.prototype=new on;Wa.brighter=function(n){return n=Math.pow(.7,arguments.length?n:1),new ln(this.h,this.s,this.l/n)},Wa.darker=function(n){return n=Math.pow(.7,arguments.length?n:1),new ln(this.h,this.s,n*this.l)},Wa.rgb=function(){return cn(this.h,this.s,this.l)},oa.hcl=sn;var Ja=sn.prototype=new on;Ja.brighter=function(n){return new sn(this.h,this.c,Math.min(100,this.l+Ga*(arguments.length?n:1)))},Ja.darker=function(n){return new sn(this.h,this.c,Math.max(0,this.l-Ga*(arguments.length?n:1)))},Ja.rgb=function(){return fn(this.h,this.c,this.l).rgb()},oa.lab=hn;var Ga=18,Ka=.95047,Qa=1,no=1.08883,to=hn.prototype=new on;to.brighter=function(n){return new hn(Math.min(100,this.l+Ga*(arguments.length?n:1)),this.a,this.b)},to.darker=function(n){return new hn(Math.max(0,this.l-Ga*(arguments.length?n:1)),this.a,this.b)},to.rgb=function(){return gn(this.l,this.a,this.b)},oa.rgb=yn;var eo=yn.prototype=new on;eo.brighter=function(n){n=Math.pow(.7,arguments.length?n:1);var t=this.r,e=this.g,r=this.b,u=30;return t||e||r?(t&&u>t&&(t=u),e&&u>e&&(e=u),r&&u>r&&(r=u),new yn(Math.min(255,t/n),Math.min(255,e/n),Math.min(255,r/n))):new yn(u,u,u)},eo.darker=function(n){return n=Math.pow(.7,arguments.length?n:1),new yn(n*this.r,n*this.g,n*this.b)},eo.hsl=function(){return wn(this.r,this.g,this.b)},eo.toString=function(){return\\\"#\\\"+bn(this.r)+bn(this.g)+bn(this.b)};var ro=oa.map({aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074});ro.forEach(function(n,t){ro.set(n,Mn(t))}),oa.functor=En,oa.xhr=An(y),oa.dsv=function(n,t){function e(n,e,i){arguments.length<3&&(i=e,e=null);var a=Cn(n,t,null==e?r:u(e),i);return a.row=function(n){return arguments.length?a.response(null==(e=n)?r:u(n)):e},a}function r(n){return e.parse(n.responseText)}function u(n){return function(t){return e.parse(t.responseText,n)}}function i(t){return t.map(a).join(n)}function a(n){return o.test(n)?'\\\"'+n.replace(/\\\\\\\"/g,'\\\"\\\"')+'\\\"':n}var o=new RegExp('[\\\"'+n+\\\"\\\\n]\\\"),l=n.charCodeAt(0);return e.parse=function(n,t){var r;return e.parseRows(n,function(n,e){if(r)return r(n,e-1);var u=new Function(\\\"d\\\",\\\"return {\\\"+n.map(function(n,t){return JSON.stringify(n)+\\\": d[\\\"+t+\\\"]\\\"}).join(\\\",\\\")+\\\"}\\\");r=t?function(n,e){return t(u(n),e)}:u})},e.parseRows=function(n,t){function e(){if(s>=c)return a;if(u)return u=!1,i;var t=s;if(34===n.charCodeAt(t)){for(var e=t;e++s;){var r=n.charCodeAt(s++),o=1;if(10===r)u=!0;else if(13===r)u=!0,10===n.charCodeAt(s)&&(++s,++o);else if(r!==l)continue;return n.slice(t,s-o)}return n.slice(t)}for(var r,u,i={},a={},o=[],c=n.length,s=0,f=0;(r=e())!==a;){for(var h=[];r!==i&&r!==a;)h.push(r),r=e();t&&null==(h=t(h,f++))||o.push(h)}return o},e.format=function(t){if(Array.isArray(t[0]))return e.formatRows(t);var r=new m,u=[];return t.forEach(function(n){for(var t in n)r.has(t)||u.push(r.add(t))}),[u.map(a).join(n)].concat(t.map(function(t){return u.map(function(n){return a(t[n])}).join(n)})).join(\\\"\\\\n\\\")},e.formatRows=function(n){return n.map(i).join(\\\"\\\\n\\\")},e},oa.csv=oa.dsv(\\\",\\\",\\\"text/csv\\\"),oa.tsv=oa.dsv(\\\"\\t\\\",\\\"text/tab-separated-values\\\");var uo,io,ao,oo,lo=this[x(this,\\\"requestAnimationFrame\\\")]||function(n){setTimeout(n,17)};oa.timer=function(){qn.apply(this,arguments)},oa.timer.flush=function(){Rn(),Dn()},oa.round=function(n,t){return t?Math.round(n*(t=Math.pow(10,t)))/t:Math.round(n)};var co=[\\\"y\\\",\\\"z\\\",\\\"a\\\",\\\"f\\\",\\\"p\\\",\\\"n\\\",\\\"\\\\xb5\\\",\\\"m\\\",\\\"\\\",\\\"k\\\",\\\"M\\\",\\\"G\\\",\\\"T\\\",\\\"P\\\",\\\"E\\\",\\\"Z\\\",\\\"Y\\\"].map(jn);oa.formatPrefix=function(n,t){var e=0;return(n=+n)&&(0>n&&(n*=-1),t&&(n=oa.round(n,Pn(n,t))),e=1+Math.floor(1e-12+Math.log(n)/Math.LN10),e=Math.max(-24,Math.min(24,3*Math.floor((e-1)/3)))),co[8+e/3]};var so=/(?:([^{])?([<>=^]))?([+\\\\- ])?([$#])?(0)?(\\\\d+)?(,)?(\\\\.-?\\\\d+)?([a-z%])?/i,fo=oa.map({b:function(n){return n.toString(2)},c:function(n){return String.fromCharCode(n)},o:function(n){return n.toString(8)},x:function(n){return n.toString(16)},X:function(n){return n.toString(16).toUpperCase()},g:function(n,t){return n.toPrecision(t)},e:function(n,t){return n.toExponential(t)},f:function(n,t){return n.toFixed(t)},r:function(n,t){return(n=oa.round(n,Pn(n,t))).toFixed(Math.max(0,Math.min(20,Pn(n*(1+1e-15),t))))}}),ho=oa.time={},go=Date;Hn.prototype={getDate:function(){return this._.getUTCDate()},getDay:function(){return this._.getUTCDay()},getFullYear:function(){return this._.getUTCFullYear()},getHours:function(){return this._.getUTCHours()},getMilliseconds:function(){return this._.getUTCMilliseconds()},getMinutes:function(){return this._.getUTCMinutes()},getMonth:function(){return this._.getUTCMonth()},getSeconds:function(){return this._.getUTCSeconds()},getTime:function(){return this._.getTime()},getTimezoneOffset:function(){return 0},valueOf:function(){return this._.valueOf()},setDate:function(){po.setUTCDate.apply(this._,arguments)},setDay:function(){po.setUTCDay.apply(this._,arguments)},setFullYear:function(){po.setUTCFullYear.apply(this._,arguments)},setHours:function(){po.setUTCHours.apply(this._,arguments)},setMilliseconds:function(){po.setUTCMilliseconds.apply(this._,arguments)},setMinutes:function(){po.setUTCMinutes.apply(this._,arguments)},setMonth:function(){po.setUTCMonth.apply(this._,arguments)},setSeconds:function(){po.setUTCSeconds.apply(this._,arguments)},setTime:function(){po.setTime.apply(this._,arguments)}};var po=Date.prototype;ho.year=On(function(n){return n=ho.day(n),n.setMonth(0,1),n},function(n,t){n.setFullYear(n.getFullYear()+t)},function(n){return n.getFullYear()}),ho.years=ho.year.range,ho.years.utc=ho.year.utc.range,ho.day=On(function(n){var t=new go(2e3,0);return t.setFullYear(n.getFullYear(),n.getMonth(),n.getDate()),t},function(n,t){n.setDate(n.getDate()+t)},function(n){return n.getDate()-1}),ho.days=ho.day.range,ho.days.utc=ho.day.utc.range,ho.dayOfYear=function(n){var t=ho.year(n);return Math.floor((n-t-6e4*(n.getTimezoneOffset()-t.getTimezoneOffset()))/864e5)},[\\\"sunday\\\",\\\"monday\\\",\\\"tuesday\\\",\\\"wednesday\\\",\\\"thursday\\\",\\\"friday\\\",\\\"saturday\\\"].forEach(function(n,t){t=7-t;var e=ho[n]=On(function(n){return(n=ho.day(n)).setDate(n.getDate()-(n.getDay()+t)%7),n},function(n,t){n.setDate(n.getDate()+7*Math.floor(t))},function(n){var e=ho.year(n).getDay();return Math.floor((ho.dayOfYear(n)+(e+t)%7)/7)-(e!==t)});ho[n+\\\"s\\\"]=e.range,ho[n+\\\"s\\\"].utc=e.utc.range,ho[n+\\\"OfYear\\\"]=function(n){var e=ho.year(n).getDay();return Math.floor((ho.dayOfYear(n)+(e+t)%7)/7)}}),ho.week=ho.sunday,ho.weeks=ho.sunday.range,ho.weeks.utc=ho.sunday.utc.range,ho.weekOfYear=ho.sundayOfYear;var vo={\\\"-\\\":\\\"\\\",_:\\\" \\\",0:\\\"0\\\"},mo=/^\\\\s*\\\\d+/,yo=/^%/;oa.locale=function(n){return{numberFormat:Un(n),timeFormat:Yn(n)}};var Mo=oa.locale({decimal:\\\".\\\",thousands:\\\",\\\",grouping:[3],currency:[\\\"$\\\",\\\"\\\"],dateTime:\\\"%a %b %e %X %Y\\\",date:\\\"%m/%d/%Y\\\",time:\\\"%H:%M:%S\\\",periods:[\\\"AM\\\",\\\"PM\\\"],days:[\\\"Sunday\\\",\\\"Monday\\\",\\\"Tuesday\\\",\\\"Wednesday\\\",\\\"Thursday\\\",\\\"Friday\\\",\\\"Saturday\\\"],\\n shortDays:[\\\"Sun\\\",\\\"Mon\\\",\\\"Tue\\\",\\\"Wed\\\",\\\"Thu\\\",\\\"Fri\\\",\\\"Sat\\\"],months:[\\\"January\\\",\\\"February\\\",\\\"March\\\",\\\"April\\\",\\\"May\\\",\\\"June\\\",\\\"July\\\",\\\"August\\\",\\\"September\\\",\\\"October\\\",\\\"November\\\",\\\"December\\\"],shortMonths:[\\\"Jan\\\",\\\"Feb\\\",\\\"Mar\\\",\\\"Apr\\\",\\\"May\\\",\\\"Jun\\\",\\\"Jul\\\",\\\"Aug\\\",\\\"Sep\\\",\\\"Oct\\\",\\\"Nov\\\",\\\"Dec\\\"]});oa.format=Mo.numberFormat,oa.geo={},st.prototype={s:0,t:0,add:function(n){ft(n,this.t,xo),ft(xo.s,this.s,this),this.s?this.t+=xo.t:this.s=xo.t},reset:function(){this.s=this.t=0},valueOf:function(){return this.s}};var xo=new st;oa.geo.stream=function(n,t){n&&bo.hasOwnProperty(n.type)?bo[n.type](n,t):ht(n,t)};var bo={Feature:function(n,t){ht(n.geometry,t)},FeatureCollection:function(n,t){for(var e=n.features,r=-1,u=e.length;++rn?4*ja+n:n,ko.lineStart=ko.lineEnd=ko.point=b}};oa.geo.bounds=function(){function n(n,t){M.push(x=[s=n,h=n]),f>t&&(f=t),t>g&&(g=t)}function t(t,e){var r=dt([t*Oa,e*Oa]);if(m){var u=yt(m,r),i=[u[1],-u[0],0],a=yt(i,u);bt(a),a=_t(a);var l=t-p,c=l>0?1:-1,v=a[0]*Ia*c,d=Ma(l)>180;if(d^(v>c*p&&c*t>v)){var y=a[1]*Ia;y>g&&(g=y)}else if(v=(v+360)%360-180,d^(v>c*p&&c*t>v)){var y=-a[1]*Ia;f>y&&(f=y)}else f>e&&(f=e),e>g&&(g=e);d?p>t?o(s,t)>o(s,h)&&(h=t):o(t,h)>o(s,h)&&(s=t):h>=s?(s>t&&(s=t),t>h&&(h=t)):t>p?o(s,t)>o(s,h)&&(h=t):o(t,h)>o(s,h)&&(s=t)}else n(t,e);m=r,p=t}function e(){b.point=t}function r(){x[0]=s,x[1]=h,b.point=n,m=null}function u(n,e){if(m){var r=n-p;y+=Ma(r)>180?r+(r>0?360:-360):r}else v=n,d=e;ko.point(n,e),t(n,e)}function i(){ko.lineStart()}function a(){u(v,d),ko.lineEnd(),Ma(y)>Da&&(s=-(h=180)),x[0]=s,x[1]=h,m=null}function o(n,t){return(t-=n)<0?t+360:t}function l(n,t){return n[0]-t[0]}function c(n,t){return t[0]<=t[1]?t[0]<=n&&n<=t[1]:nSo?(s=-(h=180),f=-(g=90)):y>Da?g=90:-Da>y&&(f=-90),x[0]=s,x[1]=h}};return function(n){g=h=-(s=f=1/0),M=[],oa.geo.stream(n,b);var t=M.length;if(t){M.sort(l);for(var e,r=1,u=M[0],i=[u];t>r;++r)e=M[r],c(e[0],u)||c(e[1],u)?(o(u[0],e[1])>o(u[0],u[1])&&(u[1]=e[1]),o(e[0],u[1])>o(u[0],u[1])&&(u[0]=e[0])):i.push(u=e);for(var a,e,p=-(1/0),t=i.length-1,r=0,u=i[t];t>=r;u=e,++r)e=i[r],(a=o(u[1],e[0]))>p&&(p=a,s=e[0],h=u[1])}return M=x=null,s===1/0||f===1/0?[[NaN,NaN],[NaN,NaN]]:[[s,f],[h,g]]}}(),oa.geo.centroid=function(n){No=Eo=Ao=Co=zo=Lo=qo=To=Ro=Do=Po=0,oa.geo.stream(n,jo);var t=Ro,e=Do,r=Po,u=t*t+e*e+r*r;return Pa>u&&(t=Lo,e=qo,r=To,Da>Eo&&(t=Ao,e=Co,r=zo),u=t*t+e*e+r*r,Pa>u)?[NaN,NaN]:[Math.atan2(e,t)*Ia,tn(r/Math.sqrt(u))*Ia]};var No,Eo,Ao,Co,zo,Lo,qo,To,Ro,Do,Po,jo={sphere:b,point:St,lineStart:Nt,lineEnd:Et,polygonStart:function(){jo.lineStart=At},polygonEnd:function(){jo.lineStart=Nt}},Uo=Rt(zt,Ut,Ht,[-ja,-ja/2]),Fo=1e9;oa.geo.clipExtent=function(){var n,t,e,r,u,i,a={stream:function(n){return u&&(u.valid=!1),u=i(n),u.valid=!0,u},extent:function(o){return arguments.length?(i=Zt(n=+o[0][0],t=+o[0][1],e=+o[1][0],r=+o[1][1]),u&&(u.valid=!1,u=null),a):[[n,t],[e,r]]}};return a.extent([[0,0],[960,500]])},(oa.geo.conicEqualArea=function(){return Vt(Xt)}).raw=Xt,oa.geo.albers=function(){return oa.geo.conicEqualArea().rotate([96,0]).center([-.6,38.7]).parallels([29.5,45.5]).scale(1070)},oa.geo.albersUsa=function(){function n(n){var i=n[0],a=n[1];return t=null,e(i,a),t||(r(i,a),t)||u(i,a),t}var t,e,r,u,i=oa.geo.albers(),a=oa.geo.conicEqualArea().rotate([154,0]).center([-2,58.5]).parallels([55,65]),o=oa.geo.conicEqualArea().rotate([157,0]).center([-3,19.9]).parallels([8,18]),l={point:function(n,e){t=[n,e]}};return n.invert=function(n){var t=i.scale(),e=i.translate(),r=(n[0]-e[0])/t,u=(n[1]-e[1])/t;return(u>=.12&&.234>u&&r>=-.425&&-.214>r?a:u>=.166&&.234>u&&r>=-.214&&-.115>r?o:i).invert(n)},n.stream=function(n){var t=i.stream(n),e=a.stream(n),r=o.stream(n);return{point:function(n,u){t.point(n,u),e.point(n,u),r.point(n,u)},sphere:function(){t.sphere(),e.sphere(),r.sphere()},lineStart:function(){t.lineStart(),e.lineStart(),r.lineStart()},lineEnd:function(){t.lineEnd(),e.lineEnd(),r.lineEnd()},polygonStart:function(){t.polygonStart(),e.polygonStart(),r.polygonStart()},polygonEnd:function(){t.polygonEnd(),e.polygonEnd(),r.polygonEnd()}}},n.precision=function(t){return arguments.length?(i.precision(t),a.precision(t),o.precision(t),n):i.precision()},n.scale=function(t){return arguments.length?(i.scale(t),a.scale(.35*t),o.scale(t),n.translate(i.translate())):i.scale()},n.translate=function(t){if(!arguments.length)return i.translate();var c=i.scale(),s=+t[0],f=+t[1];return e=i.translate(t).clipExtent([[s-.455*c,f-.238*c],[s+.455*c,f+.238*c]]).stream(l).point,r=a.translate([s-.307*c,f+.201*c]).clipExtent([[s-.425*c+Da,f+.12*c+Da],[s-.214*c-Da,f+.234*c-Da]]).stream(l).point,u=o.translate([s-.205*c,f+.212*c]).clipExtent([[s-.214*c+Da,f+.166*c+Da],[s-.115*c-Da,f+.234*c-Da]]).stream(l).point,n},n.scale(1070)};var Ho,Oo,Io,Yo,Zo,Vo,Xo={point:b,lineStart:b,lineEnd:b,polygonStart:function(){Oo=0,Xo.lineStart=$t},polygonEnd:function(){Xo.lineStart=Xo.lineEnd=Xo.point=b,Ho+=Ma(Oo/2)}},$o={point:Bt,lineStart:b,lineEnd:b,polygonStart:b,polygonEnd:b},Bo={point:Gt,lineStart:Kt,lineEnd:Qt,polygonStart:function(){Bo.lineStart=ne},polygonEnd:function(){Bo.point=Gt,Bo.lineStart=Kt,Bo.lineEnd=Qt}};oa.geo.path=function(){function n(n){return n&&(\\\"function\\\"==typeof o&&i.pointRadius(+o.apply(this,arguments)),a&&a.valid||(a=u(i)),oa.geo.stream(n,a)),i.result()}function t(){return a=null,n}var e,r,u,i,a,o=4.5;return n.area=function(n){return Ho=0,oa.geo.stream(n,u(Xo)),Ho},n.centroid=function(n){return Ao=Co=zo=Lo=qo=To=Ro=Do=Po=0,oa.geo.stream(n,u(Bo)),Po?[Ro/Po,Do/Po]:To?[Lo/To,qo/To]:zo?[Ao/zo,Co/zo]:[NaN,NaN]},n.bounds=function(n){return Zo=Vo=-(Io=Yo=1/0),oa.geo.stream(n,u($o)),[[Io,Yo],[Zo,Vo]]},n.projection=function(n){return arguments.length?(u=(e=n)?n.stream||re(n):y,t()):e},n.context=function(n){return arguments.length?(i=null==(r=n)?new Wt:new te(n),\\\"function\\\"!=typeof o&&i.pointRadius(o),t()):r},n.pointRadius=function(t){return arguments.length?(o=\\\"function\\\"==typeof t?t:(i.pointRadius(+t),+t),n):o},n.projection(oa.geo.albersUsa()).context(null)},oa.geo.transform=function(n){return{stream:function(t){var e=new ue(t);for(var r in n)e[r]=n[r];return e}}},ue.prototype={point:function(n,t){this.stream.point(n,t)},sphere:function(){this.stream.sphere()},lineStart:function(){this.stream.lineStart()},lineEnd:function(){this.stream.lineEnd()},polygonStart:function(){this.stream.polygonStart()},polygonEnd:function(){this.stream.polygonEnd()}},oa.geo.projection=ae,oa.geo.projectionMutator=oe,(oa.geo.equirectangular=function(){return ae(ce)}).raw=ce.invert=ce,oa.geo.rotation=function(n){function t(t){return t=n(t[0]*Oa,t[1]*Oa),t[0]*=Ia,t[1]*=Ia,t}return n=fe(n[0]%360*Oa,n[1]*Oa,n.length>2?n[2]*Oa:0),t.invert=function(t){return t=n.invert(t[0]*Oa,t[1]*Oa),t[0]*=Ia,t[1]*=Ia,t},t},se.invert=ce,oa.geo.circle=function(){function n(){var n=\\\"function\\\"==typeof r?r.apply(this,arguments):r,t=fe(-n[0]*Oa,-n[1]*Oa,0).invert,u=[];return e(null,null,1,{point:function(n,e){u.push(n=t(n,e)),n[0]*=Ia,n[1]*=Ia}}),{type:\\\"Polygon\\\",coordinates:[u]}}var t,e,r=[0,0],u=6;return n.origin=function(t){return arguments.length?(r=t,n):r},n.angle=function(r){return arguments.length?(e=ve((t=+r)*Oa,u*Oa),n):t},n.precision=function(r){return arguments.length?(e=ve(t*Oa,(u=+r)*Oa),n):u},n.angle(90)},oa.geo.distance=function(n,t){var e,r=(t[0]-n[0])*Oa,u=n[1]*Oa,i=t[1]*Oa,a=Math.sin(r),o=Math.cos(r),l=Math.sin(u),c=Math.cos(u),s=Math.sin(i),f=Math.cos(i);return Math.atan2(Math.sqrt((e=f*a)*e+(e=c*s-l*f*o)*e),l*s+c*f*o)},oa.geo.graticule=function(){function n(){return{type:\\\"MultiLineString\\\",coordinates:t()}}function t(){return oa.range(Math.ceil(i/d)*d,u,d).map(h).concat(oa.range(Math.ceil(c/m)*m,l,m).map(g)).concat(oa.range(Math.ceil(r/p)*p,e,p).filter(function(n){return Ma(n%d)>Da}).map(s)).concat(oa.range(Math.ceil(o/v)*v,a,v).filter(function(n){return Ma(n%m)>Da}).map(f))}var e,r,u,i,a,o,l,c,s,f,h,g,p=10,v=p,d=90,m=360,y=2.5;return n.lines=function(){return t().map(function(n){return{type:\\\"LineString\\\",coordinates:n}})},n.outline=function(){return{type:\\\"Polygon\\\",coordinates:[h(i).concat(g(l).slice(1),h(u).reverse().slice(1),g(c).reverse().slice(1))]}},n.extent=function(t){return arguments.length?n.majorExtent(t).minorExtent(t):n.minorExtent()},n.majorExtent=function(t){return arguments.length?(i=+t[0][0],u=+t[1][0],c=+t[0][1],l=+t[1][1],i>u&&(t=i,i=u,u=t),c>l&&(t=c,c=l,l=t),n.precision(y)):[[i,c],[u,l]]},n.minorExtent=function(t){return arguments.length?(r=+t[0][0],e=+t[1][0],o=+t[0][1],a=+t[1][1],r>e&&(t=r,r=e,e=t),o>a&&(t=o,o=a,a=t),n.precision(y)):[[r,o],[e,a]]},n.step=function(t){return arguments.length?n.majorStep(t).minorStep(t):n.minorStep()},n.majorStep=function(t){return arguments.length?(d=+t[0],m=+t[1],n):[d,m]},n.minorStep=function(t){return arguments.length?(p=+t[0],v=+t[1],n):[p,v]},n.precision=function(t){return arguments.length?(y=+t,s=me(o,a,90),f=ye(r,e,y),h=me(c,l,90),g=ye(i,u,y),n):y},n.majorExtent([[-180,-90+Da],[180,90-Da]]).minorExtent([[-180,-80-Da],[180,80+Da]])},oa.geo.greatArc=function(){function n(){return{type:\\\"LineString\\\",coordinates:[t||r.apply(this,arguments),e||u.apply(this,arguments)]}}var t,e,r=Me,u=xe;return n.distance=function(){return oa.geo.distance(t||r.apply(this,arguments),e||u.apply(this,arguments))},n.source=function(e){return arguments.length?(r=e,t=\\\"function\\\"==typeof e?null:e,n):r},n.target=function(t){return arguments.length?(u=t,e=\\\"function\\\"==typeof t?null:t,n):u},n.precision=function(){return arguments.length?n:0},n},oa.geo.interpolate=function(n,t){return be(n[0]*Oa,n[1]*Oa,t[0]*Oa,t[1]*Oa)},oa.geo.length=function(n){return Wo=0,oa.geo.stream(n,Jo),Wo};var Wo,Jo={sphere:b,point:b,lineStart:_e,lineEnd:b,polygonStart:b,polygonEnd:b},Go=we(function(n){return Math.sqrt(2/(1+n))},function(n){return 2*Math.asin(n/2)});(oa.geo.azimuthalEqualArea=function(){return ae(Go)}).raw=Go;var Ko=we(function(n){var t=Math.acos(n);return t&&t/Math.sin(t)},y);(oa.geo.azimuthalEquidistant=function(){return ae(Ko)}).raw=Ko,(oa.geo.conicConformal=function(){return Vt(Se)}).raw=Se,(oa.geo.conicEquidistant=function(){return Vt(ke)}).raw=ke;var Qo=we(function(n){return 1/n},Math.atan);(oa.geo.gnomonic=function(){return ae(Qo)}).raw=Qo,Ne.invert=function(n,t){return[n,2*Math.atan(Math.exp(t))-Ha]},(oa.geo.mercator=function(){return Ee(Ne)}).raw=Ne;var nl=we(function(){return 1},Math.asin);(oa.geo.orthographic=function(){return ae(nl)}).raw=nl;var tl=we(function(n){return 1/(1+n)},function(n){return 2*Math.atan(n)});(oa.geo.stereographic=function(){return ae(tl)}).raw=tl,Ae.invert=function(n,t){return[-t,2*Math.atan(Math.exp(n))-Ha]},(oa.geo.transverseMercator=function(){var n=Ee(Ae),t=n.center,e=n.rotate;return n.center=function(n){return n?t([-n[1],n[0]]):(n=t(),[n[1],-n[0]])},n.rotate=function(n){return n?e([n[0],n[1],n.length>2?n[2]+90:90]):(n=e(),[n[0],n[1],n[2]-90])},e([0,0,90])}).raw=Ae,oa.geom={},oa.geom.hull=function(n){function t(n){if(n.length<3)return[];var t,u=En(e),i=En(r),a=n.length,o=[],l=[];for(t=0;a>t;t++)o.push([+u.call(this,n[t],t),+i.call(this,n[t],t),t]);for(o.sort(qe),t=0;a>t;t++)l.push([o[t][0],-o[t][1]]);var c=Le(o),s=Le(l),f=s[0]===c[0],h=s[s.length-1]===c[c.length-1],g=[];for(t=c.length-1;t>=0;--t)g.push(n[o[c[t]][2]]);for(t=+f;t=r&&c.x<=i&&c.y>=u&&c.y<=a?[[r,a],[i,a],[i,u],[r,u]]:[];s.point=n[o]}),t}function e(n){return n.map(function(n,t){return{x:Math.round(i(n,t)/Da)*Da,y:Math.round(a(n,t)/Da)*Da,i:t}})}var r=Ce,u=ze,i=r,a=u,o=sl;return n?t(n):(t.links=function(n){return or(e(n)).edges.filter(function(n){return n.l&&n.r}).map(function(t){return{source:n[t.l.i],target:n[t.r.i]}})},t.triangles=function(n){var t=[];return or(e(n)).cells.forEach(function(e,r){for(var u,i,a=e.site,o=e.edges.sort(Ve),l=-1,c=o.length,s=o[c-1].edge,f=s.l===a?s.r:s.l;++l=c,h=r>=s,g=h<<1|f;n.leaf=!1,n=n.nodes[g]||(n.nodes[g]=hr()),f?u=c:o=c,h?a=s:l=s,i(n,t,e,r,u,a,o,l)}var s,f,h,g,p,v,d,m,y,M=En(o),x=En(l);if(null!=t)v=t,d=e,m=r,y=u;else if(m=y=-(v=d=1/0),f=[],h=[],p=n.length,a)for(g=0;p>g;++g)s=n[g],s.xm&&(m=s.x),s.y>y&&(y=s.y),f.push(s.x),h.push(s.y);else for(g=0;p>g;++g){var b=+M(s=n[g],g),_=+x(s,g);v>b&&(v=b),d>_&&(d=_),b>m&&(m=b),_>y&&(y=_),f.push(b),h.push(_)}var w=m-v,S=y-d;w>S?y=d+w:m=v+S;var k=hr();if(k.add=function(n){i(k,n,+M(n,++g),+x(n,g),v,d,m,y)},k.visit=function(n){gr(n,k,v,d,m,y)},k.find=function(n){return pr(k,n[0],n[1],v,d,m,y)},g=-1,null==t){for(;++g=0?n.slice(0,t):n,r=t>=0?n.slice(t+1):\\\"in\\\";return e=pl.get(e)||gl,r=vl.get(r)||y,br(r(e.apply(null,la.call(arguments,1))))},oa.interpolateHcl=Rr,oa.interpolateHsl=Dr,oa.interpolateLab=Pr,oa.interpolateRound=jr,oa.transform=function(n){var t=sa.createElementNS(oa.ns.prefix.svg,\\\"g\\\");return(oa.transform=function(n){if(null!=n){t.setAttribute(\\\"transform\\\",n);var e=t.transform.baseVal.consolidate()}return new Ur(e?e.matrix:dl)})(n)},Ur.prototype.toString=function(){return\\\"translate(\\\"+this.translate+\\\")rotate(\\\"+this.rotate+\\\")skewX(\\\"+this.skew+\\\")scale(\\\"+this.scale+\\\")\\\"};var dl={a:1,b:0,c:0,d:1,e:0,f:0};oa.interpolateTransform=$r,oa.layout={},oa.layout.bundle=function(){return function(n){for(var t=[],e=-1,r=n.length;++eo*o/m){if(v>l){var c=t.charge/l;n.px-=i*c,n.py-=a*c}return!0}if(t.point&&l&&v>l){var c=t.pointCharge/l;n.px-=i*c,n.py-=a*c}}return!t.charge}}function t(n){n.px=oa.event.x,n.py=oa.event.y,l.resume()}var e,r,u,i,a,o,l={},c=oa.dispatch(\\\"start\\\",\\\"tick\\\",\\\"end\\\"),s=[1,1],f=.9,h=ml,g=yl,p=-30,v=Ml,d=.1,m=.64,M=[],x=[];return l.tick=function(){if((u*=.99)<.005)return e=null,c.end({type:\\\"end\\\",alpha:u=0}),!0;var t,r,l,h,g,v,m,y,b,_=M.length,w=x.length;for(r=0;w>r;++r)l=x[r],h=l.source,g=l.target,y=g.x-h.x,b=g.y-h.y,(v=y*y+b*b)&&(v=u*a[r]*((v=Math.sqrt(v))-i[r])/v,y*=v,b*=v,g.x-=y*(m=h.weight+g.weight?h.weight/(h.weight+g.weight):.5),g.y-=b*m,h.x+=y*(m=1-m),h.y+=b*m);if((m=u*d)&&(y=s[0]/2,b=s[1]/2,r=-1,m))for(;++r<_;)l=M[r],l.x+=(y-l.x)*m,l.y+=(b-l.y)*m;if(p)for(ru(t=oa.geom.quadtree(M),u,o),r=-1;++r<_;)(l=M[r]).fixed||t.visit(n(l));for(r=-1;++r<_;)l=M[r],l.fixed?(l.x=l.px,l.y=l.py):(l.x-=(l.px-(l.px=l.x))*f,l.y-=(l.py-(l.py=l.y))*f);c.tick({type:\\\"tick\\\",alpha:u})},l.nodes=function(n){return arguments.length?(M=n,l):M},l.links=function(n){return arguments.length?(x=n,l):x},l.size=function(n){return arguments.length?(s=n,l):s},l.linkDistance=function(n){return arguments.length?(h=\\\"function\\\"==typeof n?n:+n,l):h},l.distance=l.linkDistance,l.linkStrength=function(n){return arguments.length?(g=\\\"function\\\"==typeof n?n:+n,l):g},l.friction=function(n){return arguments.length?(f=+n,l):f},l.charge=function(n){return arguments.length?(p=\\\"function\\\"==typeof n?n:+n,l):p},l.chargeDistance=function(n){return arguments.length?(v=n*n,l):Math.sqrt(v)},l.gravity=function(n){return arguments.length?(d=+n,l):d},l.theta=function(n){return arguments.length?(m=n*n,l):Math.sqrt(m)},l.alpha=function(n){return arguments.length?(n=+n,u?n>0?u=n:(e.c=null,e.t=NaN,e=null,c.end({type:\\\"end\\\",alpha:u=0})):n>0&&(c.start({type:\\\"start\\\",alpha:u=n}),e=qn(l.tick)),l):u},l.start=function(){function n(n,r){if(!e){for(e=new Array(u),l=0;u>l;++l)e[l]=[];for(l=0;c>l;++l){var i=x[l];e[i.source.index].push(i.target),e[i.target.index].push(i.source)}}for(var a,o=e[t],l=-1,s=o.length;++lt;++t)(r=M[t]).index=t,r.weight=0;for(t=0;c>t;++t)r=x[t],\\\"number\\\"==typeof r.source&&(r.source=M[r.source]),\\\"number\\\"==typeof r.target&&(r.target=M[r.target]),++r.source.weight,++r.target.weight;for(t=0;u>t;++t)r=M[t],isNaN(r.x)&&(r.x=n(\\\"x\\\",f)),isNaN(r.y)&&(r.y=n(\\\"y\\\",v)),isNaN(r.px)&&(r.px=r.x),isNaN(r.py)&&(r.py=r.y);if(i=[],\\\"function\\\"==typeof h)for(t=0;c>t;++t)i[t]=+h.call(this,x[t],t);else for(t=0;c>t;++t)i[t]=h;if(a=[],\\\"function\\\"==typeof g)for(t=0;c>t;++t)a[t]=+g.call(this,x[t],t);else for(t=0;c>t;++t)a[t]=g;if(o=[],\\\"function\\\"==typeof p)for(t=0;u>t;++t)o[t]=+p.call(this,M[t],t);else for(t=0;u>t;++t)o[t]=p;return l.resume()},l.resume=function(){return l.alpha(.1)},l.stop=function(){return l.alpha(0)},l.drag=function(){return r||(r=oa.behavior.drag().origin(y).on(\\\"dragstart.force\\\",Qr).on(\\\"drag.force\\\",t).on(\\\"dragend.force\\\",nu)),arguments.length?void this.on(\\\"mouseover.force\\\",tu).on(\\\"mouseout.force\\\",eu).call(r):r},oa.rebind(l,c,\\\"on\\\")};var ml=20,yl=1,Ml=1/0;oa.layout.hierarchy=function(){function n(u){var i,a=[u],o=[];for(u.depth=0;null!=(i=a.pop());)if(o.push(i),(c=e.call(n,i,i.depth))&&(l=c.length)){for(var l,c,s;--l>=0;)a.push(s=c[l]),s.parent=i,s.depth=i.depth+1;r&&(i.value=0),i.children=c}else r&&(i.value=+r.call(n,i,i.depth)||0),delete i.children;return au(u,function(n){var e,u;t&&(e=n.children)&&e.sort(t),r&&(u=n.parent)&&(u.value+=n.value)}),o}var t=cu,e=ou,r=lu;return n.sort=function(e){return arguments.length?(t=e,n):t},n.children=function(t){return arguments.length?(e=t,n):e},n.value=function(t){return arguments.length?(r=t,n):r},n.revalue=function(t){return r&&(iu(t,function(n){n.children&&(n.value=0)}),au(t,function(t){var e;t.children||(t.value=+r.call(n,t,t.depth)||0),(e=t.parent)&&(e.value+=t.value)})),t},n},oa.layout.partition=function(){function n(t,e,r,u){var i=t.children;if(t.x=e,t.y=t.depth*u,t.dx=r,t.dy=u,i&&(a=i.length)){var a,o,l,c=-1;for(r=t.value?r/t.value:0;++cf?-1:1),p=oa.sum(c),v=p?(f-l*g)/p:0,d=oa.range(l),m=[];return null!=e&&d.sort(e===xl?function(n,t){return c[t]-c[n]}:function(n,t){return e(a[n],a[t])}),d.forEach(function(n){m[n]={data:a[n],value:o=c[n],startAngle:s,endAngle:s+=o*v+g,padAngle:h}}),m}var t=Number,e=xl,r=0,u=Ua,i=0;return n.value=function(e){return arguments.length?(t=e,n):t},n.sort=function(t){return arguments.length?(e=t,n):e},n.startAngle=function(t){return arguments.length?(r=t,n):r},n.endAngle=function(t){return arguments.length?(u=t,n):u},n.padAngle=function(t){return arguments.length?(i=t,n):i},n};var xl={};oa.layout.stack=function(){function n(o,l){if(!(h=o.length))return o;var c=o.map(function(e,r){return t.call(n,e,r)}),s=c.map(function(t){return t.map(function(t,e){return[i.call(n,t,e),a.call(n,t,e)]})}),f=e.call(n,s,l);c=oa.permute(c,f),s=oa.permute(s,f);var h,g,p,v,d=r.call(n,s,l),m=c[0].length;for(p=0;m>p;++p)for(u.call(n,c[0][p],v=d[p],s[0][p][1]),g=1;h>g;++g)u.call(n,c[g][p],v+=s[g-1][p][1],s[g][p][1]);return o}var t=y,e=pu,r=vu,u=gu,i=fu,a=hu;return n.values=function(e){return arguments.length?(t=e,n):t},n.order=function(t){return arguments.length?(e=\\\"function\\\"==typeof t?t:bl.get(t)||pu,n):e},n.offset=function(t){return arguments.length?(r=\\\"function\\\"==typeof t?t:_l.get(t)||vu,n):r},n.x=function(t){return arguments.length?(i=t,n):i},n.y=function(t){return arguments.length?(a=t,n):a},n.out=function(t){return arguments.length?(u=t,n):u},n};var bl=oa.map({\\\"inside-out\\\":function(n){var t,e,r=n.length,u=n.map(du),i=n.map(mu),a=oa.range(r).sort(function(n,t){return u[n]-u[t]}),o=0,l=0,c=[],s=[];for(t=0;r>t;++t)e=a[t],l>o?(o+=i[e],c.push(e)):(l+=i[e],s.push(e));return s.reverse().concat(c)},reverse:function(n){return oa.range(n.length).reverse()},\\\"default\\\":pu}),_l=oa.map({silhouette:function(n){var t,e,r,u=n.length,i=n[0].length,a=[],o=0,l=[];for(e=0;i>e;++e){for(t=0,r=0;u>t;t++)r+=n[t][e][1];r>o&&(o=r),a.push(r)}for(e=0;i>e;++e)l[e]=(o-a[e])/2;return l},wiggle:function(n){var t,e,r,u,i,a,o,l,c,s=n.length,f=n[0],h=f.length,g=[];for(g[0]=l=c=0,e=1;h>e;++e){for(t=0,u=0;s>t;++t)u+=n[t][e][1];for(t=0,i=0,o=f[e][0]-f[e-1][0];s>t;++t){for(r=0,a=(n[t][e][1]-n[t][e-1][1])/(2*o);t>r;++r)a+=(n[r][e][1]-n[r][e-1][1])/o;i+=a*n[t][e][1]}g[e]=l-=u?i/u*o:0,c>l&&(c=l)}for(e=0;h>e;++e)g[e]-=c;return g},expand:function(n){var t,e,r,u=n.length,i=n[0].length,a=1/u,o=[];for(e=0;i>e;++e){for(t=0,r=0;u>t;t++)r+=n[t][e][1];if(r)for(t=0;u>t;t++)n[t][e][1]/=r;else for(t=0;u>t;t++)n[t][e][1]=a}for(e=0;i>e;++e)o[e]=0;return o},zero:vu});oa.layout.histogram=function(){function n(n,i){for(var a,o,l=[],c=n.map(e,this),s=r.call(this,c,i),f=u.call(this,s,c,i),i=-1,h=c.length,g=f.length-1,p=t?1:1/h;++i0)for(i=-1;++i=s[0]&&o<=s[1]&&(a=l[oa.bisect(f,o,1,g)-1],a.y+=p,a.push(n[i]));return l}var t=!0,e=Number,r=bu,u=Mu;return n.value=function(t){return arguments.length?(e=t,n):e},n.range=function(t){return arguments.length?(r=En(t),n):r},n.bins=function(t){return arguments.length?(u=\\\"number\\\"==typeof t?function(n){return xu(n,t)}:En(t),n):u},n.frequency=function(e){return arguments.length?(t=!!e,n):t},n},oa.layout.pack=function(){function n(n,i){var a=e.call(this,n,i),o=a[0],l=u[0],c=u[1],s=null==t?Math.sqrt:\\\"function\\\"==typeof t?t:function(){return t};if(o.x=o.y=0,au(o,function(n){n.r=+s(n.value)}),au(o,Nu),r){var f=r*(t?1:Math.max(2*o.r/l,2*o.r/c))/2;au(o,function(n){n.r+=f}),au(o,Nu),au(o,function(n){n.r-=f})}return Cu(o,l/2,c/2,t?1:1/Math.max(2*o.r/l,2*o.r/c)),a}var t,e=oa.layout.hierarchy().sort(_u),r=0,u=[1,1];return n.size=function(t){return arguments.length?(u=t,n):u},n.radius=function(e){return arguments.length?(t=null==e||\\\"function\\\"==typeof e?e:+e,n):t},n.padding=function(t){return arguments.length?(r=+t,n):r},uu(n,e)},oa.layout.tree=function(){function n(n,u){var s=a.call(this,n,u),f=s[0],h=t(f);if(au(h,e),h.parent.m=-h.z,iu(h,r),c)iu(f,i);else{var g=f,p=f,v=f;iu(f,function(n){n.xp.x&&(p=n),n.depth>v.depth&&(v=n)});var d=o(g,p)/2-g.x,m=l[0]/(p.x+o(p,g)/2+d),y=l[1]/(v.depth||1);iu(f,function(n){n.x=(n.x+d)*m,n.y=n.depth*y})}return s}function t(n){for(var t,e={A:null,children:[n]},r=[e];null!=(t=r.pop());)for(var u,i=t.children,a=0,o=i.length;o>a;++a)r.push((i[a]=u={_:i[a],parent:t,children:(u=i[a].children)&&u.slice()||[],A:null,a:null,z:0,m:0,c:0,s:0,t:null,i:a}).a=u);return e.children[0]}function e(n){var t=n.children,e=n.parent.children,r=n.i?e[n.i-1]:null;if(t.length){Du(n);var i=(t[0].z+t[t.length-1].z)/2;r?(n.z=r.z+o(n._,r._),n.m=n.z-i):n.z=i}else r&&(n.z=r.z+o(n._,r._));n.parent.A=u(n,r,n.parent.A||e[0])}function r(n){n._.x=n.z+n.parent.m,n.m+=n.parent.m}function u(n,t,e){if(t){for(var r,u=n,i=n,a=t,l=u.parent.children[0],c=u.m,s=i.m,f=a.m,h=l.m;a=Tu(a),u=qu(u),a&&u;)l=qu(l),i=Tu(i),i.a=n,r=a.z+f-u.z-c+o(a._,u._),r>0&&(Ru(Pu(a,n,e),n,r),c+=r,s+=r),f+=a.m,c+=u.m,h+=l.m,s+=i.m;a&&!Tu(i)&&(i.t=a,i.m+=f-s),u&&!qu(l)&&(l.t=u,l.m+=c-h,e=n)}return e}function i(n){n.x*=l[0],n.y=n.depth*l[1]}var a=oa.layout.hierarchy().sort(null).value(null),o=Lu,l=[1,1],c=null;return n.separation=function(t){return arguments.length?(o=t,n):o},n.size=function(t){return arguments.length?(c=null==(l=t)?i:null,n):c?null:l},n.nodeSize=function(t){return arguments.length?(c=null==(l=t)?null:i,n):c?l:null},uu(n,a)},oa.layout.cluster=function(){function n(n,i){var a,o=t.call(this,n,i),l=o[0],c=0;au(l,function(n){var t=n.children;t&&t.length?(n.x=Uu(t),n.y=ju(t)):(n.x=a?c+=e(n,a):0,n.y=0,a=n)});var s=Fu(l),f=Hu(l),h=s.x-e(s,f)/2,g=f.x+e(f,s)/2;return au(l,u?function(n){n.x=(n.x-l.x)*r[0],n.y=(l.y-n.y)*r[1]}:function(n){n.x=(n.x-h)/(g-h)*r[0],n.y=(1-(l.y?n.y/l.y:1))*r[1]}),o}var t=oa.layout.hierarchy().sort(null).value(null),e=Lu,r=[1,1],u=!1;return n.separation=function(t){return arguments.length?(e=t,n):e},n.size=function(t){return arguments.length?(u=null==(r=t),n):u?null:r},n.nodeSize=function(t){return arguments.length?(u=null!=(r=t),n):u?r:null},uu(n,t)},oa.layout.treemap=function(){function n(n,t){for(var e,r,u=-1,i=n.length;++ut?0:t),e.area=isNaN(r)||0>=r?0:r}function t(e){var i=e.children;if(i&&i.length){var a,o,l,c=f(e),s=[],h=i.slice(),p=1/0,v=\\\"slice\\\"===g?c.dx:\\\"dice\\\"===g?c.dy:\\\"slice-dice\\\"===g?1&e.depth?c.dy:c.dx:Math.min(c.dx,c.dy);for(n(h,c.dx*c.dy/e.value),s.area=0;(l=h.length)>0;)s.push(a=h[l-1]),s.area+=a.area,\\\"squarify\\\"!==g||(o=r(s,v))<=p?(h.pop(),p=o):(s.area-=s.pop().area,u(s,v,c,!1),v=Math.min(c.dx,c.dy),s.length=s.area=0,p=1/0);s.length&&(u(s,v,c,!0),s.length=s.area=0),i.forEach(t)}}function e(t){var r=t.children;if(r&&r.length){var i,a=f(t),o=r.slice(),l=[];for(n(o,a.dx*a.dy/t.value),l.area=0;i=o.pop();)l.push(i),l.area+=i.area,null!=i.z&&(u(l,i.z?a.dx:a.dy,a,!o.length),l.length=l.area=0);r.forEach(e)}}function r(n,t){for(var e,r=n.area,u=0,i=1/0,a=-1,o=n.length;++ae&&(i=e),e>u&&(u=e));return r*=r,t*=t,r?Math.max(t*u*p/r,r/(t*i*p)):1/0}function u(n,t,e,r){var u,i=-1,a=n.length,o=e.x,c=e.y,s=t?l(n.area/t):0;\\n if(t==e.dx){for((r||s>e.dy)&&(s=e.dy);++ie.dx)&&(s=e.dx);++ie&&(t=1),1>e&&(n=0),function(){var e,r,u;do e=2*Math.random()-1,r=2*Math.random()-1,u=e*e+r*r;while(!u||u>1);return n+t*e*Math.sqrt(-2*Math.log(u)/u)}},logNormal:function(){var n=oa.random.normal.apply(oa,arguments);return function(){return Math.exp(n())}},bates:function(n){var t=oa.random.irwinHall(n);return function(){return t()/n}},irwinHall:function(n){return function(){for(var t=0,e=0;n>e;e++)t+=Math.random();return t}}},oa.scale={};var wl={floor:y,ceil:y};oa.scale.linear=function(){return Wu([0,1],[0,1],Mr,!1)};var Sl={s:1,g:1,p:1,r:1,e:1};oa.scale.log=function(){return ri(oa.scale.linear().domain([0,1]),10,!0,[1,10])};var kl=oa.format(\\\".0e\\\"),Nl={floor:function(n){return-Math.ceil(-n)},ceil:function(n){return-Math.floor(-n)}};oa.scale.pow=function(){return ui(oa.scale.linear(),1,[0,1])},oa.scale.sqrt=function(){return oa.scale.pow().exponent(.5)},oa.scale.ordinal=function(){return ai([],{t:\\\"range\\\",a:[[]]})},oa.scale.category10=function(){return oa.scale.ordinal().range(El)},oa.scale.category20=function(){return oa.scale.ordinal().range(Al)},oa.scale.category20b=function(){return oa.scale.ordinal().range(Cl)},oa.scale.category20c=function(){return oa.scale.ordinal().range(zl)};var El=[2062260,16744206,2924588,14034728,9725885,9197131,14907330,8355711,12369186,1556175].map(xn),Al=[2062260,11454440,16744206,16759672,2924588,10018698,14034728,16750742,9725885,12955861,9197131,12885140,14907330,16234194,8355711,13092807,12369186,14408589,1556175,10410725].map(xn),Cl=[3750777,5395619,7040719,10264286,6519097,9216594,11915115,13556636,9202993,12426809,15186514,15190932,8666169,11356490,14049643,15177372,8077683,10834324,13528509,14589654].map(xn),zl=[3244733,7057110,10406625,13032431,15095053,16616764,16625259,16634018,3253076,7652470,10607003,13101504,7695281,10394312,12369372,14342891,6513507,9868950,12434877,14277081].map(xn);oa.scale.quantile=function(){return oi([],[])},oa.scale.quantize=function(){return li(0,1,[0,1])},oa.scale.threshold=function(){return ci([.5],[0,1])},oa.scale.identity=function(){return si([0,1])},oa.svg={},oa.svg.arc=function(){function n(){var n=Math.max(0,+e.apply(this,arguments)),c=Math.max(0,+r.apply(this,arguments)),s=a.apply(this,arguments)-Ha,f=o.apply(this,arguments)-Ha,h=Math.abs(f-s),g=s>f?0:1;if(n>c&&(p=c,c=n,n=p),h>=Fa)return t(c,g)+(n?t(n,1-g):\\\"\\\")+\\\"Z\\\";var p,v,d,m,y,M,x,b,_,w,S,k,N=0,E=0,A=[];if((m=(+l.apply(this,arguments)||0)/2)&&(d=i===Ll?Math.sqrt(n*n+c*c):+i.apply(this,arguments),g||(E*=-1),c&&(E=tn(d/c*Math.sin(m))),n&&(N=tn(d/n*Math.sin(m)))),c){y=c*Math.cos(s+E),M=c*Math.sin(s+E),x=c*Math.cos(f-E),b=c*Math.sin(f-E);var C=Math.abs(f-s-2*E)<=ja?0:1;if(E&&mi(y,M,x,b)===g^C){var z=(s+f)/2;y=c*Math.cos(z),M=c*Math.sin(z),x=b=null}}else y=M=0;if(n){_=n*Math.cos(f-N),w=n*Math.sin(f-N),S=n*Math.cos(s+N),k=n*Math.sin(s+N);var L=Math.abs(s-f+2*N)<=ja?0:1;if(N&&mi(_,w,S,k)===1-g^L){var q=(s+f)/2;_=n*Math.cos(q),w=n*Math.sin(q),S=k=null}}else _=w=0;if(h>Da&&(p=Math.min(Math.abs(c-n)/2,+u.apply(this,arguments)))>.001){v=c>n^g?0:1;var T=p,R=p;if(ja>h){var D=null==S?[_,w]:null==x?[y,M]:Re([y,M],[S,k],[x,b],[_,w]),P=y-D[0],j=M-D[1],U=x-D[0],F=b-D[1],H=1/Math.sin(Math.acos((P*U+j*F)/(Math.sqrt(P*P+j*j)*Math.sqrt(U*U+F*F)))/2),O=Math.sqrt(D[0]*D[0]+D[1]*D[1]);R=Math.min(p,(n-O)/(H-1)),T=Math.min(p,(c-O)/(H+1))}if(null!=x){var I=yi(null==S?[_,w]:[S,k],[y,M],c,T,g),Y=yi([x,b],[_,w],c,T,g);p===T?A.push(\\\"M\\\",I[0],\\\"A\\\",T,\\\",\\\",T,\\\" 0 0,\\\",v,\\\" \\\",I[1],\\\"A\\\",c,\\\",\\\",c,\\\" 0 \\\",1-g^mi(I[1][0],I[1][1],Y[1][0],Y[1][1]),\\\",\\\",g,\\\" \\\",Y[1],\\\"A\\\",T,\\\",\\\",T,\\\" 0 0,\\\",v,\\\" \\\",Y[0]):A.push(\\\"M\\\",I[0],\\\"A\\\",T,\\\",\\\",T,\\\" 0 1,\\\",v,\\\" \\\",Y[0])}else A.push(\\\"M\\\",y,\\\",\\\",M);if(null!=S){var Z=yi([y,M],[S,k],n,-R,g),V=yi([_,w],null==x?[y,M]:[x,b],n,-R,g);p===R?A.push(\\\"L\\\",V[0],\\\"A\\\",R,\\\",\\\",R,\\\" 0 0,\\\",v,\\\" \\\",V[1],\\\"A\\\",n,\\\",\\\",n,\\\" 0 \\\",g^mi(V[1][0],V[1][1],Z[1][0],Z[1][1]),\\\",\\\",1-g,\\\" \\\",Z[1],\\\"A\\\",R,\\\",\\\",R,\\\" 0 0,\\\",v,\\\" \\\",Z[0]):A.push(\\\"L\\\",V[0],\\\"A\\\",R,\\\",\\\",R,\\\" 0 0,\\\",v,\\\" \\\",Z[0])}else A.push(\\\"L\\\",_,\\\",\\\",w)}else A.push(\\\"M\\\",y,\\\",\\\",M),null!=x&&A.push(\\\"A\\\",c,\\\",\\\",c,\\\" 0 \\\",C,\\\",\\\",g,\\\" \\\",x,\\\",\\\",b),A.push(\\\"L\\\",_,\\\",\\\",w),null!=S&&A.push(\\\"A\\\",n,\\\",\\\",n,\\\" 0 \\\",L,\\\",\\\",1-g,\\\" \\\",S,\\\",\\\",k);return A.push(\\\"Z\\\"),A.join(\\\"\\\")}function t(n,t){return\\\"M0,\\\"+n+\\\"A\\\"+n+\\\",\\\"+n+\\\" 0 1,\\\"+t+\\\" 0,\\\"+-n+\\\"A\\\"+n+\\\",\\\"+n+\\\" 0 1,\\\"+t+\\\" 0,\\\"+n}var e=hi,r=gi,u=fi,i=Ll,a=pi,o=vi,l=di;return n.innerRadius=function(t){return arguments.length?(e=En(t),n):e},n.outerRadius=function(t){return arguments.length?(r=En(t),n):r},n.cornerRadius=function(t){return arguments.length?(u=En(t),n):u},n.padRadius=function(t){return arguments.length?(i=t==Ll?Ll:En(t),n):i},n.startAngle=function(t){return arguments.length?(a=En(t),n):a},n.endAngle=function(t){return arguments.length?(o=En(t),n):o},n.padAngle=function(t){return arguments.length?(l=En(t),n):l},n.centroid=function(){var n=(+e.apply(this,arguments)+ +r.apply(this,arguments))/2,t=(+a.apply(this,arguments)+ +o.apply(this,arguments))/2-Ha;return[Math.cos(t)*n,Math.sin(t)*n]},n};var Ll=\\\"auto\\\";oa.svg.line=function(){return Mi(y)};var ql=oa.map({linear:xi,\\\"linear-closed\\\":bi,step:_i,\\\"step-before\\\":wi,\\\"step-after\\\":Si,basis:zi,\\\"basis-open\\\":Li,\\\"basis-closed\\\":qi,bundle:Ti,cardinal:Ei,\\\"cardinal-open\\\":ki,\\\"cardinal-closed\\\":Ni,monotone:Fi});ql.forEach(function(n,t){t.key=n,t.closed=/-closed$/.test(n)});var Tl=[0,2/3,1/3,0],Rl=[0,1/3,2/3,0],Dl=[0,1/6,2/3,1/6];oa.svg.line.radial=function(){var n=Mi(Hi);return n.radius=n.x,delete n.x,n.angle=n.y,delete n.y,n},wi.reverse=Si,Si.reverse=wi,oa.svg.area=function(){return Oi(y)},oa.svg.area.radial=function(){var n=Oi(Hi);return n.radius=n.x,delete n.x,n.innerRadius=n.x0,delete n.x0,n.outerRadius=n.x1,delete n.x1,n.angle=n.y,delete n.y,n.startAngle=n.y0,delete n.y0,n.endAngle=n.y1,delete n.y1,n},oa.svg.chord=function(){function n(n,o){var l=t(this,i,n,o),c=t(this,a,n,o);return\\\"M\\\"+l.p0+r(l.r,l.p1,l.a1-l.a0)+(e(l,c)?u(l.r,l.p1,l.r,l.p0):u(l.r,l.p1,c.r,c.p0)+r(c.r,c.p1,c.a1-c.a0)+u(c.r,c.p1,l.r,l.p0))+\\\"Z\\\"}function t(n,t,e,r){var u=t.call(n,e,r),i=o.call(n,u,r),a=l.call(n,u,r)-Ha,s=c.call(n,u,r)-Ha;return{r:i,a0:a,a1:s,p0:[i*Math.cos(a),i*Math.sin(a)],p1:[i*Math.cos(s),i*Math.sin(s)]}}function e(n,t){return n.a0==t.a0&&n.a1==t.a1}function r(n,t,e){return\\\"A\\\"+n+\\\",\\\"+n+\\\" 0 \\\"+ +(e>ja)+\\\",1 \\\"+t}function u(n,t,e,r){return\\\"Q 0,0 \\\"+r}var i=Me,a=xe,o=Ii,l=pi,c=vi;return n.radius=function(t){return arguments.length?(o=En(t),n):o},n.source=function(t){return arguments.length?(i=En(t),n):i},n.target=function(t){return arguments.length?(a=En(t),n):a},n.startAngle=function(t){return arguments.length?(l=En(t),n):l},n.endAngle=function(t){return arguments.length?(c=En(t),n):c},n},oa.svg.diagonal=function(){function n(n,u){var i=t.call(this,n,u),a=e.call(this,n,u),o=(i.y+a.y)/2,l=[i,{x:i.x,y:o},{x:a.x,y:o},a];return l=l.map(r),\\\"M\\\"+l[0]+\\\"C\\\"+l[1]+\\\" \\\"+l[2]+\\\" \\\"+l[3]}var t=Me,e=xe,r=Yi;return n.source=function(e){return arguments.length?(t=En(e),n):t},n.target=function(t){return arguments.length?(e=En(t),n):e},n.projection=function(t){return arguments.length?(r=t,n):r},n},oa.svg.diagonal.radial=function(){var n=oa.svg.diagonal(),t=Yi,e=n.projection;return n.projection=function(n){return arguments.length?e(Zi(t=n)):t},n},oa.svg.symbol=function(){function n(n,r){return(Pl.get(t.call(this,n,r))||$i)(e.call(this,n,r))}var t=Xi,e=Vi;return n.type=function(e){return arguments.length?(t=En(e),n):t},n.size=function(t){return arguments.length?(e=En(t),n):e},n};var Pl=oa.map({circle:$i,cross:function(n){var t=Math.sqrt(n/5)/2;return\\\"M\\\"+-3*t+\\\",\\\"+-t+\\\"H\\\"+-t+\\\"V\\\"+-3*t+\\\"H\\\"+t+\\\"V\\\"+-t+\\\"H\\\"+3*t+\\\"V\\\"+t+\\\"H\\\"+t+\\\"V\\\"+3*t+\\\"H\\\"+-t+\\\"V\\\"+t+\\\"H\\\"+-3*t+\\\"Z\\\"},diamond:function(n){var t=Math.sqrt(n/(2*Ul)),e=t*Ul;return\\\"M0,\\\"+-t+\\\"L\\\"+e+\\\",0 0,\\\"+t+\\\" \\\"+-e+\\\",0Z\\\"},square:function(n){var t=Math.sqrt(n)/2;return\\\"M\\\"+-t+\\\",\\\"+-t+\\\"L\\\"+t+\\\",\\\"+-t+\\\" \\\"+t+\\\",\\\"+t+\\\" \\\"+-t+\\\",\\\"+t+\\\"Z\\\"},\\\"triangle-down\\\":function(n){var t=Math.sqrt(n/jl),e=t*jl/2;return\\\"M0,\\\"+e+\\\"L\\\"+t+\\\",\\\"+-e+\\\" \\\"+-t+\\\",\\\"+-e+\\\"Z\\\"},\\\"triangle-up\\\":function(n){var t=Math.sqrt(n/jl),e=t*jl/2;return\\\"M0,\\\"+-e+\\\"L\\\"+t+\\\",\\\"+e+\\\" \\\"+-t+\\\",\\\"+e+\\\"Z\\\"}});oa.svg.symbolTypes=Pl.keys();var jl=Math.sqrt(3),Ul=Math.tan(30*Oa);Aa.transition=function(n){for(var t,e,r=Fl||++Yl,u=Ki(n),i=[],a=Hl||{time:Date.now(),ease:Nr,delay:0,duration:250},o=-1,l=this.length;++oi;i++){u.push(t=[]);for(var e=this[i],o=0,l=e.length;l>o;o++)(r=e[o])&&n.call(r,r.__data__,o,i)&&t.push(r)}return Wi(u,this.namespace,this.id)},Il.tween=function(n,t){var e=this.id,r=this.namespace;return arguments.length<2?this.node()[r][e].tween.get(n):Y(this,null==t?function(t){t[r][e].tween.remove(n)}:function(u){u[r][e].tween.set(n,t)})},Il.attr=function(n,t){function e(){this.removeAttribute(o)}function r(){this.removeAttributeNS(o.space,o.local)}function u(n){return null==n?e:(n+=\\\"\\\",function(){var t,e=this.getAttribute(o);return e!==n&&(t=a(e,n),function(n){this.setAttribute(o,t(n))})})}function i(n){return null==n?r:(n+=\\\"\\\",function(){var t,e=this.getAttributeNS(o.space,o.local);return e!==n&&(t=a(e,n),function(n){this.setAttributeNS(o.space,o.local,t(n))})})}if(arguments.length<2){for(t in n)this.attr(t,n[t]);return this}var a=\\\"transform\\\"==n?$r:Mr,o=oa.ns.qualify(n);return Ji(this,\\\"attr.\\\"+n,t,o.local?i:u)},Il.attrTween=function(n,t){function e(n,e){var r=t.call(this,n,e,this.getAttribute(u));return r&&function(n){this.setAttribute(u,r(n))}}function r(n,e){var r=t.call(this,n,e,this.getAttributeNS(u.space,u.local));return r&&function(n){this.setAttributeNS(u.space,u.local,r(n))}}var u=oa.ns.qualify(n);return this.tween(\\\"attr.\\\"+n,u.local?r:e)},Il.style=function(n,e,r){function u(){this.style.removeProperty(n)}function i(e){return null==e?u:(e+=\\\"\\\",function(){var u,i=t(this).getComputedStyle(this,null).getPropertyValue(n);return i!==e&&(u=Mr(i,e),function(t){this.style.setProperty(n,u(t),r)})})}var a=arguments.length;if(3>a){if(\\\"string\\\"!=typeof n){2>a&&(e=\\\"\\\");for(r in n)this.style(r,n[r],e);return this}r=\\\"\\\"}return Ji(this,\\\"style.\\\"+n,e,i)},Il.styleTween=function(n,e,r){function u(u,i){var a=e.call(this,u,i,t(this).getComputedStyle(this,null).getPropertyValue(n));return a&&function(t){this.style.setProperty(n,a(t),r)}}return arguments.length<3&&(r=\\\"\\\"),this.tween(\\\"style.\\\"+n,u)},Il.text=function(n){return Ji(this,\\\"text\\\",n,Gi)},Il.remove=function(){var n=this.namespace;return this.each(\\\"end.transition\\\",function(){var t;this[n].count<2&&(t=this.parentNode)&&t.removeChild(this)})},Il.ease=function(n){var t=this.id,e=this.namespace;return arguments.length<1?this.node()[e][t].ease:(\\\"function\\\"!=typeof n&&(n=oa.ease.apply(oa,arguments)),Y(this,function(r){r[e][t].ease=n}))},Il.delay=function(n){var t=this.id,e=this.namespace;return arguments.length<1?this.node()[e][t].delay:Y(this,\\\"function\\\"==typeof n?function(r,u,i){r[e][t].delay=+n.call(r,r.__data__,u,i)}:(n=+n,function(r){r[e][t].delay=n}))},Il.duration=function(n){var t=this.id,e=this.namespace;return arguments.length<1?this.node()[e][t].duration:Y(this,\\\"function\\\"==typeof n?function(r,u,i){r[e][t].duration=Math.max(1,n.call(r,r.__data__,u,i))}:(n=Math.max(1,n),function(r){r[e][t].duration=n}))},Il.each=function(n,t){var e=this.id,r=this.namespace;if(arguments.length<2){var u=Hl,i=Fl;try{Fl=e,Y(this,function(t,u,i){Hl=t[r][e],n.call(t,t.__data__,u,i)})}finally{Hl=u,Fl=i}}else Y(this,function(u){var i=u[r][e];(i.event||(i.event=oa.dispatch(\\\"start\\\",\\\"end\\\",\\\"interrupt\\\"))).on(n,t)});return this},Il.transition=function(){for(var n,t,e,r,u=this.id,i=++Yl,a=this.namespace,o=[],l=0,c=this.length;c>l;l++){o.push(n=[]);for(var t=this[l],s=0,f=t.length;f>s;s++)(e=t[s])&&(r=e[a][u],Qi(e,s,a,i,{time:r.time,ease:r.ease,delay:r.delay+r.duration,duration:r.duration})),n.push(e)}return Wi(o,a,i)},oa.svg.axis=function(){function n(n){n.each(function(){var n,c=oa.select(this),s=this.__chart__||e,f=this.__chart__=e.copy(),h=null==l?f.ticks?f.ticks.apply(f,o):f.domain():l,g=null==t?f.tickFormat?f.tickFormat.apply(f,o):y:t,p=c.selectAll(\\\".tick\\\").data(h,f),v=p.enter().insert(\\\"g\\\",\\\".domain\\\").attr(\\\"class\\\",\\\"tick\\\").style(\\\"opacity\\\",Da),d=oa.transition(p.exit()).style(\\\"opacity\\\",Da).remove(),m=oa.transition(p.order()).style(\\\"opacity\\\",1),M=Math.max(u,0)+a,x=Zu(f),b=c.selectAll(\\\".domain\\\").data([0]),_=(b.enter().append(\\\"path\\\").attr(\\\"class\\\",\\\"domain\\\"),oa.transition(b));v.append(\\\"line\\\"),v.append(\\\"text\\\");var w,S,k,N,E=v.select(\\\"line\\\"),A=m.select(\\\"line\\\"),C=p.select(\\\"text\\\").text(g),z=v.select(\\\"text\\\"),L=m.select(\\\"text\\\"),q=\\\"top\\\"===r||\\\"left\\\"===r?-1:1;if(\\\"bottom\\\"===r||\\\"top\\\"===r?(n=na,w=\\\"x\\\",k=\\\"y\\\",S=\\\"x2\\\",N=\\\"y2\\\",C.attr(\\\"dy\\\",0>q?\\\"0em\\\":\\\".71em\\\").style(\\\"text-anchor\\\",\\\"middle\\\"),_.attr(\\\"d\\\",\\\"M\\\"+x[0]+\\\",\\\"+q*i+\\\"V0H\\\"+x[1]+\\\"V\\\"+q*i)):(n=ta,w=\\\"y\\\",k=\\\"x\\\",S=\\\"y2\\\",N=\\\"x2\\\",C.attr(\\\"dy\\\",\\\".32em\\\").style(\\\"text-anchor\\\",0>q?\\\"end\\\":\\\"start\\\"),_.attr(\\\"d\\\",\\\"M\\\"+q*i+\\\",\\\"+x[0]+\\\"H0V\\\"+x[1]+\\\"H\\\"+q*i)),E.attr(N,q*u),z.attr(k,q*M),A.attr(S,0).attr(N,q*u),L.attr(w,0).attr(k,q*M),f.rangeBand){var T=f,R=T.rangeBand()/2;s=f=function(n){return T(n)+R}}else s.rangeBand?s=f:d.call(n,f,s);v.call(n,s,f),m.call(n,f,f)})}var t,e=oa.scale.linear(),r=Zl,u=6,i=6,a=3,o=[10],l=null;return n.scale=function(t){return arguments.length?(e=t,n):e},n.orient=function(t){return arguments.length?(r=t in Vl?t+\\\"\\\":Zl,n):r},n.ticks=function(){return arguments.length?(o=ca(arguments),n):o},n.tickValues=function(t){return arguments.length?(l=t,n):l},n.tickFormat=function(e){return arguments.length?(t=e,n):t},n.tickSize=function(t){var e=arguments.length;return e?(u=+t,i=+arguments[e-1],n):u},n.innerTickSize=function(t){return arguments.length?(u=+t,n):u},n.outerTickSize=function(t){return arguments.length?(i=+t,n):i},n.tickPadding=function(t){return arguments.length?(a=+t,n):a},n.tickSubdivide=function(){return arguments.length&&n},n};var Zl=\\\"bottom\\\",Vl={top:1,right:1,bottom:1,left:1};oa.svg.brush=function(){function n(t){t.each(function(){var t=oa.select(this).style(\\\"pointer-events\\\",\\\"all\\\").style(\\\"-webkit-tap-highlight-color\\\",\\\"rgba(0,0,0,0)\\\").on(\\\"mousedown.brush\\\",i).on(\\\"touchstart.brush\\\",i),a=t.selectAll(\\\".background\\\").data([0]);a.enter().append(\\\"rect\\\").attr(\\\"class\\\",\\\"background\\\").style(\\\"visibility\\\",\\\"hidden\\\").style(\\\"cursor\\\",\\\"crosshair\\\"),t.selectAll(\\\".extent\\\").data([0]).enter().append(\\\"rect\\\").attr(\\\"class\\\",\\\"extent\\\").style(\\\"cursor\\\",\\\"move\\\");var o=t.selectAll(\\\".resize\\\").data(v,y);o.exit().remove(),o.enter().append(\\\"g\\\").attr(\\\"class\\\",function(n){return\\\"resize \\\"+n}).style(\\\"cursor\\\",function(n){return Xl[n]}).append(\\\"rect\\\").attr(\\\"x\\\",function(n){return/[ew]$/.test(n)?-3:null}).attr(\\\"y\\\",function(n){return/^[ns]/.test(n)?-3:null}).attr(\\\"width\\\",6).attr(\\\"height\\\",6).style(\\\"visibility\\\",\\\"hidden\\\"),o.style(\\\"display\\\",n.empty()?\\\"none\\\":null);var l,f=oa.transition(t),h=oa.transition(a);c&&(l=Zu(c),h.attr(\\\"x\\\",l[0]).attr(\\\"width\\\",l[1]-l[0]),r(f)),s&&(l=Zu(s),h.attr(\\\"y\\\",l[0]).attr(\\\"height\\\",l[1]-l[0]),u(f)),e(f)})}function e(n){n.selectAll(\\\".resize\\\").attr(\\\"transform\\\",function(n){return\\\"translate(\\\"+f[+/e$/.test(n)]+\\\",\\\"+h[+/^s/.test(n)]+\\\")\\\"})}function r(n){n.select(\\\".extent\\\").attr(\\\"x\\\",f[0]),n.selectAll(\\\".extent,.n>rect,.s>rect\\\").attr(\\\"width\\\",f[1]-f[0])}function u(n){n.select(\\\".extent\\\").attr(\\\"y\\\",h[0]),n.selectAll(\\\".extent,.e>rect,.w>rect\\\").attr(\\\"height\\\",h[1]-h[0])}function i(){function i(){32==oa.event.keyCode&&(C||(M=null,L[0]-=f[1],L[1]-=h[1],C=2),S())}function v(){32==oa.event.keyCode&&2==C&&(L[0]+=f[1],L[1]+=h[1],C=0,S())}function d(){var n=oa.mouse(b),t=!1;x&&(n[0]+=x[0],n[1]+=x[1]),C||(oa.event.altKey?(M||(M=[(f[0]+f[1])/2,(h[0]+h[1])/2]),L[0]=f[+(n[0]s?(u=r,r=s):u=s),v[0]!=r||v[1]!=u?(e?o=null:a=null,v[0]=r,v[1]=u,!0):void 0}function y(){d(),k.style(\\\"pointer-events\\\",\\\"all\\\").selectAll(\\\".resize\\\").style(\\\"display\\\",n.empty()?\\\"none\\\":null),oa.select(\\\"body\\\").style(\\\"cursor\\\",null),q.on(\\\"mousemove.brush\\\",null).on(\\\"mouseup.brush\\\",null).on(\\\"touchmove.brush\\\",null).on(\\\"touchend.brush\\\",null).on(\\\"keydown.brush\\\",null).on(\\\"keyup.brush\\\",null),z(),w({type:\\\"brushend\\\"})}var M,x,b=this,_=oa.select(oa.event.target),w=l.of(b,arguments),k=oa.select(b),N=_.datum(),E=!/^(n|s)$/.test(N)&&c,A=!/^(e|w)$/.test(N)&&s,C=_.classed(\\\"extent\\\"),z=W(b),L=oa.mouse(b),q=oa.select(t(b)).on(\\\"keydown.brush\\\",i).on(\\\"keyup.brush\\\",v);if(oa.event.changedTouches?q.on(\\\"touchmove.brush\\\",d).on(\\\"touchend.brush\\\",y):q.on(\\\"mousemove.brush\\\",d).on(\\\"mouseup.brush\\\",y),k.interrupt().selectAll(\\\"*\\\").interrupt(),C)L[0]=f[0]-L[0],L[1]=h[0]-L[1];else if(N){var T=+/w$/.test(N),R=+/^n/.test(N);x=[f[1-T]-L[0],h[1-R]-L[1]],L[0]=f[T],L[1]=h[R]}else oa.event.altKey&&(M=L.slice());k.style(\\\"pointer-events\\\",\\\"none\\\").selectAll(\\\".resize\\\").style(\\\"display\\\",null),oa.select(\\\"body\\\").style(\\\"cursor\\\",_.style(\\\"cursor\\\")),w({type:\\\"brushstart\\\"}),d()}var a,o,l=N(n,\\\"brushstart\\\",\\\"brush\\\",\\\"brushend\\\"),c=null,s=null,f=[0,0],h=[0,0],g=!0,p=!0,v=$l[0];return n.event=function(n){n.each(function(){var n=l.of(this,arguments),t={x:f,y:h,i:a,j:o},e=this.__chart__||t;this.__chart__=t,Fl?oa.select(this).transition().each(\\\"start.brush\\\",function(){a=e.i,o=e.j,f=e.x,h=e.y,n({type:\\\"brushstart\\\"})}).tween(\\\"brush:brush\\\",function(){var e=xr(f,t.x),r=xr(h,t.y);return a=o=null,function(u){f=t.x=e(u),h=t.y=r(u),n({type:\\\"brush\\\",mode:\\\"resize\\\"})}}).each(\\\"end.brush\\\",function(){a=t.i,o=t.j,n({type:\\\"brush\\\",mode:\\\"resize\\\"}),n({type:\\\"brushend\\\"})}):(n({type:\\\"brushstart\\\"}),n({type:\\\"brush\\\",mode:\\\"resize\\\"}),n({type:\\\"brushend\\\"}))})},n.x=function(t){return arguments.length?(c=t,v=$l[!c<<1|!s],n):c},n.y=function(t){return arguments.length?(s=t,v=$l[!c<<1|!s],n):s},n.clamp=function(t){return arguments.length?(c&&s?(g=!!t[0],p=!!t[1]):c?g=!!t:s&&(p=!!t),n):c&&s?[g,p]:c?g:s?p:null},n.extent=function(t){var e,r,u,i,l;return arguments.length?(c&&(e=t[0],r=t[1],s&&(e=e[0],r=r[0]),a=[e,r],c.invert&&(e=c(e),r=c(r)),e>r&&(l=e,e=r,r=l),(e!=f[0]||r!=f[1])&&(f=[e,r])),s&&(u=t[0],i=t[1],c&&(u=u[1],i=i[1]),o=[u,i],s.invert&&(u=s(u),i=s(i)),u>i&&(l=u,u=i,i=l),(u!=h[0]||i!=h[1])&&(h=[u,i])),n):(c&&(a?(e=a[0],r=a[1]):(e=f[0],r=f[1],c.invert&&(e=c.invert(e),r=c.invert(r)),e>r&&(l=e,e=r,r=l))),s&&(o?(u=o[0],i=o[1]):(u=h[0],i=h[1],s.invert&&(u=s.invert(u),i=s.invert(i)),u>i&&(l=u,u=i,i=l))),c&&s?[[e,u],[r,i]]:c?[e,r]:s&&[u,i])},n.clear=function(){return n.empty()||(f=[0,0],h=[0,0],a=o=null),n},n.empty=function(){return!!c&&f[0]==f[1]||!!s&&h[0]==h[1]},oa.rebind(n,l,\\\"on\\\")};var Xl={n:\\\"ns-resize\\\",e:\\\"ew-resize\\\",s:\\\"ns-resize\\\",w:\\\"ew-resize\\\",nw:\\\"nwse-resize\\\",ne:\\\"nesw-resize\\\",se:\\\"nwse-resize\\\",sw:\\\"nesw-resize\\\"},$l=[[\\\"n\\\",\\\"e\\\",\\\"s\\\",\\\"w\\\",\\\"nw\\\",\\\"ne\\\",\\\"se\\\",\\\"sw\\\"],[\\\"e\\\",\\\"w\\\"],[\\\"n\\\",\\\"s\\\"],[]],Bl=ho.format=Mo.timeFormat,Wl=Bl.utc,Jl=Wl(\\\"%Y-%m-%dT%H:%M:%S.%LZ\\\");Bl.iso=Date.prototype.toISOString&&+new Date(\\\"2000-01-01T00:00:00.000Z\\\")?ea:Jl,ea.parse=function(n){var t=new Date(n);return isNaN(t)?null:t},ea.toString=Jl.toString,ho.second=On(function(n){return new go(1e3*Math.floor(n/1e3))},function(n,t){n.setTime(n.getTime()+1e3*Math.floor(t))},function(n){return n.getSeconds()}),ho.seconds=ho.second.range,ho.seconds.utc=ho.second.utc.range,ho.minute=On(function(n){return new go(6e4*Math.floor(n/6e4))},function(n,t){n.setTime(n.getTime()+6e4*Math.floor(t))},function(n){return n.getMinutes()}),ho.minutes=ho.minute.range,ho.minutes.utc=ho.minute.utc.range,ho.hour=On(function(n){var t=n.getTimezoneOffset()/60;return new go(36e5*(Math.floor(n/36e5-t)+t))},function(n,t){n.setTime(n.getTime()+36e5*Math.floor(t))},function(n){return n.getHours()}),ho.hours=ho.hour.range,ho.hours.utc=ho.hour.utc.range,ho.month=On(function(n){return n=ho.day(n),n.setDate(1),n},function(n,t){n.setMonth(n.getMonth()+t)},function(n){return n.getMonth()}),ho.months=ho.month.range,ho.months.utc=ho.month.utc.range;var Gl=[1e3,5e3,15e3,3e4,6e4,3e5,9e5,18e5,36e5,108e5,216e5,432e5,864e5,1728e5,6048e5,2592e6,7776e6,31536e6],Kl=[[ho.second,1],[ho.second,5],[ho.second,15],[ho.second,30],[ho.minute,1],[ho.minute,5],[ho.minute,15],[ho.minute,30],[ho.hour,1],[ho.hour,3],[ho.hour,6],[ho.hour,12],[ho.day,1],[ho.day,2],[ho.week,1],[ho.month,1],[ho.month,3],[ho.year,1]],Ql=Bl.multi([[\\\".%L\\\",function(n){return n.getMilliseconds()}],[\\\":%S\\\",function(n){return n.getSeconds()}],[\\\"%I:%M\\\",function(n){return n.getMinutes()}],[\\\"%I %p\\\",function(n){return n.getHours()}],[\\\"%a %d\\\",function(n){return n.getDay()&&1!=n.getDate()}],[\\\"%b %d\\\",function(n){return 1!=n.getDate()}],[\\\"%B\\\",function(n){return n.getMonth()}],[\\\"%Y\\\",zt]]),nc={range:function(n,t,e){return oa.range(Math.ceil(n/e)*e,+t,e).map(ua)},floor:y,ceil:y};Kl.year=ho.year,ho.scale=function(){return ra(oa.scale.linear(),Kl,Ql)};var tc=Kl.map(function(n){return[n[0].utc,n[1]]}),ec=Wl.multi([[\\\".%L\\\",function(n){return n.getUTCMilliseconds()}],[\\\":%S\\\",function(n){return n.getUTCSeconds()}],[\\\"%I:%M\\\",function(n){return n.getUTCMinutes()}],[\\\"%I %p\\\",function(n){return n.getUTCHours()}],[\\\"%a %d\\\",function(n){return n.getUTCDay()&&1!=n.getUTCDate()}],[\\\"%b %d\\\",function(n){return 1!=n.getUTCDate()}],[\\\"%B\\\",function(n){return n.getUTCMonth()}],[\\\"%Y\\\",zt]]);tc.year=ho.year.utc,ho.scale.utc=function(){return ra(oa.scale.linear(),tc,ec)},oa.text=An(function(n){return n.responseText}),oa.json=function(n,t){return Cn(n,\\\"application/json\\\",ia,t)},oa.html=function(n,t){return Cn(n,\\\"text/html\\\",aa,t)},oa.xml=An(function(n){return n.responseXML}),\\\"function\\\"==typeof define&&define.amd?(this.d3=oa,define(oa)):\\\"object\\\"==typeof module&&module.exports?module.exports=oa:this.d3=oa}();\"\n\n/***/ }),\n\n/***/ 2181:\n/***/ (function(module, exports, __webpack_require__) {\n\n__webpack_require__(3)(__webpack_require__(2182))\n\n/***/ }),\n\n/***/ 2182:\n/***/ (function(module, exports) {\n\nmodule.exports = \"(function(window) {\\n 'use strict';\\n\\n /*global define, module, exports, require */\\n\\n var c3 = { version: '0.4.11' };\\n\\n var c3_chart_fn, c3_chart_internal_fn, c3_chart_internal_axis_fn;\\n\\n function API(owner) {\\n this.owner = owner;\\n }\\n\\n function inherit(base, derived) {\\n if (Object.create) {\\n derived.prototype = Object.create(base.prototype);\\n } else {\\n var f = function f() {};\\n f.prototype = base.prototype;\\n derived.prototype = new f();\\n }\\n\\n derived.prototype.constructor = derived;\\n\\n return derived;\\n }\\n\\n function Chart(config) {\\n var $$ = (this.internal = new ChartInternal(this));\\n $$.loadConfig(config);\\n\\n $$.beforeInit(config);\\n $$.init();\\n $$.afterInit(config);\\n\\n // bind \\\"this\\\" to nested API\\n (function bindThis(fn, target, argThis) {\\n Object.keys(fn).forEach(function(key) {\\n target[key] = fn[key].bind(argThis);\\n if (Object.keys(fn[key]).length > 0) {\\n bindThis(fn[key], target[key], argThis);\\n }\\n });\\n })(c3_chart_fn, this, this);\\n }\\n\\n function ChartInternal(api) {\\n var $$ = this;\\n $$.d3 = window.d3 ? window.d3 : typeof require !== 'undefined' ? require('d3') : undefined;\\n $$.api = api;\\n $$.config = $$.getDefaultConfig();\\n $$.data = {};\\n $$.cache = {};\\n $$.axes = {};\\n }\\n\\n c3.generate = function(config) {\\n return new Chart(config);\\n };\\n\\n c3.chart = {\\n fn: Chart.prototype,\\n internal: {\\n fn: ChartInternal.prototype,\\n axis: {\\n fn: Axis.prototype\\n }\\n }\\n };\\n c3_chart_fn = c3.chart.fn;\\n c3_chart_internal_fn = c3.chart.internal.fn;\\n c3_chart_internal_axis_fn = c3.chart.internal.axis.fn;\\n\\n c3_chart_internal_fn.beforeInit = function() {\\n // can do something\\n };\\n c3_chart_internal_fn.afterInit = function() {\\n // can do something\\n };\\n c3_chart_internal_fn.init = function() {\\n var $$ = this,\\n config = $$.config;\\n\\n $$.initParams();\\n\\n if (config.data_url) {\\n $$.convertUrlToData(\\n config.data_url,\\n config.data_mimeType,\\n config.data_headers,\\n config.data_keys,\\n $$.initWithData\\n );\\n } else if (config.data_json) {\\n $$.initWithData($$.convertJsonToData(config.data_json, config.data_keys));\\n } else if (config.data_rows) {\\n $$.initWithData($$.convertRowsToData(config.data_rows));\\n } else if (config.data_columns) {\\n $$.initWithData($$.convertColumnsToData(config.data_columns));\\n } else {\\n throw Error('url or json or rows or columns is required.');\\n }\\n };\\n\\n c3_chart_internal_fn.initParams = function() {\\n var $$ = this,\\n d3 = $$.d3,\\n config = $$.config;\\n\\n // MEMO: clipId needs to be unique because it conflicts when multiple charts exist\\n ($$.clipId = 'c3-' + +new Date() + '-clip'),\\n ($$.clipIdForXAxis = $$.clipId + '-xaxis'),\\n ($$.clipIdForYAxis = $$.clipId + '-yaxis'),\\n ($$.clipIdForGrid = $$.clipId + '-grid'),\\n ($$.clipIdForSubchart = $$.clipId + '-subchart'),\\n ($$.clipPath = $$.getClipPath($$.clipId)),\\n ($$.clipPathForXAxis = $$.getClipPath($$.clipIdForXAxis)),\\n ($$.clipPathForYAxis = $$.getClipPath($$.clipIdForYAxis));\\n ($$.clipPathForGrid = $$.getClipPath($$.clipIdForGrid)),\\n ($$.clipPathForSubchart = $$.getClipPath($$.clipIdForSubchart)),\\n ($$.dragStart = null);\\n $$.dragging = false;\\n $$.flowing = false;\\n $$.cancelClick = false;\\n $$.mouseover = false;\\n $$.transiting = false;\\n\\n $$.color = $$.generateColor();\\n $$.levelColor = $$.generateLevelColor();\\n\\n $$.dataTimeFormat = config.data_xLocaltime ? d3.time.format : d3.time.format.utc;\\n $$.axisTimeFormat = config.axis_x_localtime ? d3.time.format : d3.time.format.utc;\\n $$.defaultAxisTimeFormat = $$.axisTimeFormat.multi([\\n [\\n '.%L',\\n function(d) {\\n return d.getMilliseconds();\\n }\\n ],\\n [\\n ':%S',\\n function(d) {\\n return d.getSeconds();\\n }\\n ],\\n [\\n '%I:%M',\\n function(d) {\\n return d.getMinutes();\\n }\\n ],\\n [\\n '%I %p',\\n function(d) {\\n return d.getHours();\\n }\\n ],\\n [\\n '%-m/%-d',\\n function(d) {\\n return d.getDay() && d.getDate() !== 1;\\n }\\n ],\\n [\\n '%-m/%-d',\\n function(d) {\\n return d.getDate() !== 1;\\n }\\n ],\\n [\\n '%-m/%-d',\\n function(d) {\\n return d.getMonth();\\n }\\n ],\\n [\\n '%Y/%-m/%-d',\\n function() {\\n return true;\\n }\\n ]\\n ]);\\n\\n $$.hiddenTargetIds = [];\\n $$.hiddenLegendIds = [];\\n $$.focusedTargetIds = [];\\n $$.defocusedTargetIds = [];\\n\\n $$.xOrient = config.axis_rotated ? 'left' : 'bottom';\\n $$.yOrient = config.axis_rotated\\n ? config.axis_y_inner\\n ? 'top'\\n : 'bottom'\\n : config.axis_y_inner\\n ? 'right'\\n : 'left';\\n $$.y2Orient = config.axis_rotated\\n ? config.axis_y2_inner\\n ? 'bottom'\\n : 'top'\\n : config.axis_y2_inner\\n ? 'left'\\n : 'right';\\n $$.subXOrient = config.axis_rotated ? 'left' : 'bottom';\\n\\n $$.isLegendRight = config.legend_position === 'right';\\n $$.isLegendInset = config.legend_position === 'inset';\\n $$.isLegendTop = config.legend_inset_anchor === 'top-left' || config.legend_inset_anchor === 'top-right';\\n $$.isLegendLeft = config.legend_inset_anchor === 'top-left' || config.legend_inset_anchor === 'bottom-left';\\n $$.legendStep = 0;\\n $$.legendItemWidth = 0;\\n $$.legendItemHeight = 0;\\n\\n $$.currentMaxTickWidths = {\\n x: 0,\\n y: 0,\\n y2: 0\\n };\\n\\n $$.rotated_padding_left = 30;\\n $$.rotated_padding_right = config.axis_rotated && !config.axis_x_show ? 0 : 30;\\n $$.rotated_padding_top = 5;\\n\\n $$.withoutFadeIn = {};\\n\\n $$.intervalForObserveInserted = undefined;\\n\\n $$.axes.subx = d3.selectAll([]); // needs when excluding subchart.js\\n };\\n\\n c3_chart_internal_fn.initChartElements = function() {\\n if (this.initBar) {\\n this.initBar();\\n }\\n if (this.initLine) {\\n this.initLine();\\n }\\n if (this.initArc) {\\n this.initArc();\\n }\\n if (this.initGauge) {\\n this.initGauge();\\n }\\n if (this.initText) {\\n this.initText();\\n }\\n };\\n\\n c3_chart_internal_fn.initWithData = function(data) {\\n var $$ = this,\\n d3 = $$.d3,\\n config = $$.config;\\n var defs,\\n main,\\n binding = true;\\n\\n $$.axis = new Axis($$);\\n\\n if ($$.initPie) {\\n $$.initPie();\\n }\\n if ($$.initBrush) {\\n $$.initBrush();\\n }\\n if ($$.initZoom) {\\n $$.initZoom();\\n }\\n\\n if (!config.bindto) {\\n $$.selectChart = d3.selectAll([]);\\n } else if (typeof config.bindto.node === 'function') {\\n $$.selectChart = config.bindto;\\n } else {\\n $$.selectChart = d3.select(config.bindto);\\n }\\n if ($$.selectChart.empty()) {\\n $$.selectChart = d3.select(document.createElement('div')).style('opacity', 0);\\n $$.observeInserted($$.selectChart);\\n binding = false;\\n }\\n $$.selectChart.html('').classed('c3', true);\\n\\n // Init data as targets\\n $$.data.xs = {};\\n $$.data.targets = $$.convertDataToTargets(data);\\n\\n if (config.data_filter) {\\n $$.data.targets = $$.data.targets.filter(config.data_filter);\\n }\\n\\n // Set targets to hide if needed\\n if (config.data_hide) {\\n $$.addHiddenTargetIds(config.data_hide === true ? $$.mapToIds($$.data.targets) : config.data_hide);\\n }\\n if (config.legend_hide) {\\n $$.addHiddenLegendIds(config.legend_hide === true ? $$.mapToIds($$.data.targets) : config.legend_hide);\\n }\\n\\n // when gauge, hide legend // TODO: fix\\n if ($$.hasType('gauge')) {\\n config.legend_show = false;\\n }\\n\\n // Init sizes and scales\\n $$.updateSizes();\\n $$.updateScales();\\n\\n // Set domains for each scale\\n $$.x.domain(d3.extent($$.getXDomain($$.data.targets)));\\n $$.y.domain($$.getYDomain($$.data.targets, 'y'));\\n $$.y2.domain($$.getYDomain($$.data.targets, 'y2'));\\n $$.subX.domain($$.x.domain());\\n $$.subY.domain($$.y.domain());\\n $$.subY2.domain($$.y2.domain());\\n\\n // Save original x domain for zoom update\\n $$.orgXDomain = $$.x.domain();\\n\\n // Set initialized scales to brush and zoom\\n if ($$.brush) {\\n $$.brush.scale($$.subX);\\n }\\n if (config.zoom_enabled) {\\n $$.zoom.scale($$.x);\\n }\\n\\n /*-- Basic Elements --*/\\n\\n // Define svgs\\n $$.svg = $$.selectChart\\n .append('svg')\\n .style('overflow', 'hidden')\\n .on('mouseenter', function() {\\n return config.onmouseover.call($$);\\n })\\n .on('mouseleave', function() {\\n return config.onmouseout.call($$);\\n });\\n\\n if ($$.config.svg_classname) {\\n $$.svg.attr('class', $$.config.svg_classname);\\n }\\n\\n // Define defs\\n defs = $$.svg.append('defs');\\n $$.clipChart = $$.appendClip(defs, $$.clipId);\\n $$.clipXAxis = $$.appendClip(defs, $$.clipIdForXAxis);\\n $$.clipYAxis = $$.appendClip(defs, $$.clipIdForYAxis);\\n $$.clipGrid = $$.appendClip(defs, $$.clipIdForGrid);\\n $$.clipSubchart = $$.appendClip(defs, $$.clipIdForSubchart);\\n $$.updateSvgSize();\\n\\n // Define regions\\n main = $$.main = $$.svg.append('g').attr('transform', $$.getTranslate('main'));\\n\\n if ($$.initSubchart) {\\n $$.initSubchart();\\n }\\n if ($$.initTooltip) {\\n $$.initTooltip();\\n }\\n if ($$.initLegend) {\\n $$.initLegend();\\n }\\n if ($$.initTitle) {\\n $$.initTitle();\\n }\\n\\n /*-- Main Region --*/\\n\\n // text when empty\\n main\\n .append('text')\\n .attr('class', CLASS.text + ' ' + CLASS.empty)\\n .attr('text-anchor', 'middle') // horizontal centering of text at x position in all browsers.\\n .attr('dominant-baseline', 'middle'); // vertical centering of text at y position in all browsers, except IE.\\n\\n // Regions\\n $$.initRegion();\\n\\n // Grids\\n $$.initGrid();\\n\\n // Define g for chart area\\n main\\n .append('g')\\n .attr('clip-path', $$.clipPath)\\n .attr('class', CLASS.chart);\\n\\n // Grid lines\\n if (config.grid_lines_front) {\\n $$.initGridLines();\\n }\\n\\n // Cover whole with rects for events\\n $$.initEventRect();\\n\\n // Define g for chart\\n $$.initChartElements();\\n\\n // if zoom privileged, insert rect to forefront\\n // TODO: is this needed?\\n main\\n .insert('rect', config.zoom_privileged ? null : 'g.' + CLASS.regions)\\n .attr('class', CLASS.zoomRect)\\n .attr('width', $$.width)\\n .attr('height', $$.height)\\n .style('opacity', 0)\\n .on('dblclick.zoom', null);\\n\\n // Set default extent if defined\\n if (config.axis_x_extent) {\\n $$.brush.extent($$.getDefaultExtent());\\n }\\n\\n // Add Axis\\n $$.axis.init();\\n\\n // Set targets\\n $$.updateTargets($$.data.targets);\\n\\n // Draw with targets\\n if (binding) {\\n $$.updateDimension();\\n $$.config.oninit.call($$);\\n $$.redraw({\\n withTransition: false,\\n withTransform: true,\\n withUpdateXDomain: true,\\n withUpdateOrgXDomain: true,\\n withTransitionForAxis: false\\n });\\n }\\n\\n // Bind resize event\\n $$.bindResize();\\n\\n // export element of the chart\\n $$.api.element = $$.selectChart.node();\\n };\\n\\n c3_chart_internal_fn.smoothLines = function(el, type) {\\n var $$ = this;\\n if (type === 'grid') {\\n el.each(function() {\\n var g = $$.d3.select(this),\\n x1 = g.attr('x1'),\\n x2 = g.attr('x2'),\\n y1 = g.attr('y1'),\\n y2 = g.attr('y2');\\n g.attr({\\n x1: Math.ceil(x1),\\n x2: Math.ceil(x2),\\n y1: Math.ceil(y1),\\n y2: Math.ceil(y2)\\n });\\n });\\n }\\n };\\n\\n c3_chart_internal_fn.updateSizes = function() {\\n var $$ = this,\\n config = $$.config;\\n var legendHeight = $$.legend ? $$.getLegendHeight() : 0,\\n legendWidth = $$.legend ? $$.getLegendWidth() : 0,\\n legendHeightForBottom = $$.isLegendRight || $$.isLegendInset ? 0 : legendHeight,\\n hasArc = $$.hasArcType(),\\n xAxisHeight = config.axis_rotated || hasArc ? 0 : $$.getHorizontalAxisHeight('x'),\\n subchartHeight = config.subchart_show && !hasArc ? config.subchart_size_height + xAxisHeight : 0;\\n\\n $$.currentWidth = $$.getCurrentWidth();\\n $$.currentHeight = $$.getCurrentHeight();\\n\\n // for main\\n $$.margin = config.axis_rotated\\n ? {\\n top: $$.getHorizontalAxisHeight('y2') + $$.getCurrentPaddingTop(),\\n right: hasArc ? 0 : $$.getCurrentPaddingRight(),\\n bottom: $$.getHorizontalAxisHeight('y') + legendHeightForBottom + $$.getCurrentPaddingBottom(),\\n left: subchartHeight + (hasArc ? 0 : $$.getCurrentPaddingLeft())\\n }\\n : {\\n top: 4 + $$.getCurrentPaddingTop(), // for top tick text\\n right: hasArc ? 0 : $$.getCurrentPaddingRight(),\\n bottom: xAxisHeight + subchartHeight + legendHeightForBottom + $$.getCurrentPaddingBottom(),\\n left: hasArc ? 0 : $$.getCurrentPaddingLeft()\\n };\\n\\n // for subchart\\n $$.margin2 = config.axis_rotated\\n ? {\\n top: $$.margin.top,\\n right: NaN,\\n bottom: 20 + legendHeightForBottom,\\n left: $$.rotated_padding_left\\n }\\n : {\\n top: $$.currentHeight - subchartHeight - legendHeightForBottom,\\n right: NaN,\\n bottom: xAxisHeight + legendHeightForBottom,\\n left: $$.margin.left\\n };\\n\\n // for legend\\n $$.margin3 = {\\n top: 0,\\n right: NaN,\\n bottom: 0,\\n left: 0\\n };\\n if ($$.updateSizeForLegend) {\\n $$.updateSizeForLegend(legendHeight, legendWidth);\\n }\\n\\n $$.width = $$.currentWidth - $$.margin.left - $$.margin.right;\\n $$.height = $$.currentHeight - $$.margin.top - $$.margin.bottom;\\n if ($$.width < 0) {\\n $$.width = 0;\\n }\\n if ($$.height < 0) {\\n $$.height = 0;\\n }\\n\\n $$.width2 = config.axis_rotated ? $$.margin.left - $$.rotated_padding_left - $$.rotated_padding_right : $$.width;\\n $$.height2 = config.axis_rotated ? $$.height : $$.currentHeight - $$.margin2.top - $$.margin2.bottom;\\n if ($$.width2 < 0) {\\n $$.width2 = 0;\\n }\\n if ($$.height2 < 0) {\\n $$.height2 = 0;\\n }\\n\\n // for arc\\n $$.arcWidth = $$.width - ($$.isLegendRight ? legendWidth + 10 : 0);\\n $$.arcHeight = $$.height - ($$.isLegendRight ? 0 : 10);\\n if ($$.hasType('gauge') && !config.gauge_fullCircle) {\\n $$.arcHeight += $$.height - $$.getGaugeLabelHeight();\\n }\\n if ($$.updateRadius) {\\n $$.updateRadius();\\n }\\n\\n if ($$.isLegendRight && hasArc) {\\n $$.margin3.left = $$.arcWidth / 2 + $$.radiusExpanded * 1.1;\\n }\\n };\\n\\n c3_chart_internal_fn.updateTargets = function(targets) {\\n var $$ = this;\\n\\n /*-- Main --*/\\n\\n //-- Text --//\\n $$.updateTargetsForText(targets);\\n\\n //-- Bar --//\\n $$.updateTargetsForBar(targets);\\n\\n //-- Line --//\\n $$.updateTargetsForLine(targets);\\n\\n //-- Arc --//\\n if ($$.hasArcType() && $$.updateTargetsForArc) {\\n $$.updateTargetsForArc(targets);\\n }\\n\\n /*-- Sub --*/\\n\\n if ($$.updateTargetsForSubchart) {\\n $$.updateTargetsForSubchart(targets);\\n }\\n\\n // Fade-in each chart\\n $$.showTargets();\\n };\\n c3_chart_internal_fn.showTargets = function() {\\n var $$ = this;\\n $$.svg\\n .selectAll('.' + CLASS.target)\\n .filter(function(d) {\\n return $$.isTargetToShow(d.id);\\n })\\n .transition()\\n .duration($$.config.transition_duration)\\n .style('opacity', 1);\\n };\\n\\n c3_chart_internal_fn.redraw = function(options, transitions) {\\n var $$ = this,\\n main = $$.main,\\n d3 = $$.d3,\\n config = $$.config;\\n var areaIndices = $$.getShapeIndices($$.isAreaType),\\n barIndices = $$.getShapeIndices($$.isBarType),\\n lineIndices = $$.getShapeIndices($$.isLineType);\\n var withY,\\n withSubchart,\\n withTransition,\\n withTransitionForExit,\\n withTransitionForAxis,\\n withTransform,\\n withUpdateXDomain,\\n withUpdateOrgXDomain,\\n withTrimXDomain,\\n withLegend,\\n withEventRect,\\n withDimension,\\n withUpdateXAxis;\\n var hideAxis = $$.hasArcType();\\n var drawArea, drawBar, drawLine, xForText, yForText;\\n var duration, durationForExit, durationForAxis;\\n var waitForDraw, flow;\\n var targetsToShow = $$.filterTargetsToShow($$.data.targets),\\n tickValues,\\n i,\\n intervalForCulling,\\n xDomainForZoom;\\n var xv = $$.xv.bind($$),\\n cx,\\n cy;\\n\\n options = options || {};\\n withY = getOption(options, 'withY', true);\\n withSubchart = getOption(options, 'withSubchart', true);\\n withTransition = getOption(options, 'withTransition', true);\\n withTransform = getOption(options, 'withTransform', false);\\n withUpdateXDomain = getOption(options, 'withUpdateXDomain', false);\\n withUpdateOrgXDomain = getOption(options, 'withUpdateOrgXDomain', false);\\n withTrimXDomain = getOption(options, 'withTrimXDomain', true);\\n withUpdateXAxis = getOption(options, 'withUpdateXAxis', withUpdateXDomain);\\n withLegend = getOption(options, 'withLegend', false);\\n withEventRect = getOption(options, 'withEventRect', true);\\n withDimension = getOption(options, 'withDimension', true);\\n withTransitionForExit = getOption(options, 'withTransitionForExit', withTransition);\\n withTransitionForAxis = getOption(options, 'withTransitionForAxis', withTransition);\\n\\n duration = withTransition ? config.transition_duration : 0;\\n durationForExit = withTransitionForExit ? duration : 0;\\n durationForAxis = withTransitionForAxis ? duration : 0;\\n\\n transitions = transitions || $$.axis.generateTransitions(durationForAxis);\\n\\n // update legend and transform each g\\n if (withLegend && config.legend_show) {\\n $$.updateLegend($$.mapToIds($$.data.targets), options, transitions);\\n } else if (withDimension) {\\n // need to update dimension (e.g. axis.y.tick.values) because y tick values should change\\n // no need to update axis in it because they will be updated in redraw()\\n $$.updateDimension(true);\\n }\\n\\n // MEMO: needed for grids calculation\\n if ($$.isCategorized() && targetsToShow.length === 0) {\\n $$.x.domain([0, $$.axes.x.selectAll('.tick').size()]);\\n }\\n\\n if (targetsToShow.length) {\\n $$.updateXDomain(targetsToShow, withUpdateXDomain, withUpdateOrgXDomain, withTrimXDomain);\\n if (!config.axis_x_tick_values) {\\n tickValues = $$.axis.updateXAxisTickValues(targetsToShow);\\n }\\n } else {\\n $$.xAxis.tickValues([]);\\n $$.subXAxis.tickValues([]);\\n }\\n\\n if (config.zoom_rescale && !options.flow) {\\n xDomainForZoom = $$.x.orgDomain();\\n }\\n\\n $$.y.domain($$.getYDomain(targetsToShow, 'y', xDomainForZoom));\\n $$.y2.domain($$.getYDomain(targetsToShow, 'y2', xDomainForZoom));\\n\\n if (!config.axis_y_tick_values && config.axis_y_tick_count) {\\n $$.yAxis.tickValues($$.axis.generateTickValues($$.y.domain(), config.axis_y_tick_count));\\n }\\n if (!config.axis_y2_tick_values && config.axis_y2_tick_count) {\\n $$.y2Axis.tickValues($$.axis.generateTickValues($$.y2.domain(), config.axis_y2_tick_count));\\n }\\n\\n // axes\\n $$.axis.redraw(transitions, hideAxis);\\n\\n // Update axis label\\n $$.axis.updateLabels(withTransition);\\n\\n // show/hide if manual culling needed\\n if ((withUpdateXDomain || withUpdateXAxis) && targetsToShow.length) {\\n if (config.axis_x_tick_culling && tickValues) {\\n for (i = 1; i < tickValues.length; i++) {\\n if (tickValues.length / i < config.axis_x_tick_culling_max) {\\n intervalForCulling = i;\\n break;\\n }\\n }\\n $$.svg.selectAll('.' + CLASS.axisX + ' .tick text').each(function(e) {\\n var index = tickValues.indexOf(e);\\n if (index >= 0) {\\n d3.select(this).style('display', index % intervalForCulling ? 'none' : 'block');\\n }\\n });\\n } else {\\n $$.svg.selectAll('.' + CLASS.axisX + ' .tick text').style('display', 'block');\\n }\\n }\\n\\n // setup drawer - MEMO: these must be called after axis updated\\n drawArea = $$.generateDrawArea ? $$.generateDrawArea(areaIndices, false) : undefined;\\n drawBar = $$.generateDrawBar ? $$.generateDrawBar(barIndices) : undefined;\\n drawLine = $$.generateDrawLine ? $$.generateDrawLine(lineIndices, false) : undefined;\\n xForText = $$.generateXYForText(areaIndices, barIndices, lineIndices, true);\\n yForText = $$.generateXYForText(areaIndices, barIndices, lineIndices, false);\\n\\n // Update sub domain\\n if (withY) {\\n $$.subY.domain($$.getYDomain(targetsToShow, 'y'));\\n $$.subY2.domain($$.getYDomain(targetsToShow, 'y2'));\\n }\\n\\n // xgrid focus\\n $$.updateXgridFocus();\\n\\n // Data empty label positioning and text.\\n main\\n .select('text.' + CLASS.text + '.' + CLASS.empty)\\n .attr('x', $$.width / 2)\\n .attr('y', $$.height / 2)\\n .text(config.data_empty_label_text)\\n .transition()\\n .style('opacity', targetsToShow.length ? 0 : 1);\\n\\n // grid\\n $$.updateGrid(duration);\\n\\n // rect for regions\\n $$.updateRegion(duration);\\n\\n // bars\\n $$.updateBar(durationForExit);\\n\\n // lines, areas and cricles\\n $$.updateLine(durationForExit);\\n $$.updateArea(durationForExit);\\n $$.updateCircle();\\n\\n // text\\n if ($$.hasDataLabel()) {\\n $$.updateText(durationForExit);\\n }\\n\\n // title\\n if ($$.redrawTitle) {\\n $$.redrawTitle();\\n }\\n\\n // arc\\n if ($$.redrawArc) {\\n $$.redrawArc(duration, durationForExit, withTransform);\\n }\\n\\n // subchart\\n if ($$.redrawSubchart) {\\n $$.redrawSubchart(withSubchart, transitions, duration, durationForExit, areaIndices, barIndices, lineIndices);\\n }\\n\\n // circles for select\\n main\\n .selectAll('.' + CLASS.selectedCircles)\\n .filter($$.isBarType.bind($$))\\n .selectAll('circle')\\n .remove();\\n\\n // event rects will redrawn when flow called\\n if (config.interaction_enabled && !options.flow && withEventRect) {\\n $$.redrawEventRect();\\n if ($$.updateZoom) {\\n $$.updateZoom();\\n }\\n }\\n\\n // update circleY based on updated parameters\\n $$.updateCircleY();\\n\\n // generate circle x/y functions depending on updated params\\n cx = ($$.config.axis_rotated ? $$.circleY : $$.circleX).bind($$);\\n cy = ($$.config.axis_rotated ? $$.circleX : $$.circleY).bind($$);\\n\\n if (options.flow) {\\n flow = $$.generateFlow({\\n targets: targetsToShow,\\n flow: options.flow,\\n duration: options.flow.duration,\\n drawBar: drawBar,\\n drawLine: drawLine,\\n drawArea: drawArea,\\n cx: cx,\\n cy: cy,\\n xv: xv,\\n xForText: xForText,\\n yForText: yForText\\n });\\n }\\n\\n if ((duration || flow) && $$.isTabVisible()) {\\n // Only use transition if tab visible. See #938.\\n // transition should be derived from one transition\\n d3.transition()\\n .duration(duration)\\n .each(function() {\\n var transitionsToWait = [];\\n\\n // redraw and gather transitions\\n [\\n $$.redrawBar(drawBar, true),\\n $$.redrawLine(drawLine, true),\\n $$.redrawArea(drawArea, true),\\n $$.redrawCircle(cx, cy, true),\\n $$.redrawText(xForText, yForText, options.flow, true),\\n $$.redrawRegion(true),\\n $$.redrawGrid(true)\\n ].forEach(function(transitions) {\\n transitions.forEach(function(transition) {\\n transitionsToWait.push(transition);\\n });\\n });\\n\\n // Wait for end of transitions to call flow and onrendered callback\\n waitForDraw = $$.generateWait();\\n transitionsToWait.forEach(function(t) {\\n waitForDraw.add(t);\\n });\\n })\\n .call(waitForDraw, function() {\\n if (flow) {\\n flow();\\n }\\n if (config.onrendered) {\\n config.onrendered.call($$);\\n }\\n });\\n } else {\\n $$.redrawBar(drawBar);\\n $$.redrawLine(drawLine);\\n $$.redrawArea(drawArea);\\n $$.redrawCircle(cx, cy);\\n $$.redrawText(xForText, yForText, options.flow);\\n $$.redrawRegion();\\n $$.redrawGrid();\\n if (config.onrendered) {\\n config.onrendered.call($$);\\n }\\n }\\n\\n // update fadein condition\\n $$.mapToIds($$.data.targets).forEach(function(id) {\\n $$.withoutFadeIn[id] = true;\\n });\\n };\\n\\n c3_chart_internal_fn.updateAndRedraw = function(options) {\\n var $$ = this,\\n config = $$.config,\\n transitions;\\n options = options || {};\\n // same with redraw\\n options.withTransition = getOption(options, 'withTransition', true);\\n options.withTransform = getOption(options, 'withTransform', false);\\n options.withLegend = getOption(options, 'withLegend', false);\\n // NOT same with redraw\\n options.withUpdateXDomain = true;\\n options.withUpdateOrgXDomain = true;\\n options.withTransitionForExit = false;\\n options.withTransitionForTransform = getOption(options, 'withTransitionForTransform', options.withTransition);\\n // MEMO: this needs to be called before updateLegend and it means this ALWAYS needs to be called)\\n $$.updateSizes();\\n // MEMO: called in updateLegend in redraw if withLegend\\n if (!(options.withLegend && config.legend_show)) {\\n transitions = $$.axis.generateTransitions(options.withTransitionForAxis ? config.transition_duration : 0);\\n // Update scales\\n $$.updateScales();\\n $$.updateSvgSize();\\n // Update g positions\\n $$.transformAll(options.withTransitionForTransform, transitions);\\n }\\n // Draw with new sizes & scales\\n $$.redraw(options, transitions);\\n };\\n c3_chart_internal_fn.redrawWithoutRescale = function() {\\n this.redraw({\\n withY: false,\\n withSubchart: false,\\n withEventRect: false,\\n withTransitionForAxis: false\\n });\\n };\\n\\n c3_chart_internal_fn.isTimeSeries = function() {\\n return this.config.axis_x_type === 'timeseries';\\n };\\n c3_chart_internal_fn.isCategorized = function() {\\n return this.config.axis_x_type.indexOf('categor') >= 0;\\n };\\n c3_chart_internal_fn.isCustomX = function() {\\n var $$ = this,\\n config = $$.config;\\n return !$$.isTimeSeries() && (config.data_x || notEmpty(config.data_xs));\\n };\\n\\n c3_chart_internal_fn.isTimeSeriesY = function() {\\n return this.config.axis_y_type === 'timeseries';\\n };\\n\\n c3_chart_internal_fn.getTranslate = function(target) {\\n var $$ = this,\\n config = $$.config,\\n x,\\n y;\\n if (target === 'main') {\\n x = asHalfPixel($$.margin.left);\\n y = asHalfPixel($$.margin.top);\\n } else if (target === 'context') {\\n x = asHalfPixel($$.margin2.left);\\n y = asHalfPixel($$.margin2.top);\\n } else if (target === 'legend') {\\n x = $$.margin3.left;\\n y = $$.margin3.top;\\n } else if (target === 'x') {\\n x = 0;\\n y = config.axis_rotated ? 0 : $$.height;\\n } else if (target === 'y') {\\n x = 0;\\n y = config.axis_rotated ? $$.height : 0;\\n } else if (target === 'y2') {\\n x = config.axis_rotated ? 0 : $$.width;\\n y = config.axis_rotated ? 1 : 0;\\n } else if (target === 'subx') {\\n x = 0;\\n y = config.axis_rotated ? 0 : $$.height2;\\n } else if (target === 'arc') {\\n x = $$.arcWidth / 2;\\n y = $$.arcHeight / 2;\\n }\\n return 'translate(' + x + ',' + y + ')';\\n };\\n c3_chart_internal_fn.initialOpacity = function(d) {\\n return d.value !== null && this.withoutFadeIn[d.id] ? 1 : 0;\\n };\\n c3_chart_internal_fn.initialOpacityForCircle = function(d) {\\n return d.value !== null && this.withoutFadeIn[d.id] ? this.opacityForCircle(d) : 0;\\n };\\n c3_chart_internal_fn.opacityForCircle = function(d) {\\n var opacity = this.config.point_show ? 1 : 0;\\n return isValue(d.value) ? (this.isScatterType(d) ? 0.5 : opacity) : 0;\\n };\\n c3_chart_internal_fn.opacityForText = function() {\\n return this.hasDataLabel() ? 1 : 0;\\n };\\n c3_chart_internal_fn.xx = function(d) {\\n return d ? this.x(d.x) : null;\\n };\\n c3_chart_internal_fn.xv = function(d) {\\n var $$ = this,\\n value = d.value;\\n if ($$.isTimeSeries()) {\\n value = $$.parseDate(d.value);\\n } else if ($$.isCategorized() && typeof d.value === 'string') {\\n value = $$.config.axis_x_categories.indexOf(d.value);\\n }\\n return Math.ceil($$.x(value));\\n };\\n c3_chart_internal_fn.yv = function(d) {\\n var $$ = this,\\n yScale = d.axis && d.axis === 'y2' ? $$.y2 : $$.y;\\n return Math.ceil(yScale(d.value));\\n };\\n c3_chart_internal_fn.subxx = function(d) {\\n return d ? this.subX(d.x) : null;\\n };\\n\\n c3_chart_internal_fn.transformMain = function(withTransition, transitions) {\\n var $$ = this,\\n xAxis,\\n yAxis,\\n y2Axis;\\n if (transitions && transitions.axisX) {\\n xAxis = transitions.axisX;\\n } else {\\n xAxis = $$.main.select('.' + CLASS.axisX);\\n if (withTransition) {\\n xAxis = xAxis.transition();\\n }\\n }\\n if (transitions && transitions.axisY) {\\n yAxis = transitions.axisY;\\n } else {\\n yAxis = $$.main.select('.' + CLASS.axisY);\\n if (withTransition) {\\n yAxis = yAxis.transition();\\n }\\n }\\n if (transitions && transitions.axisY2) {\\n y2Axis = transitions.axisY2;\\n } else {\\n y2Axis = $$.main.select('.' + CLASS.axisY2);\\n if (withTransition) {\\n y2Axis = y2Axis.transition();\\n }\\n }\\n (withTransition ? $$.main.transition() : $$.main).attr('transform', $$.getTranslate('main'));\\n xAxis.attr('transform', $$.getTranslate('x'));\\n yAxis.attr('transform', $$.getTranslate('y'));\\n y2Axis.attr('transform', $$.getTranslate('y2'));\\n $$.main.select('.' + CLASS.chartArcs).attr('transform', $$.getTranslate('arc'));\\n };\\n c3_chart_internal_fn.transformAll = function(withTransition, transitions) {\\n var $$ = this;\\n $$.transformMain(withTransition, transitions);\\n if ($$.config.subchart_show) {\\n $$.transformContext(withTransition, transitions);\\n }\\n if ($$.legend) {\\n $$.transformLegend(withTransition);\\n }\\n };\\n\\n c3_chart_internal_fn.updateSvgSize = function() {\\n var $$ = this,\\n brush = $$.svg.select('.c3-brush .background');\\n $$.svg.attr('width', $$.currentWidth).attr('height', $$.currentHeight);\\n $$.svg\\n .selectAll(['#' + $$.clipId, '#' + $$.clipIdForGrid])\\n .select('rect')\\n .attr('width', $$.width)\\n .attr('height', $$.height);\\n $$.svg\\n .select('#' + $$.clipIdForXAxis)\\n .select('rect')\\n .attr('x', $$.getXAxisClipX.bind($$))\\n .attr('y', $$.getXAxisClipY.bind($$))\\n .attr('width', $$.getXAxisClipWidth.bind($$))\\n .attr('height', $$.getXAxisClipHeight.bind($$));\\n $$.svg\\n .select('#' + $$.clipIdForYAxis)\\n .select('rect')\\n .attr('x', $$.getYAxisClipX.bind($$))\\n .attr('y', $$.getYAxisClipY.bind($$))\\n .attr('width', $$.getYAxisClipWidth.bind($$))\\n .attr('height', $$.getYAxisClipHeight.bind($$));\\n $$.svg\\n .select('#' + $$.clipIdForSubchart)\\n .select('rect')\\n .attr('width', $$.width)\\n .attr('height', brush.size() ? brush.attr('height') : 0);\\n $$.svg\\n .select('.' + CLASS.zoomRect)\\n .attr('width', $$.width)\\n .attr('height', $$.height);\\n // MEMO: parent div's height will be bigger than svg when \\n $$.selectChart.style('max-height', $$.currentHeight + 'px');\\n };\\n\\n c3_chart_internal_fn.updateDimension = function(withoutAxis) {\\n var $$ = this;\\n if (!withoutAxis) {\\n if ($$.config.axis_rotated) {\\n $$.axes.x.call($$.xAxis);\\n $$.axes.subx.call($$.subXAxis);\\n } else {\\n $$.axes.y.call($$.yAxis);\\n $$.axes.y2.call($$.y2Axis);\\n }\\n }\\n $$.updateSizes();\\n $$.updateScales();\\n $$.updateSvgSize();\\n $$.transformAll(false);\\n };\\n\\n c3_chart_internal_fn.observeInserted = function(selection) {\\n var $$ = this,\\n observer;\\n if (typeof MutationObserver === 'undefined') {\\n window.console.error('MutationObserver not defined.');\\n return;\\n }\\n observer = new MutationObserver(function(mutations) {\\n mutations.forEach(function(mutation) {\\n if (mutation.type === 'childList' && mutation.previousSibling) {\\n observer.disconnect();\\n // need to wait for completion of load because size calculation requires the actual sizes determined after that completion\\n $$.intervalForObserveInserted = window.setInterval(function() {\\n // parentNode will NOT be null when completed\\n if (selection.node().parentNode) {\\n window.clearInterval($$.intervalForObserveInserted);\\n $$.updateDimension();\\n if ($$.brush) {\\n $$.brush.update();\\n }\\n $$.config.oninit.call($$);\\n $$.redraw({\\n withTransform: true,\\n withUpdateXDomain: true,\\n withUpdateOrgXDomain: true,\\n withTransition: false,\\n withTransitionForTransform: false,\\n withLegend: true\\n });\\n selection.transition().style('opacity', 1);\\n }\\n }, 10);\\n }\\n });\\n });\\n observer.observe(selection.node(), { attributes: true, childList: true, characterData: true });\\n };\\n\\n c3_chart_internal_fn.bindResize = function() {\\n var $$ = this,\\n config = $$.config;\\n\\n $$.resizeFunction = $$.generateResize();\\n\\n $$.resizeFunction.add(function() {\\n config.onresize.call($$);\\n });\\n if (config.resize_auto) {\\n $$.resizeFunction.add(function() {\\n if ($$.resizeTimeout !== undefined) {\\n window.clearTimeout($$.resizeTimeout);\\n }\\n $$.resizeTimeout = window.setTimeout(function() {\\n delete $$.resizeTimeout;\\n $$.api.flush();\\n }, 100);\\n });\\n }\\n $$.resizeFunction.add(function() {\\n config.onresized.call($$);\\n });\\n\\n if (window.attachEvent) {\\n window.attachEvent('onresize', $$.resizeFunction);\\n } else if (window.addEventListener) {\\n window.addEventListener('resize', $$.resizeFunction, false);\\n } else {\\n // fallback to this, if this is a very old browser\\n var wrapper = window.onresize;\\n if (!wrapper) {\\n // create a wrapper that will call all charts\\n wrapper = $$.generateResize();\\n } else if (!wrapper.add || !wrapper.remove) {\\n // there is already a handler registered, make sure we call it too\\n wrapper = $$.generateResize();\\n wrapper.add(window.onresize);\\n }\\n // add this graph to the wrapper, we will be removed if the user calls destroy\\n wrapper.add($$.resizeFunction);\\n window.onresize = wrapper;\\n }\\n };\\n\\n c3_chart_internal_fn.generateResize = function() {\\n var resizeFunctions = [];\\n\\n function callResizeFunctions() {\\n resizeFunctions.forEach(function(f) {\\n f();\\n });\\n }\\n\\n callResizeFunctions.add = function(f) {\\n resizeFunctions.push(f);\\n };\\n callResizeFunctions.remove = function(f) {\\n for (var i = 0; i < resizeFunctions.length; i++) {\\n if (resizeFunctions[i] === f) {\\n resizeFunctions.splice(i, 1);\\n break;\\n }\\n }\\n };\\n return callResizeFunctions;\\n };\\n\\n c3_chart_internal_fn.endall = function(transition, callback) {\\n var n = 0;\\n transition\\n .each(function() {\\n ++n;\\n })\\n .each('end', function() {\\n if (!--n) {\\n callback.apply(this, arguments);\\n }\\n });\\n };\\n c3_chart_internal_fn.generateWait = function() {\\n var transitionsToWait = [],\\n f = function(transition, callback) {\\n var timer = setInterval(function() {\\n var done = 0;\\n transitionsToWait.forEach(function(t) {\\n if (t.empty()) {\\n done += 1;\\n return;\\n }\\n try {\\n t.transition();\\n } catch (e) {\\n done += 1;\\n }\\n });\\n if (done === transitionsToWait.length) {\\n clearInterval(timer);\\n if (callback) {\\n callback();\\n }\\n }\\n }, 10);\\n };\\n f.add = function(transition) {\\n transitionsToWait.push(transition);\\n };\\n return f;\\n };\\n\\n c3_chart_internal_fn.parseDate = function(date) {\\n var $$ = this,\\n parsedDate;\\n if (date instanceof Date) {\\n parsedDate = date;\\n } else if (typeof date === 'string') {\\n parsedDate = $$.dataTimeFormat($$.config.data_xFormat).parse(date);\\n } else if (typeof date === 'number' && !isNaN(date)) {\\n parsedDate = new Date(+date);\\n }\\n if (!parsedDate || isNaN(+parsedDate)) {\\n window.console.error(\\\"Failed to parse x '\\\" + date + \\\"' to Date object\\\");\\n }\\n return parsedDate;\\n };\\n\\n c3_chart_internal_fn.isTabVisible = function() {\\n var hidden;\\n if (typeof document.hidden !== 'undefined') {\\n // Opera 12.10 and Firefox 18 and later support\\n hidden = 'hidden';\\n } else if (typeof document.mozHidden !== 'undefined') {\\n hidden = 'mozHidden';\\n } else if (typeof document.msHidden !== 'undefined') {\\n hidden = 'msHidden';\\n } else if (typeof document.webkitHidden !== 'undefined') {\\n hidden = 'webkitHidden';\\n }\\n\\n return document[hidden] ? false : true;\\n };\\n\\n c3_chart_internal_fn.getDefaultConfig = function() {\\n var config = {\\n bindto: '#chart',\\n svg_classname: undefined,\\n size_width: undefined,\\n size_height: undefined,\\n padding_left: undefined,\\n padding_right: undefined,\\n padding_top: undefined,\\n padding_bottom: undefined,\\n resize_auto: true,\\n zoom_enabled: false,\\n zoom_extent: undefined,\\n zoom_privileged: false,\\n zoom_rescale: false,\\n zoom_onzoom: function() {},\\n zoom_onzoomstart: function() {},\\n zoom_onzoomend: function() {},\\n zoom_x_min: undefined,\\n zoom_x_max: undefined,\\n interaction_brighten: true,\\n interaction_enabled: true,\\n onmouseover: function() {},\\n onmouseout: function() {},\\n onresize: function() {},\\n onresized: function() {},\\n oninit: function() {},\\n onrendered: function() {},\\n transition_duration: 350,\\n data_x: undefined,\\n data_xs: {},\\n data_xFormat: '%Y-%m-%d',\\n data_xLocaltime: true,\\n data_xSort: true,\\n data_idConverter: function(id) {\\n return id;\\n },\\n data_names: {},\\n data_classes: {},\\n data_groups: [],\\n data_axes: {},\\n data_type: undefined,\\n data_types: {},\\n data_labels: {},\\n data_order: 'desc',\\n data_regions: {},\\n data_color: undefined,\\n data_colors: {},\\n data_hide: false,\\n data_filter: undefined,\\n data_selection_enabled: false,\\n data_selection_grouped: false,\\n data_selection_isselectable: function() {\\n return true;\\n },\\n data_selection_multiple: true,\\n data_selection_draggable: false,\\n data_onclick: function() {},\\n data_onmouseover: function() {},\\n data_onmouseout: function() {},\\n data_onselected: function() {},\\n data_onunselected: function() {},\\n data_url: undefined,\\n data_headers: undefined,\\n data_json: undefined,\\n data_rows: undefined,\\n data_columns: undefined,\\n data_mimeType: undefined,\\n data_keys: undefined,\\n // configuration for no plot-able data supplied.\\n data_empty_label_text: '',\\n // subchart\\n subchart_show: false,\\n subchart_size_height: 60,\\n subchart_axis_x_show: true,\\n subchart_onbrush: function() {},\\n // color\\n color_pattern: [],\\n color_threshold: {},\\n // legend\\n legend_show: true,\\n legend_hide: false,\\n legend_position: 'bottom',\\n legend_inset_anchor: 'top-left',\\n legend_inset_x: 10,\\n legend_inset_y: 0,\\n legend_inset_step: undefined,\\n legend_item_onclick: undefined,\\n legend_item_onmouseover: undefined,\\n legend_item_onmouseout: undefined,\\n legend_equally: false,\\n legend_padding: 0,\\n legend_item_tile_width: 10,\\n legend_item_tile_height: 10,\\n // axis\\n axis_rotated: false,\\n axis_x_show: true,\\n axis_x_type: 'indexed',\\n axis_x_localtime: true,\\n axis_x_categories: [],\\n axis_x_tick_centered: false,\\n axis_x_tick_format: undefined,\\n axis_x_tick_culling: {},\\n axis_x_tick_culling_max: 10,\\n axis_x_tick_count: undefined,\\n axis_x_tick_fit: true,\\n axis_x_tick_values: null,\\n axis_x_tick_rotate: 0,\\n axis_x_tick_outer: true,\\n axis_x_tick_multiline: true,\\n axis_x_tick_width: null,\\n axis_x_max: undefined,\\n axis_x_min: undefined,\\n axis_x_padding: {},\\n axis_x_height: undefined,\\n axis_x_extent: undefined,\\n axis_x_label: {},\\n axis_y_show: true,\\n axis_y_type: undefined,\\n axis_y_max: undefined,\\n axis_y_min: undefined,\\n axis_y_inverted: false,\\n axis_y_center: undefined,\\n axis_y_inner: undefined,\\n axis_y_label: {},\\n axis_y_tick_format: undefined,\\n axis_y_tick_outer: true,\\n axis_y_tick_values: null,\\n axis_y_tick_rotate: 0,\\n axis_y_tick_count: undefined,\\n axis_y_tick_time_value: undefined,\\n axis_y_tick_time_interval: undefined,\\n axis_y_padding: {},\\n axis_y_default: undefined,\\n axis_y2_show: false,\\n axis_y2_max: undefined,\\n axis_y2_min: undefined,\\n axis_y2_inverted: false,\\n axis_y2_center: undefined,\\n axis_y2_inner: undefined,\\n axis_y2_label: {},\\n axis_y2_tick_format: undefined,\\n axis_y2_tick_outer: true,\\n axis_y2_tick_values: null,\\n axis_y2_tick_count: undefined,\\n axis_y2_padding: {},\\n axis_y2_default: undefined,\\n // grid\\n grid_x_show: false,\\n grid_x_type: 'tick',\\n grid_x_lines: [],\\n grid_y_show: false,\\n // not used\\n // grid_y_type: 'tick',\\n grid_y_lines: [],\\n grid_y_ticks: 10,\\n grid_focus_show: true,\\n grid_lines_front: true,\\n // point - point of each data\\n point_show: true,\\n point_r: 2.5,\\n point_sensitivity: 10,\\n point_focus_expand_enabled: true,\\n point_focus_expand_r: undefined,\\n point_select_r: undefined,\\n // line\\n line_connectNull: false,\\n line_step_type: 'step',\\n // bar\\n bar_width: undefined,\\n bar_width_ratio: 0.6,\\n bar_width_max: undefined,\\n bar_zerobased: true,\\n // area\\n area_zerobased: true,\\n area_above: false,\\n // pie\\n pie_label_show: true,\\n pie_label_format: undefined,\\n pie_label_threshold: 0.05,\\n pie_label_ratio: undefined,\\n pie_expand: {},\\n pie_expand_duration: 50,\\n // gauge\\n gauge_fullCircle: false,\\n gauge_label_show: true,\\n gauge_label_format: undefined,\\n gauge_min: 0,\\n gauge_max: 100,\\n gauge_startingAngle: (-1 * Math.PI) / 2,\\n gauge_units: undefined,\\n gauge_width: undefined,\\n gauge_expand: {},\\n gauge_expand_duration: 50,\\n // donut\\n donut_label_show: true,\\n donut_label_format: undefined,\\n donut_label_threshold: 0.05,\\n donut_label_ratio: undefined,\\n donut_width: undefined,\\n donut_title: '',\\n donut_expand: {},\\n donut_expand_duration: 50,\\n // spline\\n spline_interpolation_type: 'cardinal',\\n // region - region to change style\\n regions: [],\\n // tooltip - show when mouseover on each data\\n tooltip_show: true,\\n tooltip_grouped: true,\\n tooltip_format_title: undefined,\\n tooltip_format_name: undefined,\\n tooltip_format_value: undefined,\\n tooltip_position: undefined,\\n tooltip_contents: function(d, defaultTitleFormat, defaultValueFormat, color) {\\n return this.getTooltipContent ? this.getTooltipContent(d, defaultTitleFormat, defaultValueFormat, color) : '';\\n },\\n tooltip_init_show: false,\\n tooltip_init_x: 0,\\n tooltip_init_position: { top: '0px', left: '50px' },\\n tooltip_onshow: function() {},\\n tooltip_onhide: function() {},\\n // title\\n title_text: undefined,\\n title_padding: {\\n top: 0,\\n right: 0,\\n bottom: 0,\\n left: 0\\n },\\n title_position: 'top-center'\\n };\\n\\n Object.keys(this.additionalConfig).forEach(function(key) {\\n config[key] = this.additionalConfig[key];\\n }, this);\\n\\n return config;\\n };\\n c3_chart_internal_fn.additionalConfig = {};\\n\\n c3_chart_internal_fn.loadConfig = function(config) {\\n var this_config = this.config,\\n target,\\n keys,\\n read;\\n\\n function find() {\\n var key = keys.shift();\\n // console.log(\\\"key =>\\\", key, \\\", target =>\\\", target);\\n if (key && target && typeof target === 'object' && key in target) {\\n target = target[key];\\n return find();\\n } else if (!key) {\\n return target;\\n } else {\\n return undefined;\\n }\\n }\\n\\n Object.keys(this_config).forEach(function(key) {\\n target = config;\\n keys = key.split('_');\\n read = find();\\n // console.log(\\\"CONFIG : \\\", key, read);\\n if (isDefined(read)) {\\n this_config[key] = read;\\n }\\n });\\n };\\n\\n c3_chart_internal_fn.getScale = function(min, max, forTimeseries) {\\n return (forTimeseries ? this.d3.time.scale() : this.d3.scale.linear()).range([min, max]);\\n };\\n c3_chart_internal_fn.getX = function(min, max, domain, offset) {\\n var $$ = this,\\n scale = $$.getScale(min, max, $$.isTimeSeries()),\\n _scale = domain ? scale.domain(domain) : scale,\\n key;\\n // Define customized scale if categorized axis\\n if ($$.isCategorized()) {\\n offset =\\n offset ||\\n function() {\\n return 0;\\n };\\n scale = function(d, raw) {\\n var v = _scale(d) + offset(d);\\n return raw ? v : Math.ceil(v);\\n };\\n } else {\\n scale = function(d, raw) {\\n var v = _scale(d);\\n return raw ? v : Math.ceil(v);\\n };\\n }\\n // define functions\\n for (key in _scale) {\\n scale[key] = _scale[key];\\n }\\n scale.orgDomain = function() {\\n return _scale.domain();\\n };\\n // define custom domain() for categorized axis\\n if ($$.isCategorized()) {\\n scale.domain = function(domain) {\\n if (!arguments.length) {\\n domain = this.orgDomain();\\n return [domain[0], domain[1] + 1];\\n }\\n _scale.domain(domain);\\n return scale;\\n };\\n }\\n return scale;\\n };\\n c3_chart_internal_fn.getY = function(min, max, domain) {\\n var scale = this.getScale(min, max, this.isTimeSeriesY());\\n if (domain) {\\n scale.domain(domain);\\n }\\n return scale;\\n };\\n c3_chart_internal_fn.getYScale = function(id) {\\n return this.axis.getId(id) === 'y2' ? this.y2 : this.y;\\n };\\n c3_chart_internal_fn.getSubYScale = function(id) {\\n return this.axis.getId(id) === 'y2' ? this.subY2 : this.subY;\\n };\\n c3_chart_internal_fn.updateScales = function() {\\n var $$ = this,\\n config = $$.config,\\n forInit = !$$.x;\\n // update edges\\n $$.xMin = config.axis_rotated ? 1 : 0;\\n $$.xMax = config.axis_rotated ? $$.height : $$.width;\\n $$.yMin = config.axis_rotated ? 0 : $$.height;\\n $$.yMax = config.axis_rotated ? $$.width : 1;\\n $$.subXMin = $$.xMin;\\n $$.subXMax = $$.xMax;\\n $$.subYMin = config.axis_rotated ? 0 : $$.height2;\\n $$.subYMax = config.axis_rotated ? $$.width2 : 1;\\n // update scales\\n $$.x = $$.getX($$.xMin, $$.xMax, forInit ? undefined : $$.x.orgDomain(), function() {\\n return $$.xAxis.tickOffset();\\n });\\n $$.y = $$.getY($$.yMin, $$.yMax, forInit ? config.axis_y_default : $$.y.domain());\\n $$.y2 = $$.getY($$.yMin, $$.yMax, forInit ? config.axis_y2_default : $$.y2.domain());\\n $$.subX = $$.getX($$.xMin, $$.xMax, $$.orgXDomain, function(d) {\\n return d % 1 ? 0 : $$.subXAxis.tickOffset();\\n });\\n $$.subY = $$.getY($$.subYMin, $$.subYMax, forInit ? config.axis_y_default : $$.subY.domain());\\n $$.subY2 = $$.getY($$.subYMin, $$.subYMax, forInit ? config.axis_y2_default : $$.subY2.domain());\\n // update axes\\n $$.xAxisTickFormat = $$.axis.getXAxisTickFormat();\\n $$.xAxisTickValues = $$.axis.getXAxisTickValues();\\n $$.yAxisTickValues = $$.axis.getYAxisTickValues();\\n $$.y2AxisTickValues = $$.axis.getY2AxisTickValues();\\n\\n $$.xAxis = $$.axis.getXAxis($$.x, $$.xOrient, $$.xAxisTickFormat, $$.xAxisTickValues, config.axis_x_tick_outer);\\n $$.subXAxis = $$.axis.getXAxis(\\n $$.subX,\\n $$.subXOrient,\\n $$.xAxisTickFormat,\\n $$.xAxisTickValues,\\n config.axis_x_tick_outer\\n );\\n $$.yAxis = $$.axis.getYAxis(\\n $$.y,\\n $$.yOrient,\\n config.axis_y_tick_format,\\n $$.yAxisTickValues,\\n config.axis_y_tick_outer\\n );\\n $$.y2Axis = $$.axis.getYAxis(\\n $$.y2,\\n $$.y2Orient,\\n config.axis_y2_tick_format,\\n $$.y2AxisTickValues,\\n config.axis_y2_tick_outer\\n );\\n\\n // Set initialized scales to brush and zoom\\n if (!forInit) {\\n if ($$.brush) {\\n $$.brush.scale($$.subX);\\n }\\n if (config.zoom_enabled) {\\n $$.zoom.scale($$.x);\\n }\\n }\\n // update for arc\\n if ($$.updateArc) {\\n $$.updateArc();\\n }\\n };\\n\\n c3_chart_internal_fn.getYDomainMin = function(targets) {\\n var $$ = this,\\n config = $$.config,\\n ids = $$.mapToIds(targets),\\n ys = $$.getValuesAsIdKeyed(targets),\\n j,\\n k,\\n baseId,\\n idsInGroup,\\n id,\\n hasNegativeValue;\\n if (config.data_groups.length > 0) {\\n hasNegativeValue = $$.hasNegativeValueInTargets(targets);\\n for (j = 0; j < config.data_groups.length; j++) {\\n // Determine baseId\\n idsInGroup = config.data_groups[j].filter(function(id) {\\n return ids.indexOf(id) >= 0;\\n });\\n if (idsInGroup.length === 0) {\\n continue;\\n }\\n baseId = idsInGroup[0];\\n // Consider negative values\\n if (hasNegativeValue && ys[baseId]) {\\n ys[baseId].forEach(function(v, i) {\\n ys[baseId][i] = v < 0 ? v : 0;\\n });\\n }\\n // Compute min\\n for (k = 1; k < idsInGroup.length; k++) {\\n id = idsInGroup[k];\\n if (!ys[id]) {\\n continue;\\n }\\n ys[id].forEach(function(v, i) {\\n if ($$.axis.getId(id) === $$.axis.getId(baseId) && ys[baseId] && !(hasNegativeValue && +v > 0)) {\\n ys[baseId][i] += +v;\\n }\\n });\\n }\\n }\\n }\\n return $$.d3.min(\\n Object.keys(ys).map(function(key) {\\n return $$.d3.min(ys[key]);\\n })\\n );\\n };\\n c3_chart_internal_fn.getYDomainMax = function(targets) {\\n var $$ = this,\\n config = $$.config,\\n ids = $$.mapToIds(targets),\\n ys = $$.getValuesAsIdKeyed(targets),\\n j,\\n k,\\n baseId,\\n idsInGroup,\\n id,\\n hasPositiveValue;\\n if (config.data_groups.length > 0) {\\n hasPositiveValue = $$.hasPositiveValueInTargets(targets);\\n for (j = 0; j < config.data_groups.length; j++) {\\n // Determine baseId\\n idsInGroup = config.data_groups[j].filter(function(id) {\\n return ids.indexOf(id) >= 0;\\n });\\n if (idsInGroup.length === 0) {\\n continue;\\n }\\n baseId = idsInGroup[0];\\n // Consider positive values\\n if (hasPositiveValue && ys[baseId]) {\\n ys[baseId].forEach(function(v, i) {\\n ys[baseId][i] = v > 0 ? v : 0;\\n });\\n }\\n // Compute max\\n for (k = 1; k < idsInGroup.length; k++) {\\n id = idsInGroup[k];\\n if (!ys[id]) {\\n continue;\\n }\\n ys[id].forEach(function(v, i) {\\n if ($$.axis.getId(id) === $$.axis.getId(baseId) && ys[baseId] && !(hasPositiveValue && +v < 0)) {\\n ys[baseId][i] += +v;\\n }\\n });\\n }\\n }\\n }\\n return $$.d3.max(\\n Object.keys(ys).map(function(key) {\\n return $$.d3.max(ys[key]);\\n })\\n );\\n };\\n c3_chart_internal_fn.getYDomain = function(targets, axisId, xDomain) {\\n var $$ = this,\\n config = $$.config,\\n targetsByAxisId = targets.filter(function(t) {\\n return $$.axis.getId(t.id) === axisId;\\n }),\\n yTargets = xDomain ? $$.filterByXDomain(targetsByAxisId, xDomain) : targetsByAxisId,\\n yMin = axisId === 'y2' ? config.axis_y2_min : config.axis_y_min,\\n yMax = axisId === 'y2' ? config.axis_y2_max : config.axis_y_max,\\n yDomainMin = $$.getYDomainMin(yTargets),\\n yDomainMax = $$.getYDomainMax(yTargets),\\n domain,\\n domainLength,\\n padding,\\n padding_top,\\n padding_bottom,\\n center = axisId === 'y2' ? config.axis_y2_center : config.axis_y_center,\\n yDomainAbs,\\n lengths,\\n diff,\\n ratio,\\n isAllPositive,\\n isAllNegative,\\n isZeroBased =\\n ($$.hasType('bar', yTargets) && config.bar_zerobased) ||\\n ($$.hasType('area', yTargets) && config.area_zerobased),\\n isInverted = axisId === 'y2' ? config.axis_y2_inverted : config.axis_y_inverted,\\n showHorizontalDataLabel = $$.hasDataLabel() && config.axis_rotated,\\n showVerticalDataLabel = $$.hasDataLabel() && !config.axis_rotated;\\n\\n // MEMO: avoid inverting domain unexpectedly\\n yDomainMin = isValue(yMin) ? yMin : isValue(yMax) ? (yDomainMin < yMax ? yDomainMin : yMax - 10) : yDomainMin;\\n yDomainMax = isValue(yMax) ? yMax : isValue(yMin) ? (yMin < yDomainMax ? yDomainMax : yMin + 10) : yDomainMax;\\n\\n if (yTargets.length === 0) {\\n // use current domain if target of axisId is none\\n return axisId === 'y2' ? $$.y2.domain() : $$.y.domain();\\n }\\n if (isNaN(yDomainMin)) {\\n // set minimum to zero when not number\\n yDomainMin = 0;\\n }\\n if (isNaN(yDomainMax)) {\\n // set maximum to have same value as yDomainMin\\n yDomainMax = yDomainMin;\\n }\\n if (yDomainMin === yDomainMax) {\\n yDomainMin < 0 ? (yDomainMax = 0) : (yDomainMin = 0);\\n }\\n isAllPositive = yDomainMin >= 0 && yDomainMax >= 0;\\n isAllNegative = yDomainMin <= 0 && yDomainMax <= 0;\\n\\n // Cancel zerobased if axis_*_min / axis_*_max specified\\n if ((isValue(yMin) && isAllPositive) || (isValue(yMax) && isAllNegative)) {\\n isZeroBased = false;\\n }\\n\\n // Bar/Area chart should be 0-based if all positive|negative\\n if (isZeroBased) {\\n if (isAllPositive) {\\n yDomainMin = 0;\\n }\\n if (isAllNegative) {\\n yDomainMax = 0;\\n }\\n }\\n\\n domainLength = Math.abs(yDomainMax - yDomainMin);\\n padding = padding_top = padding_bottom = domainLength * 0.1;\\n\\n if (typeof center !== 'undefined') {\\n yDomainAbs = Math.max(Math.abs(yDomainMin), Math.abs(yDomainMax));\\n yDomainMax = center + yDomainAbs;\\n yDomainMin = center - yDomainAbs;\\n }\\n // add padding for data label\\n if (showHorizontalDataLabel) {\\n lengths = $$.getDataLabelLength(yDomainMin, yDomainMax, 'width');\\n diff = diffDomain($$.y.range());\\n ratio = [lengths[0] / diff, lengths[1] / diff];\\n padding_top += domainLength * (ratio[1] / (1 - ratio[0] - ratio[1]));\\n padding_bottom += domainLength * (ratio[0] / (1 - ratio[0] - ratio[1]));\\n } else if (showVerticalDataLabel) {\\n lengths = $$.getDataLabelLength(yDomainMin, yDomainMax, 'height');\\n padding_top += $$.axis.convertPixelsToAxisPadding(lengths[1], domainLength);\\n padding_bottom += $$.axis.convertPixelsToAxisPadding(lengths[0], domainLength);\\n }\\n if (axisId === 'y' && notEmpty(config.axis_y_padding)) {\\n padding_top = $$.axis.getPadding(config.axis_y_padding, 'top', padding_top, domainLength);\\n padding_bottom = $$.axis.getPadding(config.axis_y_padding, 'bottom', padding_bottom, domainLength);\\n }\\n if (axisId === 'y2' && notEmpty(config.axis_y2_padding)) {\\n padding_top = $$.axis.getPadding(config.axis_y2_padding, 'top', padding_top, domainLength);\\n padding_bottom = $$.axis.getPadding(config.axis_y2_padding, 'bottom', padding_bottom, domainLength);\\n }\\n // Bar/Area chart should be 0-based if all positive|negative\\n if (isZeroBased) {\\n if (isAllPositive) {\\n padding_bottom = yDomainMin;\\n }\\n if (isAllNegative) {\\n padding_top = -yDomainMax;\\n }\\n }\\n domain = [yDomainMin - padding_bottom, yDomainMax + padding_top];\\n return isInverted ? domain.reverse() : domain;\\n };\\n c3_chart_internal_fn.getXDomainMin = function(targets) {\\n var $$ = this,\\n config = $$.config;\\n return isDefined(config.axis_x_min)\\n ? $$.isTimeSeries()\\n ? this.parseDate(config.axis_x_min)\\n : config.axis_x_min\\n : $$.d3.min(targets, function(t) {\\n return $$.d3.min(t.values, function(v) {\\n return v.x;\\n });\\n });\\n };\\n c3_chart_internal_fn.getXDomainMax = function(targets) {\\n var $$ = this,\\n config = $$.config;\\n return isDefined(config.axis_x_max)\\n ? $$.isTimeSeries()\\n ? this.parseDate(config.axis_x_max)\\n : config.axis_x_max\\n : $$.d3.max(targets, function(t) {\\n return $$.d3.max(t.values, function(v) {\\n return v.x;\\n });\\n });\\n };\\n c3_chart_internal_fn.getXDomainPadding = function(domain) {\\n var $$ = this,\\n config = $$.config,\\n diff = domain[1] - domain[0],\\n maxDataCount,\\n padding,\\n paddingLeft,\\n paddingRight;\\n if ($$.isCategorized()) {\\n padding = 0;\\n } else if ($$.hasType('bar')) {\\n maxDataCount = $$.getMaxDataCount();\\n padding = maxDataCount > 1 ? diff / (maxDataCount - 1) / 2 : 0.5;\\n } else {\\n padding = diff * 0.01;\\n }\\n if (typeof config.axis_x_padding === 'object' && notEmpty(config.axis_x_padding)) {\\n paddingLeft = isValue(config.axis_x_padding.left) ? config.axis_x_padding.left : padding;\\n paddingRight = isValue(config.axis_x_padding.right) ? config.axis_x_padding.right : padding;\\n } else if (typeof config.axis_x_padding === 'number') {\\n paddingLeft = paddingRight = config.axis_x_padding;\\n } else {\\n paddingLeft = paddingRight = padding;\\n }\\n return { left: paddingLeft, right: paddingRight };\\n };\\n c3_chart_internal_fn.getXDomain = function(targets) {\\n var $$ = this,\\n xDomain = [$$.getXDomainMin(targets), $$.getXDomainMax(targets)],\\n firstX = xDomain[0],\\n lastX = xDomain[1],\\n padding = $$.getXDomainPadding(xDomain),\\n min = 0,\\n max = 0;\\n // show center of x domain if min and max are the same\\n if (firstX - lastX === 0 && !$$.isCategorized()) {\\n if ($$.isTimeSeries()) {\\n firstX = new Date(firstX.getTime() * 0.5);\\n lastX = new Date(lastX.getTime() * 1.5);\\n } else {\\n firstX = firstX === 0 ? 1 : firstX * 0.5;\\n lastX = lastX === 0 ? -1 : lastX * 1.5;\\n }\\n }\\n if (firstX || firstX === 0) {\\n min = $$.isTimeSeries() ? new Date(firstX.getTime() - padding.left) : firstX - padding.left;\\n }\\n if (lastX || lastX === 0) {\\n max = $$.isTimeSeries() ? new Date(lastX.getTime() + padding.right) : lastX + padding.right;\\n }\\n return [min, max];\\n };\\n c3_chart_internal_fn.updateXDomain = function(targets, withUpdateXDomain, withUpdateOrgXDomain, withTrim, domain) {\\n var $$ = this,\\n config = $$.config;\\n\\n if (withUpdateOrgXDomain) {\\n $$.x.domain(domain ? domain : $$.d3.extent($$.getXDomain(targets)));\\n $$.orgXDomain = $$.x.domain();\\n if (config.zoom_enabled) {\\n $$.zoom.scale($$.x).updateScaleExtent();\\n }\\n $$.subX.domain($$.x.domain());\\n if ($$.brush) {\\n $$.brush.scale($$.subX);\\n }\\n }\\n if (withUpdateXDomain) {\\n $$.x.domain(domain ? domain : !$$.brush || $$.brush.empty() ? $$.orgXDomain : $$.brush.extent());\\n if (config.zoom_enabled) {\\n $$.zoom.scale($$.x).updateScaleExtent();\\n }\\n }\\n\\n // Trim domain when too big by zoom mousemove event\\n if (withTrim) {\\n $$.x.domain($$.trimXDomain($$.x.orgDomain()));\\n }\\n\\n return $$.x.domain();\\n };\\n c3_chart_internal_fn.trimXDomain = function(domain) {\\n var zoomDomain = this.getZoomDomain(),\\n min = zoomDomain[0],\\n max = zoomDomain[1];\\n if (domain[0] <= min) {\\n domain[1] = +domain[1] + (min - domain[0]);\\n domain[0] = min;\\n }\\n if (max <= domain[1]) {\\n domain[0] = +domain[0] - (domain[1] - max);\\n domain[1] = max;\\n }\\n return domain;\\n };\\n\\n c3_chart_internal_fn.isX = function(key) {\\n var $$ = this,\\n config = $$.config;\\n return (config.data_x && key === config.data_x) || (notEmpty(config.data_xs) && hasValue(config.data_xs, key));\\n };\\n c3_chart_internal_fn.isNotX = function(key) {\\n return !this.isX(key);\\n };\\n c3_chart_internal_fn.getXKey = function(id) {\\n var $$ = this,\\n config = $$.config;\\n return config.data_x ? config.data_x : notEmpty(config.data_xs) ? config.data_xs[id] : null;\\n };\\n c3_chart_internal_fn.getXValuesOfXKey = function(key, targets) {\\n var $$ = this,\\n xValues,\\n ids = targets && notEmpty(targets) ? $$.mapToIds(targets) : [];\\n ids.forEach(function(id) {\\n if ($$.getXKey(id) === key) {\\n xValues = $$.data.xs[id];\\n }\\n });\\n return xValues;\\n };\\n c3_chart_internal_fn.getIndexByX = function(x) {\\n var $$ = this,\\n data = $$.filterByX($$.data.targets, x);\\n return data.length ? data[0].index : null;\\n };\\n c3_chart_internal_fn.getXValue = function(id, i) {\\n var $$ = this;\\n return id in $$.data.xs && $$.data.xs[id] && isValue($$.data.xs[id][i]) ? $$.data.xs[id][i] : i;\\n };\\n c3_chart_internal_fn.getOtherTargetXs = function() {\\n var $$ = this,\\n idsForX = Object.keys($$.data.xs);\\n return idsForX.length ? $$.data.xs[idsForX[0]] : null;\\n };\\n c3_chart_internal_fn.getOtherTargetX = function(index) {\\n var xs = this.getOtherTargetXs();\\n return xs && index < xs.length ? xs[index] : null;\\n };\\n c3_chart_internal_fn.addXs = function(xs) {\\n var $$ = this;\\n Object.keys(xs).forEach(function(id) {\\n $$.config.data_xs[id] = xs[id];\\n });\\n };\\n c3_chart_internal_fn.hasMultipleX = function(xs) {\\n return (\\n this.d3\\n .set(\\n Object.keys(xs).map(function(id) {\\n return xs[id];\\n })\\n )\\n .size() > 1\\n );\\n };\\n c3_chart_internal_fn.isMultipleX = function() {\\n return notEmpty(this.config.data_xs) || !this.config.data_xSort || this.hasType('scatter');\\n };\\n c3_chart_internal_fn.addName = function(data) {\\n var $$ = this,\\n name;\\n if (data) {\\n name = $$.config.data_names[data.id];\\n data.name = name !== undefined ? name : data.id;\\n }\\n return data;\\n };\\n c3_chart_internal_fn.getValueOnIndex = function(values, index) {\\n var valueOnIndex = values.filter(function(v) {\\n return v.index === index;\\n });\\n return valueOnIndex.length ? valueOnIndex[0] : null;\\n };\\n c3_chart_internal_fn.updateTargetX = function(targets, x) {\\n var $$ = this;\\n targets.forEach(function(t) {\\n t.values.forEach(function(v, i) {\\n v.x = $$.generateTargetX(x[i], t.id, i);\\n });\\n $$.data.xs[t.id] = x;\\n });\\n };\\n c3_chart_internal_fn.updateTargetXs = function(targets, xs) {\\n var $$ = this;\\n targets.forEach(function(t) {\\n if (xs[t.id]) {\\n $$.updateTargetX([t], xs[t.id]);\\n }\\n });\\n };\\n c3_chart_internal_fn.generateTargetX = function(rawX, id, index) {\\n var $$ = this,\\n x;\\n if ($$.isTimeSeries()) {\\n x = rawX ? $$.parseDate(rawX) : $$.parseDate($$.getXValue(id, index));\\n } else if ($$.isCustomX() && !$$.isCategorized()) {\\n x = isValue(rawX) ? +rawX : $$.getXValue(id, index);\\n } else {\\n x = index;\\n }\\n return x;\\n };\\n c3_chart_internal_fn.cloneTarget = function(target) {\\n return {\\n id: target.id,\\n id_org: target.id_org,\\n values: target.values.map(function(d) {\\n return { x: d.x, value: d.value, id: d.id };\\n })\\n };\\n };\\n c3_chart_internal_fn.updateXs = function() {\\n var $$ = this;\\n if ($$.data.targets.length) {\\n $$.xs = [];\\n $$.data.targets[0].values.forEach(function(v) {\\n $$.xs[v.index] = v.x;\\n });\\n }\\n };\\n c3_chart_internal_fn.getPrevX = function(i) {\\n var x = this.xs[i - 1];\\n return typeof x !== 'undefined' ? x : null;\\n };\\n c3_chart_internal_fn.getNextX = function(i) {\\n var x = this.xs[i + 1];\\n return typeof x !== 'undefined' ? x : null;\\n };\\n c3_chart_internal_fn.getMaxDataCount = function() {\\n var $$ = this;\\n return $$.d3.max($$.data.targets, function(t) {\\n return t.values.length;\\n });\\n };\\n c3_chart_internal_fn.getMaxDataCountTarget = function(targets) {\\n var length = targets.length,\\n max = 0,\\n maxTarget;\\n if (length > 1) {\\n targets.forEach(function(t) {\\n if (t.values.length > max) {\\n maxTarget = t;\\n max = t.values.length;\\n }\\n });\\n } else {\\n maxTarget = length ? targets[0] : null;\\n }\\n return maxTarget;\\n };\\n c3_chart_internal_fn.getEdgeX = function(targets) {\\n var $$ = this;\\n return !targets.length\\n ? [0, 0]\\n : [\\n $$.d3.min(targets, function(t) {\\n return t.values[0].x;\\n }),\\n $$.d3.max(targets, function(t) {\\n return t.values[t.values.length - 1].x;\\n })\\n ];\\n };\\n c3_chart_internal_fn.mapToIds = function(targets) {\\n return targets.map(function(d) {\\n return d.id;\\n });\\n };\\n c3_chart_internal_fn.mapToTargetIds = function(ids) {\\n var $$ = this;\\n return ids ? [].concat(ids) : $$.mapToIds($$.data.targets);\\n };\\n c3_chart_internal_fn.hasTarget = function(targets, id) {\\n var ids = this.mapToIds(targets),\\n i;\\n for (i = 0; i < ids.length; i++) {\\n if (ids[i] === id) {\\n return true;\\n }\\n }\\n return false;\\n };\\n c3_chart_internal_fn.isTargetToShow = function(targetId) {\\n return this.hiddenTargetIds.indexOf(targetId) < 0;\\n };\\n c3_chart_internal_fn.isLegendToShow = function(targetId) {\\n return this.hiddenLegendIds.indexOf(targetId) < 0;\\n };\\n c3_chart_internal_fn.filterTargetsToShow = function(targets) {\\n var $$ = this;\\n return targets.filter(function(t) {\\n return $$.isTargetToShow(t.id);\\n });\\n };\\n c3_chart_internal_fn.mapTargetsToUniqueXs = function(targets) {\\n var $$ = this;\\n var xs = $$.d3\\n .set(\\n $$.d3.merge(\\n targets.map(function(t) {\\n return t.values.map(function(v) {\\n return +v.x;\\n });\\n })\\n )\\n )\\n .values();\\n xs = $$.isTimeSeries()\\n ? xs.map(function(x) {\\n return new Date(+x);\\n })\\n : xs.map(function(x) {\\n return +x;\\n });\\n return xs.sort(function(a, b) {\\n return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;\\n });\\n };\\n c3_chart_internal_fn.addHiddenTargetIds = function(targetIds) {\\n this.hiddenTargetIds = this.hiddenTargetIds.concat(targetIds);\\n };\\n c3_chart_internal_fn.removeHiddenTargetIds = function(targetIds) {\\n this.hiddenTargetIds = this.hiddenTargetIds.filter(function(id) {\\n return targetIds.indexOf(id) < 0;\\n });\\n };\\n c3_chart_internal_fn.addHiddenLegendIds = function(targetIds) {\\n this.hiddenLegendIds = this.hiddenLegendIds.concat(targetIds);\\n };\\n c3_chart_internal_fn.removeHiddenLegendIds = function(targetIds) {\\n this.hiddenLegendIds = this.hiddenLegendIds.filter(function(id) {\\n return targetIds.indexOf(id) < 0;\\n });\\n };\\n c3_chart_internal_fn.getValuesAsIdKeyed = function(targets) {\\n var ys = {};\\n targets.forEach(function(t) {\\n ys[t.id] = [];\\n t.values.forEach(function(v) {\\n ys[t.id].push(v.value);\\n });\\n });\\n return ys;\\n };\\n c3_chart_internal_fn.checkValueInTargets = function(targets, checker) {\\n var ids = Object.keys(targets),\\n i,\\n j,\\n values;\\n for (i = 0; i < ids.length; i++) {\\n values = targets[ids[i]].values;\\n for (j = 0; j < values.length; j++) {\\n if (checker(values[j].value)) {\\n return true;\\n }\\n }\\n }\\n return false;\\n };\\n c3_chart_internal_fn.hasNegativeValueInTargets = function(targets) {\\n return this.checkValueInTargets(targets, function(v) {\\n return v < 0;\\n });\\n };\\n c3_chart_internal_fn.hasPositiveValueInTargets = function(targets) {\\n return this.checkValueInTargets(targets, function(v) {\\n return v > 0;\\n });\\n };\\n c3_chart_internal_fn.isOrderDesc = function() {\\n var config = this.config;\\n return typeof config.data_order === 'string' && config.data_order.toLowerCase() === 'desc';\\n };\\n c3_chart_internal_fn.isOrderAsc = function() {\\n var config = this.config;\\n return typeof config.data_order === 'string' && config.data_order.toLowerCase() === 'asc';\\n };\\n c3_chart_internal_fn.orderTargets = function(targets) {\\n var $$ = this,\\n config = $$.config,\\n orderAsc = $$.isOrderAsc(),\\n orderDesc = $$.isOrderDesc();\\n if (orderAsc || orderDesc) {\\n targets.sort(function(t1, t2) {\\n var reducer = function(p, c) {\\n return p + Math.abs(c.value);\\n };\\n var t1Sum = t1.values.reduce(reducer, 0),\\n t2Sum = t2.values.reduce(reducer, 0);\\n return orderAsc ? t2Sum - t1Sum : t1Sum - t2Sum;\\n });\\n } else if (isFunction(config.data_order)) {\\n targets.sort(config.data_order);\\n } // TODO: accept name array for order\\n return targets;\\n };\\n c3_chart_internal_fn.filterByX = function(targets, x) {\\n return this.d3\\n .merge(\\n targets.map(function(t) {\\n return t.values;\\n })\\n )\\n .filter(function(v) {\\n return v.x - x === 0;\\n });\\n };\\n c3_chart_internal_fn.filterRemoveNull = function(data) {\\n return data.filter(function(d) {\\n return isValue(d.value);\\n });\\n };\\n c3_chart_internal_fn.filterByXDomain = function(targets, xDomain) {\\n return targets.map(function(t) {\\n return {\\n id: t.id,\\n id_org: t.id_org,\\n values: t.values.filter(function(v) {\\n return xDomain[0] <= v.x && v.x <= xDomain[1];\\n })\\n };\\n });\\n };\\n c3_chart_internal_fn.hasDataLabel = function() {\\n var config = this.config;\\n if (typeof config.data_labels === 'boolean' && config.data_labels) {\\n return true;\\n } else if (typeof config.data_labels === 'object' && notEmpty(config.data_labels)) {\\n return true;\\n }\\n return false;\\n };\\n c3_chart_internal_fn.getDataLabelLength = function(min, max, key) {\\n var $$ = this,\\n lengths = [0, 0],\\n paddingCoef = 1.3;\\n $$.selectChart\\n .select('svg')\\n .selectAll('.dummy')\\n .data([min, max])\\n .enter()\\n .append('text')\\n .text(function(d) {\\n return $$.dataLabelFormat(d.id)(d);\\n })\\n .each(function(d, i) {\\n lengths[i] = this.getBoundingClientRect()[key] * paddingCoef;\\n })\\n .remove();\\n return lengths;\\n };\\n (c3_chart_internal_fn.isNoneArc = function(d) {\\n return this.hasTarget(this.data.targets, d.id);\\n }),\\n (c3_chart_internal_fn.isArc = function(d) {\\n return 'data' in d && this.hasTarget(this.data.targets, d.data.id);\\n });\\n c3_chart_internal_fn.findSameXOfValues = function(values, index) {\\n var i,\\n targetX = values[index].x,\\n sames = [];\\n for (i = index - 1; i >= 0; i--) {\\n if (targetX !== values[i].x) {\\n break;\\n }\\n sames.push(values[i]);\\n }\\n for (i = index; i < values.length; i++) {\\n if (targetX !== values[i].x) {\\n break;\\n }\\n sames.push(values[i]);\\n }\\n return sames;\\n };\\n\\n c3_chart_internal_fn.findClosestFromTargets = function(targets, pos) {\\n var $$ = this,\\n candidates;\\n\\n // map to array of closest points of each target\\n candidates = targets.map(function(target) {\\n return $$.findClosest(target.values, pos);\\n });\\n\\n // decide closest point and return\\n return $$.findClosest(candidates, pos);\\n };\\n c3_chart_internal_fn.findClosest = function(values, pos) {\\n var $$ = this,\\n minDist = $$.config.point_sensitivity,\\n closest;\\n\\n // find mouseovering bar\\n values\\n .filter(function(v) {\\n return v && $$.isBarType(v.id);\\n })\\n .forEach(function(v) {\\n var shape = $$.main\\n .select('.' + CLASS.bars + $$.getTargetSelectorSuffix(v.id) + ' .' + CLASS.bar + '-' + v.index)\\n .node();\\n if (!closest && $$.isWithinBar(shape)) {\\n closest = v;\\n }\\n });\\n\\n // find closest point from non-bar\\n values\\n .filter(function(v) {\\n return v && !$$.isBarType(v.id);\\n })\\n .forEach(function(v) {\\n var d = $$.dist(v, pos);\\n if (d < minDist) {\\n minDist = d;\\n closest = v;\\n }\\n });\\n\\n return closest;\\n };\\n c3_chart_internal_fn.dist = function(data, pos) {\\n var $$ = this,\\n config = $$.config,\\n xIndex = config.axis_rotated ? 1 : 0,\\n yIndex = config.axis_rotated ? 0 : 1,\\n y = $$.circleY(data, data.index),\\n x = $$.x(data.x);\\n return Math.sqrt(Math.pow(x - pos[xIndex], 2) + Math.pow(y - pos[yIndex], 2));\\n };\\n c3_chart_internal_fn.convertValuesToStep = function(values) {\\n var converted = [].concat(values),\\n i;\\n\\n if (!this.isCategorized()) {\\n return values;\\n }\\n\\n for (i = values.length + 1; 0 < i; i--) {\\n converted[i] = converted[i - 1];\\n }\\n\\n converted[0] = {\\n x: converted[0].x - 1,\\n value: converted[0].value,\\n id: converted[0].id\\n };\\n converted[values.length + 1] = {\\n x: converted[values.length].x + 1,\\n value: converted[values.length].value,\\n id: converted[values.length].id\\n };\\n\\n return converted;\\n };\\n c3_chart_internal_fn.updateDataAttributes = function(name, attrs) {\\n var $$ = this,\\n config = $$.config,\\n current = config['data_' + name];\\n if (typeof attrs === 'undefined') {\\n return current;\\n }\\n Object.keys(attrs).forEach(function(id) {\\n current[id] = attrs[id];\\n });\\n $$.redraw({ withLegend: true });\\n return current;\\n };\\n\\n c3_chart_internal_fn.convertUrlToData = function(url, mimeType, headers, keys, done) {\\n var $$ = this,\\n type = mimeType ? mimeType : 'csv';\\n var req = $$.d3.xhr(url);\\n if (headers) {\\n Object.keys(headers).forEach(function(header) {\\n req.header(header, headers[header]);\\n });\\n }\\n req.get(function(error, data) {\\n var d;\\n if (!data) {\\n throw new Error(error.responseURL + ' ' + error.status + ' (' + error.statusText + ')');\\n }\\n if (type === 'json') {\\n d = $$.convertJsonToData(JSON.parse(data.response), keys);\\n } else if (type === 'tsv') {\\n d = $$.convertTsvToData(data.response);\\n } else {\\n d = $$.convertCsvToData(data.response);\\n }\\n done.call($$, d);\\n });\\n };\\n c3_chart_internal_fn.convertXsvToData = function(xsv, parser) {\\n var rows = parser.parseRows(xsv),\\n d;\\n if (rows.length === 1) {\\n d = [{}];\\n rows[0].forEach(function(id) {\\n d[0][id] = null;\\n });\\n } else {\\n d = parser.parse(xsv);\\n }\\n return d;\\n };\\n c3_chart_internal_fn.convertCsvToData = function(csv) {\\n return this.convertXsvToData(csv, this.d3.csv);\\n };\\n c3_chart_internal_fn.convertTsvToData = function(tsv) {\\n return this.convertXsvToData(tsv, this.d3.tsv);\\n };\\n c3_chart_internal_fn.convertJsonToData = function(json, keys) {\\n var $$ = this,\\n new_rows = [],\\n targetKeys,\\n data;\\n if (keys) {\\n // when keys specified, json would be an array that includes objects\\n if (keys.x) {\\n targetKeys = keys.value.concat(keys.x);\\n $$.config.data_x = keys.x;\\n } else {\\n targetKeys = keys.value;\\n }\\n new_rows.push(targetKeys);\\n json.forEach(function(o) {\\n var new_row = [];\\n targetKeys.forEach(function(key) {\\n // convert undefined to null because undefined data will be removed in convertDataToTargets()\\n var v = $$.findValueInJson(o, key);\\n if (isUndefined(v)) {\\n v = null;\\n }\\n new_row.push(v);\\n });\\n new_rows.push(new_row);\\n });\\n data = $$.convertRowsToData(new_rows);\\n } else {\\n Object.keys(json).forEach(function(key) {\\n new_rows.push([key].concat(json[key]));\\n });\\n data = $$.convertColumnsToData(new_rows);\\n }\\n return data;\\n };\\n c3_chart_internal_fn.findValueInJson = function(object, path) {\\n path = path.replace(/\\\\[(\\\\w+)\\\\]/g, '.$1'); // convert indexes to properties (replace [] with .)\\n path = path.replace(/^\\\\./, ''); // strip a leading dot\\n var pathArray = path.split('.');\\n for (var i = 0; i < pathArray.length; ++i) {\\n var k = pathArray[i];\\n if (k in object) {\\n object = object[k];\\n } else {\\n return;\\n }\\n }\\n return object;\\n };\\n c3_chart_internal_fn.convertRowsToData = function(rows) {\\n var keys = rows[0],\\n new_row = {},\\n new_rows = [],\\n i,\\n j;\\n for (i = 1; i < rows.length; i++) {\\n new_row = {};\\n for (j = 0; j < rows[i].length; j++) {\\n if (isUndefined(rows[i][j])) {\\n throw new Error('Source data is missing a component at (' + i + ',' + j + ')!');\\n }\\n new_row[keys[j]] = rows[i][j];\\n }\\n new_rows.push(new_row);\\n }\\n return new_rows;\\n };\\n c3_chart_internal_fn.convertColumnsToData = function(columns) {\\n var new_rows = [],\\n i,\\n j,\\n key;\\n for (i = 0; i < columns.length; i++) {\\n key = columns[i][0];\\n for (j = 1; j < columns[i].length; j++) {\\n if (isUndefined(new_rows[j - 1])) {\\n new_rows[j - 1] = {};\\n }\\n if (isUndefined(columns[i][j])) {\\n throw new Error('Source data is missing a component at (' + i + ',' + j + ')!');\\n }\\n new_rows[j - 1][key] = columns[i][j];\\n }\\n }\\n return new_rows;\\n };\\n c3_chart_internal_fn.convertDataToTargets = function(data, appendXs) {\\n var $$ = this,\\n config = $$.config,\\n ids = $$.d3.keys(data[0]).filter($$.isNotX, $$),\\n xs = $$.d3.keys(data[0]).filter($$.isX, $$),\\n targets;\\n\\n // save x for update data by load when custom x and c3.x API\\n ids.forEach(function(id) {\\n var xKey = $$.getXKey(id);\\n\\n if ($$.isCustomX() || $$.isTimeSeries()) {\\n // if included in input data\\n if (xs.indexOf(xKey) >= 0) {\\n $$.data.xs[id] = (appendXs && $$.data.xs[id] ? $$.data.xs[id] : []).concat(\\n data\\n .map(function(d) {\\n return d[xKey];\\n })\\n .filter(isValue)\\n .map(function(rawX, i) {\\n return $$.generateTargetX(rawX, id, i);\\n })\\n );\\n }\\n // if not included in input data, find from preloaded data of other id's x\\n else if (config.data_x) {\\n $$.data.xs[id] = $$.getOtherTargetXs();\\n }\\n // if not included in input data, find from preloaded data\\n else if (notEmpty(config.data_xs)) {\\n $$.data.xs[id] = $$.getXValuesOfXKey(xKey, $$.data.targets);\\n }\\n // MEMO: if no x included, use same x of current will be used\\n } else {\\n $$.data.xs[id] = data.map(function(d, i) {\\n return i;\\n });\\n }\\n });\\n\\n // check x is defined\\n ids.forEach(function(id) {\\n if (!$$.data.xs[id]) {\\n throw new Error('x is not defined for id = \\\"' + id + '\\\".');\\n }\\n });\\n\\n // convert to target\\n targets = ids.map(function(id, index) {\\n var convertedId = config.data_idConverter(id);\\n return {\\n id: convertedId,\\n id_org: id,\\n values: data\\n .map(function(d, i) {\\n var xKey = $$.getXKey(id),\\n rawX = d[xKey],\\n value = d[id] !== null && !isNaN(d[id]) ? +d[id] : null,\\n x;\\n // use x as categories if custom x and categorized\\n if ($$.isCustomX() && $$.isCategorized() && index === 0 && !isUndefined(rawX)) {\\n if (index === 0 && i === 0) {\\n config.axis_x_categories = [];\\n }\\n x = config.axis_x_categories.indexOf(rawX);\\n if (x === -1) {\\n x = config.axis_x_categories.length;\\n config.axis_x_categories.push(rawX);\\n }\\n } else {\\n x = $$.generateTargetX(rawX, id, i);\\n }\\n // mark as x = undefined if value is undefined and filter to remove after mapped\\n if (isUndefined(d[id]) || $$.data.xs[id].length <= i) {\\n x = undefined;\\n }\\n return { x: x, value: value, id: convertedId };\\n })\\n .filter(function(v) {\\n return isDefined(v.x);\\n })\\n };\\n });\\n\\n // finish targets\\n targets.forEach(function(t) {\\n var i;\\n // sort values by its x\\n if (config.data_xSort) {\\n t.values = t.values.sort(function(v1, v2) {\\n var x1 = v1.x || v1.x === 0 ? v1.x : Infinity,\\n x2 = v2.x || v2.x === 0 ? v2.x : Infinity;\\n return x1 - x2;\\n });\\n }\\n // indexing each value\\n i = 0;\\n t.values.forEach(function(v) {\\n v.index = i++;\\n });\\n // this needs to be sorted because its index and value.index is identical\\n $$.data.xs[t.id].sort(function(v1, v2) {\\n return v1 - v2;\\n });\\n });\\n\\n // cache information about values\\n $$.hasNegativeValue = $$.hasNegativeValueInTargets(targets);\\n $$.hasPositiveValue = $$.hasPositiveValueInTargets(targets);\\n\\n // set target types\\n if (config.data_type) {\\n $$.setTargetType(\\n $$.mapToIds(targets).filter(function(id) {\\n return !(id in config.data_types);\\n }),\\n config.data_type\\n );\\n }\\n\\n // cache as original id keyed\\n targets.forEach(function(d) {\\n $$.addCache(d.id_org, d);\\n });\\n\\n return targets;\\n };\\n\\n c3_chart_internal_fn.load = function(targets, args) {\\n var $$ = this;\\n if (targets) {\\n // filter loading targets if needed\\n if (args.filter) {\\n targets = targets.filter(args.filter);\\n }\\n // set type if args.types || args.type specified\\n if (args.type || args.types) {\\n targets.forEach(function(t) {\\n var type = args.types && args.types[t.id] ? args.types[t.id] : args.type;\\n $$.setTargetType(t.id, type);\\n });\\n }\\n // Update/Add data\\n $$.data.targets.forEach(function(d) {\\n for (var i = 0; i < targets.length; i++) {\\n if (d.id === targets[i].id) {\\n d.values = targets[i].values;\\n targets.splice(i, 1);\\n break;\\n }\\n }\\n });\\n $$.data.targets = $$.data.targets.concat(targets); // add remained\\n }\\n\\n // Set targets\\n $$.updateTargets($$.data.targets);\\n\\n // Redraw with new targets\\n $$.redraw({ withUpdateOrgXDomain: true, withUpdateXDomain: true, withLegend: true });\\n\\n if (args.done) {\\n args.done();\\n }\\n };\\n c3_chart_internal_fn.loadFromArgs = function(args) {\\n var $$ = this;\\n if (args.data) {\\n $$.load($$.convertDataToTargets(args.data), args);\\n } else if (args.url) {\\n $$.convertUrlToData(args.url, args.mimeType, args.headers, args.keys, function(data) {\\n $$.load($$.convertDataToTargets(data), args);\\n });\\n } else if (args.json) {\\n $$.load($$.convertDataToTargets($$.convertJsonToData(args.json, args.keys)), args);\\n } else if (args.rows) {\\n $$.load($$.convertDataToTargets($$.convertRowsToData(args.rows)), args);\\n } else if (args.columns) {\\n $$.load($$.convertDataToTargets($$.convertColumnsToData(args.columns)), args);\\n } else {\\n $$.load(null, args);\\n }\\n };\\n c3_chart_internal_fn.unload = function(targetIds, done) {\\n var $$ = this;\\n if (!done) {\\n done = function() {};\\n }\\n // filter existing target\\n targetIds = targetIds.filter(function(id) {\\n return $$.hasTarget($$.data.targets, id);\\n });\\n // If no target, call done and return\\n if (!targetIds || targetIds.length === 0) {\\n done();\\n return;\\n }\\n $$.svg\\n .selectAll(\\n targetIds.map(function(id) {\\n return $$.selectorTarget(id);\\n })\\n )\\n .transition()\\n .style('opacity', 0)\\n .remove()\\n .call($$.endall, done);\\n targetIds.forEach(function(id) {\\n // Reset fadein for future load\\n $$.withoutFadeIn[id] = false;\\n // Remove target's elements\\n if ($$.legend) {\\n $$.legend.selectAll('.' + CLASS.legendItem + $$.getTargetSelectorSuffix(id)).remove();\\n }\\n // Remove target\\n $$.data.targets = $$.data.targets.filter(function(t) {\\n return t.id !== id;\\n });\\n });\\n };\\n\\n c3_chart_internal_fn.categoryName = function(i) {\\n var config = this.config;\\n return i < config.axis_x_categories.length ? config.axis_x_categories[i] : i;\\n };\\n\\n c3_chart_internal_fn.initEventRect = function() {\\n var $$ = this;\\n $$.main\\n .select('.' + CLASS.chart)\\n .append('g')\\n .attr('class', CLASS.eventRects)\\n .style('fill-opacity', 0);\\n };\\n c3_chart_internal_fn.redrawEventRect = function() {\\n var $$ = this,\\n config = $$.config,\\n eventRectUpdate,\\n maxDataCountTarget,\\n isMultipleX = $$.isMultipleX();\\n\\n // rects for mouseover\\n var eventRects = $$.main\\n .select('.' + CLASS.eventRects)\\n .style('cursor', config.zoom_enabled ? (config.axis_rotated ? 'ns-resize' : 'ew-resize') : null)\\n .classed(CLASS.eventRectsMultiple, isMultipleX)\\n .classed(CLASS.eventRectsSingle, !isMultipleX);\\n\\n // clear old rects\\n eventRects.selectAll('.' + CLASS.eventRect).remove();\\n\\n // open as public variable\\n $$.eventRect = eventRects.selectAll('.' + CLASS.eventRect);\\n\\n if (isMultipleX) {\\n eventRectUpdate = $$.eventRect.data([0]);\\n // enter : only one rect will be added\\n $$.generateEventRectsForMultipleXs(eventRectUpdate.enter());\\n // update\\n $$.updateEventRect(eventRectUpdate);\\n // exit : not needed because always only one rect exists\\n } else {\\n // Set data and update $$.eventRect\\n maxDataCountTarget = $$.getMaxDataCountTarget($$.data.targets);\\n eventRects.datum(maxDataCountTarget ? maxDataCountTarget.values : []);\\n $$.eventRect = eventRects.selectAll('.' + CLASS.eventRect);\\n eventRectUpdate = $$.eventRect.data(function(d) {\\n return d;\\n });\\n // enter\\n $$.generateEventRectsForSingleX(eventRectUpdate.enter());\\n // update\\n $$.updateEventRect(eventRectUpdate);\\n // exit\\n eventRectUpdate.exit().remove();\\n }\\n };\\n c3_chart_internal_fn.updateEventRect = function(eventRectUpdate) {\\n var $$ = this,\\n config = $$.config,\\n x,\\n y,\\n w,\\n h,\\n rectW,\\n rectX;\\n\\n // set update selection if null\\n eventRectUpdate =\\n eventRectUpdate ||\\n $$.eventRect.data(function(d) {\\n return d;\\n });\\n\\n if ($$.isMultipleX()) {\\n // TODO: rotated not supported yet\\n x = 0;\\n y = 0;\\n w = $$.width;\\n h = $$.height;\\n } else {\\n if (($$.isCustomX() || $$.isTimeSeries()) && !$$.isCategorized()) {\\n // update index for x that is used by prevX and nextX\\n $$.updateXs();\\n\\n rectW = function(d) {\\n var prevX = $$.getPrevX(d.index),\\n nextX = $$.getNextX(d.index);\\n\\n // if there this is a single data point make the eventRect full width (or height)\\n if (prevX === null && nextX === null) {\\n return config.axis_rotated ? $$.height : $$.width;\\n }\\n\\n if (prevX === null) {\\n prevX = $$.x.domain()[0];\\n }\\n if (nextX === null) {\\n nextX = $$.x.domain()[1];\\n }\\n\\n return Math.max(0, ($$.x(nextX) - $$.x(prevX)) / 2);\\n };\\n rectX = function(d) {\\n var prevX = $$.getPrevX(d.index),\\n nextX = $$.getNextX(d.index),\\n thisX = $$.data.xs[d.id][d.index];\\n\\n // if there this is a single data point position the eventRect at 0\\n if (prevX === null && nextX === null) {\\n return 0;\\n }\\n\\n if (prevX === null) {\\n prevX = $$.x.domain()[0];\\n }\\n\\n return ($$.x(thisX) + $$.x(prevX)) / 2;\\n };\\n } else {\\n rectW = $$.getEventRectWidth();\\n rectX = function(d) {\\n return $$.x(d.x) - rectW / 2;\\n };\\n }\\n x = config.axis_rotated ? 0 : rectX;\\n y = config.axis_rotated ? rectX : 0;\\n w = config.axis_rotated ? $$.width : rectW;\\n h = config.axis_rotated ? rectW : $$.height;\\n }\\n\\n eventRectUpdate\\n .attr('class', $$.classEvent.bind($$))\\n .attr('x', x)\\n .attr('y', y)\\n .attr('width', w)\\n .attr('height', h);\\n };\\n c3_chart_internal_fn.generateEventRectsForSingleX = function(eventRectEnter) {\\n var $$ = this,\\n d3 = $$.d3,\\n config = $$.config;\\n eventRectEnter\\n .append('rect')\\n .attr('class', $$.classEvent.bind($$))\\n .style('cursor', config.data_selection_enabled && config.data_selection_grouped ? 'pointer' : null)\\n .on('mouseover', function(d) {\\n var index = d.index;\\n\\n if ($$.dragging || $$.flowing) {\\n return;\\n } // do nothing while dragging/flowing\\n if ($$.hasArcType()) {\\n return;\\n }\\n\\n // Expand shapes for selection\\n if (config.point_focus_expand_enabled) {\\n $$.expandCircles(index, null, true);\\n }\\n $$.expandBars(index, null, true);\\n\\n // Call event handler\\n $$.main.selectAll('.' + CLASS.shape + '-' + index).each(function(d) {\\n config.data_onmouseover.call($$.api, d);\\n });\\n })\\n .on('mouseout', function(d) {\\n var index = d.index;\\n if (!$$.config) {\\n return;\\n } // chart is destroyed\\n if ($$.hasArcType()) {\\n return;\\n }\\n $$.hideXGridFocus();\\n $$.hideTooltip();\\n // Undo expanded shapes\\n $$.unexpandCircles();\\n $$.unexpandBars();\\n // Call event handler\\n $$.main.selectAll('.' + CLASS.shape + '-' + index).each(function(d) {\\n config.data_onmouseout.call($$.api, d);\\n });\\n })\\n .on('mousemove', function(d) {\\n var selectedData,\\n index = d.index,\\n eventRect = $$.svg.select('.' + CLASS.eventRect + '-' + index);\\n\\n if ($$.dragging || $$.flowing) {\\n return;\\n } // do nothing while dragging/flowing\\n if ($$.hasArcType()) {\\n return;\\n }\\n\\n if (\\n $$.isStepType(d) &&\\n $$.config.line_step_type === 'step-after' &&\\n d3.mouse(this)[0] < $$.x($$.getXValue(d.id, index))\\n ) {\\n index -= 1;\\n }\\n\\n // Show tooltip\\n selectedData = $$.filterTargetsToShow($$.data.targets).map(function(t) {\\n return $$.addName($$.getValueOnIndex(t.values, index));\\n });\\n\\n if (config.tooltip_grouped) {\\n $$.showTooltip(selectedData, this);\\n $$.showXGridFocus(selectedData);\\n }\\n\\n if (config.tooltip_grouped && (!config.data_selection_enabled || config.data_selection_grouped)) {\\n return;\\n }\\n\\n $$.main\\n .selectAll('.' + CLASS.shape + '-' + index)\\n .each(function() {\\n d3.select(this).classed(CLASS.EXPANDED, true);\\n if (config.data_selection_enabled) {\\n eventRect.style('cursor', config.data_selection_grouped ? 'pointer' : null);\\n }\\n if (!config.tooltip_grouped) {\\n $$.hideXGridFocus();\\n $$.hideTooltip();\\n if (!config.data_selection_grouped) {\\n $$.unexpandCircles(index);\\n $$.unexpandBars(index);\\n }\\n }\\n })\\n .filter(function(d) {\\n return $$.isWithinShape(this, d);\\n })\\n .each(function(d) {\\n if (\\n config.data_selection_enabled &&\\n (config.data_selection_grouped || config.data_selection_isselectable(d))\\n ) {\\n eventRect.style('cursor', 'pointer');\\n }\\n if (!config.tooltip_grouped) {\\n $$.showTooltip([d], this);\\n $$.showXGridFocus([d]);\\n if (config.point_focus_expand_enabled) {\\n $$.expandCircles(index, d.id, true);\\n }\\n $$.expandBars(index, d.id, true);\\n }\\n });\\n })\\n .on('click', function(d) {\\n var index = d.index;\\n if ($$.hasArcType() || !$$.toggleShape) {\\n return;\\n }\\n if ($$.cancelClick) {\\n $$.cancelClick = false;\\n return;\\n }\\n if (\\n $$.isStepType(d) &&\\n config.line_step_type === 'step-after' &&\\n d3.mouse(this)[0] < $$.x($$.getXValue(d.id, index))\\n ) {\\n index -= 1;\\n }\\n $$.main.selectAll('.' + CLASS.shape + '-' + index).each(function(d) {\\n if (config.data_selection_grouped || $$.isWithinShape(this, d)) {\\n $$.toggleShape(this, d, index);\\n $$.config.data_onclick.call($$.api, d, this);\\n }\\n });\\n })\\n .call(\\n config.data_selection_draggable && $$.drag\\n ? d3.behavior\\n .drag()\\n .origin(Object)\\n .on('drag', function() {\\n $$.drag(d3.mouse(this));\\n })\\n .on('dragstart', function() {\\n $$.dragstart(d3.mouse(this));\\n })\\n .on('dragend', function() {\\n $$.dragend();\\n })\\n : function() {}\\n );\\n };\\n\\n c3_chart_internal_fn.generateEventRectsForMultipleXs = function(eventRectEnter) {\\n var $$ = this,\\n d3 = $$.d3,\\n config = $$.config;\\n\\n function mouseout() {\\n $$.svg.select('.' + CLASS.eventRect).style('cursor', null);\\n $$.hideXGridFocus();\\n $$.hideTooltip();\\n $$.unexpandCircles();\\n $$.unexpandBars();\\n }\\n\\n eventRectEnter\\n .append('rect')\\n .attr('x', 0)\\n .attr('y', 0)\\n .attr('width', $$.width)\\n .attr('height', $$.height)\\n .attr('class', CLASS.eventRect)\\n .on('mouseout', function() {\\n if (!$$.config) {\\n return;\\n } // chart is destroyed\\n if ($$.hasArcType()) {\\n return;\\n }\\n mouseout();\\n })\\n .on('mousemove', function() {\\n var targetsToShow = $$.filterTargetsToShow($$.data.targets);\\n var mouse, closest, sameXData, selectedData;\\n\\n if ($$.dragging) {\\n return;\\n } // do nothing when dragging\\n if ($$.hasArcType(targetsToShow)) {\\n return;\\n }\\n\\n mouse = d3.mouse(this);\\n closest = $$.findClosestFromTargets(targetsToShow, mouse);\\n\\n if ($$.mouseover && (!closest || closest.id !== $$.mouseover.id)) {\\n config.data_onmouseout.call($$.api, $$.mouseover);\\n $$.mouseover = undefined;\\n }\\n\\n if (!closest) {\\n mouseout();\\n return;\\n }\\n\\n if ($$.isScatterType(closest) || !config.tooltip_grouped) {\\n sameXData = [closest];\\n } else {\\n sameXData = $$.filterByX(targetsToShow, closest.x);\\n }\\n\\n // show tooltip when cursor is close to some point\\n selectedData = sameXData.map(function(d) {\\n return $$.addName(d);\\n });\\n $$.showTooltip(selectedData, this);\\n\\n // expand points\\n if (config.point_focus_expand_enabled) {\\n $$.expandCircles(closest.index, closest.id, true);\\n }\\n $$.expandBars(closest.index, closest.id, true);\\n\\n // Show xgrid focus line\\n $$.showXGridFocus(selectedData);\\n\\n // Show cursor as pointer if point is close to mouse position\\n if ($$.isBarType(closest.id) || $$.dist(closest, mouse) < config.point_sensitivity) {\\n $$.svg.select('.' + CLASS.eventRect).style('cursor', 'pointer');\\n if (!$$.mouseover) {\\n config.data_onmouseover.call($$.api, closest);\\n $$.mouseover = closest;\\n }\\n }\\n })\\n .on('click', function() {\\n var targetsToShow = $$.filterTargetsToShow($$.data.targets);\\n var mouse, closest;\\n if ($$.hasArcType(targetsToShow)) {\\n return;\\n }\\n\\n mouse = d3.mouse(this);\\n closest = $$.findClosestFromTargets(targetsToShow, mouse);\\n if (!closest) {\\n return;\\n }\\n // select if selection enabled\\n if ($$.isBarType(closest.id) || $$.dist(closest, mouse) < config.point_sensitivity) {\\n $$.main\\n .selectAll('.' + CLASS.shapes + $$.getTargetSelectorSuffix(closest.id))\\n .selectAll('.' + CLASS.shape + '-' + closest.index)\\n .each(function() {\\n if (config.data_selection_grouped || $$.isWithinShape(this, closest)) {\\n $$.toggleShape(this, closest, closest.index);\\n $$.config.data_onclick.call($$.api, closest, this);\\n }\\n });\\n }\\n })\\n .call(\\n config.data_selection_draggable && $$.drag\\n ? d3.behavior\\n .drag()\\n .origin(Object)\\n .on('drag', function() {\\n $$.drag(d3.mouse(this));\\n })\\n .on('dragstart', function() {\\n $$.dragstart(d3.mouse(this));\\n })\\n .on('dragend', function() {\\n $$.dragend();\\n })\\n : function() {}\\n );\\n };\\n c3_chart_internal_fn.dispatchEvent = function(type, index, mouse) {\\n var $$ = this,\\n selector = '.' + CLASS.eventRect + (!$$.isMultipleX() ? '-' + index : ''),\\n eventRect = $$.main.select(selector).node(),\\n box = eventRect.getBoundingClientRect(),\\n x = box.left + (mouse ? mouse[0] : 0),\\n y = box.top + (mouse ? mouse[1] : 0),\\n event = document.createEvent('MouseEvents');\\n\\n event.initMouseEvent(type, true, true, window, 0, x, y, x, y, false, false, false, false, 0, null);\\n eventRect.dispatchEvent(event);\\n };\\n\\n c3_chart_internal_fn.getCurrentWidth = function() {\\n var $$ = this,\\n config = $$.config;\\n return config.size_width ? config.size_width : $$.getParentWidth();\\n };\\n c3_chart_internal_fn.getCurrentHeight = function() {\\n var $$ = this,\\n config = $$.config,\\n h = config.size_height ? config.size_height : $$.getParentHeight();\\n return h > 0 ? h : 320 / ($$.hasType('gauge') && !config.gauge_fullCircle ? 2 : 1);\\n };\\n c3_chart_internal_fn.getCurrentPaddingTop = function() {\\n var $$ = this,\\n config = $$.config,\\n padding = isValue(config.padding_top) ? config.padding_top : 0;\\n if ($$.title && $$.title.node()) {\\n padding += $$.getTitlePadding();\\n }\\n return padding;\\n };\\n c3_chart_internal_fn.getCurrentPaddingBottom = function() {\\n var config = this.config;\\n return isValue(config.padding_bottom) ? config.padding_bottom : 0;\\n };\\n c3_chart_internal_fn.getCurrentPaddingLeft = function(withoutRecompute) {\\n var $$ = this,\\n config = $$.config;\\n if (isValue(config.padding_left)) {\\n return config.padding_left;\\n } else if (config.axis_rotated) {\\n return !config.axis_x_show ? 1 : Math.max(ceil10($$.getAxisWidthByAxisId('x', withoutRecompute)), 40);\\n } else if (!config.axis_y_show || config.axis_y_inner) {\\n // && !config.axis_rotated\\n return $$.axis.getYAxisLabelPosition().isOuter ? 30 : 1;\\n } else {\\n return ceil10($$.getAxisWidthByAxisId('y', withoutRecompute));\\n }\\n };\\n c3_chart_internal_fn.getCurrentPaddingRight = function() {\\n var $$ = this,\\n config = $$.config,\\n defaultPadding = 10,\\n legendWidthOnRight = $$.isLegendRight ? $$.getLegendWidth() + 20 : 0;\\n if (isValue(config.padding_right)) {\\n return config.padding_right + 1; // 1 is needed not to hide tick line\\n } else if (config.axis_rotated) {\\n return defaultPadding + legendWidthOnRight;\\n } else if (!config.axis_y2_show || config.axis_y2_inner) {\\n // && !config.axis_rotated\\n return 2 + legendWidthOnRight + ($$.axis.getY2AxisLabelPosition().isOuter ? 20 : 0);\\n } else {\\n return ceil10($$.getAxisWidthByAxisId('y2')) + legendWidthOnRight;\\n }\\n };\\n\\n c3_chart_internal_fn.getParentRectValue = function(key) {\\n var parent = this.selectChart.node(),\\n v;\\n var vReturn;\\n while (parent && parent.tagName !== 'BODY') {\\n var activeElements;\\n try {\\n if (key == 'width') {\\n activeElements = $('div.tab-pane.ng-scope.active').find('div.c3');\\n if (activeElements.length > 0) {\\n window.globalWidthVar = activeElements[0].getBoundingClientRect()[key];\\n v = activeElements[0].getBoundingClientRect()[key];\\n } else {\\n v = parent.getBoundingClientRect()[key];\\n }\\n } else {\\n v = parent.getBoundingClientRect()[key];\\n }\\n } catch (e) {\\n if (key === 'width') {\\n // In IE in certain cases getBoundingClientRect\\n // will cause an \\\"unspecified $('#ParentDiv').find('input');error\\\"\\n v = parent.offsetWidth;\\n }\\n }\\n if (v) {\\n break;\\n }\\n parent = parent.parentNode;\\n }\\n\\n vReturn = window.globalWidthVar || v;\\n return vReturn;\\n };\\n\\n c3_chart_internal_fn.getParentWidth = function() {\\n return this.getParentRectValue('width');\\n };\\n c3_chart_internal_fn.getParentHeight = function() {\\n var h = this.selectChart.style('height');\\n return h.indexOf('px') > 0 ? +h.replace('px', '') : 0;\\n };\\n\\n c3_chart_internal_fn.getSvgLeft = function(withoutRecompute) {\\n var $$ = this,\\n config = $$.config,\\n hasLeftAxisRect = config.axis_rotated || (!config.axis_rotated && !config.axis_y_inner),\\n leftAxisClass = config.axis_rotated ? CLASS.axisX : CLASS.axisY,\\n leftAxis = $$.main.select('.' + leftAxisClass).node(),\\n svgRect = leftAxis && hasLeftAxisRect ? leftAxis.getBoundingClientRect() : { right: 0 },\\n chartRect = $$.selectChart.node().getBoundingClientRect(),\\n hasArc = $$.hasArcType(),\\n svgLeft = svgRect.right - chartRect.left - (hasArc ? 0 : $$.getCurrentPaddingLeft(withoutRecompute));\\n return svgLeft > 0 ? svgLeft : 0;\\n };\\n\\n c3_chart_internal_fn.getAxisWidthByAxisId = function(id, withoutRecompute) {\\n var $$ = this,\\n position = $$.axis.getLabelPositionById(id);\\n return $$.axis.getMaxTickWidth(id, withoutRecompute) + (position.isInner ? 20 : 40);\\n };\\n c3_chart_internal_fn.getHorizontalAxisHeight = function(axisId) {\\n var $$ = this,\\n config = $$.config,\\n h = 30;\\n if (axisId === 'x' && !config.axis_x_show) {\\n return 8;\\n }\\n if (axisId === 'x' && config.axis_x_height) {\\n return config.axis_x_height;\\n }\\n if (axisId === 'y' && !config.axis_y_show) {\\n return config.legend_show && !$$.isLegendRight && !$$.isLegendInset ? 10 : 1;\\n }\\n if (axisId === 'y2' && !config.axis_y2_show) {\\n return $$.rotated_padding_top;\\n }\\n // Calculate x axis height when tick rotated\\n if (axisId === 'x' && !config.axis_rotated && config.axis_x_tick_rotate) {\\n h = 30 + $$.axis.getMaxTickWidth(axisId) * Math.cos((Math.PI * (90 - config.axis_x_tick_rotate)) / 180);\\n }\\n // Calculate y axis height when tick rotated\\n if (axisId === 'y' && config.axis_rotated && config.axis_y_tick_rotate) {\\n h = 30 + $$.axis.getMaxTickWidth(axisId) * Math.cos((Math.PI * (90 - config.axis_y_tick_rotate)) / 180);\\n }\\n return h + ($$.axis.getLabelPositionById(axisId).isInner ? 0 : 10) + (axisId === 'y2' ? -10 : 0);\\n };\\n\\n c3_chart_internal_fn.getEventRectWidth = function() {\\n return Math.max(0, this.xAxis.tickInterval());\\n };\\n\\n c3_chart_internal_fn.getShapeIndices = function(typeFilter) {\\n var $$ = this,\\n config = $$.config,\\n indices = {},\\n i = 0,\\n j,\\n k;\\n $$.filterTargetsToShow($$.data.targets.filter(typeFilter, $$)).forEach(function(d) {\\n for (j = 0; j < config.data_groups.length; j++) {\\n if (config.data_groups[j].indexOf(d.id) < 0) {\\n continue;\\n }\\n for (k = 0; k < config.data_groups[j].length; k++) {\\n if (config.data_groups[j][k] in indices) {\\n indices[d.id] = indices[config.data_groups[j][k]];\\n break;\\n }\\n }\\n }\\n if (isUndefined(indices[d.id])) {\\n indices[d.id] = i++;\\n }\\n });\\n indices.__max__ = i - 1;\\n return indices;\\n };\\n c3_chart_internal_fn.getShapeX = function(offset, targetsNum, indices, isSub) {\\n var $$ = this,\\n scale = isSub ? $$.subX : $$.x;\\n return function(d) {\\n var index = d.id in indices ? indices[d.id] : 0;\\n return d.x || d.x === 0 ? scale(d.x) - offset * (targetsNum / 2 - index) : 0;\\n };\\n };\\n c3_chart_internal_fn.getShapeY = function(isSub) {\\n var $$ = this;\\n return function(d) {\\n var scale = isSub ? $$.getSubYScale(d.id) : $$.getYScale(d.id);\\n return scale(d.value);\\n };\\n };\\n c3_chart_internal_fn.getShapeOffset = function(typeFilter, indices, isSub) {\\n var $$ = this,\\n targets = $$.orderTargets($$.filterTargetsToShow($$.data.targets.filter(typeFilter, $$))),\\n targetIds = targets.map(function(t) {\\n return t.id;\\n });\\n return function(d, i) {\\n var scale = isSub ? $$.getSubYScale(d.id) : $$.getYScale(d.id),\\n y0 = scale(0),\\n offset = y0;\\n targets.forEach(function(t) {\\n var values = $$.isStepType(d) ? $$.convertValuesToStep(t.values) : t.values;\\n if (t.id === d.id || indices[t.id] !== indices[d.id]) {\\n return;\\n }\\n if (targetIds.indexOf(t.id) < targetIds.indexOf(d.id)) {\\n // check if the x values line up\\n if (typeof values[i] === 'undefined' || +values[i].x !== +d.x) {\\n // \\\"+\\\" for timeseries\\n // if not, try to find the value that does line up\\n i = -1;\\n values.forEach(function(v, j) {\\n if (v.x === d.x) {\\n i = j;\\n }\\n });\\n }\\n if (i in values && values[i].value * d.value >= 0) {\\n offset += scale(values[i].value) - y0;\\n }\\n }\\n });\\n return offset;\\n };\\n };\\n c3_chart_internal_fn.isWithinShape = function(that, d) {\\n var $$ = this,\\n shape = $$.d3.select(that),\\n isWithin;\\n if (!$$.isTargetToShow(d.id)) {\\n isWithin = false;\\n } else if (that.nodeName === 'circle') {\\n isWithin = $$.isStepType(d)\\n ? $$.isWithinStep(that, $$.getYScale(d.id)(d.value))\\n : $$.isWithinCircle(that, $$.pointSelectR(d) * 1.5);\\n } else if (that.nodeName === 'path') {\\n isWithin = shape.classed(CLASS.bar) ? $$.isWithinBar(that) : true;\\n }\\n return isWithin;\\n };\\n\\n c3_chart_internal_fn.getInterpolate = function(d) {\\n var $$ = this,\\n interpolation = $$.isInterpolationType($$.config.spline_interpolation_type)\\n ? $$.config.spline_interpolation_type\\n : 'cardinal';\\n return $$.isSplineType(d) ? interpolation : $$.isStepType(d) ? $$.config.line_step_type : 'linear';\\n };\\n\\n c3_chart_internal_fn.initLine = function() {\\n var $$ = this;\\n $$.main\\n .select('.' + CLASS.chart)\\n .append('g')\\n .attr('class', CLASS.chartLines);\\n };\\n c3_chart_internal_fn.updateTargetsForLine = function(targets) {\\n var $$ = this,\\n config = $$.config,\\n mainLineUpdate,\\n mainLineEnter,\\n classChartLine = $$.classChartLine.bind($$),\\n classLines = $$.classLines.bind($$),\\n classAreas = $$.classAreas.bind($$),\\n classCircles = $$.classCircles.bind($$),\\n classFocus = $$.classFocus.bind($$);\\n mainLineUpdate = $$.main\\n .select('.' + CLASS.chartLines)\\n .selectAll('.' + CLASS.chartLine)\\n .data(targets)\\n .attr('class', function(d) {\\n return classChartLine(d) + classFocus(d);\\n });\\n mainLineEnter = mainLineUpdate\\n .enter()\\n .append('g')\\n .attr('class', classChartLine)\\n .style('opacity', 0)\\n .style('pointer-events', 'none');\\n // Lines for each data\\n mainLineEnter.append('g').attr('class', classLines);\\n // Areas\\n mainLineEnter.append('g').attr('class', classAreas);\\n // Circles for each data point on lines\\n mainLineEnter.append('g').attr('class', function(d) {\\n return $$.generateClass(CLASS.selectedCircles, d.id);\\n });\\n mainLineEnter\\n .append('g')\\n .attr('class', classCircles)\\n .style('cursor', function(d) {\\n return config.data_selection_isselectable(d) ? 'pointer' : null;\\n });\\n // Update date for selected circles\\n targets.forEach(function(t) {\\n $$.main\\n .selectAll('.' + CLASS.selectedCircles + $$.getTargetSelectorSuffix(t.id))\\n .selectAll('.' + CLASS.selectedCircle)\\n .each(function(d) {\\n d.value = t.values[d.index].value;\\n });\\n });\\n // MEMO: can not keep same color...\\n //mainLineUpdate.exit().remove();\\n };\\n c3_chart_internal_fn.updateLine = function(durationForExit) {\\n var $$ = this;\\n $$.mainLine = $$.main\\n .selectAll('.' + CLASS.lines)\\n .selectAll('.' + CLASS.line)\\n .data($$.lineData.bind($$));\\n $$.mainLine\\n .enter()\\n .append('path')\\n .attr('class', $$.classLine.bind($$))\\n .style('stroke', $$.color);\\n $$.mainLine\\n .style('opacity', $$.initialOpacity.bind($$))\\n .style('shape-rendering', function(d) {\\n return $$.isStepType(d) ? 'crispEdges' : '';\\n })\\n .attr('transform', null);\\n $$.mainLine\\n .exit()\\n .transition()\\n .duration(durationForExit)\\n .style('opacity', 0)\\n .remove();\\n };\\n c3_chart_internal_fn.redrawLine = function(drawLine, withTransition) {\\n return [\\n (withTransition ? this.mainLine.transition(Math.random().toString()) : this.mainLine)\\n .attr('d', drawLine)\\n .style('stroke', this.color)\\n .style('opacity', 1)\\n ];\\n };\\n c3_chart_internal_fn.generateDrawLine = function(lineIndices, isSub) {\\n var $$ = this,\\n config = $$.config,\\n line = $$.d3.svg.line(),\\n getPoints = $$.generateGetLinePoints(lineIndices, isSub),\\n yScaleGetter = isSub ? $$.getSubYScale : $$.getYScale,\\n xValue = function(d) {\\n return (isSub ? $$.subxx : $$.xx).call($$, d);\\n },\\n yValue = function(d, i) {\\n return config.data_groups.length > 0 ? getPoints(d, i)[0][1] : yScaleGetter.call($$, d.id)(d.value);\\n };\\n\\n line = config.axis_rotated ? line.x(yValue).y(xValue) : line.x(xValue).y(yValue);\\n if (!config.line_connectNull) {\\n line = line.defined(function(d) {\\n return d.value != null;\\n });\\n }\\n return function(d) {\\n var values = config.line_connectNull ? $$.filterRemoveNull(d.values) : d.values,\\n x = isSub ? $$.x : $$.subX,\\n y = yScaleGetter.call($$, d.id),\\n x0 = 0,\\n y0 = 0,\\n path;\\n if ($$.isLineType(d)) {\\n if (config.data_regions[d.id]) {\\n path = $$.lineWithRegions(values, x, y, config.data_regions[d.id]);\\n } else {\\n if ($$.isStepType(d)) {\\n values = $$.convertValuesToStep(values);\\n }\\n path = line.interpolate($$.getInterpolate(d))(values);\\n }\\n } else {\\n if (values[0]) {\\n x0 = x(values[0].x);\\n y0 = y(values[0].value);\\n }\\n path = config.axis_rotated ? 'M ' + y0 + ' ' + x0 : 'M ' + x0 + ' ' + y0;\\n }\\n return path ? path : 'M 0 0';\\n };\\n };\\n c3_chart_internal_fn.generateGetLinePoints = function(lineIndices, isSub) {\\n // partial duplication of generateGetBarPoints\\n var $$ = this,\\n config = $$.config,\\n lineTargetsNum = lineIndices.__max__ + 1,\\n x = $$.getShapeX(0, lineTargetsNum, lineIndices, !!isSub),\\n y = $$.getShapeY(!!isSub),\\n lineOffset = $$.getShapeOffset($$.isLineType, lineIndices, !!isSub),\\n yScale = isSub ? $$.getSubYScale : $$.getYScale;\\n return function(d, i) {\\n var y0 = yScale.call($$, d.id)(0),\\n offset = lineOffset(d, i) || y0, // offset is for stacked area chart\\n posX = x(d),\\n posY = y(d);\\n // fix posY not to overflow opposite quadrant\\n if (config.axis_rotated) {\\n if ((0 < d.value && posY < y0) || (d.value < 0 && y0 < posY)) {\\n posY = y0;\\n }\\n }\\n // 1 point that marks the line position\\n return [\\n [posX, posY - (y0 - offset)],\\n [posX, posY - (y0 - offset)], // needed for compatibility\\n [posX, posY - (y0 - offset)], // needed for compatibility\\n [posX, posY - (y0 - offset)] // needed for compatibility\\n ];\\n };\\n };\\n\\n c3_chart_internal_fn.lineWithRegions = function(d, x, y, _regions) {\\n var $$ = this,\\n config = $$.config,\\n prev = -1,\\n i,\\n j,\\n s = 'M',\\n sWithRegion,\\n xp,\\n yp,\\n dx,\\n dy,\\n dd,\\n diff,\\n diffx2,\\n xOffset = $$.isCategorized() ? 0.5 : 0,\\n xValue,\\n yValue,\\n regions = [];\\n\\n function isWithinRegions(x, regions) {\\n var i;\\n for (i = 0; i < regions.length; i++) {\\n if (regions[i].start < x && x <= regions[i].end) {\\n return true;\\n }\\n }\\n return false;\\n }\\n\\n // Check start/end of regions\\n if (isDefined(_regions)) {\\n for (i = 0; i < _regions.length; i++) {\\n regions[i] = {};\\n if (isUndefined(_regions[i].start)) {\\n regions[i].start = d[0].x;\\n } else {\\n regions[i].start = $$.isTimeSeries() ? $$.parseDate(_regions[i].start) : _regions[i].start;\\n }\\n if (isUndefined(_regions[i].end)) {\\n regions[i].end = d[d.length - 1].x;\\n } else {\\n regions[i].end = $$.isTimeSeries() ? $$.parseDate(_regions[i].end) : _regions[i].end;\\n }\\n }\\n }\\n\\n // Set scales\\n xValue = config.axis_rotated\\n ? function(d) {\\n return y(d.value);\\n }\\n : function(d) {\\n return x(d.x);\\n };\\n yValue = config.axis_rotated\\n ? function(d) {\\n return x(d.x);\\n }\\n : function(d) {\\n return y(d.value);\\n };\\n\\n // Define svg generator function for region\\n function generateM(points) {\\n return 'M' + points[0][0] + ' ' + points[0][1] + ' ' + points[1][0] + ' ' + points[1][1];\\n }\\n\\n if ($$.isTimeSeries()) {\\n sWithRegion = function(d0, d1, j, diff) {\\n var x0 = d0.x.getTime(),\\n x_diff = d1.x - d0.x,\\n xv0 = new Date(x0 + x_diff * j),\\n xv1 = new Date(x0 + x_diff * (j + diff)),\\n points;\\n if (config.axis_rotated) {\\n points = [[y(yp(j)), x(xv0)], [y(yp(j + diff)), x(xv1)]];\\n } else {\\n points = [[x(xv0), y(yp(j))], [x(xv1), y(yp(j + diff))]];\\n }\\n return generateM(points);\\n };\\n } else {\\n sWithRegion = function(d0, d1, j, diff) {\\n var points;\\n if (config.axis_rotated) {\\n points = [[y(yp(j), true), x(xp(j))], [y(yp(j + diff), true), x(xp(j + diff))]];\\n } else {\\n points = [[x(xp(j), true), y(yp(j))], [x(xp(j + diff), true), y(yp(j + diff))]];\\n }\\n return generateM(points);\\n };\\n }\\n\\n // Generate\\n for (i = 0; i < d.length; i++) {\\n // Draw as normal\\n if (isUndefined(regions) || !isWithinRegions(d[i].x, regions)) {\\n s += ' ' + xValue(d[i]) + ' ' + yValue(d[i]);\\n }\\n // Draw with region // TODO: Fix for horizotal charts\\n else {\\n xp = $$.getScale(d[i - 1].x + xOffset, d[i].x + xOffset, $$.isTimeSeries());\\n yp = $$.getScale(d[i - 1].value, d[i].value);\\n\\n dx = x(d[i].x) - x(d[i - 1].x);\\n dy = y(d[i].value) - y(d[i - 1].value);\\n dd = Math.sqrt(Math.pow(dx, 2) + Math.pow(dy, 2));\\n diff = 2 / dd;\\n diffx2 = diff * 2;\\n\\n for (j = diff; j <= 1; j += diffx2) {\\n s += sWithRegion(d[i - 1], d[i], j, diff);\\n }\\n }\\n prev = d[i].x;\\n }\\n\\n return s;\\n };\\n\\n c3_chart_internal_fn.updateArea = function(durationForExit) {\\n var $$ = this,\\n d3 = $$.d3;\\n $$.mainArea = $$.main\\n .selectAll('.' + CLASS.areas)\\n .selectAll('.' + CLASS.area)\\n .data($$.lineData.bind($$));\\n $$.mainArea\\n .enter()\\n .append('path')\\n .attr('class', $$.classArea.bind($$))\\n .style('fill', $$.color)\\n .style('opacity', function() {\\n $$.orgAreaOpacity = +d3.select(this).style('opacity');\\n return 0;\\n });\\n $$.mainArea.style('opacity', $$.orgAreaOpacity);\\n $$.mainArea\\n .exit()\\n .transition()\\n .duration(durationForExit)\\n .style('opacity', 0)\\n .remove();\\n };\\n c3_chart_internal_fn.redrawArea = function(drawArea, withTransition) {\\n return [\\n (withTransition ? this.mainArea.transition(Math.random().toString()) : this.mainArea)\\n .attr('d', drawArea)\\n .style('fill', this.color)\\n .style('opacity', this.orgAreaOpacity)\\n ];\\n };\\n c3_chart_internal_fn.generateDrawArea = function(areaIndices, isSub) {\\n var $$ = this,\\n config = $$.config,\\n area = $$.d3.svg.area(),\\n getPoints = $$.generateGetAreaPoints(areaIndices, isSub),\\n yScaleGetter = isSub ? $$.getSubYScale : $$.getYScale,\\n xValue = function(d) {\\n return (isSub ? $$.subxx : $$.xx).call($$, d);\\n },\\n value0 = function(d, i) {\\n return config.data_groups.length > 0\\n ? getPoints(d, i)[0][1]\\n : yScaleGetter.call($$, d.id)($$.getAreaBaseValue(d.id));\\n },\\n value1 = function(d, i) {\\n return config.data_groups.length > 0 ? getPoints(d, i)[1][1] : yScaleGetter.call($$, d.id)(d.value);\\n };\\n\\n area = config.axis_rotated\\n ? area\\n .x0(value0)\\n .x1(value1)\\n .y(xValue)\\n : area\\n .x(xValue)\\n .y0(config.area_above ? 0 : value0)\\n .y1(value1);\\n if (!config.line_connectNull) {\\n area = area.defined(function(d) {\\n return d.value !== null;\\n });\\n }\\n\\n return function(d) {\\n var values = config.line_connectNull ? $$.filterRemoveNull(d.values) : d.values,\\n x0 = 0,\\n y0 = 0,\\n path;\\n if ($$.isAreaType(d)) {\\n if ($$.isStepType(d)) {\\n values = $$.convertValuesToStep(values);\\n }\\n path = area.interpolate($$.getInterpolate(d))(values);\\n } else {\\n if (values[0]) {\\n x0 = $$.x(values[0].x);\\n y0 = $$.getYScale(d.id)(values[0].value);\\n }\\n path = config.axis_rotated ? 'M ' + y0 + ' ' + x0 : 'M ' + x0 + ' ' + y0;\\n }\\n return path ? path : 'M 0 0';\\n };\\n };\\n c3_chart_internal_fn.getAreaBaseValue = function() {\\n return 0;\\n };\\n c3_chart_internal_fn.generateGetAreaPoints = function(areaIndices, isSub) {\\n // partial duplication of generateGetBarPoints\\n var $$ = this,\\n config = $$.config,\\n areaTargetsNum = areaIndices.__max__ + 1,\\n x = $$.getShapeX(0, areaTargetsNum, areaIndices, !!isSub),\\n y = $$.getShapeY(!!isSub),\\n areaOffset = $$.getShapeOffset($$.isAreaType, areaIndices, !!isSub),\\n yScale = isSub ? $$.getSubYScale : $$.getYScale;\\n return function(d, i) {\\n var y0 = yScale.call($$, d.id)(0),\\n offset = areaOffset(d, i) || y0, // offset is for stacked area chart\\n posX = x(d),\\n posY = y(d);\\n // fix posY not to overflow opposite quadrant\\n if (config.axis_rotated) {\\n if ((0 < d.value && posY < y0) || (d.value < 0 && y0 < posY)) {\\n posY = y0;\\n }\\n }\\n // 1 point that marks the area position\\n return [\\n [posX, offset],\\n [posX, posY - (y0 - offset)],\\n [posX, posY - (y0 - offset)], // needed for compatibility\\n [posX, offset] // needed for compatibility\\n ];\\n };\\n };\\n\\n c3_chart_internal_fn.updateCircle = function() {\\n var $$ = this;\\n $$.mainCircle = $$.main\\n .selectAll('.' + CLASS.circles)\\n .selectAll('.' + CLASS.circle)\\n .data($$.lineOrScatterData.bind($$));\\n $$.mainCircle\\n .enter()\\n .append('circle')\\n .attr('class', $$.classCircle.bind($$))\\n .attr('r', $$.pointR.bind($$))\\n .style('fill', $$.color);\\n $$.mainCircle.style('opacity', $$.initialOpacityForCircle.bind($$));\\n $$.mainCircle.exit().remove();\\n };\\n c3_chart_internal_fn.redrawCircle = function(cx, cy, withTransition) {\\n var selectedCircles = this.main.selectAll('.' + CLASS.selectedCircle);\\n return [\\n (withTransition ? this.mainCircle.transition(Math.random().toString()) : this.mainCircle)\\n .style('opacity', this.opacityForCircle.bind(this))\\n .style('fill', this.color)\\n .attr('cx', cx)\\n .attr('cy', cy),\\n (withTransition ? selectedCircles.transition(Math.random().toString()) : selectedCircles)\\n .attr('cx', cx)\\n .attr('cy', cy)\\n ];\\n };\\n c3_chart_internal_fn.circleX = function(d) {\\n return d.x || d.x === 0 ? this.x(d.x) : null;\\n };\\n c3_chart_internal_fn.updateCircleY = function() {\\n var $$ = this,\\n lineIndices,\\n getPoints;\\n if ($$.config.data_groups.length > 0) {\\n (lineIndices = $$.getShapeIndices($$.isLineType)), (getPoints = $$.generateGetLinePoints(lineIndices));\\n $$.circleY = function(d, i) {\\n return getPoints(d, i)[0][1];\\n };\\n } else {\\n $$.circleY = function(d) {\\n return $$.getYScale(d.id)(d.value);\\n };\\n }\\n };\\n c3_chart_internal_fn.getCircles = function(i, id) {\\n var $$ = this;\\n return (id ? $$.main.selectAll('.' + CLASS.circles + $$.getTargetSelectorSuffix(id)) : $$.main).selectAll(\\n '.' + CLASS.circle + (isValue(i) ? '-' + i : '')\\n );\\n };\\n c3_chart_internal_fn.expandCircles = function(i, id, reset) {\\n var $$ = this,\\n r = $$.pointExpandedR.bind($$);\\n if (reset) {\\n $$.unexpandCircles();\\n }\\n $$.getCircles(i, id)\\n .classed(CLASS.EXPANDED, true)\\n .attr('r', r);\\n };\\n c3_chart_internal_fn.unexpandCircles = function(i) {\\n var $$ = this,\\n r = $$.pointR.bind($$);\\n $$.getCircles(i)\\n .filter(function() {\\n return $$.d3.select(this).classed(CLASS.EXPANDED);\\n })\\n .classed(CLASS.EXPANDED, false)\\n .attr('r', r);\\n };\\n c3_chart_internal_fn.pointR = function(d) {\\n var $$ = this,\\n config = $$.config;\\n return $$.isStepType(d) ? 0 : isFunction(config.point_r) ? config.point_r(d) : config.point_r;\\n };\\n c3_chart_internal_fn.pointExpandedR = function(d) {\\n var $$ = this,\\n config = $$.config;\\n return config.point_focus_expand_enabled\\n ? config.point_focus_expand_r\\n ? config.point_focus_expand_r\\n : $$.pointR(d) * 1.75\\n : $$.pointR(d);\\n };\\n c3_chart_internal_fn.pointSelectR = function(d) {\\n var $$ = this,\\n config = $$.config;\\n return isFunction(config.point_select_r)\\n ? config.point_select_r(d)\\n : config.point_select_r\\n ? config.point_select_r\\n : $$.pointR(d) * 4;\\n };\\n c3_chart_internal_fn.isWithinCircle = function(that, r) {\\n var d3 = this.d3,\\n mouse = d3.mouse(that),\\n d3_this = d3.select(that),\\n cx = +d3_this.attr('cx'),\\n cy = +d3_this.attr('cy');\\n return Math.sqrt(Math.pow(cx - mouse[0], 2) + Math.pow(cy - mouse[1], 2)) < r;\\n };\\n c3_chart_internal_fn.isWithinStep = function(that, y) {\\n return Math.abs(y - this.d3.mouse(that)[1]) < 30;\\n };\\n\\n c3_chart_internal_fn.initBar = function() {\\n var $$ = this;\\n $$.main\\n .select('.' + CLASS.chart)\\n .append('g')\\n .attr('class', CLASS.chartBars);\\n };\\n c3_chart_internal_fn.updateTargetsForBar = function(targets) {\\n var $$ = this,\\n config = $$.config,\\n mainBarUpdate,\\n mainBarEnter,\\n classChartBar = $$.classChartBar.bind($$),\\n classBars = $$.classBars.bind($$),\\n classFocus = $$.classFocus.bind($$);\\n mainBarUpdate = $$.main\\n .select('.' + CLASS.chartBars)\\n .selectAll('.' + CLASS.chartBar)\\n .data(targets)\\n .attr('class', function(d) {\\n return classChartBar(d) + classFocus(d);\\n });\\n mainBarEnter = mainBarUpdate\\n .enter()\\n .append('g')\\n .attr('class', classChartBar)\\n .style('opacity', 0)\\n .style('pointer-events', 'none');\\n // Bars for each data\\n mainBarEnter\\n .append('g')\\n .attr('class', classBars)\\n .style('cursor', function(d) {\\n return config.data_selection_isselectable(d) ? 'pointer' : null;\\n });\\n };\\n c3_chart_internal_fn.updateBar = function(durationForExit) {\\n var $$ = this,\\n barData = $$.barData.bind($$),\\n classBar = $$.classBar.bind($$),\\n initialOpacity = $$.initialOpacity.bind($$),\\n color = function(d) {\\n return $$.color(d.id);\\n };\\n $$.mainBar = $$.main\\n .selectAll('.' + CLASS.bars)\\n .selectAll('.' + CLASS.bar)\\n .data(barData);\\n $$.mainBar\\n .enter()\\n .append('path')\\n .attr('class', classBar)\\n .style('stroke', color)\\n .style('fill', color);\\n $$.mainBar.style('opacity', initialOpacity);\\n $$.mainBar\\n .exit()\\n .transition()\\n .duration(durationForExit)\\n .style('opacity', 0)\\n .remove();\\n };\\n c3_chart_internal_fn.redrawBar = function(drawBar, withTransition) {\\n return [\\n (withTransition ? this.mainBar.transition(Math.random().toString()) : this.mainBar)\\n .attr('d', drawBar)\\n .style('fill', this.color)\\n .style('opacity', 1)\\n ];\\n };\\n c3_chart_internal_fn.getBarW = function(axis, barTargetsNum) {\\n var $$ = this,\\n config = $$.config,\\n w =\\n typeof config.bar_width === 'number'\\n ? config.bar_width\\n : barTargetsNum\\n ? (axis.tickInterval() * config.bar_width_ratio) / barTargetsNum\\n : 0;\\n return config.bar_width_max && w > config.bar_width_max ? config.bar_width_max : w;\\n };\\n c3_chart_internal_fn.getBars = function(i, id) {\\n var $$ = this;\\n return (id ? $$.main.selectAll('.' + CLASS.bars + $$.getTargetSelectorSuffix(id)) : $$.main).selectAll(\\n '.' + CLASS.bar + (isValue(i) ? '-' + i : '')\\n );\\n };\\n c3_chart_internal_fn.expandBars = function(i, id, reset) {\\n var $$ = this;\\n if (reset) {\\n $$.unexpandBars();\\n }\\n $$.getBars(i, id).classed(CLASS.EXPANDED, true);\\n };\\n c3_chart_internal_fn.unexpandBars = function(i) {\\n var $$ = this;\\n $$.getBars(i).classed(CLASS.EXPANDED, false);\\n };\\n c3_chart_internal_fn.generateDrawBar = function(barIndices, isSub) {\\n var $$ = this,\\n config = $$.config,\\n getPoints = $$.generateGetBarPoints(barIndices, isSub);\\n return function(d, i) {\\n // 4 points that make a bar\\n var points = getPoints(d, i);\\n\\n // switch points if axis is rotated, not applicable for sub chart\\n var indexX = config.axis_rotated ? 1 : 0;\\n var indexY = config.axis_rotated ? 0 : 1;\\n\\n var path =\\n 'M ' +\\n points[0][indexX] +\\n ',' +\\n points[0][indexY] +\\n ' ' +\\n 'L' +\\n points[1][indexX] +\\n ',' +\\n points[1][indexY] +\\n ' ' +\\n 'L' +\\n points[2][indexX] +\\n ',' +\\n points[2][indexY] +\\n ' ' +\\n 'L' +\\n points[3][indexX] +\\n ',' +\\n points[3][indexY] +\\n ' ' +\\n 'z';\\n\\n return path;\\n };\\n };\\n c3_chart_internal_fn.generateGetBarPoints = function(barIndices, isSub) {\\n var $$ = this,\\n axis = isSub ? $$.subXAxis : $$.xAxis,\\n barTargetsNum = barIndices.__max__ + 1,\\n barW = $$.getBarW(axis, barTargetsNum),\\n barX = $$.getShapeX(barW, barTargetsNum, barIndices, !!isSub),\\n barY = $$.getShapeY(!!isSub),\\n barOffset = $$.getShapeOffset($$.isBarType, barIndices, !!isSub),\\n yScale = isSub ? $$.getSubYScale : $$.getYScale;\\n return function(d, i) {\\n var y0 = yScale.call($$, d.id)(0),\\n offset = barOffset(d, i) || y0, // offset is for stacked bar chart\\n posX = barX(d),\\n posY = barY(d);\\n // fix posY not to overflow opposite quadrant\\n if ($$.config.axis_rotated) {\\n if ((0 < d.value && posY < y0) || (d.value < 0 && y0 < posY)) {\\n posY = y0;\\n }\\n }\\n // 4 points that make a bar\\n return [[posX, offset], [posX, posY - (y0 - offset)], [posX + barW, posY - (y0 - offset)], [posX + barW, offset]];\\n };\\n };\\n c3_chart_internal_fn.isWithinBar = function(that) {\\n var mouse = this.d3.mouse(that),\\n box = that.getBoundingClientRect(),\\n seg0 = that.pathSegList.getItem(0),\\n seg1 = that.pathSegList.getItem(1),\\n x = Math.min(seg0.x, seg1.x),\\n y = Math.min(seg0.y, seg1.y),\\n w = box.width,\\n h = box.height,\\n offset = 2,\\n sx = x - offset,\\n ex = x + w + offset,\\n sy = y + h + offset,\\n ey = y - offset;\\n return sx < mouse[0] && mouse[0] < ex && ey < mouse[1] && mouse[1] < sy;\\n };\\n\\n c3_chart_internal_fn.initText = function() {\\n var $$ = this;\\n $$.main\\n .select('.' + CLASS.chart)\\n .append('g')\\n .attr('class', CLASS.chartTexts);\\n $$.mainText = $$.d3.selectAll([]);\\n };\\n c3_chart_internal_fn.updateTargetsForText = function(targets) {\\n var $$ = this,\\n mainTextUpdate,\\n mainTextEnter,\\n classChartText = $$.classChartText.bind($$),\\n classTexts = $$.classTexts.bind($$),\\n classFocus = $$.classFocus.bind($$);\\n mainTextUpdate = $$.main\\n .select('.' + CLASS.chartTexts)\\n .selectAll('.' + CLASS.chartText)\\n .data(targets)\\n .attr('class', function(d) {\\n return classChartText(d) + classFocus(d);\\n });\\n mainTextEnter = mainTextUpdate\\n .enter()\\n .append('g')\\n .attr('class', classChartText)\\n .style('opacity', 0)\\n .style('pointer-events', 'none');\\n mainTextEnter.append('g').attr('class', classTexts);\\n };\\n c3_chart_internal_fn.updateText = function(durationForExit) {\\n var $$ = this,\\n config = $$.config,\\n barOrLineData = $$.barOrLineData.bind($$),\\n classText = $$.classText.bind($$);\\n $$.mainText = $$.main\\n .selectAll('.' + CLASS.texts)\\n .selectAll('.' + CLASS.text)\\n .data(barOrLineData);\\n $$.mainText\\n .enter()\\n .append('text')\\n .attr('class', classText)\\n .attr('text-anchor', function(d) {\\n return config.axis_rotated ? (d.value < 0 ? 'end' : 'start') : 'middle';\\n })\\n .style('stroke', 'none')\\n .style('fill', function(d) {\\n return $$.color(d);\\n })\\n .style('fill-opacity', 0);\\n $$.mainText.text(function(d, i, j) {\\n return $$.dataLabelFormat(d.id)(d.value, d.id, i, j);\\n });\\n $$.mainText\\n .exit()\\n .transition()\\n .duration(durationForExit)\\n .style('fill-opacity', 0)\\n .remove();\\n };\\n c3_chart_internal_fn.redrawText = function(xForText, yForText, forFlow, withTransition) {\\n return [\\n (withTransition ? this.mainText.transition() : this.mainText)\\n .attr('x', xForText)\\n .attr('y', yForText)\\n .style('fill', this.color)\\n .style('fill-opacity', forFlow ? 0 : this.opacityForText.bind(this))\\n ];\\n };\\n c3_chart_internal_fn.getTextRect = function(text, cls, element) {\\n var dummy = this.d3\\n .select('body')\\n .append('div')\\n .classed('c3', true),\\n svg = dummy\\n .append('svg')\\n .style('visibility', 'hidden')\\n .style('position', 'fixed')\\n .style('top', 0)\\n .style('left', 0),\\n font = this.d3.select(element).style('font'),\\n rect;\\n svg\\n .selectAll('.dummy')\\n .data([text])\\n .enter()\\n .append('text')\\n .classed(cls ? cls : '', true)\\n .style('font', font)\\n .text(text)\\n .each(function() {\\n rect = this.getBoundingClientRect();\\n });\\n dummy.remove();\\n return rect;\\n };\\n c3_chart_internal_fn.generateXYForText = function(areaIndices, barIndices, lineIndices, forX) {\\n var $$ = this,\\n getAreaPoints = $$.generateGetAreaPoints(areaIndices, false),\\n getBarPoints = $$.generateGetBarPoints(barIndices, false),\\n getLinePoints = $$.generateGetLinePoints(lineIndices, false),\\n getter = forX ? $$.getXForText : $$.getYForText;\\n return function(d, i) {\\n var getPoints = $$.isAreaType(d) ? getAreaPoints : $$.isBarType(d) ? getBarPoints : getLinePoints;\\n return getter.call($$, getPoints(d, i), d, this);\\n };\\n };\\n c3_chart_internal_fn.getXForText = function(points, d, textElement) {\\n var $$ = this,\\n box = textElement.getBoundingClientRect(),\\n xPos,\\n padding;\\n if ($$.config.axis_rotated) {\\n padding = $$.isBarType(d) ? 4 : 6;\\n xPos = points[2][1] + padding * (d.value < 0 ? -1 : 1);\\n } else {\\n xPos = $$.hasType('bar') ? (points[2][0] + points[0][0]) / 2 : points[0][0];\\n }\\n // show labels regardless of the domain if value is null\\n if (d.value === null) {\\n if (xPos > $$.width) {\\n xPos = $$.width - box.width;\\n } else if (xPos < 0) {\\n xPos = 4;\\n }\\n }\\n return xPos;\\n };\\n c3_chart_internal_fn.getYForText = function(points, d, textElement) {\\n var $$ = this,\\n box = textElement.getBoundingClientRect(),\\n yPos;\\n if ($$.config.axis_rotated) {\\n yPos = (points[0][0] + points[2][0] + box.height * 0.6) / 2;\\n } else {\\n yPos = points[2][1];\\n if (d.value < 0 || (d.value === 0 && !$$.hasPositiveValue)) {\\n yPos += box.height;\\n if ($$.isBarType(d) && $$.isSafari()) {\\n yPos -= 3;\\n } else if (!$$.isBarType(d) && $$.isChrome()) {\\n yPos += 3;\\n }\\n } else {\\n yPos += $$.isBarType(d) ? -3 : -6;\\n }\\n }\\n // show labels regardless of the domain if value is null\\n if (d.value === null && !$$.config.axis_rotated) {\\n if (yPos < box.height) {\\n yPos = box.height;\\n } else if (yPos > this.height) {\\n yPos = this.height - 4;\\n }\\n }\\n return yPos;\\n };\\n\\n c3_chart_internal_fn.setTargetType = function(targetIds, type) {\\n var $$ = this,\\n config = $$.config;\\n $$.mapToTargetIds(targetIds).forEach(function(id) {\\n $$.withoutFadeIn[id] = type === config.data_types[id];\\n config.data_types[id] = type;\\n });\\n if (!targetIds) {\\n config.data_type = type;\\n }\\n };\\n c3_chart_internal_fn.hasType = function(type, targets) {\\n var $$ = this,\\n types = $$.config.data_types,\\n has = false;\\n targets = targets || $$.data.targets;\\n if (targets && targets.length) {\\n targets.forEach(function(target) {\\n var t = types[target.id];\\n if ((t && t.indexOf(type) >= 0) || (!t && type === 'line')) {\\n has = true;\\n }\\n });\\n } else if (Object.keys(types).length) {\\n Object.keys(types).forEach(function(id) {\\n if (types[id] === type) {\\n has = true;\\n }\\n });\\n } else {\\n has = $$.config.data_type === type;\\n }\\n return has;\\n };\\n c3_chart_internal_fn.hasArcType = function(targets) {\\n return this.hasType('pie', targets) || this.hasType('donut', targets) || this.hasType('gauge', targets);\\n };\\n c3_chart_internal_fn.isLineType = function(d) {\\n var config = this.config,\\n id = isString(d) ? d : d.id;\\n return (\\n !config.data_types[id] ||\\n ['line', 'spline', 'area', 'area-spline', 'step', 'area-step'].indexOf(config.data_types[id]) >= 0\\n );\\n };\\n c3_chart_internal_fn.isStepType = function(d) {\\n var id = isString(d) ? d : d.id;\\n return ['step', 'area-step'].indexOf(this.config.data_types[id]) >= 0;\\n };\\n c3_chart_internal_fn.isSplineType = function(d) {\\n var id = isString(d) ? d : d.id;\\n return ['spline', 'area-spline'].indexOf(this.config.data_types[id]) >= 0;\\n };\\n c3_chart_internal_fn.isAreaType = function(d) {\\n var id = isString(d) ? d : d.id;\\n return ['area', 'area-spline', 'area-step'].indexOf(this.config.data_types[id]) >= 0;\\n };\\n c3_chart_internal_fn.isBarType = function(d) {\\n var id = isString(d) ? d : d.id;\\n return this.config.data_types[id] === 'bar';\\n };\\n c3_chart_internal_fn.isScatterType = function(d) {\\n var id = isString(d) ? d : d.id;\\n return this.config.data_types[id] === 'scatter';\\n };\\n c3_chart_internal_fn.isPieType = function(d) {\\n var id = isString(d) ? d : d.id;\\n return this.config.data_types[id] === 'pie';\\n };\\n c3_chart_internal_fn.isGaugeType = function(d) {\\n var id = isString(d) ? d : d.id;\\n return this.config.data_types[id] === 'gauge';\\n };\\n c3_chart_internal_fn.isDonutType = function(d) {\\n var id = isString(d) ? d : d.id;\\n return this.config.data_types[id] === 'donut';\\n };\\n c3_chart_internal_fn.isArcType = function(d) {\\n return this.isPieType(d) || this.isDonutType(d) || this.isGaugeType(d);\\n };\\n c3_chart_internal_fn.lineData = function(d) {\\n return this.isLineType(d) ? [d] : [];\\n };\\n c3_chart_internal_fn.arcData = function(d) {\\n return this.isArcType(d.data) ? [d] : [];\\n };\\n /* not used\\n function scatterData(d) {\\n return isScatterType(d) ? d.values : [];\\n }\\n */\\n c3_chart_internal_fn.barData = function(d) {\\n return this.isBarType(d) ? d.values : [];\\n };\\n c3_chart_internal_fn.lineOrScatterData = function(d) {\\n return this.isLineType(d) || this.isScatterType(d) ? d.values : [];\\n };\\n c3_chart_internal_fn.barOrLineData = function(d) {\\n return this.isBarType(d) || this.isLineType(d) ? d.values : [];\\n };\\n c3_chart_internal_fn.isInterpolationType = function(type) {\\n return (\\n [\\n 'linear',\\n 'linear-closed',\\n 'basis',\\n 'basis-open',\\n 'basis-closed',\\n 'bundle',\\n 'cardinal',\\n 'cardinal-open',\\n 'cardinal-closed',\\n 'monotone'\\n ].indexOf(type) >= 0\\n );\\n };\\n\\n c3_chart_internal_fn.initGrid = function() {\\n var $$ = this,\\n config = $$.config,\\n d3 = $$.d3;\\n $$.grid = $$.main\\n .append('g')\\n .attr('clip-path', $$.clipPathForGrid)\\n .attr('class', CLASS.grid);\\n if (config.grid_x_show) {\\n $$.grid.append('g').attr('class', CLASS.xgrids);\\n }\\n if (config.grid_y_show) {\\n $$.grid.append('g').attr('class', CLASS.ygrids);\\n }\\n if (config.grid_focus_show) {\\n $$.grid\\n .append('g')\\n .attr('class', CLASS.xgridFocus)\\n .append('line')\\n .attr('class', CLASS.xgridFocus);\\n }\\n $$.xgrid = d3.selectAll([]);\\n if (!config.grid_lines_front) {\\n $$.initGridLines();\\n }\\n };\\n c3_chart_internal_fn.initGridLines = function() {\\n var $$ = this,\\n d3 = $$.d3;\\n $$.gridLines = $$.main\\n .append('g')\\n .attr('clip-path', $$.clipPathForGrid)\\n .attr('class', CLASS.grid + ' ' + CLASS.gridLines);\\n $$.gridLines.append('g').attr('class', CLASS.xgridLines);\\n $$.gridLines.append('g').attr('class', CLASS.ygridLines);\\n $$.xgridLines = d3.selectAll([]);\\n };\\n c3_chart_internal_fn.updateXGrid = function(withoutUpdate) {\\n var $$ = this,\\n config = $$.config,\\n d3 = $$.d3,\\n xgridData = $$.generateGridData(config.grid_x_type, $$.x),\\n tickOffset = $$.isCategorized() ? $$.xAxis.tickOffset() : 0;\\n\\n $$.xgridAttr = config.axis_rotated\\n ? {\\n x1: 0,\\n x2: $$.width,\\n y1: function(d) {\\n return $$.x(d) - tickOffset;\\n },\\n y2: function(d) {\\n return $$.x(d) - tickOffset;\\n }\\n }\\n : {\\n x1: function(d) {\\n return $$.x(d) + tickOffset;\\n },\\n x2: function(d) {\\n return $$.x(d) + tickOffset;\\n },\\n y1: 0,\\n y2: $$.height\\n };\\n\\n $$.xgrid = $$.main\\n .select('.' + CLASS.xgrids)\\n .selectAll('.' + CLASS.xgrid)\\n .data(xgridData);\\n $$.xgrid\\n .enter()\\n .append('line')\\n .attr('class', CLASS.xgrid);\\n if (!withoutUpdate) {\\n $$.xgrid.attr($$.xgridAttr).style('opacity', function() {\\n return +d3.select(this).attr(config.axis_rotated ? 'y1' : 'x1') === (config.axis_rotated ? $$.height : 0)\\n ? 0\\n : 1;\\n });\\n }\\n $$.xgrid.exit().remove();\\n };\\n\\n c3_chart_internal_fn.updateYGrid = function() {\\n var $$ = this,\\n config = $$.config,\\n gridValues = $$.yAxis.tickValues() || $$.y.ticks(config.grid_y_ticks);\\n $$.ygrid = $$.main\\n .select('.' + CLASS.ygrids)\\n .selectAll('.' + CLASS.ygrid)\\n .data(gridValues);\\n $$.ygrid\\n .enter()\\n .append('line')\\n .attr('class', CLASS.ygrid);\\n $$.ygrid\\n .attr('x1', config.axis_rotated ? $$.y : 0)\\n .attr('x2', config.axis_rotated ? $$.y : $$.width)\\n .attr('y1', config.axis_rotated ? 0 : $$.y)\\n .attr('y2', config.axis_rotated ? $$.height : $$.y);\\n $$.ygrid.exit().remove();\\n $$.smoothLines($$.ygrid, 'grid');\\n };\\n\\n c3_chart_internal_fn.gridTextAnchor = function(d) {\\n return d.position ? d.position : 'end';\\n };\\n c3_chart_internal_fn.gridTextDx = function(d) {\\n return d.position === 'start' ? 4 : d.position === 'middle' ? 0 : -4;\\n };\\n c3_chart_internal_fn.xGridTextX = function(d) {\\n return d.position === 'start' ? -this.height : d.position === 'middle' ? -this.height / 2 : 0;\\n };\\n c3_chart_internal_fn.yGridTextX = function(d) {\\n return d.position === 'start' ? 0 : d.position === 'middle' ? this.width / 2 : this.width;\\n };\\n c3_chart_internal_fn.updateGrid = function(duration) {\\n var $$ = this,\\n main = $$.main,\\n config = $$.config,\\n xgridLine,\\n ygridLine,\\n yv;\\n\\n // hide if arc type\\n $$.grid.style('visibility', $$.hasArcType() ? 'hidden' : 'visible');\\n\\n main.select('line.' + CLASS.xgridFocus).style('visibility', 'hidden');\\n if (config.grid_x_show) {\\n $$.updateXGrid();\\n }\\n $$.xgridLines = main\\n .select('.' + CLASS.xgridLines)\\n .selectAll('.' + CLASS.xgridLine)\\n .data(config.grid_x_lines);\\n // enter\\n xgridLine = $$.xgridLines\\n .enter()\\n .append('g')\\n .attr('class', function(d) {\\n return CLASS.xgridLine + (d['class'] ? ' ' + d['class'] : '');\\n });\\n xgridLine.append('line').style('opacity', 0);\\n xgridLine\\n .append('text')\\n .attr('text-anchor', $$.gridTextAnchor)\\n .attr('transform', config.axis_rotated ? '' : 'rotate(-90)')\\n .attr('dx', $$.gridTextDx)\\n .attr('dy', -5)\\n .style('opacity', 0);\\n // udpate\\n // done in d3.transition() of the end of this function\\n // exit\\n $$.xgridLines\\n .exit()\\n .transition()\\n .duration(duration)\\n .style('opacity', 0)\\n .remove();\\n\\n // Y-Grid\\n if (config.grid_y_show) {\\n $$.updateYGrid();\\n }\\n $$.ygridLines = main\\n .select('.' + CLASS.ygridLines)\\n .selectAll('.' + CLASS.ygridLine)\\n .data(config.grid_y_lines);\\n // enter\\n ygridLine = $$.ygridLines\\n .enter()\\n .append('g')\\n .attr('class', function(d) {\\n return CLASS.ygridLine + (d['class'] ? ' ' + d['class'] : '');\\n });\\n ygridLine.append('line').style('opacity', 0);\\n ygridLine\\n .append('text')\\n .attr('text-anchor', $$.gridTextAnchor)\\n .attr('transform', config.axis_rotated ? 'rotate(-90)' : '')\\n .attr('dx', $$.gridTextDx)\\n .attr('dy', -5)\\n .style('opacity', 0);\\n // update\\n yv = $$.yv.bind($$);\\n $$.ygridLines\\n .select('line')\\n .transition()\\n .duration(duration)\\n .attr('x1', config.axis_rotated ? yv : 0)\\n .attr('x2', config.axis_rotated ? yv : $$.width)\\n .attr('y1', config.axis_rotated ? 0 : yv)\\n .attr('y2', config.axis_rotated ? $$.height : yv)\\n .style('opacity', 1);\\n $$.ygridLines\\n .select('text')\\n .transition()\\n .duration(duration)\\n .attr('x', config.axis_rotated ? $$.xGridTextX.bind($$) : $$.yGridTextX.bind($$))\\n .attr('y', yv)\\n .text(function(d) {\\n return d.text;\\n })\\n .style('opacity', 1);\\n // exit\\n $$.ygridLines\\n .exit()\\n .transition()\\n .duration(duration)\\n .style('opacity', 0)\\n .remove();\\n };\\n c3_chart_internal_fn.redrawGrid = function(withTransition) {\\n var $$ = this,\\n config = $$.config,\\n xv = $$.xv.bind($$),\\n lines = $$.xgridLines.select('line'),\\n texts = $$.xgridLines.select('text');\\n return [\\n (withTransition ? lines.transition() : lines)\\n .attr('x1', config.axis_rotated ? 0 : xv)\\n .attr('x2', config.axis_rotated ? $$.width : xv)\\n .attr('y1', config.axis_rotated ? xv : 0)\\n .attr('y2', config.axis_rotated ? xv : $$.height)\\n .style('opacity', 1),\\n (withTransition ? texts.transition() : texts)\\n .attr('x', config.axis_rotated ? $$.yGridTextX.bind($$) : $$.xGridTextX.bind($$))\\n .attr('y', xv)\\n .text(function(d) {\\n return d.text;\\n })\\n .style('opacity', 1)\\n ];\\n };\\n c3_chart_internal_fn.showXGridFocus = function(selectedData) {\\n var $$ = this,\\n config = $$.config,\\n dataToShow = selectedData.filter(function(d) {\\n return d && isValue(d.value);\\n }),\\n focusEl = $$.main.selectAll('line.' + CLASS.xgridFocus),\\n xx = $$.xx.bind($$);\\n if (!config.tooltip_show) {\\n return;\\n }\\n // Hide when scatter plot exists\\n if ($$.hasType('scatter') || $$.hasArcType()) {\\n return;\\n }\\n focusEl\\n .style('visibility', 'visible')\\n .data([dataToShow[0]])\\n .attr(config.axis_rotated ? 'y1' : 'x1', xx)\\n .attr(config.axis_rotated ? 'y2' : 'x2', xx);\\n $$.smoothLines(focusEl, 'grid');\\n };\\n c3_chart_internal_fn.hideXGridFocus = function() {\\n this.main.select('line.' + CLASS.xgridFocus).style('visibility', 'hidden');\\n };\\n c3_chart_internal_fn.updateXgridFocus = function() {\\n var $$ = this,\\n config = $$.config;\\n $$.main\\n .select('line.' + CLASS.xgridFocus)\\n .attr('x1', config.axis_rotated ? 0 : -10)\\n .attr('x2', config.axis_rotated ? $$.width : -10)\\n .attr('y1', config.axis_rotated ? -10 : 0)\\n .attr('y2', config.axis_rotated ? -10 : $$.height);\\n };\\n c3_chart_internal_fn.generateGridData = function(type, scale) {\\n var $$ = this,\\n gridData = [],\\n xDomain,\\n firstYear,\\n lastYear,\\n i,\\n tickNum = $$.main\\n .select('.' + CLASS.axisX)\\n .selectAll('.tick')\\n .size();\\n if (type === 'year') {\\n xDomain = $$.getXDomain();\\n firstYear = xDomain[0].getFullYear();\\n lastYear = xDomain[1].getFullYear();\\n for (i = firstYear; i <= lastYear; i++) {\\n gridData.push(new Date(i + '-01-01 00:00:00'));\\n }\\n } else {\\n gridData = scale.ticks(10);\\n if (gridData.length > tickNum) {\\n // use only int\\n gridData = gridData.filter(function(d) {\\n return ('' + d).indexOf('.') < 0;\\n });\\n }\\n }\\n return gridData;\\n };\\n c3_chart_internal_fn.getGridFilterToRemove = function(params) {\\n return params\\n ? function(line) {\\n var found = false;\\n [].concat(params).forEach(function(param) {\\n if (\\n ('value' in param && line.value === param.value) ||\\n ('class' in param && line['class'] === param['class'])\\n ) {\\n found = true;\\n }\\n });\\n return found;\\n }\\n : function() {\\n return true;\\n };\\n };\\n c3_chart_internal_fn.removeGridLines = function(params, forX) {\\n var $$ = this,\\n config = $$.config,\\n toRemove = $$.getGridFilterToRemove(params),\\n toShow = function(line) {\\n return !toRemove(line);\\n },\\n classLines = forX ? CLASS.xgridLines : CLASS.ygridLines,\\n classLine = forX ? CLASS.xgridLine : CLASS.ygridLine;\\n $$.main\\n .select('.' + classLines)\\n .selectAll('.' + classLine)\\n .filter(toRemove)\\n .transition()\\n .duration(config.transition_duration)\\n .style('opacity', 0)\\n .remove();\\n if (forX) {\\n config.grid_x_lines = config.grid_x_lines.filter(toShow);\\n } else {\\n config.grid_y_lines = config.grid_y_lines.filter(toShow);\\n }\\n };\\n\\n c3_chart_internal_fn.initTooltip = function() {\\n var $$ = this,\\n config = $$.config,\\n i;\\n $$.tooltip = $$.selectChart\\n .style('position', 'relative')\\n .append('div')\\n .attr('class', CLASS.tooltipContainer)\\n .style('position', 'absolute')\\n .style('pointer-events', 'none')\\n .style('display', 'none');\\n // Show tooltip if needed\\n if (config.tooltip_init_show) {\\n if ($$.isTimeSeries() && isString(config.tooltip_init_x)) {\\n config.tooltip_init_x = $$.parseDate(config.tooltip_init_x);\\n for (i = 0; i < $$.data.targets[0].values.length; i++) {\\n if ($$.data.targets[0].values[i].x - config.tooltip_init_x === 0) {\\n break;\\n }\\n }\\n config.tooltip_init_x = i;\\n }\\n $$.tooltip.html(\\n config.tooltip_contents.call(\\n $$,\\n $$.data.targets.map(function(d) {\\n return $$.addName(d.values[config.tooltip_init_x]);\\n }),\\n $$.axis.getXAxisTickFormat(),\\n $$.getYFormat($$.hasArcType()),\\n $$.color\\n )\\n );\\n $$.tooltip\\n .style('top', config.tooltip_init_position.top)\\n .style('left', config.tooltip_init_position.left)\\n .style('display', 'block');\\n }\\n };\\n c3_chart_internal_fn.getTooltipContent = function(d, defaultTitleFormat, defaultValueFormat, color) {\\n var $$ = this,\\n config = $$.config,\\n titleFormat = config.tooltip_format_title || defaultTitleFormat,\\n nameFormat =\\n config.tooltip_format_name ||\\n function(name) {\\n return name;\\n },\\n valueFormat = config.tooltip_format_value || defaultValueFormat,\\n text,\\n i,\\n title,\\n value,\\n name,\\n bgcolor,\\n orderAsc = $$.isOrderAsc();\\n\\n if (config.data_groups.length === 0) {\\n d.sort(function(a, b) {\\n var v1 = a ? a.value : null,\\n v2 = b ? b.value : null;\\n return orderAsc ? v1 - v2 : v2 - v1;\\n });\\n } else {\\n var ids = $$.orderTargets($$.data.targets).map(function(i) {\\n return i.id;\\n });\\n d.sort(function(a, b) {\\n var v1 = a ? a.value : null,\\n v2 = b ? b.value : null;\\n if (v1 > 0 && v2 > 0) {\\n v1 = a ? ids.indexOf(a.id) : null;\\n v2 = b ? ids.indexOf(b.id) : null;\\n }\\n return orderAsc ? v1 - v2 : v2 - v1;\\n });\\n }\\n\\n for (i = 0; i < d.length; i++) {\\n if (!(d[i] && (d[i].value || d[i].value === 0))) {\\n continue;\\n }\\n\\n if (!text) {\\n title = sanitise(titleFormat ? titleFormat(d[i].x) : d[i].x);\\n text =\\n \\\"\\\" +\\n (title || title === 0 ? \\\"' : '');\\n }\\n\\n value = sanitise(valueFormat(d[i].value, d[i].ratio, d[i].id, d[i].index, d));\\n if (value !== undefined) {\\n // Skip elements when their name is set to null\\n if (d[i].name === null) {\\n continue;\\n }\\n name = sanitise(nameFormat(d[i].name, d[i].ratio, d[i].id, d[i].index));\\n bgcolor = $$.levelColor ? $$.levelColor(d[i].value) : color(d[i].id);\\n\\n text += \\\"\\\";\\n text += \\\"';\\n text += \\\"'; //Prolaera toFixed(1)\\n text += '';\\n }\\n }\\n return text + '
\\\" + title + '
\\\" + name + '\\\" + (value / 100).toFixed(1) + '
';\\n };\\n c3_chart_internal_fn.tooltipPosition = function(dataToShow, tWidth, tHeight, element) {\\n var $$ = this,\\n config = $$.config,\\n d3 = $$.d3;\\n var svgLeft, tooltipLeft, tooltipRight, tooltipTop, chartRight;\\n var forArc = $$.hasArcType(),\\n mouse = d3.mouse(element);\\n // Determin tooltip position\\n if (forArc) {\\n tooltipLeft = ($$.width - ($$.isLegendRight ? $$.getLegendWidth() : 0)) / 2 + mouse[0];\\n tooltipTop = $$.height / 2 + mouse[1] + 20;\\n } else {\\n svgLeft = $$.getSvgLeft(true);\\n if (config.axis_rotated) {\\n tooltipLeft = svgLeft + mouse[0] + 100;\\n tooltipRight = tooltipLeft + tWidth;\\n chartRight = $$.currentWidth - $$.getCurrentPaddingRight();\\n tooltipTop = $$.x(dataToShow[0].x) + 20;\\n } else {\\n tooltipLeft = svgLeft + $$.getCurrentPaddingLeft(true) + $$.x(dataToShow[0].x) + 20;\\n tooltipRight = tooltipLeft + tWidth;\\n chartRight = svgLeft + $$.currentWidth - $$.getCurrentPaddingRight();\\n tooltipTop = mouse[1] + 15;\\n }\\n\\n if (tooltipRight > chartRight) {\\n // 20 is needed for Firefox to keep tooltip width\\n tooltipLeft -= tooltipRight - chartRight + 20;\\n }\\n if (tooltipTop + tHeight > $$.currentHeight) {\\n tooltipTop -= tHeight + 30;\\n }\\n }\\n if (tooltipTop < 0) {\\n tooltipTop = 0;\\n }\\n return { top: tooltipTop, left: tooltipLeft };\\n };\\n c3_chart_internal_fn.showTooltip = function(selectedData, element) {\\n var $$ = this,\\n config = $$.config;\\n var tWidth, tHeight, position;\\n var forArc = $$.hasArcType(),\\n dataToShow = selectedData.filter(function(d) {\\n return d && isValue(d.value);\\n }),\\n positionFunction = config.tooltip_position || c3_chart_internal_fn.tooltipPosition;\\n if (dataToShow.length === 0 || !config.tooltip_show) {\\n return;\\n }\\n $$.tooltip\\n .html(\\n config.tooltip_contents.call($$, selectedData, $$.axis.getXAxisTickFormat(), $$.getYFormat(forArc), $$.color)\\n )\\n .style('display', 'block');\\n\\n // Get tooltip dimensions\\n tWidth = $$.tooltip.property('offsetWidth');\\n tHeight = $$.tooltip.property('offsetHeight');\\n\\n position = positionFunction.call(this, dataToShow, tWidth, tHeight, element);\\n // Set tooltip\\n $$.tooltip.style('top', position.top + 'px').style('left', position.left + 'px');\\n };\\n c3_chart_internal_fn.hideTooltip = function() {\\n this.tooltip.style('display', 'none');\\n };\\n\\n c3_chart_internal_fn.initLegend = function() {\\n var $$ = this;\\n $$.legendItemTextBox = {};\\n $$.legendHasRendered = false;\\n $$.legend = $$.svg.append('g').attr('transform', $$.getTranslate('legend'));\\n if (!$$.config.legend_show) {\\n $$.legend.style('visibility', 'hidden');\\n $$.hiddenLegendIds = $$.mapToIds($$.data.targets);\\n return;\\n }\\n // MEMO: call here to update legend box and tranlate for all\\n // MEMO: translate will be upated by this, so transform not needed in updateLegend()\\n $$.updateLegendWithDefaults();\\n };\\n c3_chart_internal_fn.updateLegendWithDefaults = function() {\\n var $$ = this;\\n $$.updateLegend($$.mapToIds($$.data.targets), {\\n withTransform: false,\\n withTransitionForTransform: false,\\n withTransition: false\\n });\\n };\\n c3_chart_internal_fn.updateSizeForLegend = function(legendHeight, legendWidth) {\\n var $$ = this,\\n config = $$.config,\\n insetLegendPosition = {\\n top: $$.isLegendTop\\n ? $$.getCurrentPaddingTop() + config.legend_inset_y + 5.5\\n : $$.currentHeight - legendHeight - $$.getCurrentPaddingBottom() - config.legend_inset_y,\\n left: $$.isLegendLeft\\n ? $$.getCurrentPaddingLeft() + config.legend_inset_x + 0.5\\n : $$.currentWidth - legendWidth - $$.getCurrentPaddingRight() - config.legend_inset_x + 0.5\\n };\\n\\n $$.margin3 = {\\n top: $$.isLegendRight ? 0 : $$.isLegendInset ? insetLegendPosition.top : $$.currentHeight - legendHeight,\\n right: NaN,\\n bottom: 0,\\n left: $$.isLegendRight ? $$.currentWidth - legendWidth : $$.isLegendInset ? insetLegendPosition.left : 0\\n };\\n };\\n c3_chart_internal_fn.transformLegend = function(withTransition) {\\n var $$ = this;\\n (withTransition ? $$.legend.transition() : $$.legend).attr('transform', $$.getTranslate('legend'));\\n };\\n c3_chart_internal_fn.updateLegendStep = function(step) {\\n this.legendStep = step;\\n };\\n c3_chart_internal_fn.updateLegendItemWidth = function(w) {\\n this.legendItemWidth = w;\\n };\\n c3_chart_internal_fn.updateLegendItemHeight = function(h) {\\n this.legendItemHeight = h;\\n };\\n c3_chart_internal_fn.getLegendWidth = function() {\\n var $$ = this;\\n return $$.config.legend_show\\n ? $$.isLegendRight || $$.isLegendInset\\n ? $$.legendItemWidth * ($$.legendStep + 1)\\n : $$.currentWidth\\n : 0;\\n };\\n c3_chart_internal_fn.getLegendHeight = function() {\\n var $$ = this,\\n h = 0;\\n if ($$.config.legend_show) {\\n if ($$.isLegendRight) {\\n h = $$.currentHeight;\\n } else {\\n h = Math.max(20, $$.legendItemHeight) * ($$.legendStep + 1);\\n }\\n }\\n return h;\\n };\\n c3_chart_internal_fn.opacityForLegend = function(legendItem) {\\n return legendItem.classed(CLASS.legendItemHidden) ? null : 1;\\n };\\n c3_chart_internal_fn.opacityForUnfocusedLegend = function(legendItem) {\\n return legendItem.classed(CLASS.legendItemHidden) ? null : 0.3;\\n };\\n c3_chart_internal_fn.toggleFocusLegend = function(targetIds, focus) {\\n var $$ = this;\\n targetIds = $$.mapToTargetIds(targetIds);\\n $$.legend\\n .selectAll('.' + CLASS.legendItem)\\n .filter(function(id) {\\n return targetIds.indexOf(id) >= 0;\\n })\\n .classed(CLASS.legendItemFocused, focus)\\n .transition()\\n .duration(100)\\n .style('opacity', function() {\\n var opacity = focus ? $$.opacityForLegend : $$.opacityForUnfocusedLegend;\\n return opacity.call($$, $$.d3.select(this));\\n });\\n };\\n c3_chart_internal_fn.revertLegend = function() {\\n var $$ = this,\\n d3 = $$.d3;\\n $$.legend\\n .selectAll('.' + CLASS.legendItem)\\n .classed(CLASS.legendItemFocused, false)\\n .transition()\\n .duration(100)\\n .style('opacity', function() {\\n return $$.opacityForLegend(d3.select(this));\\n });\\n };\\n c3_chart_internal_fn.showLegend = function(targetIds) {\\n var $$ = this,\\n config = $$.config;\\n if (!config.legend_show) {\\n config.legend_show = true;\\n $$.legend.style('visibility', 'visible');\\n if (!$$.legendHasRendered) {\\n $$.updateLegendWithDefaults();\\n }\\n }\\n $$.removeHiddenLegendIds(targetIds);\\n $$.legend\\n .selectAll($$.selectorLegends(targetIds))\\n .style('visibility', 'visible')\\n .transition()\\n .style('opacity', function() {\\n return $$.opacityForLegend($$.d3.select(this));\\n });\\n };\\n c3_chart_internal_fn.hideLegend = function(targetIds) {\\n var $$ = this,\\n config = $$.config;\\n if (config.legend_show && isEmpty(targetIds)) {\\n config.legend_show = false;\\n $$.legend.style('visibility', 'hidden');\\n }\\n $$.addHiddenLegendIds(targetIds);\\n $$.legend\\n .selectAll($$.selectorLegends(targetIds))\\n .style('opacity', 0)\\n .style('visibility', 'hidden');\\n };\\n c3_chart_internal_fn.clearLegendItemTextBoxCache = function() {\\n this.legendItemTextBox = {};\\n };\\n c3_chart_internal_fn.updateLegend = function(targetIds, options, transitions) {\\n var $$ = this,\\n config = $$.config;\\n var xForLegend,\\n xForLegendText,\\n xForLegendRect,\\n yForLegend,\\n yForLegendText,\\n yForLegendRect,\\n x1ForLegendTile,\\n x2ForLegendTile,\\n yForLegendTile;\\n var paddingTop = 4,\\n paddingRight = 10,\\n maxWidth = 0,\\n maxHeight = 0,\\n posMin = 10,\\n tileWidth = config.legend_item_tile_width + 5;\\n var l,\\n totalLength = 0,\\n offsets = {},\\n widths = {},\\n heights = {},\\n margins = [0],\\n steps = {},\\n step = 0;\\n var withTransition, withTransitionForTransform;\\n var texts, rects, tiles, background;\\n\\n // Skip elements when their name is set to null\\n targetIds = targetIds.filter(function(id) {\\n return !isDefined(config.data_names[id]) || config.data_names[id] !== null;\\n });\\n\\n options = options || {};\\n withTransition = getOption(options, 'withTransition', true);\\n withTransitionForTransform = getOption(options, 'withTransitionForTransform', true);\\n\\n function getTextBox(textElement, id) {\\n if (!$$.legendItemTextBox[id]) {\\n $$.legendItemTextBox[id] = $$.getTextRect(textElement.textContent, CLASS.legendItem, textElement);\\n }\\n return $$.legendItemTextBox[id];\\n }\\n\\n function updatePositions(textElement, id, index) {\\n var reset = index === 0,\\n isLast = index === targetIds.length - 1,\\n box = getTextBox(textElement, id),\\n itemWidth =\\n box.width +\\n tileWidth +\\n (isLast && !($$.isLegendRight || $$.isLegendInset) ? 0 : paddingRight) +\\n config.legend_padding,\\n itemHeight = box.height + paddingTop,\\n itemLength = $$.isLegendRight || $$.isLegendInset ? itemHeight : itemWidth,\\n areaLength = $$.isLegendRight || $$.isLegendInset ? $$.getLegendHeight() : $$.getLegendWidth(),\\n margin,\\n maxLength;\\n\\n // MEMO: care about condifion of step, totalLength\\n function updateValues(id, withoutStep) {\\n if (!withoutStep) {\\n margin = (areaLength - totalLength - itemLength) / 2;\\n if (margin < posMin) {\\n margin = (areaLength - itemLength) / 2;\\n totalLength = 0;\\n step++;\\n }\\n }\\n steps[id] = step;\\n margins[step] = $$.isLegendInset ? 10 : margin;\\n offsets[id] = totalLength;\\n totalLength += itemLength;\\n }\\n\\n if (reset) {\\n totalLength = 0;\\n step = 0;\\n maxWidth = 0;\\n maxHeight = 0;\\n }\\n\\n if (config.legend_show && !$$.isLegendToShow(id)) {\\n widths[id] = heights[id] = steps[id] = offsets[id] = 0;\\n return;\\n }\\n\\n widths[id] = itemWidth;\\n heights[id] = itemHeight;\\n\\n if (!maxWidth || itemWidth >= maxWidth) {\\n maxWidth = itemWidth;\\n }\\n if (!maxHeight || itemHeight >= maxHeight) {\\n maxHeight = itemHeight;\\n }\\n maxLength = $$.isLegendRight || $$.isLegendInset ? maxHeight : maxWidth;\\n\\n if (config.legend_equally) {\\n Object.keys(widths).forEach(function(id) {\\n widths[id] = maxWidth;\\n });\\n Object.keys(heights).forEach(function(id) {\\n heights[id] = maxHeight;\\n });\\n margin = (areaLength - maxLength * targetIds.length) / 2;\\n if (margin < posMin) {\\n totalLength = 0;\\n step = 0;\\n targetIds.forEach(function(id) {\\n updateValues(id);\\n });\\n } else {\\n updateValues(id, true);\\n }\\n } else {\\n updateValues(id);\\n }\\n }\\n\\n if ($$.isLegendInset) {\\n step = config.legend_inset_step ? config.legend_inset_step : targetIds.length;\\n $$.updateLegendStep(step);\\n }\\n\\n if ($$.isLegendRight) {\\n xForLegend = function(id) {\\n return maxWidth * steps[id];\\n };\\n yForLegend = function(id) {\\n return margins[steps[id]] + offsets[id];\\n };\\n } else if ($$.isLegendInset) {\\n xForLegend = function(id) {\\n return maxWidth * steps[id] + 10;\\n };\\n yForLegend = function(id) {\\n return margins[steps[id]] + offsets[id];\\n };\\n } else {\\n xForLegend = function(id) {\\n return margins[steps[id]] + offsets[id];\\n };\\n yForLegend = function(id) {\\n return maxHeight * steps[id];\\n };\\n }\\n xForLegendText = function(id, i) {\\n return xForLegend(id, i) + 4 + config.legend_item_tile_width;\\n };\\n yForLegendText = function(id, i) {\\n return yForLegend(id, i) + 9;\\n };\\n xForLegendRect = function(id, i) {\\n return xForLegend(id, i);\\n };\\n yForLegendRect = function(id, i) {\\n return yForLegend(id, i) - 5;\\n };\\n x1ForLegendTile = function(id, i) {\\n return xForLegend(id, i) - 2;\\n };\\n x2ForLegendTile = function(id, i) {\\n return xForLegend(id, i) - 2 + config.legend_item_tile_width;\\n };\\n yForLegendTile = function(id, i) {\\n return yForLegend(id, i) + 4;\\n };\\n\\n // Define g for legend area\\n l = $$.legend\\n .selectAll('.' + CLASS.legendItem)\\n .data(targetIds)\\n .enter()\\n .append('g')\\n .attr('class', function(id) {\\n return $$.generateClass(CLASS.legendItem, id);\\n })\\n .style('visibility', function(id) {\\n return $$.isLegendToShow(id) ? 'visible' : 'hidden';\\n })\\n .style('cursor', 'pointer')\\n .on('click', function(id) {\\n if (config.legend_item_onclick) {\\n config.legend_item_onclick.call($$, id);\\n } else {\\n if ($$.d3.event.altKey) {\\n $$.api.hide();\\n $$.api.show(id);\\n } else {\\n $$.api.toggle(id);\\n $$.isTargetToShow(id) ? $$.api.focus(id) : $$.api.revert();\\n }\\n }\\n })\\n .on('mouseover', function(id) {\\n if (config.legend_item_onmouseover) {\\n config.legend_item_onmouseover.call($$, id);\\n } else {\\n $$.d3.select(this).classed(CLASS.legendItemFocused, true);\\n if (!$$.transiting && $$.isTargetToShow(id)) {\\n $$.api.focus(id);\\n }\\n }\\n })\\n .on('mouseout', function(id) {\\n if (config.legend_item_onmouseout) {\\n config.legend_item_onmouseout.call($$, id);\\n } else {\\n $$.d3.select(this).classed(CLASS.legendItemFocused, false);\\n $$.api.revert();\\n }\\n });\\n l.append('text')\\n .text(function(id) {\\n return isDefined(config.data_names[id]) ? config.data_names[id] : id;\\n })\\n .each(function(id, i) {\\n updatePositions(this, id, i);\\n })\\n .style('pointer-events', 'none')\\n .attr('x', $$.isLegendRight || $$.isLegendInset ? xForLegendText : -200)\\n .attr('y', $$.isLegendRight || $$.isLegendInset ? -200 : yForLegendText);\\n l.append('rect')\\n .attr('class', CLASS.legendItemEvent)\\n .style('fill-opacity', 0)\\n .attr('x', $$.isLegendRight || $$.isLegendInset ? xForLegendRect : -200)\\n .attr('y', $$.isLegendRight || $$.isLegendInset ? -200 : yForLegendRect);\\n l.append('line')\\n .attr('class', CLASS.legendItemTile)\\n .style('stroke', $$.color)\\n .style('pointer-events', 'none')\\n .attr('x1', $$.isLegendRight || $$.isLegendInset ? x1ForLegendTile : -200)\\n .attr('y1', $$.isLegendRight || $$.isLegendInset ? -200 : yForLegendTile)\\n .attr('x2', $$.isLegendRight || $$.isLegendInset ? x2ForLegendTile : -200)\\n .attr('y2', $$.isLegendRight || $$.isLegendInset ? -200 : yForLegendTile)\\n .attr('stroke-width', config.legend_item_tile_height);\\n\\n // Set background for inset legend\\n background = $$.legend.select('.' + CLASS.legendBackground + ' rect');\\n if ($$.isLegendInset && maxWidth > 0 && background.size() === 0) {\\n background = $$.legend\\n .insert('g', '.' + CLASS.legendItem)\\n .attr('class', CLASS.legendBackground)\\n .append('rect');\\n }\\n\\n texts = $$.legend\\n .selectAll('text')\\n .data(targetIds)\\n .text(function(id) {\\n return isDefined(config.data_names[id]) ? config.data_names[id] : id;\\n }) // MEMO: needed for update\\n .each(function(id, i) {\\n updatePositions(this, id, i);\\n });\\n (withTransition ? texts.transition() : texts).attr('x', xForLegendText).attr('y', yForLegendText);\\n\\n rects = $$.legend.selectAll('rect.' + CLASS.legendItemEvent).data(targetIds);\\n (withTransition ? rects.transition() : rects)\\n .attr('width', function(id) {\\n return widths[id];\\n })\\n .attr('height', function(id) {\\n return heights[id];\\n })\\n .attr('x', xForLegendRect)\\n .attr('y', yForLegendRect);\\n\\n tiles = $$.legend.selectAll('line.' + CLASS.legendItemTile).data(targetIds);\\n (withTransition ? tiles.transition() : tiles)\\n .style('stroke', $$.color)\\n .attr('x1', x1ForLegendTile)\\n .attr('y1', yForLegendTile)\\n .attr('x2', x2ForLegendTile)\\n .attr('y2', yForLegendTile);\\n\\n if (background) {\\n (withTransition ? background.transition() : background)\\n .attr('height', $$.getLegendHeight() - 12)\\n .attr('width', maxWidth * (step + 1) + 10);\\n }\\n\\n // toggle legend state\\n $$.legend.selectAll('.' + CLASS.legendItem).classed(CLASS.legendItemHidden, function(id) {\\n return !$$.isTargetToShow(id);\\n });\\n\\n // Update all to reflect change of legend\\n $$.updateLegendItemWidth(maxWidth);\\n $$.updateLegendItemHeight(maxHeight);\\n $$.updateLegendStep(step);\\n // Update size and scale\\n $$.updateSizes();\\n $$.updateScales();\\n $$.updateSvgSize();\\n // Update g positions\\n $$.transformAll(withTransitionForTransform, transitions);\\n $$.legendHasRendered = true;\\n };\\n\\n c3_chart_internal_fn.initTitle = function() {\\n var $$ = this;\\n $$.title = $$.svg\\n .append('text')\\n .text($$.config.title_text)\\n .attr('class', $$.CLASS.title);\\n };\\n c3_chart_internal_fn.redrawTitle = function() {\\n var $$ = this;\\n $$.title.attr('x', $$.xForTitle.bind($$)).attr('y', $$.yForTitle.bind($$));\\n };\\n c3_chart_internal_fn.xForTitle = function() {\\n var $$ = this,\\n config = $$.config,\\n position = config.title_position || 'left',\\n x;\\n if (position.indexOf('right') >= 0) {\\n x =\\n $$.currentWidth -\\n $$.getTextRect($$.title.node().textContent, $$.CLASS.title, $$.title.node()).width -\\n config.title_padding.right;\\n } else if (position.indexOf('center') >= 0) {\\n x = ($$.currentWidth - $$.getTextRect($$.title.node().textContent, $$.CLASS.title, $$.title.node()).width) / 2;\\n } else {\\n // left\\n x = config.title_padding.left;\\n }\\n return x;\\n };\\n c3_chart_internal_fn.yForTitle = function() {\\n var $$ = this;\\n return (\\n $$.config.title_padding.top + $$.getTextRect($$.title.node().textContent, $$.CLASS.title, $$.title.node()).height\\n );\\n };\\n c3_chart_internal_fn.getTitlePadding = function() {\\n var $$ = this;\\n return $$.yForTitle() + $$.config.title_padding.bottom;\\n };\\n\\n function Axis(owner) {\\n API.call(this, owner);\\n }\\n\\n inherit(API, Axis);\\n\\n Axis.prototype.init = function init() {\\n var $$ = this.owner,\\n config = $$.config,\\n main = $$.main;\\n $$.axes.x = main\\n .append('g')\\n .attr('class', CLASS.axis + ' ' + CLASS.axisX)\\n .attr('clip-path', $$.clipPathForXAxis)\\n .attr('transform', $$.getTranslate('x'))\\n .style('visibility', config.axis_x_show ? 'visible' : 'hidden');\\n $$.axes.x\\n .append('text')\\n .attr('class', CLASS.axisXLabel)\\n .attr('transform', config.axis_rotated ? 'rotate(-90)' : '')\\n .style('text-anchor', this.textAnchorForXAxisLabel.bind(this));\\n $$.axes.y = main\\n .append('g')\\n .attr('class', CLASS.axis + ' ' + CLASS.axisY)\\n .attr('clip-path', config.axis_y_inner ? '' : $$.clipPathForYAxis)\\n .attr('transform', $$.getTranslate('y'))\\n .style('visibility', config.axis_y_show ? 'visible' : 'hidden');\\n $$.axes.y\\n .append('text')\\n .attr('class', CLASS.axisYLabel)\\n .attr('transform', config.axis_rotated ? '' : 'rotate(-90)')\\n .style('text-anchor', this.textAnchorForYAxisLabel.bind(this));\\n\\n $$.axes.y2 = main\\n .append('g')\\n .attr('class', CLASS.axis + ' ' + CLASS.axisY2)\\n // clip-path?\\n .attr('transform', $$.getTranslate('y2'))\\n .style('visibility', config.axis_y2_show ? 'visible' : 'hidden');\\n $$.axes.y2\\n .append('text')\\n .attr('class', CLASS.axisY2Label)\\n .attr('transform', config.axis_rotated ? '' : 'rotate(-90)')\\n .style('text-anchor', this.textAnchorForY2AxisLabel.bind(this));\\n };\\n Axis.prototype.getXAxis = function getXAxis(\\n scale,\\n orient,\\n tickFormat,\\n tickValues,\\n withOuterTick,\\n withoutTransition,\\n withoutRotateTickText\\n ) {\\n var $$ = this.owner,\\n config = $$.config,\\n axisParams = {\\n isCategory: $$.isCategorized(),\\n withOuterTick: withOuterTick,\\n tickMultiline: config.axis_x_tick_multiline,\\n tickWidth: config.axis_x_tick_width,\\n tickTextRotate: withoutRotateTickText ? 0 : config.axis_x_tick_rotate,\\n withoutTransition: withoutTransition\\n },\\n axis = c3_axis($$.d3, axisParams)\\n .scale(scale)\\n .orient(orient);\\n\\n if ($$.isTimeSeries() && tickValues && typeof tickValues !== 'function') {\\n tickValues = tickValues.map(function(v) {\\n return $$.parseDate(v);\\n });\\n }\\n\\n // Set tick\\n axis.tickFormat(tickFormat).tickValues(tickValues);\\n if ($$.isCategorized()) {\\n axis.tickCentered(config.axis_x_tick_centered);\\n if (isEmpty(config.axis_x_tick_culling)) {\\n config.axis_x_tick_culling = false;\\n }\\n }\\n\\n return axis;\\n };\\n Axis.prototype.updateXAxisTickValues = function updateXAxisTickValues(targets, axis) {\\n var $$ = this.owner,\\n config = $$.config,\\n tickValues;\\n if (config.axis_x_tick_fit || config.axis_x_tick_count) {\\n tickValues = this.generateTickValues(\\n $$.mapTargetsToUniqueXs(targets),\\n config.axis_x_tick_count,\\n $$.isTimeSeries()\\n );\\n }\\n if (axis) {\\n axis.tickValues(tickValues);\\n } else {\\n $$.xAxis.tickValues(tickValues);\\n $$.subXAxis.tickValues(tickValues);\\n }\\n return tickValues;\\n };\\n Axis.prototype.getYAxis = function getYAxis(\\n scale,\\n orient,\\n tickFormat,\\n tickValues,\\n withOuterTick,\\n withoutTransition,\\n withoutRotateTickText\\n ) {\\n var $$ = this.owner,\\n config = $$.config,\\n axisParams = {\\n withOuterTick: withOuterTick,\\n withoutTransition: withoutTransition,\\n tickTextRotate: withoutRotateTickText ? 0 : config.axis_y_tick_rotate\\n },\\n axis = c3_axis($$.d3, axisParams)\\n .scale(scale)\\n .orient(orient)\\n .tickFormat(tickFormat);\\n if ($$.isTimeSeriesY()) {\\n axis.ticks($$.d3.time[config.axis_y_tick_time_value], config.axis_y_tick_time_interval);\\n } else {\\n axis.tickValues(tickValues);\\n }\\n return axis;\\n };\\n Axis.prototype.getId = function getId(id) {\\n var config = this.owner.config;\\n return id in config.data_axes ? config.data_axes[id] : 'y';\\n };\\n Axis.prototype.getXAxisTickFormat = function getXAxisTickFormat() {\\n var $$ = this.owner,\\n config = $$.config,\\n format = $$.isTimeSeries()\\n ? $$.defaultAxisTimeFormat\\n : $$.isCategorized()\\n ? $$.categoryName\\n : function(v) {\\n return v < 0 ? v.toFixed(1) : v; // Prolaera - toFixed\\n };\\n if (config.axis_x_tick_format) {\\n if (isFunction(config.axis_x_tick_format)) {\\n format = config.axis_x_tick_format;\\n } else if ($$.isTimeSeries()) {\\n format = function(date) {\\n return date ? $$.axisTimeFormat(config.axis_x_tick_format)(date) : '';\\n };\\n }\\n }\\n return isFunction(format)\\n ? function(v) {\\n return format.call($$, v);\\n }\\n : format;\\n };\\n Axis.prototype.getTickValues = function getTickValues(tickValues, axis) {\\n return tickValues ? tickValues : axis ? axis.tickValues() : undefined;\\n };\\n Axis.prototype.getXAxisTickValues = function getXAxisTickValues() {\\n return this.getTickValues(this.owner.config.axis_x_tick_values, this.owner.xAxis);\\n };\\n Axis.prototype.getYAxisTickValues = function getYAxisTickValues() {\\n return this.getTickValues(this.owner.config.axis_y_tick_values, this.owner.yAxis);\\n };\\n Axis.prototype.getY2AxisTickValues = function getY2AxisTickValues() {\\n return this.getTickValues(this.owner.config.axis_y2_tick_values, this.owner.y2Axis);\\n };\\n Axis.prototype.getLabelOptionByAxisId = function getLabelOptionByAxisId(axisId) {\\n var $$ = this.owner,\\n config = $$.config,\\n option;\\n if (axisId === 'y') {\\n option = config.axis_y_label;\\n } else if (axisId === 'y2') {\\n option = config.axis_y2_label;\\n } else if (axisId === 'x') {\\n option = config.axis_x_label;\\n }\\n return option;\\n };\\n Axis.prototype.getLabelText = function getLabelText(axisId) {\\n var option = this.getLabelOptionByAxisId(axisId);\\n return isString(option) ? option : option ? option.text : null;\\n };\\n Axis.prototype.setLabelText = function setLabelText(axisId, text) {\\n var $$ = this.owner,\\n config = $$.config,\\n option = this.getLabelOptionByAxisId(axisId);\\n if (isString(option)) {\\n if (axisId === 'y') {\\n config.axis_y_label = text;\\n } else if (axisId === 'y2') {\\n config.axis_y2_label = text;\\n } else if (axisId === 'x') {\\n config.axis_x_label = text;\\n }\\n } else if (option) {\\n option.text = text;\\n }\\n };\\n Axis.prototype.getLabelPosition = function getLabelPosition(axisId, defaultPosition) {\\n var option = this.getLabelOptionByAxisId(axisId),\\n position = option && typeof option === 'object' && option.position ? option.position : defaultPosition;\\n return {\\n isInner: position.indexOf('inner') >= 0,\\n isOuter: position.indexOf('outer') >= 0,\\n isLeft: position.indexOf('left') >= 0,\\n isCenter: position.indexOf('center') >= 0,\\n isRight: position.indexOf('right') >= 0,\\n isTop: position.indexOf('top') >= 0,\\n isMiddle: position.indexOf('middle') >= 0,\\n isBottom: position.indexOf('bottom') >= 0\\n };\\n };\\n Axis.prototype.getXAxisLabelPosition = function getXAxisLabelPosition() {\\n return this.getLabelPosition('x', this.owner.config.axis_rotated ? 'inner-top' : 'inner-right');\\n };\\n Axis.prototype.getYAxisLabelPosition = function getYAxisLabelPosition() {\\n return this.getLabelPosition('y', this.owner.config.axis_rotated ? 'inner-right' : 'inner-top');\\n };\\n Axis.prototype.getY2AxisLabelPosition = function getY2AxisLabelPosition() {\\n return this.getLabelPosition('y2', this.owner.config.axis_rotated ? 'inner-right' : 'inner-top');\\n };\\n Axis.prototype.getLabelPositionById = function getLabelPositionById(id) {\\n return id === 'y2'\\n ? this.getY2AxisLabelPosition()\\n : id === 'y'\\n ? this.getYAxisLabelPosition()\\n : this.getXAxisLabelPosition();\\n };\\n Axis.prototype.textForXAxisLabel = function textForXAxisLabel() {\\n return this.getLabelText('x');\\n };\\n Axis.prototype.textForYAxisLabel = function textForYAxisLabel() {\\n return this.getLabelText('y');\\n };\\n Axis.prototype.textForY2AxisLabel = function textForY2AxisLabel() {\\n return this.getLabelText('y2');\\n };\\n Axis.prototype.xForAxisLabel = function xForAxisLabel(forHorizontal, position) {\\n var $$ = this.owner;\\n if (forHorizontal) {\\n return position.isLeft ? 0 : position.isCenter ? $$.width / 2 : $$.width;\\n } else {\\n return position.isBottom ? -$$.height : position.isMiddle ? -$$.height / 2 : 0;\\n }\\n };\\n Axis.prototype.dxForAxisLabel = function dxForAxisLabel(forHorizontal, position) {\\n if (forHorizontal) {\\n return position.isLeft ? '0.5em' : position.isRight ? '-0.5em' : '0';\\n } else {\\n return position.isTop ? '-0.5em' : position.isBottom ? '0.5em' : '0';\\n }\\n };\\n Axis.prototype.textAnchorForAxisLabel = function textAnchorForAxisLabel(forHorizontal, position) {\\n if (forHorizontal) {\\n return position.isLeft ? 'start' : position.isCenter ? 'middle' : 'end';\\n } else {\\n return position.isBottom ? 'start' : position.isMiddle ? 'middle' : 'end';\\n }\\n };\\n Axis.prototype.xForXAxisLabel = function xForXAxisLabel() {\\n return this.xForAxisLabel(!this.owner.config.axis_rotated, this.getXAxisLabelPosition());\\n };\\n Axis.prototype.xForYAxisLabel = function xForYAxisLabel() {\\n return this.xForAxisLabel(this.owner.config.axis_rotated, this.getYAxisLabelPosition());\\n };\\n Axis.prototype.xForY2AxisLabel = function xForY2AxisLabel() {\\n return this.xForAxisLabel(this.owner.config.axis_rotated, this.getY2AxisLabelPosition());\\n };\\n Axis.prototype.dxForXAxisLabel = function dxForXAxisLabel() {\\n return this.dxForAxisLabel(!this.owner.config.axis_rotated, this.getXAxisLabelPosition());\\n };\\n Axis.prototype.dxForYAxisLabel = function dxForYAxisLabel() {\\n return this.dxForAxisLabel(this.owner.config.axis_rotated, this.getYAxisLabelPosition());\\n };\\n Axis.prototype.dxForY2AxisLabel = function dxForY2AxisLabel() {\\n return this.dxForAxisLabel(this.owner.config.axis_rotated, this.getY2AxisLabelPosition());\\n };\\n Axis.prototype.dyForXAxisLabel = function dyForXAxisLabel() {\\n var $$ = this.owner,\\n config = $$.config,\\n position = this.getXAxisLabelPosition();\\n if (config.axis_rotated) {\\n return position.isInner ? '1.2em' : -25 - this.getMaxTickWidth('x');\\n } else {\\n return position.isInner ? '-0.5em' : config.axis_x_height ? config.axis_x_height - 10 : '3em';\\n }\\n };\\n Axis.prototype.dyForYAxisLabel = function dyForYAxisLabel() {\\n var $$ = this.owner,\\n position = this.getYAxisLabelPosition();\\n if ($$.config.axis_rotated) {\\n return position.isInner ? '-0.5em' : '3em';\\n } else {\\n return position.isInner ? '1.2em' : -10 - ($$.config.axis_y_inner ? 0 : this.getMaxTickWidth('y') + 10);\\n }\\n };\\n Axis.prototype.dyForY2AxisLabel = function dyForY2AxisLabel() {\\n var $$ = this.owner,\\n position = this.getY2AxisLabelPosition();\\n if ($$.config.axis_rotated) {\\n return position.isInner ? '1.2em' : '-2.2em';\\n } else {\\n return position.isInner ? '-0.5em' : 15 + ($$.config.axis_y2_inner ? 0 : this.getMaxTickWidth('y2') + 15);\\n }\\n };\\n Axis.prototype.textAnchorForXAxisLabel = function textAnchorForXAxisLabel() {\\n var $$ = this.owner;\\n return this.textAnchorForAxisLabel(!$$.config.axis_rotated, this.getXAxisLabelPosition());\\n };\\n Axis.prototype.textAnchorForYAxisLabel = function textAnchorForYAxisLabel() {\\n var $$ = this.owner;\\n return this.textAnchorForAxisLabel($$.config.axis_rotated, this.getYAxisLabelPosition());\\n };\\n Axis.prototype.textAnchorForY2AxisLabel = function textAnchorForY2AxisLabel() {\\n var $$ = this.owner;\\n return this.textAnchorForAxisLabel($$.config.axis_rotated, this.getY2AxisLabelPosition());\\n };\\n Axis.prototype.getMaxTickWidth = function getMaxTickWidth(id, withoutRecompute) {\\n var $$ = this.owner,\\n config = $$.config,\\n maxWidth = 0,\\n targetsToShow,\\n scale,\\n axis,\\n dummy,\\n svg;\\n if (withoutRecompute && $$.currentMaxTickWidths[id]) {\\n return $$.currentMaxTickWidths[id];\\n }\\n if ($$.svg) {\\n targetsToShow = $$.filterTargetsToShow($$.data.targets);\\n if (id === 'y') {\\n scale = $$.y.copy().domain($$.getYDomain(targetsToShow, 'y'));\\n axis = this.getYAxis(scale, $$.yOrient, config.axis_y_tick_format, $$.yAxisTickValues, false, true, true);\\n } else if (id === 'y2') {\\n scale = $$.y2.copy().domain($$.getYDomain(targetsToShow, 'y2'));\\n axis = this.getYAxis(scale, $$.y2Orient, config.axis_y2_tick_format, $$.y2AxisTickValues, false, true, true);\\n } else {\\n scale = $$.x.copy().domain($$.getXDomain(targetsToShow));\\n axis = this.getXAxis(scale, $$.xOrient, $$.xAxisTickFormat, $$.xAxisTickValues, false, true, true);\\n this.updateXAxisTickValues(targetsToShow, axis);\\n }\\n dummy = $$.d3\\n .select('body')\\n .append('div')\\n .classed('c3', true);\\n (svg = dummy\\n .append('svg')\\n .style('visibility', 'hidden')\\n .style('position', 'fixed')\\n .style('top', 0)\\n .style('left', 0)),\\n svg\\n .append('g')\\n .call(axis)\\n .each(function() {\\n $$.d3\\n .select(this)\\n .selectAll('text')\\n .each(function() {\\n var box = this.getBoundingClientRect();\\n if (maxWidth < box.width) {\\n maxWidth = box.width;\\n }\\n });\\n dummy.remove();\\n });\\n }\\n $$.currentMaxTickWidths[id] = maxWidth <= 0 ? $$.currentMaxTickWidths[id] : maxWidth;\\n return $$.currentMaxTickWidths[id];\\n };\\n\\n Axis.prototype.updateLabels = function updateLabels(withTransition) {\\n var $$ = this.owner;\\n var axisXLabel = $$.main.select('.' + CLASS.axisX + ' .' + CLASS.axisXLabel),\\n axisYLabel = $$.main.select('.' + CLASS.axisY + ' .' + CLASS.axisYLabel),\\n axisY2Label = $$.main.select('.' + CLASS.axisY2 + ' .' + CLASS.axisY2Label);\\n (withTransition ? axisXLabel.transition() : axisXLabel)\\n .attr('x', this.xForXAxisLabel.bind(this))\\n .attr('dx', this.dxForXAxisLabel.bind(this))\\n .attr('dy', this.dyForXAxisLabel.bind(this))\\n .text(this.textForXAxisLabel.bind(this));\\n (withTransition ? axisYLabel.transition() : axisYLabel)\\n .attr('x', this.xForYAxisLabel.bind(this))\\n .attr('dx', this.dxForYAxisLabel.bind(this))\\n .attr('dy', this.dyForYAxisLabel.bind(this))\\n .text(this.textForYAxisLabel.bind(this));\\n (withTransition ? axisY2Label.transition() : axisY2Label)\\n .attr('x', this.xForY2AxisLabel.bind(this))\\n .attr('dx', this.dxForY2AxisLabel.bind(this))\\n .attr('dy', this.dyForY2AxisLabel.bind(this))\\n .text(this.textForY2AxisLabel.bind(this));\\n };\\n Axis.prototype.getPadding = function getPadding(padding, key, defaultValue, domainLength) {\\n var p = typeof padding === 'number' ? padding : padding[key];\\n if (!isValue(p)) {\\n return defaultValue;\\n }\\n if (padding.unit === 'ratio') {\\n return padding[key] * domainLength;\\n }\\n // assume padding is pixels if unit is not specified\\n return this.convertPixelsToAxisPadding(p, domainLength);\\n };\\n Axis.prototype.convertPixelsToAxisPadding = function convertPixelsToAxisPadding(pixels, domainLength) {\\n var $$ = this.owner,\\n length = $$.config.axis_rotated ? $$.width : $$.height;\\n return domainLength * (pixels / length);\\n };\\n Axis.prototype.generateTickValues = function generateTickValues(values, tickCount, forTimeSeries) {\\n var tickValues = values,\\n targetCount,\\n start,\\n end,\\n count,\\n interval,\\n i,\\n tickValue;\\n if (tickCount) {\\n targetCount = isFunction(tickCount) ? tickCount() : tickCount;\\n // compute ticks according to tickCount\\n if (targetCount === 1) {\\n tickValues = [values[0]];\\n } else if (targetCount === 2) {\\n tickValues = [values[0], values[values.length - 1]];\\n } else if (targetCount > 2) {\\n count = targetCount - 2;\\n start = values[0];\\n end = values[values.length - 1];\\n interval = (end - start) / (count + 1);\\n // re-construct unique values\\n tickValues = [start];\\n for (i = 0; i < count; i++) {\\n tickValue = +start + interval * (i + 1);\\n tickValues.push(forTimeSeries ? new Date(tickValue) : tickValue);\\n }\\n tickValues.push(end);\\n }\\n }\\n if (!forTimeSeries) {\\n tickValues = tickValues.sort(function(a, b) {\\n return a - b;\\n });\\n }\\n return tickValues;\\n };\\n Axis.prototype.generateTransitions = function generateTransitions(duration) {\\n var $$ = this.owner,\\n axes = $$.axes;\\n return {\\n axisX: duration ? axes.x.transition().duration(duration) : axes.x,\\n axisY: duration ? axes.y.transition().duration(duration) : axes.y,\\n axisY2: duration ? axes.y2.transition().duration(duration) : axes.y2,\\n axisSubX: duration ? axes.subx.transition().duration(duration) : axes.subx\\n };\\n };\\n Axis.prototype.redraw = function redraw(transitions, isHidden) {\\n var $$ = this.owner;\\n $$.axes.x.style('opacity', isHidden ? 0 : 1);\\n $$.axes.y.style('opacity', isHidden ? 0 : 1);\\n $$.axes.y2.style('opacity', isHidden ? 0 : 1);\\n $$.axes.subx.style('opacity', isHidden ? 0 : 1);\\n transitions.axisX.call($$.xAxis);\\n transitions.axisY.call($$.yAxis);\\n transitions.axisY2.call($$.y2Axis);\\n transitions.axisSubX.call($$.subXAxis);\\n };\\n\\n c3_chart_internal_fn.getClipPath = function(id) {\\n var isIE9 = window.navigator.appVersion.toLowerCase().indexOf('msie 9.') >= 0;\\n return 'url(' + (isIE9 ? '' : document.URL.split('#')[0]) + '#' + id + ')';\\n };\\n c3_chart_internal_fn.appendClip = function(parent, id) {\\n return parent\\n .append('clipPath')\\n .attr('id', id)\\n .append('rect');\\n };\\n c3_chart_internal_fn.getAxisClipX = function(forHorizontal) {\\n // axis line width + padding for left\\n var left = Math.max(30, this.margin.left);\\n return forHorizontal ? -(1 + left) : -(left - 1);\\n };\\n c3_chart_internal_fn.getAxisClipY = function(forHorizontal) {\\n return forHorizontal ? -20 : -this.margin.top;\\n };\\n c3_chart_internal_fn.getXAxisClipX = function() {\\n var $$ = this;\\n return $$.getAxisClipX(!$$.config.axis_rotated);\\n };\\n c3_chart_internal_fn.getXAxisClipY = function() {\\n var $$ = this;\\n return $$.getAxisClipY(!$$.config.axis_rotated);\\n };\\n c3_chart_internal_fn.getYAxisClipX = function() {\\n var $$ = this;\\n return $$.config.axis_y_inner ? -1 : $$.getAxisClipX($$.config.axis_rotated);\\n };\\n c3_chart_internal_fn.getYAxisClipY = function() {\\n var $$ = this;\\n return $$.getAxisClipY($$.config.axis_rotated);\\n };\\n c3_chart_internal_fn.getAxisClipWidth = function(forHorizontal) {\\n var $$ = this,\\n left = Math.max(30, $$.margin.left),\\n right = Math.max(30, $$.margin.right);\\n // width + axis line width + padding for left/right\\n return forHorizontal ? $$.width + 2 + left + right : $$.margin.left + 20;\\n };\\n c3_chart_internal_fn.getAxisClipHeight = function(forHorizontal) {\\n // less than 20 is not enough to show the axis label 'outer' without legend\\n return (forHorizontal ? this.margin.bottom : this.margin.top + this.height) + 20;\\n };\\n c3_chart_internal_fn.getXAxisClipWidth = function() {\\n var $$ = this;\\n return $$.getAxisClipWidth(!$$.config.axis_rotated);\\n };\\n c3_chart_internal_fn.getXAxisClipHeight = function() {\\n var $$ = this;\\n return $$.getAxisClipHeight(!$$.config.axis_rotated);\\n };\\n c3_chart_internal_fn.getYAxisClipWidth = function() {\\n var $$ = this;\\n return $$.getAxisClipWidth($$.config.axis_rotated) + ($$.config.axis_y_inner ? 20 : 0);\\n };\\n c3_chart_internal_fn.getYAxisClipHeight = function() {\\n var $$ = this;\\n return $$.getAxisClipHeight($$.config.axis_rotated);\\n };\\n\\n c3_chart_internal_fn.initPie = function() {\\n var $$ = this,\\n d3 = $$.d3,\\n config = $$.config;\\n $$.pie = d3.layout.pie().value(function(d) {\\n return d.values.reduce(function(a, b) {\\n return a + b.value;\\n }, 0);\\n });\\n if (!config.data_order) {\\n $$.pie.sort(null);\\n }\\n };\\n\\n c3_chart_internal_fn.updateRadius = function() {\\n var $$ = this,\\n config = $$.config,\\n w = config.gauge_width || config.donut_width;\\n $$.radiusExpanded = Math.min($$.arcWidth, $$.arcHeight) / 2;\\n $$.radius = $$.radiusExpanded * 0.95;\\n $$.innerRadiusRatio = w ? ($$.radius - w) / $$.radius : 0.6;\\n $$.innerRadius = $$.hasType('donut') || $$.hasType('gauge') ? $$.radius * $$.innerRadiusRatio : 0;\\n };\\n\\n c3_chart_internal_fn.updateArc = function() {\\n var $$ = this;\\n $$.svgArc = $$.getSvgArc();\\n $$.svgArcExpanded = $$.getSvgArcExpanded();\\n $$.svgArcExpandedSub = $$.getSvgArcExpanded(0.98);\\n };\\n\\n c3_chart_internal_fn.updateAngle = function(d) {\\n var $$ = this,\\n config = $$.config,\\n found = false,\\n index = 0,\\n gMin,\\n gMax,\\n gTic,\\n gValue;\\n\\n if (!config) {\\n return null;\\n }\\n\\n $$.pie($$.filterTargetsToShow($$.data.targets)).forEach(function(t) {\\n if (!found && t.data.id === d.data.id) {\\n found = true;\\n d = t;\\n d.index = index;\\n }\\n index++;\\n });\\n if (isNaN(d.startAngle)) {\\n d.startAngle = 0;\\n }\\n if (isNaN(d.endAngle)) {\\n d.endAngle = d.startAngle;\\n }\\n if ($$.isGaugeType(d.data)) {\\n gMin = config.gauge_min;\\n gMax = config.gauge_max;\\n\\n gTic = (Math.PI * (config.gauge_fullCircle ? 2 : 1)) / (gMax - gMin);\\n gValue = d.value < gMin ? 0 : d.value < gMax ? d.value - gMin : gMax - gMin;\\n\\n //attach mina nd max to d nodes.\\n d.min = gMin;\\n d.max = gMax;\\n\\n d.startAngle = config.gauge_startingAngle;\\n\\n // MESSAGE --- PROLAERA --make 0/0 guages look full\\n if (gTic == 'Infinity') {\\n d.endAngle = d.startAngle + 0.39269908169872414 * 8;\\n } else {\\n d.endAngle = d.startAngle + gTic * gValue;\\n }\\n }\\n return found ? d : null;\\n };\\n\\n c3_chart_internal_fn.getSvgArc = function() {\\n var $$ = this,\\n arc = $$.d3.svg\\n .arc()\\n .outerRadius($$.radius)\\n .innerRadius($$.innerRadius),\\n newArc = function(d, withoutUpdate) {\\n var updated;\\n if (withoutUpdate) {\\n return arc(d);\\n } // for interpolate\\n updated = $$.updateAngle(d);\\n return updated ? arc(updated) : 'M 0 0';\\n };\\n // TODO: extends all function\\n newArc.centroid = arc.centroid;\\n return newArc;\\n };\\n\\n c3_chart_internal_fn.getSvgArcExpanded = function(rate) {\\n var $$ = this,\\n arc = $$.d3.svg\\n .arc()\\n .outerRadius($$.radiusExpanded * (rate ? rate : 1))\\n .innerRadius($$.innerRadius);\\n return function(d) {\\n var updated = $$.updateAngle(d);\\n return updated ? arc(updated) : 'M 0 0';\\n };\\n };\\n\\n c3_chart_internal_fn.getArc = function(d, withoutUpdate, force) {\\n return force || this.isArcType(d.data) ? this.svgArc(d, withoutUpdate) : 'M 0 0';\\n };\\n\\n c3_chart_internal_fn.transformForArcLabel = function(d) {\\n var $$ = this,\\n config = $$.config,\\n updated = $$.updateAngle(d),\\n c,\\n x,\\n y,\\n h,\\n ratio,\\n translate = '';\\n if (updated && !$$.hasType('gauge')) {\\n c = this.svgArc.centroid(updated);\\n x = isNaN(c[0]) ? 0 : c[0];\\n y = isNaN(c[1]) ? 0 : c[1];\\n h = Math.sqrt(x * x + y * y);\\n if ($$.hasType('donut') && config.donut_label_ratio) {\\n ratio = isFunction(config.donut_label_ratio)\\n ? config.donut_label_ratio(d, $$.radius, h)\\n : config.donut_label_ratio;\\n } else if ($$.hasType('pie') && config.pie_label_ratio) {\\n ratio = isFunction(config.pie_label_ratio) ? config.pie_label_ratio(d, $$.radius, h) : config.pie_label_ratio;\\n } else {\\n ratio = $$.radius && h ? ((36 / $$.radius > 0.375 ? 1.175 - 36 / $$.radius : 0.8) * $$.radius) / h : 0;\\n }\\n translate = 'translate(' + x * ratio + ',' + y * ratio + ')';\\n }\\n return translate;\\n };\\n\\n c3_chart_internal_fn.getArcRatio = function(d) {\\n var $$ = this,\\n config = $$.config,\\n whole = Math.PI * ($$.hasType('gauge') && !config.gauge_fullCircle ? 1 : 2);\\n return d ? (d.endAngle - d.startAngle) / whole : null;\\n };\\n\\n c3_chart_internal_fn.convertToArcData = function(d) {\\n return this.addName({\\n id: d.data.id,\\n value: d.value,\\n ratio: this.getArcRatio(d),\\n index: d.index\\n });\\n };\\n\\n c3_chart_internal_fn.textForArcLabel = function(d) {\\n var $$ = this,\\n updated,\\n value,\\n ratio,\\n id,\\n format;\\n if (!$$.shouldShowArcLabel()) {\\n return '';\\n }\\n updated = $$.updateAngle(d);\\n value = updated ? updated.value : null;\\n\\n ratio = updated.max - d.value;\\n if (ratio < 0) ratio = 0;\\n\\n id = d.data.id;\\n if (!$$.hasType('gauge') && !$$.meetsArcLabelThreshold(ratio)) {\\n return '';\\n }\\n format = $$.getArcLabelFormat();\\n return format ? format(value, ratio, id) : $$.defaultArcValueFormat(value, ratio);\\n };\\n\\n c3_chart_internal_fn.expandArc = function(targetIds) {\\n var $$ = this,\\n interval;\\n\\n // MEMO: avoid to cancel transition\\n if ($$.transiting) {\\n interval = window.setInterval(function() {\\n if (!$$.transiting) {\\n window.clearInterval(interval);\\n if ($$.legend.selectAll('.c3-legend-item-focused').size() > 0) {\\n $$.expandArc(targetIds);\\n }\\n }\\n }, 10);\\n return;\\n }\\n\\n targetIds = $$.mapToTargetIds(targetIds);\\n\\n $$.svg.selectAll($$.selectorTargets(targetIds, '.' + CLASS.chartArc)).each(function(d) {\\n if (!$$.shouldExpand(d.data.id)) {\\n return;\\n }\\n $$.d3\\n .select(this)\\n .selectAll('path')\\n .transition()\\n .duration($$.expandDuration(d.data.id))\\n .attr('d', $$.svgArcExpanded)\\n .transition()\\n .duration($$.expandDuration(d.data.id) * 2)\\n .attr('d', $$.svgArcExpandedSub)\\n .each(function(d) {\\n if ($$.isDonutType(d.data)) {\\n // callback here\\n }\\n });\\n });\\n };\\n\\n c3_chart_internal_fn.unexpandArc = function(targetIds) {\\n var $$ = this;\\n\\n if ($$.transiting) {\\n return;\\n }\\n\\n targetIds = $$.mapToTargetIds(targetIds);\\n\\n $$.svg\\n .selectAll($$.selectorTargets(targetIds, '.' + CLASS.chartArc))\\n .selectAll('path')\\n .transition()\\n .duration(function(d) {\\n return $$.expandDuration(d.data.id);\\n })\\n .attr('d', $$.svgArc);\\n $$.svg.selectAll('.' + CLASS.arc).style('opacity', 1);\\n };\\n\\n c3_chart_internal_fn.expandDuration = function(id) {\\n var $$ = this,\\n config = $$.config;\\n\\n if ($$.isDonutType(id)) {\\n return config.donut_expand_duration;\\n } else if ($$.isGaugeType(id)) {\\n return config.gauge_expand_duration;\\n } else if ($$.isPieType(id)) {\\n return config.pie_expand_duration;\\n } else {\\n return 50;\\n }\\n };\\n\\n c3_chart_internal_fn.shouldExpand = function(id) {\\n var $$ = this,\\n config = $$.config;\\n return (\\n ($$.isDonutType(id) && config.donut_expand) ||\\n ($$.isGaugeType(id) && config.gauge_expand) ||\\n ($$.isPieType(id) && config.pie_expand)\\n );\\n };\\n\\n c3_chart_internal_fn.shouldShowArcLabel = function() {\\n var $$ = this,\\n config = $$.config,\\n shouldShow = true;\\n if ($$.hasType('donut')) {\\n shouldShow = config.donut_label_show;\\n } else if ($$.hasType('pie')) {\\n shouldShow = config.pie_label_show;\\n }\\n // when gauge, always true\\n return shouldShow;\\n };\\n\\n c3_chart_internal_fn.meetsArcLabelThreshold = function(ratio) {\\n var $$ = this,\\n config = $$.config,\\n threshold = $$.hasType('donut') ? config.donut_label_threshold : config.pie_label_threshold;\\n return ratio >= threshold;\\n };\\n\\n c3_chart_internal_fn.getArcLabelFormat = function() {\\n var $$ = this,\\n config = $$.config,\\n format = config.pie_label_format;\\n if ($$.hasType('gauge')) {\\n format = config.gauge_label_format;\\n } else if ($$.hasType('donut')) {\\n format = config.donut_label_format;\\n }\\n return format;\\n };\\n\\n c3_chart_internal_fn.getArcTitle = function() {\\n var $$ = this;\\n return $$.hasType('donut') ? $$.config.donut_title : '';\\n };\\n\\n c3_chart_internal_fn.updateTargetsForArc = function(targets) {\\n var $$ = this,\\n main = $$.main,\\n mainPieUpdate,\\n mainPieEnter,\\n classChartArc = $$.classChartArc.bind($$),\\n classArcs = $$.classArcs.bind($$),\\n classFocus = $$.classFocus.bind($$);\\n mainPieUpdate = main\\n .select('.' + CLASS.chartArcs)\\n .selectAll('.' + CLASS.chartArc)\\n .data($$.pie(targets))\\n .attr('class', function(d) {\\n return classChartArc(d) + classFocus(d.data);\\n });\\n mainPieEnter = mainPieUpdate\\n .enter()\\n .append('g')\\n .attr('class', classChartArc);\\n mainPieEnter.append('g').attr('class', classArcs);\\n mainPieEnter\\n .append('text')\\n // .attr('dy', $$.hasType('gauge') ? '-.1em' : '.35em') Prolaera - Switched\\n .attr('dy', $$.hasType('gauge') ? '-1em' : '.35em')\\n .style('opacity', 0)\\n .style('text-anchor', 'middle')\\n .style('pointer-events', 'none');\\n // MEMO: can not keep same color..., but not bad to update color in redraw\\n //mainPieUpdate.exit().remove();\\n };\\n\\n c3_chart_internal_fn.initArc = function() {\\n var $$ = this;\\n $$.arcs = $$.main\\n .select('.' + CLASS.chart)\\n .append('g')\\n .attr('class', CLASS.chartArcs)\\n .attr('transform', $$.getTranslate('arc'));\\n $$.arcs\\n .append('text')\\n .attr('class', CLASS.chartArcsTitle)\\n .style('text-anchor', 'middle')\\n .text($$.getArcTitle());\\n };\\n\\n c3_chart_internal_fn.redrawArc = function(duration, durationForExit, withTransform) {\\n var $$ = this,\\n d3 = $$.d3,\\n config = $$.config,\\n main = $$.main,\\n mainArc;\\n mainArc = main\\n .selectAll('.' + CLASS.arcs)\\n .selectAll('.' + CLASS.arc)\\n .data($$.arcData.bind($$));\\n mainArc\\n .enter()\\n .append('path')\\n .attr('class', $$.classArc.bind($$))\\n .style('fill', function(d) {\\n return $$.color(d.data);\\n })\\n .style('cursor', function(d) {\\n return config.interaction_enabled && config.data_selection_isselectable(d) ? 'pointer' : null;\\n })\\n .style('opacity', 0)\\n .each(function(d) {\\n if ($$.isGaugeType(d.data)) {\\n d.startAngle = d.endAngle = config.gauge_startingAngle;\\n }\\n this._current = d;\\n });\\n mainArc\\n .attr('transform', function(d) {\\n return !$$.isGaugeType(d.data) && withTransform ? 'scale(0)' : '';\\n })\\n .style('opacity', function(d) {\\n return d === this._current ? 0 : 1;\\n })\\n .on(\\n 'mouseover',\\n config.interaction_enabled\\n ? function(d) {\\n var updated, arcData;\\n if ($$.transiting) {\\n // skip while transiting\\n return;\\n }\\n updated = $$.updateAngle(d);\\n if (updated) {\\n arcData = $$.convertToArcData(updated);\\n // transitions\\n $$.expandArc(updated.data.id);\\n $$.api.focus(updated.data.id);\\n $$.toggleFocusLegend(updated.data.id, true);\\n $$.config.data_onmouseover(arcData, this);\\n }\\n }\\n : null\\n )\\n .on(\\n 'mousemove',\\n config.interaction_enabled\\n ? function(d) {\\n var updated = $$.updateAngle(d),\\n arcData,\\n selectedData;\\n if (updated) {\\n (arcData = $$.convertToArcData(updated)), (selectedData = [arcData]);\\n $$.showTooltip(selectedData, this);\\n }\\n }\\n : null\\n )\\n .on(\\n 'mouseout',\\n config.interaction_enabled\\n ? function(d) {\\n var updated, arcData;\\n if ($$.transiting) {\\n // skip while transiting\\n return;\\n }\\n updated = $$.updateAngle(d);\\n if (updated) {\\n arcData = $$.convertToArcData(updated);\\n // transitions\\n $$.unexpandArc(updated.data.id);\\n $$.api.revert();\\n $$.revertLegend();\\n $$.hideTooltip();\\n $$.config.data_onmouseout(arcData, this);\\n }\\n }\\n : null\\n )\\n .on(\\n 'click',\\n config.interaction_enabled\\n ? function(d, i) {\\n var updated = $$.updateAngle(d),\\n arcData;\\n if (updated) {\\n arcData = $$.convertToArcData(updated);\\n if ($$.toggleShape) {\\n $$.toggleShape(this, arcData, i);\\n }\\n $$.config.data_onclick.call($$.api, arcData, this);\\n }\\n }\\n : null\\n )\\n .each(function() {\\n $$.transiting = true;\\n })\\n .transition()\\n .duration(duration)\\n .attrTween('d', function(d) {\\n var updated = $$.updateAngle(d),\\n interpolate;\\n if (!updated) {\\n return function() {\\n return 'M 0 0';\\n };\\n }\\n // if (this._current === d) {\\n // this._current = {\\n // startAngle: Math.PI*2,\\n // endAngle: Math.PI*2,\\n // };\\n // }\\n if (isNaN(this._current.startAngle)) {\\n this._current.startAngle = 0;\\n }\\n if (isNaN(this._current.endAngle)) {\\n this._current.endAngle = this._current.startAngle;\\n }\\n interpolate = d3.interpolate(this._current, updated);\\n this._current = interpolate(0);\\n return function(t) {\\n var interpolated = interpolate(t);\\n interpolated.data = d.data; // data.id will be updated by interporator\\n return $$.getArc(interpolated, true);\\n };\\n })\\n .attr('transform', withTransform ? 'scale(1)' : '')\\n .style('fill', function(d) {\\n return $$.levelColor ? $$.levelColor(d.data.values[0].value) : $$.color(d.data.id);\\n }) // Where gauge reading color would receive customization.\\n .style('opacity', 1)\\n .call($$.endall, function() {\\n $$.transiting = false;\\n });\\n mainArc\\n .exit()\\n .transition()\\n .duration(durationForExit)\\n .style('opacity', 0)\\n .remove();\\n main\\n .selectAll('.' + CLASS.chartArc)\\n .select('text')\\n .style('opacity', 0)\\n .attr('class', function(d) {\\n return $$.isGaugeType(d.data) ? CLASS.gaugeValue : '';\\n })\\n .text($$.textForArcLabel.bind($$))\\n .attr('transform', $$.transformForArcLabel.bind($$))\\n .style('font-size', function(d) {\\n return $$.isGaugeType(d.data) ? Math.round($$.radius / 5) + 'px' : '';\\n })\\n .transition()\\n .duration(duration)\\n .style('opacity', function(d) {\\n return $$.isTargetToShow(d.data.id) && $$.isArcType(d.data) ? 1 : 0;\\n });\\n main.select('.' + CLASS.chartArcsTitle).style('opacity', $$.hasType('donut') || $$.hasType('gauge') ? 1 : 0);\\n\\n if ($$.hasType('gauge')) {\\n $$.arcs.select('.' + CLASS.chartArcsBackground).attr('d', function() {\\n var d = {\\n data: [{ value: config.gauge_max }],\\n startAngle: config.gauge_startingAngle,\\n endAngle: -1 * config.gauge_startingAngle\\n };\\n return $$.getArc(d, true, true);\\n });\\n $$.arcs\\n .select('.' + CLASS.chartArcsGaugeUnit)\\n // .attr('dy', '1.2em') Prolaera - Commenting this line out moves the text in the gauge up\\n .text(config.gauge_label_show ? config.gauge_units : '');\\n $$.arcs\\n .select('.' + CLASS.chartArcsGaugeMin)\\n .attr('dx', -1 * ($$.innerRadius + ($$.radius - $$.innerRadius) / (config.gauge_fullCircle ? 1 : 2)) + 'px')\\n .attr('dy', '1.2em')\\n .text(config.gauge_label_show ? config.gauge_min : '');\\n $$.arcs\\n .select('.' + CLASS.chartArcsGaugeMax)\\n .attr('dx', $$.innerRadius + ($$.radius - $$.innerRadius) / (config.gauge_fullCircle ? 1 : 2) + 'px')\\n .attr('dy', '1.2em')\\n .text(config.gauge_label_show ? (config.gauge_max / 100).toFixed(1) : ''); // Prolaera - toFixed\\n }\\n };\\n c3_chart_internal_fn.initGauge = function() {\\n var arcs = this.arcs;\\n if (this.hasType('gauge')) {\\n arcs.append('path').attr('class', CLASS.chartArcsBackground);\\n arcs\\n .append('text')\\n .attr('class', CLASS.chartArcsGaugeUnit)\\n .style('text-anchor', 'middle')\\n .style('pointer-events', 'none');\\n arcs\\n .append('text')\\n .attr('class', CLASS.chartArcsGaugeMin)\\n .style('text-anchor', 'middle')\\n .style('pointer-events', 'none');\\n arcs\\n .append('text')\\n .attr('class', CLASS.chartArcsGaugeMax)\\n .style('text-anchor', 'middle')\\n .style('pointer-events', 'none');\\n }\\n };\\n c3_chart_internal_fn.getGaugeLabelHeight = function() {\\n return this.config.gauge_label_show ? 30 : 0;\\n };\\n\\n c3_chart_internal_fn.initRegion = function() {\\n var $$ = this;\\n $$.region = $$.main\\n .append('g')\\n .attr('clip-path', $$.clipPath)\\n .attr('class', CLASS.regions);\\n };\\n c3_chart_internal_fn.updateRegion = function(duration) {\\n var $$ = this,\\n config = $$.config;\\n\\n // hide if arc type\\n $$.region.style('visibility', $$.hasArcType() ? 'hidden' : 'visible');\\n\\n $$.mainRegion = $$.main\\n .select('.' + CLASS.regions)\\n .selectAll('.' + CLASS.region)\\n .data(config.regions);\\n $$.mainRegion\\n .enter()\\n .append('g')\\n .append('rect')\\n .style('fill-opacity', 0);\\n $$.mainRegion.attr('class', $$.classRegion.bind($$));\\n $$.mainRegion\\n .exit()\\n .transition()\\n .duration(duration)\\n .style('opacity', 0)\\n .remove();\\n };\\n c3_chart_internal_fn.redrawRegion = function(withTransition) {\\n var $$ = this,\\n regions = $$.mainRegion.selectAll('rect').each(function() {\\n // data is binded to g and it's not transferred to rect (child node) automatically,\\n // then data of each rect has to be updated manually.\\n // TODO: there should be more efficient way to solve this?\\n var parentData = $$.d3.select(this.parentNode).datum();\\n $$.d3.select(this).datum(parentData);\\n }),\\n x = $$.regionX.bind($$),\\n y = $$.regionY.bind($$),\\n w = $$.regionWidth.bind($$),\\n h = $$.regionHeight.bind($$);\\n return [\\n (withTransition ? regions.transition() : regions)\\n .attr('x', x)\\n .attr('y', y)\\n .attr('width', w)\\n .attr('height', h)\\n .style('fill-opacity', function(d) {\\n return isValue(d.opacity) ? d.opacity : 0.1;\\n })\\n ];\\n };\\n c3_chart_internal_fn.regionX = function(d) {\\n var $$ = this,\\n config = $$.config,\\n xPos,\\n yScale = d.axis === 'y' ? $$.y : $$.y2;\\n if (d.axis === 'y' || d.axis === 'y2') {\\n xPos = config.axis_rotated ? ('start' in d ? yScale(d.start) : 0) : 0;\\n } else {\\n xPos = config.axis_rotated ? 0 : 'start' in d ? $$.x($$.isTimeSeries() ? $$.parseDate(d.start) : d.start) : 0;\\n }\\n return xPos;\\n };\\n c3_chart_internal_fn.regionY = function(d) {\\n var $$ = this,\\n config = $$.config,\\n yPos,\\n yScale = d.axis === 'y' ? $$.y : $$.y2;\\n if (d.axis === 'y' || d.axis === 'y2') {\\n yPos = config.axis_rotated ? 0 : 'end' in d ? yScale(d.end) : 0;\\n } else {\\n yPos = config.axis_rotated ? ('start' in d ? $$.x($$.isTimeSeries() ? $$.parseDate(d.start) : d.start) : 0) : 0;\\n }\\n return yPos;\\n };\\n c3_chart_internal_fn.regionWidth = function(d) {\\n var $$ = this,\\n config = $$.config,\\n start = $$.regionX(d),\\n end,\\n yScale = d.axis === 'y' ? $$.y : $$.y2;\\n if (d.axis === 'y' || d.axis === 'y2') {\\n end = config.axis_rotated ? ('end' in d ? yScale(d.end) : $$.width) : $$.width;\\n } else {\\n end = config.axis_rotated\\n ? $$.width\\n : 'end' in d\\n ? $$.x($$.isTimeSeries() ? $$.parseDate(d.end) : d.end)\\n : $$.width;\\n }\\n return end < start ? 0 : end - start;\\n };\\n c3_chart_internal_fn.regionHeight = function(d) {\\n var $$ = this,\\n config = $$.config,\\n start = this.regionY(d),\\n end,\\n yScale = d.axis === 'y' ? $$.y : $$.y2;\\n if (d.axis === 'y' || d.axis === 'y2') {\\n end = config.axis_rotated ? $$.height : 'start' in d ? yScale(d.start) : $$.height;\\n } else {\\n end = config.axis_rotated\\n ? 'end' in d\\n ? $$.x($$.isTimeSeries() ? $$.parseDate(d.end) : d.end)\\n : $$.height\\n : $$.height;\\n }\\n return end < start ? 0 : end - start;\\n };\\n c3_chart_internal_fn.isRegionOnX = function(d) {\\n return !d.axis || d.axis === 'x';\\n };\\n\\n c3_chart_internal_fn.drag = function(mouse) {\\n var $$ = this,\\n config = $$.config,\\n main = $$.main,\\n d3 = $$.d3;\\n var sx, sy, mx, my, minX, maxX, minY, maxY;\\n\\n if ($$.hasArcType()) {\\n return;\\n }\\n if (!config.data_selection_enabled) {\\n return;\\n } // do nothing if not selectable\\n if (config.zoom_enabled && !$$.zoom.altDomain) {\\n return;\\n } // skip if zoomable because of conflict drag dehavior\\n if (!config.data_selection_multiple) {\\n return;\\n } // skip when single selection because drag is used for multiple selection\\n\\n sx = $$.dragStart[0];\\n sy = $$.dragStart[1];\\n mx = mouse[0];\\n my = mouse[1];\\n minX = Math.min(sx, mx);\\n maxX = Math.max(sx, mx);\\n minY = config.data_selection_grouped ? $$.margin.top : Math.min(sy, my);\\n maxY = config.data_selection_grouped ? $$.height : Math.max(sy, my);\\n\\n main\\n .select('.' + CLASS.dragarea)\\n .attr('x', minX)\\n .attr('y', minY)\\n .attr('width', maxX - minX)\\n .attr('height', maxY - minY);\\n // TODO: binary search when multiple xs\\n main\\n .selectAll('.' + CLASS.shapes)\\n .selectAll('.' + CLASS.shape)\\n .filter(function(d) {\\n return config.data_selection_isselectable(d);\\n })\\n .each(function(d, i) {\\n var shape = d3.select(this),\\n isSelected = shape.classed(CLASS.SELECTED),\\n isIncluded = shape.classed(CLASS.INCLUDED),\\n _x,\\n _y,\\n _w,\\n _h,\\n toggle,\\n isWithin = false,\\n box;\\n if (shape.classed(CLASS.circle)) {\\n _x = shape.attr('cx') * 1;\\n _y = shape.attr('cy') * 1;\\n toggle = $$.togglePoint;\\n isWithin = minX < _x && _x < maxX && minY < _y && _y < maxY;\\n } else if (shape.classed(CLASS.bar)) {\\n box = getPathBox(this);\\n _x = box.x;\\n _y = box.y;\\n _w = box.width;\\n _h = box.height;\\n toggle = $$.togglePath;\\n isWithin = !(maxX < _x || _x + _w < minX) && !(maxY < _y || _y + _h < minY);\\n } else {\\n // line/area selection not supported yet\\n return;\\n }\\n if (isWithin ^ isIncluded) {\\n shape.classed(CLASS.INCLUDED, !isIncluded);\\n // TODO: included/unincluded callback here\\n shape.classed(CLASS.SELECTED, !isSelected);\\n toggle.call($$, !isSelected, shape, d, i);\\n }\\n });\\n };\\n\\n c3_chart_internal_fn.dragstart = function(mouse) {\\n var $$ = this,\\n config = $$.config;\\n if ($$.hasArcType()) {\\n return;\\n }\\n if (!config.data_selection_enabled) {\\n return;\\n } // do nothing if not selectable\\n $$.dragStart = mouse;\\n $$.main\\n .select('.' + CLASS.chart)\\n .append('rect')\\n .attr('class', CLASS.dragarea)\\n .style('opacity', 0.1);\\n $$.dragging = true;\\n };\\n\\n c3_chart_internal_fn.dragend = function() {\\n var $$ = this,\\n config = $$.config;\\n if ($$.hasArcType()) {\\n return;\\n }\\n if (!config.data_selection_enabled) {\\n return;\\n } // do nothing if not selectable\\n $$.main\\n .select('.' + CLASS.dragarea)\\n .transition()\\n .duration(100)\\n .style('opacity', 0)\\n .remove();\\n $$.main.selectAll('.' + CLASS.shape).classed(CLASS.INCLUDED, false);\\n $$.dragging = false;\\n };\\n\\n c3_chart_internal_fn.selectPoint = function(target, d, i) {\\n var $$ = this,\\n config = $$.config,\\n cx = (config.axis_rotated ? $$.circleY : $$.circleX).bind($$),\\n cy = (config.axis_rotated ? $$.circleX : $$.circleY).bind($$),\\n r = $$.pointSelectR.bind($$);\\n config.data_onselected.call($$.api, d, target.node());\\n // add selected-circle on low layer g\\n $$.main\\n .select('.' + CLASS.selectedCircles + $$.getTargetSelectorSuffix(d.id))\\n .selectAll('.' + CLASS.selectedCircle + '-' + i)\\n .data([d])\\n .enter()\\n .append('circle')\\n .attr('class', function() {\\n return $$.generateClass(CLASS.selectedCircle, i);\\n })\\n .attr('cx', cx)\\n .attr('cy', cy)\\n .attr('stroke', function() {\\n return $$.color(d);\\n })\\n .attr('r', function(d) {\\n return $$.pointSelectR(d) * 1.4;\\n })\\n .transition()\\n .duration(100)\\n .attr('r', r);\\n };\\n c3_chart_internal_fn.unselectPoint = function(target, d, i) {\\n var $$ = this;\\n $$.config.data_onunselected.call($$.api, d, target.node());\\n // remove selected-circle from low layer g\\n $$.main\\n .select('.' + CLASS.selectedCircles + $$.getTargetSelectorSuffix(d.id))\\n .selectAll('.' + CLASS.selectedCircle + '-' + i)\\n .transition()\\n .duration(100)\\n .attr('r', 0)\\n .remove();\\n };\\n c3_chart_internal_fn.togglePoint = function(selected, target, d, i) {\\n selected ? this.selectPoint(target, d, i) : this.unselectPoint(target, d, i);\\n };\\n c3_chart_internal_fn.selectPath = function(target, d) {\\n var $$ = this;\\n $$.config.data_onselected.call($$, d, target.node());\\n if ($$.config.interaction_brighten) {\\n target\\n .transition()\\n .duration(100)\\n .style('fill', function() {\\n return $$.d3.rgb($$.color(d)).brighter(0.75);\\n });\\n }\\n };\\n c3_chart_internal_fn.unselectPath = function(target, d) {\\n var $$ = this;\\n $$.config.data_onunselected.call($$, d, target.node());\\n if ($$.config.interaction_brighten) {\\n target\\n .transition()\\n .duration(100)\\n .style('fill', function() {\\n return $$.color(d);\\n });\\n }\\n };\\n c3_chart_internal_fn.togglePath = function(selected, target, d, i) {\\n selected ? this.selectPath(target, d, i) : this.unselectPath(target, d, i);\\n };\\n c3_chart_internal_fn.getToggle = function(that, d) {\\n var $$ = this,\\n toggle;\\n if (that.nodeName === 'circle') {\\n if ($$.isStepType(d)) {\\n // circle is hidden in step chart, so treat as within the click area\\n toggle = function() {}; // TODO: how to select step chart?\\n } else {\\n toggle = $$.togglePoint;\\n }\\n } else if (that.nodeName === 'path') {\\n toggle = $$.togglePath;\\n }\\n return toggle;\\n };\\n c3_chart_internal_fn.toggleShape = function(that, d, i) {\\n var $$ = this,\\n d3 = $$.d3,\\n config = $$.config,\\n shape = d3.select(that),\\n isSelected = shape.classed(CLASS.SELECTED),\\n toggle = $$.getToggle(that, d).bind($$);\\n\\n if (config.data_selection_enabled && config.data_selection_isselectable(d)) {\\n if (!config.data_selection_multiple) {\\n $$.main\\n .selectAll('.' + CLASS.shapes + (config.data_selection_grouped ? $$.getTargetSelectorSuffix(d.id) : ''))\\n .selectAll('.' + CLASS.shape)\\n .each(function(d, i) {\\n var shape = d3.select(this);\\n if (shape.classed(CLASS.SELECTED)) {\\n toggle(false, shape.classed(CLASS.SELECTED, false), d, i);\\n }\\n });\\n }\\n shape.classed(CLASS.SELECTED, !isSelected);\\n toggle(!isSelected, shape, d, i);\\n }\\n };\\n\\n c3_chart_internal_fn.initBrush = function() {\\n var $$ = this,\\n d3 = $$.d3;\\n $$.brush = d3.svg.brush().on('brush', function() {\\n $$.redrawForBrush();\\n });\\n $$.brush.update = function() {\\n if ($$.context) {\\n $$.context.select('.' + CLASS.brush).call(this);\\n }\\n return this;\\n };\\n $$.brush.scale = function(scale) {\\n return $$.config.axis_rotated ? this.y(scale) : this.x(scale);\\n };\\n };\\n c3_chart_internal_fn.initSubchart = function() {\\n var $$ = this,\\n config = $$.config,\\n context = ($$.context = $$.svg.append('g').attr('transform', $$.getTranslate('context'))),\\n visibility = config.subchart_show ? 'visible' : 'hidden';\\n\\n context.style('visibility', visibility);\\n\\n // Define g for chart area\\n context\\n .append('g')\\n .attr('clip-path', $$.clipPathForSubchart)\\n .attr('class', CLASS.chart);\\n\\n // Define g for bar chart area\\n context\\n .select('.' + CLASS.chart)\\n .append('g')\\n .attr('class', CLASS.chartBars);\\n\\n // Define g for line chart area\\n context\\n .select('.' + CLASS.chart)\\n .append('g')\\n .attr('class', CLASS.chartLines);\\n\\n // Add extent rect for Brush\\n context\\n .append('g')\\n .attr('clip-path', $$.clipPath)\\n .attr('class', CLASS.brush)\\n .call($$.brush);\\n\\n // ATTENTION: This must be called AFTER chart added\\n // Add Axis\\n $$.axes.subx = context\\n .append('g')\\n .attr('class', CLASS.axisX)\\n .attr('transform', $$.getTranslate('subx'))\\n .attr('clip-path', config.axis_rotated ? '' : $$.clipPathForXAxis)\\n .style('visibility', config.subchart_axis_x_show ? visibility : 'hidden');\\n };\\n c3_chart_internal_fn.updateTargetsForSubchart = function(targets) {\\n var $$ = this,\\n context = $$.context,\\n config = $$.config,\\n contextLineEnter,\\n contextLineUpdate,\\n contextBarEnter,\\n contextBarUpdate,\\n classChartBar = $$.classChartBar.bind($$),\\n classBars = $$.classBars.bind($$),\\n classChartLine = $$.classChartLine.bind($$),\\n classLines = $$.classLines.bind($$),\\n classAreas = $$.classAreas.bind($$);\\n\\n if (config.subchart_show) {\\n //-- Bar --//\\n contextBarUpdate = context\\n .select('.' + CLASS.chartBars)\\n .selectAll('.' + CLASS.chartBar)\\n .data(targets)\\n .attr('class', classChartBar);\\n contextBarEnter = contextBarUpdate\\n .enter()\\n .append('g')\\n .style('opacity', 0)\\n .attr('class', classChartBar);\\n // Bars for each data\\n contextBarEnter.append('g').attr('class', classBars);\\n\\n //-- Line --//\\n contextLineUpdate = context\\n .select('.' + CLASS.chartLines)\\n .selectAll('.' + CLASS.chartLine)\\n .data(targets)\\n .attr('class', classChartLine);\\n contextLineEnter = contextLineUpdate\\n .enter()\\n .append('g')\\n .style('opacity', 0)\\n .attr('class', classChartLine);\\n // Lines for each data\\n contextLineEnter.append('g').attr('class', classLines);\\n // Area\\n contextLineEnter.append('g').attr('class', classAreas);\\n\\n //-- Brush --//\\n context\\n .selectAll('.' + CLASS.brush + ' rect')\\n .attr(config.axis_rotated ? 'width' : 'height', config.axis_rotated ? $$.width2 : $$.height2);\\n }\\n };\\n c3_chart_internal_fn.updateBarForSubchart = function(durationForExit) {\\n var $$ = this;\\n $$.contextBar = $$.context\\n .selectAll('.' + CLASS.bars)\\n .selectAll('.' + CLASS.bar)\\n .data($$.barData.bind($$));\\n $$.contextBar\\n .enter()\\n .append('path')\\n .attr('class', $$.classBar.bind($$))\\n .style('stroke', 'none')\\n .style('fill', $$.color);\\n $$.contextBar.style('opacity', $$.initialOpacity.bind($$));\\n $$.contextBar\\n .exit()\\n .transition()\\n .duration(durationForExit)\\n .style('opacity', 0)\\n .remove();\\n };\\n c3_chart_internal_fn.redrawBarForSubchart = function(drawBarOnSub, withTransition, duration) {\\n (withTransition ? this.contextBar.transition(Math.random().toString()).duration(duration) : this.contextBar)\\n .attr('d', drawBarOnSub)\\n .style('opacity', 1);\\n };\\n c3_chart_internal_fn.updateLineForSubchart = function(durationForExit) {\\n var $$ = this;\\n $$.contextLine = $$.context\\n .selectAll('.' + CLASS.lines)\\n .selectAll('.' + CLASS.line)\\n .data($$.lineData.bind($$));\\n $$.contextLine\\n .enter()\\n .append('path')\\n .attr('class', $$.classLine.bind($$))\\n .style('stroke', $$.color);\\n $$.contextLine.style('opacity', $$.initialOpacity.bind($$));\\n $$.contextLine\\n .exit()\\n .transition()\\n .duration(durationForExit)\\n .style('opacity', 0)\\n .remove();\\n };\\n c3_chart_internal_fn.redrawLineForSubchart = function(drawLineOnSub, withTransition, duration) {\\n (withTransition ? this.contextLine.transition(Math.random().toString()).duration(duration) : this.contextLine)\\n .attr('d', drawLineOnSub)\\n .style('opacity', 1);\\n };\\n c3_chart_internal_fn.updateAreaForSubchart = function(durationForExit) {\\n var $$ = this,\\n d3 = $$.d3;\\n $$.contextArea = $$.context\\n .selectAll('.' + CLASS.areas)\\n .selectAll('.' + CLASS.area)\\n .data($$.lineData.bind($$));\\n $$.contextArea\\n .enter()\\n .append('path')\\n .attr('class', $$.classArea.bind($$))\\n .style('fill', $$.color)\\n .style('opacity', function() {\\n $$.orgAreaOpacity = +d3.select(this).style('opacity');\\n return 0;\\n });\\n $$.contextArea.style('opacity', 0);\\n $$.contextArea\\n .exit()\\n .transition()\\n .duration(durationForExit)\\n .style('opacity', 0)\\n .remove();\\n };\\n c3_chart_internal_fn.redrawAreaForSubchart = function(drawAreaOnSub, withTransition, duration) {\\n (withTransition ? this.contextArea.transition(Math.random().toString()).duration(duration) : this.contextArea)\\n .attr('d', drawAreaOnSub)\\n .style('fill', this.color)\\n .style('opacity', this.orgAreaOpacity);\\n };\\n c3_chart_internal_fn.redrawSubchart = function(\\n withSubchart,\\n transitions,\\n duration,\\n durationForExit,\\n areaIndices,\\n barIndices,\\n lineIndices\\n ) {\\n var $$ = this,\\n d3 = $$.d3,\\n config = $$.config,\\n drawAreaOnSub,\\n drawBarOnSub,\\n drawLineOnSub;\\n\\n $$.context.style('visibility', config.subchart_show ? 'visible' : 'hidden');\\n\\n // subchart\\n if (config.subchart_show) {\\n // reflect main chart to extent on subchart if zoomed\\n if (d3.event && d3.event.type === 'zoom') {\\n $$.brush.extent($$.x.orgDomain()).update();\\n }\\n // update subchart elements if needed\\n if (withSubchart) {\\n // extent rect\\n if (!$$.brush.empty()) {\\n $$.brush.extent($$.x.orgDomain()).update();\\n }\\n // setup drawer - MEMO: this must be called after axis updated\\n drawAreaOnSub = $$.generateDrawArea(areaIndices, true);\\n drawBarOnSub = $$.generateDrawBar(barIndices, true);\\n drawLineOnSub = $$.generateDrawLine(lineIndices, true);\\n\\n $$.updateBarForSubchart(duration);\\n $$.updateLineForSubchart(duration);\\n $$.updateAreaForSubchart(duration);\\n\\n $$.redrawBarForSubchart(drawBarOnSub, duration, duration);\\n $$.redrawLineForSubchart(drawLineOnSub, duration, duration);\\n $$.redrawAreaForSubchart(drawAreaOnSub, duration, duration);\\n }\\n }\\n };\\n c3_chart_internal_fn.redrawForBrush = function() {\\n var $$ = this,\\n x = $$.x;\\n $$.redraw({\\n withTransition: false,\\n withY: $$.config.zoom_rescale,\\n withSubchart: false,\\n withUpdateXDomain: true,\\n withDimension: false\\n });\\n $$.config.subchart_onbrush.call($$.api, x.orgDomain());\\n };\\n c3_chart_internal_fn.transformContext = function(withTransition, transitions) {\\n var $$ = this,\\n subXAxis;\\n if (transitions && transitions.axisSubX) {\\n subXAxis = transitions.axisSubX;\\n } else {\\n subXAxis = $$.context.select('.' + CLASS.axisX);\\n if (withTransition) {\\n subXAxis = subXAxis.transition();\\n }\\n }\\n $$.context.attr('transform', $$.getTranslate('context'));\\n subXAxis.attr('transform', $$.getTranslate('subx'));\\n };\\n c3_chart_internal_fn.getDefaultExtent = function() {\\n var $$ = this,\\n config = $$.config,\\n extent = isFunction(config.axis_x_extent)\\n ? config.axis_x_extent($$.getXDomain($$.data.targets))\\n : config.axis_x_extent;\\n if ($$.isTimeSeries()) {\\n extent = [$$.parseDate(extent[0]), $$.parseDate(extent[1])];\\n }\\n return extent;\\n };\\n\\n c3_chart_internal_fn.initZoom = function() {\\n var $$ = this,\\n d3 = $$.d3,\\n config = $$.config,\\n startEvent;\\n\\n $$.zoom = d3.behavior\\n .zoom()\\n .on('zoomstart', function() {\\n startEvent = d3.event.sourceEvent;\\n $$.zoom.altDomain = d3.event.sourceEvent.altKey ? $$.x.orgDomain() : null;\\n config.zoom_onzoomstart.call($$.api, d3.event.sourceEvent);\\n })\\n .on('zoom', function() {\\n $$.redrawForZoom.call($$);\\n })\\n .on('zoomend', function() {\\n var event = d3.event.sourceEvent;\\n // if click, do nothing. otherwise, click interaction will be canceled.\\n if (event && startEvent.clientX === event.clientX && startEvent.clientY === event.clientY) {\\n return;\\n }\\n $$.redrawEventRect();\\n $$.updateZoom();\\n config.zoom_onzoomend.call($$.api, $$.x.orgDomain());\\n });\\n $$.zoom.scale = function(scale) {\\n return config.axis_rotated ? this.y(scale) : this.x(scale);\\n };\\n $$.zoom.orgScaleExtent = function() {\\n var extent = config.zoom_extent ? config.zoom_extent : [1, 10];\\n return [extent[0], Math.max($$.getMaxDataCount() / extent[1], extent[1])];\\n };\\n $$.zoom.updateScaleExtent = function() {\\n var ratio = diffDomain($$.x.orgDomain()) / diffDomain($$.getZoomDomain()),\\n extent = this.orgScaleExtent();\\n this.scaleExtent([extent[0] * ratio, extent[1] * ratio]);\\n return this;\\n };\\n };\\n c3_chart_internal_fn.getZoomDomain = function() {\\n var $$ = this,\\n config = $$.config,\\n d3 = $$.d3,\\n min = d3.min([$$.orgXDomain[0], config.zoom_x_min]),\\n max = d3.max([$$.orgXDomain[1], config.zoom_x_max]);\\n return [min, max];\\n };\\n c3_chart_internal_fn.updateZoom = function() {\\n var $$ = this,\\n z = $$.config.zoom_enabled ? $$.zoom : function() {};\\n $$.main\\n .select('.' + CLASS.zoomRect)\\n .call(z)\\n .on('dblclick.zoom', null);\\n $$.main\\n .selectAll('.' + CLASS.eventRect)\\n .call(z)\\n .on('dblclick.zoom', null);\\n };\\n c3_chart_internal_fn.redrawForZoom = function() {\\n var $$ = this,\\n d3 = $$.d3,\\n config = $$.config,\\n zoom = $$.zoom,\\n x = $$.x;\\n if (!config.zoom_enabled) {\\n return;\\n }\\n if ($$.filterTargetsToShow($$.data.targets).length === 0) {\\n return;\\n }\\n if (d3.event.sourceEvent.type === 'mousemove' && zoom.altDomain) {\\n x.domain(zoom.altDomain);\\n zoom.scale(x).updateScaleExtent();\\n return;\\n }\\n if ($$.isCategorized() && x.orgDomain()[0] === $$.orgXDomain[0]) {\\n x.domain([$$.orgXDomain[0] - 1e-10, x.orgDomain()[1]]);\\n }\\n $$.redraw({\\n withTransition: false,\\n withY: config.zoom_rescale,\\n withSubchart: false,\\n withEventRect: false,\\n withDimension: false\\n });\\n if (d3.event.sourceEvent.type === 'mousemove') {\\n $$.cancelClick = true;\\n }\\n config.zoom_onzoom.call($$.api, x.orgDomain());\\n };\\n\\n c3_chart_internal_fn.generateColor = function() {\\n var $$ = this,\\n config = $$.config,\\n d3 = $$.d3,\\n colors = config.data_colors,\\n pattern = notEmpty(config.color_pattern) ? config.color_pattern : d3.scale.category10().range(),\\n callback = config.data_color,\\n ids = [];\\n\\n return function(d) {\\n var id = d.id || (d.data && d.data.id) || d,\\n color;\\n\\n // if callback function is provided\\n if (colors[id] instanceof Function) {\\n color = colors[id](d);\\n }\\n // if specified, choose that color\\n else if (colors[id]) {\\n color = colors[id];\\n }\\n // if not specified, choose from pattern\\n else {\\n if (ids.indexOf(id) < 0) {\\n ids.push(id);\\n }\\n color = pattern[ids.indexOf(id) % pattern.length];\\n colors[id] = color;\\n }\\n return callback instanceof Function ? callback(color, d) : color;\\n };\\n };\\n c3_chart_internal_fn.generateLevelColor = function() {\\n var $$ = this,\\n config = $$.config,\\n colors = config.color_pattern,\\n threshold = config.color_threshold,\\n asValue = threshold.unit === 'value',\\n values = threshold.values && threshold.values.length ? threshold.values : [],\\n max = threshold.max || 100;\\n return notEmpty(config.color_threshold)\\n ? function(value) {\\n var i,\\n v,\\n color = colors[colors.length - 1];\\n for (i = 0; i < values.length; i++) {\\n v = asValue ? value : (value * 100) / max;\\n if (v < values[i]) {\\n color = colors[i];\\n break;\\n }\\n }\\n return color;\\n }\\n : null;\\n };\\n\\n c3_chart_internal_fn.getYFormat = function(forArc) {\\n var $$ = this,\\n formatForY = forArc && !$$.hasType('gauge') ? $$.defaultArcValueFormat : $$.yFormat,\\n formatForY2 = forArc && !$$.hasType('gauge') ? $$.defaultArcValueFormat : $$.y2Format;\\n return function(v, ratio, id) {\\n var format = $$.axis.getId(id) === 'y2' ? formatForY2 : formatForY;\\n return format.call($$, v, ratio);\\n };\\n };\\n c3_chart_internal_fn.yFormat = function(v) {\\n var $$ = this,\\n config = $$.config,\\n format = config.axis_y_tick_format ? config.axis_y_tick_format : $$.defaultValueFormat;\\n return format(v);\\n };\\n c3_chart_internal_fn.y2Format = function(v) {\\n var $$ = this,\\n config = $$.config,\\n format = config.axis_y2_tick_format ? config.axis_y2_tick_format : $$.defaultValueFormat;\\n return format(v);\\n };\\n c3_chart_internal_fn.defaultValueFormat = function(v) {\\n return isValue(v) ? +v : '';\\n };\\n c3_chart_internal_fn.defaultArcValueFormat = function(v, ratio) {\\n // v is value\\n // ratio is the diff\\n return (v / 100).toFixed(1) + ''; // Prolaera - tofixed\\n\\n // Gauge label for ratio\\n // return (ratio * 100).toFixed(1) + '';\\n };\\n c3_chart_internal_fn.dataLabelFormat = function(targetId) {\\n var $$ = this,\\n data_labels = $$.config.data_labels,\\n format,\\n defaultFormat = function(v) {\\n return isValue(v) ? +v : '';\\n };\\n // find format according to axis id\\n if (typeof data_labels.format === 'function') {\\n format = data_labels.format;\\n } else if (typeof data_labels.format === 'object') {\\n if (data_labels.format[targetId]) {\\n format = data_labels.format[targetId] === true ? defaultFormat : data_labels.format[targetId];\\n } else {\\n format = function() {\\n return '';\\n };\\n }\\n } else {\\n format = defaultFormat;\\n }\\n return format;\\n };\\n\\n c3_chart_internal_fn.hasCaches = function(ids) {\\n for (var i = 0; i < ids.length; i++) {\\n if (!(ids[i] in this.cache)) {\\n return false;\\n }\\n }\\n return true;\\n };\\n c3_chart_internal_fn.addCache = function(id, target) {\\n this.cache[id] = this.cloneTarget(target);\\n };\\n c3_chart_internal_fn.getCaches = function(ids) {\\n var targets = [],\\n i;\\n for (i = 0; i < ids.length; i++) {\\n if (ids[i] in this.cache) {\\n targets.push(this.cloneTarget(this.cache[ids[i]]));\\n }\\n }\\n return targets;\\n };\\n\\n var CLASS = (c3_chart_internal_fn.CLASS = {\\n target: 'c3-target',\\n chart: 'c3-chart',\\n chartLine: 'c3-chart-line',\\n chartLines: 'c3-chart-lines',\\n chartBar: 'c3-chart-bar',\\n chartBars: 'c3-chart-bars',\\n chartText: 'c3-chart-text',\\n chartTexts: 'c3-chart-texts',\\n chartArc: 'c3-chart-arc',\\n chartArcs: 'c3-chart-arcs',\\n chartArcsTitle: 'c3-chart-arcs-title',\\n chartArcsBackground: 'c3-chart-arcs-background',\\n chartArcsGaugeUnit: 'c3-chart-arcs-gauge-unit',\\n chartArcsGaugeMax: 'c3-chart-arcs-gauge-max',\\n chartArcsGaugeMin: 'c3-chart-arcs-gauge-min',\\n selectedCircle: 'c3-selected-circle',\\n selectedCircles: 'c3-selected-circles',\\n eventRect: 'c3-event-rect',\\n eventRects: 'c3-event-rects',\\n eventRectsSingle: 'c3-event-rects-single',\\n eventRectsMultiple: 'c3-event-rects-multiple',\\n zoomRect: 'c3-zoom-rect',\\n brush: 'c3-brush',\\n focused: 'c3-focused',\\n defocused: 'c3-defocused',\\n region: 'c3-region',\\n regions: 'c3-regions',\\n title: 'c3-title',\\n tooltipContainer: 'c3-tooltip-container',\\n tooltip: 'c3-tooltip',\\n tooltipName: 'c3-tooltip-name',\\n shape: 'c3-shape',\\n shapes: 'c3-shapes',\\n line: 'c3-line',\\n lines: 'c3-lines',\\n bar: 'c3-bar',\\n bars: 'c3-bars',\\n circle: 'c3-circle',\\n circles: 'c3-circles',\\n arc: 'c3-arc',\\n arcs: 'c3-arcs',\\n area: 'c3-area',\\n areas: 'c3-areas',\\n empty: 'c3-empty',\\n text: 'c3-text',\\n texts: 'c3-texts',\\n gaugeValue: 'c3-gauge-value',\\n grid: 'c3-grid',\\n gridLines: 'c3-grid-lines',\\n xgrid: 'c3-xgrid',\\n xgrids: 'c3-xgrids',\\n xgridLine: 'c3-xgrid-line',\\n xgridLines: 'c3-xgrid-lines',\\n xgridFocus: 'c3-xgrid-focus',\\n ygrid: 'c3-ygrid',\\n ygrids: 'c3-ygrids',\\n ygridLine: 'c3-ygrid-line',\\n ygridLines: 'c3-ygrid-lines',\\n axis: 'c3-axis',\\n axisX: 'c3-axis-x',\\n axisXLabel: 'c3-axis-x-label',\\n axisY: 'c3-axis-y',\\n axisYLabel: 'c3-axis-y-label',\\n axisY2: 'c3-axis-y2',\\n axisY2Label: 'c3-axis-y2-label',\\n legendBackground: 'c3-legend-background',\\n legendItem: 'c3-legend-item',\\n legendItemEvent: 'c3-legend-item-event',\\n legendItemTile: 'c3-legend-item-tile',\\n legendItemHidden: 'c3-legend-item-hidden',\\n legendItemFocused: 'c3-legend-item-focused',\\n dragarea: 'c3-dragarea',\\n EXPANDED: '_expanded_',\\n SELECTED: '_selected_',\\n INCLUDED: '_included_'\\n });\\n c3_chart_internal_fn.generateClass = function(prefix, targetId) {\\n return ' ' + prefix + ' ' + prefix + this.getTargetSelectorSuffix(targetId);\\n };\\n c3_chart_internal_fn.classText = function(d) {\\n return this.generateClass(CLASS.text, d.index);\\n };\\n c3_chart_internal_fn.classTexts = function(d) {\\n return this.generateClass(CLASS.texts, d.id);\\n };\\n c3_chart_internal_fn.classShape = function(d) {\\n return this.generateClass(CLASS.shape, d.index);\\n };\\n c3_chart_internal_fn.classShapes = function(d) {\\n return this.generateClass(CLASS.shapes, d.id);\\n };\\n c3_chart_internal_fn.classLine = function(d) {\\n return this.classShape(d) + this.generateClass(CLASS.line, d.id);\\n };\\n c3_chart_internal_fn.classLines = function(d) {\\n return this.classShapes(d) + this.generateClass(CLASS.lines, d.id);\\n };\\n c3_chart_internal_fn.classCircle = function(d) {\\n return this.classShape(d) + this.generateClass(CLASS.circle, d.index);\\n };\\n c3_chart_internal_fn.classCircles = function(d) {\\n return this.classShapes(d) + this.generateClass(CLASS.circles, d.id);\\n };\\n c3_chart_internal_fn.classBar = function(d) {\\n return this.classShape(d) + this.generateClass(CLASS.bar, d.index);\\n };\\n c3_chart_internal_fn.classBars = function(d) {\\n return this.classShapes(d) + this.generateClass(CLASS.bars, d.id);\\n };\\n c3_chart_internal_fn.classArc = function(d) {\\n return this.classShape(d.data) + this.generateClass(CLASS.arc, d.data.id);\\n };\\n c3_chart_internal_fn.classArcs = function(d) {\\n return this.classShapes(d.data) + this.generateClass(CLASS.arcs, d.data.id);\\n };\\n c3_chart_internal_fn.classArea = function(d) {\\n return this.classShape(d) + this.generateClass(CLASS.area, d.id);\\n };\\n c3_chart_internal_fn.classAreas = function(d) {\\n return this.classShapes(d) + this.generateClass(CLASS.areas, d.id);\\n };\\n c3_chart_internal_fn.classRegion = function(d, i) {\\n return this.generateClass(CLASS.region, i) + ' ' + ('class' in d ? d['class'] : '');\\n };\\n c3_chart_internal_fn.classEvent = function(d) {\\n return this.generateClass(CLASS.eventRect, d.index);\\n };\\n c3_chart_internal_fn.classTarget = function(id) {\\n var $$ = this;\\n var additionalClassSuffix = $$.config.data_classes[id],\\n additionalClass = '';\\n if (additionalClassSuffix) {\\n additionalClass = ' ' + CLASS.target + '-' + additionalClassSuffix;\\n }\\n return $$.generateClass(CLASS.target, id) + additionalClass;\\n };\\n c3_chart_internal_fn.classFocus = function(d) {\\n return this.classFocused(d) + this.classDefocused(d);\\n };\\n c3_chart_internal_fn.classFocused = function(d) {\\n return ' ' + (this.focusedTargetIds.indexOf(d.id) >= 0 ? CLASS.focused : '');\\n };\\n c3_chart_internal_fn.classDefocused = function(d) {\\n return ' ' + (this.defocusedTargetIds.indexOf(d.id) >= 0 ? CLASS.defocused : '');\\n };\\n c3_chart_internal_fn.classChartText = function(d) {\\n return CLASS.chartText + this.classTarget(d.id);\\n };\\n c3_chart_internal_fn.classChartLine = function(d) {\\n return CLASS.chartLine + this.classTarget(d.id);\\n };\\n c3_chart_internal_fn.classChartBar = function(d) {\\n return CLASS.chartBar + this.classTarget(d.id);\\n };\\n c3_chart_internal_fn.classChartArc = function(d) {\\n return CLASS.chartArc + this.classTarget(d.data.id);\\n };\\n c3_chart_internal_fn.getTargetSelectorSuffix = function(targetId) {\\n return targetId || targetId === 0 ? ('-' + targetId).replace(/[\\\\s?!@#$%^&*()_=+,.<>'\\\":;\\\\[\\\\]\\\\/|~`{}\\\\\\\\]/g, '-') : '';\\n };\\n c3_chart_internal_fn.selectorTarget = function(id, prefix) {\\n return (prefix || '') + '.' + CLASS.target + this.getTargetSelectorSuffix(id);\\n };\\n c3_chart_internal_fn.selectorTargets = function(ids, prefix) {\\n var $$ = this;\\n ids = ids || [];\\n return ids.length\\n ? ids.map(function(id) {\\n return $$.selectorTarget(id, prefix);\\n })\\n : null;\\n };\\n c3_chart_internal_fn.selectorLegend = function(id) {\\n return '.' + CLASS.legendItem + this.getTargetSelectorSuffix(id);\\n };\\n c3_chart_internal_fn.selectorLegends = function(ids) {\\n var $$ = this;\\n return ids && ids.length\\n ? ids.map(function(id) {\\n return $$.selectorLegend(id);\\n })\\n : null;\\n };\\n\\n var isValue = (c3_chart_internal_fn.isValue = function(v) {\\n return v || v === 0;\\n }),\\n isFunction = (c3_chart_internal_fn.isFunction = function(o) {\\n return typeof o === 'function';\\n }),\\n isString = (c3_chart_internal_fn.isString = function(o) {\\n return typeof o === 'string';\\n }),\\n isUndefined = (c3_chart_internal_fn.isUndefined = function(v) {\\n return typeof v === 'undefined';\\n }),\\n isDefined = (c3_chart_internal_fn.isDefined = function(v) {\\n return typeof v !== 'undefined';\\n }),\\n ceil10 = (c3_chart_internal_fn.ceil10 = function(v) {\\n return Math.ceil(v / 10) * 10;\\n }),\\n asHalfPixel = (c3_chart_internal_fn.asHalfPixel = function(n) {\\n return Math.ceil(n) + 0.5;\\n }),\\n diffDomain = (c3_chart_internal_fn.diffDomain = function(d) {\\n return d[1] - d[0];\\n }),\\n isEmpty = (c3_chart_internal_fn.isEmpty = function(o) {\\n return (\\n typeof o === 'undefined' ||\\n o === null ||\\n (isString(o) && o.length === 0) ||\\n (typeof o === 'object' && Object.keys(o).length === 0)\\n );\\n }),\\n notEmpty = (c3_chart_internal_fn.notEmpty = function(o) {\\n return !c3_chart_internal_fn.isEmpty(o);\\n }),\\n getOption = (c3_chart_internal_fn.getOption = function(options, key, defaultValue) {\\n return isDefined(options[key]) ? options[key] : defaultValue;\\n }),\\n hasValue = (c3_chart_internal_fn.hasValue = function(dict, value) {\\n var found = false;\\n Object.keys(dict).forEach(function(key) {\\n if (dict[key] === value) {\\n found = true;\\n }\\n });\\n return found;\\n }),\\n sanitise = (c3_chart_internal_fn.sanitise = function(str) {\\n return typeof str === 'string' ? str.replace(//g, '>') : str;\\n }),\\n getPathBox = (c3_chart_internal_fn.getPathBox = function(path) {\\n var box = path.getBoundingClientRect(),\\n items = [path.pathSegList.getItem(0), path.pathSegList.getItem(1)],\\n minX = items[0].x,\\n minY = Math.min(items[0].y, items[1].y);\\n return { x: minX, y: minY, width: box.width, height: box.height };\\n });\\n\\n c3_chart_fn.focus = function(targetIds) {\\n var $$ = this.internal,\\n candidates;\\n\\n targetIds = $$.mapToTargetIds(targetIds);\\n (candidates = $$.svg.selectAll($$.selectorTargets(targetIds.filter($$.isTargetToShow, $$)))), this.revert();\\n this.defocus();\\n candidates.classed(CLASS.focused, true).classed(CLASS.defocused, false);\\n if ($$.hasArcType()) {\\n $$.expandArc(targetIds);\\n }\\n $$.toggleFocusLegend(targetIds, true);\\n\\n $$.focusedTargetIds = targetIds;\\n $$.defocusedTargetIds = $$.defocusedTargetIds.filter(function(id) {\\n return targetIds.indexOf(id) < 0;\\n });\\n };\\n\\n c3_chart_fn.defocus = function(targetIds) {\\n var $$ = this.internal,\\n candidates;\\n\\n targetIds = $$.mapToTargetIds(targetIds);\\n (candidates = $$.svg.selectAll($$.selectorTargets(targetIds.filter($$.isTargetToShow, $$)))),\\n candidates.classed(CLASS.focused, false).classed(CLASS.defocused, true);\\n if ($$.hasArcType()) {\\n $$.unexpandArc(targetIds);\\n }\\n $$.toggleFocusLegend(targetIds, false);\\n\\n $$.focusedTargetIds = $$.focusedTargetIds.filter(function(id) {\\n return targetIds.indexOf(id) < 0;\\n });\\n $$.defocusedTargetIds = targetIds;\\n };\\n\\n c3_chart_fn.revert = function(targetIds) {\\n var $$ = this.internal,\\n candidates;\\n\\n targetIds = $$.mapToTargetIds(targetIds);\\n candidates = $$.svg.selectAll($$.selectorTargets(targetIds)); // should be for all targets\\n\\n candidates.classed(CLASS.focused, false).classed(CLASS.defocused, false);\\n if ($$.hasArcType()) {\\n $$.unexpandArc(targetIds);\\n }\\n if ($$.config.legend_show) {\\n $$.showLegend(targetIds.filter($$.isLegendToShow.bind($$)));\\n $$.legend\\n .selectAll($$.selectorLegends(targetIds))\\n .filter(function() {\\n return $$.d3.select(this).classed(CLASS.legendItemFocused);\\n })\\n .classed(CLASS.legendItemFocused, false);\\n }\\n\\n $$.focusedTargetIds = [];\\n $$.defocusedTargetIds = [];\\n };\\n\\n c3_chart_fn.show = function(targetIds, options) {\\n var $$ = this.internal,\\n targets;\\n\\n targetIds = $$.mapToTargetIds(targetIds);\\n options = options || {};\\n\\n $$.removeHiddenTargetIds(targetIds);\\n targets = $$.svg.selectAll($$.selectorTargets(targetIds));\\n\\n targets\\n .transition()\\n .style('opacity', 1, 'important')\\n .call($$.endall, function() {\\n targets.style('opacity', null).style('opacity', 1);\\n });\\n\\n if (options.withLegend) {\\n $$.showLegend(targetIds);\\n }\\n\\n $$.redraw({ withUpdateOrgXDomain: true, withUpdateXDomain: true, withLegend: true });\\n };\\n\\n c3_chart_fn.hide = function(targetIds, options) {\\n var $$ = this.internal,\\n targets;\\n\\n targetIds = $$.mapToTargetIds(targetIds);\\n options = options || {};\\n\\n $$.addHiddenTargetIds(targetIds);\\n targets = $$.svg.selectAll($$.selectorTargets(targetIds));\\n\\n targets\\n .transition()\\n .style('opacity', 0, 'important')\\n .call($$.endall, function() {\\n targets.style('opacity', null).style('opacity', 0);\\n });\\n\\n if (options.withLegend) {\\n $$.hideLegend(targetIds);\\n }\\n\\n $$.redraw({ withUpdateOrgXDomain: true, withUpdateXDomain: true, withLegend: true });\\n };\\n\\n c3_chart_fn.toggle = function(targetIds, options) {\\n var that = this,\\n $$ = this.internal;\\n $$.mapToTargetIds(targetIds).forEach(function(targetId) {\\n $$.isTargetToShow(targetId) ? that.hide(targetId, options) : that.show(targetId, options);\\n });\\n };\\n\\n c3_chart_fn.zoom = function(domain) {\\n var $$ = this.internal;\\n if (domain) {\\n if ($$.isTimeSeries()) {\\n domain = domain.map(function(x) {\\n return $$.parseDate(x);\\n });\\n }\\n $$.brush.extent(domain);\\n $$.redraw({ withUpdateXDomain: true, withY: $$.config.zoom_rescale });\\n $$.config.zoom_onzoom.call(this, $$.x.orgDomain());\\n }\\n return $$.brush.extent();\\n };\\n c3_chart_fn.zoom.enable = function(enabled) {\\n var $$ = this.internal;\\n $$.config.zoom_enabled = enabled;\\n $$.updateAndRedraw();\\n };\\n c3_chart_fn.unzoom = function() {\\n var $$ = this.internal;\\n $$.brush.clear().update();\\n $$.redraw({ withUpdateXDomain: true });\\n };\\n\\n c3_chart_fn.zoom.max = function(max) {\\n var $$ = this.internal,\\n config = $$.config,\\n d3 = $$.d3;\\n if (max === 0 || max) {\\n config.zoom_x_max = d3.max([$$.orgXDomain[1], max]);\\n } else {\\n return config.zoom_x_max;\\n }\\n };\\n\\n c3_chart_fn.zoom.min = function(min) {\\n var $$ = this.internal,\\n config = $$.config,\\n d3 = $$.d3;\\n if (min === 0 || min) {\\n config.zoom_x_min = d3.min([$$.orgXDomain[0], min]);\\n } else {\\n return config.zoom_x_min;\\n }\\n };\\n\\n c3_chart_fn.zoom.range = function(range) {\\n if (arguments.length) {\\n if (isDefined(range.max)) {\\n this.domain.max(range.max);\\n }\\n if (isDefined(range.min)) {\\n this.domain.min(range.min);\\n }\\n } else {\\n return {\\n max: this.domain.max(),\\n min: this.domain.min()\\n };\\n }\\n };\\n\\n c3_chart_fn.load = function(args) {\\n var $$ = this.internal,\\n config = $$.config;\\n // update xs if specified\\n if (args.xs) {\\n $$.addXs(args.xs);\\n }\\n // update names if exists\\n if ('names' in args) {\\n c3_chart_fn.data.names.bind(this)(args.names);\\n }\\n // update classes if exists\\n if ('classes' in args) {\\n Object.keys(args.classes).forEach(function(id) {\\n config.data_classes[id] = args.classes[id];\\n });\\n }\\n // update categories if exists\\n if ('categories' in args && $$.isCategorized()) {\\n config.axis_x_categories = args.categories;\\n }\\n // update axes if exists\\n if ('axes' in args) {\\n Object.keys(args.axes).forEach(function(id) {\\n config.data_axes[id] = args.axes[id];\\n });\\n }\\n // update colors if exists\\n if ('colors' in args) {\\n Object.keys(args.colors).forEach(function(id) {\\n config.data_colors[id] = args.colors[id];\\n });\\n }\\n // use cache if exists\\n if ('cacheIds' in args && $$.hasCaches(args.cacheIds)) {\\n $$.load($$.getCaches(args.cacheIds), args.done);\\n return;\\n }\\n // unload if needed\\n if ('unload' in args) {\\n // TODO: do not unload if target will load (included in url/rows/columns)\\n $$.unload($$.mapToTargetIds(typeof args.unload === 'boolean' && args.unload ? null : args.unload), function() {\\n $$.loadFromArgs(args);\\n });\\n } else {\\n $$.loadFromArgs(args);\\n }\\n };\\n\\n c3_chart_fn.unload = function(args) {\\n var $$ = this.internal;\\n args = args || {};\\n if (args instanceof Array) {\\n args = { ids: args };\\n } else if (typeof args === 'string') {\\n args = { ids: [args] };\\n }\\n $$.unload($$.mapToTargetIds(args.ids), function() {\\n $$.redraw({ withUpdateOrgXDomain: true, withUpdateXDomain: true, withLegend: true });\\n if (args.done) {\\n args.done();\\n }\\n });\\n };\\n\\n c3_chart_fn.flow = function(args) {\\n var $$ = this.internal,\\n targets,\\n data,\\n notfoundIds = [],\\n orgDataCount = $$.getMaxDataCount(),\\n dataCount,\\n domain,\\n baseTarget,\\n baseValue,\\n length = 0,\\n tail = 0,\\n diff,\\n to;\\n\\n if (args.json) {\\n data = $$.convertJsonToData(args.json, args.keys);\\n } else if (args.rows) {\\n data = $$.convertRowsToData(args.rows);\\n } else if (args.columns) {\\n data = $$.convertColumnsToData(args.columns);\\n } else {\\n return;\\n }\\n targets = $$.convertDataToTargets(data, true);\\n\\n // Update/Add data\\n $$.data.targets.forEach(function(t) {\\n var found = false,\\n i,\\n j;\\n for (i = 0; i < targets.length; i++) {\\n if (t.id === targets[i].id) {\\n found = true;\\n\\n if (t.values[t.values.length - 1]) {\\n tail = t.values[t.values.length - 1].index + 1;\\n }\\n length = targets[i].values.length;\\n\\n for (j = 0; j < length; j++) {\\n targets[i].values[j].index = tail + j;\\n if (!$$.isTimeSeries()) {\\n targets[i].values[j].x = tail + j;\\n }\\n }\\n t.values = t.values.concat(targets[i].values);\\n\\n targets.splice(i, 1);\\n break;\\n }\\n }\\n if (!found) {\\n notfoundIds.push(t.id);\\n }\\n });\\n\\n // Append null for not found targets\\n $$.data.targets.forEach(function(t) {\\n var i, j;\\n for (i = 0; i < notfoundIds.length; i++) {\\n if (t.id === notfoundIds[i]) {\\n tail = t.values[t.values.length - 1].index + 1;\\n for (j = 0; j < length; j++) {\\n t.values.push({\\n id: t.id,\\n index: tail + j,\\n x: $$.isTimeSeries() ? $$.getOtherTargetX(tail + j) : tail + j,\\n value: null\\n });\\n }\\n }\\n }\\n });\\n\\n // Generate null values for new target\\n if ($$.data.targets.length) {\\n targets.forEach(function(t) {\\n var i,\\n missing = [];\\n for (i = $$.data.targets[0].values[0].index; i < tail; i++) {\\n missing.push({\\n id: t.id,\\n index: i,\\n x: $$.isTimeSeries() ? $$.getOtherTargetX(i) : i,\\n value: null\\n });\\n }\\n t.values.forEach(function(v) {\\n v.index += tail;\\n if (!$$.isTimeSeries()) {\\n v.x += tail;\\n }\\n });\\n t.values = missing.concat(t.values);\\n });\\n }\\n $$.data.targets = $$.data.targets.concat(targets); // add remained\\n\\n // check data count because behavior needs to change when it's only one\\n dataCount = $$.getMaxDataCount();\\n baseTarget = $$.data.targets[0];\\n baseValue = baseTarget.values[0];\\n\\n // Update length to flow if needed\\n if (isDefined(args.to)) {\\n length = 0;\\n to = $$.isTimeSeries() ? $$.parseDate(args.to) : args.to;\\n baseTarget.values.forEach(function(v) {\\n if (v.x < to) {\\n length++;\\n }\\n });\\n } else if (isDefined(args.length)) {\\n length = args.length;\\n }\\n\\n // If only one data, update the domain to flow from left edge of the chart\\n if (!orgDataCount) {\\n if ($$.isTimeSeries()) {\\n if (baseTarget.values.length > 1) {\\n diff = baseTarget.values[baseTarget.values.length - 1].x - baseValue.x;\\n } else {\\n diff = baseValue.x - $$.getXDomain($$.data.targets)[0];\\n }\\n } else {\\n diff = 1;\\n }\\n domain = [baseValue.x - diff, baseValue.x];\\n $$.updateXDomain(null, true, true, false, domain);\\n } else if (orgDataCount === 1) {\\n if ($$.isTimeSeries()) {\\n diff = (baseTarget.values[baseTarget.values.length - 1].x - baseValue.x) / 2;\\n domain = [new Date(+baseValue.x - diff), new Date(+baseValue.x + diff)];\\n $$.updateXDomain(null, true, true, false, domain);\\n }\\n }\\n\\n // Set targets\\n $$.updateTargets($$.data.targets);\\n\\n // Redraw with new targets\\n $$.redraw({\\n flow: {\\n index: baseValue.index,\\n length: length,\\n duration: isValue(args.duration) ? args.duration : $$.config.transition_duration,\\n done: args.done,\\n orgDataCount: orgDataCount\\n },\\n withLegend: true,\\n withTransition: orgDataCount > 1,\\n withTrimXDomain: false,\\n withUpdateXAxis: true\\n });\\n };\\n\\n c3_chart_internal_fn.generateFlow = function(args) {\\n var $$ = this,\\n config = $$.config,\\n d3 = $$.d3;\\n\\n return function() {\\n var targets = args.targets,\\n flow = args.flow,\\n drawBar = args.drawBar,\\n drawLine = args.drawLine,\\n drawArea = args.drawArea,\\n cx = args.cx,\\n cy = args.cy,\\n xv = args.xv,\\n xForText = args.xForText,\\n yForText = args.yForText,\\n duration = args.duration;\\n\\n var translateX,\\n scaleX = 1,\\n transform,\\n flowIndex = flow.index,\\n flowLength = flow.length,\\n flowStart = $$.getValueOnIndex($$.data.targets[0].values, flowIndex),\\n flowEnd = $$.getValueOnIndex($$.data.targets[0].values, flowIndex + flowLength),\\n orgDomain = $$.x.domain(),\\n domain,\\n durationForFlow = flow.duration || duration,\\n done = flow.done || function() {},\\n wait = $$.generateWait();\\n\\n var xgrid = $$.xgrid || d3.selectAll([]),\\n xgridLines = $$.xgridLines || d3.selectAll([]),\\n mainRegion = $$.mainRegion || d3.selectAll([]),\\n mainText = $$.mainText || d3.selectAll([]),\\n mainBar = $$.mainBar || d3.selectAll([]),\\n mainLine = $$.mainLine || d3.selectAll([]),\\n mainArea = $$.mainArea || d3.selectAll([]),\\n mainCircle = $$.mainCircle || d3.selectAll([]);\\n\\n // set flag\\n $$.flowing = true;\\n\\n // remove head data after rendered\\n $$.data.targets.forEach(function(d) {\\n d.values.splice(0, flowLength);\\n });\\n\\n // update x domain to generate axis elements for flow\\n domain = $$.updateXDomain(targets, true, true);\\n // update elements related to x scale\\n if ($$.updateXGrid) {\\n $$.updateXGrid(true);\\n }\\n\\n // generate transform to flow\\n if (!flow.orgDataCount) {\\n // if empty\\n if ($$.data.targets[0].values.length !== 1) {\\n translateX = $$.x(orgDomain[0]) - $$.x(domain[0]);\\n } else {\\n if ($$.isTimeSeries()) {\\n flowStart = $$.getValueOnIndex($$.data.targets[0].values, 0);\\n flowEnd = $$.getValueOnIndex($$.data.targets[0].values, $$.data.targets[0].values.length - 1);\\n translateX = $$.x(flowStart.x) - $$.x(flowEnd.x);\\n } else {\\n translateX = diffDomain(domain) / 2;\\n }\\n }\\n } else if (flow.orgDataCount === 1 || (flowStart && flowStart.x) === (flowEnd && flowEnd.x)) {\\n translateX = $$.x(orgDomain[0]) - $$.x(domain[0]);\\n } else {\\n if ($$.isTimeSeries()) {\\n translateX = $$.x(orgDomain[0]) - $$.x(domain[0]);\\n } else {\\n translateX = $$.x(flowStart.x) - $$.x(flowEnd.x);\\n }\\n }\\n scaleX = diffDomain(orgDomain) / diffDomain(domain);\\n transform = 'translate(' + translateX + ',0) scale(' + scaleX + ',1)';\\n\\n $$.hideXGridFocus();\\n\\n d3.transition()\\n .ease('linear')\\n .duration(durationForFlow)\\n .each(function() {\\n wait.add($$.axes.x.transition().call($$.xAxis));\\n wait.add(mainBar.transition().attr('transform', transform));\\n wait.add(mainLine.transition().attr('transform', transform));\\n wait.add(mainArea.transition().attr('transform', transform));\\n wait.add(mainCircle.transition().attr('transform', transform));\\n wait.add(mainText.transition().attr('transform', transform));\\n wait.add(\\n mainRegion\\n .filter($$.isRegionOnX)\\n .transition()\\n .attr('transform', transform)\\n );\\n wait.add(xgrid.transition().attr('transform', transform));\\n wait.add(xgridLines.transition().attr('transform', transform));\\n })\\n .call(wait, function() {\\n var i,\\n shapes = [],\\n texts = [],\\n eventRects = [];\\n\\n // remove flowed elements\\n if (flowLength) {\\n for (i = 0; i < flowLength; i++) {\\n shapes.push('.' + CLASS.shape + '-' + (flowIndex + i));\\n texts.push('.' + CLASS.text + '-' + (flowIndex + i));\\n eventRects.push('.' + CLASS.eventRect + '-' + (flowIndex + i));\\n }\\n $$.svg\\n .selectAll('.' + CLASS.shapes)\\n .selectAll(shapes)\\n .remove();\\n $$.svg\\n .selectAll('.' + CLASS.texts)\\n .selectAll(texts)\\n .remove();\\n $$.svg\\n .selectAll('.' + CLASS.eventRects)\\n .selectAll(eventRects)\\n .remove();\\n $$.svg.select('.' + CLASS.xgrid).remove();\\n }\\n\\n // draw again for removing flowed elements and reverting attr\\n xgrid.attr('transform', null).attr($$.xgridAttr);\\n xgridLines.attr('transform', null);\\n xgridLines\\n .select('line')\\n .attr('x1', config.axis_rotated ? 0 : xv)\\n .attr('x2', config.axis_rotated ? $$.width : xv);\\n xgridLines\\n .select('text')\\n .attr('x', config.axis_rotated ? $$.width : 0)\\n .attr('y', xv);\\n mainBar.attr('transform', null).attr('d', drawBar);\\n mainLine.attr('transform', null).attr('d', drawLine);\\n mainArea.attr('transform', null).attr('d', drawArea);\\n mainCircle\\n .attr('transform', null)\\n .attr('cx', cx)\\n .attr('cy', cy);\\n mainText\\n .attr('transform', null)\\n .attr('x', xForText)\\n .attr('y', yForText)\\n .style('fill-opacity', $$.opacityForText.bind($$));\\n mainRegion.attr('transform', null);\\n mainRegion\\n .select('rect')\\n .filter($$.isRegionOnX)\\n .attr('x', $$.regionX.bind($$))\\n .attr('width', $$.regionWidth.bind($$));\\n\\n if (config.interaction_enabled) {\\n $$.redrawEventRect();\\n }\\n\\n // callback for end of flow\\n done();\\n\\n $$.flowing = false;\\n });\\n };\\n };\\n\\n c3_chart_fn.selected = function(targetId) {\\n var $$ = this.internal,\\n d3 = $$.d3;\\n return d3.merge(\\n $$.main\\n .selectAll('.' + CLASS.shapes + $$.getTargetSelectorSuffix(targetId))\\n .selectAll('.' + CLASS.shape)\\n .filter(function() {\\n return d3.select(this).classed(CLASS.SELECTED);\\n })\\n .map(function(d) {\\n return d.map(function(d) {\\n var data = d.__data__;\\n return data.data ? data.data : data;\\n });\\n })\\n );\\n };\\n c3_chart_fn.select = function(ids, indices, resetOther) {\\n var $$ = this.internal,\\n d3 = $$.d3,\\n config = $$.config;\\n if (!config.data_selection_enabled) {\\n return;\\n }\\n $$.main\\n .selectAll('.' + CLASS.shapes)\\n .selectAll('.' + CLASS.shape)\\n .each(function(d, i) {\\n var shape = d3.select(this),\\n id = d.data ? d.data.id : d.id,\\n toggle = $$.getToggle(this, d).bind($$),\\n isTargetId = config.data_selection_grouped || !ids || ids.indexOf(id) >= 0,\\n isTargetIndex = !indices || indices.indexOf(i) >= 0,\\n isSelected = shape.classed(CLASS.SELECTED);\\n // line/area selection not supported yet\\n if (shape.classed(CLASS.line) || shape.classed(CLASS.area)) {\\n return;\\n }\\n if (isTargetId && isTargetIndex) {\\n if (config.data_selection_isselectable(d) && !isSelected) {\\n toggle(true, shape.classed(CLASS.SELECTED, true), d, i);\\n }\\n } else if (isDefined(resetOther) && resetOther) {\\n if (isSelected) {\\n toggle(false, shape.classed(CLASS.SELECTED, false), d, i);\\n }\\n }\\n });\\n };\\n c3_chart_fn.unselect = function(ids, indices) {\\n var $$ = this.internal,\\n d3 = $$.d3,\\n config = $$.config;\\n if (!config.data_selection_enabled) {\\n return;\\n }\\n $$.main\\n .selectAll('.' + CLASS.shapes)\\n .selectAll('.' + CLASS.shape)\\n .each(function(d, i) {\\n var shape = d3.select(this),\\n id = d.data ? d.data.id : d.id,\\n toggle = $$.getToggle(this, d).bind($$),\\n isTargetId = config.data_selection_grouped || !ids || ids.indexOf(id) >= 0,\\n isTargetIndex = !indices || indices.indexOf(i) >= 0,\\n isSelected = shape.classed(CLASS.SELECTED);\\n // line/area selection not supported yet\\n if (shape.classed(CLASS.line) || shape.classed(CLASS.area)) {\\n return;\\n }\\n if (isTargetId && isTargetIndex) {\\n if (config.data_selection_isselectable(d)) {\\n if (isSelected) {\\n toggle(false, shape.classed(CLASS.SELECTED, false), d, i);\\n }\\n }\\n }\\n });\\n };\\n\\n c3_chart_fn.transform = function(type, targetIds) {\\n var $$ = this.internal,\\n options = ['pie', 'donut'].indexOf(type) >= 0 ? { withTransform: true } : null;\\n $$.transformTo(targetIds, type, options);\\n };\\n\\n c3_chart_internal_fn.transformTo = function(targetIds, type, optionsForRedraw) {\\n var $$ = this,\\n withTransitionForAxis = !$$.hasArcType(),\\n options = optionsForRedraw || { withTransitionForAxis: withTransitionForAxis };\\n options.withTransitionForTransform = false;\\n $$.transiting = false;\\n $$.setTargetType(targetIds, type);\\n $$.updateTargets($$.data.targets); // this is needed when transforming to arc\\n $$.updateAndRedraw(options);\\n };\\n\\n c3_chart_fn.groups = function(groups) {\\n var $$ = this.internal,\\n config = $$.config;\\n if (isUndefined(groups)) {\\n return config.data_groups;\\n }\\n config.data_groups = groups;\\n $$.redraw();\\n return config.data_groups;\\n };\\n\\n c3_chart_fn.xgrids = function(grids) {\\n var $$ = this.internal,\\n config = $$.config;\\n if (!grids) {\\n return config.grid_x_lines;\\n }\\n config.grid_x_lines = grids;\\n $$.redrawWithoutRescale();\\n return config.grid_x_lines;\\n };\\n c3_chart_fn.xgrids.add = function(grids) {\\n var $$ = this.internal;\\n return this.xgrids($$.config.grid_x_lines.concat(grids ? grids : []));\\n };\\n c3_chart_fn.xgrids.remove = function(params) {\\n // TODO: multiple\\n var $$ = this.internal;\\n $$.removeGridLines(params, true);\\n };\\n\\n c3_chart_fn.ygrids = function(grids) {\\n var $$ = this.internal,\\n config = $$.config;\\n if (!grids) {\\n return config.grid_y_lines;\\n }\\n config.grid_y_lines = grids;\\n $$.redrawWithoutRescale();\\n return config.grid_y_lines;\\n };\\n c3_chart_fn.ygrids.add = function(grids) {\\n var $$ = this.internal;\\n return this.ygrids($$.config.grid_y_lines.concat(grids ? grids : []));\\n };\\n c3_chart_fn.ygrids.remove = function(params) {\\n // TODO: multiple\\n var $$ = this.internal;\\n $$.removeGridLines(params, false);\\n };\\n\\n c3_chart_fn.regions = function(regions) {\\n var $$ = this.internal,\\n config = $$.config;\\n if (!regions) {\\n return config.regions;\\n }\\n config.regions = regions;\\n $$.redrawWithoutRescale();\\n return config.regions;\\n };\\n c3_chart_fn.regions.add = function(regions) {\\n var $$ = this.internal,\\n config = $$.config;\\n if (!regions) {\\n return config.regions;\\n }\\n config.regions = config.regions.concat(regions);\\n $$.redrawWithoutRescale();\\n return config.regions;\\n };\\n c3_chart_fn.regions.remove = function(options) {\\n var $$ = this.internal,\\n config = $$.config,\\n duration,\\n classes,\\n regions;\\n\\n options = options || {};\\n duration = $$.getOption(options, 'duration', config.transition_duration);\\n classes = $$.getOption(options, 'classes', [CLASS.region]);\\n\\n regions = $$.main.select('.' + CLASS.regions).selectAll(\\n classes.map(function(c) {\\n return '.' + c;\\n })\\n );\\n (duration ? regions.transition().duration(duration) : regions).style('opacity', 0).remove();\\n\\n config.regions = config.regions.filter(function(region) {\\n var found = false;\\n if (!region['class']) {\\n return true;\\n }\\n region['class'].split(' ').forEach(function(c) {\\n if (classes.indexOf(c) >= 0) {\\n found = true;\\n }\\n });\\n return !found;\\n });\\n\\n return config.regions;\\n };\\n\\n c3_chart_fn.data = function(targetIds) {\\n var targets = this.internal.data.targets;\\n return typeof targetIds === 'undefined'\\n ? targets\\n : targets.filter(function(t) {\\n return [].concat(targetIds).indexOf(t.id) >= 0;\\n });\\n };\\n c3_chart_fn.data.shown = function(targetIds) {\\n return this.internal.filterTargetsToShow(this.data(targetIds));\\n };\\n c3_chart_fn.data.values = function(targetId) {\\n var targets,\\n values = null;\\n if (targetId) {\\n targets = this.data(targetId);\\n values = targets[0]\\n ? targets[0].values.map(function(d) {\\n return d.value;\\n })\\n : null;\\n }\\n return values;\\n };\\n c3_chart_fn.data.names = function(names) {\\n this.internal.clearLegendItemTextBoxCache();\\n return this.internal.updateDataAttributes('names', names);\\n };\\n c3_chart_fn.data.colors = function(colors) {\\n return this.internal.updateDataAttributes('colors', colors);\\n };\\n c3_chart_fn.data.axes = function(axes) {\\n return this.internal.updateDataAttributes('axes', axes);\\n };\\n\\n c3_chart_fn.category = function(i, category) {\\n var $$ = this.internal,\\n config = $$.config;\\n if (arguments.length > 1) {\\n config.axis_x_categories[i] = category;\\n $$.redraw();\\n }\\n return config.axis_x_categories[i];\\n };\\n c3_chart_fn.categories = function(categories) {\\n var $$ = this.internal,\\n config = $$.config;\\n if (!arguments.length) {\\n return config.axis_x_categories;\\n }\\n config.axis_x_categories = categories;\\n $$.redraw();\\n return config.axis_x_categories;\\n };\\n\\n // TODO: fix\\n c3_chart_fn.color = function(id) {\\n var $$ = this.internal;\\n return $$.color(id); // more patterns\\n };\\n\\n c3_chart_fn.x = function(x) {\\n var $$ = this.internal;\\n if (arguments.length) {\\n $$.updateTargetX($$.data.targets, x);\\n $$.redraw({ withUpdateOrgXDomain: true, withUpdateXDomain: true });\\n }\\n return $$.data.xs;\\n };\\n c3_chart_fn.xs = function(xs) {\\n var $$ = this.internal;\\n if (arguments.length) {\\n $$.updateTargetXs($$.data.targets, xs);\\n $$.redraw({ withUpdateOrgXDomain: true, withUpdateXDomain: true });\\n }\\n return $$.data.xs;\\n };\\n\\n c3_chart_fn.axis = function() {};\\n c3_chart_fn.axis.labels = function(labels) {\\n var $$ = this.internal;\\n if (arguments.length) {\\n Object.keys(labels).forEach(function(axisId) {\\n $$.axis.setLabelText(axisId, labels[axisId]);\\n });\\n $$.axis.updateLabels();\\n }\\n // TODO: return some values?\\n };\\n c3_chart_fn.axis.max = function(max) {\\n var $$ = this.internal,\\n config = $$.config;\\n if (arguments.length) {\\n if (typeof max === 'object') {\\n if (isValue(max.x)) {\\n config.axis_x_max = max.x;\\n }\\n if (isValue(max.y)) {\\n config.axis_y_max = max.y;\\n }\\n if (isValue(max.y2)) {\\n config.axis_y2_max = max.y2;\\n }\\n } else {\\n config.axis_y_max = config.axis_y2_max = max;\\n }\\n $$.redraw({ withUpdateOrgXDomain: true, withUpdateXDomain: true });\\n } else {\\n return {\\n x: config.axis_x_max,\\n y: config.axis_y_max,\\n y2: config.axis_y2_max\\n };\\n }\\n };\\n c3_chart_fn.axis.min = function(min) {\\n var $$ = this.internal,\\n config = $$.config;\\n if (arguments.length) {\\n if (typeof min === 'object') {\\n if (isValue(min.x)) {\\n config.axis_x_min = min.x;\\n }\\n if (isValue(min.y)) {\\n config.axis_y_min = min.y;\\n }\\n if (isValue(min.y2)) {\\n config.axis_y2_min = min.y2;\\n }\\n } else {\\n config.axis_y_min = config.axis_y2_min = min;\\n }\\n $$.redraw({ withUpdateOrgXDomain: true, withUpdateXDomain: true });\\n } else {\\n return {\\n x: config.axis_x_min,\\n y: config.axis_y_min,\\n y2: config.axis_y2_min\\n };\\n }\\n };\\n c3_chart_fn.axis.range = function(range) {\\n if (arguments.length) {\\n if (isDefined(range.max)) {\\n this.axis.max(range.max);\\n }\\n if (isDefined(range.min)) {\\n this.axis.min(range.min);\\n }\\n } else {\\n return {\\n max: this.axis.max(),\\n min: this.axis.min()\\n };\\n }\\n };\\n\\n c3_chart_fn.legend = function() {};\\n c3_chart_fn.legend.show = function(targetIds) {\\n var $$ = this.internal;\\n $$.showLegend($$.mapToTargetIds(targetIds));\\n $$.updateAndRedraw({ withLegend: true });\\n };\\n c3_chart_fn.legend.hide = function(targetIds) {\\n var $$ = this.internal;\\n $$.hideLegend($$.mapToTargetIds(targetIds));\\n $$.updateAndRedraw({ withLegend: true });\\n };\\n\\n c3_chart_fn.resize = function(size) {\\n var $$ = this.internal,\\n config = $$.config;\\n config.size_width = size ? size.width : null;\\n config.size_height = size ? size.height : null;\\n this.flush();\\n };\\n\\n c3_chart_fn.flush = function() {\\n var $$ = this.internal;\\n $$.updateAndRedraw({ withLegend: true, withTransition: false, withTransitionForTransform: false });\\n };\\n\\n c3_chart_fn.destroy = function() {\\n var $$ = this.internal;\\n\\n window.clearInterval($$.intervalForObserveInserted);\\n\\n if ($$.resizeTimeout !== undefined) {\\n window.clearTimeout($$.resizeTimeout);\\n }\\n\\n if (window.detachEvent) {\\n window.detachEvent('onresize', $$.resizeFunction);\\n } else if (window.removeEventListener) {\\n window.removeEventListener('resize', $$.resizeFunction);\\n } else {\\n var wrapper = window.onresize;\\n // check if no one else removed our wrapper and remove our resizeFunction from it\\n if (wrapper && wrapper.add && wrapper.remove) {\\n wrapper.remove($$.resizeFunction);\\n }\\n }\\n\\n $$.selectChart.classed('c3', false).html('');\\n\\n // MEMO: this is needed because the reference of some elements will not be released, then memory leak will happen.\\n Object.keys($$).forEach(function(key) {\\n $$[key] = null;\\n });\\n\\n return null;\\n };\\n\\n c3_chart_fn.tooltip = function() {};\\n c3_chart_fn.tooltip.show = function(args) {\\n var $$ = this.internal,\\n index,\\n mouse;\\n\\n // determine mouse position on the chart\\n if (args.mouse) {\\n mouse = args.mouse;\\n }\\n\\n // determine focus data\\n if (args.data) {\\n if ($$.isMultipleX()) {\\n // if multiple xs, target point will be determined by mouse\\n mouse = [$$.x(args.data.x), $$.getYScale(args.data.id)(args.data.value)];\\n index = null;\\n } else {\\n // TODO: when tooltip_grouped = false\\n index = isValue(args.data.index) ? args.data.index : $$.getIndexByX(args.data.x);\\n }\\n } else if (typeof args.x !== 'undefined') {\\n index = $$.getIndexByX(args.x);\\n } else if (typeof args.index !== 'undefined') {\\n index = args.index;\\n }\\n\\n // emulate mouse events to show\\n $$.dispatchEvent('mouseover', index, mouse);\\n $$.dispatchEvent('mousemove', index, mouse);\\n\\n $$.config.tooltip_onshow.call($$, args.data);\\n };\\n c3_chart_fn.tooltip.hide = function() {\\n // TODO: get target data by checking the state of focus\\n this.internal.dispatchEvent('mouseout', 0);\\n\\n this.internal.config.tooltip_onhide.call(this);\\n };\\n\\n // Features:\\n // 1. category axis\\n // 2. ceil values of translate/x/y to int for half pixel antialiasing\\n // 3. multiline tick text\\n var tickTextCharSize;\\n\\n function c3_axis(d3, params) {\\n var scale = d3.scale.linear(),\\n orient = 'bottom',\\n innerTickSize = 6,\\n outerTickSize,\\n tickPadding = 3,\\n tickValues = null,\\n tickFormat,\\n tickArguments;\\n\\n var tickOffset = 0,\\n tickCulling = true,\\n tickCentered;\\n\\n params = params || {};\\n outerTickSize = params.withOuterTick ? 6 : 0;\\n\\n function axisX(selection, x) {\\n selection.attr('transform', function(d) {\\n return 'translate(' + Math.ceil(x(d) + tickOffset) + ', 0)';\\n });\\n }\\n\\n function axisY(selection, y) {\\n selection.attr('transform', function(d) {\\n return 'translate(0,' + Math.ceil(y(d)) + ')';\\n });\\n }\\n\\n function scaleExtent(domain) {\\n var start = domain[0],\\n stop = domain[domain.length - 1];\\n return start < stop ? [start, stop] : [stop, start];\\n }\\n\\n function generateTicks(scale) {\\n var i,\\n domain,\\n ticks = [];\\n if (scale.ticks) {\\n return scale.ticks.apply(scale, tickArguments);\\n }\\n domain = scale.domain();\\n for (i = Math.ceil(domain[0]); i < domain[1]; i++) {\\n ticks.push(i);\\n }\\n if (ticks.length > 0 && ticks[0] > 0) {\\n ticks.unshift(ticks[0] - (ticks[1] - ticks[0]));\\n }\\n return ticks;\\n }\\n\\n function copyScale() {\\n var newScale = scale.copy(),\\n domain;\\n if (params.isCategory) {\\n domain = scale.domain();\\n newScale.domain([domain[0], domain[1] - 1]);\\n }\\n return newScale;\\n }\\n\\n function textFormatted(v) {\\n var formatted = tickFormat ? tickFormat(v) : v;\\n return typeof formatted !== 'undefined' ? formatted : '';\\n }\\n\\n function getSizeFor1Char(tick) {\\n if (tickTextCharSize) {\\n return tickTextCharSize;\\n }\\n var size = {\\n h: 11.5,\\n w: 5.5\\n };\\n tick\\n .select('text')\\n .text(textFormatted)\\n .each(function(d) {\\n var box = this.getBoundingClientRect(),\\n text = textFormatted(d),\\n h = box.height,\\n w = text ? box.width / text.length : undefined;\\n if (h && w) {\\n size.h = h;\\n size.w = w;\\n }\\n })\\n .text('');\\n tickTextCharSize = size;\\n return size;\\n }\\n\\n function transitionise(selection) {\\n return params.withoutTransition ? selection : d3.transition(selection);\\n }\\n\\n function axis(g) {\\n g.each(function() {\\n var g = (axis.g = d3.select(this));\\n\\n var scale0 = this.__chart__ || scale,\\n scale1 = (this.__chart__ = copyScale());\\n\\n var ticks = tickValues ? tickValues : generateTicks(scale1),\\n tick = g.selectAll('.tick').data(ticks, scale1),\\n tickEnter = tick\\n .enter()\\n .insert('g', '.domain')\\n .attr('class', 'tick')\\n .style('opacity', 1e-6),\\n // MEMO: No exit transition. The reason is this transition affects max tick width calculation because old tick will be included in the ticks.\\n tickExit = tick.exit().remove(),\\n tickUpdate = transitionise(tick).style('opacity', 1),\\n tickTransform,\\n tickX,\\n tickY;\\n\\n var range = scale.rangeExtent ? scale.rangeExtent() : scaleExtent(scale.range()),\\n path = g.selectAll('.domain').data([0]),\\n pathUpdate = (path\\n .enter()\\n .append('path')\\n .attr('class', 'domain'),\\n transitionise(path));\\n tickEnter.append('line');\\n tickEnter.append('text');\\n\\n var lineEnter = tickEnter.select('line'),\\n lineUpdate = tickUpdate.select('line'),\\n textEnter = tickEnter.select('text'),\\n textUpdate = tickUpdate.select('text');\\n\\n if (params.isCategory) {\\n tickOffset = Math.ceil((scale1(1) - scale1(0)) / 2);\\n tickX = tickCentered ? 0 : tickOffset;\\n tickY = tickCentered ? tickOffset : 0;\\n } else {\\n tickOffset = tickX = 0;\\n }\\n\\n var text,\\n tspan,\\n sizeFor1Char = getSizeFor1Char(g.select('.tick')),\\n counts = [];\\n var tickLength = Math.max(innerTickSize, 0) + tickPadding,\\n isVertical = orient === 'left' || orient === 'right';\\n\\n // this should be called only when category axis\\n function splitTickText(d, maxWidth) {\\n var tickText = textFormatted(d),\\n subtext,\\n spaceIndex,\\n textWidth,\\n splitted = [];\\n\\n if (Object.prototype.toString.call(tickText) === '[object Array]') {\\n return tickText;\\n }\\n\\n if (!maxWidth || maxWidth <= 0) {\\n maxWidth = isVertical ? 95 : params.isCategory ? Math.ceil(scale1(ticks[1]) - scale1(ticks[0])) - 12 : 110;\\n }\\n\\n function split(splitted, text) {\\n spaceIndex = undefined;\\n for (var i = 1; i < text.length; i++) {\\n if (text.charAt(i) === ' ') {\\n spaceIndex = i;\\n }\\n subtext = text.substr(0, i + 1);\\n textWidth = sizeFor1Char.w * subtext.length;\\n // if text width gets over tick width, split by space index or crrent index\\n if (maxWidth < textWidth) {\\n return split(\\n splitted.concat(text.substr(0, spaceIndex ? spaceIndex : i)),\\n text.slice(spaceIndex ? spaceIndex + 1 : i)\\n );\\n }\\n }\\n return splitted.concat(text);\\n }\\n\\n return split(splitted, tickText + '');\\n }\\n\\n function tspanDy(d, i) {\\n var dy = sizeFor1Char.h;\\n if (i === 0) {\\n if (orient === 'left' || orient === 'right') {\\n dy = -((counts[d.index] - 1) * (sizeFor1Char.h / 2) - 3);\\n } else {\\n dy = '.71em';\\n }\\n }\\n return dy;\\n }\\n\\n function tickSize(d) {\\n var tickPosition = scale(d) + (tickCentered ? 0 : tickOffset);\\n return range[0] < tickPosition && tickPosition < range[1] ? innerTickSize : 0;\\n }\\n\\n text = tick.select('text');\\n tspan = text.selectAll('tspan').data(function(d, i) {\\n var splitted = params.tickMultiline ? splitTickText(d, params.tickWidth) : [].concat(textFormatted(d));\\n counts[i] = splitted.length;\\n return splitted.map(function(s) {\\n return { index: i, splitted: s };\\n });\\n });\\n tspan.enter().append('tspan');\\n tspan.exit().remove();\\n tspan.text(function(d) {\\n return d.splitted;\\n });\\n\\n var rotate = params.tickTextRotate;\\n\\n function textAnchorForText(rotate) {\\n if (!rotate) {\\n return 'middle';\\n }\\n return rotate > 0 ? 'start' : 'end';\\n }\\n\\n function textTransform(rotate) {\\n if (!rotate) {\\n return '';\\n }\\n return 'rotate(' + rotate + ')';\\n }\\n\\n function dxForText(rotate) {\\n if (!rotate) {\\n return 0;\\n }\\n return 8 * Math.sin(Math.PI * (rotate / 180));\\n }\\n\\n function yForText(rotate) {\\n if (!rotate) {\\n return tickLength;\\n }\\n return 11.5 - 2.5 * (rotate / 15) * (rotate > 0 ? 1 : -1);\\n }\\n\\n switch (orient) {\\n case 'bottom': {\\n tickTransform = axisX;\\n lineEnter.attr('y2', innerTickSize);\\n textEnter.attr('y', tickLength);\\n lineUpdate\\n .attr('x1', tickX)\\n .attr('x2', tickX)\\n .attr('y2', tickSize);\\n textUpdate\\n .attr('x', 0)\\n .attr('y', yForText(rotate))\\n .style('text-anchor', textAnchorForText(rotate))\\n .attr('transform', textTransform(rotate));\\n tspan\\n .attr('x', 0)\\n .attr('dy', tspanDy)\\n .attr('dx', dxForText(rotate));\\n pathUpdate.attr('d', 'M' + range[0] + ',' + outerTickSize + 'V0H' + range[1] + 'V' + outerTickSize);\\n break;\\n }\\n case 'top': {\\n // TODO: rotated tick text\\n tickTransform = axisX;\\n lineEnter.attr('y2', -innerTickSize);\\n textEnter.attr('y', -tickLength);\\n lineUpdate.attr('x2', 0).attr('y2', -innerTickSize);\\n textUpdate.attr('x', 0).attr('y', -tickLength);\\n text.style('text-anchor', 'middle');\\n tspan.attr('x', 0).attr('dy', '0em');\\n pathUpdate.attr('d', 'M' + range[0] + ',' + -outerTickSize + 'V0H' + range[1] + 'V' + -outerTickSize);\\n break;\\n }\\n case 'left': {\\n tickTransform = axisY;\\n lineEnter.attr('x2', -innerTickSize);\\n textEnter.attr('x', -tickLength);\\n lineUpdate\\n .attr('x2', -innerTickSize)\\n .attr('y1', tickY)\\n .attr('y2', tickY);\\n textUpdate.attr('x', -tickLength).attr('y', tickOffset);\\n text.style('text-anchor', 'end');\\n tspan.attr('x', -tickLength).attr('dy', tspanDy);\\n pathUpdate.attr('d', 'M' + -outerTickSize + ',' + range[0] + 'H0V' + range[1] + 'H' + -outerTickSize);\\n break;\\n }\\n case 'right': {\\n tickTransform = axisY;\\n lineEnter.attr('x2', innerTickSize);\\n textEnter.attr('x', tickLength);\\n lineUpdate.attr('x2', innerTickSize).attr('y2', 0);\\n textUpdate.attr('x', tickLength).attr('y', 0);\\n text.style('text-anchor', 'start');\\n tspan.attr('x', tickLength).attr('dy', tspanDy);\\n pathUpdate.attr('d', 'M' + outerTickSize + ',' + range[0] + 'H0V' + range[1] + 'H' + outerTickSize);\\n break;\\n }\\n }\\n if (scale1.rangeBand) {\\n var x = scale1,\\n dx = x.rangeBand() / 2;\\n scale0 = scale1 = function(d) {\\n return x(d) + dx;\\n };\\n } else if (scale0.rangeBand) {\\n scale0 = scale1;\\n } else {\\n tickExit.call(tickTransform, scale1);\\n }\\n tickEnter.call(tickTransform, scale0);\\n tickUpdate.call(tickTransform, scale1);\\n });\\n }\\n\\n axis.scale = function(x) {\\n if (!arguments.length) {\\n return scale;\\n }\\n scale = x;\\n return axis;\\n };\\n axis.orient = function(x) {\\n if (!arguments.length) {\\n return orient;\\n }\\n orient = x in { top: 1, right: 1, bottom: 1, left: 1 } ? x + '' : 'bottom';\\n return axis;\\n };\\n axis.tickFormat = function(format) {\\n if (!arguments.length) {\\n return tickFormat;\\n }\\n tickFormat = format;\\n return axis;\\n };\\n axis.tickCentered = function(isCentered) {\\n if (!arguments.length) {\\n return tickCentered;\\n }\\n tickCentered = isCentered;\\n return axis;\\n };\\n axis.tickOffset = function() {\\n return tickOffset;\\n };\\n axis.tickInterval = function() {\\n var interval, length;\\n if (params.isCategory) {\\n interval = tickOffset * 2;\\n } else {\\n length =\\n axis.g\\n .select('path.domain')\\n .node()\\n .getTotalLength() -\\n outerTickSize * 2;\\n interval = length / axis.g.selectAll('line').size();\\n }\\n return interval === Infinity ? 0 : interval;\\n };\\n axis.ticks = function() {\\n if (!arguments.length) {\\n return tickArguments;\\n }\\n tickArguments = arguments;\\n return axis;\\n };\\n axis.tickCulling = function(culling) {\\n if (!arguments.length) {\\n return tickCulling;\\n }\\n tickCulling = culling;\\n return axis;\\n };\\n axis.tickValues = function(x) {\\n if (typeof x === 'function') {\\n tickValues = function() {\\n return x(scale.domain());\\n };\\n } else {\\n if (!arguments.length) {\\n return tickValues;\\n }\\n tickValues = x;\\n }\\n return axis;\\n };\\n return axis;\\n }\\n\\n c3_chart_internal_fn.isSafari = function() {\\n var ua = window.navigator.userAgent;\\n return ua.indexOf('Safari') >= 0 && ua.indexOf('Chrome') < 0;\\n };\\n c3_chart_internal_fn.isChrome = function() {\\n var ua = window.navigator.userAgent;\\n return ua.indexOf('Chrome') >= 0;\\n };\\n\\n /* jshint ignore:start */\\n\\n // PhantomJS doesn't have support for Function.prototype.bind, which has caused confusion. Use\\n // this polyfill to avoid the confusion.\\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind#Polyfill\\n\\n if (!Function.prototype.bind) {\\n Function.prototype.bind = function(oThis) {\\n if (typeof this !== 'function') {\\n // closest thing possible to the ECMAScript 5\\n // internal IsCallable function\\n throw new TypeError('Function.prototype.bind - what is trying to be bound is not callable');\\n }\\n\\n var aArgs = Array.prototype.slice.call(arguments, 1),\\n fToBind = this,\\n fNOP = function() {},\\n fBound = function() {\\n return fToBind.apply(\\n this instanceof fNOP ? this : oThis,\\n aArgs.concat(Array.prototype.slice.call(arguments))\\n );\\n };\\n\\n fNOP.prototype = this.prototype;\\n fBound.prototype = new fNOP();\\n\\n return fBound;\\n };\\n }\\n\\n //SVGPathSeg API polyfill\\n //https://github.com/progers/pathseg\\n //\\n //This is a drop-in replacement for the SVGPathSeg and SVGPathSegList APIs that were removed from\\n //SVG2 (https://lists.w3.org/Archives/Public/www-svg/2015Jun/0044.html), including the latest spec\\n //changes which were implemented in Firefox 43 and Chrome 46.\\n //Chrome 48 removes these APIs, so this polyfill is required.\\n\\n (function() {\\n 'use strict';\\n if (!('SVGPathSeg' in window)) {\\n // Spec: http://www.w3.org/TR/SVG11/single-page.html#paths-InterfaceSVGPathSeg\\n window.SVGPathSeg = function(type, typeAsLetter, owningPathSegList) {\\n this.pathSegType = type;\\n this.pathSegTypeAsLetter = typeAsLetter;\\n this._owningPathSegList = owningPathSegList;\\n };\\n\\n SVGPathSeg.PATHSEG_UNKNOWN = 0;\\n SVGPathSeg.PATHSEG_CLOSEPATH = 1;\\n SVGPathSeg.PATHSEG_MOVETO_ABS = 2;\\n SVGPathSeg.PATHSEG_MOVETO_REL = 3;\\n SVGPathSeg.PATHSEG_LINETO_ABS = 4;\\n SVGPathSeg.PATHSEG_LINETO_REL = 5;\\n SVGPathSeg.PATHSEG_CURVETO_CUBIC_ABS = 6;\\n SVGPathSeg.PATHSEG_CURVETO_CUBIC_REL = 7;\\n SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_ABS = 8;\\n SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_REL = 9;\\n SVGPathSeg.PATHSEG_ARC_ABS = 10;\\n SVGPathSeg.PATHSEG_ARC_REL = 11;\\n SVGPathSeg.PATHSEG_LINETO_HORIZONTAL_ABS = 12;\\n SVGPathSeg.PATHSEG_LINETO_HORIZONTAL_REL = 13;\\n SVGPathSeg.PATHSEG_LINETO_VERTICAL_ABS = 14;\\n SVGPathSeg.PATHSEG_LINETO_VERTICAL_REL = 15;\\n SVGPathSeg.PATHSEG_CURVETO_CUBIC_SMOOTH_ABS = 16;\\n SVGPathSeg.PATHSEG_CURVETO_CUBIC_SMOOTH_REL = 17;\\n SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_SMOOTH_ABS = 18;\\n SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_SMOOTH_REL = 19;\\n\\n // Notify owning PathSegList on any changes so they can be synchronized back to the path element.\\n SVGPathSeg.prototype._segmentChanged = function() {\\n if (this._owningPathSegList) this._owningPathSegList.segmentChanged(this);\\n };\\n\\n window.SVGPathSegClosePath = function(owningPathSegList) {\\n SVGPathSeg.call(this, SVGPathSeg.PATHSEG_CLOSEPATH, 'z', owningPathSegList);\\n };\\n SVGPathSegClosePath.prototype = Object.create(SVGPathSeg.prototype);\\n SVGPathSegClosePath.prototype.toString = function() {\\n return '[object SVGPathSegClosePath]';\\n };\\n SVGPathSegClosePath.prototype._asPathString = function() {\\n return this.pathSegTypeAsLetter;\\n };\\n SVGPathSegClosePath.prototype.clone = function() {\\n return new SVGPathSegClosePath(undefined);\\n };\\n\\n window.SVGPathSegMovetoAbs = function(owningPathSegList, x, y) {\\n SVGPathSeg.call(this, SVGPathSeg.PATHSEG_MOVETO_ABS, 'M', owningPathSegList);\\n this._x = x;\\n this._y = y;\\n };\\n SVGPathSegMovetoAbs.prototype = Object.create(SVGPathSeg.prototype);\\n SVGPathSegMovetoAbs.prototype.toString = function() {\\n return '[object SVGPathSegMovetoAbs]';\\n };\\n SVGPathSegMovetoAbs.prototype._asPathString = function() {\\n return this.pathSegTypeAsLetter + ' ' + this._x + ' ' + this._y;\\n };\\n SVGPathSegMovetoAbs.prototype.clone = function() {\\n return new SVGPathSegMovetoAbs(undefined, this._x, this._y);\\n };\\n Object.defineProperty(SVGPathSegMovetoAbs.prototype, 'x', {\\n get: function() {\\n return this._x;\\n },\\n set: function(x) {\\n this._x = x;\\n this._segmentChanged();\\n },\\n enumerable: true\\n });\\n Object.defineProperty(SVGPathSegMovetoAbs.prototype, 'y', {\\n get: function() {\\n return this._y;\\n },\\n set: function(y) {\\n this._y = y;\\n this._segmentChanged();\\n },\\n enumerable: true\\n });\\n\\n window.SVGPathSegMovetoRel = function(owningPathSegList, x, y) {\\n SVGPathSeg.call(this, SVGPathSeg.PATHSEG_MOVETO_REL, 'm', owningPathSegList);\\n this._x = x;\\n this._y = y;\\n };\\n SVGPathSegMovetoRel.prototype = Object.create(SVGPathSeg.prototype);\\n SVGPathSegMovetoRel.prototype.toString = function() {\\n return '[object SVGPathSegMovetoRel]';\\n };\\n SVGPathSegMovetoRel.prototype._asPathString = function() {\\n return this.pathSegTypeAsLetter + ' ' + this._x + ' ' + this._y;\\n };\\n SVGPathSegMovetoRel.prototype.clone = function() {\\n return new SVGPathSegMovetoRel(undefined, this._x, this._y);\\n };\\n Object.defineProperty(SVGPathSegMovetoRel.prototype, 'x', {\\n get: function() {\\n return this._x;\\n },\\n set: function(x) {\\n this._x = x;\\n this._segmentChanged();\\n },\\n enumerable: true\\n });\\n Object.defineProperty(SVGPathSegMovetoRel.prototype, 'y', {\\n get: function() {\\n return this._y;\\n },\\n set: function(y) {\\n this._y = y;\\n this._segmentChanged();\\n },\\n enumerable: true\\n });\\n\\n window.SVGPathSegLinetoAbs = function(owningPathSegList, x, y) {\\n SVGPathSeg.call(this, SVGPathSeg.PATHSEG_LINETO_ABS, 'L', owningPathSegList);\\n this._x = x;\\n this._y = y;\\n };\\n SVGPathSegLinetoAbs.prototype = Object.create(SVGPathSeg.prototype);\\n SVGPathSegLinetoAbs.prototype.toString = function() {\\n return '[object SVGPathSegLinetoAbs]';\\n };\\n SVGPathSegLinetoAbs.prototype._asPathString = function() {\\n return this.pathSegTypeAsLetter + ' ' + this._x + ' ' + this._y;\\n };\\n SVGPathSegLinetoAbs.prototype.clone = function() {\\n return new SVGPathSegLinetoAbs(undefined, this._x, this._y);\\n };\\n Object.defineProperty(SVGPathSegLinetoAbs.prototype, 'x', {\\n get: function() {\\n return this._x;\\n },\\n set: function(x) {\\n this._x = x;\\n this._segmentChanged();\\n },\\n enumerable: true\\n });\\n Object.defineProperty(SVGPathSegLinetoAbs.prototype, 'y', {\\n get: function() {\\n return this._y;\\n },\\n set: function(y) {\\n this._y = y;\\n this._segmentChanged();\\n },\\n enumerable: true\\n });\\n\\n window.SVGPathSegLinetoRel = function(owningPathSegList, x, y) {\\n SVGPathSeg.call(this, SVGPathSeg.PATHSEG_LINETO_REL, 'l', owningPathSegList);\\n this._x = x;\\n this._y = y;\\n };\\n SVGPathSegLinetoRel.prototype = Object.create(SVGPathSeg.prototype);\\n SVGPathSegLinetoRel.prototype.toString = function() {\\n return '[object SVGPathSegLinetoRel]';\\n };\\n SVGPathSegLinetoRel.prototype._asPathString = function() {\\n return this.pathSegTypeAsLetter + ' ' + this._x + ' ' + this._y;\\n };\\n SVGPathSegLinetoRel.prototype.clone = function() {\\n return new SVGPathSegLinetoRel(undefined, this._x, this._y);\\n };\\n Object.defineProperty(SVGPathSegLinetoRel.prototype, 'x', {\\n get: function() {\\n return this._x;\\n },\\n set: function(x) {\\n this._x = x;\\n this._segmentChanged();\\n },\\n enumerable: true\\n });\\n Object.defineProperty(SVGPathSegLinetoRel.prototype, 'y', {\\n get: function() {\\n return this._y;\\n },\\n set: function(y) {\\n this._y = y;\\n this._segmentChanged();\\n },\\n enumerable: true\\n });\\n\\n window.SVGPathSegCurvetoCubicAbs = function(owningPathSegList, x, y, x1, y1, x2, y2) {\\n SVGPathSeg.call(this, SVGPathSeg.PATHSEG_CURVETO_CUBIC_ABS, 'C', owningPathSegList);\\n this._x = x;\\n this._y = y;\\n this._x1 = x1;\\n this._y1 = y1;\\n this._x2 = x2;\\n this._y2 = y2;\\n };\\n SVGPathSegCurvetoCubicAbs.prototype = Object.create(SVGPathSeg.prototype);\\n SVGPathSegCurvetoCubicAbs.prototype.toString = function() {\\n return '[object SVGPathSegCurvetoCubicAbs]';\\n };\\n SVGPathSegCurvetoCubicAbs.prototype._asPathString = function() {\\n return (\\n this.pathSegTypeAsLetter +\\n ' ' +\\n this._x1 +\\n ' ' +\\n this._y1 +\\n ' ' +\\n this._x2 +\\n ' ' +\\n this._y2 +\\n ' ' +\\n this._x +\\n ' ' +\\n this._y\\n );\\n };\\n SVGPathSegCurvetoCubicAbs.prototype.clone = function() {\\n return new SVGPathSegCurvetoCubicAbs(undefined, this._x, this._y, this._x1, this._y1, this._x2, this._y2);\\n };\\n Object.defineProperty(SVGPathSegCurvetoCubicAbs.prototype, 'x', {\\n get: function() {\\n return this._x;\\n },\\n set: function(x) {\\n this._x = x;\\n this._segmentChanged();\\n },\\n enumerable: true\\n });\\n Object.defineProperty(SVGPathSegCurvetoCubicAbs.prototype, 'y', {\\n get: function() {\\n return this._y;\\n },\\n set: function(y) {\\n this._y = y;\\n this._segmentChanged();\\n },\\n enumerable: true\\n });\\n Object.defineProperty(SVGPathSegCurvetoCubicAbs.prototype, 'x1', {\\n get: function() {\\n return this._x1;\\n },\\n set: function(x1) {\\n this._x1 = x1;\\n this._segmentChanged();\\n },\\n enumerable: true\\n });\\n Object.defineProperty(SVGPathSegCurvetoCubicAbs.prototype, 'y1', {\\n get: function() {\\n return this._y1;\\n },\\n set: function(y1) {\\n this._y1 = y1;\\n this._segmentChanged();\\n },\\n enumerable: true\\n });\\n Object.defineProperty(SVGPathSegCurvetoCubicAbs.prototype, 'x2', {\\n get: function() {\\n return this._x2;\\n },\\n set: function(x2) {\\n this._x2 = x2;\\n this._segmentChanged();\\n },\\n enumerable: true\\n });\\n Object.defineProperty(SVGPathSegCurvetoCubicAbs.prototype, 'y2', {\\n get: function() {\\n return this._y2;\\n },\\n set: function(y2) {\\n this._y2 = y2;\\n this._segmentChanged();\\n },\\n enumerable: true\\n });\\n\\n window.SVGPathSegCurvetoCubicRel = function(owningPathSegList, x, y, x1, y1, x2, y2) {\\n SVGPathSeg.call(this, SVGPathSeg.PATHSEG_CURVETO_CUBIC_REL, 'c', owningPathSegList);\\n this._x = x;\\n this._y = y;\\n this._x1 = x1;\\n this._y1 = y1;\\n this._x2 = x2;\\n this._y2 = y2;\\n };\\n SVGPathSegCurvetoCubicRel.prototype = Object.create(SVGPathSeg.prototype);\\n SVGPathSegCurvetoCubicRel.prototype.toString = function() {\\n return '[object SVGPathSegCurvetoCubicRel]';\\n };\\n SVGPathSegCurvetoCubicRel.prototype._asPathString = function() {\\n return (\\n this.pathSegTypeAsLetter +\\n ' ' +\\n this._x1 +\\n ' ' +\\n this._y1 +\\n ' ' +\\n this._x2 +\\n ' ' +\\n this._y2 +\\n ' ' +\\n this._x +\\n ' ' +\\n this._y\\n );\\n };\\n SVGPathSegCurvetoCubicRel.prototype.clone = function() {\\n return new SVGPathSegCurvetoCubicRel(undefined, this._x, this._y, this._x1, this._y1, this._x2, this._y2);\\n };\\n Object.defineProperty(SVGPathSegCurvetoCubicRel.prototype, 'x', {\\n get: function() {\\n return this._x;\\n },\\n set: function(x) {\\n this._x = x;\\n this._segmentChanged();\\n },\\n enumerable: true\\n });\\n Object.defineProperty(SVGPathSegCurvetoCubicRel.prototype, 'y', {\\n get: function() {\\n return this._y;\\n },\\n set: function(y) {\\n this._y = y;\\n this._segmentChanged();\\n },\\n enumerable: true\\n });\\n Object.defineProperty(SVGPathSegCurvetoCubicRel.prototype, 'x1', {\\n get: function() {\\n return this._x1;\\n },\\n set: function(x1) {\\n this._x1 = x1;\\n this._segmentChanged();\\n },\\n enumerable: true\\n });\\n Object.defineProperty(SVGPathSegCurvetoCubicRel.prototype, 'y1', {\\n get: function() {\\n return this._y1;\\n },\\n set: function(y1) {\\n this._y1 = y1;\\n this._segmentChanged();\\n },\\n enumerable: true\\n });\\n Object.defineProperty(SVGPathSegCurvetoCubicRel.prototype, 'x2', {\\n get: function() {\\n return this._x2;\\n },\\n set: function(x2) {\\n this._x2 = x2;\\n this._segmentChanged();\\n },\\n enumerable: true\\n });\\n Object.defineProperty(SVGPathSegCurvetoCubicRel.prototype, 'y2', {\\n get: function() {\\n return this._y2;\\n },\\n set: function(y2) {\\n this._y2 = y2;\\n this._segmentChanged();\\n },\\n enumerable: true\\n });\\n\\n window.SVGPathSegCurvetoQuadraticAbs = function(owningPathSegList, x, y, x1, y1) {\\n SVGPathSeg.call(this, SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_ABS, 'Q', owningPathSegList);\\n this._x = x;\\n this._y = y;\\n this._x1 = x1;\\n this._y1 = y1;\\n };\\n SVGPathSegCurvetoQuadraticAbs.prototype = Object.create(SVGPathSeg.prototype);\\n SVGPathSegCurvetoQuadraticAbs.prototype.toString = function() {\\n return '[object SVGPathSegCurvetoQuadraticAbs]';\\n };\\n SVGPathSegCurvetoQuadraticAbs.prototype._asPathString = function() {\\n return this.pathSegTypeAsLetter + ' ' + this._x1 + ' ' + this._y1 + ' ' + this._x + ' ' + this._y;\\n };\\n SVGPathSegCurvetoQuadraticAbs.prototype.clone = function() {\\n return new SVGPathSegCurvetoQuadraticAbs(undefined, this._x, this._y, this._x1, this._y1);\\n };\\n Object.defineProperty(SVGPathSegCurvetoQuadraticAbs.prototype, 'x', {\\n get: function() {\\n return this._x;\\n },\\n set: function(x) {\\n this._x = x;\\n this._segmentChanged();\\n },\\n enumerable: true\\n });\\n Object.defineProperty(SVGPathSegCurvetoQuadraticAbs.prototype, 'y', {\\n get: function() {\\n return this._y;\\n },\\n set: function(y) {\\n this._y = y;\\n this._segmentChanged();\\n },\\n enumerable: true\\n });\\n Object.defineProperty(SVGPathSegCurvetoQuadraticAbs.prototype, 'x1', {\\n get: function() {\\n return this._x1;\\n },\\n set: function(x1) {\\n this._x1 = x1;\\n this._segmentChanged();\\n },\\n enumerable: true\\n });\\n Object.defineProperty(SVGPathSegCurvetoQuadraticAbs.prototype, 'y1', {\\n get: function() {\\n return this._y1;\\n },\\n set: function(y1) {\\n this._y1 = y1;\\n this._segmentChanged();\\n },\\n enumerable: true\\n });\\n\\n window.SVGPathSegCurvetoQuadraticRel = function(owningPathSegList, x, y, x1, y1) {\\n SVGPathSeg.call(this, SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_REL, 'q', owningPathSegList);\\n this._x = x;\\n this._y = y;\\n this._x1 = x1;\\n this._y1 = y1;\\n };\\n SVGPathSegCurvetoQuadraticRel.prototype = Object.create(SVGPathSeg.prototype);\\n SVGPathSegCurvetoQuadraticRel.prototype.toString = function() {\\n return '[object SVGPathSegCurvetoQuadraticRel]';\\n };\\n SVGPathSegCurvetoQuadraticRel.prototype._asPathString = function() {\\n return this.pathSegTypeAsLetter + ' ' + this._x1 + ' ' + this._y1 + ' ' + this._x + ' ' + this._y;\\n };\\n SVGPathSegCurvetoQuadraticRel.prototype.clone = function() {\\n return new SVGPathSegCurvetoQuadraticRel(undefined, this._x, this._y, this._x1, this._y1);\\n };\\n Object.defineProperty(SVGPathSegCurvetoQuadraticRel.prototype, 'x', {\\n get: function() {\\n return this._x;\\n },\\n set: function(x) {\\n this._x = x;\\n this._segmentChanged();\\n },\\n enumerable: true\\n });\\n Object.defineProperty(SVGPathSegCurvetoQuadraticRel.prototype, 'y', {\\n get: function() {\\n return this._y;\\n },\\n set: function(y) {\\n this._y = y;\\n this._segmentChanged();\\n },\\n enumerable: true\\n });\\n Object.defineProperty(SVGPathSegCurvetoQuadraticRel.prototype, 'x1', {\\n get: function() {\\n return this._x1;\\n },\\n set: function(x1) {\\n this._x1 = x1;\\n this._segmentChanged();\\n },\\n enumerable: true\\n });\\n Object.defineProperty(SVGPathSegCurvetoQuadraticRel.prototype, 'y1', {\\n get: function() {\\n return this._y1;\\n },\\n set: function(y1) {\\n this._y1 = y1;\\n this._segmentChanged();\\n },\\n enumerable: true\\n });\\n\\n window.SVGPathSegArcAbs = function(owningPathSegList, x, y, r1, r2, angle, largeArcFlag, sweepFlag) {\\n SVGPathSeg.call(this, SVGPathSeg.PATHSEG_ARC_ABS, 'A', owningPathSegList);\\n this._x = x;\\n this._y = y;\\n this._r1 = r1;\\n this._r2 = r2;\\n this._angle = angle;\\n this._largeArcFlag = largeArcFlag;\\n this._sweepFlag = sweepFlag;\\n };\\n SVGPathSegArcAbs.prototype = Object.create(SVGPathSeg.prototype);\\n SVGPathSegArcAbs.prototype.toString = function() {\\n return '[object SVGPathSegArcAbs]';\\n };\\n SVGPathSegArcAbs.prototype._asPathString = function() {\\n return (\\n this.pathSegTypeAsLetter +\\n ' ' +\\n this._r1 +\\n ' ' +\\n this._r2 +\\n ' ' +\\n this._angle +\\n ' ' +\\n (this._largeArcFlag ? '1' : '0') +\\n ' ' +\\n (this._sweepFlag ? '1' : '0') +\\n ' ' +\\n this._x +\\n ' ' +\\n this._y\\n );\\n };\\n SVGPathSegArcAbs.prototype.clone = function() {\\n return new SVGPathSegArcAbs(\\n undefined,\\n this._x,\\n this._y,\\n this._r1,\\n this._r2,\\n this._angle,\\n this._largeArcFlag,\\n this._sweepFlag\\n );\\n };\\n Object.defineProperty(SVGPathSegArcAbs.prototype, 'x', {\\n get: function() {\\n return this._x;\\n },\\n set: function(x) {\\n this._x = x;\\n this._segmentChanged();\\n },\\n enumerable: true\\n });\\n Object.defineProperty(SVGPathSegArcAbs.prototype, 'y', {\\n get: function() {\\n return this._y;\\n },\\n set: function(y) {\\n this._y = y;\\n this._segmentChanged();\\n },\\n enumerable: true\\n });\\n Object.defineProperty(SVGPathSegArcAbs.prototype, 'r1', {\\n get: function() {\\n return this._r1;\\n },\\n set: function(r1) {\\n this._r1 = r1;\\n this._segmentChanged();\\n },\\n enumerable: true\\n });\\n Object.defineProperty(SVGPathSegArcAbs.prototype, 'r2', {\\n get: function() {\\n return this._r2;\\n },\\n set: function(r2) {\\n this._r2 = r2;\\n this._segmentChanged();\\n },\\n enumerable: true\\n });\\n Object.defineProperty(SVGPathSegArcAbs.prototype, 'angle', {\\n get: function() {\\n return this._angle;\\n },\\n set: function(angle) {\\n this._angle = angle;\\n this._segmentChanged();\\n },\\n enumerable: true\\n });\\n Object.defineProperty(SVGPathSegArcAbs.prototype, 'largeArcFlag', {\\n get: function() {\\n return this._largeArcFlag;\\n },\\n set: function(largeArcFlag) {\\n this._largeArcFlag = largeArcFlag;\\n this._segmentChanged();\\n },\\n enumerable: true\\n });\\n Object.defineProperty(SVGPathSegArcAbs.prototype, 'sweepFlag', {\\n get: function() {\\n return this._sweepFlag;\\n },\\n set: function(sweepFlag) {\\n this._sweepFlag = sweepFlag;\\n this._segmentChanged();\\n },\\n enumerable: true\\n });\\n\\n window.SVGPathSegArcRel = function(owningPathSegList, x, y, r1, r2, angle, largeArcFlag, sweepFlag) {\\n SVGPathSeg.call(this, SVGPathSeg.PATHSEG_ARC_REL, 'a', owningPathSegList);\\n this._x = x;\\n this._y = y;\\n this._r1 = r1;\\n this._r2 = r2;\\n this._angle = angle;\\n this._largeArcFlag = largeArcFlag;\\n this._sweepFlag = sweepFlag;\\n };\\n SVGPathSegArcRel.prototype = Object.create(SVGPathSeg.prototype);\\n SVGPathSegArcRel.prototype.toString = function() {\\n return '[object SVGPathSegArcRel]';\\n };\\n SVGPathSegArcRel.prototype._asPathString = function() {\\n return (\\n this.pathSegTypeAsLetter +\\n ' ' +\\n this._r1 +\\n ' ' +\\n this._r2 +\\n ' ' +\\n this._angle +\\n ' ' +\\n (this._largeArcFlag ? '1' : '0') +\\n ' ' +\\n (this._sweepFlag ? '1' : '0') +\\n ' ' +\\n this._x +\\n ' ' +\\n this._y\\n );\\n };\\n SVGPathSegArcRel.prototype.clone = function() {\\n return new SVGPathSegArcRel(\\n undefined,\\n this._x,\\n this._y,\\n this._r1,\\n this._r2,\\n this._angle,\\n this._largeArcFlag,\\n this._sweepFlag\\n );\\n };\\n Object.defineProperty(SVGPathSegArcRel.prototype, 'x', {\\n get: function() {\\n return this._x;\\n },\\n set: function(x) {\\n this._x = x;\\n this._segmentChanged();\\n },\\n enumerable: true\\n });\\n Object.defineProperty(SVGPathSegArcRel.prototype, 'y', {\\n get: function() {\\n return this._y;\\n },\\n set: function(y) {\\n this._y = y;\\n this._segmentChanged();\\n },\\n enumerable: true\\n });\\n Object.defineProperty(SVGPathSegArcRel.prototype, 'r1', {\\n get: function() {\\n return this._r1;\\n },\\n set: function(r1) {\\n this._r1 = r1;\\n this._segmentChanged();\\n },\\n enumerable: true\\n });\\n Object.defineProperty(SVGPathSegArcRel.prototype, 'r2', {\\n get: function() {\\n return this._r2;\\n },\\n set: function(r2) {\\n this._r2 = r2;\\n this._segmentChanged();\\n },\\n enumerable: true\\n });\\n Object.defineProperty(SVGPathSegArcRel.prototype, 'angle', {\\n get: function() {\\n return this._angle;\\n },\\n set: function(angle) {\\n this._angle = angle;\\n this._segmentChanged();\\n },\\n enumerable: true\\n });\\n Object.defineProperty(SVGPathSegArcRel.prototype, 'largeArcFlag', {\\n get: function() {\\n return this._largeArcFlag;\\n },\\n set: function(largeArcFlag) {\\n this._largeArcFlag = largeArcFlag;\\n this._segmentChanged();\\n },\\n enumerable: true\\n });\\n Object.defineProperty(SVGPathSegArcRel.prototype, 'sweepFlag', {\\n get: function() {\\n return this._sweepFlag;\\n },\\n set: function(sweepFlag) {\\n this._sweepFlag = sweepFlag;\\n this._segmentChanged();\\n },\\n enumerable: true\\n });\\n\\n window.SVGPathSegLinetoHorizontalAbs = function(owningPathSegList, x) {\\n SVGPathSeg.call(this, SVGPathSeg.PATHSEG_LINETO_HORIZONTAL_ABS, 'H', owningPathSegList);\\n this._x = x;\\n };\\n SVGPathSegLinetoHorizontalAbs.prototype = Object.create(SVGPathSeg.prototype);\\n SVGPathSegLinetoHorizontalAbs.prototype.toString = function() {\\n return '[object SVGPathSegLinetoHorizontalAbs]';\\n };\\n SVGPathSegLinetoHorizontalAbs.prototype._asPathString = function() {\\n return this.pathSegTypeAsLetter + ' ' + this._x;\\n };\\n SVGPathSegLinetoHorizontalAbs.prototype.clone = function() {\\n return new SVGPathSegLinetoHorizontalAbs(undefined, this._x);\\n };\\n Object.defineProperty(SVGPathSegLinetoHorizontalAbs.prototype, 'x', {\\n get: function() {\\n return this._x;\\n },\\n set: function(x) {\\n this._x = x;\\n this._segmentChanged();\\n },\\n enumerable: true\\n });\\n\\n window.SVGPathSegLinetoHorizontalRel = function(owningPathSegList, x) {\\n SVGPathSeg.call(this, SVGPathSeg.PATHSEG_LINETO_HORIZONTAL_REL, 'h', owningPathSegList);\\n this._x = x;\\n };\\n SVGPathSegLinetoHorizontalRel.prototype = Object.create(SVGPathSeg.prototype);\\n SVGPathSegLinetoHorizontalRel.prototype.toString = function() {\\n return '[object SVGPathSegLinetoHorizontalRel]';\\n };\\n SVGPathSegLinetoHorizontalRel.prototype._asPathString = function() {\\n return this.pathSegTypeAsLetter + ' ' + this._x;\\n };\\n SVGPathSegLinetoHorizontalRel.prototype.clone = function() {\\n return new SVGPathSegLinetoHorizontalRel(undefined, this._x);\\n };\\n Object.defineProperty(SVGPathSegLinetoHorizontalRel.prototype, 'x', {\\n get: function() {\\n return this._x;\\n },\\n set: function(x) {\\n this._x = x;\\n this._segmentChanged();\\n },\\n enumerable: true\\n });\\n\\n window.SVGPathSegLinetoVerticalAbs = function(owningPathSegList, y) {\\n SVGPathSeg.call(this, SVGPathSeg.PATHSEG_LINETO_VERTICAL_ABS, 'V', owningPathSegList);\\n this._y = y;\\n };\\n SVGPathSegLinetoVerticalAbs.prototype = Object.create(SVGPathSeg.prototype);\\n SVGPathSegLinetoVerticalAbs.prototype.toString = function() {\\n return '[object SVGPathSegLinetoVerticalAbs]';\\n };\\n SVGPathSegLinetoVerticalAbs.prototype._asPathString = function() {\\n return this.pathSegTypeAsLetter + ' ' + this._y;\\n };\\n SVGPathSegLinetoVerticalAbs.prototype.clone = function() {\\n return new SVGPathSegLinetoVerticalAbs(undefined, this._y);\\n };\\n Object.defineProperty(SVGPathSegLinetoVerticalAbs.prototype, 'y', {\\n get: function() {\\n return this._y;\\n },\\n set: function(y) {\\n this._y = y;\\n this._segmentChanged();\\n },\\n enumerable: true\\n });\\n\\n window.SVGPathSegLinetoVerticalRel = function(owningPathSegList, y) {\\n SVGPathSeg.call(this, SVGPathSeg.PATHSEG_LINETO_VERTICAL_REL, 'v', owningPathSegList);\\n this._y = y;\\n };\\n SVGPathSegLinetoVerticalRel.prototype = Object.create(SVGPathSeg.prototype);\\n SVGPathSegLinetoVerticalRel.prototype.toString = function() {\\n return '[object SVGPathSegLinetoVerticalRel]';\\n };\\n SVGPathSegLinetoVerticalRel.prototype._asPathString = function() {\\n return this.pathSegTypeAsLetter + ' ' + this._y;\\n };\\n SVGPathSegLinetoVerticalRel.prototype.clone = function() {\\n return new SVGPathSegLinetoVerticalRel(undefined, this._y);\\n };\\n Object.defineProperty(SVGPathSegLinetoVerticalRel.prototype, 'y', {\\n get: function() {\\n return this._y;\\n },\\n set: function(y) {\\n this._y = y;\\n this._segmentChanged();\\n },\\n enumerable: true\\n });\\n\\n window.SVGPathSegCurvetoCubicSmoothAbs = function(owningPathSegList, x, y, x2, y2) {\\n SVGPathSeg.call(this, SVGPathSeg.PATHSEG_CURVETO_CUBIC_SMOOTH_ABS, 'S', owningPathSegList);\\n this._x = x;\\n this._y = y;\\n this._x2 = x2;\\n this._y2 = y2;\\n };\\n SVGPathSegCurvetoCubicSmoothAbs.prototype = Object.create(SVGPathSeg.prototype);\\n SVGPathSegCurvetoCubicSmoothAbs.prototype.toString = function() {\\n return '[object SVGPathSegCurvetoCubicSmoothAbs]';\\n };\\n SVGPathSegCurvetoCubicSmoothAbs.prototype._asPathString = function() {\\n return this.pathSegTypeAsLetter + ' ' + this._x2 + ' ' + this._y2 + ' ' + this._x + ' ' + this._y;\\n };\\n SVGPathSegCurvetoCubicSmoothAbs.prototype.clone = function() {\\n return new SVGPathSegCurvetoCubicSmoothAbs(undefined, this._x, this._y, this._x2, this._y2);\\n };\\n Object.defineProperty(SVGPathSegCurvetoCubicSmoothAbs.prototype, 'x', {\\n get: function() {\\n return this._x;\\n },\\n set: function(x) {\\n this._x = x;\\n this._segmentChanged();\\n },\\n enumerable: true\\n });\\n Object.defineProperty(SVGPathSegCurvetoCubicSmoothAbs.prototype, 'y', {\\n get: function() {\\n return this._y;\\n },\\n set: function(y) {\\n this._y = y;\\n this._segmentChanged();\\n },\\n enumerable: true\\n });\\n Object.defineProperty(SVGPathSegCurvetoCubicSmoothAbs.prototype, 'x2', {\\n get: function() {\\n return this._x2;\\n },\\n set: function(x2) {\\n this._x2 = x2;\\n this._segmentChanged();\\n },\\n enumerable: true\\n });\\n Object.defineProperty(SVGPathSegCurvetoCubicSmoothAbs.prototype, 'y2', {\\n get: function() {\\n return this._y2;\\n },\\n set: function(y2) {\\n this._y2 = y2;\\n this._segmentChanged();\\n },\\n enumerable: true\\n });\\n\\n window.SVGPathSegCurvetoCubicSmoothRel = function(owningPathSegList, x, y, x2, y2) {\\n SVGPathSeg.call(this, SVGPathSeg.PATHSEG_CURVETO_CUBIC_SMOOTH_REL, 's', owningPathSegList);\\n this._x = x;\\n this._y = y;\\n this._x2 = x2;\\n this._y2 = y2;\\n };\\n SVGPathSegCurvetoCubicSmoothRel.prototype = Object.create(SVGPathSeg.prototype);\\n SVGPathSegCurvetoCubicSmoothRel.prototype.toString = function() {\\n return '[object SVGPathSegCurvetoCubicSmoothRel]';\\n };\\n SVGPathSegCurvetoCubicSmoothRel.prototype._asPathString = function() {\\n return this.pathSegTypeAsLetter + ' ' + this._x2 + ' ' + this._y2 + ' ' + this._x + ' ' + this._y;\\n };\\n SVGPathSegCurvetoCubicSmoothRel.prototype.clone = function() {\\n return new SVGPathSegCurvetoCubicSmoothRel(undefined, this._x, this._y, this._x2, this._y2);\\n };\\n Object.defineProperty(SVGPathSegCurvetoCubicSmoothRel.prototype, 'x', {\\n get: function() {\\n return this._x;\\n },\\n set: function(x) {\\n this._x = x;\\n this._segmentChanged();\\n },\\n enumerable: true\\n });\\n Object.defineProperty(SVGPathSegCurvetoCubicSmoothRel.prototype, 'y', {\\n get: function() {\\n return this._y;\\n },\\n set: function(y) {\\n this._y = y;\\n this._segmentChanged();\\n },\\n enumerable: true\\n });\\n Object.defineProperty(SVGPathSegCurvetoCubicSmoothRel.prototype, 'x2', {\\n get: function() {\\n return this._x2;\\n },\\n set: function(x2) {\\n this._x2 = x2;\\n this._segmentChanged();\\n },\\n enumerable: true\\n });\\n Object.defineProperty(SVGPathSegCurvetoCubicSmoothRel.prototype, 'y2', {\\n get: function() {\\n return this._y2;\\n },\\n set: function(y2) {\\n this._y2 = y2;\\n this._segmentChanged();\\n },\\n enumerable: true\\n });\\n\\n window.SVGPathSegCurvetoQuadraticSmoothAbs = function(owningPathSegList, x, y) {\\n SVGPathSeg.call(this, SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_SMOOTH_ABS, 'T', owningPathSegList);\\n this._x = x;\\n this._y = y;\\n };\\n SVGPathSegCurvetoQuadraticSmoothAbs.prototype = Object.create(SVGPathSeg.prototype);\\n SVGPathSegCurvetoQuadraticSmoothAbs.prototype.toString = function() {\\n return '[object SVGPathSegCurvetoQuadraticSmoothAbs]';\\n };\\n SVGPathSegCurvetoQuadraticSmoothAbs.prototype._asPathString = function() {\\n return this.pathSegTypeAsLetter + ' ' + this._x + ' ' + this._y;\\n };\\n SVGPathSegCurvetoQuadraticSmoothAbs.prototype.clone = function() {\\n return new SVGPathSegCurvetoQuadraticSmoothAbs(undefined, this._x, this._y);\\n };\\n Object.defineProperty(SVGPathSegCurvetoQuadraticSmoothAbs.prototype, 'x', {\\n get: function() {\\n return this._x;\\n },\\n set: function(x) {\\n this._x = x;\\n this._segmentChanged();\\n },\\n enumerable: true\\n });\\n Object.defineProperty(SVGPathSegCurvetoQuadraticSmoothAbs.prototype, 'y', {\\n get: function() {\\n return this._y;\\n },\\n set: function(y) {\\n this._y = y;\\n this._segmentChanged();\\n },\\n enumerable: true\\n });\\n\\n window.SVGPathSegCurvetoQuadraticSmoothRel = function(owningPathSegList, x, y) {\\n SVGPathSeg.call(this, SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_SMOOTH_REL, 't', owningPathSegList);\\n this._x = x;\\n this._y = y;\\n };\\n SVGPathSegCurvetoQuadraticSmoothRel.prototype = Object.create(SVGPathSeg.prototype);\\n SVGPathSegCurvetoQuadraticSmoothRel.prototype.toString = function() {\\n return '[object SVGPathSegCurvetoQuadraticSmoothRel]';\\n };\\n SVGPathSegCurvetoQuadraticSmoothRel.prototype._asPathString = function() {\\n return this.pathSegTypeAsLetter + ' ' + this._x + ' ' + this._y;\\n };\\n SVGPathSegCurvetoQuadraticSmoothRel.prototype.clone = function() {\\n return new SVGPathSegCurvetoQuadraticSmoothRel(undefined, this._x, this._y);\\n };\\n Object.defineProperty(SVGPathSegCurvetoQuadraticSmoothRel.prototype, 'x', {\\n get: function() {\\n return this._x;\\n },\\n set: function(x) {\\n this._x = x;\\n this._segmentChanged();\\n },\\n enumerable: true\\n });\\n Object.defineProperty(SVGPathSegCurvetoQuadraticSmoothRel.prototype, 'y', {\\n get: function() {\\n return this._y;\\n },\\n set: function(y) {\\n this._y = y;\\n this._segmentChanged();\\n },\\n enumerable: true\\n });\\n\\n // Add createSVGPathSeg* functions to SVGPathElement.\\n // Spec: http://www.w3.org/TR/SVG11/single-page.html#paths-InterfaceSVGPathElement.\\n SVGPathElement.prototype.createSVGPathSegClosePath = function() {\\n return new SVGPathSegClosePath(undefined);\\n };\\n SVGPathElement.prototype.createSVGPathSegMovetoAbs = function(x, y) {\\n return new SVGPathSegMovetoAbs(undefined, x, y);\\n };\\n SVGPathElement.prototype.createSVGPathSegMovetoRel = function(x, y) {\\n return new SVGPathSegMovetoRel(undefined, x, y);\\n };\\n SVGPathElement.prototype.createSVGPathSegLinetoAbs = function(x, y) {\\n return new SVGPathSegLinetoAbs(undefined, x, y);\\n };\\n SVGPathElement.prototype.createSVGPathSegLinetoRel = function(x, y) {\\n return new SVGPathSegLinetoRel(undefined, x, y);\\n };\\n SVGPathElement.prototype.createSVGPathSegCurvetoCubicAbs = function(x, y, x1, y1, x2, y2) {\\n return new SVGPathSegCurvetoCubicAbs(undefined, x, y, x1, y1, x2, y2);\\n };\\n SVGPathElement.prototype.createSVGPathSegCurvetoCubicRel = function(x, y, x1, y1, x2, y2) {\\n return new SVGPathSegCurvetoCubicRel(undefined, x, y, x1, y1, x2, y2);\\n };\\n SVGPathElement.prototype.createSVGPathSegCurvetoQuadraticAbs = function(x, y, x1, y1) {\\n return new SVGPathSegCurvetoQuadraticAbs(undefined, x, y, x1, y1);\\n };\\n SVGPathElement.prototype.createSVGPathSegCurvetoQuadraticRel = function(x, y, x1, y1) {\\n return new SVGPathSegCurvetoQuadraticRel(undefined, x, y, x1, y1);\\n };\\n SVGPathElement.prototype.createSVGPathSegArcAbs = function(x, y, r1, r2, angle, largeArcFlag, sweepFlag) {\\n return new SVGPathSegArcAbs(undefined, x, y, r1, r2, angle, largeArcFlag, sweepFlag);\\n };\\n SVGPathElement.prototype.createSVGPathSegArcRel = function(x, y, r1, r2, angle, largeArcFlag, sweepFlag) {\\n return new SVGPathSegArcRel(undefined, x, y, r1, r2, angle, largeArcFlag, sweepFlag);\\n };\\n SVGPathElement.prototype.createSVGPathSegLinetoHorizontalAbs = function(x) {\\n return new SVGPathSegLinetoHorizontalAbs(undefined, x);\\n };\\n SVGPathElement.prototype.createSVGPathSegLinetoHorizontalRel = function(x) {\\n return new SVGPathSegLinetoHorizontalRel(undefined, x);\\n };\\n SVGPathElement.prototype.createSVGPathSegLinetoVerticalAbs = function(y) {\\n return new SVGPathSegLinetoVerticalAbs(undefined, y);\\n };\\n SVGPathElement.prototype.createSVGPathSegLinetoVerticalRel = function(y) {\\n return new SVGPathSegLinetoVerticalRel(undefined, y);\\n };\\n SVGPathElement.prototype.createSVGPathSegCurvetoCubicSmoothAbs = function(x, y, x2, y2) {\\n return new SVGPathSegCurvetoCubicSmoothAbs(undefined, x, y, x2, y2);\\n };\\n SVGPathElement.prototype.createSVGPathSegCurvetoCubicSmoothRel = function(x, y, x2, y2) {\\n return new SVGPathSegCurvetoCubicSmoothRel(undefined, x, y, x2, y2);\\n };\\n SVGPathElement.prototype.createSVGPathSegCurvetoQuadraticSmoothAbs = function(x, y) {\\n return new SVGPathSegCurvetoQuadraticSmoothAbs(undefined, x, y);\\n };\\n SVGPathElement.prototype.createSVGPathSegCurvetoQuadraticSmoothRel = function(x, y) {\\n return new SVGPathSegCurvetoQuadraticSmoothRel(undefined, x, y);\\n };\\n }\\n\\n if (!('SVGPathSegList' in window)) {\\n // Spec: http://www.w3.org/TR/SVG11/single-page.html#paths-InterfaceSVGPathSegList\\n window.SVGPathSegList = function(pathElement) {\\n this._pathElement = pathElement;\\n this._list = this._parsePath(this._pathElement.getAttribute('d'));\\n\\n // Use a MutationObserver to catch changes to the path's \\\"d\\\" attribute.\\n this._mutationObserverConfig = { attributes: true, attributeFilter: ['d'] };\\n this._pathElementMutationObserver = new MutationObserver(this._updateListFromPathMutations.bind(this));\\n this._pathElementMutationObserver.observe(this._pathElement, this._mutationObserverConfig);\\n };\\n\\n Object.defineProperty(SVGPathSegList.prototype, 'numberOfItems', {\\n get: function() {\\n this._checkPathSynchronizedToList();\\n return this._list.length;\\n },\\n enumerable: true\\n });\\n\\n // Add the pathSegList accessors to SVGPathElement.\\n // Spec: http://www.w3.org/TR/SVG11/single-page.html#paths-InterfaceSVGAnimatedPathData\\n Object.defineProperty(SVGPathElement.prototype, 'pathSegList', {\\n get: function() {\\n if (!this._pathSegList) this._pathSegList = new SVGPathSegList(this);\\n return this._pathSegList;\\n },\\n enumerable: true\\n });\\n // FIXME: The following are not implemented and simply return SVGPathElement.pathSegList.\\n Object.defineProperty(SVGPathElement.prototype, 'normalizedPathSegList', {\\n get: function() {\\n return this.pathSegList;\\n },\\n enumerable: true\\n });\\n Object.defineProperty(SVGPathElement.prototype, 'animatedPathSegList', {\\n get: function() {\\n return this.pathSegList;\\n },\\n enumerable: true\\n });\\n Object.defineProperty(SVGPathElement.prototype, 'animatedNormalizedPathSegList', {\\n get: function() {\\n return this.pathSegList;\\n },\\n enumerable: true\\n });\\n\\n // Process any pending mutations to the path element and update the list as needed.\\n // This should be the first call of all public functions and is needed because\\n // MutationObservers are not synchronous so we can have pending asynchronous mutations.\\n SVGPathSegList.prototype._checkPathSynchronizedToList = function() {\\n this._updateListFromPathMutations(this._pathElementMutationObserver.takeRecords());\\n };\\n\\n SVGPathSegList.prototype._updateListFromPathMutations = function(mutationRecords) {\\n if (!this._pathElement) return;\\n var hasPathMutations = false;\\n mutationRecords.forEach(function(record) {\\n if (record.attributeName == 'd') hasPathMutations = true;\\n });\\n if (hasPathMutations) this._list = this._parsePath(this._pathElement.getAttribute('d'));\\n };\\n\\n // Serialize the list and update the path's 'd' attribute.\\n SVGPathSegList.prototype._writeListToPath = function() {\\n this._pathElementMutationObserver.disconnect();\\n this._pathElement.setAttribute('d', SVGPathSegList._pathSegArrayAsString(this._list));\\n this._pathElementMutationObserver.observe(this._pathElement, this._mutationObserverConfig);\\n };\\n\\n // When a path segment changes the list needs to be synchronized back to the path element.\\n SVGPathSegList.prototype.segmentChanged = function(pathSeg) {\\n this._writeListToPath();\\n };\\n\\n SVGPathSegList.prototype.clear = function() {\\n this._checkPathSynchronizedToList();\\n\\n this._list.forEach(function(pathSeg) {\\n pathSeg._owningPathSegList = null;\\n });\\n this._list = [];\\n this._writeListToPath();\\n };\\n\\n SVGPathSegList.prototype.initialize = function(newItem) {\\n this._checkPathSynchronizedToList();\\n\\n this._list = [newItem];\\n newItem._owningPathSegList = this;\\n this._writeListToPath();\\n return newItem;\\n };\\n\\n SVGPathSegList.prototype._checkValidIndex = function(index) {\\n if (isNaN(index) || index < 0 || index >= this.numberOfItems) throw 'INDEX_SIZE_ERR';\\n };\\n\\n SVGPathSegList.prototype.getItem = function(index) {\\n this._checkPathSynchronizedToList();\\n\\n this._checkValidIndex(index);\\n return this._list[index];\\n };\\n\\n SVGPathSegList.prototype.insertItemBefore = function(newItem, index) {\\n this._checkPathSynchronizedToList();\\n\\n // Spec: If the index is greater than or equal to numberOfItems, then the new item is appended to the end of the list.\\n if (index > this.numberOfItems) index = this.numberOfItems;\\n if (newItem._owningPathSegList) {\\n // SVG2 spec says to make a copy.\\n newItem = newItem.clone();\\n }\\n this._list.splice(index, 0, newItem);\\n newItem._owningPathSegList = this;\\n this._writeListToPath();\\n return newItem;\\n };\\n\\n SVGPathSegList.prototype.replaceItem = function(newItem, index) {\\n this._checkPathSynchronizedToList();\\n\\n if (newItem._owningPathSegList) {\\n // SVG2 spec says to make a copy.\\n newItem = newItem.clone();\\n }\\n this._checkValidIndex(index);\\n this._list[index] = newItem;\\n newItem._owningPathSegList = this;\\n this._writeListToPath();\\n return newItem;\\n };\\n\\n SVGPathSegList.prototype.removeItem = function(index) {\\n this._checkPathSynchronizedToList();\\n\\n this._checkValidIndex(index);\\n var item = this._list[index];\\n this._list.splice(index, 1);\\n this._writeListToPath();\\n return item;\\n };\\n\\n SVGPathSegList.prototype.appendItem = function(newItem) {\\n this._checkPathSynchronizedToList();\\n\\n if (newItem._owningPathSegList) {\\n // SVG2 spec says to make a copy.\\n newItem = newItem.clone();\\n }\\n this._list.push(newItem);\\n newItem._owningPathSegList = this;\\n // TODO: Optimize this to just append to the existing attribute.\\n this._writeListToPath();\\n return newItem;\\n };\\n\\n SVGPathSegList._pathSegArrayAsString = function(pathSegArray) {\\n var string = '';\\n var first = true;\\n pathSegArray.forEach(function(pathSeg) {\\n if (first) {\\n first = false;\\n string += pathSeg._asPathString();\\n } else {\\n string += ' ' + pathSeg._asPathString();\\n }\\n });\\n return string;\\n };\\n\\n // This closely follows SVGPathParser::parsePath from Source/core/svg/SVGPathParser.cpp.\\n SVGPathSegList.prototype._parsePath = function(string) {\\n if (!string || string.length == 0) return [];\\n\\n var owningPathSegList = this;\\n\\n var Builder = function() {\\n this.pathSegList = [];\\n };\\n\\n Builder.prototype.appendSegment = function(pathSeg) {\\n this.pathSegList.push(pathSeg);\\n };\\n\\n var Source = function(string) {\\n this._string = string;\\n this._currentIndex = 0;\\n this._endIndex = this._string.length;\\n this._previousCommand = SVGPathSeg.PATHSEG_UNKNOWN;\\n\\n this._skipOptionalSpaces();\\n };\\n\\n Source.prototype._isCurrentSpace = function() {\\n var character = this._string[this._currentIndex];\\n return (\\n character <= ' ' &&\\n (character == ' ' || character == '\\\\n' || character == '\\\\t' || character == '\\\\r' || character == '\\\\f')\\n );\\n };\\n\\n Source.prototype._skipOptionalSpaces = function() {\\n while (this._currentIndex < this._endIndex && this._isCurrentSpace()) this._currentIndex++;\\n return this._currentIndex < this._endIndex;\\n };\\n\\n Source.prototype._skipOptionalSpacesOrDelimiter = function() {\\n if (\\n this._currentIndex < this._endIndex &&\\n !this._isCurrentSpace() &&\\n this._string.charAt(this._currentIndex) != ','\\n )\\n return false;\\n if (this._skipOptionalSpaces()) {\\n if (this._currentIndex < this._endIndex && this._string.charAt(this._currentIndex) == ',') {\\n this._currentIndex++;\\n this._skipOptionalSpaces();\\n }\\n }\\n return this._currentIndex < this._endIndex;\\n };\\n\\n Source.prototype.hasMoreData = function() {\\n return this._currentIndex < this._endIndex;\\n };\\n\\n Source.prototype.peekSegmentType = function() {\\n var lookahead = this._string[this._currentIndex];\\n return this._pathSegTypeFromChar(lookahead);\\n };\\n\\n Source.prototype._pathSegTypeFromChar = function(lookahead) {\\n switch (lookahead) {\\n case 'Z':\\n case 'z':\\n return SVGPathSeg.PATHSEG_CLOSEPATH;\\n case 'M':\\n return SVGPathSeg.PATHSEG_MOVETO_ABS;\\n case 'm':\\n return SVGPathSeg.PATHSEG_MOVETO_REL;\\n case 'L':\\n return SVGPathSeg.PATHSEG_LINETO_ABS;\\n case 'l':\\n return SVGPathSeg.PATHSEG_LINETO_REL;\\n case 'C':\\n return SVGPathSeg.PATHSEG_CURVETO_CUBIC_ABS;\\n case 'c':\\n return SVGPathSeg.PATHSEG_CURVETO_CUBIC_REL;\\n case 'Q':\\n return SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_ABS;\\n case 'q':\\n return SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_REL;\\n case 'A':\\n return SVGPathSeg.PATHSEG_ARC_ABS;\\n case 'a':\\n return SVGPathSeg.PATHSEG_ARC_REL;\\n case 'H':\\n return SVGPathSeg.PATHSEG_LINETO_HORIZONTAL_ABS;\\n case 'h':\\n return SVGPathSeg.PATHSEG_LINETO_HORIZONTAL_REL;\\n case 'V':\\n return SVGPathSeg.PATHSEG_LINETO_VERTICAL_ABS;\\n case 'v':\\n return SVGPathSeg.PATHSEG_LINETO_VERTICAL_REL;\\n case 'S':\\n return SVGPathSeg.PATHSEG_CURVETO_CUBIC_SMOOTH_ABS;\\n case 's':\\n return SVGPathSeg.PATHSEG_CURVETO_CUBIC_SMOOTH_REL;\\n case 'T':\\n return SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_SMOOTH_ABS;\\n case 't':\\n return SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_SMOOTH_REL;\\n default:\\n return SVGPathSeg.PATHSEG_UNKNOWN;\\n }\\n };\\n\\n Source.prototype._nextCommandHelper = function(lookahead, previousCommand) {\\n // Check for remaining coordinates in the current command.\\n if (\\n (lookahead == '+' || lookahead == '-' || lookahead == '.' || (lookahead >= '0' && lookahead <= '9')) &&\\n previousCommand != SVGPathSeg.PATHSEG_CLOSEPATH\\n ) {\\n if (previousCommand == SVGPathSeg.PATHSEG_MOVETO_ABS) return SVGPathSeg.PATHSEG_LINETO_ABS;\\n if (previousCommand == SVGPathSeg.PATHSEG_MOVETO_REL) return SVGPathSeg.PATHSEG_LINETO_REL;\\n return previousCommand;\\n }\\n return SVGPathSeg.PATHSEG_UNKNOWN;\\n };\\n\\n Source.prototype.initialCommandIsMoveTo = function() {\\n // If the path is empty it is still valid, so return true.\\n if (!this.hasMoreData()) return true;\\n var command = this.peekSegmentType();\\n // Path must start with moveTo.\\n return command == SVGPathSeg.PATHSEG_MOVETO_ABS || command == SVGPathSeg.PATHSEG_MOVETO_REL;\\n };\\n\\n // Parse a number from an SVG path. This very closely follows genericParseNumber(...) from Source/core/svg/SVGParserUtilities.cpp.\\n // Spec: http://www.w3.org/TR/SVG11/single-page.html#paths-PathDataBNF\\n Source.prototype._parseNumber = function() {\\n var exponent = 0;\\n var integer = 0;\\n var frac = 1;\\n var decimal = 0;\\n var sign = 1;\\n var expsign = 1;\\n\\n var startIndex = this._currentIndex;\\n\\n this._skipOptionalSpaces();\\n\\n // Read the sign.\\n if (this._currentIndex < this._endIndex && this._string.charAt(this._currentIndex) == '+')\\n this._currentIndex++;\\n else if (this._currentIndex < this._endIndex && this._string.charAt(this._currentIndex) == '-') {\\n this._currentIndex++;\\n sign = -1;\\n }\\n\\n if (\\n this._currentIndex == this._endIndex ||\\n ((this._string.charAt(this._currentIndex) < '0' || this._string.charAt(this._currentIndex) > '9') &&\\n this._string.charAt(this._currentIndex) != '.')\\n )\\n // The first character of a number must be one of [0-9+-.].\\n return undefined;\\n\\n // Read the integer part, build right-to-left.\\n var startIntPartIndex = this._currentIndex;\\n while (\\n this._currentIndex < this._endIndex &&\\n this._string.charAt(this._currentIndex) >= '0' &&\\n this._string.charAt(this._currentIndex) <= '9'\\n )\\n this._currentIndex++; // Advance to first non-digit.\\n\\n if (this._currentIndex != startIntPartIndex) {\\n var scanIntPartIndex = this._currentIndex - 1;\\n var multiplier = 1;\\n while (scanIntPartIndex >= startIntPartIndex) {\\n integer += multiplier * (this._string.charAt(scanIntPartIndex--) - '0');\\n multiplier *= 10;\\n }\\n }\\n\\n // Read the decimals.\\n if (this._currentIndex < this._endIndex && this._string.charAt(this._currentIndex) == '.') {\\n this._currentIndex++;\\n\\n // There must be a least one digit following the .\\n if (\\n this._currentIndex >= this._endIndex ||\\n this._string.charAt(this._currentIndex) < '0' ||\\n this._string.charAt(this._currentIndex) > '9'\\n )\\n return undefined;\\n while (\\n this._currentIndex < this._endIndex &&\\n this._string.charAt(this._currentIndex) >= '0' &&\\n this._string.charAt(this._currentIndex) <= '9'\\n )\\n decimal += (this._string.charAt(this._currentIndex++) - '0') * (frac *= 0.1);\\n }\\n\\n // Read the exponent part.\\n if (\\n this._currentIndex != startIndex &&\\n this._currentIndex + 1 < this._endIndex &&\\n (this._string.charAt(this._currentIndex) == 'e' || this._string.charAt(this._currentIndex) == 'E') &&\\n (this._string.charAt(this._currentIndex + 1) != 'x' && this._string.charAt(this._currentIndex + 1) != 'm')\\n ) {\\n this._currentIndex++;\\n\\n // Read the sign of the exponent.\\n if (this._string.charAt(this._currentIndex) == '+') {\\n this._currentIndex++;\\n } else if (this._string.charAt(this._currentIndex) == '-') {\\n this._currentIndex++;\\n expsign = -1;\\n }\\n\\n // There must be an exponent.\\n if (\\n this._currentIndex >= this._endIndex ||\\n this._string.charAt(this._currentIndex) < '0' ||\\n this._string.charAt(this._currentIndex) > '9'\\n )\\n return undefined;\\n\\n while (\\n this._currentIndex < this._endIndex &&\\n this._string.charAt(this._currentIndex) >= '0' &&\\n this._string.charAt(this._currentIndex) <= '9'\\n ) {\\n exponent *= 10;\\n exponent += this._string.charAt(this._currentIndex) - '0';\\n this._currentIndex++;\\n }\\n }\\n\\n var number = integer + decimal;\\n number *= sign;\\n\\n if (exponent) number *= Math.pow(10, expsign * exponent);\\n\\n if (startIndex == this._currentIndex) return undefined;\\n\\n this._skipOptionalSpacesOrDelimiter();\\n\\n return number;\\n };\\n\\n Source.prototype._parseArcFlag = function() {\\n if (this._currentIndex >= this._endIndex) return undefined;\\n var flag = false;\\n var flagChar = this._string.charAt(this._currentIndex++);\\n if (flagChar == '0') flag = false;\\n else if (flagChar == '1') flag = true;\\n else return undefined;\\n\\n this._skipOptionalSpacesOrDelimiter();\\n return flag;\\n };\\n\\n Source.prototype.parseSegment = function() {\\n var lookahead = this._string[this._currentIndex];\\n var command = this._pathSegTypeFromChar(lookahead);\\n if (command == SVGPathSeg.PATHSEG_UNKNOWN) {\\n // Possibly an implicit command. Not allowed if this is the first command.\\n if (this._previousCommand == SVGPathSeg.PATHSEG_UNKNOWN) return null;\\n command = this._nextCommandHelper(lookahead, this._previousCommand);\\n if (command == SVGPathSeg.PATHSEG_UNKNOWN) return null;\\n } else {\\n this._currentIndex++;\\n }\\n\\n this._previousCommand = command;\\n\\n switch (command) {\\n case SVGPathSeg.PATHSEG_MOVETO_REL:\\n return new SVGPathSegMovetoRel(owningPathSegList, this._parseNumber(), this._parseNumber());\\n case SVGPathSeg.PATHSEG_MOVETO_ABS:\\n return new SVGPathSegMovetoAbs(owningPathSegList, this._parseNumber(), this._parseNumber());\\n case SVGPathSeg.PATHSEG_LINETO_REL:\\n return new SVGPathSegLinetoRel(owningPathSegList, this._parseNumber(), this._parseNumber());\\n case SVGPathSeg.PATHSEG_LINETO_ABS:\\n return new SVGPathSegLinetoAbs(owningPathSegList, this._parseNumber(), this._parseNumber());\\n case SVGPathSeg.PATHSEG_LINETO_HORIZONTAL_REL:\\n return new SVGPathSegLinetoHorizontalRel(owningPathSegList, this._parseNumber());\\n case SVGPathSeg.PATHSEG_LINETO_HORIZONTAL_ABS:\\n return new SVGPathSegLinetoHorizontalAbs(owningPathSegList, this._parseNumber());\\n case SVGPathSeg.PATHSEG_LINETO_VERTICAL_REL:\\n return new SVGPathSegLinetoVerticalRel(owningPathSegList, this._parseNumber());\\n case SVGPathSeg.PATHSEG_LINETO_VERTICAL_ABS:\\n return new SVGPathSegLinetoVerticalAbs(owningPathSegList, this._parseNumber());\\n case SVGPathSeg.PATHSEG_CLOSEPATH:\\n this._skipOptionalSpaces();\\n return new SVGPathSegClosePath(owningPathSegList);\\n case SVGPathSeg.PATHSEG_CURVETO_CUBIC_REL:\\n var points = {\\n x1: this._parseNumber(),\\n y1: this._parseNumber(),\\n x2: this._parseNumber(),\\n y2: this._parseNumber(),\\n x: this._parseNumber(),\\n y: this._parseNumber()\\n };\\n return new SVGPathSegCurvetoCubicRel(\\n owningPathSegList,\\n points.x,\\n points.y,\\n points.x1,\\n points.y1,\\n points.x2,\\n points.y2\\n );\\n case SVGPathSeg.PATHSEG_CURVETO_CUBIC_ABS:\\n var points = {\\n x1: this._parseNumber(),\\n y1: this._parseNumber(),\\n x2: this._parseNumber(),\\n y2: this._parseNumber(),\\n x: this._parseNumber(),\\n y: this._parseNumber()\\n };\\n return new SVGPathSegCurvetoCubicAbs(\\n owningPathSegList,\\n points.x,\\n points.y,\\n points.x1,\\n points.y1,\\n points.x2,\\n points.y2\\n );\\n case SVGPathSeg.PATHSEG_CURVETO_CUBIC_SMOOTH_REL:\\n var points = {\\n x2: this._parseNumber(),\\n y2: this._parseNumber(),\\n x: this._parseNumber(),\\n y: this._parseNumber()\\n };\\n return new SVGPathSegCurvetoCubicSmoothRel(owningPathSegList, points.x, points.y, points.x2, points.y2);\\n case SVGPathSeg.PATHSEG_CURVETO_CUBIC_SMOOTH_ABS:\\n var points = {\\n x2: this._parseNumber(),\\n y2: this._parseNumber(),\\n x: this._parseNumber(),\\n y: this._parseNumber()\\n };\\n return new SVGPathSegCurvetoCubicSmoothAbs(owningPathSegList, points.x, points.y, points.x2, points.y2);\\n case SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_REL:\\n var points = {\\n x1: this._parseNumber(),\\n y1: this._parseNumber(),\\n x: this._parseNumber(),\\n y: this._parseNumber()\\n };\\n return new SVGPathSegCurvetoQuadraticRel(owningPathSegList, points.x, points.y, points.x1, points.y1);\\n case SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_ABS:\\n var points = {\\n x1: this._parseNumber(),\\n y1: this._parseNumber(),\\n x: this._parseNumber(),\\n y: this._parseNumber()\\n };\\n return new SVGPathSegCurvetoQuadraticAbs(owningPathSegList, points.x, points.y, points.x1, points.y1);\\n case SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_SMOOTH_REL:\\n return new SVGPathSegCurvetoQuadraticSmoothRel(\\n owningPathSegList,\\n this._parseNumber(),\\n this._parseNumber()\\n );\\n case SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_SMOOTH_ABS:\\n return new SVGPathSegCurvetoQuadraticSmoothAbs(\\n owningPathSegList,\\n this._parseNumber(),\\n this._parseNumber()\\n );\\n case SVGPathSeg.PATHSEG_ARC_REL:\\n var points = {\\n x1: this._parseNumber(),\\n y1: this._parseNumber(),\\n arcAngle: this._parseNumber(),\\n arcLarge: this._parseArcFlag(),\\n arcSweep: this._parseArcFlag(),\\n x: this._parseNumber(),\\n y: this._parseNumber()\\n };\\n return new SVGPathSegArcRel(\\n owningPathSegList,\\n points.x,\\n points.y,\\n points.x1,\\n points.y1,\\n points.arcAngle,\\n points.arcLarge,\\n points.arcSweep\\n );\\n case SVGPathSeg.PATHSEG_ARC_ABS:\\n var points = {\\n x1: this._parseNumber(),\\n y1: this._parseNumber(),\\n arcAngle: this._parseNumber(),\\n arcLarge: this._parseArcFlag(),\\n arcSweep: this._parseArcFlag(),\\n x: this._parseNumber(),\\n y: this._parseNumber()\\n };\\n return new SVGPathSegArcAbs(\\n owningPathSegList,\\n points.x,\\n points.y,\\n points.x1,\\n points.y1,\\n points.arcAngle,\\n points.arcLarge,\\n points.arcSweep\\n );\\n default:\\n throw 'Unknown path seg type.';\\n }\\n };\\n\\n var builder = new Builder();\\n var source = new Source(string);\\n\\n if (!source.initialCommandIsMoveTo()) return [];\\n while (source.hasMoreData()) {\\n var pathSeg = source.parseSegment();\\n if (!pathSeg) return [];\\n builder.appendSegment(pathSeg);\\n }\\n\\n return builder.pathSegList;\\n };\\n }\\n })();\\n\\n /* jshint ignore:end */\\n\\n if (typeof define === 'function' && define.amd) {\\n define('c3', ['d3'], function() {\\n return c3;\\n });\\n } else if ('undefined' !== typeof exports && 'undefined' !== typeof module) {\\n module.exports = c3;\\n } else {\\n window.c3 = c3;\\n }\\n})(window);\\n\"\n\n/***/ }),\n\n/***/ 2183:\n/***/ (function(module, exports, __webpack_require__) {\n\n__webpack_require__(3)(__webpack_require__(2184))\n\n/***/ }),\n\n/***/ 2184:\n/***/ (function(module, exports) {\n\nmodule.exports = \"// ┌───────────────────────────────────────────────────────────────────────────────────────────────────────┐ \\\\\\\\\\n// │ Raphaël 2.2.0 - JavaScript Vector Library │ \\\\\\\\\\n// ├───────────────────────────────────────────────────────────────────────────────────────────────────────┤ \\\\\\\\\\n// │ Copyright © 2008-2016 Dmitry Baranovskiy (http://raphaeljs.com) │ \\\\\\\\\\n// │ Copyright © 2008-2016 Sencha Labs (http://sencha.com) │ \\\\\\\\\\n// ├───────────────────────────────────────────────────────────────────────────────────────────────────────┤ \\\\\\\\\\n// │ Licensed under the MIT (https://github.com/DmitryBaranovskiy/raphael/blob/master/license.txt) license.│ \\\\\\\\\\n// └───────────────────────────────────────────────────────────────────────────────────────────────────────┘ \\\\\\\\\\n\\n(function webpackUniversalModuleDefinition(root, factory) {\\n\\tif(typeof exports === 'object' && typeof module === 'object')\\n\\t\\tmodule.exports = factory();\\n\\telse if(typeof define === 'function' && define.amd)\\n\\t\\tdefine([], factory);\\n\\telse if(typeof exports === 'object')\\n\\t\\texports[\\\"Raphael\\\"] = factory();\\n\\telse\\n\\t\\troot[\\\"Raphael\\\"] = factory();\\n})(this, function() {\\nreturn /******/ (function(modules) { // webpackBootstrap\\n/******/ \\t// The module cache\\n/******/ \\tvar installedModules = {};\\n\\n/******/ \\t// The require function\\n/******/ \\tfunction __webpack_require__(moduleId) {\\n\\n/******/ \\t\\t// Check if module is in cache\\n/******/ \\t\\tif(installedModules[moduleId])\\n/******/ \\t\\t\\treturn installedModules[moduleId].exports;\\n\\n/******/ \\t\\t// Create a new module (and put it into the cache)\\n/******/ \\t\\tvar module = installedModules[moduleId] = {\\n/******/ \\t\\t\\texports: {},\\n/******/ \\t\\t\\tid: moduleId,\\n/******/ \\t\\t\\tloaded: false\\n/******/ \\t\\t};\\n\\n/******/ \\t\\t// Execute the module function\\n/******/ \\t\\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\\n\\n/******/ \\t\\t// Flag the module as loaded\\n/******/ \\t\\tmodule.loaded = true;\\n\\n/******/ \\t\\t// Return the exports of the module\\n/******/ \\t\\treturn module.exports;\\n/******/ \\t}\\n\\n\\n/******/ \\t// expose the modules object (__webpack_modules__)\\n/******/ \\t__webpack_require__.m = modules;\\n\\n/******/ \\t// expose the module cache\\n/******/ \\t__webpack_require__.c = installedModules;\\n\\n/******/ \\t// __webpack_public_path__\\n/******/ \\t__webpack_require__.p = \\\"\\\";\\n\\n/******/ \\t// Load entry module and return exports\\n/******/ \\treturn __webpack_require__(0);\\n/******/ })\\n/************************************************************************/\\n/******/ ([\\n/* 0 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(1), __webpack_require__(3), __webpack_require__(4)], __WEBPACK_AMD_DEFINE_RESULT__ = function(R) {\\n\\n\\t return R;\\n\\n\\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\\n\\n/***/ },\\n/* 1 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(2)], __WEBPACK_AMD_DEFINE_RESULT__ = function(eve) {\\n\\n\\t /*\\\\\\n\\t * Raphael\\n\\t [ method ]\\n\\t **\\n\\t * Creates a canvas object on which to draw.\\n\\t * You must do this first, as all future calls to drawing methods\\n\\t * from this instance will be bound to this canvas.\\n\\t > Parameters\\n\\t **\\n\\t - container (HTMLElement|string) DOM element or its ID which is going to be a parent for drawing surface\\n\\t - width (number)\\n\\t - height (number)\\n\\t - callback (function) #optional callback function which is going to be executed in the context of newly created paper\\n\\t * or\\n\\t - x (number)\\n\\t - y (number)\\n\\t - width (number)\\n\\t - height (number)\\n\\t - callback (function) #optional callback function which is going to be executed in the context of newly created paper\\n\\t * or\\n\\t - all (array) (first 3 or 4 elements in the array are equal to [containerID, width, height] or [x, y, width, height]. The rest are element descriptions in format {type: type, }). See @Paper.add.\\n\\t - callback (function) #optional callback function which is going to be executed in the context of newly created paper\\n\\t * or\\n\\t - onReadyCallback (function) function that is going to be called on DOM ready event. You can also subscribe to this event via Eve’s “DOMLoad” event. In this case method returns `undefined`.\\n\\t = (object) @Paper\\n\\t > Usage\\n\\t | // Each of the following examples create a canvas\\n\\t | // that is 320px wide by 200px high.\\n\\t | // Canvas is created at the viewport’s 10,50 coordinate.\\n\\t | var paper = Raphael(10, 50, 320, 200);\\n\\t | // Canvas is created at the top left corner of the #notepad element\\n\\t | // (or its top right corner in dir=\\\"rtl\\\" elements)\\n\\t | var paper = Raphael(document.getElementById(\\\"notepad\\\"), 320, 200);\\n\\t | // Same as above\\n\\t | var paper = Raphael(\\\"notepad\\\", 320, 200);\\n\\t | // Image dump\\n\\t | var set = Raphael([\\\"notepad\\\", 320, 200, {\\n\\t | type: \\\"rect\\\",\\n\\t | x: 10,\\n\\t | y: 10,\\n\\t | width: 25,\\n\\t | height: 25,\\n\\t | stroke: \\\"#f00\\\"\\n\\t | }, {\\n\\t | type: \\\"text\\\",\\n\\t | x: 30,\\n\\t | y: 40,\\n\\t | text: \\\"Dump\\\"\\n\\t | }]);\\n\\t \\\\*/\\n\\t function R(first) {\\n\\t if (R.is(first, \\\"function\\\")) {\\n\\t return loaded ? first() : eve.on(\\\"raphael.DOMload\\\", first);\\n\\t } else if (R.is(first, array)) {\\n\\t return R._engine.create[apply](R, first.splice(0, 3 + R.is(first[0], nu))).add(first);\\n\\t } else {\\n\\t var args = Array.prototype.slice.call(arguments, 0);\\n\\t if (R.is(args[args.length - 1], \\\"function\\\")) {\\n\\t var f = args.pop();\\n\\t return loaded ? f.call(R._engine.create[apply](R, args)) : eve.on(\\\"raphael.DOMload\\\", function () {\\n\\t f.call(R._engine.create[apply](R, args));\\n\\t });\\n\\t } else {\\n\\t return R._engine.create[apply](R, arguments);\\n\\t }\\n\\t }\\n\\t }\\n\\t R.version = \\\"2.2.0\\\";\\n\\t R.eve = eve;\\n\\t var loaded,\\n\\t separator = /[, ]+/,\\n\\t elements = {circle: 1, rect: 1, path: 1, ellipse: 1, text: 1, image: 1},\\n\\t formatrg = /\\\\{(\\\\d+)\\\\}/g,\\n\\t proto = \\\"prototype\\\",\\n\\t has = \\\"hasOwnProperty\\\",\\n\\t g = {\\n\\t doc: document,\\n\\t win: window\\n\\t },\\n\\t oldRaphael = {\\n\\t was: Object.prototype[has].call(g.win, \\\"Raphael\\\"),\\n\\t is: g.win.Raphael\\n\\t },\\n\\t Paper = function () {\\n\\t /*\\\\\\n\\t * Paper.ca\\n\\t [ property (object) ]\\n\\t **\\n\\t * Shortcut for @Paper.customAttributes\\n\\t \\\\*/\\n\\t /*\\\\\\n\\t * Paper.customAttributes\\n\\t [ property (object) ]\\n\\t **\\n\\t * If you have a set of attributes that you would like to represent\\n\\t * as a function of some number you can do it easily with custom attributes:\\n\\t > Usage\\n\\t | paper.customAttributes.hue = function (num) {\\n\\t | num = num % 1;\\n\\t | return {fill: \\\"hsb(\\\" + num + \\\", 0.75, 1)\\\"};\\n\\t | };\\n\\t | // Custom attribute “hue” will change fill\\n\\t | // to be given hue with fixed saturation and brightness.\\n\\t | // Now you can use it like this:\\n\\t | var c = paper.circle(10, 10, 10).attr({hue: .45});\\n\\t | // or even like this:\\n\\t | c.animate({hue: 1}, 1e3);\\n\\t |\\n\\t | // You could also create custom attribute\\n\\t | // with multiple parameters:\\n\\t | paper.customAttributes.hsb = function (h, s, b) {\\n\\t | return {fill: \\\"hsb(\\\" + [h, s, b].join(\\\",\\\") + \\\")\\\"};\\n\\t | };\\n\\t | c.attr({hsb: \\\"0.5 .8 1\\\"});\\n\\t | c.animate({hsb: [1, 0, 0.5]}, 1e3);\\n\\t \\\\*/\\n\\t this.ca = this.customAttributes = {};\\n\\t },\\n\\t paperproto,\\n\\t appendChild = \\\"appendChild\\\",\\n\\t apply = \\\"apply\\\",\\n\\t concat = \\\"concat\\\",\\n\\t supportsTouch = ('ontouchstart' in g.win) || g.win.DocumentTouch && g.doc instanceof DocumentTouch, //taken from Modernizr touch test\\n\\t E = \\\"\\\",\\n\\t S = \\\" \\\",\\n\\t Str = String,\\n\\t split = \\\"split\\\",\\n\\t events = \\\"click dblclick mousedown mousemove mouseout mouseover mouseup touchstart touchmove touchend touchcancel\\\"[split](S),\\n\\t touchMap = {\\n\\t mousedown: \\\"touchstart\\\",\\n\\t mousemove: \\\"touchmove\\\",\\n\\t mouseup: \\\"touchend\\\"\\n\\t },\\n\\t lowerCase = Str.prototype.toLowerCase,\\n\\t math = Math,\\n\\t mmax = math.max,\\n\\t mmin = math.min,\\n\\t abs = math.abs,\\n\\t pow = math.pow,\\n\\t PI = math.PI,\\n\\t nu = \\\"number\\\",\\n\\t string = \\\"string\\\",\\n\\t array = \\\"array\\\",\\n\\t toString = \\\"toString\\\",\\n\\t fillString = \\\"fill\\\",\\n\\t objectToString = Object.prototype.toString,\\n\\t paper = {},\\n\\t push = \\\"push\\\",\\n\\t ISURL = R._ISURL = /^url\\\\(['\\\"]?(.+?)['\\\"]?\\\\)$/i,\\n\\t colourRegExp = /^\\\\s*((#[a-f\\\\d]{6})|(#[a-f\\\\d]{3})|rgba?\\\\(\\\\s*([\\\\d\\\\.]+%?\\\\s*,\\\\s*[\\\\d\\\\.]+%?\\\\s*,\\\\s*[\\\\d\\\\.]+%?(?:\\\\s*,\\\\s*[\\\\d\\\\.]+%?)?)\\\\s*\\\\)|hsba?\\\\(\\\\s*([\\\\d\\\\.]+(?:deg|\\\\xb0|%)?\\\\s*,\\\\s*[\\\\d\\\\.]+%?\\\\s*,\\\\s*[\\\\d\\\\.]+(?:%?\\\\s*,\\\\s*[\\\\d\\\\.]+)?)%?\\\\s*\\\\)|hsla?\\\\(\\\\s*([\\\\d\\\\.]+(?:deg|\\\\xb0|%)?\\\\s*,\\\\s*[\\\\d\\\\.]+%?\\\\s*,\\\\s*[\\\\d\\\\.]+(?:%?\\\\s*,\\\\s*[\\\\d\\\\.]+)?)%?\\\\s*\\\\))\\\\s*$/i,\\n\\t isnan = {\\\"NaN\\\": 1, \\\"Infinity\\\": 1, \\\"-Infinity\\\": 1},\\n\\t bezierrg = /^(?:cubic-)?bezier\\\\(([^,]+),([^,]+),([^,]+),([^\\\\)]+)\\\\)/,\\n\\t round = math.round,\\n\\t setAttribute = \\\"setAttribute\\\",\\n\\t toFloat = parseFloat,\\n\\t toInt = parseInt,\\n\\t upperCase = Str.prototype.toUpperCase,\\n\\t availableAttrs = R._availableAttrs = {\\n\\t \\\"arrow-end\\\": \\\"none\\\",\\n\\t \\\"arrow-start\\\": \\\"none\\\",\\n\\t blur: 0,\\n\\t \\\"clip-rect\\\": \\\"0 0 1e9 1e9\\\",\\n\\t cursor: \\\"default\\\",\\n\\t cx: 0,\\n\\t cy: 0,\\n\\t fill: \\\"#fff\\\",\\n\\t \\\"fill-opacity\\\": 1,\\n\\t font: '10px \\\"Arial\\\"',\\n\\t \\\"font-family\\\": '\\\"Arial\\\"',\\n\\t \\\"font-size\\\": \\\"10\\\",\\n\\t \\\"font-style\\\": \\\"normal\\\",\\n\\t \\\"font-weight\\\": 400,\\n\\t gradient: 0,\\n\\t height: 0,\\n\\t href: \\\"http://raphaeljs.com/\\\",\\n\\t \\\"letter-spacing\\\": 0,\\n\\t opacity: 1,\\n\\t path: \\\"M0,0\\\",\\n\\t r: 0,\\n\\t rx: 0,\\n\\t ry: 0,\\n\\t src: \\\"\\\",\\n\\t stroke: \\\"#000\\\",\\n\\t \\\"stroke-dasharray\\\": \\\"\\\",\\n\\t \\\"stroke-linecap\\\": \\\"butt\\\",\\n\\t \\\"stroke-linejoin\\\": \\\"butt\\\",\\n\\t \\\"stroke-miterlimit\\\": 0,\\n\\t \\\"stroke-opacity\\\": 1,\\n\\t \\\"stroke-width\\\": 1,\\n\\t target: \\\"_blank\\\",\\n\\t \\\"text-anchor\\\": \\\"middle\\\",\\n\\t title: \\\"Raphael\\\",\\n\\t transform: \\\"\\\",\\n\\t width: 0,\\n\\t x: 0,\\n\\t y: 0,\\n\\t class: \\\"\\\"\\n\\t },\\n\\t availableAnimAttrs = R._availableAnimAttrs = {\\n\\t blur: nu,\\n\\t \\\"clip-rect\\\": \\\"csv\\\",\\n\\t cx: nu,\\n\\t cy: nu,\\n\\t fill: \\\"colour\\\",\\n\\t \\\"fill-opacity\\\": nu,\\n\\t \\\"font-size\\\": nu,\\n\\t height: nu,\\n\\t opacity: nu,\\n\\t path: \\\"path\\\",\\n\\t r: nu,\\n\\t rx: nu,\\n\\t ry: nu,\\n\\t stroke: \\\"colour\\\",\\n\\t \\\"stroke-opacity\\\": nu,\\n\\t \\\"stroke-width\\\": nu,\\n\\t transform: \\\"transform\\\",\\n\\t width: nu,\\n\\t x: nu,\\n\\t y: nu\\n\\t },\\n\\t whitespace = /[\\\\x09\\\\x0a\\\\x0b\\\\x0c\\\\x0d\\\\x20\\\\xa0\\\\u1680\\\\u180e\\\\u2000\\\\u2001\\\\u2002\\\\u2003\\\\u2004\\\\u2005\\\\u2006\\\\u2007\\\\u2008\\\\u2009\\\\u200a\\\\u202f\\\\u205f\\\\u3000\\\\u2028\\\\u2029]/g,\\n\\t commaSpaces = /[\\\\x09\\\\x0a\\\\x0b\\\\x0c\\\\x0d\\\\x20\\\\xa0\\\\u1680\\\\u180e\\\\u2000\\\\u2001\\\\u2002\\\\u2003\\\\u2004\\\\u2005\\\\u2006\\\\u2007\\\\u2008\\\\u2009\\\\u200a\\\\u202f\\\\u205f\\\\u3000\\\\u2028\\\\u2029]*,[\\\\x09\\\\x0a\\\\x0b\\\\x0c\\\\x0d\\\\x20\\\\xa0\\\\u1680\\\\u180e\\\\u2000\\\\u2001\\\\u2002\\\\u2003\\\\u2004\\\\u2005\\\\u2006\\\\u2007\\\\u2008\\\\u2009\\\\u200a\\\\u202f\\\\u205f\\\\u3000\\\\u2028\\\\u2029]*/,\\n\\t hsrg = {hs: 1, rg: 1},\\n\\t p2s = /,?([achlmqrstvxz]),?/gi,\\n\\t pathCommand = /([achlmrqstvz])[\\\\x09\\\\x0a\\\\x0b\\\\x0c\\\\x0d\\\\x20\\\\xa0\\\\u1680\\\\u180e\\\\u2000\\\\u2001\\\\u2002\\\\u2003\\\\u2004\\\\u2005\\\\u2006\\\\u2007\\\\u2008\\\\u2009\\\\u200a\\\\u202f\\\\u205f\\\\u3000\\\\u2028\\\\u2029,]*((-?\\\\d*\\\\.?\\\\d*(?:e[\\\\-+]?\\\\d+)?[\\\\x09\\\\x0a\\\\x0b\\\\x0c\\\\x0d\\\\x20\\\\xa0\\\\u1680\\\\u180e\\\\u2000\\\\u2001\\\\u2002\\\\u2003\\\\u2004\\\\u2005\\\\u2006\\\\u2007\\\\u2008\\\\u2009\\\\u200a\\\\u202f\\\\u205f\\\\u3000\\\\u2028\\\\u2029]*,?[\\\\x09\\\\x0a\\\\x0b\\\\x0c\\\\x0d\\\\x20\\\\xa0\\\\u1680\\\\u180e\\\\u2000\\\\u2001\\\\u2002\\\\u2003\\\\u2004\\\\u2005\\\\u2006\\\\u2007\\\\u2008\\\\u2009\\\\u200a\\\\u202f\\\\u205f\\\\u3000\\\\u2028\\\\u2029]*)+)/ig,\\n\\t tCommand = /([rstm])[\\\\x09\\\\x0a\\\\x0b\\\\x0c\\\\x0d\\\\x20\\\\xa0\\\\u1680\\\\u180e\\\\u2000\\\\u2001\\\\u2002\\\\u2003\\\\u2004\\\\u2005\\\\u2006\\\\u2007\\\\u2008\\\\u2009\\\\u200a\\\\u202f\\\\u205f\\\\u3000\\\\u2028\\\\u2029,]*((-?\\\\d*\\\\.?\\\\d*(?:e[\\\\-+]?\\\\d+)?[\\\\x09\\\\x0a\\\\x0b\\\\x0c\\\\x0d\\\\x20\\\\xa0\\\\u1680\\\\u180e\\\\u2000\\\\u2001\\\\u2002\\\\u2003\\\\u2004\\\\u2005\\\\u2006\\\\u2007\\\\u2008\\\\u2009\\\\u200a\\\\u202f\\\\u205f\\\\u3000\\\\u2028\\\\u2029]*,?[\\\\x09\\\\x0a\\\\x0b\\\\x0c\\\\x0d\\\\x20\\\\xa0\\\\u1680\\\\u180e\\\\u2000\\\\u2001\\\\u2002\\\\u2003\\\\u2004\\\\u2005\\\\u2006\\\\u2007\\\\u2008\\\\u2009\\\\u200a\\\\u202f\\\\u205f\\\\u3000\\\\u2028\\\\u2029]*)+)/ig,\\n\\t pathValues = /(-?\\\\d*\\\\.?\\\\d*(?:e[\\\\-+]?\\\\d+)?)[\\\\x09\\\\x0a\\\\x0b\\\\x0c\\\\x0d\\\\x20\\\\xa0\\\\u1680\\\\u180e\\\\u2000\\\\u2001\\\\u2002\\\\u2003\\\\u2004\\\\u2005\\\\u2006\\\\u2007\\\\u2008\\\\u2009\\\\u200a\\\\u202f\\\\u205f\\\\u3000\\\\u2028\\\\u2029]*,?[\\\\x09\\\\x0a\\\\x0b\\\\x0c\\\\x0d\\\\x20\\\\xa0\\\\u1680\\\\u180e\\\\u2000\\\\u2001\\\\u2002\\\\u2003\\\\u2004\\\\u2005\\\\u2006\\\\u2007\\\\u2008\\\\u2009\\\\u200a\\\\u202f\\\\u205f\\\\u3000\\\\u2028\\\\u2029]*/ig,\\n\\t radial_gradient = R._radial_gradient = /^r(?:\\\\(([^,]+?)[\\\\x09\\\\x0a\\\\x0b\\\\x0c\\\\x0d\\\\x20\\\\xa0\\\\u1680\\\\u180e\\\\u2000\\\\u2001\\\\u2002\\\\u2003\\\\u2004\\\\u2005\\\\u2006\\\\u2007\\\\u2008\\\\u2009\\\\u200a\\\\u202f\\\\u205f\\\\u3000\\\\u2028\\\\u2029]*,[\\\\x09\\\\x0a\\\\x0b\\\\x0c\\\\x0d\\\\x20\\\\xa0\\\\u1680\\\\u180e\\\\u2000\\\\u2001\\\\u2002\\\\u2003\\\\u2004\\\\u2005\\\\u2006\\\\u2007\\\\u2008\\\\u2009\\\\u200a\\\\u202f\\\\u205f\\\\u3000\\\\u2028\\\\u2029]*([^\\\\)]+?)\\\\))?/,\\n\\t eldata = {},\\n\\t sortByKey = function (a, b) {\\n\\t return a.key - b.key;\\n\\t },\\n\\t sortByNumber = function (a, b) {\\n\\t return toFloat(a) - toFloat(b);\\n\\t },\\n\\t fun = function () {},\\n\\t pipe = function (x) {\\n\\t return x;\\n\\t },\\n\\t rectPath = R._rectPath = function (x, y, w, h, r) {\\n\\t if (r) {\\n\\t return [[\\\"M\\\", x + r, y], [\\\"l\\\", w - r * 2, 0], [\\\"a\\\", r, r, 0, 0, 1, r, r], [\\\"l\\\", 0, h - r * 2], [\\\"a\\\", r, r, 0, 0, 1, -r, r], [\\\"l\\\", r * 2 - w, 0], [\\\"a\\\", r, r, 0, 0, 1, -r, -r], [\\\"l\\\", 0, r * 2 - h], [\\\"a\\\", r, r, 0, 0, 1, r, -r], [\\\"z\\\"]];\\n\\t }\\n\\t return [[\\\"M\\\", x, y], [\\\"l\\\", w, 0], [\\\"l\\\", 0, h], [\\\"l\\\", -w, 0], [\\\"z\\\"]];\\n\\t },\\n\\t ellipsePath = function (x, y, rx, ry) {\\n\\t if (ry == null) {\\n\\t ry = rx;\\n\\t }\\n\\t return [[\\\"M\\\", x, y], [\\\"m\\\", 0, -ry], [\\\"a\\\", rx, ry, 0, 1, 1, 0, 2 * ry], [\\\"a\\\", rx, ry, 0, 1, 1, 0, -2 * ry], [\\\"z\\\"]];\\n\\t },\\n\\t getPath = R._getPath = {\\n\\t path: function (el) {\\n\\t return el.attr(\\\"path\\\");\\n\\t },\\n\\t circle: function (el) {\\n\\t var a = el.attrs;\\n\\t return ellipsePath(a.cx, a.cy, a.r);\\n\\t },\\n\\t ellipse: function (el) {\\n\\t var a = el.attrs;\\n\\t return ellipsePath(a.cx, a.cy, a.rx, a.ry);\\n\\t },\\n\\t rect: function (el) {\\n\\t var a = el.attrs;\\n\\t return rectPath(a.x, a.y, a.width, a.height, a.r);\\n\\t },\\n\\t image: function (el) {\\n\\t var a = el.attrs;\\n\\t return rectPath(a.x, a.y, a.width, a.height);\\n\\t },\\n\\t text: function (el) {\\n\\t var bbox = el._getBBox();\\n\\t return rectPath(bbox.x, bbox.y, bbox.width, bbox.height);\\n\\t },\\n\\t set : function(el) {\\n\\t var bbox = el._getBBox();\\n\\t return rectPath(bbox.x, bbox.y, bbox.width, bbox.height);\\n\\t }\\n\\t },\\n\\t /*\\\\\\n\\t * Raphael.mapPath\\n\\t [ method ]\\n\\t **\\n\\t * Transform the path string with given matrix.\\n\\t > Parameters\\n\\t - path (string) path string\\n\\t - matrix (object) see @Matrix\\n\\t = (string) transformed path string\\n\\t \\\\*/\\n\\t mapPath = R.mapPath = function (path, matrix) {\\n\\t if (!matrix) {\\n\\t return path;\\n\\t }\\n\\t var x, y, i, j, ii, jj, pathi;\\n\\t path = path2curve(path);\\n\\t for (i = 0, ii = path.length; i < ii; i++) {\\n\\t pathi = path[i];\\n\\t for (j = 1, jj = pathi.length; j < jj; j += 2) {\\n\\t x = matrix.x(pathi[j], pathi[j + 1]);\\n\\t y = matrix.y(pathi[j], pathi[j + 1]);\\n\\t pathi[j] = x;\\n\\t pathi[j + 1] = y;\\n\\t }\\n\\t }\\n\\t return path;\\n\\t };\\n\\n\\t R._g = g;\\n\\t /*\\\\\\n\\t * Raphael.type\\n\\t [ property (string) ]\\n\\t **\\n\\t * Can be “SVG”, “VML” or empty, depending on browser support.\\n\\t \\\\*/\\n\\t R.type = (g.win.SVGAngle || g.doc.implementation.hasFeature(\\\"http://www.w3.org/TR/SVG11/feature#BasicStructure\\\", \\\"1.1\\\") ? \\\"SVG\\\" : \\\"VML\\\");\\n\\t if (R.type == \\\"VML\\\") {\\n\\t var d = g.doc.createElement(\\\"div\\\"),\\n\\t b;\\n\\t d.innerHTML = '';\\n\\t b = d.firstChild;\\n\\t b.style.behavior = \\\"url(#default#VML)\\\";\\n\\t if (!(b && typeof b.adj == \\\"object\\\")) {\\n\\t return (R.type = E);\\n\\t }\\n\\t d = null;\\n\\t }\\n\\t /*\\\\\\n\\t * Raphael.svg\\n\\t [ property (boolean) ]\\n\\t **\\n\\t * `true` if browser supports SVG.\\n\\t \\\\*/\\n\\t /*\\\\\\n\\t * Raphael.vml\\n\\t [ property (boolean) ]\\n\\t **\\n\\t * `true` if browser supports VML.\\n\\t \\\\*/\\n\\t R.svg = !(R.vml = R.type == \\\"VML\\\");\\n\\t R._Paper = Paper;\\n\\t /*\\\\\\n\\t * Raphael.fn\\n\\t [ property (object) ]\\n\\t **\\n\\t * You can add your own method to the canvas. For example if you want to draw a pie chart,\\n\\t * you can create your own pie chart function and ship it as a Raphaël plugin. To do this\\n\\t * you need to extend the `Raphael.fn` object. You should modify the `fn` object before a\\n\\t * Raphaël instance is created, otherwise it will take no effect. Please note that the\\n\\t * ability for namespaced plugins was removed in Raphael 2.0. It is up to the plugin to\\n\\t * ensure any namespacing ensures proper context.\\n\\t > Usage\\n\\t | Raphael.fn.arrow = function (x1, y1, x2, y2, size) {\\n\\t | return this.path( ... );\\n\\t | };\\n\\t | // or create namespace\\n\\t | Raphael.fn.mystuff = {\\n\\t | arrow: function () {…},\\n\\t | star: function () {…},\\n\\t | // etc…\\n\\t | };\\n\\t | var paper = Raphael(10, 10, 630, 480);\\n\\t | // then use it\\n\\t | paper.arrow(10, 10, 30, 30, 5).attr({fill: \\\"#f00\\\"});\\n\\t | paper.mystuff.arrow();\\n\\t | paper.mystuff.star();\\n\\t \\\\*/\\n\\t R.fn = paperproto = Paper.prototype = R.prototype;\\n\\t R._id = 0;\\n\\t /*\\\\\\n\\t * Raphael.is\\n\\t [ method ]\\n\\t **\\n\\t * Handful of replacements for `typeof` operator.\\n\\t > Parameters\\n\\t - o (…) any object or primitive\\n\\t - type (string) name of the type, i.e. “string”, “function”, “number”, etc.\\n\\t = (boolean) is given value is of given type\\n\\t \\\\*/\\n\\t R.is = function (o, type) {\\n\\t type = lowerCase.call(type);\\n\\t if (type == \\\"finite\\\") {\\n\\t return !isnan[has](+o);\\n\\t }\\n\\t if (type == \\\"array\\\") {\\n\\t return o instanceof Array;\\n\\t }\\n\\t return (type == \\\"null\\\" && o === null) ||\\n\\t (type == typeof o && o !== null) ||\\n\\t (type == \\\"object\\\" && o === Object(o)) ||\\n\\t (type == \\\"array\\\" && Array.isArray && Array.isArray(o)) ||\\n\\t objectToString.call(o).slice(8, -1).toLowerCase() == type;\\n\\t };\\n\\n\\t function clone(obj) {\\n\\t if (typeof obj == \\\"function\\\" || Object(obj) !== obj) {\\n\\t return obj;\\n\\t }\\n\\t var res = new obj.constructor;\\n\\t for (var key in obj) if (obj[has](key)) {\\n\\t res[key] = clone(obj[key]);\\n\\t }\\n\\t return res;\\n\\t }\\n\\n\\t /*\\\\\\n\\t * Raphael.angle\\n\\t [ method ]\\n\\t **\\n\\t * Returns angle between two or three points\\n\\t > Parameters\\n\\t - x1 (number) x coord of first point\\n\\t - y1 (number) y coord of first point\\n\\t - x2 (number) x coord of second point\\n\\t - y2 (number) y coord of second point\\n\\t - x3 (number) #optional x coord of third point\\n\\t - y3 (number) #optional y coord of third point\\n\\t = (number) angle in degrees.\\n\\t \\\\*/\\n\\t R.angle = function (x1, y1, x2, y2, x3, y3) {\\n\\t if (x3 == null) {\\n\\t var x = x1 - x2,\\n\\t y = y1 - y2;\\n\\t if (!x && !y) {\\n\\t return 0;\\n\\t }\\n\\t return (180 + math.atan2(-y, -x) * 180 / PI + 360) % 360;\\n\\t } else {\\n\\t return R.angle(x1, y1, x3, y3) - R.angle(x2, y2, x3, y3);\\n\\t }\\n\\t };\\n\\t /*\\\\\\n\\t * Raphael.rad\\n\\t [ method ]\\n\\t **\\n\\t * Transform angle to radians\\n\\t > Parameters\\n\\t - deg (number) angle in degrees\\n\\t = (number) angle in radians.\\n\\t \\\\*/\\n\\t R.rad = function (deg) {\\n\\t return deg % 360 * PI / 180;\\n\\t };\\n\\t /*\\\\\\n\\t * Raphael.deg\\n\\t [ method ]\\n\\t **\\n\\t * Transform angle to degrees\\n\\t > Parameters\\n\\t - rad (number) angle in radians\\n\\t = (number) angle in degrees.\\n\\t \\\\*/\\n\\t R.deg = function (rad) {\\n\\t return Math.round ((rad * 180 / PI% 360)* 1000) / 1000;\\n\\t };\\n\\t /*\\\\\\n\\t * Raphael.snapTo\\n\\t [ method ]\\n\\t **\\n\\t * Snaps given value to given grid.\\n\\t > Parameters\\n\\t - values (array|number) given array of values or step of the grid\\n\\t - value (number) value to adjust\\n\\t - tolerance (number) #optional tolerance for snapping. Default is `10`.\\n\\t = (number) adjusted value.\\n\\t \\\\*/\\n\\t R.snapTo = function (values, value, tolerance) {\\n\\t tolerance = R.is(tolerance, \\\"finite\\\") ? tolerance : 10;\\n\\t if (R.is(values, array)) {\\n\\t var i = values.length;\\n\\t while (i--) if (abs(values[i] - value) <= tolerance) {\\n\\t return values[i];\\n\\t }\\n\\t } else {\\n\\t values = +values;\\n\\t var rem = value % values;\\n\\t if (rem < tolerance) {\\n\\t return value - rem;\\n\\t }\\n\\t if (rem > values - tolerance) {\\n\\t return value - rem + values;\\n\\t }\\n\\t }\\n\\t return value;\\n\\t };\\n\\n\\t /*\\\\\\n\\t * Raphael.createUUID\\n\\t [ method ]\\n\\t **\\n\\t * Returns RFC4122, version 4 ID\\n\\t \\\\*/\\n\\t var createUUID = R.createUUID = (function (uuidRegEx, uuidReplacer) {\\n\\t return function () {\\n\\t return \\\"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\\\".replace(uuidRegEx, uuidReplacer).toUpperCase();\\n\\t };\\n\\t })(/[xy]/g, function (c) {\\n\\t var r = math.random() * 16 | 0,\\n\\t v = c == \\\"x\\\" ? r : (r & 3 | 8);\\n\\t return v.toString(16);\\n\\t });\\n\\n\\t /*\\\\\\n\\t * Raphael.setWindow\\n\\t [ method ]\\n\\t **\\n\\t * Used when you need to draw in `<iframe>`. Switched window to the iframe one.\\n\\t > Parameters\\n\\t - newwin (window) new window object\\n\\t \\\\*/\\n\\t R.setWindow = function (newwin) {\\n\\t eve(\\\"raphael.setWindow\\\", R, g.win, newwin);\\n\\t g.win = newwin;\\n\\t g.doc = g.win.document;\\n\\t if (R._engine.initWin) {\\n\\t R._engine.initWin(g.win);\\n\\t }\\n\\t };\\n\\t var toHex = function (color) {\\n\\t if (R.vml) {\\n\\t // http://dean.edwards.name/weblog/2009/10/convert-any-colour-value-to-hex-in-msie/\\n\\t var trim = /^\\\\s+|\\\\s+$/g;\\n\\t var bod;\\n\\t try {\\n\\t var docum = new ActiveXObject(\\\"htmlfile\\\");\\n\\t docum.write(\\\"\\\");\\n\\t docum.close();\\n\\t bod = docum.body;\\n\\t } catch(e) {\\n\\t bod = createPopup().document.body;\\n\\t }\\n\\t var range = bod.createTextRange();\\n\\t toHex = cacher(function (color) {\\n\\t try {\\n\\t bod.style.color = Str(color).replace(trim, E);\\n\\t var value = range.queryCommandValue(\\\"ForeColor\\\");\\n\\t value = ((value & 255) << 16) | (value & 65280) | ((value & 16711680) >>> 16);\\n\\t return \\\"#\\\" + (\\\"000000\\\" + value.toString(16)).slice(-6);\\n\\t } catch(e) {\\n\\t return \\\"none\\\";\\n\\t }\\n\\t });\\n\\t } else {\\n\\t var i = g.doc.createElement(\\\"i\\\");\\n\\t i.title = \\\"Rapha\\\\xebl Colour Picker\\\";\\n\\t i.style.display = \\\"none\\\";\\n\\t g.doc.body.appendChild(i);\\n\\t toHex = cacher(function (color) {\\n\\t i.style.color = color;\\n\\t return g.doc.defaultView.getComputedStyle(i, E).getPropertyValue(\\\"color\\\");\\n\\t });\\n\\t }\\n\\t return toHex(color);\\n\\t },\\n\\t hsbtoString = function () {\\n\\t return \\\"hsb(\\\" + [this.h, this.s, this.b] + \\\")\\\";\\n\\t },\\n\\t hsltoString = function () {\\n\\t return \\\"hsl(\\\" + [this.h, this.s, this.l] + \\\")\\\";\\n\\t },\\n\\t rgbtoString = function () {\\n\\t return this.hex;\\n\\t },\\n\\t prepareRGB = function (r, g, b) {\\n\\t if (g == null && R.is(r, \\\"object\\\") && \\\"r\\\" in r && \\\"g\\\" in r && \\\"b\\\" in r) {\\n\\t b = r.b;\\n\\t g = r.g;\\n\\t r = r.r;\\n\\t }\\n\\t if (g == null && R.is(r, string)) {\\n\\t var clr = R.getRGB(r);\\n\\t r = clr.r;\\n\\t g = clr.g;\\n\\t b = clr.b;\\n\\t }\\n\\t if (r > 1 || g > 1 || b > 1) {\\n\\t r /= 255;\\n\\t g /= 255;\\n\\t b /= 255;\\n\\t }\\n\\n\\t return [r, g, b];\\n\\t },\\n\\t packageRGB = function (r, g, b, o) {\\n\\t r *= 255;\\n\\t g *= 255;\\n\\t b *= 255;\\n\\t var rgb = {\\n\\t r: r,\\n\\t g: g,\\n\\t b: b,\\n\\t hex: R.rgb(r, g, b),\\n\\t toString: rgbtoString\\n\\t };\\n\\t R.is(o, \\\"finite\\\") && (rgb.opacity = o);\\n\\t return rgb;\\n\\t };\\n\\n\\t /*\\\\\\n\\t * Raphael.color\\n\\t [ method ]\\n\\t **\\n\\t * Parses the color string and returns object with all values for the given color.\\n\\t > Parameters\\n\\t - clr (string) color string in one of the supported formats (see @Raphael.getRGB)\\n\\t = (object) Combined RGB & HSB object in format:\\n\\t o {\\n\\t o r (number) red,\\n\\t o g (number) green,\\n\\t o b (number) blue,\\n\\t o hex (string) color in HTML/CSS format: #••••••,\\n\\t o error (boolean) `true` if string can’t be parsed,\\n\\t o h (number) hue,\\n\\t o s (number) saturation,\\n\\t o v (number) value (brightness),\\n\\t o l (number) lightness\\n\\t o }\\n\\t \\\\*/\\n\\t R.color = function (clr) {\\n\\t var rgb;\\n\\t if (R.is(clr, \\\"object\\\") && \\\"h\\\" in clr && \\\"s\\\" in clr && \\\"b\\\" in clr) {\\n\\t rgb = R.hsb2rgb(clr);\\n\\t clr.r = rgb.r;\\n\\t clr.g = rgb.g;\\n\\t clr.b = rgb.b;\\n\\t clr.hex = rgb.hex;\\n\\t } else if (R.is(clr, \\\"object\\\") && \\\"h\\\" in clr && \\\"s\\\" in clr && \\\"l\\\" in clr) {\\n\\t rgb = R.hsl2rgb(clr);\\n\\t clr.r = rgb.r;\\n\\t clr.g = rgb.g;\\n\\t clr.b = rgb.b;\\n\\t clr.hex = rgb.hex;\\n\\t } else {\\n\\t if (R.is(clr, \\\"string\\\")) {\\n\\t clr = R.getRGB(clr);\\n\\t }\\n\\t if (R.is(clr, \\\"object\\\") && \\\"r\\\" in clr && \\\"g\\\" in clr && \\\"b\\\" in clr) {\\n\\t rgb = R.rgb2hsl(clr);\\n\\t clr.h = rgb.h;\\n\\t clr.s = rgb.s;\\n\\t clr.l = rgb.l;\\n\\t rgb = R.rgb2hsb(clr);\\n\\t clr.v = rgb.b;\\n\\t } else {\\n\\t clr = {hex: \\\"none\\\"};\\n\\t clr.r = clr.g = clr.b = clr.h = clr.s = clr.v = clr.l = -1;\\n\\t }\\n\\t }\\n\\t clr.toString = rgbtoString;\\n\\t return clr;\\n\\t };\\n\\t /*\\\\\\n\\t * Raphael.hsb2rgb\\n\\t [ method ]\\n\\t **\\n\\t * Converts HSB values to RGB object.\\n\\t > Parameters\\n\\t - h (number) hue\\n\\t - s (number) saturation\\n\\t - v (number) value or brightness\\n\\t = (object) RGB object in format:\\n\\t o {\\n\\t o r (number) red,\\n\\t o g (number) green,\\n\\t o b (number) blue,\\n\\t o hex (string) color in HTML/CSS format: #••••••\\n\\t o }\\n\\t \\\\*/\\n\\t R.hsb2rgb = function (h, s, v, o) {\\n\\t if (this.is(h, \\\"object\\\") && \\\"h\\\" in h && \\\"s\\\" in h && \\\"b\\\" in h) {\\n\\t v = h.b;\\n\\t s = h.s;\\n\\t o = h.o;\\n\\t h = h.h;\\n\\t }\\n\\t h *= 360;\\n\\t var R, G, B, X, C;\\n\\t h = (h % 360) / 60;\\n\\t C = v * s;\\n\\t X = C * (1 - abs(h % 2 - 1));\\n\\t R = G = B = v - C;\\n\\n\\t h = ~~h;\\n\\t R += [C, X, 0, 0, X, C][h];\\n\\t G += [X, C, C, X, 0, 0][h];\\n\\t B += [0, 0, X, C, C, X][h];\\n\\t return packageRGB(R, G, B, o);\\n\\t };\\n\\t /*\\\\\\n\\t * Raphael.hsl2rgb\\n\\t [ method ]\\n\\t **\\n\\t * Converts HSL values to RGB object.\\n\\t > Parameters\\n\\t - h (number) hue\\n\\t - s (number) saturation\\n\\t - l (number) luminosity\\n\\t = (object) RGB object in format:\\n\\t o {\\n\\t o r (number) red,\\n\\t o g (number) green,\\n\\t o b (number) blue,\\n\\t o hex (string) color in HTML/CSS format: #••••••\\n\\t o }\\n\\t \\\\*/\\n\\t R.hsl2rgb = function (h, s, l, o) {\\n\\t if (this.is(h, \\\"object\\\") && \\\"h\\\" in h && \\\"s\\\" in h && \\\"l\\\" in h) {\\n\\t l = h.l;\\n\\t s = h.s;\\n\\t h = h.h;\\n\\t }\\n\\t if (h > 1 || s > 1 || l > 1) {\\n\\t h /= 360;\\n\\t s /= 100;\\n\\t l /= 100;\\n\\t }\\n\\t h *= 360;\\n\\t var R, G, B, X, C;\\n\\t h = (h % 360) / 60;\\n\\t C = 2 * s * (l < .5 ? l : 1 - l);\\n\\t X = C * (1 - abs(h % 2 - 1));\\n\\t R = G = B = l - C / 2;\\n\\n\\t h = ~~h;\\n\\t R += [C, X, 0, 0, X, C][h];\\n\\t G += [X, C, C, X, 0, 0][h];\\n\\t B += [0, 0, X, C, C, X][h];\\n\\t return packageRGB(R, G, B, o);\\n\\t };\\n\\t /*\\\\\\n\\t * Raphael.rgb2hsb\\n\\t [ method ]\\n\\t **\\n\\t * Converts RGB values to HSB object.\\n\\t > Parameters\\n\\t - r (number) red\\n\\t - g (number) green\\n\\t - b (number) blue\\n\\t = (object) HSB object in format:\\n\\t o {\\n\\t o h (number) hue\\n\\t o s (number) saturation\\n\\t o b (number) brightness\\n\\t o }\\n\\t \\\\*/\\n\\t R.rgb2hsb = function (r, g, b) {\\n\\t b = prepareRGB(r, g, b);\\n\\t r = b[0];\\n\\t g = b[1];\\n\\t b = b[2];\\n\\n\\t var H, S, V, C;\\n\\t V = mmax(r, g, b);\\n\\t C = V - mmin(r, g, b);\\n\\t H = (C == 0 ? null :\\n\\t V == r ? (g - b) / C :\\n\\t V == g ? (b - r) / C + 2 :\\n\\t (r - g) / C + 4\\n\\t );\\n\\t H = ((H + 360) % 6) * 60 / 360;\\n\\t S = C == 0 ? 0 : C / V;\\n\\t return {h: H, s: S, b: V, toString: hsbtoString};\\n\\t };\\n\\t /*\\\\\\n\\t * Raphael.rgb2hsl\\n\\t [ method ]\\n\\t **\\n\\t * Converts RGB values to HSL object.\\n\\t > Parameters\\n\\t - r (number) red\\n\\t - g (number) green\\n\\t - b (number) blue\\n\\t = (object) HSL object in format:\\n\\t o {\\n\\t o h (number) hue\\n\\t o s (number) saturation\\n\\t o l (number) luminosity\\n\\t o }\\n\\t \\\\*/\\n\\t R.rgb2hsl = function (r, g, b) {\\n\\t b = prepareRGB(r, g, b);\\n\\t r = b[0];\\n\\t g = b[1];\\n\\t b = b[2];\\n\\n\\t var H, S, L, M, m, C;\\n\\t M = mmax(r, g, b);\\n\\t m = mmin(r, g, b);\\n\\t C = M - m;\\n\\t H = (C == 0 ? null :\\n\\t M == r ? (g - b) / C :\\n\\t M == g ? (b - r) / C + 2 :\\n\\t (r - g) / C + 4);\\n\\t H = ((H + 360) % 6) * 60 / 360;\\n\\t L = (M + m) / 2;\\n\\t S = (C == 0 ? 0 :\\n\\t L < .5 ? C / (2 * L) :\\n\\t C / (2 - 2 * L));\\n\\t return {h: H, s: S, l: L, toString: hsltoString};\\n\\t };\\n\\t R._path2string = function () {\\n\\t return this.join(\\\",\\\").replace(p2s, \\\"$1\\\");\\n\\t };\\n\\t function repush(array, item) {\\n\\t for (var i = 0, ii = array.length; i < ii; i++) if (array[i] === item) {\\n\\t return array.push(array.splice(i, 1)[0]);\\n\\t }\\n\\t }\\n\\t function cacher(f, scope, postprocessor) {\\n\\t function newf() {\\n\\t var arg = Array.prototype.slice.call(arguments, 0),\\n\\t args = arg.join(\\\"\\\\u2400\\\"),\\n\\t cache = newf.cache = newf.cache || {},\\n\\t count = newf.count = newf.count || [];\\n\\t if (cache[has](args)) {\\n\\t repush(count, args);\\n\\t return postprocessor ? postprocessor(cache[args]) : cache[args];\\n\\t }\\n\\t count.length >= 1e3 && delete cache[count.shift()];\\n\\t count.push(args);\\n\\t cache[args] = f[apply](scope, arg);\\n\\t return postprocessor ? postprocessor(cache[args]) : cache[args];\\n\\t }\\n\\t return newf;\\n\\t }\\n\\n\\t var preload = R._preload = function (src, f) {\\n\\t var img = g.doc.createElement(\\\"img\\\");\\n\\t img.style.cssText = \\\"position:absolute;left:-9999em;top:-9999em\\\";\\n\\t img.onload = function () {\\n\\t f.call(this);\\n\\t this.onload = null;\\n\\t g.doc.body.removeChild(this);\\n\\t };\\n\\t img.onerror = function () {\\n\\t g.doc.body.removeChild(this);\\n\\t };\\n\\t g.doc.body.appendChild(img);\\n\\t img.src = src;\\n\\t };\\n\\n\\t function clrToString() {\\n\\t return this.hex;\\n\\t }\\n\\n\\t /*\\\\\\n\\t * Raphael.getRGB\\n\\t [ method ]\\n\\t **\\n\\t * Parses colour string as RGB object\\n\\t > Parameters\\n\\t - colour (string) colour string in one of formats:\\n\\t #
    \\n\\t #
  • Colour name (“red”, “green”, “cornflowerblue”, etc)
  • \\n\\t #
  • #••• — shortened HTML colour: (“#000”, “#fc0”, etc)
  • \\n\\t #
  • #•••••• — full length HTML colour: (“#000000”, “#bd2300”)
  • \\n\\t #
  • rgb(•••, •••, •••) — red, green and blue channels’ values: (“rgb(200, 100, 0)”)
  • \\n\\t #
  • rgb(•••%, •••%, •••%) — same as above, but in %: (“rgb(100%, 175%, 0%)”)
  • \\n\\t #
  • hsb(•••, •••, •••) — hue, saturation and brightness values: (“hsb(0.5, 0.25, 1)”)
  • \\n\\t #
  • hsb(•••%, •••%, •••%) — same as above, but in %
  • \\n\\t #
  • hsl(•••, •••, •••) — same as hsb
  • \\n\\t #
  • hsl(•••%, •••%, •••%) — same as hsb
  • \\n\\t #
\\n\\t = (object) RGB object in format:\\n\\t o {\\n\\t o r (number) red,\\n\\t o g (number) green,\\n\\t o b (number) blue\\n\\t o hex (string) color in HTML/CSS format: #••••••,\\n\\t o error (boolean) true if string can’t be parsed\\n\\t o }\\n\\t \\\\*/\\n\\t R.getRGB = cacher(function (colour) {\\n\\t if (!colour || !!((colour = Str(colour)).indexOf(\\\"-\\\") + 1)) {\\n\\t return {r: -1, g: -1, b: -1, hex: \\\"none\\\", error: 1, toString: clrToString};\\n\\t }\\n\\t if (colour == \\\"none\\\") {\\n\\t return {r: -1, g: -1, b: -1, hex: \\\"none\\\", toString: clrToString};\\n\\t }\\n\\t !(hsrg[has](colour.toLowerCase().substring(0, 2)) || colour.charAt() == \\\"#\\\") && (colour = toHex(colour));\\n\\t var res,\\n\\t red,\\n\\t green,\\n\\t blue,\\n\\t opacity,\\n\\t t,\\n\\t values,\\n\\t rgb = colour.match(colourRegExp);\\n\\t if (rgb) {\\n\\t if (rgb[2]) {\\n\\t blue = toInt(rgb[2].substring(5), 16);\\n\\t green = toInt(rgb[2].substring(3, 5), 16);\\n\\t red = toInt(rgb[2].substring(1, 3), 16);\\n\\t }\\n\\t if (rgb[3]) {\\n\\t blue = toInt((t = rgb[3].charAt(3)) + t, 16);\\n\\t green = toInt((t = rgb[3].charAt(2)) + t, 16);\\n\\t red = toInt((t = rgb[3].charAt(1)) + t, 16);\\n\\t }\\n\\t if (rgb[4]) {\\n\\t values = rgb[4][split](commaSpaces);\\n\\t red = toFloat(values[0]);\\n\\t values[0].slice(-1) == \\\"%\\\" && (red *= 2.55);\\n\\t green = toFloat(values[1]);\\n\\t values[1].slice(-1) == \\\"%\\\" && (green *= 2.55);\\n\\t blue = toFloat(values[2]);\\n\\t values[2].slice(-1) == \\\"%\\\" && (blue *= 2.55);\\n\\t rgb[1].toLowerCase().slice(0, 4) == \\\"rgba\\\" && (opacity = toFloat(values[3]));\\n\\t values[3] && values[3].slice(-1) == \\\"%\\\" && (opacity /= 100);\\n\\t }\\n\\t if (rgb[5]) {\\n\\t values = rgb[5][split](commaSpaces);\\n\\t red = toFloat(values[0]);\\n\\t values[0].slice(-1) == \\\"%\\\" && (red *= 2.55);\\n\\t green = toFloat(values[1]);\\n\\t values[1].slice(-1) == \\\"%\\\" && (green *= 2.55);\\n\\t blue = toFloat(values[2]);\\n\\t values[2].slice(-1) == \\\"%\\\" && (blue *= 2.55);\\n\\t (values[0].slice(-3) == \\\"deg\\\" || values[0].slice(-1) == \\\"\\\\xb0\\\") && (red /= 360);\\n\\t rgb[1].toLowerCase().slice(0, 4) == \\\"hsba\\\" && (opacity = toFloat(values[3]));\\n\\t values[3] && values[3].slice(-1) == \\\"%\\\" && (opacity /= 100);\\n\\t return R.hsb2rgb(red, green, blue, opacity);\\n\\t }\\n\\t if (rgb[6]) {\\n\\t values = rgb[6][split](commaSpaces);\\n\\t red = toFloat(values[0]);\\n\\t values[0].slice(-1) == \\\"%\\\" && (red *= 2.55);\\n\\t green = toFloat(values[1]);\\n\\t values[1].slice(-1) == \\\"%\\\" && (green *= 2.55);\\n\\t blue = toFloat(values[2]);\\n\\t values[2].slice(-1) == \\\"%\\\" && (blue *= 2.55);\\n\\t (values[0].slice(-3) == \\\"deg\\\" || values[0].slice(-1) == \\\"\\\\xb0\\\") && (red /= 360);\\n\\t rgb[1].toLowerCase().slice(0, 4) == \\\"hsla\\\" && (opacity = toFloat(values[3]));\\n\\t values[3] && values[3].slice(-1) == \\\"%\\\" && (opacity /= 100);\\n\\t return R.hsl2rgb(red, green, blue, opacity);\\n\\t }\\n\\t rgb = {r: red, g: green, b: blue, toString: clrToString};\\n\\t rgb.hex = \\\"#\\\" + (16777216 | blue | (green << 8) | (red << 16)).toString(16).slice(1);\\n\\t R.is(opacity, \\\"finite\\\") && (rgb.opacity = opacity);\\n\\t return rgb;\\n\\t }\\n\\t return {r: -1, g: -1, b: -1, hex: \\\"none\\\", error: 1, toString: clrToString};\\n\\t }, R);\\n\\t /*\\\\\\n\\t * Raphael.hsb\\n\\t [ method ]\\n\\t **\\n\\t * Converts HSB values to hex representation of the colour.\\n\\t > Parameters\\n\\t - h (number) hue\\n\\t - s (number) saturation\\n\\t - b (number) value or brightness\\n\\t = (string) hex representation of the colour.\\n\\t \\\\*/\\n\\t R.hsb = cacher(function (h, s, b) {\\n\\t return R.hsb2rgb(h, s, b).hex;\\n\\t });\\n\\t /*\\\\\\n\\t * Raphael.hsl\\n\\t [ method ]\\n\\t **\\n\\t * Converts HSL values to hex representation of the colour.\\n\\t > Parameters\\n\\t - h (number) hue\\n\\t - s (number) saturation\\n\\t - l (number) luminosity\\n\\t = (string) hex representation of the colour.\\n\\t \\\\*/\\n\\t R.hsl = cacher(function (h, s, l) {\\n\\t return R.hsl2rgb(h, s, l).hex;\\n\\t });\\n\\t /*\\\\\\n\\t * Raphael.rgb\\n\\t [ method ]\\n\\t **\\n\\t * Converts RGB values to hex representation of the colour.\\n\\t > Parameters\\n\\t - r (number) red\\n\\t - g (number) green\\n\\t - b (number) blue\\n\\t = (string) hex representation of the colour.\\n\\t \\\\*/\\n\\t R.rgb = cacher(function (r, g, b) {\\n\\t function round(x) { return (x + 0.5) | 0; }\\n\\t return \\\"#\\\" + (16777216 | round(b) | (round(g) << 8) | (round(r) << 16)).toString(16).slice(1);\\n\\t });\\n\\t /*\\\\\\n\\t * Raphael.getColor\\n\\t [ method ]\\n\\t **\\n\\t * On each call returns next colour in the spectrum. To reset it back to red call @Raphael.getColor.reset\\n\\t > Parameters\\n\\t - value (number) #optional brightness, default is `0.75`\\n\\t = (string) hex representation of the colour.\\n\\t \\\\*/\\n\\t R.getColor = function (value) {\\n\\t var start = this.getColor.start = this.getColor.start || {h: 0, s: 1, b: value || .75},\\n\\t rgb = this.hsb2rgb(start.h, start.s, start.b);\\n\\t start.h += .075;\\n\\t if (start.h > 1) {\\n\\t start.h = 0;\\n\\t start.s -= .2;\\n\\t start.s <= 0 && (this.getColor.start = {h: 0, s: 1, b: start.b});\\n\\t }\\n\\t return rgb.hex;\\n\\t };\\n\\t /*\\\\\\n\\t * Raphael.getColor.reset\\n\\t [ method ]\\n\\t **\\n\\t * Resets spectrum position for @Raphael.getColor back to red.\\n\\t \\\\*/\\n\\t R.getColor.reset = function () {\\n\\t delete this.start;\\n\\t };\\n\\n\\t // http://schepers.cc/getting-to-the-point\\n\\t function catmullRom2bezier(crp, z) {\\n\\t var d = [];\\n\\t for (var i = 0, iLen = crp.length; iLen - 2 * !z > i; i += 2) {\\n\\t var p = [\\n\\t {x: +crp[i - 2], y: +crp[i - 1]},\\n\\t {x: +crp[i], y: +crp[i + 1]},\\n\\t {x: +crp[i + 2], y: +crp[i + 3]},\\n\\t {x: +crp[i + 4], y: +crp[i + 5]}\\n\\t ];\\n\\t if (z) {\\n\\t if (!i) {\\n\\t p[0] = {x: +crp[iLen - 2], y: +crp[iLen - 1]};\\n\\t } else if (iLen - 4 == i) {\\n\\t p[3] = {x: +crp[0], y: +crp[1]};\\n\\t } else if (iLen - 2 == i) {\\n\\t p[2] = {x: +crp[0], y: +crp[1]};\\n\\t p[3] = {x: +crp[2], y: +crp[3]};\\n\\t }\\n\\t } else {\\n\\t if (iLen - 4 == i) {\\n\\t p[3] = p[2];\\n\\t } else if (!i) {\\n\\t p[0] = {x: +crp[i], y: +crp[i + 1]};\\n\\t }\\n\\t }\\n\\t d.push([\\\"C\\\",\\n\\t (-p[0].x + 6 * p[1].x + p[2].x) / 6,\\n\\t (-p[0].y + 6 * p[1].y + p[2].y) / 6,\\n\\t (p[1].x + 6 * p[2].x - p[3].x) / 6,\\n\\t (p[1].y + 6*p[2].y - p[3].y) / 6,\\n\\t p[2].x,\\n\\t p[2].y\\n\\t ]);\\n\\t }\\n\\n\\t return d;\\n\\t }\\n\\t /*\\\\\\n\\t * Raphael.parsePathString\\n\\t [ method ]\\n\\t **\\n\\t * Utility method\\n\\t **\\n\\t * Parses given path string into an array of arrays of path segments.\\n\\t > Parameters\\n\\t - pathString (string|array) path string or array of segments (in the last case it will be returned straight away)\\n\\t = (array) array of segments.\\n\\t \\\\*/\\n\\t R.parsePathString = function (pathString) {\\n\\t if (!pathString) {\\n\\t return null;\\n\\t }\\n\\t var pth = paths(pathString);\\n\\t if (pth.arr) {\\n\\t return pathClone(pth.arr);\\n\\t }\\n\\n\\t var paramCounts = {a: 7, c: 6, h: 1, l: 2, m: 2, r: 4, q: 4, s: 4, t: 2, v: 1, z: 0},\\n\\t data = [];\\n\\t if (R.is(pathString, array) && R.is(pathString[0], array)) { // rough assumption\\n\\t data = pathClone(pathString);\\n\\t }\\n\\t if (!data.length) {\\n\\t Str(pathString).replace(pathCommand, function (a, b, c) {\\n\\t var params = [],\\n\\t name = b.toLowerCase();\\n\\t c.replace(pathValues, function (a, b) {\\n\\t b && params.push(+b);\\n\\t });\\n\\t if (name == \\\"m\\\" && params.length > 2) {\\n\\t data.push([b][concat](params.splice(0, 2)));\\n\\t name = \\\"l\\\";\\n\\t b = b == \\\"m\\\" ? \\\"l\\\" : \\\"L\\\";\\n\\t }\\n\\t if (name == \\\"r\\\") {\\n\\t data.push([b][concat](params));\\n\\t } else while (params.length >= paramCounts[name]) {\\n\\t data.push([b][concat](params.splice(0, paramCounts[name])));\\n\\t if (!paramCounts[name]) {\\n\\t break;\\n\\t }\\n\\t }\\n\\t });\\n\\t }\\n\\t data.toString = R._path2string;\\n\\t pth.arr = pathClone(data);\\n\\t return data;\\n\\t };\\n\\t /*\\\\\\n\\t * Raphael.parseTransformString\\n\\t [ method ]\\n\\t **\\n\\t * Utility method\\n\\t **\\n\\t * Parses given path string into an array of transformations.\\n\\t > Parameters\\n\\t - TString (string|array) transform string or array of transformations (in the last case it will be returned straight away)\\n\\t = (array) array of transformations.\\n\\t \\\\*/\\n\\t R.parseTransformString = cacher(function (TString) {\\n\\t if (!TString) {\\n\\t return null;\\n\\t }\\n\\t var paramCounts = {r: 3, s: 4, t: 2, m: 6},\\n\\t data = [];\\n\\t if (R.is(TString, array) && R.is(TString[0], array)) { // rough assumption\\n\\t data = pathClone(TString);\\n\\t }\\n\\t if (!data.length) {\\n\\t Str(TString).replace(tCommand, function (a, b, c) {\\n\\t var params = [],\\n\\t name = lowerCase.call(b);\\n\\t c.replace(pathValues, function (a, b) {\\n\\t b && params.push(+b);\\n\\t });\\n\\t data.push([b][concat](params));\\n\\t });\\n\\t }\\n\\t data.toString = R._path2string;\\n\\t return data;\\n\\t });\\n\\t // PATHS\\n\\t var paths = function (ps) {\\n\\t var p = paths.ps = paths.ps || {};\\n\\t if (p[ps]) {\\n\\t p[ps].sleep = 100;\\n\\t } else {\\n\\t p[ps] = {\\n\\t sleep: 100\\n\\t };\\n\\t }\\n\\t setTimeout(function () {\\n\\t for (var key in p) if (p[has](key) && key != ps) {\\n\\t p[key].sleep--;\\n\\t !p[key].sleep && delete p[key];\\n\\t }\\n\\t });\\n\\t return p[ps];\\n\\t };\\n\\t /*\\\\\\n\\t * Raphael.findDotsAtSegment\\n\\t [ method ]\\n\\t **\\n\\t * Utility method\\n\\t **\\n\\t * Find dot coordinates on the given cubic bezier curve at the given t.\\n\\t > Parameters\\n\\t - p1x (number) x of the first point of the curve\\n\\t - p1y (number) y of the first point of the curve\\n\\t - c1x (number) x of the first anchor of the curve\\n\\t - c1y (number) y of the first anchor of the curve\\n\\t - c2x (number) x of the second anchor of the curve\\n\\t - c2y (number) y of the second anchor of the curve\\n\\t - p2x (number) x of the second point of the curve\\n\\t - p2y (number) y of the second point of the curve\\n\\t - t (number) position on the curve (0..1)\\n\\t = (object) point information in format:\\n\\t o {\\n\\t o x: (number) x coordinate of the point\\n\\t o y: (number) y coordinate of the point\\n\\t o m: {\\n\\t o x: (number) x coordinate of the left anchor\\n\\t o y: (number) y coordinate of the left anchor\\n\\t o }\\n\\t o n: {\\n\\t o x: (number) x coordinate of the right anchor\\n\\t o y: (number) y coordinate of the right anchor\\n\\t o }\\n\\t o start: {\\n\\t o x: (number) x coordinate of the start of the curve\\n\\t o y: (number) y coordinate of the start of the curve\\n\\t o }\\n\\t o end: {\\n\\t o x: (number) x coordinate of the end of the curve\\n\\t o y: (number) y coordinate of the end of the curve\\n\\t o }\\n\\t o alpha: (number) angle of the curve derivative at the point\\n\\t o }\\n\\t \\\\*/\\n\\t R.findDotsAtSegment = function (p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t) {\\n\\t var t1 = 1 - t,\\n\\t t13 = pow(t1, 3),\\n\\t t12 = pow(t1, 2),\\n\\t t2 = t * t,\\n\\t t3 = t2 * t,\\n\\t x = t13 * p1x + t12 * 3 * t * c1x + t1 * 3 * t * t * c2x + t3 * p2x,\\n\\t y = t13 * p1y + t12 * 3 * t * c1y + t1 * 3 * t * t * c2y + t3 * p2y,\\n\\t mx = p1x + 2 * t * (c1x - p1x) + t2 * (c2x - 2 * c1x + p1x),\\n\\t my = p1y + 2 * t * (c1y - p1y) + t2 * (c2y - 2 * c1y + p1y),\\n\\t nx = c1x + 2 * t * (c2x - c1x) + t2 * (p2x - 2 * c2x + c1x),\\n\\t ny = c1y + 2 * t * (c2y - c1y) + t2 * (p2y - 2 * c2y + c1y),\\n\\t ax = t1 * p1x + t * c1x,\\n\\t ay = t1 * p1y + t * c1y,\\n\\t cx = t1 * c2x + t * p2x,\\n\\t cy = t1 * c2y + t * p2y,\\n\\t alpha = (90 - math.atan2(mx - nx, my - ny) * 180 / PI);\\n\\t (mx > nx || my < ny) && (alpha += 180);\\n\\t return {\\n\\t x: x,\\n\\t y: y,\\n\\t m: {x: mx, y: my},\\n\\t n: {x: nx, y: ny},\\n\\t start: {x: ax, y: ay},\\n\\t end: {x: cx, y: cy},\\n\\t alpha: alpha\\n\\t };\\n\\t };\\n\\t /*\\\\\\n\\t * Raphael.bezierBBox\\n\\t [ method ]\\n\\t **\\n\\t * Utility method\\n\\t **\\n\\t * Return bounding box of a given cubic bezier curve\\n\\t > Parameters\\n\\t - p1x (number) x of the first point of the curve\\n\\t - p1y (number) y of the first point of the curve\\n\\t - c1x (number) x of the first anchor of the curve\\n\\t - c1y (number) y of the first anchor of the curve\\n\\t - c2x (number) x of the second anchor of the curve\\n\\t - c2y (number) y of the second anchor of the curve\\n\\t - p2x (number) x of the second point of the curve\\n\\t - p2y (number) y of the second point of the curve\\n\\t * or\\n\\t - bez (array) array of six points for bezier curve\\n\\t = (object) point information in format:\\n\\t o {\\n\\t o min: {\\n\\t o x: (number) x coordinate of the left point\\n\\t o y: (number) y coordinate of the top point\\n\\t o }\\n\\t o max: {\\n\\t o x: (number) x coordinate of the right point\\n\\t o y: (number) y coordinate of the bottom point\\n\\t o }\\n\\t o }\\n\\t \\\\*/\\n\\t R.bezierBBox = function (p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y) {\\n\\t if (!R.is(p1x, \\\"array\\\")) {\\n\\t p1x = [p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y];\\n\\t }\\n\\t var bbox = curveDim.apply(null, p1x);\\n\\t return {\\n\\t x: bbox.min.x,\\n\\t y: bbox.min.y,\\n\\t x2: bbox.max.x,\\n\\t y2: bbox.max.y,\\n\\t width: bbox.max.x - bbox.min.x,\\n\\t height: bbox.max.y - bbox.min.y\\n\\t };\\n\\t };\\n\\t /*\\\\\\n\\t * Raphael.isPointInsideBBox\\n\\t [ method ]\\n\\t **\\n\\t * Utility method\\n\\t **\\n\\t * Returns `true` if given point is inside bounding boxes.\\n\\t > Parameters\\n\\t - bbox (string) bounding box\\n\\t - x (string) x coordinate of the point\\n\\t - y (string) y coordinate of the point\\n\\t = (boolean) `true` if point inside\\n\\t \\\\*/\\n\\t R.isPointInsideBBox = function (bbox, x, y) {\\n\\t return x >= bbox.x && x <= bbox.x2 && y >= bbox.y && y <= bbox.y2;\\n\\t };\\n\\t /*\\\\\\n\\t * Raphael.isBBoxIntersect\\n\\t [ method ]\\n\\t **\\n\\t * Utility method\\n\\t **\\n\\t * Returns `true` if two bounding boxes intersect\\n\\t > Parameters\\n\\t - bbox1 (string) first bounding box\\n\\t - bbox2 (string) second bounding box\\n\\t = (boolean) `true` if they intersect\\n\\t \\\\*/\\n\\t R.isBBoxIntersect = function (bbox1, bbox2) {\\n\\t var i = R.isPointInsideBBox;\\n\\t return i(bbox2, bbox1.x, bbox1.y)\\n\\t || i(bbox2, bbox1.x2, bbox1.y)\\n\\t || i(bbox2, bbox1.x, bbox1.y2)\\n\\t || i(bbox2, bbox1.x2, bbox1.y2)\\n\\t || i(bbox1, bbox2.x, bbox2.y)\\n\\t || i(bbox1, bbox2.x2, bbox2.y)\\n\\t || i(bbox1, bbox2.x, bbox2.y2)\\n\\t || i(bbox1, bbox2.x2, bbox2.y2)\\n\\t || (bbox1.x < bbox2.x2 && bbox1.x > bbox2.x || bbox2.x < bbox1.x2 && bbox2.x > bbox1.x)\\n\\t && (bbox1.y < bbox2.y2 && bbox1.y > bbox2.y || bbox2.y < bbox1.y2 && bbox2.y > bbox1.y);\\n\\t };\\n\\t function base3(t, p1, p2, p3, p4) {\\n\\t var t1 = -3 * p1 + 9 * p2 - 9 * p3 + 3 * p4,\\n\\t t2 = t * t1 + 6 * p1 - 12 * p2 + 6 * p3;\\n\\t return t * t2 - 3 * p1 + 3 * p2;\\n\\t }\\n\\t function bezlen(x1, y1, x2, y2, x3, y3, x4, y4, z) {\\n\\t if (z == null) {\\n\\t z = 1;\\n\\t }\\n\\t z = z > 1 ? 1 : z < 0 ? 0 : z;\\n\\t var z2 = z / 2,\\n\\t n = 12,\\n\\t Tvalues = [-0.1252,0.1252,-0.3678,0.3678,-0.5873,0.5873,-0.7699,0.7699,-0.9041,0.9041,-0.9816,0.9816],\\n\\t Cvalues = [0.2491,0.2491,0.2335,0.2335,0.2032,0.2032,0.1601,0.1601,0.1069,0.1069,0.0472,0.0472],\\n\\t sum = 0;\\n\\t for (var i = 0; i < n; i++) {\\n\\t var ct = z2 * Tvalues[i] + z2,\\n\\t xbase = base3(ct, x1, x2, x3, x4),\\n\\t ybase = base3(ct, y1, y2, y3, y4),\\n\\t comb = xbase * xbase + ybase * ybase;\\n\\t sum += Cvalues[i] * math.sqrt(comb);\\n\\t }\\n\\t return z2 * sum;\\n\\t }\\n\\t function getTatLen(x1, y1, x2, y2, x3, y3, x4, y4, ll) {\\n\\t if (ll < 0 || bezlen(x1, y1, x2, y2, x3, y3, x4, y4) < ll) {\\n\\t return;\\n\\t }\\n\\t var t = 1,\\n\\t step = t / 2,\\n\\t t2 = t - step,\\n\\t l,\\n\\t e = .01;\\n\\t l = bezlen(x1, y1, x2, y2, x3, y3, x4, y4, t2);\\n\\t while (abs(l - ll) > e) {\\n\\t step /= 2;\\n\\t t2 += (l < ll ? 1 : -1) * step;\\n\\t l = bezlen(x1, y1, x2, y2, x3, y3, x4, y4, t2);\\n\\t }\\n\\t return t2;\\n\\t }\\n\\t function intersect(x1, y1, x2, y2, x3, y3, x4, y4) {\\n\\t if (\\n\\t mmax(x1, x2) < mmin(x3, x4) ||\\n\\t mmin(x1, x2) > mmax(x3, x4) ||\\n\\t mmax(y1, y2) < mmin(y3, y4) ||\\n\\t mmin(y1, y2) > mmax(y3, y4)\\n\\t ) {\\n\\t return;\\n\\t }\\n\\t var nx = (x1 * y2 - y1 * x2) * (x3 - x4) - (x1 - x2) * (x3 * y4 - y3 * x4),\\n\\t ny = (x1 * y2 - y1 * x2) * (y3 - y4) - (y1 - y2) * (x3 * y4 - y3 * x4),\\n\\t denominator = (x1 - x2) * (y3 - y4) - (y1 - y2) * (x3 - x4);\\n\\n\\t if (!denominator) {\\n\\t return;\\n\\t }\\n\\t var px = nx / denominator,\\n\\t py = ny / denominator,\\n\\t px2 = +px.toFixed(2),\\n\\t py2 = +py.toFixed(2);\\n\\t if (\\n\\t px2 < +mmin(x1, x2).toFixed(2) ||\\n\\t px2 > +mmax(x1, x2).toFixed(2) ||\\n\\t px2 < +mmin(x3, x4).toFixed(2) ||\\n\\t px2 > +mmax(x3, x4).toFixed(2) ||\\n\\t py2 < +mmin(y1, y2).toFixed(2) ||\\n\\t py2 > +mmax(y1, y2).toFixed(2) ||\\n\\t py2 < +mmin(y3, y4).toFixed(2) ||\\n\\t py2 > +mmax(y3, y4).toFixed(2)\\n\\t ) {\\n\\t return;\\n\\t }\\n\\t return {x: px, y: py};\\n\\t }\\n\\t function inter(bez1, bez2) {\\n\\t return interHelper(bez1, bez2);\\n\\t }\\n\\t function interCount(bez1, bez2) {\\n\\t return interHelper(bez1, bez2, 1);\\n\\t }\\n\\t function interHelper(bez1, bez2, justCount) {\\n\\t var bbox1 = R.bezierBBox(bez1),\\n\\t bbox2 = R.bezierBBox(bez2);\\n\\t if (!R.isBBoxIntersect(bbox1, bbox2)) {\\n\\t return justCount ? 0 : [];\\n\\t }\\n\\t var l1 = bezlen.apply(0, bez1),\\n\\t l2 = bezlen.apply(0, bez2),\\n\\t n1 = mmax(~~(l1 / 5), 1),\\n\\t n2 = mmax(~~(l2 / 5), 1),\\n\\t dots1 = [],\\n\\t dots2 = [],\\n\\t xy = {},\\n\\t res = justCount ? 0 : [];\\n\\t for (var i = 0; i < n1 + 1; i++) {\\n\\t var p = R.findDotsAtSegment.apply(R, bez1.concat(i / n1));\\n\\t dots1.push({x: p.x, y: p.y, t: i / n1});\\n\\t }\\n\\t for (i = 0; i < n2 + 1; i++) {\\n\\t p = R.findDotsAtSegment.apply(R, bez2.concat(i / n2));\\n\\t dots2.push({x: p.x, y: p.y, t: i / n2});\\n\\t }\\n\\t for (i = 0; i < n1; i++) {\\n\\t for (var j = 0; j < n2; j++) {\\n\\t var di = dots1[i],\\n\\t di1 = dots1[i + 1],\\n\\t dj = dots2[j],\\n\\t dj1 = dots2[j + 1],\\n\\t ci = abs(di1.x - di.x) < .001 ? \\\"y\\\" : \\\"x\\\",\\n\\t cj = abs(dj1.x - dj.x) < .001 ? \\\"y\\\" : \\\"x\\\",\\n\\t is = intersect(di.x, di.y, di1.x, di1.y, dj.x, dj.y, dj1.x, dj1.y);\\n\\t if (is) {\\n\\t if (xy[is.x.toFixed(4)] == is.y.toFixed(4)) {\\n\\t continue;\\n\\t }\\n\\t xy[is.x.toFixed(4)] = is.y.toFixed(4);\\n\\t var t1 = di.t + abs((is[ci] - di[ci]) / (di1[ci] - di[ci])) * (di1.t - di.t),\\n\\t t2 = dj.t + abs((is[cj] - dj[cj]) / (dj1[cj] - dj[cj])) * (dj1.t - dj.t);\\n\\t if (t1 >= 0 && t1 <= 1.001 && t2 >= 0 && t2 <= 1.001) {\\n\\t if (justCount) {\\n\\t res++;\\n\\t } else {\\n\\t res.push({\\n\\t x: is.x,\\n\\t y: is.y,\\n\\t t1: mmin(t1, 1),\\n\\t t2: mmin(t2, 1)\\n\\t });\\n\\t }\\n\\t }\\n\\t }\\n\\t }\\n\\t }\\n\\t return res;\\n\\t }\\n\\t /*\\\\\\n\\t * Raphael.pathIntersection\\n\\t [ method ]\\n\\t **\\n\\t * Utility method\\n\\t **\\n\\t * Finds intersections of two paths\\n\\t > Parameters\\n\\t - path1 (string) path string\\n\\t - path2 (string) path string\\n\\t = (array) dots of intersection\\n\\t o [\\n\\t o {\\n\\t o x: (number) x coordinate of the point\\n\\t o y: (number) y coordinate of the point\\n\\t o t1: (number) t value for segment of path1\\n\\t o t2: (number) t value for segment of path2\\n\\t o segment1: (number) order number for segment of path1\\n\\t o segment2: (number) order number for segment of path2\\n\\t o bez1: (array) eight coordinates representing beziér curve for the segment of path1\\n\\t o bez2: (array) eight coordinates representing beziér curve for the segment of path2\\n\\t o }\\n\\t o ]\\n\\t \\\\*/\\n\\t R.pathIntersection = function (path1, path2) {\\n\\t return interPathHelper(path1, path2);\\n\\t };\\n\\t R.pathIntersectionNumber = function (path1, path2) {\\n\\t return interPathHelper(path1, path2, 1);\\n\\t };\\n\\t function interPathHelper(path1, path2, justCount) {\\n\\t path1 = R._path2curve(path1);\\n\\t path2 = R._path2curve(path2);\\n\\t var x1, y1, x2, y2, x1m, y1m, x2m, y2m, bez1, bez2,\\n\\t res = justCount ? 0 : [];\\n\\t for (var i = 0, ii = path1.length; i < ii; i++) {\\n\\t var pi = path1[i];\\n\\t if (pi[0] == \\\"M\\\") {\\n\\t x1 = x1m = pi[1];\\n\\t y1 = y1m = pi[2];\\n\\t } else {\\n\\t if (pi[0] == \\\"C\\\") {\\n\\t bez1 = [x1, y1].concat(pi.slice(1));\\n\\t x1 = bez1[6];\\n\\t y1 = bez1[7];\\n\\t } else {\\n\\t bez1 = [x1, y1, x1, y1, x1m, y1m, x1m, y1m];\\n\\t x1 = x1m;\\n\\t y1 = y1m;\\n\\t }\\n\\t for (var j = 0, jj = path2.length; j < jj; j++) {\\n\\t var pj = path2[j];\\n\\t if (pj[0] == \\\"M\\\") {\\n\\t x2 = x2m = pj[1];\\n\\t y2 = y2m = pj[2];\\n\\t } else {\\n\\t if (pj[0] == \\\"C\\\") {\\n\\t bez2 = [x2, y2].concat(pj.slice(1));\\n\\t x2 = bez2[6];\\n\\t y2 = bez2[7];\\n\\t } else {\\n\\t bez2 = [x2, y2, x2, y2, x2m, y2m, x2m, y2m];\\n\\t x2 = x2m;\\n\\t y2 = y2m;\\n\\t }\\n\\t var intr = interHelper(bez1, bez2, justCount);\\n\\t if (justCount) {\\n\\t res += intr;\\n\\t } else {\\n\\t for (var k = 0, kk = intr.length; k < kk; k++) {\\n\\t intr[k].segment1 = i;\\n\\t intr[k].segment2 = j;\\n\\t intr[k].bez1 = bez1;\\n\\t intr[k].bez2 = bez2;\\n\\t }\\n\\t res = res.concat(intr);\\n\\t }\\n\\t }\\n\\t }\\n\\t }\\n\\t }\\n\\t return res;\\n\\t }\\n\\t /*\\\\\\n\\t * Raphael.isPointInsidePath\\n\\t [ method ]\\n\\t **\\n\\t * Utility method\\n\\t **\\n\\t * Returns `true` if given point is inside a given closed path.\\n\\t > Parameters\\n\\t - path (string) path string\\n\\t - x (number) x of the point\\n\\t - y (number) y of the point\\n\\t = (boolean) true, if point is inside the path\\n\\t \\\\*/\\n\\t R.isPointInsidePath = function (path, x, y) {\\n\\t var bbox = R.pathBBox(path);\\n\\t return R.isPointInsideBBox(bbox, x, y) &&\\n\\t interPathHelper(path, [[\\\"M\\\", x, y], [\\\"H\\\", bbox.x2 + 10]], 1) % 2 == 1;\\n\\t };\\n\\t R._removedFactory = function (methodname) {\\n\\t return function () {\\n\\t eve(\\\"raphael.log\\\", null, \\\"Rapha\\\\xebl: you are calling to method \\\\u201c\\\" + methodname + \\\"\\\\u201d of removed object\\\", methodname);\\n\\t };\\n\\t };\\n\\t /*\\\\\\n\\t * Raphael.pathBBox\\n\\t [ method ]\\n\\t **\\n\\t * Utility method\\n\\t **\\n\\t * Return bounding box of a given path\\n\\t > Parameters\\n\\t - path (string) path string\\n\\t = (object) bounding box\\n\\t o {\\n\\t o x: (number) x coordinate of the left top point of the box\\n\\t o y: (number) y coordinate of the left top point of the box\\n\\t o x2: (number) x coordinate of the right bottom point of the box\\n\\t o y2: (number) y coordinate of the right bottom point of the box\\n\\t o width: (number) width of the box\\n\\t o height: (number) height of the box\\n\\t o cx: (number) x coordinate of the center of the box\\n\\t o cy: (number) y coordinate of the center of the box\\n\\t o }\\n\\t \\\\*/\\n\\t var pathDimensions = R.pathBBox = function (path) {\\n\\t var pth = paths(path);\\n\\t if (pth.bbox) {\\n\\t return clone(pth.bbox);\\n\\t }\\n\\t if (!path) {\\n\\t return {x: 0, y: 0, width: 0, height: 0, x2: 0, y2: 0};\\n\\t }\\n\\t path = path2curve(path);\\n\\t var x = 0,\\n\\t y = 0,\\n\\t X = [],\\n\\t Y = [],\\n\\t p;\\n\\t for (var i = 0, ii = path.length; i < ii; i++) {\\n\\t p = path[i];\\n\\t if (p[0] == \\\"M\\\") {\\n\\t x = p[1];\\n\\t y = p[2];\\n\\t X.push(x);\\n\\t Y.push(y);\\n\\t } else {\\n\\t var dim = curveDim(x, y, p[1], p[2], p[3], p[4], p[5], p[6]);\\n\\t X = X[concat](dim.min.x, dim.max.x);\\n\\t Y = Y[concat](dim.min.y, dim.max.y);\\n\\t x = p[5];\\n\\t y = p[6];\\n\\t }\\n\\t }\\n\\t var xmin = mmin[apply](0, X),\\n\\t ymin = mmin[apply](0, Y),\\n\\t xmax = mmax[apply](0, X),\\n\\t ymax = mmax[apply](0, Y),\\n\\t width = xmax - xmin,\\n\\t height = ymax - ymin,\\n\\t bb = {\\n\\t x: xmin,\\n\\t y: ymin,\\n\\t x2: xmax,\\n\\t y2: ymax,\\n\\t width: width,\\n\\t height: height,\\n\\t cx: xmin + width / 2,\\n\\t cy: ymin + height / 2\\n\\t };\\n\\t pth.bbox = clone(bb);\\n\\t return bb;\\n\\t },\\n\\t pathClone = function (pathArray) {\\n\\t var res = clone(pathArray);\\n\\t res.toString = R._path2string;\\n\\t return res;\\n\\t },\\n\\t pathToRelative = R._pathToRelative = function (pathArray) {\\n\\t var pth = paths(pathArray);\\n\\t if (pth.rel) {\\n\\t return pathClone(pth.rel);\\n\\t }\\n\\t if (!R.is(pathArray, array) || !R.is(pathArray && pathArray[0], array)) { // rough assumption\\n\\t pathArray = R.parsePathString(pathArray);\\n\\t }\\n\\t var res = [],\\n\\t x = 0,\\n\\t y = 0,\\n\\t mx = 0,\\n\\t my = 0,\\n\\t start = 0;\\n\\t if (pathArray[0][0] == \\\"M\\\") {\\n\\t x = pathArray[0][1];\\n\\t y = pathArray[0][2];\\n\\t mx = x;\\n\\t my = y;\\n\\t start++;\\n\\t res.push([\\\"M\\\", x, y]);\\n\\t }\\n\\t for (var i = start, ii = pathArray.length; i < ii; i++) {\\n\\t var r = res[i] = [],\\n\\t pa = pathArray[i];\\n\\t if (pa[0] != lowerCase.call(pa[0])) {\\n\\t r[0] = lowerCase.call(pa[0]);\\n\\t switch (r[0]) {\\n\\t case \\\"a\\\":\\n\\t r[1] = pa[1];\\n\\t r[2] = pa[2];\\n\\t r[3] = pa[3];\\n\\t r[4] = pa[4];\\n\\t r[5] = pa[5];\\n\\t r[6] = +(pa[6] - x).toFixed(3);\\n\\t r[7] = +(pa[7] - y).toFixed(3);\\n\\t break;\\n\\t case \\\"v\\\":\\n\\t r[1] = +(pa[1] - y).toFixed(3);\\n\\t break;\\n\\t case \\\"m\\\":\\n\\t mx = pa[1];\\n\\t my = pa[2];\\n\\t default:\\n\\t for (var j = 1, jj = pa.length; j < jj; j++) {\\n\\t r[j] = +(pa[j] - ((j % 2) ? x : y)).toFixed(3);\\n\\t }\\n\\t }\\n\\t } else {\\n\\t r = res[i] = [];\\n\\t if (pa[0] == \\\"m\\\") {\\n\\t mx = pa[1] + x;\\n\\t my = pa[2] + y;\\n\\t }\\n\\t for (var k = 0, kk = pa.length; k < kk; k++) {\\n\\t res[i][k] = pa[k];\\n\\t }\\n\\t }\\n\\t var len = res[i].length;\\n\\t switch (res[i][0]) {\\n\\t case \\\"z\\\":\\n\\t x = mx;\\n\\t y = my;\\n\\t break;\\n\\t case \\\"h\\\":\\n\\t x += +res[i][len - 1];\\n\\t break;\\n\\t case \\\"v\\\":\\n\\t y += +res[i][len - 1];\\n\\t break;\\n\\t default:\\n\\t x += +res[i][len - 2];\\n\\t y += +res[i][len - 1];\\n\\t }\\n\\t }\\n\\t res.toString = R._path2string;\\n\\t pth.rel = pathClone(res);\\n\\t return res;\\n\\t },\\n\\t pathToAbsolute = R._pathToAbsolute = function (pathArray) {\\n\\t var pth = paths(pathArray);\\n\\t if (pth.abs) {\\n\\t return pathClone(pth.abs);\\n\\t }\\n\\t if (!R.is(pathArray, array) || !R.is(pathArray && pathArray[0], array)) { // rough assumption\\n\\t pathArray = R.parsePathString(pathArray);\\n\\t }\\n\\t if (!pathArray || !pathArray.length) {\\n\\t return [[\\\"M\\\", 0, 0]];\\n\\t }\\n\\t var res = [],\\n\\t x = 0,\\n\\t y = 0,\\n\\t mx = 0,\\n\\t my = 0,\\n\\t start = 0;\\n\\t if (pathArray[0][0] == \\\"M\\\") {\\n\\t x = +pathArray[0][1];\\n\\t y = +pathArray[0][2];\\n\\t mx = x;\\n\\t my = y;\\n\\t start++;\\n\\t res[0] = [\\\"M\\\", x, y];\\n\\t }\\n\\t var crz = pathArray.length == 3 && pathArray[0][0] == \\\"M\\\" && pathArray[1][0].toUpperCase() == \\\"R\\\" && pathArray[2][0].toUpperCase() == \\\"Z\\\";\\n\\t for (var r, pa, i = start, ii = pathArray.length; i < ii; i++) {\\n\\t res.push(r = []);\\n\\t pa = pathArray[i];\\n\\t if (pa[0] != upperCase.call(pa[0])) {\\n\\t r[0] = upperCase.call(pa[0]);\\n\\t switch (r[0]) {\\n\\t case \\\"A\\\":\\n\\t r[1] = pa[1];\\n\\t r[2] = pa[2];\\n\\t r[3] = pa[3];\\n\\t r[4] = pa[4];\\n\\t r[5] = pa[5];\\n\\t r[6] = +(pa[6] + x);\\n\\t r[7] = +(pa[7] + y);\\n\\t break;\\n\\t case \\\"V\\\":\\n\\t r[1] = +pa[1] + y;\\n\\t break;\\n\\t case \\\"H\\\":\\n\\t r[1] = +pa[1] + x;\\n\\t break;\\n\\t case \\\"R\\\":\\n\\t var dots = [x, y][concat](pa.slice(1));\\n\\t for (var j = 2, jj = dots.length; j < jj; j++) {\\n\\t dots[j] = +dots[j] + x;\\n\\t dots[++j] = +dots[j] + y;\\n\\t }\\n\\t res.pop();\\n\\t res = res[concat](catmullRom2bezier(dots, crz));\\n\\t break;\\n\\t case \\\"M\\\":\\n\\t mx = +pa[1] + x;\\n\\t my = +pa[2] + y;\\n\\t default:\\n\\t for (j = 1, jj = pa.length; j < jj; j++) {\\n\\t r[j] = +pa[j] + ((j % 2) ? x : y);\\n\\t }\\n\\t }\\n\\t } else if (pa[0] == \\\"R\\\") {\\n\\t dots = [x, y][concat](pa.slice(1));\\n\\t res.pop();\\n\\t res = res[concat](catmullRom2bezier(dots, crz));\\n\\t r = [\\\"R\\\"][concat](pa.slice(-2));\\n\\t } else {\\n\\t for (var k = 0, kk = pa.length; k < kk; k++) {\\n\\t r[k] = pa[k];\\n\\t }\\n\\t }\\n\\t switch (r[0]) {\\n\\t case \\\"Z\\\":\\n\\t x = mx;\\n\\t y = my;\\n\\t break;\\n\\t case \\\"H\\\":\\n\\t x = r[1];\\n\\t break;\\n\\t case \\\"V\\\":\\n\\t y = r[1];\\n\\t break;\\n\\t case \\\"M\\\":\\n\\t mx = r[r.length - 2];\\n\\t my = r[r.length - 1];\\n\\t default:\\n\\t x = r[r.length - 2];\\n\\t y = r[r.length - 1];\\n\\t }\\n\\t }\\n\\t res.toString = R._path2string;\\n\\t pth.abs = pathClone(res);\\n\\t return res;\\n\\t },\\n\\t l2c = function (x1, y1, x2, y2) {\\n\\t return [x1, y1, x2, y2, x2, y2];\\n\\t },\\n\\t q2c = function (x1, y1, ax, ay, x2, y2) {\\n\\t var _13 = 1 / 3,\\n\\t _23 = 2 / 3;\\n\\t return [\\n\\t _13 * x1 + _23 * ax,\\n\\t _13 * y1 + _23 * ay,\\n\\t _13 * x2 + _23 * ax,\\n\\t _13 * y2 + _23 * ay,\\n\\t x2,\\n\\t y2\\n\\t ];\\n\\t },\\n\\t a2c = function (x1, y1, rx, ry, angle, large_arc_flag, sweep_flag, x2, y2, recursive) {\\n\\t // for more information of where this math came from visit:\\n\\t // http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\\n\\t var _120 = PI * 120 / 180,\\n\\t rad = PI / 180 * (+angle || 0),\\n\\t res = [],\\n\\t xy,\\n\\t rotate = cacher(function (x, y, rad) {\\n\\t var X = x * math.cos(rad) - y * math.sin(rad),\\n\\t Y = x * math.sin(rad) + y * math.cos(rad);\\n\\t return {x: X, y: Y};\\n\\t });\\n\\t if (!recursive) {\\n\\t xy = rotate(x1, y1, -rad);\\n\\t x1 = xy.x;\\n\\t y1 = xy.y;\\n\\t xy = rotate(x2, y2, -rad);\\n\\t x2 = xy.x;\\n\\t y2 = xy.y;\\n\\t var cos = math.cos(PI / 180 * angle),\\n\\t sin = math.sin(PI / 180 * angle),\\n\\t x = (x1 - x2) / 2,\\n\\t y = (y1 - y2) / 2;\\n\\t var h = (x * x) / (rx * rx) + (y * y) / (ry * ry);\\n\\t if (h > 1) {\\n\\t h = math.sqrt(h);\\n\\t rx = h * rx;\\n\\t ry = h * ry;\\n\\t }\\n\\t var rx2 = rx * rx,\\n\\t ry2 = ry * ry,\\n\\t k = (large_arc_flag == sweep_flag ? -1 : 1) *\\n\\t math.sqrt(abs((rx2 * ry2 - rx2 * y * y - ry2 * x * x) / (rx2 * y * y + ry2 * x * x))),\\n\\t cx = k * rx * y / ry + (x1 + x2) / 2,\\n\\t cy = k * -ry * x / rx + (y1 + y2) / 2,\\n\\t f1 = math.asin(((y1 - cy) / ry).toFixed(9)),\\n\\t f2 = math.asin(((y2 - cy) / ry).toFixed(9));\\n\\n\\t f1 = x1 < cx ? PI - f1 : f1;\\n\\t f2 = x2 < cx ? PI - f2 : f2;\\n\\t f1 < 0 && (f1 = PI * 2 + f1);\\n\\t f2 < 0 && (f2 = PI * 2 + f2);\\n\\t if (sweep_flag && f1 > f2) {\\n\\t f1 = f1 - PI * 2;\\n\\t }\\n\\t if (!sweep_flag && f2 > f1) {\\n\\t f2 = f2 - PI * 2;\\n\\t }\\n\\t } else {\\n\\t f1 = recursive[0];\\n\\t f2 = recursive[1];\\n\\t cx = recursive[2];\\n\\t cy = recursive[3];\\n\\t }\\n\\t var df = f2 - f1;\\n\\t if (abs(df) > _120) {\\n\\t var f2old = f2,\\n\\t x2old = x2,\\n\\t y2old = y2;\\n\\t f2 = f1 + _120 * (sweep_flag && f2 > f1 ? 1 : -1);\\n\\t x2 = cx + rx * math.cos(f2);\\n\\t y2 = cy + ry * math.sin(f2);\\n\\t res = a2c(x2, y2, rx, ry, angle, 0, sweep_flag, x2old, y2old, [f2, f2old, cx, cy]);\\n\\t }\\n\\t df = f2 - f1;\\n\\t var c1 = math.cos(f1),\\n\\t s1 = math.sin(f1),\\n\\t c2 = math.cos(f2),\\n\\t s2 = math.sin(f2),\\n\\t t = math.tan(df / 4),\\n\\t hx = 4 / 3 * rx * t,\\n\\t hy = 4 / 3 * ry * t,\\n\\t m1 = [x1, y1],\\n\\t m2 = [x1 + hx * s1, y1 - hy * c1],\\n\\t m3 = [x2 + hx * s2, y2 - hy * c2],\\n\\t m4 = [x2, y2];\\n\\t m2[0] = 2 * m1[0] - m2[0];\\n\\t m2[1] = 2 * m1[1] - m2[1];\\n\\t if (recursive) {\\n\\t return [m2, m3, m4][concat](res);\\n\\t } else {\\n\\t res = [m2, m3, m4][concat](res).join()[split](\\\",\\\");\\n\\t var newres = [];\\n\\t for (var i = 0, ii = res.length; i < ii; i++) {\\n\\t newres[i] = i % 2 ? rotate(res[i - 1], res[i], rad).y : rotate(res[i], res[i + 1], rad).x;\\n\\t }\\n\\t return newres;\\n\\t }\\n\\t },\\n\\t findDotAtSegment = function (p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t) {\\n\\t var t1 = 1 - t;\\n\\t return {\\n\\t x: pow(t1, 3) * p1x + pow(t1, 2) * 3 * t * c1x + t1 * 3 * t * t * c2x + pow(t, 3) * p2x,\\n\\t y: pow(t1, 3) * p1y + pow(t1, 2) * 3 * t * c1y + t1 * 3 * t * t * c2y + pow(t, 3) * p2y\\n\\t };\\n\\t },\\n\\t curveDim = cacher(function (p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y) {\\n\\t var a = (c2x - 2 * c1x + p1x) - (p2x - 2 * c2x + c1x),\\n\\t b = 2 * (c1x - p1x) - 2 * (c2x - c1x),\\n\\t c = p1x - c1x,\\n\\t t1 = (-b + math.sqrt(b * b - 4 * a * c)) / 2 / a,\\n\\t t2 = (-b - math.sqrt(b * b - 4 * a * c)) / 2 / a,\\n\\t y = [p1y, p2y],\\n\\t x = [p1x, p2x],\\n\\t dot;\\n\\t abs(t1) > \\\"1e12\\\" && (t1 = .5);\\n\\t abs(t2) > \\\"1e12\\\" && (t2 = .5);\\n\\t if (t1 > 0 && t1 < 1) {\\n\\t dot = findDotAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t1);\\n\\t x.push(dot.x);\\n\\t y.push(dot.y);\\n\\t }\\n\\t if (t2 > 0 && t2 < 1) {\\n\\t dot = findDotAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t2);\\n\\t x.push(dot.x);\\n\\t y.push(dot.y);\\n\\t }\\n\\t a = (c2y - 2 * c1y + p1y) - (p2y - 2 * c2y + c1y);\\n\\t b = 2 * (c1y - p1y) - 2 * (c2y - c1y);\\n\\t c = p1y - c1y;\\n\\t t1 = (-b + math.sqrt(b * b - 4 * a * c)) / 2 / a;\\n\\t t2 = (-b - math.sqrt(b * b - 4 * a * c)) / 2 / a;\\n\\t abs(t1) > \\\"1e12\\\" && (t1 = .5);\\n\\t abs(t2) > \\\"1e12\\\" && (t2 = .5);\\n\\t if (t1 > 0 && t1 < 1) {\\n\\t dot = findDotAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t1);\\n\\t x.push(dot.x);\\n\\t y.push(dot.y);\\n\\t }\\n\\t if (t2 > 0 && t2 < 1) {\\n\\t dot = findDotAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t2);\\n\\t x.push(dot.x);\\n\\t y.push(dot.y);\\n\\t }\\n\\t return {\\n\\t min: {x: mmin[apply](0, x), y: mmin[apply](0, y)},\\n\\t max: {x: mmax[apply](0, x), y: mmax[apply](0, y)}\\n\\t };\\n\\t }),\\n\\t path2curve = R._path2curve = cacher(function (path, path2) {\\n\\t var pth = !path2 && paths(path);\\n\\t if (!path2 && pth.curve) {\\n\\t return pathClone(pth.curve);\\n\\t }\\n\\t var p = pathToAbsolute(path),\\n\\t p2 = path2 && pathToAbsolute(path2),\\n\\t attrs = {x: 0, y: 0, bx: 0, by: 0, X: 0, Y: 0, qx: null, qy: null},\\n\\t attrs2 = {x: 0, y: 0, bx: 0, by: 0, X: 0, Y: 0, qx: null, qy: null},\\n\\t processPath = function (path, d, pcom) {\\n\\t var nx, ny, tq = {T:1, Q:1};\\n\\t if (!path) {\\n\\t return [\\\"C\\\", d.x, d.y, d.x, d.y, d.x, d.y];\\n\\t }\\n\\t !(path[0] in tq) && (d.qx = d.qy = null);\\n\\t switch (path[0]) {\\n\\t case \\\"M\\\":\\n\\t d.X = path[1];\\n\\t d.Y = path[2];\\n\\t break;\\n\\t case \\\"A\\\":\\n\\t path = [\\\"C\\\"][concat](a2c[apply](0, [d.x, d.y][concat](path.slice(1))));\\n\\t break;\\n\\t case \\\"S\\\":\\n\\t if (pcom == \\\"C\\\" || pcom == \\\"S\\\") { // In \\\"S\\\" case we have to take into account, if the previous command is C/S.\\n\\t nx = d.x * 2 - d.bx; // And reflect the previous\\n\\t ny = d.y * 2 - d.by; // command's control point relative to the current point.\\n\\t }\\n\\t else { // or some else or nothing\\n\\t nx = d.x;\\n\\t ny = d.y;\\n\\t }\\n\\t path = [\\\"C\\\", nx, ny][concat](path.slice(1));\\n\\t break;\\n\\t case \\\"T\\\":\\n\\t if (pcom == \\\"Q\\\" || pcom == \\\"T\\\") { // In \\\"T\\\" case we have to take into account, if the previous command is Q/T.\\n\\t d.qx = d.x * 2 - d.qx; // And make a reflection similar\\n\\t d.qy = d.y * 2 - d.qy; // to case \\\"S\\\".\\n\\t }\\n\\t else { // or something else or nothing\\n\\t d.qx = d.x;\\n\\t d.qy = d.y;\\n\\t }\\n\\t path = [\\\"C\\\"][concat](q2c(d.x, d.y, d.qx, d.qy, path[1], path[2]));\\n\\t break;\\n\\t case \\\"Q\\\":\\n\\t d.qx = path[1];\\n\\t d.qy = path[2];\\n\\t path = [\\\"C\\\"][concat](q2c(d.x, d.y, path[1], path[2], path[3], path[4]));\\n\\t break;\\n\\t case \\\"L\\\":\\n\\t path = [\\\"C\\\"][concat](l2c(d.x, d.y, path[1], path[2]));\\n\\t break;\\n\\t case \\\"H\\\":\\n\\t path = [\\\"C\\\"][concat](l2c(d.x, d.y, path[1], d.y));\\n\\t break;\\n\\t case \\\"V\\\":\\n\\t path = [\\\"C\\\"][concat](l2c(d.x, d.y, d.x, path[1]));\\n\\t break;\\n\\t case \\\"Z\\\":\\n\\t path = [\\\"C\\\"][concat](l2c(d.x, d.y, d.X, d.Y));\\n\\t break;\\n\\t }\\n\\t return path;\\n\\t },\\n\\t fixArc = function (pp, i) {\\n\\t if (pp[i].length > 7) {\\n\\t pp[i].shift();\\n\\t var pi = pp[i];\\n\\t while (pi.length) {\\n\\t pcoms1[i]=\\\"A\\\"; // if created multiple C:s, their original seg is saved\\n\\t p2 && (pcoms2[i]=\\\"A\\\"); // the same as above\\n\\t pp.splice(i++, 0, [\\\"C\\\"][concat](pi.splice(0, 6)));\\n\\t }\\n\\t pp.splice(i, 1);\\n\\t ii = mmax(p.length, p2 && p2.length || 0);\\n\\t }\\n\\t },\\n\\t fixM = function (path1, path2, a1, a2, i) {\\n\\t if (path1 && path2 && path1[i][0] == \\\"M\\\" && path2[i][0] != \\\"M\\\") {\\n\\t path2.splice(i, 0, [\\\"M\\\", a2.x, a2.y]);\\n\\t a1.bx = 0;\\n\\t a1.by = 0;\\n\\t a1.x = path1[i][1];\\n\\t a1.y = path1[i][2];\\n\\t ii = mmax(p.length, p2 && p2.length || 0);\\n\\t }\\n\\t },\\n\\t pcoms1 = [], // path commands of original path p\\n\\t pcoms2 = [], // path commands of original path p2\\n\\t pfirst = \\\"\\\", // temporary holder for original path command\\n\\t pcom = \\\"\\\"; // holder for previous path command of original path\\n\\t for (var i = 0, ii = mmax(p.length, p2 && p2.length || 0); i < ii; i++) {\\n\\t p[i] && (pfirst = p[i][0]); // save current path command\\n\\n\\t if (pfirst != \\\"C\\\") // C is not saved yet, because it may be result of conversion\\n\\t {\\n\\t pcoms1[i] = pfirst; // Save current path command\\n\\t i && ( pcom = pcoms1[i-1]); // Get previous path command pcom\\n\\t }\\n\\t p[i] = processPath(p[i], attrs, pcom); // Previous path command is inputted to processPath\\n\\n\\t if (pcoms1[i] != \\\"A\\\" && pfirst == \\\"C\\\") pcoms1[i] = \\\"C\\\"; // A is the only command\\n\\t // which may produce multiple C:s\\n\\t // so we have to make sure that C is also C in original path\\n\\n\\t fixArc(p, i); // fixArc adds also the right amount of A:s to pcoms1\\n\\n\\t if (p2) { // the same procedures is done to p2\\n\\t p2[i] && (pfirst = p2[i][0]);\\n\\t if (pfirst != \\\"C\\\")\\n\\t {\\n\\t pcoms2[i] = pfirst;\\n\\t i && (pcom = pcoms2[i-1]);\\n\\t }\\n\\t p2[i] = processPath(p2[i], attrs2, pcom);\\n\\n\\t if (pcoms2[i]!=\\\"A\\\" && pfirst==\\\"C\\\") pcoms2[i]=\\\"C\\\";\\n\\n\\t fixArc(p2, i);\\n\\t }\\n\\t fixM(p, p2, attrs, attrs2, i);\\n\\t fixM(p2, p, attrs2, attrs, i);\\n\\t var seg = p[i],\\n\\t seg2 = p2 && p2[i],\\n\\t seglen = seg.length,\\n\\t seg2len = p2 && seg2.length;\\n\\t attrs.x = seg[seglen - 2];\\n\\t attrs.y = seg[seglen - 1];\\n\\t attrs.bx = toFloat(seg[seglen - 4]) || attrs.x;\\n\\t attrs.by = toFloat(seg[seglen - 3]) || attrs.y;\\n\\t attrs2.bx = p2 && (toFloat(seg2[seg2len - 4]) || attrs2.x);\\n\\t attrs2.by = p2 && (toFloat(seg2[seg2len - 3]) || attrs2.y);\\n\\t attrs2.x = p2 && seg2[seg2len - 2];\\n\\t attrs2.y = p2 && seg2[seg2len - 1];\\n\\t }\\n\\t if (!p2) {\\n\\t pth.curve = pathClone(p);\\n\\t }\\n\\t return p2 ? [p, p2] : p;\\n\\t }, null, pathClone),\\n\\t parseDots = R._parseDots = cacher(function (gradient) {\\n\\t var dots = [];\\n\\t for (var i = 0, ii = gradient.length; i < ii; i++) {\\n\\t var dot = {},\\n\\t par = gradient[i].match(/^([^:]*):?([\\\\d\\\\.]*)/);\\n\\t dot.color = R.getRGB(par[1]);\\n\\t if (dot.color.error) {\\n\\t return null;\\n\\t }\\n\\t dot.opacity = dot.color.opacity;\\n\\t dot.color = dot.color.hex;\\n\\t par[2] && (dot.offset = par[2] + \\\"%\\\");\\n\\t dots.push(dot);\\n\\t }\\n\\t for (i = 1, ii = dots.length - 1; i < ii; i++) {\\n\\t if (!dots[i].offset) {\\n\\t var start = toFloat(dots[i - 1].offset || 0),\\n\\t end = 0;\\n\\t for (var j = i + 1; j < ii; j++) {\\n\\t if (dots[j].offset) {\\n\\t end = dots[j].offset;\\n\\t break;\\n\\t }\\n\\t }\\n\\t if (!end) {\\n\\t end = 100;\\n\\t j = ii;\\n\\t }\\n\\t end = toFloat(end);\\n\\t var d = (end - start) / (j - i + 1);\\n\\t for (; i < j; i++) {\\n\\t start += d;\\n\\t dots[i].offset = start + \\\"%\\\";\\n\\t }\\n\\t }\\n\\t }\\n\\t return dots;\\n\\t }),\\n\\t tear = R._tear = function (el, paper) {\\n\\t el == paper.top && (paper.top = el.prev);\\n\\t el == paper.bottom && (paper.bottom = el.next);\\n\\t el.next && (el.next.prev = el.prev);\\n\\t el.prev && (el.prev.next = el.next);\\n\\t },\\n\\t tofront = R._tofront = function (el, paper) {\\n\\t if (paper.top === el) {\\n\\t return;\\n\\t }\\n\\t tear(el, paper);\\n\\t el.next = null;\\n\\t el.prev = paper.top;\\n\\t paper.top.next = el;\\n\\t paper.top = el;\\n\\t },\\n\\t toback = R._toback = function (el, paper) {\\n\\t if (paper.bottom === el) {\\n\\t return;\\n\\t }\\n\\t tear(el, paper);\\n\\t el.next = paper.bottom;\\n\\t el.prev = null;\\n\\t paper.bottom.prev = el;\\n\\t paper.bottom = el;\\n\\t },\\n\\t insertafter = R._insertafter = function (el, el2, paper) {\\n\\t tear(el, paper);\\n\\t el2 == paper.top && (paper.top = el);\\n\\t el2.next && (el2.next.prev = el);\\n\\t el.next = el2.next;\\n\\t el.prev = el2;\\n\\t el2.next = el;\\n\\t },\\n\\t insertbefore = R._insertbefore = function (el, el2, paper) {\\n\\t tear(el, paper);\\n\\t el2 == paper.bottom && (paper.bottom = el);\\n\\t el2.prev && (el2.prev.next = el);\\n\\t el.prev = el2.prev;\\n\\t el2.prev = el;\\n\\t el.next = el2;\\n\\t },\\n\\t /*\\\\\\n\\t * Raphael.toMatrix\\n\\t [ method ]\\n\\t **\\n\\t * Utility method\\n\\t **\\n\\t * Returns matrix of transformations applied to a given path\\n\\t > Parameters\\n\\t - path (string) path string\\n\\t - transform (string|array) transformation string\\n\\t = (object) @Matrix\\n\\t \\\\*/\\n\\t toMatrix = R.toMatrix = function (path, transform) {\\n\\t var bb = pathDimensions(path),\\n\\t el = {\\n\\t _: {\\n\\t transform: E\\n\\t },\\n\\t getBBox: function () {\\n\\t return bb;\\n\\t }\\n\\t };\\n\\t extractTransform(el, transform);\\n\\t return el.matrix;\\n\\t },\\n\\t /*\\\\\\n\\t * Raphael.transformPath\\n\\t [ method ]\\n\\t **\\n\\t * Utility method\\n\\t **\\n\\t * Returns path transformed by a given transformation\\n\\t > Parameters\\n\\t - path (string) path string\\n\\t - transform (string|array) transformation string\\n\\t = (string) path\\n\\t \\\\*/\\n\\t transformPath = R.transformPath = function (path, transform) {\\n\\t return mapPath(path, toMatrix(path, transform));\\n\\t },\\n\\t extractTransform = R._extractTransform = function (el, tstr) {\\n\\t if (tstr == null) {\\n\\t return el._.transform;\\n\\t }\\n\\t tstr = Str(tstr).replace(/\\\\.{3}|\\\\u2026/g, el._.transform || E);\\n\\t var tdata = R.parseTransformString(tstr),\\n\\t deg = 0,\\n\\t dx = 0,\\n\\t dy = 0,\\n\\t sx = 1,\\n\\t sy = 1,\\n\\t _ = el._,\\n\\t m = new Matrix;\\n\\t _.transform = tdata || [];\\n\\t if (tdata) {\\n\\t for (var i = 0, ii = tdata.length; i < ii; i++) {\\n\\t var t = tdata[i],\\n\\t tlen = t.length,\\n\\t command = Str(t[0]).toLowerCase(),\\n\\t absolute = t[0] != command,\\n\\t inver = absolute ? m.invert() : 0,\\n\\t x1,\\n\\t y1,\\n\\t x2,\\n\\t y2,\\n\\t bb;\\n\\t if (command == \\\"t\\\" && tlen == 3) {\\n\\t if (absolute) {\\n\\t x1 = inver.x(0, 0);\\n\\t y1 = inver.y(0, 0);\\n\\t x2 = inver.x(t[1], t[2]);\\n\\t y2 = inver.y(t[1], t[2]);\\n\\t m.translate(x2 - x1, y2 - y1);\\n\\t } else {\\n\\t m.translate(t[1], t[2]);\\n\\t }\\n\\t } else if (command == \\\"r\\\") {\\n\\t if (tlen == 2) {\\n\\t bb = bb || el.getBBox(1);\\n\\t m.rotate(t[1], bb.x + bb.width / 2, bb.y + bb.height / 2);\\n\\t deg += t[1];\\n\\t } else if (tlen == 4) {\\n\\t if (absolute) {\\n\\t x2 = inver.x(t[2], t[3]);\\n\\t y2 = inver.y(t[2], t[3]);\\n\\t m.rotate(t[1], x2, y2);\\n\\t } else {\\n\\t m.rotate(t[1], t[2], t[3]);\\n\\t }\\n\\t deg += t[1];\\n\\t }\\n\\t } else if (command == \\\"s\\\") {\\n\\t if (tlen == 2 || tlen == 3) {\\n\\t bb = bb || el.getBBox(1);\\n\\t m.scale(t[1], t[tlen - 1], bb.x + bb.width / 2, bb.y + bb.height / 2);\\n\\t sx *= t[1];\\n\\t sy *= t[tlen - 1];\\n\\t } else if (tlen == 5) {\\n\\t if (absolute) {\\n\\t x2 = inver.x(t[3], t[4]);\\n\\t y2 = inver.y(t[3], t[4]);\\n\\t m.scale(t[1], t[2], x2, y2);\\n\\t } else {\\n\\t m.scale(t[1], t[2], t[3], t[4]);\\n\\t }\\n\\t sx *= t[1];\\n\\t sy *= t[2];\\n\\t }\\n\\t } else if (command == \\\"m\\\" && tlen == 7) {\\n\\t m.add(t[1], t[2], t[3], t[4], t[5], t[6]);\\n\\t }\\n\\t _.dirtyT = 1;\\n\\t el.matrix = m;\\n\\t }\\n\\t }\\n\\n\\t /*\\\\\\n\\t * Element.matrix\\n\\t [ property (object) ]\\n\\t **\\n\\t * Keeps @Matrix object, which represents element transformation\\n\\t \\\\*/\\n\\t el.matrix = m;\\n\\n\\t _.sx = sx;\\n\\t _.sy = sy;\\n\\t _.deg = deg;\\n\\t _.dx = dx = m.e;\\n\\t _.dy = dy = m.f;\\n\\n\\t if (sx == 1 && sy == 1 && !deg && _.bbox) {\\n\\t _.bbox.x += +dx;\\n\\t _.bbox.y += +dy;\\n\\t } else {\\n\\t _.dirtyT = 1;\\n\\t }\\n\\t },\\n\\t getEmpty = function (item) {\\n\\t var l = item[0];\\n\\t switch (l.toLowerCase()) {\\n\\t case \\\"t\\\": return [l, 0, 0];\\n\\t case \\\"m\\\": return [l, 1, 0, 0, 1, 0, 0];\\n\\t case \\\"r\\\": if (item.length == 4) {\\n\\t return [l, 0, item[2], item[3]];\\n\\t } else {\\n\\t return [l, 0];\\n\\t }\\n\\t case \\\"s\\\": if (item.length == 5) {\\n\\t return [l, 1, 1, item[3], item[4]];\\n\\t } else if (item.length == 3) {\\n\\t return [l, 1, 1];\\n\\t } else {\\n\\t return [l, 1];\\n\\t }\\n\\t }\\n\\t },\\n\\t equaliseTransform = R._equaliseTransform = function (t1, t2) {\\n\\t t2 = Str(t2).replace(/\\\\.{3}|\\\\u2026/g, t1);\\n\\t t1 = R.parseTransformString(t1) || [];\\n\\t t2 = R.parseTransformString(t2) || [];\\n\\t var maxlength = mmax(t1.length, t2.length),\\n\\t from = [],\\n\\t to = [],\\n\\t i = 0, j, jj,\\n\\t tt1, tt2;\\n\\t for (; i < maxlength; i++) {\\n\\t tt1 = t1[i] || getEmpty(t2[i]);\\n\\t tt2 = t2[i] || getEmpty(tt1);\\n\\t if ((tt1[0] != tt2[0]) ||\\n\\t (tt1[0].toLowerCase() == \\\"r\\\" && (tt1[2] != tt2[2] || tt1[3] != tt2[3])) ||\\n\\t (tt1[0].toLowerCase() == \\\"s\\\" && (tt1[3] != tt2[3] || tt1[4] != tt2[4]))\\n\\t ) {\\n\\t return;\\n\\t }\\n\\t from[i] = [];\\n\\t to[i] = [];\\n\\t for (j = 0, jj = mmax(tt1.length, tt2.length); j < jj; j++) {\\n\\t j in tt1 && (from[i][j] = tt1[j]);\\n\\t j in tt2 && (to[i][j] = tt2[j]);\\n\\t }\\n\\t }\\n\\t return {\\n\\t from: from,\\n\\t to: to\\n\\t };\\n\\t };\\n\\t R._getContainer = function (x, y, w, h) {\\n\\t var container;\\n\\t container = h == null && !R.is(x, \\\"object\\\") ? g.doc.getElementById(x) : x;\\n\\t if (container == null) {\\n\\t return;\\n\\t }\\n\\t if (container.tagName) {\\n\\t if (y == null) {\\n\\t return {\\n\\t container: container,\\n\\t width: container.style.pixelWidth || container.offsetWidth,\\n\\t height: container.style.pixelHeight || container.offsetHeight\\n\\t };\\n\\t } else {\\n\\t return {\\n\\t container: container,\\n\\t width: y,\\n\\t height: w\\n\\t };\\n\\t }\\n\\t }\\n\\t return {\\n\\t container: 1,\\n\\t x: x,\\n\\t y: y,\\n\\t width: w,\\n\\t height: h\\n\\t };\\n\\t };\\n\\t /*\\\\\\n\\t * Raphael.pathToRelative\\n\\t [ method ]\\n\\t **\\n\\t * Utility method\\n\\t **\\n\\t * Converts path to relative form\\n\\t > Parameters\\n\\t - pathString (string|array) path string or array of segments\\n\\t = (array) array of segments.\\n\\t \\\\*/\\n\\t R.pathToRelative = pathToRelative;\\n\\t R._engine = {};\\n\\t /*\\\\\\n\\t * Raphael.path2curve\\n\\t [ method ]\\n\\t **\\n\\t * Utility method\\n\\t **\\n\\t * Converts path to a new path where all segments are cubic bezier curves.\\n\\t > Parameters\\n\\t - pathString (string|array) path string or array of segments\\n\\t = (array) array of segments.\\n\\t \\\\*/\\n\\t R.path2curve = path2curve;\\n\\t /*\\\\\\n\\t * Raphael.matrix\\n\\t [ method ]\\n\\t **\\n\\t * Utility method\\n\\t **\\n\\t * Returns matrix based on given parameters.\\n\\t > Parameters\\n\\t - a (number)\\n\\t - b (number)\\n\\t - c (number)\\n\\t - d (number)\\n\\t - e (number)\\n\\t - f (number)\\n\\t = (object) @Matrix\\n\\t \\\\*/\\n\\t R.matrix = function (a, b, c, d, e, f) {\\n\\t return new Matrix(a, b, c, d, e, f);\\n\\t };\\n\\t function Matrix(a, b, c, d, e, f) {\\n\\t if (a != null) {\\n\\t this.a = +a;\\n\\t this.b = +b;\\n\\t this.c = +c;\\n\\t this.d = +d;\\n\\t this.e = +e;\\n\\t this.f = +f;\\n\\t } else {\\n\\t this.a = 1;\\n\\t this.b = 0;\\n\\t this.c = 0;\\n\\t this.d = 1;\\n\\t this.e = 0;\\n\\t this.f = 0;\\n\\t }\\n\\t }\\n\\t (function (matrixproto) {\\n\\t /*\\\\\\n\\t * Matrix.add\\n\\t [ method ]\\n\\t **\\n\\t * Adds given matrix to existing one.\\n\\t > Parameters\\n\\t - a (number)\\n\\t - b (number)\\n\\t - c (number)\\n\\t - d (number)\\n\\t - e (number)\\n\\t - f (number)\\n\\t or\\n\\t - matrix (object) @Matrix\\n\\t \\\\*/\\n\\t matrixproto.add = function (a, b, c, d, e, f) {\\n\\t var out = [[], [], []],\\n\\t m = [[this.a, this.c, this.e], [this.b, this.d, this.f], [0, 0, 1]],\\n\\t matrix = [[a, c, e], [b, d, f], [0, 0, 1]],\\n\\t x, y, z, res;\\n\\n\\t if (a && a instanceof Matrix) {\\n\\t matrix = [[a.a, a.c, a.e], [a.b, a.d, a.f], [0, 0, 1]];\\n\\t }\\n\\n\\t for (x = 0; x < 3; x++) {\\n\\t for (y = 0; y < 3; y++) {\\n\\t res = 0;\\n\\t for (z = 0; z < 3; z++) {\\n\\t res += m[x][z] * matrix[z][y];\\n\\t }\\n\\t out[x][y] = res;\\n\\t }\\n\\t }\\n\\t this.a = out[0][0];\\n\\t this.b = out[1][0];\\n\\t this.c = out[0][1];\\n\\t this.d = out[1][1];\\n\\t this.e = out[0][2];\\n\\t this.f = out[1][2];\\n\\t };\\n\\t /*\\\\\\n\\t * Matrix.invert\\n\\t [ method ]\\n\\t **\\n\\t * Returns inverted version of the matrix\\n\\t = (object) @Matrix\\n\\t \\\\*/\\n\\t matrixproto.invert = function () {\\n\\t var me = this,\\n\\t x = me.a * me.d - me.b * me.c;\\n\\t return new Matrix(me.d / x, -me.b / x, -me.c / x, me.a / x, (me.c * me.f - me.d * me.e) / x, (me.b * me.e - me.a * me.f) / x);\\n\\t };\\n\\t /*\\\\\\n\\t * Matrix.clone\\n\\t [ method ]\\n\\t **\\n\\t * Returns copy of the matrix\\n\\t = (object) @Matrix\\n\\t \\\\*/\\n\\t matrixproto.clone = function () {\\n\\t return new Matrix(this.a, this.b, this.c, this.d, this.e, this.f);\\n\\t };\\n\\t /*\\\\\\n\\t * Matrix.translate\\n\\t [ method ]\\n\\t **\\n\\t * Translate the matrix\\n\\t > Parameters\\n\\t - x (number)\\n\\t - y (number)\\n\\t \\\\*/\\n\\t matrixproto.translate = function (x, y) {\\n\\t this.add(1, 0, 0, 1, x, y);\\n\\t };\\n\\t /*\\\\\\n\\t * Matrix.scale\\n\\t [ method ]\\n\\t **\\n\\t * Scales the matrix\\n\\t > Parameters\\n\\t - x (number)\\n\\t - y (number) #optional\\n\\t - cx (number) #optional\\n\\t - cy (number) #optional\\n\\t \\\\*/\\n\\t matrixproto.scale = function (x, y, cx, cy) {\\n\\t y == null && (y = x);\\n\\t (cx || cy) && this.add(1, 0, 0, 1, cx, cy);\\n\\t this.add(x, 0, 0, y, 0, 0);\\n\\t (cx || cy) && this.add(1, 0, 0, 1, -cx, -cy);\\n\\t };\\n\\t /*\\\\\\n\\t * Matrix.rotate\\n\\t [ method ]\\n\\t **\\n\\t * Rotates the matrix\\n\\t > Parameters\\n\\t - a (number)\\n\\t - x (number)\\n\\t - y (number)\\n\\t \\\\*/\\n\\t matrixproto.rotate = function (a, x, y) {\\n\\t a = R.rad(a);\\n\\t x = x || 0;\\n\\t y = y || 0;\\n\\t var cos = +math.cos(a).toFixed(9),\\n\\t sin = +math.sin(a).toFixed(9);\\n\\t this.add(cos, sin, -sin, cos, x, y);\\n\\t this.add(1, 0, 0, 1, -x, -y);\\n\\t };\\n\\t /*\\\\\\n\\t * Matrix.x\\n\\t [ method ]\\n\\t **\\n\\t * Return x coordinate for given point after transformation described by the matrix. See also @Matrix.y\\n\\t > Parameters\\n\\t - x (number)\\n\\t - y (number)\\n\\t = (number) x\\n\\t \\\\*/\\n\\t matrixproto.x = function (x, y) {\\n\\t return x * this.a + y * this.c + this.e;\\n\\t };\\n\\t /*\\\\\\n\\t * Matrix.y\\n\\t [ method ]\\n\\t **\\n\\t * Return y coordinate for given point after transformation described by the matrix. See also @Matrix.x\\n\\t > Parameters\\n\\t - x (number)\\n\\t - y (number)\\n\\t = (number) y\\n\\t \\\\*/\\n\\t matrixproto.y = function (x, y) {\\n\\t return x * this.b + y * this.d + this.f;\\n\\t };\\n\\t matrixproto.get = function (i) {\\n\\t return +this[Str.fromCharCode(97 + i)].toFixed(4);\\n\\t };\\n\\t matrixproto.toString = function () {\\n\\t return R.svg ?\\n\\t \\\"matrix(\\\" + [this.get(0), this.get(1), this.get(2), this.get(3), this.get(4), this.get(5)].join() + \\\")\\\" :\\n\\t [this.get(0), this.get(2), this.get(1), this.get(3), 0, 0].join();\\n\\t };\\n\\t matrixproto.toFilter = function () {\\n\\t return \\\"progid:DXImageTransform.Microsoft.Matrix(M11=\\\" + this.get(0) +\\n\\t \\\", M12=\\\" + this.get(2) + \\\", M21=\\\" + this.get(1) + \\\", M22=\\\" + this.get(3) +\\n\\t \\\", Dx=\\\" + this.get(4) + \\\", Dy=\\\" + this.get(5) + \\\", sizingmethod='auto expand')\\\";\\n\\t };\\n\\t matrixproto.offset = function () {\\n\\t return [this.e.toFixed(4), this.f.toFixed(4)];\\n\\t };\\n\\t function norm(a) {\\n\\t return a[0] * a[0] + a[1] * a[1];\\n\\t }\\n\\t function normalize(a) {\\n\\t var mag = math.sqrt(norm(a));\\n\\t a[0] && (a[0] /= mag);\\n\\t a[1] && (a[1] /= mag);\\n\\t }\\n\\t /*\\\\\\n\\t * Matrix.split\\n\\t [ method ]\\n\\t **\\n\\t * Splits matrix into primitive transformations\\n\\t = (object) in format:\\n\\t o dx (number) translation by x\\n\\t o dy (number) translation by y\\n\\t o scalex (number) scale by x\\n\\t o scaley (number) scale by y\\n\\t o shear (number) shear\\n\\t o rotate (number) rotation in deg\\n\\t o isSimple (boolean) could it be represented via simple transformations\\n\\t \\\\*/\\n\\t matrixproto.split = function () {\\n\\t var out = {};\\n\\t // translation\\n\\t out.dx = this.e;\\n\\t out.dy = this.f;\\n\\n\\t // scale and shear\\n\\t var row = [[this.a, this.c], [this.b, this.d]];\\n\\t out.scalex = math.sqrt(norm(row[0]));\\n\\t normalize(row[0]);\\n\\n\\t out.shear = row[0][0] * row[1][0] + row[0][1] * row[1][1];\\n\\t row[1] = [row[1][0] - row[0][0] * out.shear, row[1][1] - row[0][1] * out.shear];\\n\\n\\t out.scaley = math.sqrt(norm(row[1]));\\n\\t normalize(row[1]);\\n\\t out.shear /= out.scaley;\\n\\n\\t // rotation\\n\\t var sin = -row[0][1],\\n\\t cos = row[1][1];\\n\\t if (cos < 0) {\\n\\t out.rotate = R.deg(math.acos(cos));\\n\\t if (sin < 0) {\\n\\t out.rotate = 360 - out.rotate;\\n\\t }\\n\\t } else {\\n\\t out.rotate = R.deg(math.asin(sin));\\n\\t }\\n\\n\\t out.isSimple = !+out.shear.toFixed(9) && (out.scalex.toFixed(9) == out.scaley.toFixed(9) || !out.rotate);\\n\\t out.isSuperSimple = !+out.shear.toFixed(9) && out.scalex.toFixed(9) == out.scaley.toFixed(9) && !out.rotate;\\n\\t out.noRotation = !+out.shear.toFixed(9) && !out.rotate;\\n\\t return out;\\n\\t };\\n\\t /*\\\\\\n\\t * Matrix.toTransformString\\n\\t [ method ]\\n\\t **\\n\\t * Return transform string that represents given matrix\\n\\t = (string) transform string\\n\\t \\\\*/\\n\\t matrixproto.toTransformString = function (shorter) {\\n\\t var s = shorter || this[split]();\\n\\t if (s.isSimple) {\\n\\t s.scalex = +s.scalex.toFixed(4);\\n\\t s.scaley = +s.scaley.toFixed(4);\\n\\t s.rotate = +s.rotate.toFixed(4);\\n\\t return (s.dx || s.dy ? \\\"t\\\" + [s.dx, s.dy] : E) +\\n\\t (s.scalex != 1 || s.scaley != 1 ? \\\"s\\\" + [s.scalex, s.scaley, 0, 0] : E) +\\n\\t (s.rotate ? \\\"r\\\" + [s.rotate, 0, 0] : E);\\n\\t } else {\\n\\t return \\\"m\\\" + [this.get(0), this.get(1), this.get(2), this.get(3), this.get(4), this.get(5)];\\n\\t }\\n\\t };\\n\\t })(Matrix.prototype);\\n\\n\\t var preventDefault = function () {\\n\\t this.returnValue = false;\\n\\t },\\n\\t preventTouch = function () {\\n\\t return this.originalEvent.preventDefault();\\n\\t },\\n\\t stopPropagation = function () {\\n\\t this.cancelBubble = true;\\n\\t },\\n\\t stopTouch = function () {\\n\\t return this.originalEvent.stopPropagation();\\n\\t },\\n\\t getEventPosition = function (e) {\\n\\t var scrollY = g.doc.documentElement.scrollTop || g.doc.body.scrollTop,\\n\\t scrollX = g.doc.documentElement.scrollLeft || g.doc.body.scrollLeft;\\n\\n\\t return {\\n\\t x: e.clientX + scrollX,\\n\\t y: e.clientY + scrollY\\n\\t };\\n\\t },\\n\\t addEvent = (function () {\\n\\t if (g.doc.addEventListener) {\\n\\t return function (obj, type, fn, element) {\\n\\t var f = function (e) {\\n\\t var pos = getEventPosition(e);\\n\\t return fn.call(element, e, pos.x, pos.y);\\n\\t };\\n\\t obj.addEventListener(type, f, false);\\n\\n\\t if (supportsTouch && touchMap[type]) {\\n\\t var _f = function (e) {\\n\\t var pos = getEventPosition(e),\\n\\t olde = e;\\n\\n\\t for (var i = 0, ii = e.targetTouches && e.targetTouches.length; i < ii; i++) {\\n\\t if (e.targetTouches[i].target == obj) {\\n\\t e = e.targetTouches[i];\\n\\t e.originalEvent = olde;\\n\\t e.preventDefault = preventTouch;\\n\\t e.stopPropagation = stopTouch;\\n\\t break;\\n\\t }\\n\\t }\\n\\n\\t return fn.call(element, e, pos.x, pos.y);\\n\\t };\\n\\t obj.addEventListener(touchMap[type], _f, false);\\n\\t }\\n\\n\\t return function () {\\n\\t obj.removeEventListener(type, f, false);\\n\\n\\t if (supportsTouch && touchMap[type])\\n\\t obj.removeEventListener(touchMap[type], _f, false);\\n\\n\\t return true;\\n\\t };\\n\\t };\\n\\t } else if (g.doc.attachEvent) {\\n\\t return function (obj, type, fn, element) {\\n\\t var f = function (e) {\\n\\t e = e || g.win.event;\\n\\t var scrollY = g.doc.documentElement.scrollTop || g.doc.body.scrollTop,\\n\\t scrollX = g.doc.documentElement.scrollLeft || g.doc.body.scrollLeft,\\n\\t x = e.clientX + scrollX,\\n\\t y = e.clientY + scrollY;\\n\\t e.preventDefault = e.preventDefault || preventDefault;\\n\\t e.stopPropagation = e.stopPropagation || stopPropagation;\\n\\t return fn.call(element, e, x, y);\\n\\t };\\n\\t obj.attachEvent(\\\"on\\\" + type, f);\\n\\t var detacher = function () {\\n\\t obj.detachEvent(\\\"on\\\" + type, f);\\n\\t return true;\\n\\t };\\n\\t return detacher;\\n\\t };\\n\\t }\\n\\t })(),\\n\\t drag = [],\\n\\t dragMove = function (e) {\\n\\t var x = e.clientX,\\n\\t y = e.clientY,\\n\\t scrollY = g.doc.documentElement.scrollTop || g.doc.body.scrollTop,\\n\\t scrollX = g.doc.documentElement.scrollLeft || g.doc.body.scrollLeft,\\n\\t dragi,\\n\\t j = drag.length;\\n\\t while (j--) {\\n\\t dragi = drag[j];\\n\\t if (supportsTouch && e.touches) {\\n\\t var i = e.touches.length,\\n\\t touch;\\n\\t while (i--) {\\n\\t touch = e.touches[i];\\n\\t if (touch.identifier == dragi.el._drag.id) {\\n\\t x = touch.clientX;\\n\\t y = touch.clientY;\\n\\t (e.originalEvent ? e.originalEvent : e).preventDefault();\\n\\t break;\\n\\t }\\n\\t }\\n\\t } else {\\n\\t e.preventDefault();\\n\\t }\\n\\t var node = dragi.el.node,\\n\\t o,\\n\\t next = node.nextSibling,\\n\\t parent = node.parentNode,\\n\\t display = node.style.display;\\n\\t g.win.opera && parent.removeChild(node);\\n\\t node.style.display = \\\"none\\\";\\n\\t o = dragi.el.paper.getElementByPoint(x, y);\\n\\t node.style.display = display;\\n\\t g.win.opera && (next ? parent.insertBefore(node, next) : parent.appendChild(node));\\n\\t o && eve(\\\"raphael.drag.over.\\\" + dragi.el.id, dragi.el, o);\\n\\t x += scrollX;\\n\\t y += scrollY;\\n\\t eve(\\\"raphael.drag.move.\\\" + dragi.el.id, dragi.move_scope || dragi.el, x - dragi.el._drag.x, y - dragi.el._drag.y, x, y, e);\\n\\t }\\n\\t },\\n\\t dragUp = function (e) {\\n\\t R.unmousemove(dragMove).unmouseup(dragUp);\\n\\t var i = drag.length,\\n\\t dragi;\\n\\t while (i--) {\\n\\t dragi = drag[i];\\n\\t dragi.el._drag = {};\\n\\t eve(\\\"raphael.drag.end.\\\" + dragi.el.id, dragi.end_scope || dragi.start_scope || dragi.move_scope || dragi.el, e);\\n\\t }\\n\\t drag = [];\\n\\t },\\n\\t /*\\\\\\n\\t * Raphael.el\\n\\t [ property (object) ]\\n\\t **\\n\\t * You can add your own method to elements. This is useful when you want to hack default functionality or\\n\\t * want to wrap some common transformation or attributes in one method. In difference to canvas methods,\\n\\t * you can redefine element method at any time. Expending element methods wouldn’t affect set.\\n\\t > Usage\\n\\t | Raphael.el.red = function () {\\n\\t | this.attr({fill: \\\"#f00\\\"});\\n\\t | };\\n\\t | // then use it\\n\\t | paper.circle(100, 100, 20).red();\\n\\t \\\\*/\\n\\t elproto = R.el = {};\\n\\t /*\\\\\\n\\t * Element.click\\n\\t [ method ]\\n\\t **\\n\\t * Adds event handler for click for the element.\\n\\t > Parameters\\n\\t - handler (function) handler for the event\\n\\t = (object) @Element\\n\\t \\\\*/\\n\\t /*\\\\\\n\\t * Element.unclick\\n\\t [ method ]\\n\\t **\\n\\t * Removes event handler for click for the element.\\n\\t > Parameters\\n\\t - handler (function) #optional handler for the event\\n\\t = (object) @Element\\n\\t \\\\*/\\n\\n\\t /*\\\\\\n\\t * Element.dblclick\\n\\t [ method ]\\n\\t **\\n\\t * Adds event handler for double click for the element.\\n\\t > Parameters\\n\\t - handler (function) handler for the event\\n\\t = (object) @Element\\n\\t \\\\*/\\n\\t /*\\\\\\n\\t * Element.undblclick\\n\\t [ method ]\\n\\t **\\n\\t * Removes event handler for double click for the element.\\n\\t > Parameters\\n\\t - handler (function) #optional handler for the event\\n\\t = (object) @Element\\n\\t \\\\*/\\n\\n\\t /*\\\\\\n\\t * Element.mousedown\\n\\t [ method ]\\n\\t **\\n\\t * Adds event handler for mousedown for the element.\\n\\t > Parameters\\n\\t - handler (function) handler for the event\\n\\t = (object) @Element\\n\\t \\\\*/\\n\\t /*\\\\\\n\\t * Element.unmousedown\\n\\t [ method ]\\n\\t **\\n\\t * Removes event handler for mousedown for the element.\\n\\t > Parameters\\n\\t - handler (function) #optional handler for the event\\n\\t = (object) @Element\\n\\t \\\\*/\\n\\n\\t /*\\\\\\n\\t * Element.mousemove\\n\\t [ method ]\\n\\t **\\n\\t * Adds event handler for mousemove for the element.\\n\\t > Parameters\\n\\t - handler (function) handler for the event\\n\\t = (object) @Element\\n\\t \\\\*/\\n\\t /*\\\\\\n\\t * Element.unmousemove\\n\\t [ method ]\\n\\t **\\n\\t * Removes event handler for mousemove for the element.\\n\\t > Parameters\\n\\t - handler (function) #optional handler for the event\\n\\t = (object) @Element\\n\\t \\\\*/\\n\\n\\t /*\\\\\\n\\t * Element.mouseout\\n\\t [ method ]\\n\\t **\\n\\t * Adds event handler for mouseout for the element.\\n\\t > Parameters\\n\\t - handler (function) handler for the event\\n\\t = (object) @Element\\n\\t \\\\*/\\n\\t /*\\\\\\n\\t * Element.unmouseout\\n\\t [ method ]\\n\\t **\\n\\t * Removes event handler for mouseout for the element.\\n\\t > Parameters\\n\\t - handler (function) #optional handler for the event\\n\\t = (object) @Element\\n\\t \\\\*/\\n\\n\\t /*\\\\\\n\\t * Element.mouseover\\n\\t [ method ]\\n\\t **\\n\\t * Adds event handler for mouseover for the element.\\n\\t > Parameters\\n\\t - handler (function) handler for the event\\n\\t = (object) @Element\\n\\t \\\\*/\\n\\t /*\\\\\\n\\t * Element.unmouseover\\n\\t [ method ]\\n\\t **\\n\\t * Removes event handler for mouseover for the element.\\n\\t > Parameters\\n\\t - handler (function) #optional handler for the event\\n\\t = (object) @Element\\n\\t \\\\*/\\n\\n\\t /*\\\\\\n\\t * Element.mouseup\\n\\t [ method ]\\n\\t **\\n\\t * Adds event handler for mouseup for the element.\\n\\t > Parameters\\n\\t - handler (function) handler for the event\\n\\t = (object) @Element\\n\\t \\\\*/\\n\\t /*\\\\\\n\\t * Element.unmouseup\\n\\t [ method ]\\n\\t **\\n\\t * Removes event handler for mouseup for the element.\\n\\t > Parameters\\n\\t - handler (function) #optional handler for the event\\n\\t = (object) @Element\\n\\t \\\\*/\\n\\n\\t /*\\\\\\n\\t * Element.touchstart\\n\\t [ method ]\\n\\t **\\n\\t * Adds event handler for touchstart for the element.\\n\\t > Parameters\\n\\t - handler (function) handler for the event\\n\\t = (object) @Element\\n\\t \\\\*/\\n\\t /*\\\\\\n\\t * Element.untouchstart\\n\\t [ method ]\\n\\t **\\n\\t * Removes event handler for touchstart for the element.\\n\\t > Parameters\\n\\t - handler (function) #optional handler for the event\\n\\t = (object) @Element\\n\\t \\\\*/\\n\\n\\t /*\\\\\\n\\t * Element.touchmove\\n\\t [ method ]\\n\\t **\\n\\t * Adds event handler for touchmove for the element.\\n\\t > Parameters\\n\\t - handler (function) handler for the event\\n\\t = (object) @Element\\n\\t \\\\*/\\n\\t /*\\\\\\n\\t * Element.untouchmove\\n\\t [ method ]\\n\\t **\\n\\t * Removes event handler for touchmove for the element.\\n\\t > Parameters\\n\\t - handler (function) #optional handler for the event\\n\\t = (object) @Element\\n\\t \\\\*/\\n\\n\\t /*\\\\\\n\\t * Element.touchend\\n\\t [ method ]\\n\\t **\\n\\t * Adds event handler for touchend for the element.\\n\\t > Parameters\\n\\t - handler (function) handler for the event\\n\\t = (object) @Element\\n\\t \\\\*/\\n\\t /*\\\\\\n\\t * Element.untouchend\\n\\t [ method ]\\n\\t **\\n\\t * Removes event handler for touchend for the element.\\n\\t > Parameters\\n\\t - handler (function) #optional handler for the event\\n\\t = (object) @Element\\n\\t \\\\*/\\n\\n\\t /*\\\\\\n\\t * Element.touchcancel\\n\\t [ method ]\\n\\t **\\n\\t * Adds event handler for touchcancel for the element.\\n\\t > Parameters\\n\\t - handler (function) handler for the event\\n\\t = (object) @Element\\n\\t \\\\*/\\n\\t /*\\\\\\n\\t * Element.untouchcancel\\n\\t [ method ]\\n\\t **\\n\\t * Removes event handler for touchcancel for the element.\\n\\t > Parameters\\n\\t - handler (function) #optional handler for the event\\n\\t = (object) @Element\\n\\t \\\\*/\\n\\t for (var i = events.length; i--;) {\\n\\t (function (eventName) {\\n\\t R[eventName] = elproto[eventName] = function (fn, scope) {\\n\\t if (R.is(fn, \\\"function\\\")) {\\n\\t this.events = this.events || [];\\n\\t this.events.push({name: eventName, f: fn, unbind: addEvent(this.shape || this.node || g.doc, eventName, fn, scope || this)});\\n\\t }\\n\\t return this;\\n\\t };\\n\\t R[\\\"un\\\" + eventName] = elproto[\\\"un\\\" + eventName] = function (fn) {\\n\\t var events = this.events || [],\\n\\t l = events.length;\\n\\t while (l--){\\n\\t if (events[l].name == eventName && (R.is(fn, \\\"undefined\\\") || events[l].f == fn)) {\\n\\t events[l].unbind();\\n\\t events.splice(l, 1);\\n\\t !events.length && delete this.events;\\n\\t }\\n\\t }\\n\\t return this;\\n\\t };\\n\\t })(events[i]);\\n\\t }\\n\\n\\t /*\\\\\\n\\t * Element.data\\n\\t [ method ]\\n\\t **\\n\\t * Adds or retrieves given value associated with given key.\\n\\t **\\n\\t * See also @Element.removeData\\n\\t > Parameters\\n\\t - key (string) key to store data\\n\\t - value (any) #optional value to store\\n\\t = (object) @Element\\n\\t * or, if value is not specified:\\n\\t = (any) value\\n\\t * or, if key and value are not specified:\\n\\t = (object) Key/value pairs for all the data associated with the element.\\n\\t > Usage\\n\\t | for (var i = 0, i < 5, i++) {\\n\\t | paper.circle(10 + 15 * i, 10, 10)\\n\\t | .attr({fill: \\\"#000\\\"})\\n\\t | .data(\\\"i\\\", i)\\n\\t | .click(function () {\\n\\t | alert(this.data(\\\"i\\\"));\\n\\t | });\\n\\t | }\\n\\t \\\\*/\\n\\t elproto.data = function (key, value) {\\n\\t var data = eldata[this.id] = eldata[this.id] || {};\\n\\t if (arguments.length == 0) {\\n\\t return data;\\n\\t }\\n\\t if (arguments.length == 1) {\\n\\t if (R.is(key, \\\"object\\\")) {\\n\\t for (var i in key) if (key[has](i)) {\\n\\t this.data(i, key[i]);\\n\\t }\\n\\t return this;\\n\\t }\\n\\t eve(\\\"raphael.data.get.\\\" + this.id, this, data[key], key);\\n\\t return data[key];\\n\\t }\\n\\t data[key] = value;\\n\\t eve(\\\"raphael.data.set.\\\" + this.id, this, value, key);\\n\\t return this;\\n\\t };\\n\\t /*\\\\\\n\\t * Element.removeData\\n\\t [ method ]\\n\\t **\\n\\t * Removes value associated with an element by given key.\\n\\t * If key is not provided, removes all the data of the element.\\n\\t > Parameters\\n\\t - key (string) #optional key\\n\\t = (object) @Element\\n\\t \\\\*/\\n\\t elproto.removeData = function (key) {\\n\\t if (key == null) {\\n\\t eldata[this.id] = {};\\n\\t } else {\\n\\t eldata[this.id] && delete eldata[this.id][key];\\n\\t }\\n\\t return this;\\n\\t };\\n\\t /*\\\\\\n\\t * Element.getData\\n\\t [ method ]\\n\\t **\\n\\t * Retrieves the element data\\n\\t = (object) data\\n\\t \\\\*/\\n\\t elproto.getData = function () {\\n\\t return clone(eldata[this.id] || {});\\n\\t };\\n\\t /*\\\\\\n\\t * Element.hover\\n\\t [ method ]\\n\\t **\\n\\t * Adds event handlers for hover for the element.\\n\\t > Parameters\\n\\t - f_in (function) handler for hover in\\n\\t - f_out (function) handler for hover out\\n\\t - icontext (object) #optional context for hover in handler\\n\\t - ocontext (object) #optional context for hover out handler\\n\\t = (object) @Element\\n\\t \\\\*/\\n\\t elproto.hover = function (f_in, f_out, scope_in, scope_out) {\\n\\t return this.mouseover(f_in, scope_in).mouseout(f_out, scope_out || scope_in);\\n\\t };\\n\\t /*\\\\\\n\\t * Element.unhover\\n\\t [ method ]\\n\\t **\\n\\t * Removes event handlers for hover for the element.\\n\\t > Parameters\\n\\t - f_in (function) handler for hover in\\n\\t - f_out (function) handler for hover out\\n\\t = (object) @Element\\n\\t \\\\*/\\n\\t elproto.unhover = function (f_in, f_out) {\\n\\t return this.unmouseover(f_in).unmouseout(f_out);\\n\\t };\\n\\t var draggable = [];\\n\\t /*\\\\\\n\\t * Element.drag\\n\\t [ method ]\\n\\t **\\n\\t * Adds event handlers for drag of the element.\\n\\t > Parameters\\n\\t - onmove (function) handler for moving\\n\\t - onstart (function) handler for drag start\\n\\t - onend (function) handler for drag end\\n\\t - mcontext (object) #optional context for moving handler\\n\\t - scontext (object) #optional context for drag start handler\\n\\t - econtext (object) #optional context for drag end handler\\n\\t * Additionally following `drag` events will be triggered: `drag.start.` on start,\\n\\t * `drag.end.` on end and `drag.move.` on every move. When element will be dragged over another element\\n\\t * `drag.over.` will be fired as well.\\n\\t *\\n\\t * Start event and start handler will be called in specified context or in context of the element with following parameters:\\n\\t o x (number) x position of the mouse\\n\\t o y (number) y position of the mouse\\n\\t o event (object) DOM event object\\n\\t * Move event and move handler will be called in specified context or in context of the element with following parameters:\\n\\t o dx (number) shift by x from the start point\\n\\t o dy (number) shift by y from the start point\\n\\t o x (number) x position of the mouse\\n\\t o y (number) y position of the mouse\\n\\t o event (object) DOM event object\\n\\t * End event and end handler will be called in specified context or in context of the element with following parameters:\\n\\t o event (object) DOM event object\\n\\t = (object) @Element\\n\\t \\\\*/\\n\\t elproto.drag = function (onmove, onstart, onend, move_scope, start_scope, end_scope) {\\n\\t function start(e) {\\n\\t (e.originalEvent || e).preventDefault();\\n\\t var x = e.clientX,\\n\\t y = e.clientY,\\n\\t scrollY = g.doc.documentElement.scrollTop || g.doc.body.scrollTop,\\n\\t scrollX = g.doc.documentElement.scrollLeft || g.doc.body.scrollLeft;\\n\\t this._drag.id = e.identifier;\\n\\t if (supportsTouch && e.touches) {\\n\\t var i = e.touches.length, touch;\\n\\t while (i--) {\\n\\t touch = e.touches[i];\\n\\t this._drag.id = touch.identifier;\\n\\t if (touch.identifier == this._drag.id) {\\n\\t x = touch.clientX;\\n\\t y = touch.clientY;\\n\\t break;\\n\\t }\\n\\t }\\n\\t }\\n\\t this._drag.x = x + scrollX;\\n\\t this._drag.y = y + scrollY;\\n\\t !drag.length && R.mousemove(dragMove).mouseup(dragUp);\\n\\t drag.push({el: this, move_scope: move_scope, start_scope: start_scope, end_scope: end_scope});\\n\\t onstart && eve.on(\\\"raphael.drag.start.\\\" + this.id, onstart);\\n\\t onmove && eve.on(\\\"raphael.drag.move.\\\" + this.id, onmove);\\n\\t onend && eve.on(\\\"raphael.drag.end.\\\" + this.id, onend);\\n\\t eve(\\\"raphael.drag.start.\\\" + this.id, start_scope || move_scope || this, e.clientX + scrollX, e.clientY + scrollY, e);\\n\\t }\\n\\t this._drag = {};\\n\\t draggable.push({el: this, start: start});\\n\\t this.mousedown(start);\\n\\t return this;\\n\\t };\\n\\t /*\\\\\\n\\t * Element.onDragOver\\n\\t [ method ]\\n\\t **\\n\\t * Shortcut for assigning event handler for `drag.over.` event, where id is id of the element (see @Element.id).\\n\\t > Parameters\\n\\t - f (function) handler for event, first argument would be the element you are dragging over\\n\\t \\\\*/\\n\\t elproto.onDragOver = function (f) {\\n\\t f ? eve.on(\\\"raphael.drag.over.\\\" + this.id, f) : eve.unbind(\\\"raphael.drag.over.\\\" + this.id);\\n\\t };\\n\\t /*\\\\\\n\\t * Element.undrag\\n\\t [ method ]\\n\\t **\\n\\t * Removes all drag event handlers from given element.\\n\\t \\\\*/\\n\\t elproto.undrag = function () {\\n\\t var i = draggable.length;\\n\\t while (i--) if (draggable[i].el == this) {\\n\\t this.unmousedown(draggable[i].start);\\n\\t draggable.splice(i, 1);\\n\\t eve.unbind(\\\"raphael.drag.*.\\\" + this.id);\\n\\t }\\n\\t !draggable.length && R.unmousemove(dragMove).unmouseup(dragUp);\\n\\t drag = [];\\n\\t };\\n\\t /*\\\\\\n\\t * Paper.circle\\n\\t [ method ]\\n\\t **\\n\\t * Draws a circle.\\n\\t **\\n\\t > Parameters\\n\\t **\\n\\t - x (number) x coordinate of the centre\\n\\t - y (number) y coordinate of the centre\\n\\t - r (number) radius\\n\\t = (object) Raphaël element object with type “circle”\\n\\t **\\n\\t > Usage\\n\\t | var c = paper.circle(50, 50, 40);\\n\\t \\\\*/\\n\\t paperproto.circle = function (x, y, r) {\\n\\t var out = R._engine.circle(this, x || 0, y || 0, r || 0);\\n\\t this.__set__ && this.__set__.push(out);\\n\\t return out;\\n\\t };\\n\\t /*\\\\\\n\\t * Paper.rect\\n\\t [ method ]\\n\\t *\\n\\t * Draws a rectangle.\\n\\t **\\n\\t > Parameters\\n\\t **\\n\\t - x (number) x coordinate of the top left corner\\n\\t - y (number) y coordinate of the top left corner\\n\\t - width (number) width\\n\\t - height (number) height\\n\\t - r (number) #optional radius for rounded corners, default is 0\\n\\t = (object) Raphaël element object with type “rect”\\n\\t **\\n\\t > Usage\\n\\t | // regular rectangle\\n\\t | var c = paper.rect(10, 10, 50, 50);\\n\\t | // rectangle with rounded corners\\n\\t | var c = paper.rect(40, 40, 50, 50, 10);\\n\\t \\\\*/\\n\\t paperproto.rect = function (x, y, w, h, r) {\\n\\t var out = R._engine.rect(this, x || 0, y || 0, w || 0, h || 0, r || 0);\\n\\t this.__set__ && this.__set__.push(out);\\n\\t return out;\\n\\t };\\n\\t /*\\\\\\n\\t * Paper.ellipse\\n\\t [ method ]\\n\\t **\\n\\t * Draws an ellipse.\\n\\t **\\n\\t > Parameters\\n\\t **\\n\\t - x (number) x coordinate of the centre\\n\\t - y (number) y coordinate of the centre\\n\\t - rx (number) horizontal radius\\n\\t - ry (number) vertical radius\\n\\t = (object) Raphaël element object with type “ellipse”\\n\\t **\\n\\t > Usage\\n\\t | var c = paper.ellipse(50, 50, 40, 20);\\n\\t \\\\*/\\n\\t paperproto.ellipse = function (x, y, rx, ry) {\\n\\t var out = R._engine.ellipse(this, x || 0, y || 0, rx || 0, ry || 0);\\n\\t this.__set__ && this.__set__.push(out);\\n\\t return out;\\n\\t };\\n\\t /*\\\\\\n\\t * Paper.path\\n\\t [ method ]\\n\\t **\\n\\t * Creates a path element by given path data string.\\n\\t > Parameters\\n\\t - pathString (string) #optional path string in SVG format.\\n\\t * Path string consists of one-letter commands, followed by comma seprarated arguments in numercal form. Example:\\n\\t | \\\"M10,20L30,40\\\"\\n\\t * Here we can see two commands: “M”, with arguments `(10, 20)` and “L” with arguments `(30, 40)`. Upper case letter mean command is absolute, lower case—relative.\\n\\t *\\n\\t #

Here is short list of commands available, for more details see SVG path string format.

\\n\\t # \\n\\t # \\n\\t # \\n\\t # \\n\\t # \\n\\t # \\n\\t # \\n\\t # \\n\\t # \\n\\t # \\n\\t # \\n\\t #
CommandNameParameters
Mmoveto(x y)+
Zclosepath(none)
Llineto(x y)+
Hhorizontal linetox+
Vvertical linetoy+
Ccurveto(x1 y1 x2 y2 x y)+
Ssmooth curveto(x2 y2 x y)+
Qquadratic Bézier curveto(x1 y1 x y)+
Tsmooth quadratic Bézier curveto(x y)+
Aelliptical arc(rx ry x-axis-rotation large-arc-flag sweep-flag x y)+
RCatmull-Rom curveto*x1 y1 (x y)+
\\n\\t * * “Catmull-Rom curveto” is a not standard SVG command and added in 2.0 to make life easier.\\n\\t * Note: there is a special case when path consist of just three commands: “M10,10R…z”. In this case path will smoothly connects to its beginning.\\n\\t > Usage\\n\\t | var c = paper.path(\\\"M10 10L90 90\\\");\\n\\t | // draw a diagonal line:\\n\\t | // move to 10,10, line to 90,90\\n\\t * For example of path strings, check out these icons: http://raphaeljs.com/icons/\\n\\t \\\\*/\\n\\t paperproto.path = function (pathString) {\\n\\t pathString && !R.is(pathString, string) && !R.is(pathString[0], array) && (pathString += E);\\n\\t var out = R._engine.path(R.format[apply](R, arguments), this);\\n\\t this.__set__ && this.__set__.push(out);\\n\\t return out;\\n\\t };\\n\\t /*\\\\\\n\\t * Paper.image\\n\\t [ method ]\\n\\t **\\n\\t * Embeds an image into the surface.\\n\\t **\\n\\t > Parameters\\n\\t **\\n\\t - src (string) URI of the source image\\n\\t - x (number) x coordinate position\\n\\t - y (number) y coordinate position\\n\\t - width (number) width of the image\\n\\t - height (number) height of the image\\n\\t = (object) Raphaël element object with type “image”\\n\\t **\\n\\t > Usage\\n\\t | var c = paper.image(\\\"apple.png\\\", 10, 10, 80, 80);\\n\\t \\\\*/\\n\\t paperproto.image = function (src, x, y, w, h) {\\n\\t var out = R._engine.image(this, src || \\\"about:blank\\\", x || 0, y || 0, w || 0, h || 0);\\n\\t this.__set__ && this.__set__.push(out);\\n\\t return out;\\n\\t };\\n\\t /*\\\\\\n\\t * Paper.text\\n\\t [ method ]\\n\\t **\\n\\t * Draws a text string. If you need line breaks, put “\\\\n” in the string.\\n\\t **\\n\\t > Parameters\\n\\t **\\n\\t - x (number) x coordinate position\\n\\t - y (number) y coordinate position\\n\\t - text (string) The text string to draw\\n\\t = (object) Raphaël element object with type “text”\\n\\t **\\n\\t > Usage\\n\\t | var t = paper.text(50, 50, \\\"Raphaël\\\\nkicks\\\\nbutt!\\\");\\n\\t \\\\*/\\n\\t paperproto.text = function (x, y, text) {\\n\\t var out = R._engine.text(this, x || 0, y || 0, Str(text));\\n\\t this.__set__ && this.__set__.push(out);\\n\\t return out;\\n\\t };\\n\\t /*\\\\\\n\\t * Paper.set\\n\\t [ method ]\\n\\t **\\n\\t * Creates array-like object to keep and operate several elements at once.\\n\\t * Warning: it doesn’t create any elements for itself in the page, it just groups existing elements.\\n\\t * Sets act as pseudo elements — all methods available to an element can be used on a set.\\n\\t = (object) array-like object that represents set of elements\\n\\t **\\n\\t > Usage\\n\\t | var st = paper.set();\\n\\t | st.push(\\n\\t | paper.circle(10, 10, 5),\\n\\t | paper.circle(30, 10, 5)\\n\\t | );\\n\\t | st.attr({fill: \\\"red\\\"}); // changes the fill of both circles\\n\\t \\\\*/\\n\\t paperproto.set = function (itemsArray) {\\n\\t !R.is(itemsArray, \\\"array\\\") && (itemsArray = Array.prototype.splice.call(arguments, 0, arguments.length));\\n\\t var out = new Set(itemsArray);\\n\\t this.__set__ && this.__set__.push(out);\\n\\t out[\\\"paper\\\"] = this;\\n\\t out[\\\"type\\\"] = \\\"set\\\";\\n\\t return out;\\n\\t };\\n\\t /*\\\\\\n\\t * Paper.setStart\\n\\t [ method ]\\n\\t **\\n\\t * Creates @Paper.set. All elements that will be created after calling this method and before calling\\n\\t * @Paper.setFinish will be added to the set.\\n\\t **\\n\\t > Usage\\n\\t | paper.setStart();\\n\\t | paper.circle(10, 10, 5),\\n\\t | paper.circle(30, 10, 5)\\n\\t | var st = paper.setFinish();\\n\\t | st.attr({fill: \\\"red\\\"}); // changes the fill of both circles\\n\\t \\\\*/\\n\\t paperproto.setStart = function (set) {\\n\\t this.__set__ = set || this.set();\\n\\t };\\n\\t /*\\\\\\n\\t * Paper.setFinish\\n\\t [ method ]\\n\\t **\\n\\t * See @Paper.setStart. This method finishes catching and returns resulting set.\\n\\t **\\n\\t = (object) set\\n\\t \\\\*/\\n\\t paperproto.setFinish = function (set) {\\n\\t var out = this.__set__;\\n\\t delete this.__set__;\\n\\t return out;\\n\\t };\\n\\t /*\\\\\\n\\t * Paper.getSize\\n\\t [ method ]\\n\\t **\\n\\t * Obtains current paper actual size.\\n\\t **\\n\\t = (object)\\n\\t \\\\*/\\n\\t paperproto.getSize = function () {\\n\\t var container = this.canvas.parentNode;\\n\\t return {\\n\\t width: container.offsetWidth,\\n\\t height: container.offsetHeight\\n\\t };\\n\\t };\\n\\t /*\\\\\\n\\t * Paper.setSize\\n\\t [ method ]\\n\\t **\\n\\t * If you need to change dimensions of the canvas call this method\\n\\t **\\n\\t > Parameters\\n\\t **\\n\\t - width (number) new width of the canvas\\n\\t - height (number) new height of the canvas\\n\\t \\\\*/\\n\\t paperproto.setSize = function (width, height) {\\n\\t return R._engine.setSize.call(this, width, height);\\n\\t };\\n\\t /*\\\\\\n\\t * Paper.setViewBox\\n\\t [ method ]\\n\\t **\\n\\t * Sets the view box of the paper. Practically it gives you ability to zoom and pan whole paper surface by\\n\\t * specifying new boundaries.\\n\\t **\\n\\t > Parameters\\n\\t **\\n\\t - x (number) new x position, default is `0`\\n\\t - y (number) new y position, default is `0`\\n\\t - w (number) new width of the canvas\\n\\t - h (number) new height of the canvas\\n\\t - fit (boolean) `true` if you want graphics to fit into new boundary box\\n\\t \\\\*/\\n\\t paperproto.setViewBox = function (x, y, w, h, fit) {\\n\\t return R._engine.setViewBox.call(this, x, y, w, h, fit);\\n\\t };\\n\\t /*\\\\\\n\\t * Paper.top\\n\\t [ property ]\\n\\t **\\n\\t * Points to the topmost element on the paper\\n\\t \\\\*/\\n\\t /*\\\\\\n\\t * Paper.bottom\\n\\t [ property ]\\n\\t **\\n\\t * Points to the bottom element on the paper\\n\\t \\\\*/\\n\\t paperproto.top = paperproto.bottom = null;\\n\\t /*\\\\\\n\\t * Paper.raphael\\n\\t [ property ]\\n\\t **\\n\\t * Points to the @Raphael object/function\\n\\t \\\\*/\\n\\t paperproto.raphael = R;\\n\\t var getOffset = function (elem) {\\n\\t var box = elem.getBoundingClientRect(),\\n\\t doc = elem.ownerDocument,\\n\\t body = doc.body,\\n\\t docElem = doc.documentElement,\\n\\t clientTop = docElem.clientTop || body.clientTop || 0, clientLeft = docElem.clientLeft || body.clientLeft || 0,\\n\\t top = box.top + (g.win.pageYOffset || docElem.scrollTop || body.scrollTop ) - clientTop,\\n\\t left = box.left + (g.win.pageXOffset || docElem.scrollLeft || body.scrollLeft) - clientLeft;\\n\\t return {\\n\\t y: top,\\n\\t x: left\\n\\t };\\n\\t };\\n\\t /*\\\\\\n\\t * Paper.getElementByPoint\\n\\t [ method ]\\n\\t **\\n\\t * Returns you topmost element under given point.\\n\\t **\\n\\t = (object) Raphaël element object\\n\\t > Parameters\\n\\t **\\n\\t - x (number) x coordinate from the top left corner of the window\\n\\t - y (number) y coordinate from the top left corner of the window\\n\\t > Usage\\n\\t | paper.getElementByPoint(mouseX, mouseY).attr({stroke: \\\"#f00\\\"});\\n\\t \\\\*/\\n\\t paperproto.getElementByPoint = function (x, y) {\\n\\t var paper = this,\\n\\t svg = paper.canvas,\\n\\t target = g.doc.elementFromPoint(x, y);\\n\\t if (g.win.opera && target.tagName == \\\"svg\\\") {\\n\\t var so = getOffset(svg),\\n\\t sr = svg.createSVGRect();\\n\\t sr.x = x - so.x;\\n\\t sr.y = y - so.y;\\n\\t sr.width = sr.height = 1;\\n\\t var hits = svg.getIntersectionList(sr, null);\\n\\t if (hits.length) {\\n\\t target = hits[hits.length - 1];\\n\\t }\\n\\t }\\n\\t if (!target) {\\n\\t return null;\\n\\t }\\n\\t while (target.parentNode && target != svg.parentNode && !target.raphael) {\\n\\t target = target.parentNode;\\n\\t }\\n\\t target == paper.canvas.parentNode && (target = svg);\\n\\t target = target && target.raphael ? paper.getById(target.raphaelid) : null;\\n\\t return target;\\n\\t };\\n\\n\\t /*\\\\\\n\\t * Paper.getElementsByBBox\\n\\t [ method ]\\n\\t **\\n\\t * Returns set of elements that have an intersecting bounding box\\n\\t **\\n\\t > Parameters\\n\\t **\\n\\t - bbox (object) bbox to check with\\n\\t = (object) @Set\\n\\t \\\\*/\\n\\t paperproto.getElementsByBBox = function (bbox) {\\n\\t var set = this.set();\\n\\t this.forEach(function (el) {\\n\\t if (R.isBBoxIntersect(el.getBBox(), bbox)) {\\n\\t set.push(el);\\n\\t }\\n\\t });\\n\\t return set;\\n\\t };\\n\\n\\t /*\\\\\\n\\t * Paper.getById\\n\\t [ method ]\\n\\t **\\n\\t * Returns you element by its internal ID.\\n\\t **\\n\\t > Parameters\\n\\t **\\n\\t - id (number) id\\n\\t = (object) Raphaël element object\\n\\t \\\\*/\\n\\t paperproto.getById = function (id) {\\n\\t var bot = this.bottom;\\n\\t while (bot) {\\n\\t if (bot.id == id) {\\n\\t return bot;\\n\\t }\\n\\t bot = bot.next;\\n\\t }\\n\\t return null;\\n\\t };\\n\\t /*\\\\\\n\\t * Paper.forEach\\n\\t [ method ]\\n\\t **\\n\\t * Executes given function for each element on the paper\\n\\t *\\n\\t * If callback function returns `false` it will stop loop running.\\n\\t **\\n\\t > Parameters\\n\\t **\\n\\t - callback (function) function to run\\n\\t - thisArg (object) context object for the callback\\n\\t = (object) Paper object\\n\\t > Usage\\n\\t | paper.forEach(function (el) {\\n\\t | el.attr({ stroke: \\\"blue\\\" });\\n\\t | });\\n\\t \\\\*/\\n\\t paperproto.forEach = function (callback, thisArg) {\\n\\t var bot = this.bottom;\\n\\t while (bot) {\\n\\t if (callback.call(thisArg, bot) === false) {\\n\\t return this;\\n\\t }\\n\\t bot = bot.next;\\n\\t }\\n\\t return this;\\n\\t };\\n\\t /*\\\\\\n\\t * Paper.getElementsByPoint\\n\\t [ method ]\\n\\t **\\n\\t * Returns set of elements that have common point inside\\n\\t **\\n\\t > Parameters\\n\\t **\\n\\t - x (number) x coordinate of the point\\n\\t - y (number) y coordinate of the point\\n\\t = (object) @Set\\n\\t \\\\*/\\n\\t paperproto.getElementsByPoint = function (x, y) {\\n\\t var set = this.set();\\n\\t this.forEach(function (el) {\\n\\t if (el.isPointInside(x, y)) {\\n\\t set.push(el);\\n\\t }\\n\\t });\\n\\t return set;\\n\\t };\\n\\t function x_y() {\\n\\t return this.x + S + this.y;\\n\\t }\\n\\t function x_y_w_h() {\\n\\t return this.x + S + this.y + S + this.width + \\\" \\\\xd7 \\\" + this.height;\\n\\t }\\n\\t /*\\\\\\n\\t * Element.isPointInside\\n\\t [ method ]\\n\\t **\\n\\t * Determine if given point is inside this element’s shape\\n\\t **\\n\\t > Parameters\\n\\t **\\n\\t - x (number) x coordinate of the point\\n\\t - y (number) y coordinate of the point\\n\\t = (boolean) `true` if point inside the shape\\n\\t \\\\*/\\n\\t elproto.isPointInside = function (x, y) {\\n\\t var rp = this.realPath = getPath[this.type](this);\\n\\t if (this.attr('transform') && this.attr('transform').length) {\\n\\t rp = R.transformPath(rp, this.attr('transform'));\\n\\t }\\n\\t return R.isPointInsidePath(rp, x, y);\\n\\t };\\n\\t /*\\\\\\n\\t * Element.getBBox\\n\\t [ method ]\\n\\t **\\n\\t * Return bounding box for a given element\\n\\t **\\n\\t > Parameters\\n\\t **\\n\\t - isWithoutTransform (boolean) flag, `true` if you want to have bounding box before transformations. Default is `false`.\\n\\t = (object) Bounding box object:\\n\\t o {\\n\\t o x: (number) top left corner x\\n\\t o y: (number) top left corner y\\n\\t o x2: (number) bottom right corner x\\n\\t o y2: (number) bottom right corner y\\n\\t o width: (number) width\\n\\t o height: (number) height\\n\\t o }\\n\\t \\\\*/\\n\\t elproto.getBBox = function (isWithoutTransform) {\\n\\t if (this.removed) {\\n\\t return {};\\n\\t }\\n\\t var _ = this._;\\n\\t if (isWithoutTransform) {\\n\\t if (_.dirty || !_.bboxwt) {\\n\\t this.realPath = getPath[this.type](this);\\n\\t _.bboxwt = pathDimensions(this.realPath);\\n\\t _.bboxwt.toString = x_y_w_h;\\n\\t _.dirty = 0;\\n\\t }\\n\\t return _.bboxwt;\\n\\t }\\n\\t if (_.dirty || _.dirtyT || !_.bbox) {\\n\\t if (_.dirty || !this.realPath) {\\n\\t _.bboxwt = 0;\\n\\t this.realPath = getPath[this.type](this);\\n\\t }\\n\\t _.bbox = pathDimensions(mapPath(this.realPath, this.matrix));\\n\\t _.bbox.toString = x_y_w_h;\\n\\t _.dirty = _.dirtyT = 0;\\n\\t }\\n\\t return _.bbox;\\n\\t };\\n\\t /*\\\\\\n\\t * Element.clone\\n\\t [ method ]\\n\\t **\\n\\t = (object) clone of a given element\\n\\t **\\n\\t \\\\*/\\n\\t elproto.clone = function () {\\n\\t if (this.removed) {\\n\\t return null;\\n\\t }\\n\\t var out = this.paper[this.type]().attr(this.attr());\\n\\t this.__set__ && this.__set__.push(out);\\n\\t return out;\\n\\t };\\n\\t /*\\\\\\n\\t * Element.glow\\n\\t [ method ]\\n\\t **\\n\\t * Return set of elements that create glow-like effect around given element. See @Paper.set.\\n\\t *\\n\\t * Note: Glow is not connected to the element. If you change element attributes it won’t adjust itself.\\n\\t **\\n\\t > Parameters\\n\\t **\\n\\t - glow (object) #optional parameters object with all properties optional:\\n\\t o {\\n\\t o width (number) size of the glow, default is `10`\\n\\t o fill (boolean) will it be filled, default is `false`\\n\\t o opacity (number) opacity, default is `0.5`\\n\\t o offsetx (number) horizontal offset, default is `0`\\n\\t o offsety (number) vertical offset, default is `0`\\n\\t o color (string) glow colour, default is `black`\\n\\t o }\\n\\t = (object) @Paper.set of elements that represents glow\\n\\t \\\\*/\\n\\t elproto.glow = function (glow) {\\n\\t if (this.type == \\\"text\\\") {\\n\\t return null;\\n\\t }\\n\\t glow = glow || {};\\n\\t var s = {\\n\\t width: (glow.width || 10) + (+this.attr(\\\"stroke-width\\\") || 1),\\n\\t fill: glow.fill || false,\\n\\t opacity: glow.opacity == null ? .5 : glow.opacity,\\n\\t offsetx: glow.offsetx || 0,\\n\\t offsety: glow.offsety || 0,\\n\\t color: glow.color || \\\"#000\\\"\\n\\t },\\n\\t c = s.width / 2,\\n\\t r = this.paper,\\n\\t out = r.set(),\\n\\t path = this.realPath || getPath[this.type](this);\\n\\t path = this.matrix ? mapPath(path, this.matrix) : path;\\n\\t for (var i = 1; i < c + 1; i++) {\\n\\t out.push(r.path(path).attr({\\n\\t stroke: s.color,\\n\\t fill: s.fill ? s.color : \\\"none\\\",\\n\\t \\\"stroke-linejoin\\\": \\\"round\\\",\\n\\t \\\"stroke-linecap\\\": \\\"round\\\",\\n\\t \\\"stroke-width\\\": +(s.width / c * i).toFixed(3),\\n\\t opacity: +(s.opacity / c).toFixed(3)\\n\\t }));\\n\\t }\\n\\t return out.insertBefore(this).translate(s.offsetx, s.offsety);\\n\\t };\\n\\t var curveslengths = {},\\n\\t getPointAtSegmentLength = function (p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, length) {\\n\\t if (length == null) {\\n\\t return bezlen(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y);\\n\\t } else {\\n\\t return R.findDotsAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, getTatLen(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, length));\\n\\t }\\n\\t },\\n\\t getLengthFactory = function (istotal, subpath) {\\n\\t return function (path, length, onlystart) {\\n\\t path = path2curve(path);\\n\\t var x, y, p, l, sp = \\\"\\\", subpaths = {}, point,\\n\\t len = 0;\\n\\t for (var i = 0, ii = path.length; i < ii; i++) {\\n\\t p = path[i];\\n\\t if (p[0] == \\\"M\\\") {\\n\\t x = +p[1];\\n\\t y = +p[2];\\n\\t } else {\\n\\t l = getPointAtSegmentLength(x, y, p[1], p[2], p[3], p[4], p[5], p[6]);\\n\\t if (len + l > length) {\\n\\t if (subpath && !subpaths.start) {\\n\\t point = getPointAtSegmentLength(x, y, p[1], p[2], p[3], p[4], p[5], p[6], length - len);\\n\\t sp += [\\\"C\\\" + point.start.x, point.start.y, point.m.x, point.m.y, point.x, point.y];\\n\\t if (onlystart) {return sp;}\\n\\t subpaths.start = sp;\\n\\t sp = [\\\"M\\\" + point.x, point.y + \\\"C\\\" + point.n.x, point.n.y, point.end.x, point.end.y, p[5], p[6]].join();\\n\\t len += l;\\n\\t x = +p[5];\\n\\t y = +p[6];\\n\\t continue;\\n\\t }\\n\\t if (!istotal && !subpath) {\\n\\t point = getPointAtSegmentLength(x, y, p[1], p[2], p[3], p[4], p[5], p[6], length - len);\\n\\t return {x: point.x, y: point.y, alpha: point.alpha};\\n\\t }\\n\\t }\\n\\t len += l;\\n\\t x = +p[5];\\n\\t y = +p[6];\\n\\t }\\n\\t sp += p.shift() + p;\\n\\t }\\n\\t subpaths.end = sp;\\n\\t point = istotal ? len : subpath ? subpaths : R.findDotsAtSegment(x, y, p[0], p[1], p[2], p[3], p[4], p[5], 1);\\n\\t point.alpha && (point = {x: point.x, y: point.y, alpha: point.alpha});\\n\\t return point;\\n\\t };\\n\\t };\\n\\t var getTotalLength = getLengthFactory(1),\\n\\t getPointAtLength = getLengthFactory(),\\n\\t getSubpathsAtLength = getLengthFactory(0, 1);\\n\\t /*\\\\\\n\\t * Raphael.getTotalLength\\n\\t [ method ]\\n\\t **\\n\\t * Returns length of the given path in pixels.\\n\\t **\\n\\t > Parameters\\n\\t **\\n\\t - path (string) SVG path string.\\n\\t **\\n\\t = (number) length.\\n\\t \\\\*/\\n\\t R.getTotalLength = getTotalLength;\\n\\t /*\\\\\\n\\t * Raphael.getPointAtLength\\n\\t [ method ]\\n\\t **\\n\\t * Return coordinates of the point located at the given length on the given path.\\n\\t **\\n\\t > Parameters\\n\\t **\\n\\t - path (string) SVG path string\\n\\t - length (number)\\n\\t **\\n\\t = (object) representation of the point:\\n\\t o {\\n\\t o x: (number) x coordinate\\n\\t o y: (number) y coordinate\\n\\t o alpha: (number) angle of derivative\\n\\t o }\\n\\t \\\\*/\\n\\t R.getPointAtLength = getPointAtLength;\\n\\t /*\\\\\\n\\t * Raphael.getSubpath\\n\\t [ method ]\\n\\t **\\n\\t * Return subpath of a given path from given length to given length.\\n\\t **\\n\\t > Parameters\\n\\t **\\n\\t - path (string) SVG path string\\n\\t - from (number) position of the start of the segment\\n\\t - to (number) position of the end of the segment\\n\\t **\\n\\t = (string) pathstring for the segment\\n\\t \\\\*/\\n\\t R.getSubpath = function (path, from, to) {\\n\\t if (this.getTotalLength(path) - to < 1e-6) {\\n\\t return getSubpathsAtLength(path, from).end;\\n\\t }\\n\\t var a = getSubpathsAtLength(path, to, 1);\\n\\t return from ? getSubpathsAtLength(a, from).end : a;\\n\\t };\\n\\t /*\\\\\\n\\t * Element.getTotalLength\\n\\t [ method ]\\n\\t **\\n\\t * Returns length of the path in pixels. Only works for element of “path” type.\\n\\t = (number) length.\\n\\t \\\\*/\\n\\t elproto.getTotalLength = function () {\\n\\t var path = this.getPath();\\n\\t if (!path) {\\n\\t return;\\n\\t }\\n\\n\\t if (this.node.getTotalLength) {\\n\\t return this.node.getTotalLength();\\n\\t }\\n\\n\\t return getTotalLength(path);\\n\\t };\\n\\t /*\\\\\\n\\t * Element.getPointAtLength\\n\\t [ method ]\\n\\t **\\n\\t * Return coordinates of the point located at the given length on the given path. Only works for element of “path” type.\\n\\t **\\n\\t > Parameters\\n\\t **\\n\\t - length (number)\\n\\t **\\n\\t = (object) representation of the point:\\n\\t o {\\n\\t o x: (number) x coordinate\\n\\t o y: (number) y coordinate\\n\\t o alpha: (number) angle of derivative\\n\\t o }\\n\\t \\\\*/\\n\\t elproto.getPointAtLength = function (length) {\\n\\t var path = this.getPath();\\n\\t if (!path) {\\n\\t return;\\n\\t }\\n\\n\\t return getPointAtLength(path, length);\\n\\t };\\n\\t /*\\\\\\n\\t * Element.getPath\\n\\t [ method ]\\n\\t **\\n\\t * Returns path of the element. Only works for elements of “path” type and simple elements like circle.\\n\\t = (object) path\\n\\t **\\n\\t \\\\*/\\n\\t elproto.getPath = function () {\\n\\t var path,\\n\\t getPath = R._getPath[this.type];\\n\\n\\t if (this.type == \\\"text\\\" || this.type == \\\"set\\\") {\\n\\t return;\\n\\t }\\n\\n\\t if (getPath) {\\n\\t path = getPath(this);\\n\\t }\\n\\n\\t return path;\\n\\t };\\n\\t /*\\\\\\n\\t * Element.getSubpath\\n\\t [ method ]\\n\\t **\\n\\t * Return subpath of a given element from given length to given length. Only works for element of “path” type.\\n\\t **\\n\\t > Parameters\\n\\t **\\n\\t - from (number) position of the start of the segment\\n\\t - to (number) position of the end of the segment\\n\\t **\\n\\t = (string) pathstring for the segment\\n\\t \\\\*/\\n\\t elproto.getSubpath = function (from, to) {\\n\\t var path = this.getPath();\\n\\t if (!path) {\\n\\t return;\\n\\t }\\n\\n\\t return R.getSubpath(path, from, to);\\n\\t };\\n\\t /*\\\\\\n\\t * Raphael.easing_formulas\\n\\t [ property ]\\n\\t **\\n\\t * Object that contains easing formulas for animation. You could extend it with your own. By default it has following list of easing:\\n\\t #
    \\n\\t #
  • “linear”
  • \\n\\t #
  • “<” or “easeIn” or “ease-in”
  • \\n\\t #
  • “>” or “easeOut” or “ease-out”
  • \\n\\t #
  • “<>” or “easeInOut” or “ease-in-out”
  • \\n\\t #
  • “backIn” or “back-in”
  • \\n\\t #
  • “backOut” or “back-out”
  • \\n\\t #
  • “elastic”
  • \\n\\t #
  • “bounce”
  • \\n\\t #
\\n\\t #

See also Easing demo.

\\n\\t \\\\*/\\n\\t var ef = R.easing_formulas = {\\n\\t linear: function (n) {\\n\\t return n;\\n\\t },\\n\\t \\\"<\\\": function (n) {\\n\\t return pow(n, 1.7);\\n\\t },\\n\\t \\\">\\\": function (n) {\\n\\t return pow(n, .48);\\n\\t },\\n\\t \\\"<>\\\": function (n) {\\n\\t var q = .48 - n / 1.04,\\n\\t Q = math.sqrt(.1734 + q * q),\\n\\t x = Q - q,\\n\\t X = pow(abs(x), 1 / 3) * (x < 0 ? -1 : 1),\\n\\t y = -Q - q,\\n\\t Y = pow(abs(y), 1 / 3) * (y < 0 ? -1 : 1),\\n\\t t = X + Y + .5;\\n\\t return (1 - t) * 3 * t * t + t * t * t;\\n\\t },\\n\\t backIn: function (n) {\\n\\t var s = 1.70158;\\n\\t return n * n * ((s + 1) * n - s);\\n\\t },\\n\\t backOut: function (n) {\\n\\t n = n - 1;\\n\\t var s = 1.70158;\\n\\t return n * n * ((s + 1) * n + s) + 1;\\n\\t },\\n\\t elastic: function (n) {\\n\\t if (n == !!n) {\\n\\t return n;\\n\\t }\\n\\t return pow(2, -10 * n) * math.sin((n - .075) * (2 * PI) / .3) + 1;\\n\\t },\\n\\t bounce: function (n) {\\n\\t var s = 7.5625,\\n\\t p = 2.75,\\n\\t l;\\n\\t if (n < (1 / p)) {\\n\\t l = s * n * n;\\n\\t } else {\\n\\t if (n < (2 / p)) {\\n\\t n -= (1.5 / p);\\n\\t l = s * n * n + .75;\\n\\t } else {\\n\\t if (n < (2.5 / p)) {\\n\\t n -= (2.25 / p);\\n\\t l = s * n * n + .9375;\\n\\t } else {\\n\\t n -= (2.625 / p);\\n\\t l = s * n * n + .984375;\\n\\t }\\n\\t }\\n\\t }\\n\\t return l;\\n\\t }\\n\\t };\\n\\t ef.easeIn = ef[\\\"ease-in\\\"] = ef[\\\"<\\\"];\\n\\t ef.easeOut = ef[\\\"ease-out\\\"] = ef[\\\">\\\"];\\n\\t ef.easeInOut = ef[\\\"ease-in-out\\\"] = ef[\\\"<>\\\"];\\n\\t ef[\\\"back-in\\\"] = ef.backIn;\\n\\t ef[\\\"back-out\\\"] = ef.backOut;\\n\\n\\t var animationElements = [],\\n\\t requestAnimFrame = window.requestAnimationFrame ||\\n\\t window.webkitRequestAnimationFrame ||\\n\\t window.mozRequestAnimationFrame ||\\n\\t window.oRequestAnimationFrame ||\\n\\t window.msRequestAnimationFrame ||\\n\\t function (callback) {\\n\\t setTimeout(callback, 16);\\n\\t },\\n\\t animation = function () {\\n\\t var Now = +new Date,\\n\\t l = 0;\\n\\t for (; l < animationElements.length; l++) {\\n\\t var e = animationElements[l];\\n\\t if (e.el.removed || e.paused) {\\n\\t continue;\\n\\t }\\n\\t var time = Now - e.start,\\n\\t ms = e.ms,\\n\\t easing = e.easing,\\n\\t from = e.from,\\n\\t diff = e.diff,\\n\\t to = e.to,\\n\\t t = e.t,\\n\\t that = e.el,\\n\\t set = {},\\n\\t now,\\n\\t init = {},\\n\\t key;\\n\\t if (e.initstatus) {\\n\\t time = (e.initstatus * e.anim.top - e.prev) / (e.percent - e.prev) * ms;\\n\\t e.status = e.initstatus;\\n\\t delete e.initstatus;\\n\\t e.stop && animationElements.splice(l--, 1);\\n\\t } else {\\n\\t e.status = (e.prev + (e.percent - e.prev) * (time / ms)) / e.anim.top;\\n\\t }\\n\\t if (time < 0) {\\n\\t continue;\\n\\t }\\n\\t if (time < ms) {\\n\\t var pos = easing(time / ms);\\n\\t for (var attr in from) if (from[has](attr)) {\\n\\t switch (availableAnimAttrs[attr]) {\\n\\t case nu:\\n\\t now = +from[attr] + pos * ms * diff[attr];\\n\\t break;\\n\\t case \\\"colour\\\":\\n\\t now = \\\"rgb(\\\" + [\\n\\t upto255(round(from[attr].r + pos * ms * diff[attr].r)),\\n\\t upto255(round(from[attr].g + pos * ms * diff[attr].g)),\\n\\t upto255(round(from[attr].b + pos * ms * diff[attr].b))\\n\\t ].join(\\\",\\\") + \\\")\\\";\\n\\t break;\\n\\t case \\\"path\\\":\\n\\t now = [];\\n\\t for (var i = 0, ii = from[attr].length; i < ii; i++) {\\n\\t now[i] = [from[attr][i][0]];\\n\\t for (var j = 1, jj = from[attr][i].length; j < jj; j++) {\\n\\t now[i][j] = +from[attr][i][j] + pos * ms * diff[attr][i][j];\\n\\t }\\n\\t now[i] = now[i].join(S);\\n\\t }\\n\\t now = now.join(S);\\n\\t break;\\n\\t case \\\"transform\\\":\\n\\t if (diff[attr].real) {\\n\\t now = [];\\n\\t for (i = 0, ii = from[attr].length; i < ii; i++) {\\n\\t now[i] = [from[attr][i][0]];\\n\\t for (j = 1, jj = from[attr][i].length; j < jj; j++) {\\n\\t now[i][j] = from[attr][i][j] + pos * ms * diff[attr][i][j];\\n\\t }\\n\\t }\\n\\t } else {\\n\\t var get = function (i) {\\n\\t return +from[attr][i] + pos * ms * diff[attr][i];\\n\\t };\\n\\t // now = [[\\\"r\\\", get(2), 0, 0], [\\\"t\\\", get(3), get(4)], [\\\"s\\\", get(0), get(1), 0, 0]];\\n\\t now = [[\\\"m\\\", get(0), get(1), get(2), get(3), get(4), get(5)]];\\n\\t }\\n\\t break;\\n\\t case \\\"csv\\\":\\n\\t if (attr == \\\"clip-rect\\\") {\\n\\t now = [];\\n\\t i = 4;\\n\\t while (i--) {\\n\\t now[i] = +from[attr][i] + pos * ms * diff[attr][i];\\n\\t }\\n\\t }\\n\\t break;\\n\\t default:\\n\\t var from2 = [][concat](from[attr]);\\n\\t now = [];\\n\\t i = that.paper.customAttributes[attr].length;\\n\\t while (i--) {\\n\\t now[i] = +from2[i] + pos * ms * diff[attr][i];\\n\\t }\\n\\t break;\\n\\t }\\n\\t set[attr] = now;\\n\\t }\\n\\t that.attr(set);\\n\\t (function (id, that, anim) {\\n\\t setTimeout(function () {\\n\\t eve(\\\"raphael.anim.frame.\\\" + id, that, anim);\\n\\t });\\n\\t })(that.id, that, e.anim);\\n\\t } else {\\n\\t (function(f, el, a) {\\n\\t setTimeout(function() {\\n\\t eve(\\\"raphael.anim.frame.\\\" + el.id, el, a);\\n\\t eve(\\\"raphael.anim.finish.\\\" + el.id, el, a);\\n\\t R.is(f, \\\"function\\\") && f.call(el);\\n\\t });\\n\\t })(e.callback, that, e.anim);\\n\\t that.attr(to);\\n\\t animationElements.splice(l--, 1);\\n\\t if (e.repeat > 1 && !e.next) {\\n\\t for (key in to) if (to[has](key)) {\\n\\t init[key] = e.totalOrigin[key];\\n\\t }\\n\\t e.el.attr(init);\\n\\t runAnimation(e.anim, e.el, e.anim.percents[0], null, e.totalOrigin, e.repeat - 1);\\n\\t }\\n\\t if (e.next && !e.stop) {\\n\\t runAnimation(e.anim, e.el, e.next, null, e.totalOrigin, e.repeat);\\n\\t }\\n\\t }\\n\\t }\\n\\t animationElements.length && requestAnimFrame(animation);\\n\\t },\\n\\t upto255 = function (color) {\\n\\t return color > 255 ? 255 : color < 0 ? 0 : color;\\n\\t };\\n\\t /*\\\\\\n\\t * Element.animateWith\\n\\t [ method ]\\n\\t **\\n\\t * Acts similar to @Element.animate, but ensure that given animation runs in sync with another given element.\\n\\t **\\n\\t > Parameters\\n\\t **\\n\\t - el (object) element to sync with\\n\\t - anim (object) animation to sync with\\n\\t - params (object) #optional final attributes for the element, see also @Element.attr\\n\\t - ms (number) #optional number of milliseconds for animation to run\\n\\t - easing (string) #optional easing type. Accept on of @Raphael.easing_formulas or CSS format: `cubic‐bezier(XX, XX, XX, XX)`\\n\\t - callback (function) #optional callback function. Will be called at the end of animation.\\n\\t * or\\n\\t - element (object) element to sync with\\n\\t - anim (object) animation to sync with\\n\\t - animation (object) #optional animation object, see @Raphael.animation\\n\\t **\\n\\t = (object) original element\\n\\t \\\\*/\\n\\t elproto.animateWith = function (el, anim, params, ms, easing, callback) {\\n\\t var element = this;\\n\\t if (element.removed) {\\n\\t callback && callback.call(element);\\n\\t return element;\\n\\t }\\n\\t var a = params instanceof Animation ? params : R.animation(params, ms, easing, callback),\\n\\t x, y;\\n\\t runAnimation(a, element, a.percents[0], null, element.attr());\\n\\t for (var i = 0, ii = animationElements.length; i < ii; i++) {\\n\\t if (animationElements[i].anim == anim && animationElements[i].el == el) {\\n\\t animationElements[ii - 1].start = animationElements[i].start;\\n\\t break;\\n\\t }\\n\\t }\\n\\t return element;\\n\\t //\\n\\t //\\n\\t // var a = params ? R.animation(params, ms, easing, callback) : anim,\\n\\t // status = element.status(anim);\\n\\t // return this.animate(a).status(a, status * anim.ms / a.ms);\\n\\t };\\n\\t function CubicBezierAtTime(t, p1x, p1y, p2x, p2y, duration) {\\n\\t var cx = 3 * p1x,\\n\\t bx = 3 * (p2x - p1x) - cx,\\n\\t ax = 1 - cx - bx,\\n\\t cy = 3 * p1y,\\n\\t by = 3 * (p2y - p1y) - cy,\\n\\t ay = 1 - cy - by;\\n\\t function sampleCurveX(t) {\\n\\t return ((ax * t + bx) * t + cx) * t;\\n\\t }\\n\\t function solve(x, epsilon) {\\n\\t var t = solveCurveX(x, epsilon);\\n\\t return ((ay * t + by) * t + cy) * t;\\n\\t }\\n\\t function solveCurveX(x, epsilon) {\\n\\t var t0, t1, t2, x2, d2, i;\\n\\t for(t2 = x, i = 0; i < 8; i++) {\\n\\t x2 = sampleCurveX(t2) - x;\\n\\t if (abs(x2) < epsilon) {\\n\\t return t2;\\n\\t }\\n\\t d2 = (3 * ax * t2 + 2 * bx) * t2 + cx;\\n\\t if (abs(d2) < 1e-6) {\\n\\t break;\\n\\t }\\n\\t t2 = t2 - x2 / d2;\\n\\t }\\n\\t t0 = 0;\\n\\t t1 = 1;\\n\\t t2 = x;\\n\\t if (t2 < t0) {\\n\\t return t0;\\n\\t }\\n\\t if (t2 > t1) {\\n\\t return t1;\\n\\t }\\n\\t while (t0 < t1) {\\n\\t x2 = sampleCurveX(t2);\\n\\t if (abs(x2 - x) < epsilon) {\\n\\t return t2;\\n\\t }\\n\\t if (x > x2) {\\n\\t t0 = t2;\\n\\t } else {\\n\\t t1 = t2;\\n\\t }\\n\\t t2 = (t1 - t0) / 2 + t0;\\n\\t }\\n\\t return t2;\\n\\t }\\n\\t return solve(t, 1 / (200 * duration));\\n\\t }\\n\\t elproto.onAnimation = function (f) {\\n\\t f ? eve.on(\\\"raphael.anim.frame.\\\" + this.id, f) : eve.unbind(\\\"raphael.anim.frame.\\\" + this.id);\\n\\t return this;\\n\\t };\\n\\t function Animation(anim, ms) {\\n\\t var percents = [],\\n\\t newAnim = {};\\n\\t this.ms = ms;\\n\\t this.times = 1;\\n\\t if (anim) {\\n\\t for (var attr in anim) if (anim[has](attr)) {\\n\\t newAnim[toFloat(attr)] = anim[attr];\\n\\t percents.push(toFloat(attr));\\n\\t }\\n\\t percents.sort(sortByNumber);\\n\\t }\\n\\t this.anim = newAnim;\\n\\t this.top = percents[percents.length - 1];\\n\\t this.percents = percents;\\n\\t }\\n\\t /*\\\\\\n\\t * Animation.delay\\n\\t [ method ]\\n\\t **\\n\\t * Creates a copy of existing animation object with given delay.\\n\\t **\\n\\t > Parameters\\n\\t **\\n\\t - delay (number) number of ms to pass between animation start and actual animation\\n\\t **\\n\\t = (object) new altered Animation object\\n\\t | var anim = Raphael.animation({cx: 10, cy: 20}, 2e3);\\n\\t | circle1.animate(anim); // run the given animation immediately\\n\\t | circle2.animate(anim.delay(500)); // run the given animation after 500 ms\\n\\t \\\\*/\\n\\t Animation.prototype.delay = function (delay) {\\n\\t var a = new Animation(this.anim, this.ms);\\n\\t a.times = this.times;\\n\\t a.del = +delay || 0;\\n\\t return a;\\n\\t };\\n\\t /*\\\\\\n\\t * Animation.repeat\\n\\t [ method ]\\n\\t **\\n\\t * Creates a copy of existing animation object with given repetition.\\n\\t **\\n\\t > Parameters\\n\\t **\\n\\t - repeat (number) number iterations of animation. For infinite animation pass `Infinity`\\n\\t **\\n\\t = (object) new altered Animation object\\n\\t \\\\*/\\n\\t Animation.prototype.repeat = function (times) {\\n\\t var a = new Animation(this.anim, this.ms);\\n\\t a.del = this.del;\\n\\t a.times = math.floor(mmax(times, 0)) || 1;\\n\\t return a;\\n\\t };\\n\\t function runAnimation(anim, element, percent, status, totalOrigin, times) {\\n\\t percent = toFloat(percent);\\n\\t var params,\\n\\t isInAnim,\\n\\t isInAnimSet,\\n\\t percents = [],\\n\\t next,\\n\\t prev,\\n\\t timestamp,\\n\\t ms = anim.ms,\\n\\t from = {},\\n\\t to = {},\\n\\t diff = {};\\n\\t if (status) {\\n\\t for (i = 0, ii = animationElements.length; i < ii; i++) {\\n\\t var e = animationElements[i];\\n\\t if (e.el.id == element.id && e.anim == anim) {\\n\\t if (e.percent != percent) {\\n\\t animationElements.splice(i, 1);\\n\\t isInAnimSet = 1;\\n\\t } else {\\n\\t isInAnim = e;\\n\\t }\\n\\t element.attr(e.totalOrigin);\\n\\t break;\\n\\t }\\n\\t }\\n\\t } else {\\n\\t status = +to; // NaN\\n\\t }\\n\\t for (var i = 0, ii = anim.percents.length; i < ii; i++) {\\n\\t if (anim.percents[i] == percent || anim.percents[i] > status * anim.top) {\\n\\t percent = anim.percents[i];\\n\\t prev = anim.percents[i - 1] || 0;\\n\\t ms = ms / anim.top * (percent - prev);\\n\\t next = anim.percents[i + 1];\\n\\t params = anim.anim[percent];\\n\\t break;\\n\\t } else if (status) {\\n\\t element.attr(anim.anim[anim.percents[i]]);\\n\\t }\\n\\t }\\n\\t if (!params) {\\n\\t return;\\n\\t }\\n\\t if (!isInAnim) {\\n\\t for (var attr in params) if (params[has](attr)) {\\n\\t if (availableAnimAttrs[has](attr) || element.paper.customAttributes[has](attr)) {\\n\\t from[attr] = element.attr(attr);\\n\\t (from[attr] == null) && (from[attr] = availableAttrs[attr]);\\n\\t to[attr] = params[attr];\\n\\t switch (availableAnimAttrs[attr]) {\\n\\t case nu:\\n\\t diff[attr] = (to[attr] - from[attr]) / ms;\\n\\t break;\\n\\t case \\\"colour\\\":\\n\\t from[attr] = R.getRGB(from[attr]);\\n\\t var toColour = R.getRGB(to[attr]);\\n\\t diff[attr] = {\\n\\t r: (toColour.r - from[attr].r) / ms,\\n\\t g: (toColour.g - from[attr].g) / ms,\\n\\t b: (toColour.b - from[attr].b) / ms\\n\\t };\\n\\t break;\\n\\t case \\\"path\\\":\\n\\t var pathes = path2curve(from[attr], to[attr]),\\n\\t toPath = pathes[1];\\n\\t from[attr] = pathes[0];\\n\\t diff[attr] = [];\\n\\t for (i = 0, ii = from[attr].length; i < ii; i++) {\\n\\t diff[attr][i] = [0];\\n\\t for (var j = 1, jj = from[attr][i].length; j < jj; j++) {\\n\\t diff[attr][i][j] = (toPath[i][j] - from[attr][i][j]) / ms;\\n\\t }\\n\\t }\\n\\t break;\\n\\t case \\\"transform\\\":\\n\\t var _ = element._,\\n\\t eq = equaliseTransform(_[attr], to[attr]);\\n\\t if (eq) {\\n\\t from[attr] = eq.from;\\n\\t to[attr] = eq.to;\\n\\t diff[attr] = [];\\n\\t diff[attr].real = true;\\n\\t for (i = 0, ii = from[attr].length; i < ii; i++) {\\n\\t diff[attr][i] = [from[attr][i][0]];\\n\\t for (j = 1, jj = from[attr][i].length; j < jj; j++) {\\n\\t diff[attr][i][j] = (to[attr][i][j] - from[attr][i][j]) / ms;\\n\\t }\\n\\t }\\n\\t } else {\\n\\t var m = (element.matrix || new Matrix),\\n\\t to2 = {\\n\\t _: {transform: _.transform},\\n\\t getBBox: function () {\\n\\t return element.getBBox(1);\\n\\t }\\n\\t };\\n\\t from[attr] = [\\n\\t m.a,\\n\\t m.b,\\n\\t m.c,\\n\\t m.d,\\n\\t m.e,\\n\\t m.f\\n\\t ];\\n\\t extractTransform(to2, to[attr]);\\n\\t to[attr] = to2._.transform;\\n\\t diff[attr] = [\\n\\t (to2.matrix.a - m.a) / ms,\\n\\t (to2.matrix.b - m.b) / ms,\\n\\t (to2.matrix.c - m.c) / ms,\\n\\t (to2.matrix.d - m.d) / ms,\\n\\t (to2.matrix.e - m.e) / ms,\\n\\t (to2.matrix.f - m.f) / ms\\n\\t ];\\n\\t // from[attr] = [_.sx, _.sy, _.deg, _.dx, _.dy];\\n\\t // var to2 = {_:{}, getBBox: function () { return element.getBBox(); }};\\n\\t // extractTransform(to2, to[attr]);\\n\\t // diff[attr] = [\\n\\t // (to2._.sx - _.sx) / ms,\\n\\t // (to2._.sy - _.sy) / ms,\\n\\t // (to2._.deg - _.deg) / ms,\\n\\t // (to2._.dx - _.dx) / ms,\\n\\t // (to2._.dy - _.dy) / ms\\n\\t // ];\\n\\t }\\n\\t break;\\n\\t case \\\"csv\\\":\\n\\t var values = Str(params[attr])[split](separator),\\n\\t from2 = Str(from[attr])[split](separator);\\n\\t if (attr == \\\"clip-rect\\\") {\\n\\t from[attr] = from2;\\n\\t diff[attr] = [];\\n\\t i = from2.length;\\n\\t while (i--) {\\n\\t diff[attr][i] = (values[i] - from[attr][i]) / ms;\\n\\t }\\n\\t }\\n\\t to[attr] = values;\\n\\t break;\\n\\t default:\\n\\t values = [][concat](params[attr]);\\n\\t from2 = [][concat](from[attr]);\\n\\t diff[attr] = [];\\n\\t i = element.paper.customAttributes[attr].length;\\n\\t while (i--) {\\n\\t diff[attr][i] = ((values[i] || 0) - (from2[i] || 0)) / ms;\\n\\t }\\n\\t break;\\n\\t }\\n\\t }\\n\\t }\\n\\t var easing = params.easing,\\n\\t easyeasy = R.easing_formulas[easing];\\n\\t if (!easyeasy) {\\n\\t easyeasy = Str(easing).match(bezierrg);\\n\\t if (easyeasy && easyeasy.length == 5) {\\n\\t var curve = easyeasy;\\n\\t easyeasy = function (t) {\\n\\t return CubicBezierAtTime(t, +curve[1], +curve[2], +curve[3], +curve[4], ms);\\n\\t };\\n\\t } else {\\n\\t easyeasy = pipe;\\n\\t }\\n\\t }\\n\\t timestamp = params.start || anim.start || +new Date;\\n\\t e = {\\n\\t anim: anim,\\n\\t percent: percent,\\n\\t timestamp: timestamp,\\n\\t start: timestamp + (anim.del || 0),\\n\\t status: 0,\\n\\t initstatus: status || 0,\\n\\t stop: false,\\n\\t ms: ms,\\n\\t easing: easyeasy,\\n\\t from: from,\\n\\t diff: diff,\\n\\t to: to,\\n\\t el: element,\\n\\t callback: params.callback,\\n\\t prev: prev,\\n\\t next: next,\\n\\t repeat: times || anim.times,\\n\\t origin: element.attr(),\\n\\t totalOrigin: totalOrigin\\n\\t };\\n\\t animationElements.push(e);\\n\\t if (status && !isInAnim && !isInAnimSet) {\\n\\t e.stop = true;\\n\\t e.start = new Date - ms * status;\\n\\t if (animationElements.length == 1) {\\n\\t return animation();\\n\\t }\\n\\t }\\n\\t if (isInAnimSet) {\\n\\t e.start = new Date - e.ms * status;\\n\\t }\\n\\t animationElements.length == 1 && requestAnimFrame(animation);\\n\\t } else {\\n\\t isInAnim.initstatus = status;\\n\\t isInAnim.start = new Date - isInAnim.ms * status;\\n\\t }\\n\\t eve(\\\"raphael.anim.start.\\\" + element.id, element, anim);\\n\\t }\\n\\t /*\\\\\\n\\t * Raphael.animation\\n\\t [ method ]\\n\\t **\\n\\t * Creates an animation object that can be passed to the @Element.animate or @Element.animateWith methods.\\n\\t * See also @Animation.delay and @Animation.repeat methods.\\n\\t **\\n\\t > Parameters\\n\\t **\\n\\t - params (object) final attributes for the element, see also @Element.attr\\n\\t - ms (number) number of milliseconds for animation to run\\n\\t - easing (string) #optional easing type. Accept one of @Raphael.easing_formulas or CSS format: `cubic‐bezier(XX, XX, XX, XX)`\\n\\t - callback (function) #optional callback function. Will be called at the end of animation.\\n\\t **\\n\\t = (object) @Animation\\n\\t \\\\*/\\n\\t R.animation = function (params, ms, easing, callback) {\\n\\t if (params instanceof Animation) {\\n\\t return params;\\n\\t }\\n\\t if (R.is(easing, \\\"function\\\") || !easing) {\\n\\t callback = callback || easing || null;\\n\\t easing = null;\\n\\t }\\n\\t params = Object(params);\\n\\t ms = +ms || 0;\\n\\t var p = {},\\n\\t json,\\n\\t attr;\\n\\t for (attr in params) if (params[has](attr) && toFloat(attr) != attr && toFloat(attr) + \\\"%\\\" != attr) {\\n\\t json = true;\\n\\t p[attr] = params[attr];\\n\\t }\\n\\t if (!json) {\\n\\t // if percent-like syntax is used and end-of-all animation callback used\\n\\t if(callback){\\n\\t // find the last one\\n\\t var lastKey = 0;\\n\\t for(var i in params){\\n\\t var percent = toInt(i);\\n\\t if(params[has](i) && percent > lastKey){\\n\\t lastKey = percent;\\n\\t }\\n\\t }\\n\\t lastKey += '%';\\n\\t // if already defined callback in the last keyframe, skip\\n\\t !params[lastKey].callback && (params[lastKey].callback = callback);\\n\\t }\\n\\t return new Animation(params, ms);\\n\\t } else {\\n\\t easing && (p.easing = easing);\\n\\t callback && (p.callback = callback);\\n\\t return new Animation({100: p}, ms);\\n\\t }\\n\\t };\\n\\t /*\\\\\\n\\t * Element.animate\\n\\t [ method ]\\n\\t **\\n\\t * Creates and starts animation for given element.\\n\\t **\\n\\t > Parameters\\n\\t **\\n\\t - params (object) final attributes for the element, see also @Element.attr\\n\\t - ms (number) number of milliseconds for animation to run\\n\\t - easing (string) #optional easing type. Accept one of @Raphael.easing_formulas or CSS format: `cubic‐bezier(XX, XX, XX, XX)`\\n\\t - callback (function) #optional callback function. Will be called at the end of animation.\\n\\t * or\\n\\t - animation (object) animation object, see @Raphael.animation\\n\\t **\\n\\t = (object) original element\\n\\t \\\\*/\\n\\t elproto.animate = function (params, ms, easing, callback) {\\n\\t var element = this;\\n\\t if (element.removed) {\\n\\t callback && callback.call(element);\\n\\t return element;\\n\\t }\\n\\t var anim = params instanceof Animation ? params : R.animation(params, ms, easing, callback);\\n\\t runAnimation(anim, element, anim.percents[0], null, element.attr());\\n\\t return element;\\n\\t };\\n\\t /*\\\\\\n\\t * Element.setTime\\n\\t [ method ]\\n\\t **\\n\\t * Sets the status of animation of the element in milliseconds. Similar to @Element.status method.\\n\\t **\\n\\t > Parameters\\n\\t **\\n\\t - anim (object) animation object\\n\\t - value (number) number of milliseconds from the beginning of the animation\\n\\t **\\n\\t = (object) original element if `value` is specified\\n\\t * Note, that during animation following events are triggered:\\n\\t *\\n\\t * On each animation frame event `anim.frame.`, on start `anim.start.` and on end `anim.finish.`.\\n\\t \\\\*/\\n\\t elproto.setTime = function (anim, value) {\\n\\t if (anim && value != null) {\\n\\t this.status(anim, mmin(value, anim.ms) / anim.ms);\\n\\t }\\n\\t return this;\\n\\t };\\n\\t /*\\\\\\n\\t * Element.status\\n\\t [ method ]\\n\\t **\\n\\t * Gets or sets the status of animation of the element.\\n\\t **\\n\\t > Parameters\\n\\t **\\n\\t - anim (object) #optional animation object\\n\\t - value (number) #optional 0 – 1. If specified, method works like a setter and sets the status of a given animation to the value. This will cause animation to jump to the given position.\\n\\t **\\n\\t = (number) status\\n\\t * or\\n\\t = (array) status if `anim` is not specified. Array of objects in format:\\n\\t o {\\n\\t o anim: (object) animation object\\n\\t o status: (number) status\\n\\t o }\\n\\t * or\\n\\t = (object) original element if `value` is specified\\n\\t \\\\*/\\n\\t elproto.status = function (anim, value) {\\n\\t var out = [],\\n\\t i = 0,\\n\\t len,\\n\\t e;\\n\\t if (value != null) {\\n\\t runAnimation(anim, this, -1, mmin(value, 1));\\n\\t return this;\\n\\t } else {\\n\\t len = animationElements.length;\\n\\t for (; i < len; i++) {\\n\\t e = animationElements[i];\\n\\t if (e.el.id == this.id && (!anim || e.anim == anim)) {\\n\\t if (anim) {\\n\\t return e.status;\\n\\t }\\n\\t out.push({\\n\\t anim: e.anim,\\n\\t status: e.status\\n\\t });\\n\\t }\\n\\t }\\n\\t if (anim) {\\n\\t return 0;\\n\\t }\\n\\t return out;\\n\\t }\\n\\t };\\n\\t /*\\\\\\n\\t * Element.pause\\n\\t [ method ]\\n\\t **\\n\\t * Stops animation of the element with ability to resume it later on.\\n\\t **\\n\\t > Parameters\\n\\t **\\n\\t - anim (object) #optional animation object\\n\\t **\\n\\t = (object) original element\\n\\t \\\\*/\\n\\t elproto.pause = function (anim) {\\n\\t for (var i = 0; i < animationElements.length; i++) if (animationElements[i].el.id == this.id && (!anim || animationElements[i].anim == anim)) {\\n\\t if (eve(\\\"raphael.anim.pause.\\\" + this.id, this, animationElements[i].anim) !== false) {\\n\\t animationElements[i].paused = true;\\n\\t }\\n\\t }\\n\\t return this;\\n\\t };\\n\\t /*\\\\\\n\\t * Element.resume\\n\\t [ method ]\\n\\t **\\n\\t * Resumes animation if it was paused with @Element.pause method.\\n\\t **\\n\\t > Parameters\\n\\t **\\n\\t - anim (object) #optional animation object\\n\\t **\\n\\t = (object) original element\\n\\t \\\\*/\\n\\t elproto.resume = function (anim) {\\n\\t for (var i = 0; i < animationElements.length; i++) if (animationElements[i].el.id == this.id && (!anim || animationElements[i].anim == anim)) {\\n\\t var e = animationElements[i];\\n\\t if (eve(\\\"raphael.anim.resume.\\\" + this.id, this, e.anim) !== false) {\\n\\t delete e.paused;\\n\\t this.status(e.anim, e.status);\\n\\t }\\n\\t }\\n\\t return this;\\n\\t };\\n\\t /*\\\\\\n\\t * Element.stop\\n\\t [ method ]\\n\\t **\\n\\t * Stops animation of the element.\\n\\t **\\n\\t > Parameters\\n\\t **\\n\\t - anim (object) #optional animation object\\n\\t **\\n\\t = (object) original element\\n\\t \\\\*/\\n\\t elproto.stop = function (anim) {\\n\\t for (var i = 0; i < animationElements.length; i++) if (animationElements[i].el.id == this.id && (!anim || animationElements[i].anim == anim)) {\\n\\t if (eve(\\\"raphael.anim.stop.\\\" + this.id, this, animationElements[i].anim) !== false) {\\n\\t animationElements.splice(i--, 1);\\n\\t }\\n\\t }\\n\\t return this;\\n\\t };\\n\\t function stopAnimation(paper) {\\n\\t for (var i = 0; i < animationElements.length; i++) if (animationElements[i].el.paper == paper) {\\n\\t animationElements.splice(i--, 1);\\n\\t }\\n\\t }\\n\\t eve.on(\\\"raphael.remove\\\", stopAnimation);\\n\\t eve.on(\\\"raphael.clear\\\", stopAnimation);\\n\\t elproto.toString = function () {\\n\\t return \\\"Rapha\\\\xebl\\\\u2019s object\\\";\\n\\t };\\n\\n\\t // Set\\n\\t var Set = function (items) {\\n\\t this.items = [];\\n\\t this.length = 0;\\n\\t this.type = \\\"set\\\";\\n\\t if (items) {\\n\\t for (var i = 0, ii = items.length; i < ii; i++) {\\n\\t if (items[i] && (items[i].constructor == elproto.constructor || items[i].constructor == Set)) {\\n\\t this[this.items.length] = this.items[this.items.length] = items[i];\\n\\t this.length++;\\n\\t }\\n\\t }\\n\\t }\\n\\t },\\n\\t setproto = Set.prototype;\\n\\t /*\\\\\\n\\t * Set.push\\n\\t [ method ]\\n\\t **\\n\\t * Adds each argument to the current set.\\n\\t = (object) original element\\n\\t \\\\*/\\n\\t setproto.push = function () {\\n\\t var item,\\n\\t len;\\n\\t for (var i = 0, ii = arguments.length; i < ii; i++) {\\n\\t item = arguments[i];\\n\\t if (item && (item.constructor == elproto.constructor || item.constructor == Set)) {\\n\\t len = this.items.length;\\n\\t this[len] = this.items[len] = item;\\n\\t this.length++;\\n\\t }\\n\\t }\\n\\t return this;\\n\\t };\\n\\t /*\\\\\\n\\t * Set.pop\\n\\t [ method ]\\n\\t **\\n\\t * Removes last element and returns it.\\n\\t = (object) element\\n\\t \\\\*/\\n\\t setproto.pop = function () {\\n\\t this.length && delete this[this.length--];\\n\\t return this.items.pop();\\n\\t };\\n\\t /*\\\\\\n\\t * Set.forEach\\n\\t [ method ]\\n\\t **\\n\\t * Executes given function for each element in the set.\\n\\t *\\n\\t * If function returns `false` it will stop loop running.\\n\\t **\\n\\t > Parameters\\n\\t **\\n\\t - callback (function) function to run\\n\\t - thisArg (object) context object for the callback\\n\\t = (object) Set object\\n\\t \\\\*/\\n\\t setproto.forEach = function (callback, thisArg) {\\n\\t for (var i = 0, ii = this.items.length; i < ii; i++) {\\n\\t if (callback.call(thisArg, this.items[i], i) === false) {\\n\\t return this;\\n\\t }\\n\\t }\\n\\t return this;\\n\\t };\\n\\t for (var method in elproto) if (elproto[has](method)) {\\n\\t setproto[method] = (function (methodname) {\\n\\t return function () {\\n\\t var arg = arguments;\\n\\t return this.forEach(function (el) {\\n\\t el[methodname][apply](el, arg);\\n\\t });\\n\\t };\\n\\t })(method);\\n\\t }\\n\\t setproto.attr = function (name, value) {\\n\\t if (name && R.is(name, array) && R.is(name[0], \\\"object\\\")) {\\n\\t for (var j = 0, jj = name.length; j < jj; j++) {\\n\\t this.items[j].attr(name[j]);\\n\\t }\\n\\t } else {\\n\\t for (var i = 0, ii = this.items.length; i < ii; i++) {\\n\\t this.items[i].attr(name, value);\\n\\t }\\n\\t }\\n\\t return this;\\n\\t };\\n\\t /*\\\\\\n\\t * Set.clear\\n\\t [ method ]\\n\\t **\\n\\t * Removes all elements from the set\\n\\t \\\\*/\\n\\t setproto.clear = function () {\\n\\t while (this.length) {\\n\\t this.pop();\\n\\t }\\n\\t };\\n\\t /*\\\\\\n\\t * Set.splice\\n\\t [ method ]\\n\\t **\\n\\t * Removes given element from the set\\n\\t **\\n\\t > Parameters\\n\\t **\\n\\t - index (number) position of the deletion\\n\\t - count (number) number of element to remove\\n\\t - insertion… (object) #optional elements to insert\\n\\t = (object) set elements that were deleted\\n\\t \\\\*/\\n\\t setproto.splice = function (index, count, insertion) {\\n\\t index = index < 0 ? mmax(this.length + index, 0) : index;\\n\\t count = mmax(0, mmin(this.length - index, count));\\n\\t var tail = [],\\n\\t todel = [],\\n\\t args = [],\\n\\t i;\\n\\t for (i = 2; i < arguments.length; i++) {\\n\\t args.push(arguments[i]);\\n\\t }\\n\\t for (i = 0; i < count; i++) {\\n\\t todel.push(this[index + i]);\\n\\t }\\n\\t for (; i < this.length - index; i++) {\\n\\t tail.push(this[index + i]);\\n\\t }\\n\\t var arglen = args.length;\\n\\t for (i = 0; i < arglen + tail.length; i++) {\\n\\t this.items[index + i] = this[index + i] = i < arglen ? args[i] : tail[i - arglen];\\n\\t }\\n\\t i = this.items.length = this.length -= count - arglen;\\n\\t while (this[i]) {\\n\\t delete this[i++];\\n\\t }\\n\\t return new Set(todel);\\n\\t };\\n\\t /*\\\\\\n\\t * Set.exclude\\n\\t [ method ]\\n\\t **\\n\\t * Removes given element from the set\\n\\t **\\n\\t > Parameters\\n\\t **\\n\\t - element (object) element to remove\\n\\t = (boolean) `true` if object was found & removed from the set\\n\\t \\\\*/\\n\\t setproto.exclude = function (el) {\\n\\t for (var i = 0, ii = this.length; i < ii; i++) if (this[i] == el) {\\n\\t this.splice(i, 1);\\n\\t return true;\\n\\t }\\n\\t };\\n\\t setproto.animate = function (params, ms, easing, callback) {\\n\\t (R.is(easing, \\\"function\\\") || !easing) && (callback = easing || null);\\n\\t var len = this.items.length,\\n\\t i = len,\\n\\t item,\\n\\t set = this,\\n\\t collector;\\n\\t if (!len) {\\n\\t return this;\\n\\t }\\n\\t callback && (collector = function () {\\n\\t !--len && callback.call(set);\\n\\t });\\n\\t easing = R.is(easing, string) ? easing : collector;\\n\\t var anim = R.animation(params, ms, easing, collector);\\n\\t item = this.items[--i].animate(anim);\\n\\t while (i--) {\\n\\t this.items[i] && !this.items[i].removed && this.items[i].animateWith(item, anim, anim);\\n\\t (this.items[i] && !this.items[i].removed) || len--;\\n\\t }\\n\\t return this;\\n\\t };\\n\\t setproto.insertAfter = function (el) {\\n\\t var i = this.items.length;\\n\\t while (i--) {\\n\\t this.items[i].insertAfter(el);\\n\\t }\\n\\t return this;\\n\\t };\\n\\t setproto.getBBox = function () {\\n\\t var x = [],\\n\\t y = [],\\n\\t x2 = [],\\n\\t y2 = [];\\n\\t for (var i = this.items.length; i--;) if (!this.items[i].removed) {\\n\\t var box = this.items[i].getBBox();\\n\\t x.push(box.x);\\n\\t y.push(box.y);\\n\\t x2.push(box.x + box.width);\\n\\t y2.push(box.y + box.height);\\n\\t }\\n\\t x = mmin[apply](0, x);\\n\\t y = mmin[apply](0, y);\\n\\t x2 = mmax[apply](0, x2);\\n\\t y2 = mmax[apply](0, y2);\\n\\t return {\\n\\t x: x,\\n\\t y: y,\\n\\t x2: x2,\\n\\t y2: y2,\\n\\t width: x2 - x,\\n\\t height: y2 - y\\n\\t };\\n\\t };\\n\\t setproto.clone = function (s) {\\n\\t s = this.paper.set();\\n\\t for (var i = 0, ii = this.items.length; i < ii; i++) {\\n\\t s.push(this.items[i].clone());\\n\\t }\\n\\t return s;\\n\\t };\\n\\t setproto.toString = function () {\\n\\t return \\\"Rapha\\\\xebl\\\\u2018s set\\\";\\n\\t };\\n\\n\\t setproto.glow = function(glowConfig) {\\n\\t var ret = this.paper.set();\\n\\t this.forEach(function(shape, index){\\n\\t var g = shape.glow(glowConfig);\\n\\t if(g != null){\\n\\t g.forEach(function(shape2, index2){\\n\\t ret.push(shape2);\\n\\t });\\n\\t }\\n\\t });\\n\\t return ret;\\n\\t };\\n\\n\\n\\t /*\\\\\\n\\t * Set.isPointInside\\n\\t [ method ]\\n\\t **\\n\\t * Determine if given point is inside this set’s elements\\n\\t **\\n\\t > Parameters\\n\\t **\\n\\t - x (number) x coordinate of the point\\n\\t - y (number) y coordinate of the point\\n\\t = (boolean) `true` if point is inside any of the set's elements\\n\\t \\\\*/\\n\\t setproto.isPointInside = function (x, y) {\\n\\t var isPointInside = false;\\n\\t this.forEach(function (el) {\\n\\t if (el.isPointInside(x, y)) {\\n\\t isPointInside = true;\\n\\t return false; // stop loop\\n\\t }\\n\\t });\\n\\t return isPointInside;\\n\\t };\\n\\n\\t /*\\\\\\n\\t * Raphael.registerFont\\n\\t [ method ]\\n\\t **\\n\\t * Adds given font to the registered set of fonts for Raphaël. Should be used as an internal call from within Cufón’s font file.\\n\\t * Returns original parameter, so it could be used with chaining.\\n\\t # More about Cufón and how to convert your font form TTF, OTF, etc to JavaScript file.\\n\\t **\\n\\t > Parameters\\n\\t **\\n\\t - font (object) the font to register\\n\\t = (object) the font you passed in\\n\\t > Usage\\n\\t | Cufon.registerFont(Raphael.registerFont({…}));\\n\\t \\\\*/\\n\\t R.registerFont = function (font) {\\n\\t if (!font.face) {\\n\\t return font;\\n\\t }\\n\\t this.fonts = this.fonts || {};\\n\\t var fontcopy = {\\n\\t w: font.w,\\n\\t face: {},\\n\\t glyphs: {}\\n\\t },\\n\\t family = font.face[\\\"font-family\\\"];\\n\\t for (var prop in font.face) if (font.face[has](prop)) {\\n\\t fontcopy.face[prop] = font.face[prop];\\n\\t }\\n\\t if (this.fonts[family]) {\\n\\t this.fonts[family].push(fontcopy);\\n\\t } else {\\n\\t this.fonts[family] = [fontcopy];\\n\\t }\\n\\t if (!font.svg) {\\n\\t fontcopy.face[\\\"units-per-em\\\"] = toInt(font.face[\\\"units-per-em\\\"], 10);\\n\\t for (var glyph in font.glyphs) if (font.glyphs[has](glyph)) {\\n\\t var path = font.glyphs[glyph];\\n\\t fontcopy.glyphs[glyph] = {\\n\\t w: path.w,\\n\\t k: {},\\n\\t d: path.d && \\\"M\\\" + path.d.replace(/[mlcxtrv]/g, function (command) {\\n\\t return {l: \\\"L\\\", c: \\\"C\\\", x: \\\"z\\\", t: \\\"m\\\", r: \\\"l\\\", v: \\\"c\\\"}[command] || \\\"M\\\";\\n\\t }) + \\\"z\\\"\\n\\t };\\n\\t if (path.k) {\\n\\t for (var k in path.k) if (path[has](k)) {\\n\\t fontcopy.glyphs[glyph].k[k] = path.k[k];\\n\\t }\\n\\t }\\n\\t }\\n\\t }\\n\\t return font;\\n\\t };\\n\\t /*\\\\\\n\\t * Paper.getFont\\n\\t [ method ]\\n\\t **\\n\\t * Finds font object in the registered fonts by given parameters. You could specify only one word from the font name, like “Myriad” for “Myriad Pro”.\\n\\t **\\n\\t > Parameters\\n\\t **\\n\\t - family (string) font family name or any word from it\\n\\t - weight (string) #optional font weight\\n\\t - style (string) #optional font style\\n\\t - stretch (string) #optional font stretch\\n\\t = (object) the font object\\n\\t > Usage\\n\\t | paper.print(100, 100, \\\"Test string\\\", paper.getFont(\\\"Times\\\", 800), 30);\\n\\t \\\\*/\\n\\t paperproto.getFont = function (family, weight, style, stretch) {\\n\\t stretch = stretch || \\\"normal\\\";\\n\\t style = style || \\\"normal\\\";\\n\\t weight = +weight || {normal: 400, bold: 700, lighter: 300, bolder: 800}[weight] || 400;\\n\\t if (!R.fonts) {\\n\\t return;\\n\\t }\\n\\t var font = R.fonts[family];\\n\\t if (!font) {\\n\\t var name = new RegExp(\\\"(^|\\\\\\\\s)\\\" + family.replace(/[^\\\\w\\\\d\\\\s+!~.:_-]/g, E) + \\\"(\\\\\\\\s|$)\\\", \\\"i\\\");\\n\\t for (var fontName in R.fonts) if (R.fonts[has](fontName)) {\\n\\t if (name.test(fontName)) {\\n\\t font = R.fonts[fontName];\\n\\t break;\\n\\t }\\n\\t }\\n\\t }\\n\\t var thefont;\\n\\t if (font) {\\n\\t for (var i = 0, ii = font.length; i < ii; i++) {\\n\\t thefont = font[i];\\n\\t if (thefont.face[\\\"font-weight\\\"] == weight && (thefont.face[\\\"font-style\\\"] == style || !thefont.face[\\\"font-style\\\"]) && thefont.face[\\\"font-stretch\\\"] == stretch) {\\n\\t break;\\n\\t }\\n\\t }\\n\\t }\\n\\t return thefont;\\n\\t };\\n\\t /*\\\\\\n\\t * Paper.print\\n\\t [ method ]\\n\\t **\\n\\t * Creates path that represent given text written using given font at given position with given size.\\n\\t * Result of the method is path element that contains whole text as a separate path.\\n\\t **\\n\\t > Parameters\\n\\t **\\n\\t - x (number) x position of the text\\n\\t - y (number) y position of the text\\n\\t - string (string) text to print\\n\\t - font (object) font object, see @Paper.getFont\\n\\t - size (number) #optional size of the font, default is `16`\\n\\t - origin (string) #optional could be `\\\"baseline\\\"` or `\\\"middle\\\"`, default is `\\\"middle\\\"`\\n\\t - letter_spacing (number) #optional number in range `-1..1`, default is `0`\\n\\t - line_spacing (number) #optional number in range `1..3`, default is `1`\\n\\t = (object) resulting path element, which consist of all letters\\n\\t > Usage\\n\\t | var txt = r.print(10, 50, \\\"print\\\", r.getFont(\\\"Museo\\\"), 30).attr({fill: \\\"#fff\\\"});\\n\\t \\\\*/\\n\\t paperproto.print = function (x, y, string, font, size, origin, letter_spacing, line_spacing) {\\n\\t origin = origin || \\\"middle\\\"; // baseline|middle\\n\\t letter_spacing = mmax(mmin(letter_spacing || 0, 1), -1);\\n\\t line_spacing = mmax(mmin(line_spacing || 1, 3), 1);\\n\\t var letters = Str(string)[split](E),\\n\\t shift = 0,\\n\\t notfirst = 0,\\n\\t path = E,\\n\\t scale;\\n\\t R.is(font, \\\"string\\\") && (font = this.getFont(font));\\n\\t if (font) {\\n\\t scale = (size || 16) / font.face[\\\"units-per-em\\\"];\\n\\t var bb = font.face.bbox[split](separator),\\n\\t top = +bb[0],\\n\\t lineHeight = bb[3] - bb[1],\\n\\t shifty = 0,\\n\\t height = +bb[1] + (origin == \\\"baseline\\\" ? lineHeight + (+font.face.descent) : lineHeight / 2);\\n\\t for (var i = 0, ii = letters.length; i < ii; i++) {\\n\\t if (letters[i] == \\\"\\\\n\\\") {\\n\\t shift = 0;\\n\\t curr = 0;\\n\\t notfirst = 0;\\n\\t shifty += lineHeight * line_spacing;\\n\\t } else {\\n\\t var prev = notfirst && font.glyphs[letters[i - 1]] || {},\\n\\t curr = font.glyphs[letters[i]];\\n\\t shift += notfirst ? (prev.w || font.w) + (prev.k && prev.k[letters[i]] || 0) + (font.w * letter_spacing) : 0;\\n\\t notfirst = 1;\\n\\t }\\n\\t if (curr && curr.d) {\\n\\t path += R.transformPath(curr.d, [\\\"t\\\", shift * scale, shifty * scale, \\\"s\\\", scale, scale, top, height, \\\"t\\\", (x - top) / scale, (y - height) / scale]);\\n\\t }\\n\\t }\\n\\t }\\n\\t return this.path(path).attr({\\n\\t fill: \\\"#000\\\",\\n\\t stroke: \\\"none\\\"\\n\\t });\\n\\t };\\n\\n\\t /*\\\\\\n\\t * Paper.add\\n\\t [ method ]\\n\\t **\\n\\t * Imports elements in JSON array in format `{type: type, }`\\n\\t **\\n\\t > Parameters\\n\\t **\\n\\t - json (array)\\n\\t = (object) resulting set of imported elements\\n\\t > Usage\\n\\t | paper.add([\\n\\t | {\\n\\t | type: \\\"circle\\\",\\n\\t | cx: 10,\\n\\t | cy: 10,\\n\\t | r: 5\\n\\t | },\\n\\t | {\\n\\t | type: \\\"rect\\\",\\n\\t | x: 10,\\n\\t | y: 10,\\n\\t | width: 10,\\n\\t | height: 10,\\n\\t | fill: \\\"#fc0\\\"\\n\\t | }\\n\\t | ]);\\n\\t \\\\*/\\n\\t paperproto.add = function (json) {\\n\\t if (R.is(json, \\\"array\\\")) {\\n\\t var res = this.set(),\\n\\t i = 0,\\n\\t ii = json.length,\\n\\t j;\\n\\t for (; i < ii; i++) {\\n\\t j = json[i] || {};\\n\\t elements[has](j.type) && res.push(this[j.type]().attr(j));\\n\\t }\\n\\t }\\n\\t return res;\\n\\t };\\n\\n\\t /*\\\\\\n\\t * Raphael.format\\n\\t [ method ]\\n\\t **\\n\\t * Simple format function. Replaces construction of type “`{}`” to the corresponding argument.\\n\\t **\\n\\t > Parameters\\n\\t **\\n\\t - token (string) string to format\\n\\t - … (string) rest of arguments will be treated as parameters for replacement\\n\\t = (string) formated string\\n\\t > Usage\\n\\t | var x = 10,\\n\\t | y = 20,\\n\\t | width = 40,\\n\\t | height = 50;\\n\\t | // this will draw a rectangular shape equivalent to \\\"M10,20h40v50h-40z\\\"\\n\\t | paper.path(Raphael.format(\\\"M{0},{1}h{2}v{3}h{4}z\\\", x, y, width, height, -width));\\n\\t \\\\*/\\n\\t R.format = function (token, params) {\\n\\t var args = R.is(params, array) ? [0][concat](params) : arguments;\\n\\t token && R.is(token, string) && args.length - 1 && (token = token.replace(formatrg, function (str, i) {\\n\\t return args[++i] == null ? E : args[i];\\n\\t }));\\n\\t return token || E;\\n\\t };\\n\\t /*\\\\\\n\\t * Raphael.fullfill\\n\\t [ method ]\\n\\t **\\n\\t * A little bit more advanced format function than @Raphael.format. Replaces construction of type “`{}`” to the corresponding argument.\\n\\t **\\n\\t > Parameters\\n\\t **\\n\\t - token (string) string to format\\n\\t - json (object) object which properties will be used as a replacement\\n\\t = (string) formated string\\n\\t > Usage\\n\\t | // this will draw a rectangular shape equivalent to \\\"M10,20h40v50h-40z\\\"\\n\\t | paper.path(Raphael.fullfill(\\\"M{x},{y}h{dim.width}v{dim.height}h{dim['negative width']}z\\\", {\\n\\t | x: 10,\\n\\t | y: 20,\\n\\t | dim: {\\n\\t | width: 40,\\n\\t | height: 50,\\n\\t | \\\"negative width\\\": -40\\n\\t | }\\n\\t | }));\\n\\t \\\\*/\\n\\t R.fullfill = (function () {\\n\\t var tokenRegex = /\\\\{([^\\\\}]+)\\\\}/g,\\n\\t objNotationRegex = /(?:(?:^|\\\\.)(.+?)(?=\\\\[|\\\\.|$|\\\\()|\\\\[('|\\\")(.+?)\\\\2\\\\])(\\\\(\\\\))?/g, // matches .xxxxx or [\\\"xxxxx\\\"] to run over object properties\\n\\t replacer = function (all, key, obj) {\\n\\t var res = obj;\\n\\t key.replace(objNotationRegex, function (all, name, quote, quotedName, isFunc) {\\n\\t name = name || quotedName;\\n\\t if (res) {\\n\\t if (name in res) {\\n\\t res = res[name];\\n\\t }\\n\\t typeof res == \\\"function\\\" && isFunc && (res = res());\\n\\t }\\n\\t });\\n\\t res = (res == null || res == obj ? all : res) + \\\"\\\";\\n\\t return res;\\n\\t };\\n\\t return function (str, obj) {\\n\\t return String(str).replace(tokenRegex, function (all, key) {\\n\\t return replacer(all, key, obj);\\n\\t });\\n\\t };\\n\\t })();\\n\\t /*\\\\\\n\\t * Raphael.ninja\\n\\t [ method ]\\n\\t **\\n\\t * If you want to leave no trace of Raphaël (Well, Raphaël creates only one global variable `Raphael`, but anyway.) You can use `ninja` method.\\n\\t * Beware, that in this case plugins could stop working, because they are depending on global variable existence.\\n\\t **\\n\\t = (object) Raphael object\\n\\t > Usage\\n\\t | (function (local_raphael) {\\n\\t | var paper = local_raphael(10, 10, 320, 200);\\n\\t | …\\n\\t | })(Raphael.ninja());\\n\\t \\\\*/\\n\\t R.ninja = function () {\\n\\t if (oldRaphael.was) {\\n\\t g.win.Raphael = oldRaphael.is;\\n\\t } else {\\n\\t // IE8 raises an error when deleting window property\\n\\t window.Raphael = undefined;\\n\\t try {\\n\\t delete window.Raphael;\\n\\t } catch(e) {}\\n\\t }\\n\\t return R;\\n\\t };\\n\\t /*\\\\\\n\\t * Raphael.st\\n\\t [ property (object) ]\\n\\t **\\n\\t * You can add your own method to elements and sets. It is wise to add a set method for each element method\\n\\t * you added, so you will be able to call the same method on sets too.\\n\\t **\\n\\t * See also @Raphael.el.\\n\\t > Usage\\n\\t | Raphael.el.red = function () {\\n\\t | this.attr({fill: \\\"#f00\\\"});\\n\\t | };\\n\\t | Raphael.st.red = function () {\\n\\t | this.forEach(function (el) {\\n\\t | el.red();\\n\\t | });\\n\\t | };\\n\\t | // then use it\\n\\t | paper.set(paper.circle(100, 100, 20), paper.circle(110, 100, 20)).red();\\n\\t \\\\*/\\n\\t R.st = setproto;\\n\\n\\t eve.on(\\\"raphael.DOMload\\\", function () {\\n\\t loaded = true;\\n\\t });\\n\\n\\t // Firefox <3.6 fix: http://webreflection.blogspot.com/2009/11/195-chars-to-help-lazy-loading.html\\n\\t (function (doc, loaded, f) {\\n\\t if (doc.readyState == null && doc.addEventListener){\\n\\t doc.addEventListener(loaded, f = function () {\\n\\t doc.removeEventListener(loaded, f, false);\\n\\t doc.readyState = \\\"complete\\\";\\n\\t }, false);\\n\\t doc.readyState = \\\"loading\\\";\\n\\t }\\n\\t function isLoaded() {\\n\\t (/in/).test(doc.readyState) ? setTimeout(isLoaded, 9) : R.eve(\\\"raphael.DOMload\\\");\\n\\t }\\n\\t isLoaded();\\n\\t })(document, \\\"DOMContentLoaded\\\");\\n\\n\\t return R;\\n\\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\\n\\n\\n/***/ },\\n/* 2 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;// Copyright (c) 2013 Adobe Systems Incorporated. All rights reserved.\\n\\t// \\n\\t// Licensed under the Apache License, Version 2.0 (the \\\"License\\\");\\n\\t// you may not use this file except in compliance with the License.\\n\\t// You may obtain a copy of the License at\\n\\t// \\n\\t// http://www.apache.org/licenses/LICENSE-2.0\\n\\t// \\n\\t// Unless required by applicable law or agreed to in writing, software\\n\\t// distributed under the License is distributed on an \\\"AS IS\\\" BASIS,\\n\\t// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\\n\\t// See the License for the specific language governing permissions and\\n\\t// limitations under the License.\\n\\t// ┌────────────────────────────────────────────────────────────┐ \\\\\\\\\\n\\t// │ Eve 0.4.2 - JavaScript Events Library │ \\\\\\\\\\n\\t// ├────────────────────────────────────────────────────────────┤ \\\\\\\\\\n\\t// │ Author Dmitry Baranovskiy (http://dmitry.baranovskiy.com/) │ \\\\\\\\\\n\\t// └────────────────────────────────────────────────────────────┘ \\\\\\\\\\n\\n\\t(function (glob) {\\n\\t var version = \\\"0.4.2\\\",\\n\\t has = \\\"hasOwnProperty\\\",\\n\\t separator = /[\\\\.\\\\/]/,\\n\\t wildcard = \\\"*\\\",\\n\\t fun = function () {},\\n\\t numsort = function (a, b) {\\n\\t return a - b;\\n\\t },\\n\\t current_event,\\n\\t stop,\\n\\t events = {n: {}},\\n\\t /*\\\\\\n\\t * eve\\n\\t [ method ]\\n\\n\\t * Fires event with given `name`, given scope and other parameters.\\n\\n\\t > Arguments\\n\\n\\t - name (string) name of the *event*, dot (`.`) or slash (`/`) separated\\n\\t - scope (object) context for the event handlers\\n\\t - varargs (...) the rest of arguments will be sent to event handlers\\n\\n\\t = (object) array of returned values from the listeners\\n\\t \\\\*/\\n\\t eve = function (name, scope) {\\n\\t\\t\\t\\tname = String(name);\\n\\t var e = events,\\n\\t oldstop = stop,\\n\\t args = Array.prototype.slice.call(arguments, 2),\\n\\t listeners = eve.listeners(name),\\n\\t z = 0,\\n\\t f = false,\\n\\t l,\\n\\t indexed = [],\\n\\t queue = {},\\n\\t out = [],\\n\\t ce = current_event,\\n\\t errors = [];\\n\\t current_event = name;\\n\\t stop = 0;\\n\\t for (var i = 0, ii = listeners.length; i < ii; i++) if (\\\"zIndex\\\" in listeners[i]) {\\n\\t indexed.push(listeners[i].zIndex);\\n\\t if (listeners[i].zIndex < 0) {\\n\\t queue[listeners[i].zIndex] = listeners[i];\\n\\t }\\n\\t }\\n\\t indexed.sort(numsort);\\n\\t while (indexed[z] < 0) {\\n\\t l = queue[indexed[z++]];\\n\\t out.push(l.apply(scope, args));\\n\\t if (stop) {\\n\\t stop = oldstop;\\n\\t return out;\\n\\t }\\n\\t }\\n\\t for (i = 0; i < ii; i++) {\\n\\t l = listeners[i];\\n\\t if (\\\"zIndex\\\" in l) {\\n\\t if (l.zIndex == indexed[z]) {\\n\\t out.push(l.apply(scope, args));\\n\\t if (stop) {\\n\\t break;\\n\\t }\\n\\t do {\\n\\t z++;\\n\\t l = queue[indexed[z]];\\n\\t l && out.push(l.apply(scope, args));\\n\\t if (stop) {\\n\\t break;\\n\\t }\\n\\t } while (l)\\n\\t } else {\\n\\t queue[l.zIndex] = l;\\n\\t }\\n\\t } else {\\n\\t out.push(l.apply(scope, args));\\n\\t if (stop) {\\n\\t break;\\n\\t }\\n\\t }\\n\\t }\\n\\t stop = oldstop;\\n\\t current_event = ce;\\n\\t return out.length ? out : null;\\n\\t };\\n\\t\\t\\t// Undocumented. Debug only.\\n\\t\\t\\teve._events = events;\\n\\t /*\\\\\\n\\t * eve.listeners\\n\\t [ method ]\\n\\n\\t * Internal method which gives you array of all event handlers that will be triggered by the given `name`.\\n\\n\\t > Arguments\\n\\n\\t - name (string) name of the event, dot (`.`) or slash (`/`) separated\\n\\n\\t = (array) array of event handlers\\n\\t \\\\*/\\n\\t eve.listeners = function (name) {\\n\\t var names = name.split(separator),\\n\\t e = events,\\n\\t item,\\n\\t items,\\n\\t k,\\n\\t i,\\n\\t ii,\\n\\t j,\\n\\t jj,\\n\\t nes,\\n\\t es = [e],\\n\\t out = [];\\n\\t for (i = 0, ii = names.length; i < ii; i++) {\\n\\t nes = [];\\n\\t for (j = 0, jj = es.length; j < jj; j++) {\\n\\t e = es[j].n;\\n\\t items = [e[names[i]], e[wildcard]];\\n\\t k = 2;\\n\\t while (k--) {\\n\\t item = items[k];\\n\\t if (item) {\\n\\t nes.push(item);\\n\\t out = out.concat(item.f || []);\\n\\t }\\n\\t }\\n\\t }\\n\\t es = nes;\\n\\t }\\n\\t return out;\\n\\t };\\n\\t \\n\\t /*\\\\\\n\\t * eve.on\\n\\t [ method ]\\n\\t **\\n\\t * Binds given event handler with a given name. You can use wildcards “`*`” for the names:\\n\\t | eve.on(\\\"*.under.*\\\", f);\\n\\t | eve(\\\"mouse.under.floor\\\"); // triggers f\\n\\t * Use @eve to trigger the listener.\\n\\t **\\n\\t > Arguments\\n\\t **\\n\\t - name (string) name of the event, dot (`.`) or slash (`/`) separated, with optional wildcards\\n\\t - f (function) event handler function\\n\\t **\\n\\t = (function) returned function accepts a single numeric parameter that represents z-index of the handler. It is an optional feature and only used when you need to ensure that some subset of handlers will be invoked in a given order, despite of the order of assignment. \\n\\t > Example:\\n\\t | eve.on(\\\"mouse\\\", eatIt)(2);\\n\\t | eve.on(\\\"mouse\\\", scream);\\n\\t | eve.on(\\\"mouse\\\", catchIt)(1);\\n\\t * This will ensure that `catchIt()` function will be called before `eatIt()`.\\n\\t\\t *\\n\\t * If you want to put your handler before non-indexed handlers, specify a negative value.\\n\\t * Note: I assume most of the time you don’t need to worry about z-index, but it’s nice to have this feature “just in case”.\\n\\t \\\\*/\\n\\t eve.on = function (name, f) {\\n\\t\\t\\tname = String(name);\\n\\t\\t\\tif (typeof f != \\\"function\\\") {\\n\\t\\t\\t\\treturn function () {};\\n\\t\\t\\t}\\n\\t var names = name.split(separator),\\n\\t e = events;\\n\\t for (var i = 0, ii = names.length; i < ii; i++) {\\n\\t e = e.n;\\n\\t e = e.hasOwnProperty(names[i]) && e[names[i]] || (e[names[i]] = {n: {}});\\n\\t }\\n\\t e.f = e.f || [];\\n\\t for (i = 0, ii = e.f.length; i < ii; i++) if (e.f[i] == f) {\\n\\t return fun;\\n\\t }\\n\\t e.f.push(f);\\n\\t return function (zIndex) {\\n\\t if (+zIndex == +zIndex) {\\n\\t f.zIndex = +zIndex;\\n\\t }\\n\\t };\\n\\t };\\n\\t /*\\\\\\n\\t * eve.f\\n\\t [ method ]\\n\\t **\\n\\t * Returns function that will fire given event with optional arguments.\\n\\t\\t * Arguments that will be passed to the result function will be also\\n\\t\\t * concated to the list of final arguments.\\n\\t \\t | el.onclick = eve.f(\\\"click\\\", 1, 2);\\n\\t \\t | eve.on(\\\"click\\\", function (a, b, c) {\\n\\t \\t | console.log(a, b, c); // 1, 2, [event object]\\n\\t \\t | });\\n\\t > Arguments\\n\\t\\t - event (string) event name\\n\\t\\t - varargs (…) and any other arguments\\n\\t\\t = (function) possible event handler function\\n\\t \\\\*/\\n\\t\\teve.f = function (event) {\\n\\t\\t\\tvar attrs = [].slice.call(arguments, 1);\\n\\t\\t\\treturn function () {\\n\\t\\t\\t\\teve.apply(null, [event, null].concat(attrs).concat([].slice.call(arguments, 0)));\\n\\t\\t\\t};\\n\\t\\t};\\n\\t /*\\\\\\n\\t * eve.stop\\n\\t [ method ]\\n\\t **\\n\\t * Is used inside an event handler to stop the event, preventing any subsequent listeners from firing.\\n\\t \\\\*/\\n\\t eve.stop = function () {\\n\\t stop = 1;\\n\\t };\\n\\t /*\\\\\\n\\t * eve.nt\\n\\t [ method ]\\n\\t **\\n\\t * Could be used inside event handler to figure out actual name of the event.\\n\\t **\\n\\t > Arguments\\n\\t **\\n\\t - subname (string) #optional subname of the event\\n\\t **\\n\\t = (string) name of the event, if `subname` is not specified\\n\\t * or\\n\\t = (boolean) `true`, if current event’s name contains `subname`\\n\\t \\\\*/\\n\\t eve.nt = function (subname) {\\n\\t if (subname) {\\n\\t return new RegExp(\\\"(?:\\\\\\\\.|\\\\\\\\/|^)\\\" + subname + \\\"(?:\\\\\\\\.|\\\\\\\\/|$)\\\").test(current_event);\\n\\t }\\n\\t return current_event;\\n\\t };\\n\\t /*\\\\\\n\\t * eve.nts\\n\\t [ method ]\\n\\t **\\n\\t * Could be used inside event handler to figure out actual name of the event.\\n\\t **\\n\\t **\\n\\t = (array) names of the event\\n\\t \\\\*/\\n\\t eve.nts = function () {\\n\\t return current_event.split(separator);\\n\\t };\\n\\t /*\\\\\\n\\t * eve.off\\n\\t [ method ]\\n\\t **\\n\\t * Removes given function from the list of event listeners assigned to given name.\\n\\t\\t * If no arguments specified all the events will be cleared.\\n\\t **\\n\\t > Arguments\\n\\t **\\n\\t - name (string) name of the event, dot (`.`) or slash (`/`) separated, with optional wildcards\\n\\t - f (function) event handler function\\n\\t \\\\*/\\n\\t /*\\\\\\n\\t * eve.unbind\\n\\t [ method ]\\n\\t **\\n\\t * See @eve.off\\n\\t \\\\*/\\n\\t eve.off = eve.unbind = function (name, f) {\\n\\t\\t\\tif (!name) {\\n\\t\\t\\t eve._events = events = {n: {}};\\n\\t\\t\\t\\treturn;\\n\\t\\t\\t}\\n\\t var names = name.split(separator),\\n\\t e,\\n\\t key,\\n\\t splice,\\n\\t i, ii, j, jj,\\n\\t cur = [events];\\n\\t for (i = 0, ii = names.length; i < ii; i++) {\\n\\t for (j = 0; j < cur.length; j += splice.length - 2) {\\n\\t splice = [j, 1];\\n\\t e = cur[j].n;\\n\\t if (names[i] != wildcard) {\\n\\t if (e[names[i]]) {\\n\\t splice.push(e[names[i]]);\\n\\t }\\n\\t } else {\\n\\t for (key in e) if (e[has](key)) {\\n\\t splice.push(e[key]);\\n\\t }\\n\\t }\\n\\t cur.splice.apply(cur, splice);\\n\\t }\\n\\t }\\n\\t for (i = 0, ii = cur.length; i < ii; i++) {\\n\\t e = cur[i];\\n\\t while (e.n) {\\n\\t if (f) {\\n\\t if (e.f) {\\n\\t for (j = 0, jj = e.f.length; j < jj; j++) if (e.f[j] == f) {\\n\\t e.f.splice(j, 1);\\n\\t break;\\n\\t }\\n\\t !e.f.length && delete e.f;\\n\\t }\\n\\t for (key in e.n) if (e.n[has](key) && e.n[key].f) {\\n\\t var funcs = e.n[key].f;\\n\\t for (j = 0, jj = funcs.length; j < jj; j++) if (funcs[j] == f) {\\n\\t funcs.splice(j, 1);\\n\\t break;\\n\\t }\\n\\t !funcs.length && delete e.n[key].f;\\n\\t }\\n\\t } else {\\n\\t delete e.f;\\n\\t for (key in e.n) if (e.n[has](key) && e.n[key].f) {\\n\\t delete e.n[key].f;\\n\\t }\\n\\t }\\n\\t e = e.n;\\n\\t }\\n\\t }\\n\\t };\\n\\t /*\\\\\\n\\t * eve.once\\n\\t [ method ]\\n\\t **\\n\\t * Binds given event handler with a given name to only run once then unbind itself.\\n\\t | eve.once(\\\"login\\\", f);\\n\\t | eve(\\\"login\\\"); // triggers f\\n\\t | eve(\\\"login\\\"); // no listeners\\n\\t * Use @eve to trigger the listener.\\n\\t **\\n\\t > Arguments\\n\\t **\\n\\t - name (string) name of the event, dot (`.`) or slash (`/`) separated, with optional wildcards\\n\\t - f (function) event handler function\\n\\t **\\n\\t = (function) same return function as @eve.on\\n\\t \\\\*/\\n\\t eve.once = function (name, f) {\\n\\t var f2 = function () {\\n\\t eve.unbind(name, f2);\\n\\t return f.apply(this, arguments);\\n\\t };\\n\\t return eve.on(name, f2);\\n\\t };\\n\\t /*\\\\\\n\\t * eve.version\\n\\t [ property (string) ]\\n\\t **\\n\\t * Current version of the library.\\n\\t \\\\*/\\n\\t eve.version = version;\\n\\t eve.toString = function () {\\n\\t return \\\"You are running Eve \\\" + version;\\n\\t };\\n\\t (typeof module != \\\"undefined\\\" && module.exports) ? (module.exports = eve) : ( true ? (!(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_RESULT__ = function() { return eve; }.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__))) : (glob.eve = eve));\\n\\t})(this);\\n\\n\\n/***/ },\\n/* 3 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(1)], __WEBPACK_AMD_DEFINE_RESULT__ = function(R) {\\n\\t if (R && !R.svg) {\\n\\t return;\\n\\t }\\n\\n\\t var has = \\\"hasOwnProperty\\\",\\n\\t Str = String,\\n\\t toFloat = parseFloat,\\n\\t toInt = parseInt,\\n\\t math = Math,\\n\\t mmax = math.max,\\n\\t abs = math.abs,\\n\\t pow = math.pow,\\n\\t separator = /[, ]+/,\\n\\t eve = R.eve,\\n\\t E = \\\"\\\",\\n\\t S = \\\" \\\";\\n\\t var xlink = \\\"http://www.w3.org/1999/xlink\\\",\\n\\t markers = {\\n\\t block: \\\"M5,0 0,2.5 5,5z\\\",\\n\\t classic: \\\"M5,0 0,2.5 5,5 3.5,3 3.5,2z\\\",\\n\\t diamond: \\\"M2.5,0 5,2.5 2.5,5 0,2.5z\\\",\\n\\t open: \\\"M6,1 1,3.5 6,6\\\",\\n\\t oval: \\\"M2.5,0A2.5,2.5,0,0,1,2.5,5 2.5,2.5,0,0,1,2.5,0z\\\"\\n\\t },\\n\\t markerCounter = {};\\n\\t R.toString = function () {\\n\\t return \\\"Your browser supports SVG.\\\\nYou are running Rapha\\\\xebl \\\" + this.version;\\n\\t };\\n\\t var $ = function (el, attr) {\\n\\t if (attr) {\\n\\t if (typeof el == \\\"string\\\") {\\n\\t el = $(el);\\n\\t }\\n\\t for (var key in attr) if (attr[has](key)) {\\n\\t if (key.substring(0, 6) == \\\"xlink:\\\") {\\n\\t el.setAttributeNS(xlink, key.substring(6), Str(attr[key]));\\n\\t } else {\\n\\t el.setAttribute(key, Str(attr[key]));\\n\\t }\\n\\t }\\n\\t } else {\\n\\t el = R._g.doc.createElementNS(\\\"http://www.w3.org/2000/svg\\\", el);\\n\\t el.style && (el.style.webkitTapHighlightColor = \\\"rgba(0,0,0,0)\\\");\\n\\t }\\n\\t return el;\\n\\t },\\n\\t addGradientFill = function (element, gradient) {\\n\\t var type = \\\"linear\\\",\\n\\t id = element.id + gradient,\\n\\t fx = .5, fy = .5,\\n\\t o = element.node,\\n\\t SVG = element.paper,\\n\\t s = o.style,\\n\\t el = R._g.doc.getElementById(id);\\n\\t if (!el) {\\n\\t gradient = Str(gradient).replace(R._radial_gradient, function (all, _fx, _fy) {\\n\\t type = \\\"radial\\\";\\n\\t if (_fx && _fy) {\\n\\t fx = toFloat(_fx);\\n\\t fy = toFloat(_fy);\\n\\t var dir = ((fy > .5) * 2 - 1);\\n\\t pow(fx - .5, 2) + pow(fy - .5, 2) > .25 &&\\n\\t (fy = math.sqrt(.25 - pow(fx - .5, 2)) * dir + .5) &&\\n\\t fy != .5 &&\\n\\t (fy = fy.toFixed(5) - 1e-5 * dir);\\n\\t }\\n\\t return E;\\n\\t });\\n\\t gradient = gradient.split(/\\\\s*\\\\-\\\\s*/);\\n\\t if (type == \\\"linear\\\") {\\n\\t var angle = gradient.shift();\\n\\t angle = -toFloat(angle);\\n\\t if (isNaN(angle)) {\\n\\t return null;\\n\\t }\\n\\t var vector = [0, 0, math.cos(R.rad(angle)), math.sin(R.rad(angle))],\\n\\t max = 1 / (mmax(abs(vector[2]), abs(vector[3])) || 1);\\n\\t vector[2] *= max;\\n\\t vector[3] *= max;\\n\\t if (vector[2] < 0) {\\n\\t vector[0] = -vector[2];\\n\\t vector[2] = 0;\\n\\t }\\n\\t if (vector[3] < 0) {\\n\\t vector[1] = -vector[3];\\n\\t vector[3] = 0;\\n\\t }\\n\\t }\\n\\t var dots = R._parseDots(gradient);\\n\\t if (!dots) {\\n\\t return null;\\n\\t }\\n\\t id = id.replace(/[\\\\(\\\\)\\\\s,\\\\xb0#]/g, \\\"_\\\");\\n\\n\\t if (element.gradient && id != element.gradient.id) {\\n\\t SVG.defs.removeChild(element.gradient);\\n\\t delete element.gradient;\\n\\t }\\n\\n\\t if (!element.gradient) {\\n\\t el = $(type + \\\"Gradient\\\", {id: id});\\n\\t element.gradient = el;\\n\\t $(el, type == \\\"radial\\\" ? {\\n\\t fx: fx,\\n\\t fy: fy\\n\\t } : {\\n\\t x1: vector[0],\\n\\t y1: vector[1],\\n\\t x2: vector[2],\\n\\t y2: vector[3],\\n\\t gradientTransform: element.matrix.invert()\\n\\t });\\n\\t SVG.defs.appendChild(el);\\n\\t for (var i = 0, ii = dots.length; i < ii; i++) {\\n\\t el.appendChild($(\\\"stop\\\", {\\n\\t offset: dots[i].offset ? dots[i].offset : i ? \\\"100%\\\" : \\\"0%\\\",\\n\\t \\\"stop-color\\\": dots[i].color || \\\"#fff\\\",\\n\\t \\\"stop-opacity\\\": isFinite(dots[i].opacity) ? dots[i].opacity : 1\\n\\t }));\\n\\t }\\n\\t }\\n\\t }\\n\\t $(o, {\\n\\t fill: fillurl(id),\\n\\t opacity: 1,\\n\\t \\\"fill-opacity\\\": 1\\n\\t });\\n\\t s.fill = E;\\n\\t s.opacity = 1;\\n\\t s.fillOpacity = 1;\\n\\t return 1;\\n\\t },\\n\\t isIE9or10 = function () {\\n\\t var mode = document.documentMode;\\n\\t return mode && (mode === 9 || mode === 10);\\n\\t },\\n\\t fillurl = function (id) {\\n\\t if (isIE9or10()) {\\n\\t return \\\"url('#\\\" + id + \\\"')\\\";\\n\\t }\\n\\t var location = document.location;\\n\\t var locationString = (\\n\\t location.protocol + '//' +\\n\\t location.host +\\n\\t location.pathname +\\n\\t location.search\\n\\t );\\n\\t return \\\"url('\\\" + locationString + \\\"#\\\" + id + \\\"')\\\";\\n\\t },\\n\\t updatePosition = function (o) {\\n\\t var bbox = o.getBBox(1);\\n\\t $(o.pattern, {patternTransform: o.matrix.invert() + \\\" translate(\\\" + bbox.x + \\\",\\\" + bbox.y + \\\")\\\"});\\n\\t },\\n\\t addArrow = function (o, value, isEnd) {\\n\\t if (o.type == \\\"path\\\") {\\n\\t var values = Str(value).toLowerCase().split(\\\"-\\\"),\\n\\t p = o.paper,\\n\\t se = isEnd ? \\\"end\\\" : \\\"start\\\",\\n\\t node = o.node,\\n\\t attrs = o.attrs,\\n\\t stroke = attrs[\\\"stroke-width\\\"],\\n\\t i = values.length,\\n\\t type = \\\"classic\\\",\\n\\t from,\\n\\t to,\\n\\t dx,\\n\\t refX,\\n\\t attr,\\n\\t w = 3,\\n\\t h = 3,\\n\\t t = 5;\\n\\t while (i--) {\\n\\t switch (values[i]) {\\n\\t case \\\"block\\\":\\n\\t case \\\"classic\\\":\\n\\t case \\\"oval\\\":\\n\\t case \\\"diamond\\\":\\n\\t case \\\"open\\\":\\n\\t case \\\"none\\\":\\n\\t type = values[i];\\n\\t break;\\n\\t case \\\"wide\\\": h = 5; break;\\n\\t case \\\"narrow\\\": h = 2; break;\\n\\t case \\\"long\\\": w = 5; break;\\n\\t case \\\"short\\\": w = 2; break;\\n\\t }\\n\\t }\\n\\t if (type == \\\"open\\\") {\\n\\t w += 2;\\n\\t h += 2;\\n\\t t += 2;\\n\\t dx = 1;\\n\\t refX = isEnd ? 4 : 1;\\n\\t attr = {\\n\\t fill: \\\"none\\\",\\n\\t stroke: attrs.stroke\\n\\t };\\n\\t } else {\\n\\t refX = dx = w / 2;\\n\\t attr = {\\n\\t fill: attrs.stroke,\\n\\t stroke: \\\"none\\\"\\n\\t };\\n\\t }\\n\\t if (o._.arrows) {\\n\\t if (isEnd) {\\n\\t o._.arrows.endPath && markerCounter[o._.arrows.endPath]--;\\n\\t o._.arrows.endMarker && markerCounter[o._.arrows.endMarker]--;\\n\\t } else {\\n\\t o._.arrows.startPath && markerCounter[o._.arrows.startPath]--;\\n\\t o._.arrows.startMarker && markerCounter[o._.arrows.startMarker]--;\\n\\t }\\n\\t } else {\\n\\t o._.arrows = {};\\n\\t }\\n\\t if (type != \\\"none\\\") {\\n\\t var pathId = \\\"raphael-marker-\\\" + type,\\n\\t markerId = \\\"raphael-marker-\\\" + se + type + w + h + \\\"-obj\\\" + o.id;\\n\\t if (!R._g.doc.getElementById(pathId)) {\\n\\t p.defs.appendChild($($(\\\"path\\\"), {\\n\\t \\\"stroke-linecap\\\": \\\"round\\\",\\n\\t d: markers[type],\\n\\t id: pathId\\n\\t }));\\n\\t markerCounter[pathId] = 1;\\n\\t } else {\\n\\t markerCounter[pathId]++;\\n\\t }\\n\\t var marker = R._g.doc.getElementById(markerId),\\n\\t use;\\n\\t if (!marker) {\\n\\t marker = $($(\\\"marker\\\"), {\\n\\t id: markerId,\\n\\t markerHeight: h,\\n\\t markerWidth: w,\\n\\t orient: \\\"auto\\\",\\n\\t refX: refX,\\n\\t refY: h / 2\\n\\t });\\n\\t use = $($(\\\"use\\\"), {\\n\\t \\\"xlink:href\\\": \\\"#\\\" + pathId,\\n\\t transform: (isEnd ? \\\"rotate(180 \\\" + w / 2 + \\\" \\\" + h / 2 + \\\") \\\" : E) + \\\"scale(\\\" + w / t + \\\",\\\" + h / t + \\\")\\\",\\n\\t \\\"stroke-width\\\": (1 / ((w / t + h / t) / 2)).toFixed(4)\\n\\t });\\n\\t marker.appendChild(use);\\n\\t p.defs.appendChild(marker);\\n\\t markerCounter[markerId] = 1;\\n\\t } else {\\n\\t markerCounter[markerId]++;\\n\\t use = marker.getElementsByTagName(\\\"use\\\")[0];\\n\\t }\\n\\t $(use, attr);\\n\\t var delta = dx * (type != \\\"diamond\\\" && type != \\\"oval\\\");\\n\\t if (isEnd) {\\n\\t from = o._.arrows.startdx * stroke || 0;\\n\\t to = R.getTotalLength(attrs.path) - delta * stroke;\\n\\t } else {\\n\\t from = delta * stroke;\\n\\t to = R.getTotalLength(attrs.path) - (o._.arrows.enddx * stroke || 0);\\n\\t }\\n\\t attr = {};\\n\\t attr[\\\"marker-\\\" + se] = \\\"url(#\\\" + markerId + \\\")\\\";\\n\\t if (to || from) {\\n\\t attr.d = R.getSubpath(attrs.path, from, to);\\n\\t }\\n\\t $(node, attr);\\n\\t o._.arrows[se + \\\"Path\\\"] = pathId;\\n\\t o._.arrows[se + \\\"Marker\\\"] = markerId;\\n\\t o._.arrows[se + \\\"dx\\\"] = delta;\\n\\t o._.arrows[se + \\\"Type\\\"] = type;\\n\\t o._.arrows[se + \\\"String\\\"] = value;\\n\\t } else {\\n\\t if (isEnd) {\\n\\t from = o._.arrows.startdx * stroke || 0;\\n\\t to = R.getTotalLength(attrs.path) - from;\\n\\t } else {\\n\\t from = 0;\\n\\t to = R.getTotalLength(attrs.path) - (o._.arrows.enddx * stroke || 0);\\n\\t }\\n\\t o._.arrows[se + \\\"Path\\\"] && $(node, {d: R.getSubpath(attrs.path, from, to)});\\n\\t delete o._.arrows[se + \\\"Path\\\"];\\n\\t delete o._.arrows[se + \\\"Marker\\\"];\\n\\t delete o._.arrows[se + \\\"dx\\\"];\\n\\t delete o._.arrows[se + \\\"Type\\\"];\\n\\t delete o._.arrows[se + \\\"String\\\"];\\n\\t }\\n\\t for (attr in markerCounter) if (markerCounter[has](attr) && !markerCounter[attr]) {\\n\\t var item = R._g.doc.getElementById(attr);\\n\\t item && item.parentNode.removeChild(item);\\n\\t }\\n\\t }\\n\\t },\\n\\t dasharray = {\\n\\t \\\"-\\\": [3, 1],\\n\\t \\\".\\\": [1, 1],\\n\\t \\\"-.\\\": [3, 1, 1, 1],\\n\\t \\\"-..\\\": [3, 1, 1, 1, 1, 1],\\n\\t \\\". \\\": [1, 3],\\n\\t \\\"- \\\": [4, 3],\\n\\t \\\"--\\\": [8, 3],\\n\\t \\\"- .\\\": [4, 3, 1, 3],\\n\\t \\\"--.\\\": [8, 3, 1, 3],\\n\\t \\\"--..\\\": [8, 3, 1, 3, 1, 3]\\n\\t },\\n\\t addDashes = function (o, value, params) {\\n\\t value = dasharray[Str(value).toLowerCase()];\\n\\t if (value) {\\n\\t var width = o.attrs[\\\"stroke-width\\\"] || \\\"1\\\",\\n\\t butt = {round: width, square: width, butt: 0}[o.attrs[\\\"stroke-linecap\\\"] || params[\\\"stroke-linecap\\\"]] || 0,\\n\\t dashes = [],\\n\\t i = value.length;\\n\\t while (i--) {\\n\\t dashes[i] = value[i] * width + ((i % 2) ? 1 : -1) * butt;\\n\\t }\\n\\t $(o.node, {\\\"stroke-dasharray\\\": dashes.join(\\\",\\\")});\\n\\t }\\n\\t else {\\n\\t $(o.node, {\\\"stroke-dasharray\\\": \\\"none\\\"});\\n\\t }\\n\\t },\\n\\t setFillAndStroke = function (o, params) {\\n\\t var node = o.node,\\n\\t attrs = o.attrs,\\n\\t vis = node.style.visibility;\\n\\t node.style.visibility = \\\"hidden\\\";\\n\\t for (var att in params) {\\n\\t if (params[has](att)) {\\n\\t if (!R._availableAttrs[has](att)) {\\n\\t continue;\\n\\t }\\n\\t var value = params[att];\\n\\t attrs[att] = value;\\n\\t switch (att) {\\n\\t case \\\"blur\\\":\\n\\t o.blur(value);\\n\\t break;\\n\\t case \\\"title\\\":\\n\\t var title = node.getElementsByTagName(\\\"title\\\");\\n\\n\\t // Use the existing .\\n\\t if (title.length && (title = title[0])) {\\n\\t title.firstChild.nodeValue = value;\\n\\t } else {\\n\\t title = $(\\\"title\\\");\\n\\t var val = R._g.doc.createTextNode(value);\\n\\t title.appendChild(val);\\n\\t node.appendChild(title);\\n\\t }\\n\\t break;\\n\\t case \\\"href\\\":\\n\\t case \\\"target\\\":\\n\\t var pn = node.parentNode;\\n\\t if (pn.tagName.toLowerCase() != \\\"a\\\") {\\n\\t var hl = $(\\\"a\\\");\\n\\t pn.insertBefore(hl, node);\\n\\t hl.appendChild(node);\\n\\t pn = hl;\\n\\t }\\n\\t if (att == \\\"target\\\") {\\n\\t pn.setAttributeNS(xlink, \\\"show\\\", value == \\\"blank\\\" ? \\\"new\\\" : value);\\n\\t } else {\\n\\t pn.setAttributeNS(xlink, att, value);\\n\\t }\\n\\t break;\\n\\t case \\\"cursor\\\":\\n\\t node.style.cursor = value;\\n\\t break;\\n\\t case \\\"transform\\\":\\n\\t o.transform(value);\\n\\t break;\\n\\t case \\\"arrow-start\\\":\\n\\t addArrow(o, value);\\n\\t break;\\n\\t case \\\"arrow-end\\\":\\n\\t addArrow(o, value, 1);\\n\\t break;\\n\\t case \\\"clip-rect\\\":\\n\\t var rect = Str(value).split(separator);\\n\\t if (rect.length == 4) {\\n\\t o.clip && o.clip.parentNode.parentNode.removeChild(o.clip.parentNode);\\n\\t var el = $(\\\"clipPath\\\"),\\n\\t rc = $(\\\"rect\\\");\\n\\t el.id = R.createUUID();\\n\\t $(rc, {\\n\\t x: rect[0],\\n\\t y: rect[1],\\n\\t width: rect[2],\\n\\t height: rect[3]\\n\\t });\\n\\t el.appendChild(rc);\\n\\t o.paper.defs.appendChild(el);\\n\\t $(node, {\\\"clip-path\\\": \\\"url(#\\\" + el.id + \\\")\\\"});\\n\\t o.clip = rc;\\n\\t }\\n\\t if (!value) {\\n\\t var path = node.getAttribute(\\\"clip-path\\\");\\n\\t if (path) {\\n\\t var clip = R._g.doc.getElementById(path.replace(/(^url\\\\(#|\\\\)$)/g, E));\\n\\t clip && clip.parentNode.removeChild(clip);\\n\\t $(node, {\\\"clip-path\\\": E});\\n\\t delete o.clip;\\n\\t }\\n\\t }\\n\\t break;\\n\\t case \\\"path\\\":\\n\\t if (o.type == \\\"path\\\") {\\n\\t $(node, {d: value ? attrs.path = R._pathToAbsolute(value) : \\\"M0,0\\\"});\\n\\t o._.dirty = 1;\\n\\t if (o._.arrows) {\\n\\t \\\"startString\\\" in o._.arrows && addArrow(o, o._.arrows.startString);\\n\\t \\\"endString\\\" in o._.arrows && addArrow(o, o._.arrows.endString, 1);\\n\\t }\\n\\t }\\n\\t break;\\n\\t case \\\"width\\\":\\n\\t node.setAttribute(att, value);\\n\\t o._.dirty = 1;\\n\\t if (attrs.fx) {\\n\\t att = \\\"x\\\";\\n\\t value = attrs.x;\\n\\t } else {\\n\\t break;\\n\\t }\\n\\t case \\\"x\\\":\\n\\t if (attrs.fx) {\\n\\t value = -attrs.x - (attrs.width || 0);\\n\\t }\\n\\t case \\\"rx\\\":\\n\\t if (att == \\\"rx\\\" && o.type == \\\"rect\\\") {\\n\\t break;\\n\\t }\\n\\t case \\\"cx\\\":\\n\\t node.setAttribute(att, value);\\n\\t o.pattern && updatePosition(o);\\n\\t o._.dirty = 1;\\n\\t break;\\n\\t case \\\"height\\\":\\n\\t node.setAttribute(att, value);\\n\\t o._.dirty = 1;\\n\\t if (attrs.fy) {\\n\\t att = \\\"y\\\";\\n\\t value = attrs.y;\\n\\t } else {\\n\\t break;\\n\\t }\\n\\t case \\\"y\\\":\\n\\t if (attrs.fy) {\\n\\t value = -attrs.y - (attrs.height || 0);\\n\\t }\\n\\t case \\\"ry\\\":\\n\\t if (att == \\\"ry\\\" && o.type == \\\"rect\\\") {\\n\\t break;\\n\\t }\\n\\t case \\\"cy\\\":\\n\\t node.setAttribute(att, value);\\n\\t o.pattern && updatePosition(o);\\n\\t o._.dirty = 1;\\n\\t break;\\n\\t case \\\"r\\\":\\n\\t if (o.type == \\\"rect\\\") {\\n\\t $(node, {rx: value, ry: value});\\n\\t } else {\\n\\t node.setAttribute(att, value);\\n\\t }\\n\\t o._.dirty = 1;\\n\\t break;\\n\\t case \\\"src\\\":\\n\\t if (o.type == \\\"image\\\") {\\n\\t node.setAttributeNS(xlink, \\\"href\\\", value);\\n\\t }\\n\\t break;\\n\\t case \\\"stroke-width\\\":\\n\\t if (o._.sx != 1 || o._.sy != 1) {\\n\\t value /= mmax(abs(o._.sx), abs(o._.sy)) || 1;\\n\\t }\\n\\t node.setAttribute(att, value);\\n\\t if (attrs[\\\"stroke-dasharray\\\"]) {\\n\\t addDashes(o, attrs[\\\"stroke-dasharray\\\"], params);\\n\\t }\\n\\t if (o._.arrows) {\\n\\t \\\"startString\\\" in o._.arrows && addArrow(o, o._.arrows.startString);\\n\\t \\\"endString\\\" in o._.arrows && addArrow(o, o._.arrows.endString, 1);\\n\\t }\\n\\t break;\\n\\t case \\\"stroke-dasharray\\\":\\n\\t addDashes(o, value, params);\\n\\t break;\\n\\t case \\\"fill\\\":\\n\\t var isURL = Str(value).match(R._ISURL);\\n\\t if (isURL) {\\n\\t el = $(\\\"pattern\\\");\\n\\t var ig = $(\\\"image\\\");\\n\\t el.id = R.createUUID();\\n\\t $(el, {x: 0, y: 0, patternUnits: \\\"userSpaceOnUse\\\", height: 1, width: 1});\\n\\t $(ig, {x: 0, y: 0, \\\"xlink:href\\\": isURL[1]});\\n\\t el.appendChild(ig);\\n\\n\\t (function (el) {\\n\\t R._preload(isURL[1], function () {\\n\\t var w = this.offsetWidth,\\n\\t h = this.offsetHeight;\\n\\t $(el, {width: w, height: h});\\n\\t $(ig, {width: w, height: h});\\n\\t });\\n\\t })(el);\\n\\t o.paper.defs.appendChild(el);\\n\\t $(node, {fill: \\\"url(#\\\" + el.id + \\\")\\\"});\\n\\t o.pattern = el;\\n\\t o.pattern && updatePosition(o);\\n\\t break;\\n\\t }\\n\\t var clr = R.getRGB(value);\\n\\t if (!clr.error) {\\n\\t delete params.gradient;\\n\\t delete attrs.gradient;\\n\\t !R.is(attrs.opacity, \\\"undefined\\\") &&\\n\\t R.is(params.opacity, \\\"undefined\\\") &&\\n\\t $(node, {opacity: attrs.opacity});\\n\\t !R.is(attrs[\\\"fill-opacity\\\"], \\\"undefined\\\") &&\\n\\t R.is(params[\\\"fill-opacity\\\"], \\\"undefined\\\") &&\\n\\t $(node, {\\\"fill-opacity\\\": attrs[\\\"fill-opacity\\\"]});\\n\\t } else if ((o.type == \\\"circle\\\" || o.type == \\\"ellipse\\\" || Str(value).charAt() != \\\"r\\\") && addGradientFill(o, value)) {\\n\\t if (\\\"opacity\\\" in attrs || \\\"fill-opacity\\\" in attrs) {\\n\\t var gradient = R._g.doc.getElementById(node.getAttribute(\\\"fill\\\").replace(/^url\\\\(#|\\\\)$/g, E));\\n\\t if (gradient) {\\n\\t var stops = gradient.getElementsByTagName(\\\"stop\\\");\\n\\t $(stops[stops.length - 1], {\\\"stop-opacity\\\": (\\\"opacity\\\" in attrs ? attrs.opacity : 1) * (\\\"fill-opacity\\\" in attrs ? attrs[\\\"fill-opacity\\\"] : 1)});\\n\\t }\\n\\t }\\n\\t attrs.gradient = value;\\n\\t attrs.fill = \\\"none\\\";\\n\\t break;\\n\\t }\\n\\t clr[has](\\\"opacity\\\") && $(node, {\\\"fill-opacity\\\": clr.opacity > 1 ? clr.opacity / 100 : clr.opacity});\\n\\t case \\\"stroke\\\":\\n\\t clr = R.getRGB(value);\\n\\t node.setAttribute(att, clr.hex);\\n\\t att == \\\"stroke\\\" && clr[has](\\\"opacity\\\") && $(node, {\\\"stroke-opacity\\\": clr.opacity > 1 ? clr.opacity / 100 : clr.opacity});\\n\\t if (att == \\\"stroke\\\" && o._.arrows) {\\n\\t \\\"startString\\\" in o._.arrows && addArrow(o, o._.arrows.startString);\\n\\t \\\"endString\\\" in o._.arrows && addArrow(o, o._.arrows.endString, 1);\\n\\t }\\n\\t break;\\n\\t case \\\"gradient\\\":\\n\\t (o.type == \\\"circle\\\" || o.type == \\\"ellipse\\\" || Str(value).charAt() != \\\"r\\\") && addGradientFill(o, value);\\n\\t break;\\n\\t case \\\"opacity\\\":\\n\\t if (attrs.gradient && !attrs[has](\\\"stroke-opacity\\\")) {\\n\\t $(node, {\\\"stroke-opacity\\\": value > 1 ? value / 100 : value});\\n\\t }\\n\\t // fall\\n\\t case \\\"fill-opacity\\\":\\n\\t if (attrs.gradient) {\\n\\t gradient = R._g.doc.getElementById(node.getAttribute(\\\"fill\\\").replace(/^url\\\\(#|\\\\)$/g, E));\\n\\t if (gradient) {\\n\\t stops = gradient.getElementsByTagName(\\\"stop\\\");\\n\\t $(stops[stops.length - 1], {\\\"stop-opacity\\\": value});\\n\\t }\\n\\t break;\\n\\t }\\n\\t default:\\n\\t att == \\\"font-size\\\" && (value = toInt(value, 10) + \\\"px\\\");\\n\\t var cssrule = att.replace(/(\\\\-.)/g, function (w) {\\n\\t return w.substring(1).toUpperCase();\\n\\t });\\n\\t node.style[cssrule] = value;\\n\\t o._.dirty = 1;\\n\\t node.setAttribute(att, value);\\n\\t break;\\n\\t }\\n\\t }\\n\\t }\\n\\n\\t tuneText(o, params);\\n\\t node.style.visibility = vis;\\n\\t },\\n\\t leading = 1.2,\\n\\t tuneText = function (el, params) {\\n\\t if (el.type != \\\"text\\\" || !(params[has](\\\"text\\\") || params[has](\\\"font\\\") || params[has](\\\"font-size\\\") || params[has](\\\"x\\\") || params[has](\\\"y\\\"))) {\\n\\t return;\\n\\t }\\n\\t var a = el.attrs,\\n\\t node = el.node,\\n\\t fontSize = node.firstChild ? toInt(R._g.doc.defaultView.getComputedStyle(node.firstChild, E).getPropertyValue(\\\"font-size\\\"), 10) : 10;\\n\\n\\t if (params[has](\\\"text\\\")) {\\n\\t a.text = params.text;\\n\\t while (node.firstChild) {\\n\\t node.removeChild(node.firstChild);\\n\\t }\\n\\t var texts = Str(params.text).split(\\\"\\\\n\\\"),\\n\\t tspans = [],\\n\\t tspan;\\n\\t for (var i = 0, ii = texts.length; i < ii; i++) {\\n\\t tspan = $(\\\"tspan\\\");\\n\\t i && $(tspan, {dy: fontSize * leading, x: a.x});\\n\\t tspan.appendChild(R._g.doc.createTextNode(texts[i]));\\n\\t node.appendChild(tspan);\\n\\t tspans[i] = tspan;\\n\\t }\\n\\t } else {\\n\\t tspans = node.getElementsByTagName(\\\"tspan\\\");\\n\\t for (i = 0, ii = tspans.length; i < ii; i++) if (i) {\\n\\t $(tspans[i], {dy: fontSize * leading, x: a.x});\\n\\t } else {\\n\\t $(tspans[0], {dy: 0});\\n\\t }\\n\\t }\\n\\t $(node, {x: a.x, y: a.y});\\n\\t el._.dirty = 1;\\n\\t var bb = el._getBBox(),\\n\\t dif = a.y - (bb.y + bb.height / 2);\\n\\t dif && R.is(dif, \\\"finite\\\") && $(tspans[0], {dy: dif});\\n\\t },\\n\\t getRealNode = function (node) {\\n\\t if (node.parentNode && node.parentNode.tagName.toLowerCase() === \\\"a\\\") {\\n\\t return node.parentNode;\\n\\t } else {\\n\\t return node;\\n\\t }\\n\\t },\\n\\t Element = function (node, svg) {\\n\\t var X = 0,\\n\\t Y = 0;\\n\\t /*\\\\\\n\\t * Element.node\\n\\t [ property (object) ]\\n\\t **\\n\\t * Gives you a reference to the DOM object, so you can assign event handlers or just mess around.\\n\\t **\\n\\t * Note: Don’t mess with it.\\n\\t > Usage\\n\\t | // draw a circle at coordinate 10,10 with radius of 10\\n\\t | var c = paper.circle(10, 10, 10);\\n\\t | c.node.onclick = function () {\\n\\t | c.attr(\\\"fill\\\", \\\"red\\\");\\n\\t | };\\n\\t \\\\*/\\n\\t this[0] = this.node = node;\\n\\t /*\\\\\\n\\t * Element.raphael\\n\\t [ property (object) ]\\n\\t **\\n\\t * Internal reference to @Raphael object. In case it is not available.\\n\\t > Usage\\n\\t | Raphael.el.red = function () {\\n\\t | var hsb = this.paper.raphael.rgb2hsb(this.attr(\\\"fill\\\"));\\n\\t | hsb.h = 1;\\n\\t | this.attr({fill: this.paper.raphael.hsb2rgb(hsb).hex});\\n\\t | }\\n\\t \\\\*/\\n\\t node.raphael = true;\\n\\t /*\\\\\\n\\t * Element.id\\n\\t [ property (number) ]\\n\\t **\\n\\t * Unique id of the element. Especially useful when you want to listen to events of the element,\\n\\t * because all events are fired in format `<module>.<action>.<id>`. Also useful for @Paper.getById method.\\n\\t \\\\*/\\n\\t this.id = guid();\\n\\t node.raphaelid = this.id;\\n\\n\\t /**\\n\\t * Method that returns a 5 letter/digit id, enough for 36^5 = 60466176 elements\\n\\t * @returns {string} id\\n\\t */\\n\\t function guid() {\\n\\t return (\\\"0000\\\" + (Math.random()*Math.pow(36,5) << 0).toString(36)).slice(-5);\\n\\t }\\n\\n\\t this.matrix = R.matrix();\\n\\t this.realPath = null;\\n\\t /*\\\\\\n\\t * Element.paper\\n\\t [ property (object) ]\\n\\t **\\n\\t * Internal reference to “paper” where object drawn. Mainly for use in plugins and element extensions.\\n\\t > Usage\\n\\t | Raphael.el.cross = function () {\\n\\t | this.attr({fill: \\\"red\\\"});\\n\\t | this.paper.path(\\\"M10,10L50,50M50,10L10,50\\\")\\n\\t | .attr({stroke: \\\"red\\\"});\\n\\t | }\\n\\t \\\\*/\\n\\t this.paper = svg;\\n\\t this.attrs = this.attrs || {};\\n\\t this._ = {\\n\\t transform: [],\\n\\t sx: 1,\\n\\t sy: 1,\\n\\t deg: 0,\\n\\t dx: 0,\\n\\t dy: 0,\\n\\t dirty: 1\\n\\t };\\n\\t !svg.bottom && (svg.bottom = this);\\n\\t /*\\\\\\n\\t * Element.prev\\n\\t [ property (object) ]\\n\\t **\\n\\t * Reference to the previous element in the hierarchy.\\n\\t \\\\*/\\n\\t this.prev = svg.top;\\n\\t svg.top && (svg.top.next = this);\\n\\t svg.top = this;\\n\\t /*\\\\\\n\\t * Element.next\\n\\t [ property (object) ]\\n\\t **\\n\\t * Reference to the next element in the hierarchy.\\n\\t \\\\*/\\n\\t this.next = null;\\n\\t },\\n\\t elproto = R.el;\\n\\n\\t Element.prototype = elproto;\\n\\t elproto.constructor = Element;\\n\\n\\t R._engine.path = function (pathString, SVG) {\\n\\t var el = $(\\\"path\\\");\\n\\t SVG.canvas && SVG.canvas.appendChild(el);\\n\\t var p = new Element(el, SVG);\\n\\t p.type = \\\"path\\\";\\n\\t setFillAndStroke(p, {\\n\\t fill: \\\"none\\\",\\n\\t stroke: \\\"#000\\\",\\n\\t path: pathString\\n\\t });\\n\\t return p;\\n\\t };\\n\\t /*\\\\\\n\\t * Element.rotate\\n\\t [ method ]\\n\\t **\\n\\t * Deprecated! Use @Element.transform instead.\\n\\t * Adds rotation by given angle around given point to the list of\\n\\t * transformations of the element.\\n\\t > Parameters\\n\\t - deg (number) angle in degrees\\n\\t - cx (number) #optional x coordinate of the centre of rotation\\n\\t - cy (number) #optional y coordinate of the centre of rotation\\n\\t * If cx & cy aren’t specified centre of the shape is used as a point of rotation.\\n\\t = (object) @Element\\n\\t \\\\*/\\n\\t elproto.rotate = function (deg, cx, cy) {\\n\\t if (this.removed) {\\n\\t return this;\\n\\t }\\n\\t deg = Str(deg).split(separator);\\n\\t if (deg.length - 1) {\\n\\t cx = toFloat(deg[1]);\\n\\t cy = toFloat(deg[2]);\\n\\t }\\n\\t deg = toFloat(deg[0]);\\n\\t (cy == null) && (cx = cy);\\n\\t if (cx == null || cy == null) {\\n\\t var bbox = this.getBBox(1);\\n\\t cx = bbox.x + bbox.width / 2;\\n\\t cy = bbox.y + bbox.height / 2;\\n\\t }\\n\\t this.transform(this._.transform.concat([[\\\"r\\\", deg, cx, cy]]));\\n\\t return this;\\n\\t };\\n\\t /*\\\\\\n\\t * Element.scale\\n\\t [ method ]\\n\\t **\\n\\t * Deprecated! Use @Element.transform instead.\\n\\t * Adds scale by given amount relative to given point to the list of\\n\\t * transformations of the element.\\n\\t > Parameters\\n\\t - sx (number) horisontal scale amount\\n\\t - sy (number) vertical scale amount\\n\\t - cx (number) #optional x coordinate of the centre of scale\\n\\t - cy (number) #optional y coordinate of the centre of scale\\n\\t * If cx & cy aren’t specified centre of the shape is used instead.\\n\\t = (object) @Element\\n\\t \\\\*/\\n\\t elproto.scale = function (sx, sy, cx, cy) {\\n\\t if (this.removed) {\\n\\t return this;\\n\\t }\\n\\t sx = Str(sx).split(separator);\\n\\t if (sx.length - 1) {\\n\\t sy = toFloat(sx[1]);\\n\\t cx = toFloat(sx[2]);\\n\\t cy = toFloat(sx[3]);\\n\\t }\\n\\t sx = toFloat(sx[0]);\\n\\t (sy == null) && (sy = sx);\\n\\t (cy == null) && (cx = cy);\\n\\t if (cx == null || cy == null) {\\n\\t var bbox = this.getBBox(1);\\n\\t }\\n\\t cx = cx == null ? bbox.x + bbox.width / 2 : cx;\\n\\t cy = cy == null ? bbox.y + bbox.height / 2 : cy;\\n\\t this.transform(this._.transform.concat([[\\\"s\\\", sx, sy, cx, cy]]));\\n\\t return this;\\n\\t };\\n\\t /*\\\\\\n\\t * Element.translate\\n\\t [ method ]\\n\\t **\\n\\t * Deprecated! Use @Element.transform instead.\\n\\t * Adds translation by given amount to the list of transformations of the element.\\n\\t > Parameters\\n\\t - dx (number) horisontal shift\\n\\t - dy (number) vertical shift\\n\\t = (object) @Element\\n\\t \\\\*/\\n\\t elproto.translate = function (dx, dy) {\\n\\t if (this.removed) {\\n\\t return this;\\n\\t }\\n\\t dx = Str(dx).split(separator);\\n\\t if (dx.length - 1) {\\n\\t dy = toFloat(dx[1]);\\n\\t }\\n\\t dx = toFloat(dx[0]) || 0;\\n\\t dy = +dy || 0;\\n\\t this.transform(this._.transform.concat([[\\\"t\\\", dx, dy]]));\\n\\t return this;\\n\\t };\\n\\t /*\\\\\\n\\t * Element.transform\\n\\t [ method ]\\n\\t **\\n\\t * Adds transformation to the element which is separate to other attributes,\\n\\t * i.e. translation doesn’t change `x` or `y` of the rectange. The format\\n\\t * of transformation string is similar to the path string syntax:\\n\\t | \\\"t100,100r30,100,100s2,2,100,100r45s1.5\\\"\\n\\t * Each letter is a command. There are four commands: `t` is for translate, `r` is for rotate, `s` is for\\n\\t * scale and `m` is for matrix.\\n\\t *\\n\\t * There are also alternative “absolute” translation, rotation and scale: `T`, `R` and `S`. They will not take previous transformation into account. For example, `...T100,0` will always move element 100 px horisontally, while `...t100,0` could move it vertically if there is `r90` before. Just compare results of `r90t100,0` and `r90T100,0`.\\n\\t *\\n\\t * So, the example line above could be read like “translate by 100, 100; rotate 30° around 100, 100; scale twice around 100, 100;\\n\\t * rotate 45° around centre; scale 1.5 times relative to centre”. As you can see rotate and scale commands have origin\\n\\t * coordinates as optional parameters, the default is the centre point of the element.\\n\\t * Matrix accepts six parameters.\\n\\t > Usage\\n\\t | var el = paper.rect(10, 20, 300, 200);\\n\\t | // translate 100, 100, rotate 45°, translate -100, 0\\n\\t | el.transform(\\\"t100,100r45t-100,0\\\");\\n\\t | // if you want you can append or prepend transformations\\n\\t | el.transform(\\\"...t50,50\\\");\\n\\t | el.transform(\\\"s2...\\\");\\n\\t | // or even wrap\\n\\t | el.transform(\\\"t50,50...t-50-50\\\");\\n\\t | // to reset transformation call method with empty string\\n\\t | el.transform(\\\"\\\");\\n\\t | // to get current value call it without parameters\\n\\t | console.log(el.transform());\\n\\t > Parameters\\n\\t - tstr (string) #optional transformation string\\n\\t * If tstr isn’t specified\\n\\t = (string) current transformation string\\n\\t * else\\n\\t = (object) @Element\\n\\t \\\\*/\\n\\t elproto.transform = function (tstr) {\\n\\t var _ = this._;\\n\\t if (tstr == null) {\\n\\t return _.transform;\\n\\t }\\n\\t R._extractTransform(this, tstr);\\n\\n\\t this.clip && $(this.clip, {transform: this.matrix.invert()});\\n\\t this.pattern && updatePosition(this);\\n\\t this.node && $(this.node, {transform: this.matrix});\\n\\n\\t if (_.sx != 1 || _.sy != 1) {\\n\\t var sw = this.attrs[has](\\\"stroke-width\\\") ? this.attrs[\\\"stroke-width\\\"] : 1;\\n\\t this.attr({\\\"stroke-width\\\": sw});\\n\\t }\\n\\n\\t return this;\\n\\t };\\n\\t /*\\\\\\n\\t * Element.hide\\n\\t [ method ]\\n\\t **\\n\\t * Makes element invisible. See @Element.show.\\n\\t = (object) @Element\\n\\t \\\\*/\\n\\t elproto.hide = function () {\\n\\t if(!this.removed) this.node.style.display = \\\"none\\\";\\n\\t return this;\\n\\t };\\n\\t /*\\\\\\n\\t * Element.show\\n\\t [ method ]\\n\\t **\\n\\t * Makes element visible. See @Element.hide.\\n\\t = (object) @Element\\n\\t \\\\*/\\n\\t elproto.show = function () {\\n\\t if(!this.removed) this.node.style.display = \\\"\\\";\\n\\t return this;\\n\\t };\\n\\t /*\\\\\\n\\t * Element.remove\\n\\t [ method ]\\n\\t **\\n\\t * Removes element from the paper.\\n\\t \\\\*/\\n\\t elproto.remove = function () {\\n\\t var node = getRealNode(this.node);\\n\\t if (this.removed || !node.parentNode) {\\n\\t return;\\n\\t }\\n\\t var paper = this.paper;\\n\\t paper.__set__ && paper.__set__.exclude(this);\\n\\t eve.unbind(\\\"raphael.*.*.\\\" + this.id);\\n\\t if (this.gradient) {\\n\\t paper.defs.removeChild(this.gradient);\\n\\t }\\n\\t R._tear(this, paper);\\n\\n\\t node.parentNode.removeChild(node);\\n\\n\\t // Remove custom data for element\\n\\t this.removeData();\\n\\n\\t for (var i in this) {\\n\\t this[i] = typeof this[i] == \\\"function\\\" ? R._removedFactory(i) : null;\\n\\t }\\n\\t this.removed = true;\\n\\t };\\n\\t elproto._getBBox = function () {\\n\\t if (this.node.style.display == \\\"none\\\") {\\n\\t this.show();\\n\\t var hide = true;\\n\\t }\\n\\t var canvasHidden = false,\\n\\t containerStyle;\\n\\t if (this.paper.canvas.parentElement) {\\n\\t containerStyle = this.paper.canvas.parentElement.style;\\n\\t } //IE10+ can't find parentElement\\n\\t else if (this.paper.canvas.parentNode) {\\n\\t containerStyle = this.paper.canvas.parentNode.style;\\n\\t }\\n\\n\\t if(containerStyle && containerStyle.display == \\\"none\\\") {\\n\\t canvasHidden = true;\\n\\t containerStyle.display = \\\"\\\";\\n\\t }\\n\\t var bbox = {};\\n\\t try {\\n\\t bbox = this.node.getBBox();\\n\\t } catch(e) {\\n\\t // Firefox 3.0.x, 25.0.1 (probably more versions affected) play badly here - possible fix\\n\\t bbox = {\\n\\t x: this.node.clientLeft,\\n\\t y: this.node.clientTop,\\n\\t width: this.node.clientWidth,\\n\\t height: this.node.clientHeight\\n\\t }\\n\\t } finally {\\n\\t bbox = bbox || {};\\n\\t if(canvasHidden){\\n\\t containerStyle.display = \\\"none\\\";\\n\\t }\\n\\t }\\n\\t hide && this.hide();\\n\\t return bbox;\\n\\t };\\n\\t /*\\\\\\n\\t * Element.attr\\n\\t [ method ]\\n\\t **\\n\\t * Sets the attributes of the element.\\n\\t > Parameters\\n\\t - attrName (string) attribute’s name\\n\\t - value (string) value\\n\\t * or\\n\\t - params (object) object of name/value pairs\\n\\t * or\\n\\t - attrName (string) attribute’s name\\n\\t * or\\n\\t - attrNames (array) in this case method returns array of current values for given attribute names\\n\\t = (object) @Element if attrsName & value or params are passed in.\\n\\t = (...) value of the attribute if only attrsName is passed in.\\n\\t = (array) array of values of the attribute if attrsNames is passed in.\\n\\t = (object) object of attributes if nothing is passed in.\\n\\t > Possible parameters\\n\\t # <p>Please refer to the <a href=\\\"http://www.w3.org/TR/SVG/\\\" title=\\\"The W3C Recommendation for the SVG language describes these properties in detail.\\\">SVG specification</a> for an explanation of these parameters.</p>\\n\\t o arrow-end (string) arrowhead on the end of the path. The format for string is `<type>[-<width>[-<length>]]`. Possible types: `classic`, `block`, `open`, `oval`, `diamond`, `none`, width: `wide`, `narrow`, `medium`, length: `long`, `short`, `midium`.\\n\\t o clip-rect (string) comma or space separated values: x, y, width and height\\n\\t o cursor (string) CSS type of the cursor\\n\\t o cx (number) the x-axis coordinate of the center of the circle, or ellipse\\n\\t o cy (number) the y-axis coordinate of the center of the circle, or ellipse\\n\\t o fill (string) colour, gradient or image\\n\\t o fill-opacity (number)\\n\\t o font (string)\\n\\t o font-family (string)\\n\\t o font-size (number) font size in pixels\\n\\t o font-weight (string)\\n\\t o height (number)\\n\\t o href (string) URL, if specified element behaves as hyperlink\\n\\t o opacity (number)\\n\\t o path (string) SVG path string format\\n\\t o r (number) radius of the circle, ellipse or rounded corner on the rect\\n\\t o rx (number) horisontal radius of the ellipse\\n\\t o ry (number) vertical radius of the ellipse\\n\\t o src (string) image URL, only works for @Element.image element\\n\\t o stroke (string) stroke colour\\n\\t o stroke-dasharray (string) [“”, “none”, “`-`”, “`.`”, “`-.`”, “`-..`”, “`. `”, “`- `”, “`--`”, “`- .`”, “`--.`”, “`--..`”]\\n\\t o stroke-linecap (string) [“`butt`”, “`square`”, “`round`”]\\n\\t o stroke-linejoin (string) [“`bevel`”, “`round`”, “`miter`”]\\n\\t o stroke-miterlimit (number)\\n\\t o stroke-opacity (number)\\n\\t o stroke-width (number) stroke width in pixels, default is '1'\\n\\t o target (string) used with href\\n\\t o text (string) contents of the text element. Use `\\\\n` for multiline text\\n\\t o text-anchor (string) [“`start`”, “`middle`”, “`end`”], default is “`middle`”\\n\\t o title (string) will create tooltip with a given text\\n\\t o transform (string) see @Element.transform\\n\\t o width (number)\\n\\t o x (number)\\n\\t o y (number)\\n\\t > Gradients\\n\\t * Linear gradient format: “`‹angle›-‹colour›[-‹colour›[:‹offset›]]*-‹colour›`”, example: “`90-#fff-#000`” – 90°\\n\\t * gradient from white to black or “`0-#fff-#f00:20-#000`” – 0° gradient from white via red (at 20%) to black.\\n\\t *\\n\\t * radial gradient: “`r[(‹fx›, ‹fy›)]‹colour›[-‹colour›[:‹offset›]]*-‹colour›`”, example: “`r#fff-#000`” –\\n\\t * gradient from white to black or “`r(0.25, 0.75)#fff-#000`” – gradient from white to black with focus point\\n\\t * at 0.25, 0.75. Focus point coordinates are in 0..1 range. Radial gradients can only be applied to circles and ellipses.\\n\\t > Path String\\n\\t # <p>Please refer to <a href=\\\"http://www.w3.org/TR/SVG/paths.html#PathData\\\" title=\\\"Details of a path’s data attribute’s format are described in the SVG specification.\\\">SVG documentation regarding path string</a>. Raphaël fully supports it.</p>\\n\\t > Colour Parsing\\n\\t # <ul>\\n\\t # <li>Colour name (“<code>red</code>”, “<code>green</code>”, “<code>cornflowerblue</code>”, etc)</li>\\n\\t # <li>#••• — shortened HTML colour: (“<code>#000</code>”, “<code>#fc0</code>”, etc)</li>\\n\\t # <li>#•••••• — full length HTML colour: (“<code>#000000</code>”, “<code>#bd2300</code>”)</li>\\n\\t # <li>rgb(•••, •••, •••) — red, green and blue channels’ values: (“<code>rgb(200, 100, 0)</code>”)</li>\\n\\t # <li>rgb(•••%, •••%, •••%) — same as above, but in %: (“<code>rgb(100%, 175%, 0%)</code>”)</li>\\n\\t # <li>rgba(•••, •••, •••, •••) — red, green and blue channels’ values: (“<code>rgba(200, 100, 0, .5)</code>”)</li>\\n\\t # <li>rgba(•••%, •••%, •••%, •••%) — same as above, but in %: (“<code>rgba(100%, 175%, 0%, 50%)</code>”)</li>\\n\\t # <li>hsb(•••, •••, •••) — hue, saturation and brightness values: (“<code>hsb(0.5, 0.25, 1)</code>”)</li>\\n\\t # <li>hsb(•••%, •••%, •••%) — same as above, but in %</li>\\n\\t # <li>hsba(•••, •••, •••, •••) — same as above, but with opacity</li>\\n\\t # <li>hsl(•••, •••, •••) — almost the same as hsb, see <a href=\\\"http://en.wikipedia.org/wiki/HSL_and_HSV\\\" title=\\\"HSL and HSV - Wikipedia, the free encyclopedia\\\">Wikipedia page</a></li>\\n\\t # <li>hsl(•••%, •••%, •••%) — same as above, but in %</li>\\n\\t # <li>hsla(•••, •••, •••, •••) — same as above, but with opacity</li>\\n\\t # <li>Optionally for hsb and hsl you could specify hue as a degree: “<code>hsl(240deg, 1, .5)</code>” or, if you want to go fancy, “<code>hsl(240°, 1, .5)</code>”</li>\\n\\t # </ul>\\n\\t \\\\*/\\n\\t elproto.attr = function (name, value) {\\n\\t if (this.removed) {\\n\\t return this;\\n\\t }\\n\\t if (name == null) {\\n\\t var res = {};\\n\\t for (var a in this.attrs) if (this.attrs[has](a)) {\\n\\t res[a] = this.attrs[a];\\n\\t }\\n\\t res.gradient && res.fill == \\\"none\\\" && (res.fill = res.gradient) && delete res.gradient;\\n\\t res.transform = this._.transform;\\n\\t return res;\\n\\t }\\n\\t if (value == null && R.is(name, \\\"string\\\")) {\\n\\t if (name == \\\"fill\\\" && this.attrs.fill == \\\"none\\\" && this.attrs.gradient) {\\n\\t return this.attrs.gradient;\\n\\t }\\n\\t if (name == \\\"transform\\\") {\\n\\t return this._.transform;\\n\\t }\\n\\t var names = name.split(separator),\\n\\t out = {};\\n\\t for (var i = 0, ii = names.length; i < ii; i++) {\\n\\t name = names[i];\\n\\t if (name in this.attrs) {\\n\\t out[name] = this.attrs[name];\\n\\t } else if (R.is(this.paper.customAttributes[name], \\\"function\\\")) {\\n\\t out[name] = this.paper.customAttributes[name].def;\\n\\t } else {\\n\\t out[name] = R._availableAttrs[name];\\n\\t }\\n\\t }\\n\\t return ii - 1 ? out : out[names[0]];\\n\\t }\\n\\t if (value == null && R.is(name, \\\"array\\\")) {\\n\\t out = {};\\n\\t for (i = 0, ii = name.length; i < ii; i++) {\\n\\t out[name[i]] = this.attr(name[i]);\\n\\t }\\n\\t return out;\\n\\t }\\n\\t if (value != null) {\\n\\t var params = {};\\n\\t params[name] = value;\\n\\t } else if (name != null && R.is(name, \\\"object\\\")) {\\n\\t params = name;\\n\\t }\\n\\t for (var key in params) {\\n\\t eve(\\\"raphael.attr.\\\" + key + \\\".\\\" + this.id, this, params[key]);\\n\\t }\\n\\t for (key in this.paper.customAttributes) if (this.paper.customAttributes[has](key) && params[has](key) && R.is(this.paper.customAttributes[key], \\\"function\\\")) {\\n\\t var par = this.paper.customAttributes[key].apply(this, [].concat(params[key]));\\n\\t this.attrs[key] = params[key];\\n\\t for (var subkey in par) if (par[has](subkey)) {\\n\\t params[subkey] = par[subkey];\\n\\t }\\n\\t }\\n\\t setFillAndStroke(this, params);\\n\\t return this;\\n\\t };\\n\\t /*\\\\\\n\\t * Element.toFront\\n\\t [ method ]\\n\\t **\\n\\t * Moves the element so it is the closest to the viewer’s eyes, on top of other elements.\\n\\t = (object) @Element\\n\\t \\\\*/\\n\\t elproto.toFront = function () {\\n\\t if (this.removed) {\\n\\t return this;\\n\\t }\\n\\t var node = getRealNode(this.node);\\n\\t node.parentNode.appendChild(node);\\n\\t var svg = this.paper;\\n\\t svg.top != this && R._tofront(this, svg);\\n\\t return this;\\n\\t };\\n\\t /*\\\\\\n\\t * Element.toBack\\n\\t [ method ]\\n\\t **\\n\\t * Moves the element so it is the furthest from the viewer’s eyes, behind other elements.\\n\\t = (object) @Element\\n\\t \\\\*/\\n\\t elproto.toBack = function () {\\n\\t if (this.removed) {\\n\\t return this;\\n\\t }\\n\\t var node = getRealNode(this.node);\\n\\t var parentNode = node.parentNode;\\n\\t parentNode.insertBefore(node, parentNode.firstChild);\\n\\t R._toback(this, this.paper);\\n\\t var svg = this.paper;\\n\\t return this;\\n\\t };\\n\\t /*\\\\\\n\\t * Element.insertAfter\\n\\t [ method ]\\n\\t **\\n\\t * Inserts current object after the given one.\\n\\t = (object) @Element\\n\\t \\\\*/\\n\\t elproto.insertAfter = function (element) {\\n\\t if (this.removed || !element) {\\n\\t return this;\\n\\t }\\n\\n\\t var node = getRealNode(this.node);\\n\\t var afterNode = getRealNode(element.node || element[element.length - 1].node);\\n\\t if (afterNode.nextSibling) {\\n\\t afterNode.parentNode.insertBefore(node, afterNode.nextSibling);\\n\\t } else {\\n\\t afterNode.parentNode.appendChild(node);\\n\\t }\\n\\t R._insertafter(this, element, this.paper);\\n\\t return this;\\n\\t };\\n\\t /*\\\\\\n\\t * Element.insertBefore\\n\\t [ method ]\\n\\t **\\n\\t * Inserts current object before the given one.\\n\\t = (object) @Element\\n\\t \\\\*/\\n\\t elproto.insertBefore = function (element) {\\n\\t if (this.removed || !element) {\\n\\t return this;\\n\\t }\\n\\n\\t var node = getRealNode(this.node);\\n\\t var beforeNode = getRealNode(element.node || element[0].node);\\n\\t beforeNode.parentNode.insertBefore(node, beforeNode);\\n\\t R._insertbefore(this, element, this.paper);\\n\\t return this;\\n\\t };\\n\\t elproto.blur = function (size) {\\n\\t // Experimental. No Safari support. Use it on your own risk.\\n\\t var t = this;\\n\\t if (+size !== 0) {\\n\\t var fltr = $(\\\"filter\\\"),\\n\\t blur = $(\\\"feGaussianBlur\\\");\\n\\t t.attrs.blur = size;\\n\\t fltr.id = R.createUUID();\\n\\t $(blur, {stdDeviation: +size || 1.5});\\n\\t fltr.appendChild(blur);\\n\\t t.paper.defs.appendChild(fltr);\\n\\t t._blur = fltr;\\n\\t $(t.node, {filter: \\\"url(#\\\" + fltr.id + \\\")\\\"});\\n\\t } else {\\n\\t if (t._blur) {\\n\\t t._blur.parentNode.removeChild(t._blur);\\n\\t delete t._blur;\\n\\t delete t.attrs.blur;\\n\\t }\\n\\t t.node.removeAttribute(\\\"filter\\\");\\n\\t }\\n\\t return t;\\n\\t };\\n\\t R._engine.circle = function (svg, x, y, r) {\\n\\t var el = $(\\\"circle\\\");\\n\\t svg.canvas && svg.canvas.appendChild(el);\\n\\t var res = new Element(el, svg);\\n\\t res.attrs = {cx: x, cy: y, r: r, fill: \\\"none\\\", stroke: \\\"#000\\\"};\\n\\t res.type = \\\"circle\\\";\\n\\t $(el, res.attrs);\\n\\t return res;\\n\\t };\\n\\t R._engine.rect = function (svg, x, y, w, h, r) {\\n\\t var el = $(\\\"rect\\\");\\n\\t svg.canvas && svg.canvas.appendChild(el);\\n\\t var res = new Element(el, svg);\\n\\t res.attrs = {x: x, y: y, width: w, height: h, rx: r || 0, ry: r || 0, fill: \\\"none\\\", stroke: \\\"#000\\\"};\\n\\t res.type = \\\"rect\\\";\\n\\t $(el, res.attrs);\\n\\t return res;\\n\\t };\\n\\t R._engine.ellipse = function (svg, x, y, rx, ry) {\\n\\t var el = $(\\\"ellipse\\\");\\n\\t svg.canvas && svg.canvas.appendChild(el);\\n\\t var res = new Element(el, svg);\\n\\t res.attrs = {cx: x, cy: y, rx: rx, ry: ry, fill: \\\"none\\\", stroke: \\\"#000\\\"};\\n\\t res.type = \\\"ellipse\\\";\\n\\t $(el, res.attrs);\\n\\t return res;\\n\\t };\\n\\t R._engine.image = function (svg, src, x, y, w, h) {\\n\\t var el = $(\\\"image\\\");\\n\\t $(el, {x: x, y: y, width: w, height: h, preserveAspectRatio: \\\"none\\\"});\\n\\t el.setAttributeNS(xlink, \\\"href\\\", src);\\n\\t svg.canvas && svg.canvas.appendChild(el);\\n\\t var res = new Element(el, svg);\\n\\t res.attrs = {x: x, y: y, width: w, height: h, src: src};\\n\\t res.type = \\\"image\\\";\\n\\t return res;\\n\\t };\\n\\t R._engine.text = function (svg, x, y, text) {\\n\\t var el = $(\\\"text\\\");\\n\\t svg.canvas && svg.canvas.appendChild(el);\\n\\t var res = new Element(el, svg);\\n\\t res.attrs = {\\n\\t x: x,\\n\\t y: y,\\n\\t \\\"text-anchor\\\": \\\"middle\\\",\\n\\t text: text,\\n\\t \\\"font-family\\\": R._availableAttrs[\\\"font-family\\\"],\\n\\t \\\"font-size\\\": R._availableAttrs[\\\"font-size\\\"],\\n\\t stroke: \\\"none\\\",\\n\\t fill: \\\"#000\\\"\\n\\t };\\n\\t res.type = \\\"text\\\";\\n\\t setFillAndStroke(res, res.attrs);\\n\\t return res;\\n\\t };\\n\\t R._engine.setSize = function (width, height) {\\n\\t this.width = width || this.width;\\n\\t this.height = height || this.height;\\n\\t this.canvas.setAttribute(\\\"width\\\", this.width);\\n\\t this.canvas.setAttribute(\\\"height\\\", this.height);\\n\\t if (this._viewBox) {\\n\\t this.setViewBox.apply(this, this._viewBox);\\n\\t }\\n\\t return this;\\n\\t };\\n\\t R._engine.create = function () {\\n\\t var con = R._getContainer.apply(0, arguments),\\n\\t container = con && con.container,\\n\\t x = con.x,\\n\\t y = con.y,\\n\\t width = con.width,\\n\\t height = con.height;\\n\\t if (!container) {\\n\\t throw new Error(\\\"SVG container not found.\\\");\\n\\t }\\n\\t var cnvs = $(\\\"svg\\\"),\\n\\t css = \\\"overflow:hidden;\\\",\\n\\t isFloating;\\n\\t x = x || 0;\\n\\t y = y || 0;\\n\\t width = width || 512;\\n\\t height = height || 342;\\n\\t $(cnvs, {\\n\\t height: height,\\n\\t version: 1.1,\\n\\t width: width,\\n\\t xmlns: \\\"http://www.w3.org/2000/svg\\\",\\n\\t \\\"xmlns:xlink\\\": \\\"http://www.w3.org/1999/xlink\\\"\\n\\t });\\n\\t if (container == 1) {\\n\\t cnvs.style.cssText = css + \\\"position:absolute;left:\\\" + x + \\\"px;top:\\\" + y + \\\"px\\\";\\n\\t R._g.doc.body.appendChild(cnvs);\\n\\t isFloating = 1;\\n\\t } else {\\n\\t cnvs.style.cssText = css + \\\"position:relative\\\";\\n\\t if (container.firstChild) {\\n\\t container.insertBefore(cnvs, container.firstChild);\\n\\t } else {\\n\\t container.appendChild(cnvs);\\n\\t }\\n\\t }\\n\\t container = new R._Paper;\\n\\t container.width = width;\\n\\t container.height = height;\\n\\t container.canvas = cnvs;\\n\\t container.clear();\\n\\t container._left = container._top = 0;\\n\\t isFloating && (container.renderfix = function () {});\\n\\t container.renderfix();\\n\\t return container;\\n\\t };\\n\\t R._engine.setViewBox = function (x, y, w, h, fit) {\\n\\t eve(\\\"raphael.setViewBox\\\", this, this._viewBox, [x, y, w, h, fit]);\\n\\t var paperSize = this.getSize(),\\n\\t size = mmax(w / paperSize.width, h / paperSize.height),\\n\\t top = this.top,\\n\\t aspectRatio = fit ? \\\"xMidYMid meet\\\" : \\\"xMinYMin\\\",\\n\\t vb,\\n\\t sw;\\n\\t if (x == null) {\\n\\t if (this._vbSize) {\\n\\t size = 1;\\n\\t }\\n\\t delete this._vbSize;\\n\\t vb = \\\"0 0 \\\" + this.width + S + this.height;\\n\\t } else {\\n\\t this._vbSize = size;\\n\\t vb = x + S + y + S + w + S + h;\\n\\t }\\n\\t $(this.canvas, {\\n\\t viewBox: vb,\\n\\t preserveAspectRatio: aspectRatio\\n\\t });\\n\\t while (size && top) {\\n\\t sw = \\\"stroke-width\\\" in top.attrs ? top.attrs[\\\"stroke-width\\\"] : 1;\\n\\t top.attr({\\\"stroke-width\\\": sw});\\n\\t top._.dirty = 1;\\n\\t top._.dirtyT = 1;\\n\\t top = top.prev;\\n\\t }\\n\\t this._viewBox = [x, y, w, h, !!fit];\\n\\t return this;\\n\\t };\\n\\t /*\\\\\\n\\t * Paper.renderfix\\n\\t [ method ]\\n\\t **\\n\\t * Fixes the issue of Firefox and IE9 regarding subpixel rendering. If paper is dependent\\n\\t * on other elements after reflow it could shift half pixel which cause for lines to lost their crispness.\\n\\t * This method fixes the issue.\\n\\t **\\n\\t Special thanks to Mariusz Nowak (http://www.medikoo.com/) for this method.\\n\\t \\\\*/\\n\\t R.prototype.renderfix = function () {\\n\\t var cnvs = this.canvas,\\n\\t s = cnvs.style,\\n\\t pos;\\n\\t try {\\n\\t pos = cnvs.getScreenCTM() || cnvs.createSVGMatrix();\\n\\t } catch (e) {\\n\\t pos = cnvs.createSVGMatrix();\\n\\t }\\n\\t var left = -pos.e % 1,\\n\\t top = -pos.f % 1;\\n\\t if (left || top) {\\n\\t if (left) {\\n\\t this._left = (this._left + left) % 1;\\n\\t s.left = this._left + \\\"px\\\";\\n\\t }\\n\\t if (top) {\\n\\t this._top = (this._top + top) % 1;\\n\\t s.top = this._top + \\\"px\\\";\\n\\t }\\n\\t }\\n\\t };\\n\\t /*\\\\\\n\\t * Paper.clear\\n\\t [ method ]\\n\\t **\\n\\t * Clears the paper, i.e. removes all the elements.\\n\\t \\\\*/\\n\\t R.prototype.clear = function () {\\n\\t R.eve(\\\"raphael.clear\\\", this);\\n\\t var c = this.canvas;\\n\\t while (c.firstChild) {\\n\\t c.removeChild(c.firstChild);\\n\\t }\\n\\t this.bottom = this.top = null;\\n\\t (this.desc = $(\\\"desc\\\")).appendChild(R._g.doc.createTextNode(\\\"Created with Rapha\\\\xebl \\\" + R.version));\\n\\t c.appendChild(this.desc);\\n\\t c.appendChild(this.defs = $(\\\"defs\\\"));\\n\\t };\\n\\t /*\\\\\\n\\t * Paper.remove\\n\\t [ method ]\\n\\t **\\n\\t * Removes the paper from the DOM.\\n\\t \\\\*/\\n\\t R.prototype.remove = function () {\\n\\t eve(\\\"raphael.remove\\\", this);\\n\\t this.canvas.parentNode && this.canvas.parentNode.removeChild(this.canvas);\\n\\t for (var i in this) {\\n\\t this[i] = typeof this[i] == \\\"function\\\" ? R._removedFactory(i) : null;\\n\\t }\\n\\t };\\n\\t var setproto = R.st;\\n\\t for (var method in elproto) if (elproto[has](method) && !setproto[has](method)) {\\n\\t setproto[method] = (function (methodname) {\\n\\t return function () {\\n\\t var arg = arguments;\\n\\t return this.forEach(function (el) {\\n\\t el[methodname].apply(el, arg);\\n\\t });\\n\\t };\\n\\t })(method);\\n\\t }\\n\\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\\n\\n\\n/***/ },\\n/* 4 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(1)], __WEBPACK_AMD_DEFINE_RESULT__ = function(R) {\\n\\t if (R && !R.vml) {\\n\\t return;\\n\\t }\\n\\n\\t var has = \\\"hasOwnProperty\\\",\\n\\t Str = String,\\n\\t toFloat = parseFloat,\\n\\t math = Math,\\n\\t round = math.round,\\n\\t mmax = math.max,\\n\\t mmin = math.min,\\n\\t abs = math.abs,\\n\\t fillString = \\\"fill\\\",\\n\\t separator = /[, ]+/,\\n\\t eve = R.eve,\\n\\t ms = \\\" progid:DXImageTransform.Microsoft\\\",\\n\\t S = \\\" \\\",\\n\\t E = \\\"\\\",\\n\\t map = {M: \\\"m\\\", L: \\\"l\\\", C: \\\"c\\\", Z: \\\"x\\\", m: \\\"t\\\", l: \\\"r\\\", c: \\\"v\\\", z: \\\"x\\\"},\\n\\t bites = /([clmz]),?([^clmz]*)/gi,\\n\\t blurregexp = / progid:\\\\S+Blur\\\\([^\\\\)]+\\\\)/g,\\n\\t val = /-?[^,\\\\s-]+/g,\\n\\t cssDot = \\\"position:absolute;left:0;top:0;width:1px;height:1px;behavior:url(#default#VML)\\\",\\n\\t zoom = 21600,\\n\\t pathTypes = {path: 1, rect: 1, image: 1},\\n\\t ovalTypes = {circle: 1, ellipse: 1},\\n\\t path2vml = function (path) {\\n\\t var total = /[ahqstv]/ig,\\n\\t command = R._pathToAbsolute;\\n\\t Str(path).match(total) && (command = R._path2curve);\\n\\t total = /[clmz]/g;\\n\\t if (command == R._pathToAbsolute && !Str(path).match(total)) {\\n\\t var res = Str(path).replace(bites, function (all, command, args) {\\n\\t var vals = [],\\n\\t isMove = command.toLowerCase() == \\\"m\\\",\\n\\t res = map[command];\\n\\t args.replace(val, function (value) {\\n\\t if (isMove && vals.length == 2) {\\n\\t res += vals + map[command == \\\"m\\\" ? \\\"l\\\" : \\\"L\\\"];\\n\\t vals = [];\\n\\t }\\n\\t vals.push(round(value * zoom));\\n\\t });\\n\\t return res + vals;\\n\\t });\\n\\t return res;\\n\\t }\\n\\t var pa = command(path), p, r;\\n\\t res = [];\\n\\t for (var i = 0, ii = pa.length; i < ii; i++) {\\n\\t p = pa[i];\\n\\t r = pa[i][0].toLowerCase();\\n\\t r == \\\"z\\\" && (r = \\\"x\\\");\\n\\t for (var j = 1, jj = p.length; j < jj; j++) {\\n\\t r += round(p[j] * zoom) + (j != jj - 1 ? \\\",\\\" : E);\\n\\t }\\n\\t res.push(r);\\n\\t }\\n\\t return res.join(S);\\n\\t },\\n\\t compensation = function (deg, dx, dy) {\\n\\t var m = R.matrix();\\n\\t m.rotate(-deg, .5, .5);\\n\\t return {\\n\\t dx: m.x(dx, dy),\\n\\t dy: m.y(dx, dy)\\n\\t };\\n\\t },\\n\\t setCoords = function (p, sx, sy, dx, dy, deg) {\\n\\t var _ = p._,\\n\\t m = p.matrix,\\n\\t fillpos = _.fillpos,\\n\\t o = p.node,\\n\\t s = o.style,\\n\\t y = 1,\\n\\t flip = \\\"\\\",\\n\\t dxdy,\\n\\t kx = zoom / sx,\\n\\t ky = zoom / sy;\\n\\t s.visibility = \\\"hidden\\\";\\n\\t if (!sx || !sy) {\\n\\t return;\\n\\t }\\n\\t o.coordsize = abs(kx) + S + abs(ky);\\n\\t s.rotation = deg * (sx * sy < 0 ? -1 : 1);\\n\\t if (deg) {\\n\\t var c = compensation(deg, dx, dy);\\n\\t dx = c.dx;\\n\\t dy = c.dy;\\n\\t }\\n\\t sx < 0 && (flip += \\\"x\\\");\\n\\t sy < 0 && (flip += \\\" y\\\") && (y = -1);\\n\\t s.flip = flip;\\n\\t o.coordorigin = (dx * -kx) + S + (dy * -ky);\\n\\t if (fillpos || _.fillsize) {\\n\\t var fill = o.getElementsByTagName(fillString);\\n\\t fill = fill && fill[0];\\n\\t o.removeChild(fill);\\n\\t if (fillpos) {\\n\\t c = compensation(deg, m.x(fillpos[0], fillpos[1]), m.y(fillpos[0], fillpos[1]));\\n\\t fill.position = c.dx * y + S + c.dy * y;\\n\\t }\\n\\t if (_.fillsize) {\\n\\t fill.size = _.fillsize[0] * abs(sx) + S + _.fillsize[1] * abs(sy);\\n\\t }\\n\\t o.appendChild(fill);\\n\\t }\\n\\t s.visibility = \\\"visible\\\";\\n\\t };\\n\\t R.toString = function () {\\n\\t return \\\"Your browser doesn\\\\u2019t support SVG. Falling down to VML.\\\\nYou are running Rapha\\\\xebl \\\" + this.version;\\n\\t };\\n\\t var addArrow = function (o, value, isEnd) {\\n\\t var values = Str(value).toLowerCase().split(\\\"-\\\"),\\n\\t se = isEnd ? \\\"end\\\" : \\\"start\\\",\\n\\t i = values.length,\\n\\t type = \\\"classic\\\",\\n\\t w = \\\"medium\\\",\\n\\t h = \\\"medium\\\";\\n\\t while (i--) {\\n\\t switch (values[i]) {\\n\\t case \\\"block\\\":\\n\\t case \\\"classic\\\":\\n\\t case \\\"oval\\\":\\n\\t case \\\"diamond\\\":\\n\\t case \\\"open\\\":\\n\\t case \\\"none\\\":\\n\\t type = values[i];\\n\\t break;\\n\\t case \\\"wide\\\":\\n\\t case \\\"narrow\\\": h = values[i]; break;\\n\\t case \\\"long\\\":\\n\\t case \\\"short\\\": w = values[i]; break;\\n\\t }\\n\\t }\\n\\t var stroke = o.node.getElementsByTagName(\\\"stroke\\\")[0];\\n\\t stroke[se + \\\"arrow\\\"] = type;\\n\\t stroke[se + \\\"arrowlength\\\"] = w;\\n\\t stroke[se + \\\"arrowwidth\\\"] = h;\\n\\t },\\n\\t setFillAndStroke = function (o, params) {\\n\\t // o.paper.canvas.style.display = \\\"none\\\";\\n\\t o.attrs = o.attrs || {};\\n\\t var node = o.node,\\n\\t a = o.attrs,\\n\\t s = node.style,\\n\\t xy,\\n\\t newpath = pathTypes[o.type] && (params.x != a.x || params.y != a.y || params.width != a.width || params.height != a.height || params.cx != a.cx || params.cy != a.cy || params.rx != a.rx || params.ry != a.ry || params.r != a.r),\\n\\t isOval = ovalTypes[o.type] && (a.cx != params.cx || a.cy != params.cy || a.r != params.r || a.rx != params.rx || a.ry != params.ry),\\n\\t res = o;\\n\\n\\n\\t for (var par in params) if (params[has](par)) {\\n\\t a[par] = params[par];\\n\\t }\\n\\t if (newpath) {\\n\\t a.path = R._getPath[o.type](o);\\n\\t o._.dirty = 1;\\n\\t }\\n\\t params.href && (node.href = params.href);\\n\\t params.title && (node.title = params.title);\\n\\t params.target && (node.target = params.target);\\n\\t params.cursor && (s.cursor = params.cursor);\\n\\t \\\"blur\\\" in params && o.blur(params.blur);\\n\\t if (params.path && o.type == \\\"path\\\" || newpath) {\\n\\t node.path = path2vml(~Str(a.path).toLowerCase().indexOf(\\\"r\\\") ? R._pathToAbsolute(a.path) : a.path);\\n\\t o._.dirty = 1;\\n\\t if (o.type == \\\"image\\\") {\\n\\t o._.fillpos = [a.x, a.y];\\n\\t o._.fillsize = [a.width, a.height];\\n\\t setCoords(o, 1, 1, 0, 0, 0);\\n\\t }\\n\\t }\\n\\t \\\"transform\\\" in params && o.transform(params.transform);\\n\\t if (isOval) {\\n\\t var cx = +a.cx,\\n\\t cy = +a.cy,\\n\\t rx = +a.rx || +a.r || 0,\\n\\t ry = +a.ry || +a.r || 0;\\n\\t node.path = R.format(\\\"ar{0},{1},{2},{3},{4},{1},{4},{1}x\\\", round((cx - rx) * zoom), round((cy - ry) * zoom), round((cx + rx) * zoom), round((cy + ry) * zoom), round(cx * zoom));\\n\\t o._.dirty = 1;\\n\\t }\\n\\t if (\\\"clip-rect\\\" in params) {\\n\\t var rect = Str(params[\\\"clip-rect\\\"]).split(separator);\\n\\t if (rect.length == 4) {\\n\\t rect[2] = +rect[2] + (+rect[0]);\\n\\t rect[3] = +rect[3] + (+rect[1]);\\n\\t var div = node.clipRect || R._g.doc.createElement(\\\"div\\\"),\\n\\t dstyle = div.style;\\n\\t dstyle.clip = R.format(\\\"rect({1}px {2}px {3}px {0}px)\\\", rect);\\n\\t if (!node.clipRect) {\\n\\t dstyle.position = \\\"absolute\\\";\\n\\t dstyle.top = 0;\\n\\t dstyle.left = 0;\\n\\t dstyle.width = o.paper.width + \\\"px\\\";\\n\\t dstyle.height = o.paper.height + \\\"px\\\";\\n\\t node.parentNode.insertBefore(div, node);\\n\\t div.appendChild(node);\\n\\t node.clipRect = div;\\n\\t }\\n\\t }\\n\\t if (!params[\\\"clip-rect\\\"]) {\\n\\t node.clipRect && (node.clipRect.style.clip = \\\"auto\\\");\\n\\t }\\n\\t }\\n\\t if (o.textpath) {\\n\\t var textpathStyle = o.textpath.style;\\n\\t params.font && (textpathStyle.font = params.font);\\n\\t params[\\\"font-family\\\"] && (textpathStyle.fontFamily = '\\\"' + params[\\\"font-family\\\"].split(\\\",\\\")[0].replace(/^['\\\"]+|['\\\"]+$/g, E) + '\\\"');\\n\\t params[\\\"font-size\\\"] && (textpathStyle.fontSize = params[\\\"font-size\\\"]);\\n\\t params[\\\"font-weight\\\"] && (textpathStyle.fontWeight = params[\\\"font-weight\\\"]);\\n\\t params[\\\"font-style\\\"] && (textpathStyle.fontStyle = params[\\\"font-style\\\"]);\\n\\t }\\n\\t if (\\\"arrow-start\\\" in params) {\\n\\t addArrow(res, params[\\\"arrow-start\\\"]);\\n\\t }\\n\\t if (\\\"arrow-end\\\" in params) {\\n\\t addArrow(res, params[\\\"arrow-end\\\"], 1);\\n\\t }\\n\\t if (params.opacity != null ||\\n\\t params.fill != null ||\\n\\t params.src != null ||\\n\\t params.stroke != null ||\\n\\t params[\\\"stroke-width\\\"] != null ||\\n\\t params[\\\"stroke-opacity\\\"] != null ||\\n\\t params[\\\"fill-opacity\\\"] != null ||\\n\\t params[\\\"stroke-dasharray\\\"] != null ||\\n\\t params[\\\"stroke-miterlimit\\\"] != null ||\\n\\t params[\\\"stroke-linejoin\\\"] != null ||\\n\\t params[\\\"stroke-linecap\\\"] != null) {\\n\\t var fill = node.getElementsByTagName(fillString),\\n\\t newfill = false;\\n\\t fill = fill && fill[0];\\n\\t !fill && (newfill = fill = createNode(fillString));\\n\\t if (o.type == \\\"image\\\" && params.src) {\\n\\t fill.src = params.src;\\n\\t }\\n\\t params.fill && (fill.on = true);\\n\\t if (fill.on == null || params.fill == \\\"none\\\" || params.fill === null) {\\n\\t fill.on = false;\\n\\t }\\n\\t if (fill.on && params.fill) {\\n\\t var isURL = Str(params.fill).match(R._ISURL);\\n\\t if (isURL) {\\n\\t fill.parentNode == node && node.removeChild(fill);\\n\\t fill.rotate = true;\\n\\t fill.src = isURL[1];\\n\\t fill.type = \\\"tile\\\";\\n\\t var bbox = o.getBBox(1);\\n\\t fill.position = bbox.x + S + bbox.y;\\n\\t o._.fillpos = [bbox.x, bbox.y];\\n\\n\\t R._preload(isURL[1], function () {\\n\\t o._.fillsize = [this.offsetWidth, this.offsetHeight];\\n\\t });\\n\\t } else {\\n\\t fill.color = R.getRGB(params.fill).hex;\\n\\t fill.src = E;\\n\\t fill.type = \\\"solid\\\";\\n\\t if (R.getRGB(params.fill).error && (res.type in {circle: 1, ellipse: 1} || Str(params.fill).charAt() != \\\"r\\\") && addGradientFill(res, params.fill, fill)) {\\n\\t a.fill = \\\"none\\\";\\n\\t a.gradient = params.fill;\\n\\t fill.rotate = false;\\n\\t }\\n\\t }\\n\\t }\\n\\t if (\\\"fill-opacity\\\" in params || \\\"opacity\\\" in params) {\\n\\t var opacity = ((+a[\\\"fill-opacity\\\"] + 1 || 2) - 1) * ((+a.opacity + 1 || 2) - 1) * ((+R.getRGB(params.fill).o + 1 || 2) - 1);\\n\\t opacity = mmin(mmax(opacity, 0), 1);\\n\\t fill.opacity = opacity;\\n\\t if (fill.src) {\\n\\t fill.color = \\\"none\\\";\\n\\t }\\n\\t }\\n\\t node.appendChild(fill);\\n\\t var stroke = (node.getElementsByTagName(\\\"stroke\\\") && node.getElementsByTagName(\\\"stroke\\\")[0]),\\n\\t newstroke = false;\\n\\t !stroke && (newstroke = stroke = createNode(\\\"stroke\\\"));\\n\\t if ((params.stroke && params.stroke != \\\"none\\\") ||\\n\\t params[\\\"stroke-width\\\"] ||\\n\\t params[\\\"stroke-opacity\\\"] != null ||\\n\\t params[\\\"stroke-dasharray\\\"] ||\\n\\t params[\\\"stroke-miterlimit\\\"] ||\\n\\t params[\\\"stroke-linejoin\\\"] ||\\n\\t params[\\\"stroke-linecap\\\"]) {\\n\\t stroke.on = true;\\n\\t }\\n\\t (params.stroke == \\\"none\\\" || params.stroke === null || stroke.on == null || params.stroke == 0 || params[\\\"stroke-width\\\"] == 0) && (stroke.on = false);\\n\\t var strokeColor = R.getRGB(params.stroke);\\n\\t stroke.on && params.stroke && (stroke.color = strokeColor.hex);\\n\\t opacity = ((+a[\\\"stroke-opacity\\\"] + 1 || 2) - 1) * ((+a.opacity + 1 || 2) - 1) * ((+strokeColor.o + 1 || 2) - 1);\\n\\t var width = (toFloat(params[\\\"stroke-width\\\"]) || 1) * .75;\\n\\t opacity = mmin(mmax(opacity, 0), 1);\\n\\t params[\\\"stroke-width\\\"] == null && (width = a[\\\"stroke-width\\\"]);\\n\\t params[\\\"stroke-width\\\"] && (stroke.weight = width);\\n\\t width && width < 1 && (opacity *= width) && (stroke.weight = 1);\\n\\t stroke.opacity = opacity;\\n\\n\\t params[\\\"stroke-linejoin\\\"] && (stroke.joinstyle = params[\\\"stroke-linejoin\\\"] || \\\"miter\\\");\\n\\t stroke.miterlimit = params[\\\"stroke-miterlimit\\\"] || 8;\\n\\t params[\\\"stroke-linecap\\\"] && (stroke.endcap = params[\\\"stroke-linecap\\\"] == \\\"butt\\\" ? \\\"flat\\\" : params[\\\"stroke-linecap\\\"] == \\\"square\\\" ? \\\"square\\\" : \\\"round\\\");\\n\\t if (\\\"stroke-dasharray\\\" in params) {\\n\\t var dasharray = {\\n\\t \\\"-\\\": \\\"shortdash\\\",\\n\\t \\\".\\\": \\\"shortdot\\\",\\n\\t \\\"-.\\\": \\\"shortdashdot\\\",\\n\\t \\\"-..\\\": \\\"shortdashdotdot\\\",\\n\\t \\\". \\\": \\\"dot\\\",\\n\\t \\\"- \\\": \\\"dash\\\",\\n\\t \\\"--\\\": \\\"longdash\\\",\\n\\t \\\"- .\\\": \\\"dashdot\\\",\\n\\t \\\"--.\\\": \\\"longdashdot\\\",\\n\\t \\\"--..\\\": \\\"longdashdotdot\\\"\\n\\t };\\n\\t stroke.dashstyle = dasharray[has](params[\\\"stroke-dasharray\\\"]) ? dasharray[params[\\\"stroke-dasharray\\\"]] : E;\\n\\t }\\n\\t newstroke && node.appendChild(stroke);\\n\\t }\\n\\t if (res.type == \\\"text\\\") {\\n\\t res.paper.canvas.style.display = E;\\n\\t var span = res.paper.span,\\n\\t m = 100,\\n\\t fontSize = a.font && a.font.match(/\\\\d+(?:\\\\.\\\\d*)?(?=px)/);\\n\\t s = span.style;\\n\\t a.font && (s.font = a.font);\\n\\t a[\\\"font-family\\\"] && (s.fontFamily = a[\\\"font-family\\\"]);\\n\\t a[\\\"font-weight\\\"] && (s.fontWeight = a[\\\"font-weight\\\"]);\\n\\t a[\\\"font-style\\\"] && (s.fontStyle = a[\\\"font-style\\\"]);\\n\\t fontSize = toFloat(a[\\\"font-size\\\"] || fontSize && fontSize[0]) || 10;\\n\\t s.fontSize = fontSize * m + \\\"px\\\";\\n\\t res.textpath.string && (span.innerHTML = Str(res.textpath.string).replace(/</g, \\\"<\\\").replace(/&/g, \\\"&\\\").replace(/\\\\n/g, \\\"<br>\\\"));\\n\\t var brect = span.getBoundingClientRect();\\n\\t res.W = a.w = (brect.right - brect.left) / m;\\n\\t res.H = a.h = (brect.bottom - brect.top) / m;\\n\\t // res.paper.canvas.style.display = \\\"none\\\";\\n\\t res.X = a.x;\\n\\t res.Y = a.y + res.H / 2;\\n\\n\\t (\\\"x\\\" in params || \\\"y\\\" in params) && (res.path.v = R.format(\\\"m{0},{1}l{2},{1}\\\", round(a.x * zoom), round(a.y * zoom), round(a.x * zoom) + 1));\\n\\t var dirtyattrs = [\\\"x\\\", \\\"y\\\", \\\"text\\\", \\\"font\\\", \\\"font-family\\\", \\\"font-weight\\\", \\\"font-style\\\", \\\"font-size\\\"];\\n\\t for (var d = 0, dd = dirtyattrs.length; d < dd; d++) if (dirtyattrs[d] in params) {\\n\\t res._.dirty = 1;\\n\\t break;\\n\\t }\\n\\n\\t // text-anchor emulation\\n\\t switch (a[\\\"text-anchor\\\"]) {\\n\\t case \\\"start\\\":\\n\\t res.textpath.style[\\\"v-text-align\\\"] = \\\"left\\\";\\n\\t res.bbx = res.W / 2;\\n\\t break;\\n\\t case \\\"end\\\":\\n\\t res.textpath.style[\\\"v-text-align\\\"] = \\\"right\\\";\\n\\t res.bbx = -res.W / 2;\\n\\t break;\\n\\t default:\\n\\t res.textpath.style[\\\"v-text-align\\\"] = \\\"center\\\";\\n\\t res.bbx = 0;\\n\\t break;\\n\\t }\\n\\t res.textpath.style[\\\"v-text-kern\\\"] = true;\\n\\t }\\n\\t // res.paper.canvas.style.display = E;\\n\\t },\\n\\t addGradientFill = function (o, gradient, fill) {\\n\\t o.attrs = o.attrs || {};\\n\\t var attrs = o.attrs,\\n\\t pow = Math.pow,\\n\\t opacity,\\n\\t oindex,\\n\\t type = \\\"linear\\\",\\n\\t fxfy = \\\".5 .5\\\";\\n\\t o.attrs.gradient = gradient;\\n\\t gradient = Str(gradient).replace(R._radial_gradient, function (all, fx, fy) {\\n\\t type = \\\"radial\\\";\\n\\t if (fx && fy) {\\n\\t fx = toFloat(fx);\\n\\t fy = toFloat(fy);\\n\\t pow(fx - .5, 2) + pow(fy - .5, 2) > .25 && (fy = math.sqrt(.25 - pow(fx - .5, 2)) * ((fy > .5) * 2 - 1) + .5);\\n\\t fxfy = fx + S + fy;\\n\\t }\\n\\t return E;\\n\\t });\\n\\t gradient = gradient.split(/\\\\s*\\\\-\\\\s*/);\\n\\t if (type == \\\"linear\\\") {\\n\\t var angle = gradient.shift();\\n\\t angle = -toFloat(angle);\\n\\t if (isNaN(angle)) {\\n\\t return null;\\n\\t }\\n\\t }\\n\\t var dots = R._parseDots(gradient);\\n\\t if (!dots) {\\n\\t return null;\\n\\t }\\n\\t o = o.shape || o.node;\\n\\t if (dots.length) {\\n\\t o.removeChild(fill);\\n\\t fill.on = true;\\n\\t fill.method = \\\"none\\\";\\n\\t fill.color = dots[0].color;\\n\\t fill.color2 = dots[dots.length - 1].color;\\n\\t var clrs = [];\\n\\t for (var i = 0, ii = dots.length; i < ii; i++) {\\n\\t dots[i].offset && clrs.push(dots[i].offset + S + dots[i].color);\\n\\t }\\n\\t fill.colors = clrs.length ? clrs.join() : \\\"0% \\\" + fill.color;\\n\\t if (type == \\\"radial\\\") {\\n\\t fill.type = \\\"gradientTitle\\\";\\n\\t fill.focus = \\\"100%\\\";\\n\\t fill.focussize = \\\"0 0\\\";\\n\\t fill.focusposition = fxfy;\\n\\t fill.angle = 0;\\n\\t } else {\\n\\t // fill.rotate= true;\\n\\t fill.type = \\\"gradient\\\";\\n\\t fill.angle = (270 - angle) % 360;\\n\\t }\\n\\t o.appendChild(fill);\\n\\t }\\n\\t return 1;\\n\\t },\\n\\t Element = function (node, vml) {\\n\\t this[0] = this.node = node;\\n\\t node.raphael = true;\\n\\t this.id = R._oid++;\\n\\t node.raphaelid = this.id;\\n\\t this.X = 0;\\n\\t this.Y = 0;\\n\\t this.attrs = {};\\n\\t this.paper = vml;\\n\\t this.matrix = R.matrix();\\n\\t this._ = {\\n\\t transform: [],\\n\\t sx: 1,\\n\\t sy: 1,\\n\\t dx: 0,\\n\\t dy: 0,\\n\\t deg: 0,\\n\\t dirty: 1,\\n\\t dirtyT: 1\\n\\t };\\n\\t !vml.bottom && (vml.bottom = this);\\n\\t this.prev = vml.top;\\n\\t vml.top && (vml.top.next = this);\\n\\t vml.top = this;\\n\\t this.next = null;\\n\\t };\\n\\t var elproto = R.el;\\n\\n\\t Element.prototype = elproto;\\n\\t elproto.constructor = Element;\\n\\t elproto.transform = function (tstr) {\\n\\t if (tstr == null) {\\n\\t return this._.transform;\\n\\t }\\n\\t var vbs = this.paper._viewBoxShift,\\n\\t vbt = vbs ? \\\"s\\\" + [vbs.scale, vbs.scale] + \\\"-1-1t\\\" + [vbs.dx, vbs.dy] : E,\\n\\t oldt;\\n\\t if (vbs) {\\n\\t oldt = tstr = Str(tstr).replace(/\\\\.{3}|\\\\u2026/g, this._.transform || E);\\n\\t }\\n\\t R._extractTransform(this, vbt + tstr);\\n\\t var matrix = this.matrix.clone(),\\n\\t skew = this.skew,\\n\\t o = this.node,\\n\\t split,\\n\\t isGrad = ~Str(this.attrs.fill).indexOf(\\\"-\\\"),\\n\\t isPatt = !Str(this.attrs.fill).indexOf(\\\"url(\\\");\\n\\t matrix.translate(1, 1);\\n\\t if (isPatt || isGrad || this.type == \\\"image\\\") {\\n\\t skew.matrix = \\\"1 0 0 1\\\";\\n\\t skew.offset = \\\"0 0\\\";\\n\\t split = matrix.split();\\n\\t if ((isGrad && split.noRotation) || !split.isSimple) {\\n\\t o.style.filter = matrix.toFilter();\\n\\t var bb = this.getBBox(),\\n\\t bbt = this.getBBox(1),\\n\\t dx = bb.x - bbt.x,\\n\\t dy = bb.y - bbt.y;\\n\\t o.coordorigin = (dx * -zoom) + S + (dy * -zoom);\\n\\t setCoords(this, 1, 1, dx, dy, 0);\\n\\t } else {\\n\\t o.style.filter = E;\\n\\t setCoords(this, split.scalex, split.scaley, split.dx, split.dy, split.rotate);\\n\\t }\\n\\t } else {\\n\\t o.style.filter = E;\\n\\t skew.matrix = Str(matrix);\\n\\t skew.offset = matrix.offset();\\n\\t }\\n\\t if (oldt !== null) { // empty string value is true as well\\n\\t this._.transform = oldt;\\n\\t R._extractTransform(this, oldt);\\n\\t }\\n\\t return this;\\n\\t };\\n\\t elproto.rotate = function (deg, cx, cy) {\\n\\t if (this.removed) {\\n\\t return this;\\n\\t }\\n\\t if (deg == null) {\\n\\t return;\\n\\t }\\n\\t deg = Str(deg).split(separator);\\n\\t if (deg.length - 1) {\\n\\t cx = toFloat(deg[1]);\\n\\t cy = toFloat(deg[2]);\\n\\t }\\n\\t deg = toFloat(deg[0]);\\n\\t (cy == null) && (cx = cy);\\n\\t if (cx == null || cy == null) {\\n\\t var bbox = this.getBBox(1);\\n\\t cx = bbox.x + bbox.width / 2;\\n\\t cy = bbox.y + bbox.height / 2;\\n\\t }\\n\\t this._.dirtyT = 1;\\n\\t this.transform(this._.transform.concat([[\\\"r\\\", deg, cx, cy]]));\\n\\t return this;\\n\\t };\\n\\t elproto.translate = function (dx, dy) {\\n\\t if (this.removed) {\\n\\t return this;\\n\\t }\\n\\t dx = Str(dx).split(separator);\\n\\t if (dx.length - 1) {\\n\\t dy = toFloat(dx[1]);\\n\\t }\\n\\t dx = toFloat(dx[0]) || 0;\\n\\t dy = +dy || 0;\\n\\t if (this._.bbox) {\\n\\t this._.bbox.x += dx;\\n\\t this._.bbox.y += dy;\\n\\t }\\n\\t this.transform(this._.transform.concat([[\\\"t\\\", dx, dy]]));\\n\\t return this;\\n\\t };\\n\\t elproto.scale = function (sx, sy, cx, cy) {\\n\\t if (this.removed) {\\n\\t return this;\\n\\t }\\n\\t sx = Str(sx).split(separator);\\n\\t if (sx.length - 1) {\\n\\t sy = toFloat(sx[1]);\\n\\t cx = toFloat(sx[2]);\\n\\t cy = toFloat(sx[3]);\\n\\t isNaN(cx) && (cx = null);\\n\\t isNaN(cy) && (cy = null);\\n\\t }\\n\\t sx = toFloat(sx[0]);\\n\\t (sy == null) && (sy = sx);\\n\\t (cy == null) && (cx = cy);\\n\\t if (cx == null || cy == null) {\\n\\t var bbox = this.getBBox(1);\\n\\t }\\n\\t cx = cx == null ? bbox.x + bbox.width / 2 : cx;\\n\\t cy = cy == null ? bbox.y + bbox.height / 2 : cy;\\n\\n\\t this.transform(this._.transform.concat([[\\\"s\\\", sx, sy, cx, cy]]));\\n\\t this._.dirtyT = 1;\\n\\t return this;\\n\\t };\\n\\t elproto.hide = function () {\\n\\t !this.removed && (this.node.style.display = \\\"none\\\");\\n\\t return this;\\n\\t };\\n\\t elproto.show = function () {\\n\\t !this.removed && (this.node.style.display = E);\\n\\t return this;\\n\\t };\\n\\t // Needed to fix the vml setViewBox issues\\n\\t elproto.auxGetBBox = R.el.getBBox;\\n\\t elproto.getBBox = function(){\\n\\t var b = this.auxGetBBox();\\n\\t if (this.paper && this.paper._viewBoxShift)\\n\\t {\\n\\t var c = {};\\n\\t var z = 1/this.paper._viewBoxShift.scale;\\n\\t c.x = b.x - this.paper._viewBoxShift.dx;\\n\\t c.x *= z;\\n\\t c.y = b.y - this.paper._viewBoxShift.dy;\\n\\t c.y *= z;\\n\\t c.width = b.width * z;\\n\\t c.height = b.height * z;\\n\\t c.x2 = c.x + c.width;\\n\\t c.y2 = c.y + c.height;\\n\\t return c;\\n\\t }\\n\\t return b;\\n\\t };\\n\\t elproto._getBBox = function () {\\n\\t if (this.removed) {\\n\\t return {};\\n\\t }\\n\\t return {\\n\\t x: this.X + (this.bbx || 0) - this.W / 2,\\n\\t y: this.Y - this.H,\\n\\t width: this.W,\\n\\t height: this.H\\n\\t };\\n\\t };\\n\\t elproto.remove = function () {\\n\\t if (this.removed || !this.node.parentNode) {\\n\\t return;\\n\\t }\\n\\t this.paper.__set__ && this.paper.__set__.exclude(this);\\n\\t R.eve.unbind(\\\"raphael.*.*.\\\" + this.id);\\n\\t R._tear(this, this.paper);\\n\\t this.node.parentNode.removeChild(this.node);\\n\\t this.shape && this.shape.parentNode.removeChild(this.shape);\\n\\t for (var i in this) {\\n\\t this[i] = typeof this[i] == \\\"function\\\" ? R._removedFactory(i) : null;\\n\\t }\\n\\t this.removed = true;\\n\\t };\\n\\t elproto.attr = function (name, value) {\\n\\t if (this.removed) {\\n\\t return this;\\n\\t }\\n\\t if (name == null) {\\n\\t var res = {};\\n\\t for (var a in this.attrs) if (this.attrs[has](a)) {\\n\\t res[a] = this.attrs[a];\\n\\t }\\n\\t res.gradient && res.fill == \\\"none\\\" && (res.fill = res.gradient) && delete res.gradient;\\n\\t res.transform = this._.transform;\\n\\t return res;\\n\\t }\\n\\t if (value == null && R.is(name, \\\"string\\\")) {\\n\\t if (name == fillString && this.attrs.fill == \\\"none\\\" && this.attrs.gradient) {\\n\\t return this.attrs.gradient;\\n\\t }\\n\\t var names = name.split(separator),\\n\\t out = {};\\n\\t for (var i = 0, ii = names.length; i < ii; i++) {\\n\\t name = names[i];\\n\\t if (name in this.attrs) {\\n\\t out[name] = this.attrs[name];\\n\\t } else if (R.is(this.paper.customAttributes[name], \\\"function\\\")) {\\n\\t out[name] = this.paper.customAttributes[name].def;\\n\\t } else {\\n\\t out[name] = R._availableAttrs[name];\\n\\t }\\n\\t }\\n\\t return ii - 1 ? out : out[names[0]];\\n\\t }\\n\\t if (this.attrs && value == null && R.is(name, \\\"array\\\")) {\\n\\t out = {};\\n\\t for (i = 0, ii = name.length; i < ii; i++) {\\n\\t out[name[i]] = this.attr(name[i]);\\n\\t }\\n\\t return out;\\n\\t }\\n\\t var params;\\n\\t if (value != null) {\\n\\t params = {};\\n\\t params[name] = value;\\n\\t }\\n\\t value == null && R.is(name, \\\"object\\\") && (params = name);\\n\\t for (var key in params) {\\n\\t eve(\\\"raphael.attr.\\\" + key + \\\".\\\" + this.id, this, params[key]);\\n\\t }\\n\\t if (params) {\\n\\t for (key in this.paper.customAttributes) if (this.paper.customAttributes[has](key) && params[has](key) && R.is(this.paper.customAttributes[key], \\\"function\\\")) {\\n\\t var par = this.paper.customAttributes[key].apply(this, [].concat(params[key]));\\n\\t this.attrs[key] = params[key];\\n\\t for (var subkey in par) if (par[has](subkey)) {\\n\\t params[subkey] = par[subkey];\\n\\t }\\n\\t }\\n\\t // this.paper.canvas.style.display = \\\"none\\\";\\n\\t if (params.text && this.type == \\\"text\\\") {\\n\\t this.textpath.string = params.text;\\n\\t }\\n\\t setFillAndStroke(this, params);\\n\\t // this.paper.canvas.style.display = E;\\n\\t }\\n\\t return this;\\n\\t };\\n\\t elproto.toFront = function () {\\n\\t !this.removed && this.node.parentNode.appendChild(this.node);\\n\\t this.paper && this.paper.top != this && R._tofront(this, this.paper);\\n\\t return this;\\n\\t };\\n\\t elproto.toBack = function () {\\n\\t if (this.removed) {\\n\\t return this;\\n\\t }\\n\\t if (this.node.parentNode.firstChild != this.node) {\\n\\t this.node.parentNode.insertBefore(this.node, this.node.parentNode.firstChild);\\n\\t R._toback(this, this.paper);\\n\\t }\\n\\t return this;\\n\\t };\\n\\t elproto.insertAfter = function (element) {\\n\\t if (this.removed) {\\n\\t return this;\\n\\t }\\n\\t if (element.constructor == R.st.constructor) {\\n\\t element = element[element.length - 1];\\n\\t }\\n\\t if (element.node.nextSibling) {\\n\\t element.node.parentNode.insertBefore(this.node, element.node.nextSibling);\\n\\t } else {\\n\\t element.node.parentNode.appendChild(this.node);\\n\\t }\\n\\t R._insertafter(this, element, this.paper);\\n\\t return this;\\n\\t };\\n\\t elproto.insertBefore = function (element) {\\n\\t if (this.removed) {\\n\\t return this;\\n\\t }\\n\\t if (element.constructor == R.st.constructor) {\\n\\t element = element[0];\\n\\t }\\n\\t element.node.parentNode.insertBefore(this.node, element.node);\\n\\t R._insertbefore(this, element, this.paper);\\n\\t return this;\\n\\t };\\n\\t elproto.blur = function (size) {\\n\\t var s = this.node.runtimeStyle,\\n\\t f = s.filter;\\n\\t f = f.replace(blurregexp, E);\\n\\t if (+size !== 0) {\\n\\t this.attrs.blur = size;\\n\\t s.filter = f + S + ms + \\\".Blur(pixelradius=\\\" + (+size || 1.5) + \\\")\\\";\\n\\t s.margin = R.format(\\\"-{0}px 0 0 -{0}px\\\", round(+size || 1.5));\\n\\t } else {\\n\\t s.filter = f;\\n\\t s.margin = 0;\\n\\t delete this.attrs.blur;\\n\\t }\\n\\t return this;\\n\\t };\\n\\n\\t R._engine.path = function (pathString, vml) {\\n\\t var el = createNode(\\\"shape\\\");\\n\\t el.style.cssText = cssDot;\\n\\t el.coordsize = zoom + S + zoom;\\n\\t el.coordorigin = vml.coordorigin;\\n\\t var p = new Element(el, vml),\\n\\t attr = {fill: \\\"none\\\", stroke: \\\"#000\\\"};\\n\\t pathString && (attr.path = pathString);\\n\\t p.type = \\\"path\\\";\\n\\t p.path = [];\\n\\t p.Path = E;\\n\\t setFillAndStroke(p, attr);\\n\\t vml.canvas && vml.canvas.appendChild(el);\\n\\t var skew = createNode(\\\"skew\\\");\\n\\t skew.on = true;\\n\\t el.appendChild(skew);\\n\\t p.skew = skew;\\n\\t p.transform(E);\\n\\t return p;\\n\\t };\\n\\t R._engine.rect = function (vml, x, y, w, h, r) {\\n\\t var path = R._rectPath(x, y, w, h, r),\\n\\t res = vml.path(path),\\n\\t a = res.attrs;\\n\\t res.X = a.x = x;\\n\\t res.Y = a.y = y;\\n\\t res.W = a.width = w;\\n\\t res.H = a.height = h;\\n\\t a.r = r;\\n\\t a.path = path;\\n\\t res.type = \\\"rect\\\";\\n\\t return res;\\n\\t };\\n\\t R._engine.ellipse = function (vml, x, y, rx, ry) {\\n\\t var res = vml.path(),\\n\\t a = res.attrs;\\n\\t res.X = x - rx;\\n\\t res.Y = y - ry;\\n\\t res.W = rx * 2;\\n\\t res.H = ry * 2;\\n\\t res.type = \\\"ellipse\\\";\\n\\t setFillAndStroke(res, {\\n\\t cx: x,\\n\\t cy: y,\\n\\t rx: rx,\\n\\t ry: ry\\n\\t });\\n\\t return res;\\n\\t };\\n\\t R._engine.circle = function (vml, x, y, r) {\\n\\t var res = vml.path(),\\n\\t a = res.attrs;\\n\\t res.X = x - r;\\n\\t res.Y = y - r;\\n\\t res.W = res.H = r * 2;\\n\\t res.type = \\\"circle\\\";\\n\\t setFillAndStroke(res, {\\n\\t cx: x,\\n\\t cy: y,\\n\\t r: r\\n\\t });\\n\\t return res;\\n\\t };\\n\\t R._engine.image = function (vml, src, x, y, w, h) {\\n\\t var path = R._rectPath(x, y, w, h),\\n\\t res = vml.path(path).attr({stroke: \\\"none\\\"}),\\n\\t a = res.attrs,\\n\\t node = res.node,\\n\\t fill = node.getElementsByTagName(fillString)[0];\\n\\t a.src = src;\\n\\t res.X = a.x = x;\\n\\t res.Y = a.y = y;\\n\\t res.W = a.width = w;\\n\\t res.H = a.height = h;\\n\\t a.path = path;\\n\\t res.type = \\\"image\\\";\\n\\t fill.parentNode == node && node.removeChild(fill);\\n\\t fill.rotate = true;\\n\\t fill.src = src;\\n\\t fill.type = \\\"tile\\\";\\n\\t res._.fillpos = [x, y];\\n\\t res._.fillsize = [w, h];\\n\\t node.appendChild(fill);\\n\\t setCoords(res, 1, 1, 0, 0, 0);\\n\\t return res;\\n\\t };\\n\\t R._engine.text = function (vml, x, y, text) {\\n\\t var el = createNode(\\\"shape\\\"),\\n\\t path = createNode(\\\"path\\\"),\\n\\t o = createNode(\\\"textpath\\\");\\n\\t x = x || 0;\\n\\t y = y || 0;\\n\\t text = text || \\\"\\\";\\n\\t path.v = R.format(\\\"m{0},{1}l{2},{1}\\\", round(x * zoom), round(y * zoom), round(x * zoom) + 1);\\n\\t path.textpathok = true;\\n\\t o.string = Str(text);\\n\\t o.on = true;\\n\\t el.style.cssText = cssDot;\\n\\t el.coordsize = zoom + S + zoom;\\n\\t el.coordorigin = \\\"0 0\\\";\\n\\t var p = new Element(el, vml),\\n\\t attr = {\\n\\t fill: \\\"#000\\\",\\n\\t stroke: \\\"none\\\",\\n\\t font: R._availableAttrs.font,\\n\\t text: text\\n\\t };\\n\\t p.shape = el;\\n\\t p.path = path;\\n\\t p.textpath = o;\\n\\t p.type = \\\"text\\\";\\n\\t p.attrs.text = Str(text);\\n\\t p.attrs.x = x;\\n\\t p.attrs.y = y;\\n\\t p.attrs.w = 1;\\n\\t p.attrs.h = 1;\\n\\t setFillAndStroke(p, attr);\\n\\t el.appendChild(o);\\n\\t el.appendChild(path);\\n\\t vml.canvas.appendChild(el);\\n\\t var skew = createNode(\\\"skew\\\");\\n\\t skew.on = true;\\n\\t el.appendChild(skew);\\n\\t p.skew = skew;\\n\\t p.transform(E);\\n\\t return p;\\n\\t };\\n\\t R._engine.setSize = function (width, height) {\\n\\t var cs = this.canvas.style;\\n\\t this.width = width;\\n\\t this.height = height;\\n\\t width == +width && (width += \\\"px\\\");\\n\\t height == +height && (height += \\\"px\\\");\\n\\t cs.width = width;\\n\\t cs.height = height;\\n\\t cs.clip = \\\"rect(0 \\\" + width + \\\" \\\" + height + \\\" 0)\\\";\\n\\t if (this._viewBox) {\\n\\t R._engine.setViewBox.apply(this, this._viewBox);\\n\\t }\\n\\t return this;\\n\\t };\\n\\t R._engine.setViewBox = function (x, y, w, h, fit) {\\n\\t R.eve(\\\"raphael.setViewBox\\\", this, this._viewBox, [x, y, w, h, fit]);\\n\\t var paperSize = this.getSize(),\\n\\t width = paperSize.width,\\n\\t height = paperSize.height,\\n\\t H, W;\\n\\t if (fit) {\\n\\t H = height / h;\\n\\t W = width / w;\\n\\t if (w * H < width) {\\n\\t x -= (width - w * H) / 2 / H;\\n\\t }\\n\\t if (h * W < height) {\\n\\t y -= (height - h * W) / 2 / W;\\n\\t }\\n\\t }\\n\\t this._viewBox = [x, y, w, h, !!fit];\\n\\t this._viewBoxShift = {\\n\\t dx: -x,\\n\\t dy: -y,\\n\\t scale: paperSize\\n\\t };\\n\\t this.forEach(function (el) {\\n\\t el.transform(\\\"...\\\");\\n\\t });\\n\\t return this;\\n\\t };\\n\\t var createNode;\\n\\t R._engine.initWin = function (win) {\\n\\t var doc = win.document;\\n\\t if (doc.styleSheets.length < 31) {\\n\\t doc.createStyleSheet().addRule(\\\".rvml\\\", \\\"behavior:url(#default#VML)\\\");\\n\\t } else {\\n\\t // no more room, add to the existing one\\n\\t // http://msdn.microsoft.com/en-us/library/ms531194%28VS.85%29.aspx\\n\\t doc.styleSheets[0].addRule(\\\".rvml\\\", \\\"behavior:url(#default#VML)\\\");\\n\\t }\\n\\t try {\\n\\t !doc.namespaces.rvml && doc.namespaces.add(\\\"rvml\\\", \\\"urn:schemas-microsoft-com:vml\\\");\\n\\t createNode = function (tagName) {\\n\\t return doc.createElement('<rvml:' + tagName + ' class=\\\"rvml\\\">');\\n\\t };\\n\\t } catch (e) {\\n\\t createNode = function (tagName) {\\n\\t return doc.createElement('<' + tagName + ' xmlns=\\\"urn:schemas-microsoft.com:vml\\\" class=\\\"rvml\\\">');\\n\\t };\\n\\t }\\n\\t };\\n\\t R._engine.initWin(R._g.win);\\n\\t R._engine.create = function () {\\n\\t var con = R._getContainer.apply(0, arguments),\\n\\t container = con.container,\\n\\t height = con.height,\\n\\t s,\\n\\t width = con.width,\\n\\t x = con.x,\\n\\t y = con.y;\\n\\t if (!container) {\\n\\t throw new Error(\\\"VML container not found.\\\");\\n\\t }\\n\\t var res = new R._Paper,\\n\\t c = res.canvas = R._g.doc.createElement(\\\"div\\\"),\\n\\t cs = c.style;\\n\\t x = x || 0;\\n\\t y = y || 0;\\n\\t width = width || 512;\\n\\t height = height || 342;\\n\\t res.width = width;\\n\\t res.height = height;\\n\\t width == +width && (width += \\\"px\\\");\\n\\t height == +height && (height += \\\"px\\\");\\n\\t res.coordsize = zoom * 1e3 + S + zoom * 1e3;\\n\\t res.coordorigin = \\\"0 0\\\";\\n\\t res.span = R._g.doc.createElement(\\\"span\\\");\\n\\t res.span.style.cssText = \\\"position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;\\\";\\n\\t c.appendChild(res.span);\\n\\t cs.cssText = R.format(\\\"top:0;left:0;width:{0};height:{1};display:inline-block;position:relative;clip:rect(0 {0} {1} 0);overflow:hidden\\\", width, height);\\n\\t if (container == 1) {\\n\\t R._g.doc.body.appendChild(c);\\n\\t cs.left = x + \\\"px\\\";\\n\\t cs.top = y + \\\"px\\\";\\n\\t cs.position = \\\"absolute\\\";\\n\\t } else {\\n\\t if (container.firstChild) {\\n\\t container.insertBefore(c, container.firstChild);\\n\\t } else {\\n\\t container.appendChild(c);\\n\\t }\\n\\t }\\n\\t res.renderfix = function () {};\\n\\t return res;\\n\\t };\\n\\t R.prototype.clear = function () {\\n\\t R.eve(\\\"raphael.clear\\\", this);\\n\\t this.canvas.innerHTML = E;\\n\\t this.span = R._g.doc.createElement(\\\"span\\\");\\n\\t this.span.style.cssText = \\\"position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;display:inline;\\\";\\n\\t this.canvas.appendChild(this.span);\\n\\t this.bottom = this.top = null;\\n\\t };\\n\\t R.prototype.remove = function () {\\n\\t R.eve(\\\"raphael.remove\\\", this);\\n\\t this.canvas.parentNode.removeChild(this.canvas);\\n\\t for (var i in this) {\\n\\t this[i] = typeof this[i] == \\\"function\\\" ? R._removedFactory(i) : null;\\n\\t }\\n\\t return true;\\n\\t };\\n\\n\\t var setproto = R.st;\\n\\t for (var method in elproto) if (elproto[has](method) && !setproto[has](method)) {\\n\\t setproto[method] = (function (methodname) {\\n\\t return function () {\\n\\t var arg = arguments;\\n\\t return this.forEach(function (el) {\\n\\t el[methodname].apply(el, arg);\\n\\t });\\n\\t };\\n\\t })(method);\\n\\t }\\n\\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\\n\\n\\n/***/ }\\n/******/ ])\\n});\\n;\"\n\n/***/ }),\n\n/***/ 2185:\n/***/ (function(module, exports, __webpack_require__) {\n\n__webpack_require__(3)(__webpack_require__(2186))\n\n/***/ }),\n\n/***/ 2186:\n/***/ (function(module, exports) {\n\nmodule.exports = \"/* @license\\nmorris.js v0.5.0\\nCopyright 2014 Olly Smith All rights reserved.\\nLicensed under the BSD-2-Clause License.\\n*/\\n\\n\\n(function() {\\n var $, Morris, minutesSpecHelper, secondsSpecHelper,\\n __slice = [].slice,\\n __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },\\n __hasProp = {}.hasOwnProperty,\\n __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\\n __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };\\n\\n Morris = window.Morris = {};\\n\\n $ = jQuery;\\n\\n Morris.EventEmitter = (function() {\\n function EventEmitter() {}\\n\\n EventEmitter.prototype.on = function(name, handler) {\\n if (this.handlers == null) {\\n this.handlers = {};\\n }\\n if (this.handlers[name] == null) {\\n this.handlers[name] = [];\\n }\\n this.handlers[name].push(handler);\\n return this;\\n };\\n\\n EventEmitter.prototype.fire = function() {\\n var args, handler, name, _i, _len, _ref, _results;\\n name = arguments[0], args = 2 <= arguments.length ? __slice.call(arguments, 1) : [];\\n if ((this.handlers != null) && (this.handlers[name] != null)) {\\n _ref = this.handlers[name];\\n _results = [];\\n for (_i = 0, _len = _ref.length; _i < _len; _i++) {\\n handler = _ref[_i];\\n _results.push(handler.apply(null, args));\\n }\\n return _results;\\n }\\n };\\n\\n return EventEmitter;\\n\\n })();\\n\\n Morris.commas = function(num) {\\n var absnum, intnum, ret, strabsnum;\\n if (num != null) {\\n ret = num < 0 ? \\\"-\\\" : \\\"\\\";\\n absnum = Math.abs(num);\\n intnum = Math.floor(absnum).toFixed(0);\\n ret += intnum.replace(/(?=(?:\\\\d{3})+$)(?!^)/g, ',');\\n strabsnum = absnum.toString();\\n if (strabsnum.length > intnum.length) {\\n ret += strabsnum.slice(intnum.length);\\n }\\n return ret;\\n } else {\\n return '-';\\n }\\n };\\n\\n Morris.pad2 = function(number) {\\n return (number < 10 ? '0' : '') + number;\\n };\\n\\n Morris.Grid = (function(_super) {\\n __extends(Grid, _super);\\n\\n function Grid(options) {\\n this.resizeHandler = __bind(this.resizeHandler, this);\\n var _this = this;\\n if (typeof options.element === 'string') {\\n this.el = $(document.getElementById(options.element));\\n } else {\\n this.el = $(options.element);\\n }\\n if ((this.el == null) || this.el.length === 0) {\\n throw new Error(\\\"Graph container element not found\\\");\\n }\\n if (this.el.css('position') === 'static') {\\n this.el.css('position', 'relative');\\n }\\n this.options = $.extend({}, this.gridDefaults, this.defaults || {}, options);\\n if (typeof this.options.units === 'string') {\\n this.options.postUnits = options.units;\\n }\\n this.raphael = new Raphael(this.el[0]);\\n this.elementWidth = null;\\n this.elementHeight = null;\\n this.dirty = false;\\n this.selectFrom = null;\\n if (this.init) {\\n this.init();\\n }\\n this.setData(this.options.data);\\n this.el.bind('mousemove', function(evt) {\\n var left, offset, right, width, x;\\n offset = _this.el.offset();\\n x = evt.pageX - offset.left;\\n if (_this.selectFrom) {\\n left = _this.data[_this.hitTest(Math.min(x, _this.selectFrom))]._x;\\n right = _this.data[_this.hitTest(Math.max(x, _this.selectFrom))]._x;\\n width = right - left;\\n return _this.selectionRect.attr({\\n x: left,\\n width: width\\n });\\n } else {\\n return _this.fire('hovermove', x, evt.pageY - offset.top);\\n }\\n });\\n this.el.bind('mouseleave', function(evt) {\\n if (_this.selectFrom) {\\n _this.selectionRect.hide();\\n _this.selectFrom = null;\\n }\\n return _this.fire('hoverout');\\n });\\n this.el.bind('touchstart touchmove touchend', function(evt) {\\n var offset, touch;\\n touch = evt.originalEvent.touches[0] || evt.originalEvent.changedTouches[0];\\n offset = _this.el.offset();\\n return _this.fire('hovermove', touch.pageX - offset.left, touch.pageY - offset.top);\\n });\\n this.el.bind('click', function(evt) {\\n var offset;\\n offset = _this.el.offset();\\n return _this.fire('gridclick', evt.pageX - offset.left, evt.pageY - offset.top);\\n });\\n if (this.options.rangeSelect) {\\n this.selectionRect = this.raphael.rect(0, 0, 0, this.el.innerHeight()).attr({\\n fill: this.options.rangeSelectColor,\\n stroke: false\\n }).toBack().hide();\\n this.el.bind('mousedown', function(evt) {\\n var offset;\\n offset = _this.el.offset();\\n return _this.startRange(evt.pageX - offset.left);\\n });\\n this.el.bind('mouseup', function(evt) {\\n var offset;\\n offset = _this.el.offset();\\n _this.endRange(evt.pageX - offset.left);\\n return _this.fire('hovermove', evt.pageX - offset.left, evt.pageY - offset.top);\\n });\\n }\\n if (this.options.resize) {\\n $(window).bind('resize', function(evt) {\\n if (_this.timeoutId != null) {\\n window.clearTimeout(_this.timeoutId);\\n }\\n return _this.timeoutId = window.setTimeout(_this.resizeHandler, 100);\\n });\\n }\\n this.el.css('-webkit-tap-highlight-color', 'rgba(0,0,0,0)');\\n if (this.postInit) {\\n this.postInit();\\n }\\n }\\n\\n Grid.prototype.gridDefaults = {\\n dateFormat: null,\\n axes: true,\\n grid: true,\\n gridLineColor: '#aaa',\\n gridStrokeWidth: 0.5,\\n gridTextColor: '#888',\\n gridTextSize: 12,\\n gridTextFamily: 'sans-serif',\\n gridTextWeight: 'normal',\\n hideHover: false,\\n yLabelFormat: null,\\n xLabelAngle: 0,\\n numLines: 5,\\n padding: 25,\\n parseTime: true,\\n postUnits: '',\\n preUnits: '',\\n ymax: 'auto',\\n ymin: 'auto 0',\\n goals: [],\\n goalStrokeWidth: 1.0,\\n goalLineColors: ['#666633', '#999966', '#cc6666', '#663333'],\\n events: [],\\n eventStrokeWidth: 1.0,\\n eventLineColors: ['#005a04', '#ccffbb', '#3a5f0b', '#005502'],\\n rangeSelect: null,\\n rangeSelectColor: '#eef',\\n resize: false\\n };\\n\\n Grid.prototype.setData = function(data, redraw) {\\n var e, idx, index, maxGoal, minGoal, ret, row, step, total, y, ykey, ymax, ymin, yval, _ref;\\n if (redraw == null) {\\n redraw = true;\\n }\\n this.options.data = data;\\n if ((data == null) || data.length === 0) {\\n this.data = [];\\n this.raphael.clear();\\n if (this.hover != null) {\\n this.hover.hide();\\n }\\n return;\\n }\\n ymax = this.cumulative ? 0 : null;\\n ymin = this.cumulative ? 0 : null;\\n if (this.options.goals.length > 0) {\\n minGoal = Math.min.apply(Math, this.options.goals);\\n maxGoal = Math.max.apply(Math, this.options.goals);\\n ymin = ymin != null ? Math.min(ymin, minGoal) : minGoal;\\n ymax = ymax != null ? Math.max(ymax, maxGoal) : maxGoal;\\n }\\n this.data = (function() {\\n var _i, _len, _results;\\n _results = [];\\n for (index = _i = 0, _len = data.length; _i < _len; index = ++_i) {\\n row = data[index];\\n ret = {\\n src: row\\n };\\n ret.label = row[this.options.xkey];\\n if (this.options.parseTime) {\\n ret.x = Morris.parseDate(ret.label);\\n if (this.options.dateFormat) {\\n ret.label = this.options.dateFormat(ret.x);\\n } else if (typeof ret.label === 'number') {\\n ret.label = new Date(ret.label).toString();\\n }\\n } else {\\n ret.x = index;\\n if (this.options.xLabelFormat) {\\n ret.label = this.options.xLabelFormat(ret);\\n }\\n }\\n total = 0;\\n ret.y = (function() {\\n var _j, _len1, _ref, _results1;\\n _ref = this.options.ykeys;\\n _results1 = [];\\n for (idx = _j = 0, _len1 = _ref.length; _j < _len1; idx = ++_j) {\\n ykey = _ref[idx];\\n yval = row[ykey];\\n if (typeof yval === 'string') {\\n yval = parseFloat(yval);\\n }\\n if ((yval != null) && typeof yval !== 'number') {\\n yval = null;\\n }\\n if (yval != null) {\\n if (this.cumulative) {\\n total += yval;\\n } else {\\n if (ymax != null) {\\n ymax = Math.max(yval, ymax);\\n ymin = Math.min(yval, ymin);\\n } else {\\n ymax = ymin = yval;\\n }\\n }\\n }\\n if (this.cumulative && (total != null)) {\\n ymax = Math.max(total, ymax);\\n ymin = Math.min(total, ymin);\\n }\\n _results1.push(yval);\\n }\\n return _results1;\\n }).call(this);\\n _results.push(ret);\\n }\\n return _results;\\n }).call(this);\\n if (this.options.parseTime) {\\n this.data = this.data.sort(function(a, b) {\\n return (a.x > b.x) - (b.x > a.x);\\n });\\n }\\n this.xmin = this.data[0].x;\\n this.xmax = this.data[this.data.length - 1].x;\\n this.events = [];\\n if (this.options.events.length > 0) {\\n if (this.options.parseTime) {\\n this.events = (function() {\\n var _i, _len, _ref, _results;\\n _ref = this.options.events;\\n _results = [];\\n for (_i = 0, _len = _ref.length; _i < _len; _i++) {\\n e = _ref[_i];\\n _results.push(Morris.parseDate(e));\\n }\\n return _results;\\n }).call(this);\\n } else {\\n this.events = this.options.events;\\n }\\n this.xmax = Math.max(this.xmax, Math.max.apply(Math, this.events));\\n this.xmin = Math.min(this.xmin, Math.min.apply(Math, this.events));\\n }\\n if (this.xmin === this.xmax) {\\n this.xmin -= 1;\\n this.xmax += 1;\\n }\\n this.ymin = this.yboundary('min', ymin);\\n this.ymax = this.yboundary('max', ymax);\\n if (this.ymin === this.ymax) {\\n if (ymin) {\\n this.ymin -= 1;\\n }\\n this.ymax += 1;\\n }\\n if (((_ref = this.options.axes) === true || _ref === 'both' || _ref === 'y') || this.options.grid === true) {\\n if (this.options.ymax === this.gridDefaults.ymax && this.options.ymin === this.gridDefaults.ymin) {\\n this.grid = this.autoGridLines(this.ymin, this.ymax, this.options.numLines);\\n this.ymin = Math.min(this.ymin, this.grid[0]);\\n this.ymax = Math.max(this.ymax, this.grid[this.grid.length - 1]);\\n } else {\\n step = (this.ymax - this.ymin) / (this.options.numLines - 1);\\n this.grid = (function() {\\n var _i, _ref1, _ref2, _results;\\n _results = [];\\n for (y = _i = _ref1 = this.ymin, _ref2 = this.ymax; step > 0 ? _i <= _ref2 : _i >= _ref2; y = _i += step) {\\n _results.push(y);\\n }\\n return _results;\\n }).call(this);\\n }\\n }\\n this.dirty = true;\\n if (redraw) {\\n return this.redraw();\\n }\\n };\\n\\n Grid.prototype.yboundary = function(boundaryType, currentValue) {\\n var boundaryOption, suggestedValue;\\n boundaryOption = this.options[\\\"y\\\" + boundaryType];\\n if (typeof boundaryOption === 'string') {\\n if (boundaryOption.slice(0, 4) === 'auto') {\\n if (boundaryOption.length > 5) {\\n suggestedValue = parseInt(boundaryOption.slice(5), 10);\\n if (currentValue == null) {\\n return suggestedValue;\\n }\\n return Math[boundaryType](currentValue, suggestedValue);\\n } else {\\n if (currentValue != null) {\\n return currentValue;\\n } else {\\n return 0;\\n }\\n }\\n } else {\\n return parseInt(boundaryOption, 10);\\n }\\n } else {\\n return boundaryOption;\\n }\\n };\\n\\n Grid.prototype.autoGridLines = function(ymin, ymax, nlines) {\\n var gmax, gmin, grid, smag, span, step, unit, y, ymag;\\n span = ymax - ymin;\\n ymag = Math.floor(Math.log(span) / Math.log(10));\\n unit = Math.pow(10, ymag);\\n gmin = Math.floor(ymin / unit) * unit;\\n gmax = Math.ceil(ymax / unit) * unit;\\n step = (gmax - gmin) / (nlines - 1);\\n if (unit === 1 && step > 1 && Math.ceil(step) !== step) {\\n step = Math.ceil(step);\\n gmax = gmin + step * (nlines - 1);\\n }\\n if (gmin < 0 && gmax > 0) {\\n gmin = Math.floor(ymin / step) * step;\\n gmax = Math.ceil(ymax / step) * step;\\n }\\n if (step < 1) {\\n smag = Math.floor(Math.log(step) / Math.log(10));\\n grid = (function() {\\n var _i, _results;\\n _results = [];\\n for (y = _i = gmin; step > 0 ? _i <= gmax : _i >= gmax; y = _i += step) {\\n _results.push(parseFloat(y.toFixed(1 - smag)));\\n }\\n return _results;\\n })();\\n } else {\\n grid = (function() {\\n var _i, _results;\\n _results = [];\\n for (y = _i = gmin; step > 0 ? _i <= gmax : _i >= gmax; y = _i += step) {\\n _results.push(y);\\n }\\n return _results;\\n })();\\n }\\n return grid;\\n };\\n\\n Grid.prototype._calc = function() {\\n var bottomOffsets, gridLine, h, i, w, yLabelWidths, _ref, _ref1;\\n w = this.el.width();\\n h = this.el.height();\\n if (this.elementWidth !== w || this.elementHeight !== h || this.dirty) {\\n this.elementWidth = w;\\n this.elementHeight = h;\\n this.dirty = false;\\n this.left = this.options.padding;\\n this.right = this.elementWidth - this.options.padding;\\n this.top = this.options.padding;\\n this.bottom = this.elementHeight - this.options.padding;\\n if ((_ref = this.options.axes) === true || _ref === 'both' || _ref === 'y') {\\n yLabelWidths = (function() {\\n var _i, _len, _ref1, _results;\\n _ref1 = this.grid;\\n _results = [];\\n for (_i = 0, _len = _ref1.length; _i < _len; _i++) {\\n gridLine = _ref1[_i];\\n _results.push(this.measureText(this.yAxisFormat(gridLine)).width);\\n }\\n return _results;\\n }).call(this);\\n this.left += Math.max.apply(Math, yLabelWidths);\\n }\\n if ((_ref1 = this.options.axes) === true || _ref1 === 'both' || _ref1 === 'x') {\\n bottomOffsets = (function() {\\n var _i, _ref2, _results;\\n _results = [];\\n for (i = _i = 0, _ref2 = this.data.length; 0 <= _ref2 ? _i < _ref2 : _i > _ref2; i = 0 <= _ref2 ? ++_i : --_i) {\\n _results.push(this.measureText(this.data[i].text, -this.options.xLabelAngle).height);\\n }\\n return _results;\\n }).call(this);\\n this.bottom -= Math.max.apply(Math, bottomOffsets);\\n }\\n this.width = Math.max(1, this.right - this.left);\\n this.height = Math.max(1, this.bottom - this.top);\\n this.dx = this.width / (this.xmax - this.xmin);\\n this.dy = this.height / (this.ymax - this.ymin);\\n if (this.calc) {\\n return this.calc();\\n }\\n }\\n };\\n\\n Grid.prototype.transY = function(y) {\\n return this.bottom - (y - this.ymin) * this.dy;\\n };\\n\\n Grid.prototype.transX = function(x) {\\n if (this.data.length === 1) {\\n return (this.left + this.right) / 2;\\n } else {\\n return this.left + (x - this.xmin) * this.dx;\\n }\\n };\\n\\n Grid.prototype.redraw = function() {\\n this.raphael.clear();\\n this._calc();\\n this.drawGrid();\\n this.drawGoals();\\n this.drawEvents();\\n if (this.draw) {\\n return this.draw();\\n }\\n };\\n\\n Grid.prototype.measureText = function(text, angle) {\\n var ret, tt;\\n if (angle == null) {\\n angle = 0;\\n }\\n tt = this.raphael.text(100, 100, text).attr('font-size', this.options.gridTextSize).attr('font-family', this.options.gridTextFamily).attr('font-weight', this.options.gridTextWeight).rotate(angle);\\n ret = tt.getBBox();\\n tt.remove();\\n return ret;\\n };\\n\\n Grid.prototype.yAxisFormat = function(label) {\\n return this.yLabelFormat(label);\\n };\\n\\n Grid.prototype.yLabelFormat = function(label) {\\n if (typeof this.options.yLabelFormat === 'function') {\\n return this.options.yLabelFormat(label);\\n } else {\\n return \\\"\\\" + this.options.preUnits + (Morris.commas(label)) + this.options.postUnits;\\n }\\n };\\n\\n Grid.prototype.drawGrid = function() {\\n var lineY, y, _i, _len, _ref, _ref1, _ref2, _results;\\n if (this.options.grid === false && ((_ref = this.options.axes) !== true && _ref !== 'both' && _ref !== 'y')) {\\n return;\\n }\\n _ref1 = this.grid;\\n _results = [];\\n for (_i = 0, _len = _ref1.length; _i < _len; _i++) {\\n lineY = _ref1[_i];\\n y = this.transY(lineY);\\n if ((_ref2 = this.options.axes) === true || _ref2 === 'both' || _ref2 === 'y') {\\n this.drawYAxisLabel(this.left - this.options.padding / 2, y, this.yAxisFormat(lineY));\\n }\\n if (this.options.grid) {\\n _results.push(this.drawGridLine(\\\"M\\\" + this.left + \\\",\\\" + y + \\\"H\\\" + (this.left + this.width)));\\n } else {\\n _results.push(void 0);\\n }\\n }\\n return _results;\\n };\\n\\n Grid.prototype.drawGoals = function() {\\n var color, goal, i, _i, _len, _ref, _results;\\n _ref = this.options.goals;\\n _results = [];\\n for (i = _i = 0, _len = _ref.length; _i < _len; i = ++_i) {\\n goal = _ref[i];\\n color = this.options.goalLineColors[i % this.options.goalLineColors.length];\\n _results.push(this.drawGoal(goal, color));\\n }\\n return _results;\\n };\\n\\n Grid.prototype.drawEvents = function() {\\n var color, event, i, _i, _len, _ref, _results;\\n _ref = this.events;\\n _results = [];\\n for (i = _i = 0, _len = _ref.length; _i < _len; i = ++_i) {\\n event = _ref[i];\\n color = this.options.eventLineColors[i % this.options.eventLineColors.length];\\n _results.push(this.drawEvent(event, color));\\n }\\n return _results;\\n };\\n\\n Grid.prototype.drawGoal = function(goal, color) {\\n return this.raphael.path(\\\"M\\\" + this.left + \\\",\\\" + (this.transY(goal)) + \\\"H\\\" + this.right).attr('stroke', color).attr('stroke-width', this.options.goalStrokeWidth);\\n };\\n\\n Grid.prototype.drawEvent = function(event, color) {\\n return this.raphael.path(\\\"M\\\" + (this.transX(event)) + \\\",\\\" + this.bottom + \\\"V\\\" + this.top).attr('stroke', color).attr('stroke-width', this.options.eventStrokeWidth);\\n };\\n\\n Grid.prototype.drawYAxisLabel = function(xPos, yPos, text) {\\n return this.raphael.text(xPos, yPos, text).attr('font-size', this.options.gridTextSize).attr('font-family', this.options.gridTextFamily).attr('font-weight', this.options.gridTextWeight).attr('fill', this.options.gridTextColor).attr('text-anchor', 'end');\\n };\\n\\n Grid.prototype.drawGridLine = function(path) {\\n return this.raphael.path(path).attr('stroke', this.options.gridLineColor).attr('stroke-width', this.options.gridStrokeWidth);\\n };\\n\\n Grid.prototype.startRange = function(x) {\\n this.hover.hide();\\n this.selectFrom = x;\\n return this.selectionRect.attr({\\n x: x,\\n width: 0\\n }).show();\\n };\\n\\n Grid.prototype.endRange = function(x) {\\n var end, start;\\n if (this.selectFrom) {\\n start = Math.min(this.selectFrom, x);\\n end = Math.max(this.selectFrom, x);\\n this.options.rangeSelect.call(this.el, {\\n start: this.data[this.hitTest(start)].x,\\n end: this.data[this.hitTest(end)].x\\n });\\n return this.selectFrom = null;\\n }\\n };\\n\\n Grid.prototype.resizeHandler = function() {\\n this.timeoutId = null;\\n this.raphael.setSize(this.el.width(), this.el.height());\\n return this.redraw();\\n };\\n\\n return Grid;\\n\\n })(Morris.EventEmitter);\\n\\n Morris.parseDate = function(date) {\\n var isecs, m, msecs, n, o, offsetmins, p, q, r, ret, secs;\\n if (typeof date === 'number') {\\n return date;\\n }\\n m = date.match(/^(\\\\d+) Q(\\\\d)$/);\\n n = date.match(/^(\\\\d+)-(\\\\d+)$/);\\n o = date.match(/^(\\\\d+)-(\\\\d+)-(\\\\d+)$/);\\n p = date.match(/^(\\\\d+) W(\\\\d+)$/);\\n q = date.match(/^(\\\\d+)-(\\\\d+)-(\\\\d+)[ T](\\\\d+):(\\\\d+)(Z|([+-])(\\\\d\\\\d):?(\\\\d\\\\d))?$/);\\n r = date.match(/^(\\\\d+)-(\\\\d+)-(\\\\d+)[ T](\\\\d+):(\\\\d+):(\\\\d+(\\\\.\\\\d+)?)(Z|([+-])(\\\\d\\\\d):?(\\\\d\\\\d))?$/);\\n if (m) {\\n return new Date(parseInt(m[1], 10), parseInt(m[2], 10) * 3 - 1, 1).getTime();\\n } else if (n) {\\n return new Date(parseInt(n[1], 10), parseInt(n[2], 10) - 1, 1).getTime();\\n } else if (o) {\\n return new Date(parseInt(o[1], 10), parseInt(o[2], 10) - 1, parseInt(o[3], 10)).getTime();\\n } else if (p) {\\n ret = new Date(parseInt(p[1], 10), 0, 1);\\n if (ret.getDay() !== 4) {\\n ret.setMonth(0, 1 + ((4 - ret.getDay()) + 7) % 7);\\n }\\n return ret.getTime() + parseInt(p[2], 10) * 604800000;\\n } else if (q) {\\n if (!q[6]) {\\n return new Date(parseInt(q[1], 10), parseInt(q[2], 10) - 1, parseInt(q[3], 10), parseInt(q[4], 10), parseInt(q[5], 10)).getTime();\\n } else {\\n offsetmins = 0;\\n if (q[6] !== 'Z') {\\n offsetmins = parseInt(q[8], 10) * 60 + parseInt(q[9], 10);\\n if (q[7] === '+') {\\n offsetmins = 0 - offsetmins;\\n }\\n }\\n return Date.UTC(parseInt(q[1], 10), parseInt(q[2], 10) - 1, parseInt(q[3], 10), parseInt(q[4], 10), parseInt(q[5], 10) + offsetmins);\\n }\\n } else if (r) {\\n secs = parseFloat(r[6]);\\n isecs = Math.floor(secs);\\n msecs = Math.round((secs - isecs) * 1000);\\n if (!r[8]) {\\n return new Date(parseInt(r[1], 10), parseInt(r[2], 10) - 1, parseInt(r[3], 10), parseInt(r[4], 10), parseInt(r[5], 10), isecs, msecs).getTime();\\n } else {\\n offsetmins = 0;\\n if (r[8] !== 'Z') {\\n offsetmins = parseInt(r[10], 10) * 60 + parseInt(r[11], 10);\\n if (r[9] === '+') {\\n offsetmins = 0 - offsetmins;\\n }\\n }\\n return Date.UTC(parseInt(r[1], 10), parseInt(r[2], 10) - 1, parseInt(r[3], 10), parseInt(r[4], 10), parseInt(r[5], 10) + offsetmins, isecs, msecs);\\n }\\n } else {\\n return new Date(parseInt(date, 10), 0, 1).getTime();\\n }\\n };\\n\\n Morris.Hover = (function() {\\n Hover.defaults = {\\n \\\"class\\\": 'morris-hover morris-default-style'\\n };\\n\\n function Hover(options) {\\n if (options == null) {\\n options = {};\\n }\\n this.options = $.extend({}, Morris.Hover.defaults, options);\\n this.el = $(\\\"<div class='\\\" + this.options[\\\"class\\\"] + \\\"'></div>\\\");\\n this.el.hide();\\n this.options.parent.append(this.el);\\n }\\n\\n Hover.prototype.update = function(html, x, y) {\\n if (!html) {\\n return this.hide();\\n } else {\\n this.html(html);\\n this.show();\\n return this.moveTo(x, y);\\n }\\n };\\n\\n Hover.prototype.html = function(content) {\\n return this.el.html(content);\\n };\\n\\n Hover.prototype.moveTo = function(x, y) {\\n var hoverHeight, hoverWidth, left, parentHeight, parentWidth, top;\\n parentWidth = this.options.parent.innerWidth();\\n parentHeight = this.options.parent.innerHeight();\\n hoverWidth = this.el.outerWidth();\\n hoverHeight = this.el.outerHeight();\\n left = Math.min(Math.max(0, x - hoverWidth / 2), parentWidth - hoverWidth);\\n if (y != null) {\\n top = y - hoverHeight - 10;\\n if (top < 0) {\\n top = y + 10;\\n if (top + hoverHeight > parentHeight) {\\n top = parentHeight / 2 - hoverHeight / 2;\\n }\\n }\\n } else {\\n top = parentHeight / 2 - hoverHeight / 2;\\n }\\n return this.el.css({\\n left: left + \\\"px\\\",\\n top: parseInt(top) + \\\"px\\\"\\n });\\n };\\n\\n Hover.prototype.show = function() {\\n return this.el.show();\\n };\\n\\n Hover.prototype.hide = function() {\\n return this.el.hide();\\n };\\n\\n return Hover;\\n\\n })();\\n\\n Morris.Line = (function(_super) {\\n __extends(Line, _super);\\n\\n function Line(options) {\\n this.hilight = __bind(this.hilight, this);\\n this.onHoverOut = __bind(this.onHoverOut, this);\\n this.onHoverMove = __bind(this.onHoverMove, this);\\n this.onGridClick = __bind(this.onGridClick, this);\\n if (!(this instanceof Morris.Line)) {\\n return new Morris.Line(options);\\n }\\n Line.__super__.constructor.call(this, options);\\n }\\n\\n Line.prototype.init = function() {\\n if (this.options.hideHover !== 'always') {\\n this.hover = new Morris.Hover({\\n parent: this.el\\n });\\n this.on('hovermove', this.onHoverMove);\\n this.on('hoverout', this.onHoverOut);\\n return this.on('gridclick', this.onGridClick);\\n }\\n };\\n\\n Line.prototype.defaults = {\\n lineWidth: 3,\\n pointSize: 4,\\n lineColors: ['#0b62a4', '#7A92A3', '#4da74d', '#afd8f8', '#edc240', '#cb4b4b', '#9440ed'],\\n pointStrokeWidths: [1],\\n pointStrokeColors: ['#ffffff'],\\n pointFillColors: [],\\n smooth: true,\\n xLabels: 'auto',\\n xLabelFormat: null,\\n xLabelMargin: 24,\\n hideHover: false\\n };\\n\\n Line.prototype.calc = function() {\\n this.calcPoints();\\n return this.generatePaths();\\n };\\n\\n Line.prototype.calcPoints = function() {\\n var row, y, _i, _len, _ref, _results;\\n _ref = this.data;\\n _results = [];\\n for (_i = 0, _len = _ref.length; _i < _len; _i++) {\\n row = _ref[_i];\\n row._x = this.transX(row.x);\\n row._y = (function() {\\n var _j, _len1, _ref1, _results1;\\n _ref1 = row.y;\\n _results1 = [];\\n for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) {\\n y = _ref1[_j];\\n if (y != null) {\\n _results1.push(this.transY(y));\\n } else {\\n _results1.push(y);\\n }\\n }\\n return _results1;\\n }).call(this);\\n _results.push(row._ymax = Math.min.apply(Math, [this.bottom].concat((function() {\\n var _j, _len1, _ref1, _results1;\\n _ref1 = row._y;\\n _results1 = [];\\n for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) {\\n y = _ref1[_j];\\n if (y != null) {\\n _results1.push(y);\\n }\\n }\\n return _results1;\\n })())));\\n }\\n return _results;\\n };\\n\\n Line.prototype.hitTest = function(x) {\\n var index, r, _i, _len, _ref;\\n if (this.data.length === 0) {\\n return null;\\n }\\n _ref = this.data.slice(1);\\n for (index = _i = 0, _len = _ref.length; _i < _len; index = ++_i) {\\n r = _ref[index];\\n if (x < (r._x + this.data[index]._x) / 2) {\\n break;\\n }\\n }\\n return index;\\n };\\n\\n Line.prototype.onGridClick = function(x, y) {\\n var index;\\n index = this.hitTest(x);\\n return this.fire('click', index, this.data[index].src, x, y);\\n };\\n\\n Line.prototype.onHoverMove = function(x, y) {\\n var index;\\n index = this.hitTest(x);\\n return this.displayHoverForRow(index);\\n };\\n\\n Line.prototype.onHoverOut = function() {\\n if (this.options.hideHover !== false) {\\n return this.displayHoverForRow(null);\\n }\\n };\\n\\n Line.prototype.displayHoverForRow = function(index) {\\n var _ref;\\n if (index != null) {\\n (_ref = this.hover).update.apply(_ref, this.hoverContentForRow(index));\\n return this.hilight(index);\\n } else {\\n this.hover.hide();\\n return this.hilight();\\n }\\n };\\n\\n Line.prototype.hoverContentForRow = function(index) {\\n var content, j, row, y, _i, _len, _ref;\\n row = this.data[index];\\n content = \\\"<div class='morris-hover-row-label'>\\\" + row.label + \\\"</div>\\\";\\n _ref = row.y;\\n for (j = _i = 0, _len = _ref.length; _i < _len; j = ++_i) {\\n y = _ref[j];\\n content += \\\"<div class='morris-hover-point' style='color: \\\" + (this.colorFor(row, j, 'label')) + \\\"'>\\\\n \\\" + this.options.labels[j] + \\\":\\\\n \\\" + (this.yLabelFormat(y)) + \\\"\\\\n</div>\\\";\\n }\\n if (typeof this.options.hoverCallback === 'function') {\\n content = this.options.hoverCallback(index, this.options, content, row.src);\\n }\\n return [content, row._x, row._ymax];\\n };\\n\\n Line.prototype.generatePaths = function() {\\n var coords, i, r, smooth;\\n return this.paths = (function() {\\n var _i, _ref, _ref1, _results;\\n _results = [];\\n for (i = _i = 0, _ref = this.options.ykeys.length; 0 <= _ref ? _i < _ref : _i > _ref; i = 0 <= _ref ? ++_i : --_i) {\\n smooth = typeof this.options.smooth === \\\"boolean\\\" ? this.options.smooth : (_ref1 = this.options.ykeys[i], __indexOf.call(this.options.smooth, _ref1) >= 0);\\n coords = (function() {\\n var _j, _len, _ref2, _results1;\\n _ref2 = this.data;\\n _results1 = [];\\n for (_j = 0, _len = _ref2.length; _j < _len; _j++) {\\n r = _ref2[_j];\\n if (r._y[i] !== void 0) {\\n _results1.push({\\n x: r._x,\\n y: r._y[i]\\n });\\n }\\n }\\n return _results1;\\n }).call(this);\\n if (coords.length > 1) {\\n _results.push(Morris.Line.createPath(coords, smooth, this.bottom));\\n } else {\\n _results.push(null);\\n }\\n }\\n return _results;\\n }).call(this);\\n };\\n\\n Line.prototype.draw = function() {\\n var _ref;\\n if ((_ref = this.options.axes) === true || _ref === 'both' || _ref === 'x') {\\n this.drawXAxis();\\n }\\n this.drawSeries();\\n if (this.options.hideHover === false) {\\n return this.displayHoverForRow(this.data.length - 1);\\n }\\n };\\n\\n Line.prototype.drawXAxis = function() {\\n var drawLabel, l, labels, prevAngleMargin, prevLabelMargin, row, ypos, _i, _len, _results,\\n _this = this;\\n ypos = this.bottom + this.options.padding / 2;\\n prevLabelMargin = null;\\n prevAngleMargin = null;\\n drawLabel = function(labelText, xpos) {\\n var label, labelBox, margin, offset, textBox;\\n label = _this.drawXAxisLabel(_this.transX(xpos), ypos, labelText);\\n textBox = label.getBBox();\\n label.transform(\\\"r\\\" + (-_this.options.xLabelAngle));\\n labelBox = label.getBBox();\\n label.transform(\\\"t0,\\\" + (labelBox.height / 2) + \\\"...\\\");\\n if (_this.options.xLabelAngle !== 0) {\\n offset = -0.5 * textBox.width * Math.cos(_this.options.xLabelAngle * Math.PI / 180.0);\\n label.transform(\\\"t\\\" + offset + \\\",0...\\\");\\n }\\n labelBox = label.getBBox();\\n if (((prevLabelMargin == null) || prevLabelMargin >= labelBox.x + labelBox.width || (prevAngleMargin != null) && prevAngleMargin >= labelBox.x) && labelBox.x >= 0 && (labelBox.x + labelBox.width) < _this.el.width()) {\\n if (_this.options.xLabelAngle !== 0) {\\n margin = 1.25 * _this.options.gridTextSize / Math.sin(_this.options.xLabelAngle * Math.PI / 180.0);\\n prevAngleMargin = labelBox.x - margin;\\n }\\n return prevLabelMargin = labelBox.x - _this.options.xLabelMargin;\\n } else {\\n return label.remove();\\n }\\n };\\n if (this.options.parseTime) {\\n if (this.data.length === 1 && this.options.xLabels === 'auto') {\\n labels = [[this.data[0].label, this.data[0].x]];\\n } else {\\n labels = Morris.labelSeries(this.xmin, this.xmax, this.width, this.options.xLabels, this.options.xLabelFormat);\\n }\\n } else {\\n labels = (function() {\\n var _i, _len, _ref, _results;\\n _ref = this.data;\\n _results = [];\\n for (_i = 0, _len = _ref.length; _i < _len; _i++) {\\n row = _ref[_i];\\n _results.push([row.label, row.x]);\\n }\\n return _results;\\n }).call(this);\\n }\\n labels.reverse();\\n _results = [];\\n for (_i = 0, _len = labels.length; _i < _len; _i++) {\\n l = labels[_i];\\n _results.push(drawLabel(l[0], l[1]));\\n }\\n return _results;\\n };\\n\\n Line.prototype.drawSeries = function() {\\n var i, _i, _j, _ref, _ref1, _results;\\n this.seriesPoints = [];\\n for (i = _i = _ref = this.options.ykeys.length - 1; _ref <= 0 ? _i <= 0 : _i >= 0; i = _ref <= 0 ? ++_i : --_i) {\\n this._drawLineFor(i);\\n }\\n _results = [];\\n for (i = _j = _ref1 = this.options.ykeys.length - 1; _ref1 <= 0 ? _j <= 0 : _j >= 0; i = _ref1 <= 0 ? ++_j : --_j) {\\n _results.push(this._drawPointFor(i));\\n }\\n return _results;\\n };\\n\\n Line.prototype._drawPointFor = function(index) {\\n var circle, row, _i, _len, _ref, _results;\\n this.seriesPoints[index] = [];\\n _ref = this.data;\\n _results = [];\\n for (_i = 0, _len = _ref.length; _i < _len; _i++) {\\n row = _ref[_i];\\n circle = null;\\n if (row._y[index] != null) {\\n circle = this.drawLinePoint(row._x, row._y[index], this.colorFor(row, index, 'point'), index);\\n }\\n _results.push(this.seriesPoints[index].push(circle));\\n }\\n return _results;\\n };\\n\\n Line.prototype._drawLineFor = function(index) {\\n var path;\\n path = this.paths[index];\\n if (path !== null) {\\n return this.drawLinePath(path, this.colorFor(null, index, 'line'), index);\\n }\\n };\\n\\n Line.createPath = function(coords, smooth, bottom) {\\n var coord, g, grads, i, ix, lg, path, prevCoord, x1, x2, y1, y2, _i, _len;\\n path = \\\"\\\";\\n if (smooth) {\\n grads = Morris.Line.gradients(coords);\\n }\\n prevCoord = {\\n y: null\\n };\\n for (i = _i = 0, _len = coords.length; _i < _len; i = ++_i) {\\n coord = coords[i];\\n if (coord.y != null) {\\n if (prevCoord.y != null) {\\n if (smooth) {\\n g = grads[i];\\n lg = grads[i - 1];\\n ix = (coord.x - prevCoord.x) / 4;\\n x1 = prevCoord.x + ix;\\n y1 = Math.min(bottom, prevCoord.y + ix * lg);\\n x2 = coord.x - ix;\\n y2 = Math.min(bottom, coord.y - ix * g);\\n path += \\\"C\\\" + x1 + \\\",\\\" + y1 + \\\",\\\" + x2 + \\\",\\\" + y2 + \\\",\\\" + coord.x + \\\",\\\" + coord.y;\\n } else {\\n path += \\\"L\\\" + coord.x + \\\",\\\" + coord.y;\\n }\\n } else {\\n if (!smooth || (grads[i] != null)) {\\n path += \\\"M\\\" + coord.x + \\\",\\\" + coord.y;\\n }\\n }\\n }\\n prevCoord = coord;\\n }\\n return path;\\n };\\n\\n Line.gradients = function(coords) {\\n var coord, grad, i, nextCoord, prevCoord, _i, _len, _results;\\n grad = function(a, b) {\\n return (a.y - b.y) / (a.x - b.x);\\n };\\n _results = [];\\n for (i = _i = 0, _len = coords.length; _i < _len; i = ++_i) {\\n coord = coords[i];\\n if (coord.y != null) {\\n nextCoord = coords[i + 1] || {\\n y: null\\n };\\n prevCoord = coords[i - 1] || {\\n y: null\\n };\\n if ((prevCoord.y != null) && (nextCoord.y != null)) {\\n _results.push(grad(prevCoord, nextCoord));\\n } else if (prevCoord.y != null) {\\n _results.push(grad(prevCoord, coord));\\n } else if (nextCoord.y != null) {\\n _results.push(grad(coord, nextCoord));\\n } else {\\n _results.push(null);\\n }\\n } else {\\n _results.push(null);\\n }\\n }\\n return _results;\\n };\\n\\n Line.prototype.hilight = function(index) {\\n var i, _i, _j, _ref, _ref1;\\n if (this.prevHilight !== null && this.prevHilight !== index) {\\n for (i = _i = 0, _ref = this.seriesPoints.length - 1; 0 <= _ref ? _i <= _ref : _i >= _ref; i = 0 <= _ref ? ++_i : --_i) {\\n if (this.seriesPoints[i][this.prevHilight]) {\\n this.seriesPoints[i][this.prevHilight].animate(this.pointShrinkSeries(i));\\n }\\n }\\n }\\n if (index !== null && this.prevHilight !== index) {\\n for (i = _j = 0, _ref1 = this.seriesPoints.length - 1; 0 <= _ref1 ? _j <= _ref1 : _j >= _ref1; i = 0 <= _ref1 ? ++_j : --_j) {\\n if (this.seriesPoints[i][index]) {\\n this.seriesPoints[i][index].animate(this.pointGrowSeries(i));\\n }\\n }\\n }\\n return this.prevHilight = index;\\n };\\n\\n Line.prototype.colorFor = function(row, sidx, type) {\\n if (typeof this.options.lineColors === 'function') {\\n return this.options.lineColors.call(this, row, sidx, type);\\n } else if (type === 'point') {\\n return this.options.pointFillColors[sidx % this.options.pointFillColors.length] || this.options.lineColors[sidx % this.options.lineColors.length];\\n } else {\\n return this.options.lineColors[sidx % this.options.lineColors.length];\\n }\\n };\\n\\n Line.prototype.drawXAxisLabel = function(xPos, yPos, text) {\\n return this.raphael.text(xPos, yPos, text).attr('font-size', this.options.gridTextSize).attr('font-family', this.options.gridTextFamily).attr('font-weight', this.options.gridTextWeight).attr('fill', this.options.gridTextColor);\\n };\\n\\n Line.prototype.drawLinePath = function(path, lineColor, lineIndex) {\\n return this.raphael.path(path).attr('stroke', lineColor).attr('stroke-width', this.lineWidthForSeries(lineIndex));\\n };\\n\\n Line.prototype.drawLinePoint = function(xPos, yPos, pointColor, lineIndex) {\\n return this.raphael.circle(xPos, yPos, this.pointSizeForSeries(lineIndex)).attr('fill', pointColor).attr('stroke-width', this.pointStrokeWidthForSeries(lineIndex)).attr('stroke', this.pointStrokeColorForSeries(lineIndex));\\n };\\n\\n Line.prototype.pointStrokeWidthForSeries = function(index) {\\n return this.options.pointStrokeWidths[index % this.options.pointStrokeWidths.length];\\n };\\n\\n Line.prototype.pointStrokeColorForSeries = function(index) {\\n return this.options.pointStrokeColors[index % this.options.pointStrokeColors.length];\\n };\\n\\n Line.prototype.lineWidthForSeries = function(index) {\\n if (this.options.lineWidth instanceof Array) {\\n return this.options.lineWidth[index % this.options.lineWidth.length];\\n } else {\\n return this.options.lineWidth;\\n }\\n };\\n\\n Line.prototype.pointSizeForSeries = function(index) {\\n if (this.options.pointSize instanceof Array) {\\n return this.options.pointSize[index % this.options.pointSize.length];\\n } else {\\n return this.options.pointSize;\\n }\\n };\\n\\n Line.prototype.pointGrowSeries = function(index) {\\n return Raphael.animation({\\n r: this.pointSizeForSeries(index) + 3\\n }, 25, 'linear');\\n };\\n\\n Line.prototype.pointShrinkSeries = function(index) {\\n return Raphael.animation({\\n r: this.pointSizeForSeries(index)\\n }, 25, 'linear');\\n };\\n\\n return Line;\\n\\n })(Morris.Grid);\\n\\n Morris.labelSeries = function(dmin, dmax, pxwidth, specName, xLabelFormat) {\\n var d, d0, ddensity, name, ret, s, spec, t, _i, _len, _ref;\\n ddensity = 200 * (dmax - dmin) / pxwidth;\\n d0 = new Date(dmin);\\n spec = Morris.LABEL_SPECS[specName];\\n if (spec === void 0) {\\n _ref = Morris.AUTO_LABEL_ORDER;\\n for (_i = 0, _len = _ref.length; _i < _len; _i++) {\\n name = _ref[_i];\\n s = Morris.LABEL_SPECS[name];\\n if (ddensity >= s.span) {\\n spec = s;\\n break;\\n }\\n }\\n }\\n if (spec === void 0) {\\n spec = Morris.LABEL_SPECS[\\\"second\\\"];\\n }\\n if (xLabelFormat) {\\n spec = $.extend({}, spec, {\\n fmt: xLabelFormat\\n });\\n }\\n d = spec.start(d0);\\n ret = [];\\n while ((t = d.getTime()) <= dmax) {\\n if (t >= dmin) {\\n ret.push([spec.fmt(d), t]);\\n }\\n spec.incr(d);\\n }\\n return ret;\\n };\\n\\n minutesSpecHelper = function(interval) {\\n return {\\n span: interval * 60 * 1000,\\n start: function(d) {\\n return new Date(d.getFullYear(), d.getMonth(), d.getDate(), d.getHours());\\n },\\n fmt: function(d) {\\n return \\\"\\\" + (Morris.pad2(d.getHours())) + \\\":\\\" + (Morris.pad2(d.getMinutes()));\\n },\\n incr: function(d) {\\n return d.setUTCMinutes(d.getUTCMinutes() + interval);\\n }\\n };\\n };\\n\\n secondsSpecHelper = function(interval) {\\n return {\\n span: interval * 1000,\\n start: function(d) {\\n return new Date(d.getFullYear(), d.getMonth(), d.getDate(), d.getHours(), d.getMinutes());\\n },\\n fmt: function(d) {\\n return \\\"\\\" + (Morris.pad2(d.getHours())) + \\\":\\\" + (Morris.pad2(d.getMinutes())) + \\\":\\\" + (Morris.pad2(d.getSeconds()));\\n },\\n incr: function(d) {\\n return d.setUTCSeconds(d.getUTCSeconds() + interval);\\n }\\n };\\n };\\n\\n Morris.LABEL_SPECS = {\\n \\\"decade\\\": {\\n span: 172800000000,\\n start: function(d) {\\n return new Date(d.getFullYear() - d.getFullYear() % 10, 0, 1);\\n },\\n fmt: function(d) {\\n return \\\"\\\" + (d.getFullYear());\\n },\\n incr: function(d) {\\n return d.setFullYear(d.getFullYear() + 10);\\n }\\n },\\n \\\"year\\\": {\\n span: 17280000000,\\n start: function(d) {\\n return new Date(d.getFullYear(), 0, 1);\\n },\\n fmt: function(d) {\\n return \\\"\\\" + (d.getFullYear());\\n },\\n incr: function(d) {\\n return d.setFullYear(d.getFullYear() + 1);\\n }\\n },\\n \\\"month\\\": {\\n span: 2419200000,\\n start: function(d) {\\n return new Date(d.getFullYear(), d.getMonth(), 1);\\n },\\n fmt: function(d) {\\n return \\\"\\\" + (d.getFullYear()) + \\\"-\\\" + (Morris.pad2(d.getMonth() + 1));\\n },\\n incr: function(d) {\\n return d.setMonth(d.getMonth() + 1);\\n }\\n },\\n \\\"week\\\": {\\n span: 604800000,\\n start: function(d) {\\n return new Date(d.getFullYear(), d.getMonth(), d.getDate());\\n },\\n fmt: function(d) {\\n return \\\"\\\" + (d.getFullYear()) + \\\"-\\\" + (Morris.pad2(d.getMonth() + 1)) + \\\"-\\\" + (Morris.pad2(d.getDate()));\\n },\\n incr: function(d) {\\n return d.setDate(d.getDate() + 7);\\n }\\n },\\n \\\"day\\\": {\\n span: 86400000,\\n start: function(d) {\\n return new Date(d.getFullYear(), d.getMonth(), d.getDate());\\n },\\n fmt: function(d) {\\n return \\\"\\\" + (d.getFullYear()) + \\\"-\\\" + (Morris.pad2(d.getMonth() + 1)) + \\\"-\\\" + (Morris.pad2(d.getDate()));\\n },\\n incr: function(d) {\\n return d.setDate(d.getDate() + 1);\\n }\\n },\\n \\\"hour\\\": minutesSpecHelper(60),\\n \\\"30min\\\": minutesSpecHelper(30),\\n \\\"15min\\\": minutesSpecHelper(15),\\n \\\"10min\\\": minutesSpecHelper(10),\\n \\\"5min\\\": minutesSpecHelper(5),\\n \\\"minute\\\": minutesSpecHelper(1),\\n \\\"30sec\\\": secondsSpecHelper(30),\\n \\\"15sec\\\": secondsSpecHelper(15),\\n \\\"10sec\\\": secondsSpecHelper(10),\\n \\\"5sec\\\": secondsSpecHelper(5),\\n \\\"second\\\": secondsSpecHelper(1)\\n };\\n\\n Morris.AUTO_LABEL_ORDER = [\\\"decade\\\", \\\"year\\\", \\\"month\\\", \\\"week\\\", \\\"day\\\", \\\"hour\\\", \\\"30min\\\", \\\"15min\\\", \\\"10min\\\", \\\"5min\\\", \\\"minute\\\", \\\"30sec\\\", \\\"15sec\\\", \\\"10sec\\\", \\\"5sec\\\", \\\"second\\\"];\\n\\n Morris.Area = (function(_super) {\\n var areaDefaults;\\n\\n __extends(Area, _super);\\n\\n areaDefaults = {\\n fillOpacity: 'auto',\\n behaveLikeLine: false\\n };\\n\\n function Area(options) {\\n var areaOptions;\\n if (!(this instanceof Morris.Area)) {\\n return new Morris.Area(options);\\n }\\n areaOptions = $.extend({}, areaDefaults, options);\\n this.cumulative = !areaOptions.behaveLikeLine;\\n if (areaOptions.fillOpacity === 'auto') {\\n areaOptions.fillOpacity = areaOptions.behaveLikeLine ? .8 : 1;\\n }\\n Area.__super__.constructor.call(this, areaOptions);\\n }\\n\\n Area.prototype.calcPoints = function() {\\n var row, total, y, _i, _len, _ref, _results;\\n _ref = this.data;\\n _results = [];\\n for (_i = 0, _len = _ref.length; _i < _len; _i++) {\\n row = _ref[_i];\\n row._x = this.transX(row.x);\\n total = 0;\\n row._y = (function() {\\n var _j, _len1, _ref1, _results1;\\n _ref1 = row.y;\\n _results1 = [];\\n for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) {\\n y = _ref1[_j];\\n if (this.options.behaveLikeLine) {\\n _results1.push(this.transY(y));\\n } else {\\n total += y || 0;\\n _results1.push(this.transY(total));\\n }\\n }\\n return _results1;\\n }).call(this);\\n _results.push(row._ymax = Math.max.apply(Math, row._y));\\n }\\n return _results;\\n };\\n\\n Area.prototype.drawSeries = function() {\\n var i, range, _i, _j, _k, _len, _ref, _ref1, _results, _results1, _results2;\\n this.seriesPoints = [];\\n if (this.options.behaveLikeLine) {\\n range = (function() {\\n _results = [];\\n for (var _i = 0, _ref = this.options.ykeys.length - 1; 0 <= _ref ? _i <= _ref : _i >= _ref; 0 <= _ref ? _i++ : _i--){ _results.push(_i); }\\n return _results;\\n }).apply(this);\\n } else {\\n range = (function() {\\n _results1 = [];\\n for (var _j = _ref1 = this.options.ykeys.length - 1; _ref1 <= 0 ? _j <= 0 : _j >= 0; _ref1 <= 0 ? _j++ : _j--){ _results1.push(_j); }\\n return _results1;\\n }).apply(this);\\n }\\n _results2 = [];\\n for (_k = 0, _len = range.length; _k < _len; _k++) {\\n i = range[_k];\\n this._drawFillFor(i);\\n this._drawLineFor(i);\\n _results2.push(this._drawPointFor(i));\\n }\\n return _results2;\\n };\\n\\n Area.prototype._drawFillFor = function(index) {\\n var path;\\n path = this.paths[index];\\n if (path !== null) {\\n path = path + (\\\"L\\\" + (this.transX(this.xmax)) + \\\",\\\" + this.bottom + \\\"L\\\" + (this.transX(this.xmin)) + \\\",\\\" + this.bottom + \\\"Z\\\");\\n return this.drawFilledPath(path, this.fillForSeries(index));\\n }\\n };\\n\\n Area.prototype.fillForSeries = function(i) {\\n var color;\\n color = Raphael.rgb2hsl(this.colorFor(this.data[i], i, 'line'));\\n return Raphael.hsl(color.h, this.options.behaveLikeLine ? color.s * 0.9 : color.s * 0.75, Math.min(0.98, this.options.behaveLikeLine ? color.l * 1.2 : color.l * 1.25));\\n };\\n\\n Area.prototype.drawFilledPath = function(path, fill) {\\n return this.raphael.path(path).attr('fill', fill).attr('fill-opacity', this.options.fillOpacity).attr('stroke', 'none');\\n };\\n\\n return Area;\\n\\n })(Morris.Line);\\n\\n Morris.Bar = (function(_super) {\\n __extends(Bar, _super);\\n\\n function Bar(options) {\\n this.onHoverOut = __bind(this.onHoverOut, this);\\n this.onHoverMove = __bind(this.onHoverMove, this);\\n this.onGridClick = __bind(this.onGridClick, this);\\n if (!(this instanceof Morris.Bar)) {\\n return new Morris.Bar(options);\\n }\\n Bar.__super__.constructor.call(this, $.extend({}, options, {\\n parseTime: false\\n }));\\n }\\n\\n Bar.prototype.init = function() {\\n this.cumulative = this.options.stacked;\\n if (this.options.hideHover !== 'always') {\\n this.hover = new Morris.Hover({\\n parent: this.el\\n });\\n this.on('hovermove', this.onHoverMove);\\n this.on('hoverout', this.onHoverOut);\\n return this.on('gridclick', this.onGridClick);\\n }\\n };\\n\\n Bar.prototype.defaults = {\\n barSizeRatio: 0.75,\\n barGap: 3,\\n barColors: ['#0b62a4', '#7a92a3', '#4da74d', '#afd8f8', '#edc240', '#cb4b4b', '#9440ed'],\\n barOpacity: 1.0,\\n barRadius: [0, 0, 0, 0],\\n xLabelMargin: 50\\n };\\n\\n Bar.prototype.calc = function() {\\n var _ref;\\n this.calcBars();\\n if (this.options.hideHover === false) {\\n return (_ref = this.hover).update.apply(_ref, this.hoverContentForRow(this.data.length - 1));\\n }\\n };\\n\\n Bar.prototype.calcBars = function() {\\n var idx, row, y, _i, _len, _ref, _results;\\n _ref = this.data;\\n _results = [];\\n for (idx = _i = 0, _len = _ref.length; _i < _len; idx = ++_i) {\\n row = _ref[idx];\\n row._x = this.left + this.width * (idx + 0.5) / this.data.length;\\n _results.push(row._y = (function() {\\n var _j, _len1, _ref1, _results1;\\n _ref1 = row.y;\\n _results1 = [];\\n for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) {\\n y = _ref1[_j];\\n if (y != null) {\\n _results1.push(this.transY(y));\\n } else {\\n _results1.push(null);\\n }\\n }\\n return _results1;\\n }).call(this));\\n }\\n return _results;\\n };\\n\\n Bar.prototype.draw = function() {\\n var _ref;\\n if ((_ref = this.options.axes) === true || _ref === 'both' || _ref === 'x') {\\n this.drawXAxis();\\n }\\n return this.drawSeries();\\n };\\n\\n Bar.prototype.drawXAxis = function() {\\n var i, label, labelBox, margin, offset, prevAngleMargin, prevLabelMargin, row, textBox, ypos, _i, _ref, _results;\\n ypos = this.bottom + (this.options.xAxisLabelTopPadding || this.options.padding / 2);\\n prevLabelMargin = null;\\n prevAngleMargin = null;\\n _results = [];\\n for (i = _i = 0, _ref = this.data.length; 0 <= _ref ? _i < _ref : _i > _ref; i = 0 <= _ref ? ++_i : --_i) {\\n row = this.data[this.data.length - 1 - i];\\n label = this.drawXAxisLabel(row._x, ypos, row.label);\\n textBox = label.getBBox();\\n label.transform(\\\"r\\\" + (-this.options.xLabelAngle));\\n labelBox = label.getBBox();\\n label.transform(\\\"t0,\\\" + (labelBox.height / 2) + \\\"...\\\");\\n if (this.options.xLabelAngle !== 0) {\\n offset = -0.5 * textBox.width * Math.cos(this.options.xLabelAngle * Math.PI / 180.0);\\n label.transform(\\\"t\\\" + offset + \\\",0...\\\");\\n }\\n if (((prevLabelMargin == null) || prevLabelMargin >= labelBox.x + labelBox.width || (prevAngleMargin != null) && prevAngleMargin >= labelBox.x) && labelBox.x >= 0 && (labelBox.x + labelBox.width) < this.el.width()) {\\n if (this.options.xLabelAngle !== 0) {\\n margin = 1.25 * this.options.gridTextSize / Math.sin(this.options.xLabelAngle * Math.PI / 180.0);\\n prevAngleMargin = labelBox.x - margin;\\n }\\n _results.push(prevLabelMargin = labelBox.x - this.options.xLabelMargin);\\n } else {\\n _results.push(label.remove());\\n }\\n }\\n return _results;\\n };\\n\\n Bar.prototype.drawSeries = function() {\\n var barWidth, bottom, groupWidth, idx, lastTop, left, leftPadding, numBars, row, sidx, size, spaceLeft, top, ypos, zeroPos;\\n groupWidth = this.width / this.options.data.length;\\n numBars = this.options.stacked ? 1 : this.options.ykeys.length;\\n barWidth = (groupWidth * this.options.barSizeRatio - this.options.barGap * (numBars - 1)) / numBars;\\n if (this.options.barSize) {\\n barWidth = Math.min(barWidth, this.options.barSize);\\n }\\n spaceLeft = groupWidth - barWidth * numBars - this.options.barGap * (numBars - 1);\\n leftPadding = spaceLeft / 2;\\n zeroPos = this.ymin <= 0 && this.ymax >= 0 ? this.transY(0) : null;\\n return this.bars = (function() {\\n var _i, _len, _ref, _results;\\n _ref = this.data;\\n _results = [];\\n for (idx = _i = 0, _len = _ref.length; _i < _len; idx = ++_i) {\\n row = _ref[idx];\\n lastTop = 0;\\n _results.push((function() {\\n var _j, _len1, _ref1, _results1;\\n _ref1 = row._y;\\n _results1 = [];\\n for (sidx = _j = 0, _len1 = _ref1.length; _j < _len1; sidx = ++_j) {\\n ypos = _ref1[sidx];\\n if (ypos !== null) {\\n if (zeroPos) {\\n top = Math.min(ypos, zeroPos);\\n bottom = Math.max(ypos, zeroPos);\\n } else {\\n top = ypos;\\n bottom = this.bottom;\\n }\\n left = this.left + idx * groupWidth + leftPadding;\\n if (!this.options.stacked) {\\n left += sidx * (barWidth + this.options.barGap);\\n }\\n size = bottom - top;\\n if (this.options.verticalGridCondition && this.options.verticalGridCondition(row.x)) {\\n this.drawBar(this.left + idx * groupWidth, this.top, groupWidth, Math.abs(this.top - this.bottom), this.options.verticalGridColor, this.options.verticalGridOpacity, this.options.barRadius);\\n }\\n if (this.options.stacked) {\\n top -= lastTop;\\n }\\n this.drawBar(left, top, barWidth, size, this.colorFor(row, sidx, 'bar'), this.options.barOpacity, this.options.barRadius);\\n _results1.push(lastTop += size);\\n } else {\\n _results1.push(null);\\n }\\n }\\n return _results1;\\n }).call(this));\\n }\\n return _results;\\n }).call(this);\\n };\\n\\n Bar.prototype.colorFor = function(row, sidx, type) {\\n var r, s;\\n if (typeof this.options.barColors === 'function') {\\n r = {\\n x: row.x,\\n y: row.y[sidx],\\n label: row.label\\n };\\n s = {\\n index: sidx,\\n key: this.options.ykeys[sidx],\\n label: this.options.labels[sidx]\\n };\\n return this.options.barColors.call(this, r, s, type);\\n } else {\\n return this.options.barColors[sidx % this.options.barColors.length];\\n }\\n };\\n\\n Bar.prototype.hitTest = function(x) {\\n if (this.data.length === 0) {\\n return null;\\n }\\n x = Math.max(Math.min(x, this.right), this.left);\\n return Math.min(this.data.length - 1, Math.floor((x - this.left) / (this.width / this.data.length)));\\n };\\n\\n Bar.prototype.onGridClick = function(x, y) {\\n var index;\\n index = this.hitTest(x);\\n return this.fire('click', index, this.data[index].src, x, y);\\n };\\n\\n Bar.prototype.onHoverMove = function(x, y) {\\n var index, _ref;\\n index = this.hitTest(x);\\n return (_ref = this.hover).update.apply(_ref, this.hoverContentForRow(index));\\n };\\n\\n Bar.prototype.onHoverOut = function() {\\n if (this.options.hideHover !== false) {\\n return this.hover.hide();\\n }\\n };\\n\\n Bar.prototype.hoverContentForRow = function(index) {\\n var content, j, row, x, y, _i, _len, _ref;\\n row = this.data[index];\\n content = \\\"<div class='morris-hover-row-label'>\\\" + row.label + \\\"</div>\\\";\\n _ref = row.y;\\n for (j = _i = 0, _len = _ref.length; _i < _len; j = ++_i) {\\n y = _ref[j];\\n content += \\\"<div class='morris-hover-point' style='color: \\\" + (this.colorFor(row, j, 'label')) + \\\"'>\\\\n \\\" + this.options.labels[j] + \\\":\\\\n \\\" + (this.yLabelFormat(y)) + \\\"\\\\n</div>\\\";\\n }\\n if (typeof this.options.hoverCallback === 'function') {\\n content = this.options.hoverCallback(index, this.options, content, row.src);\\n }\\n x = this.left + (index + 0.5) * this.width / this.data.length;\\n return [content, x];\\n };\\n\\n Bar.prototype.drawXAxisLabel = function(xPos, yPos, text) {\\n var label;\\n return label = this.raphael.text(xPos, yPos, text).attr('font-size', this.options.gridTextSize).attr('font-family', this.options.gridTextFamily).attr('font-weight', this.options.gridTextWeight).attr('fill', this.options.gridTextColor);\\n };\\n\\n Bar.prototype.drawBar = function(xPos, yPos, width, height, barColor, opacity, radiusArray) {\\n var maxRadius, path;\\n maxRadius = Math.max.apply(Math, radiusArray);\\n if (maxRadius === 0 || maxRadius > height) {\\n path = this.raphael.rect(xPos, yPos, width, height);\\n } else {\\n path = this.raphael.path(this.roundedRect(xPos, yPos, width, height, radiusArray));\\n }\\n return path.attr('fill', barColor).attr('fill-opacity', opacity).attr('stroke', 'none');\\n };\\n\\n Bar.prototype.roundedRect = function(x, y, w, h, r) {\\n if (r == null) {\\n r = [0, 0, 0, 0];\\n }\\n return [\\\"M\\\", x, r[0] + y, \\\"Q\\\", x, y, x + r[0], y, \\\"L\\\", x + w - r[1], y, \\\"Q\\\", x + w, y, x + w, y + r[1], \\\"L\\\", x + w, y + h - r[2], \\\"Q\\\", x + w, y + h, x + w - r[2], y + h, \\\"L\\\", x + r[3], y + h, \\\"Q\\\", x, y + h, x, y + h - r[3], \\\"Z\\\"];\\n };\\n\\n return Bar;\\n\\n })(Morris.Grid);\\n\\n Morris.Donut = (function(_super) {\\n __extends(Donut, _super);\\n\\n Donut.prototype.defaults = {\\n colors: ['#0B62A4', '#3980B5', '#679DC6', '#95BBD7', '#B0CCE1', '#095791', '#095085', '#083E67', '#052C48', '#042135'],\\n backgroundColor: '#FFFFFF',\\n labelColor: '#000000',\\n formatter: Morris.commas,\\n resize: false\\n };\\n\\n function Donut(options) {\\n this.resizeHandler = __bind(this.resizeHandler, this);\\n this.select = __bind(this.select, this);\\n this.click = __bind(this.click, this);\\n var _this = this;\\n if (!(this instanceof Morris.Donut)) {\\n return new Morris.Donut(options);\\n }\\n this.options = $.extend({}, this.defaults, options);\\n if (typeof options.element === 'string') {\\n this.el = $(document.getElementById(options.element));\\n } else {\\n this.el = $(options.element);\\n }\\n if (this.el === null || this.el.length === 0) {\\n throw new Error(\\\"Graph placeholder not found.\\\");\\n }\\n if (options.data === void 0 || options.data.length === 0) {\\n return;\\n }\\n this.raphael = new Raphael(this.el[0]);\\n if (this.options.resize) {\\n $(window).bind('resize', function(evt) {\\n if (_this.timeoutId != null) {\\n window.clearTimeout(_this.timeoutId);\\n }\\n return _this.timeoutId = window.setTimeout(_this.resizeHandler, 100);\\n });\\n }\\n this.setData(options.data);\\n }\\n\\n Donut.prototype.redraw = function() {\\n var C, cx, cy, i, idx, last, max_value, min, next, seg, total, value, w, _i, _j, _k, _len, _len1, _len2, _ref, _ref1, _ref2, _results;\\n this.raphael.clear();\\n cx = this.el.width() / 2;\\n cy = this.el.height() / 2;\\n w = (Math.min(cx, cy) - 10) / 3;\\n total = 0;\\n _ref = this.values;\\n for (_i = 0, _len = _ref.length; _i < _len; _i++) {\\n value = _ref[_i];\\n total += value;\\n }\\n min = 5 / (2 * w);\\n C = 1.9999 * Math.PI - min * this.data.length;\\n last = 0;\\n idx = 0;\\n this.segments = [];\\n _ref1 = this.values;\\n for (i = _j = 0, _len1 = _ref1.length; _j < _len1; i = ++_j) {\\n value = _ref1[i];\\n next = last + min + C * (value / total);\\n seg = new Morris.DonutSegment(cx, cy, w * 2, w, last, next, this.data[i].color || this.options.colors[idx % this.options.colors.length], this.options.backgroundColor, idx, this.raphael);\\n seg.render();\\n this.segments.push(seg);\\n seg.on('hover', this.select);\\n seg.on('click', this.click);\\n last = next;\\n idx += 1;\\n }\\n this.text1 = this.drawEmptyDonutLabel(cx, cy - 10, this.options.labelColor, 15, 800);\\n this.text2 = this.drawEmptyDonutLabel(cx, cy + 10, this.options.labelColor, 14);\\n max_value = Math.max.apply(Math, this.values);\\n idx = 0;\\n _ref2 = this.values;\\n _results = [];\\n for (_k = 0, _len2 = _ref2.length; _k < _len2; _k++) {\\n value = _ref2[_k];\\n if (value === max_value) {\\n this.select(idx);\\n break;\\n }\\n _results.push(idx += 1);\\n }\\n return _results;\\n };\\n\\n Donut.prototype.setData = function(data) {\\n var row;\\n this.data = data;\\n this.values = (function() {\\n var _i, _len, _ref, _results;\\n _ref = this.data;\\n _results = [];\\n for (_i = 0, _len = _ref.length; _i < _len; _i++) {\\n row = _ref[_i];\\n _results.push(parseFloat(row.value));\\n }\\n return _results;\\n }).call(this);\\n return this.redraw();\\n };\\n\\n Donut.prototype.click = function(idx) {\\n return this.fire('click', idx, this.data[idx]);\\n };\\n\\n Donut.prototype.select = function(idx) {\\n var row, s, segment, _i, _len, _ref;\\n _ref = this.segments;\\n for (_i = 0, _len = _ref.length; _i < _len; _i++) {\\n s = _ref[_i];\\n s.deselect();\\n }\\n segment = this.segments[idx];\\n segment.select();\\n row = this.data[idx];\\n return this.setLabels(row.label, this.options.formatter(row.value, row));\\n };\\n\\n Donut.prototype.setLabels = function(label1, label2) {\\n var inner, maxHeightBottom, maxHeightTop, maxWidth, text1bbox, text1scale, text2bbox, text2scale;\\n inner = (Math.min(this.el.width() / 2, this.el.height() / 2) - 10) * 2 / 3;\\n maxWidth = 1.8 * inner;\\n maxHeightTop = inner / 2;\\n maxHeightBottom = inner / 3;\\n this.text1.attr({\\n text: label1,\\n transform: ''\\n });\\n text1bbox = this.text1.getBBox();\\n text1scale = Math.min(maxWidth / text1bbox.width, maxHeightTop / text1bbox.height);\\n this.text1.attr({\\n transform: \\\"S\\\" + text1scale + \\\",\\\" + text1scale + \\\",\\\" + (text1bbox.x + text1bbox.width / 2) + \\\",\\\" + (text1bbox.y + text1bbox.height)\\n });\\n this.text2.attr({\\n text: label2,\\n transform: ''\\n });\\n text2bbox = this.text2.getBBox();\\n text2scale = Math.min(maxWidth / text2bbox.width, maxHeightBottom / text2bbox.height);\\n return this.text2.attr({\\n transform: \\\"S\\\" + text2scale + \\\",\\\" + text2scale + \\\",\\\" + (text2bbox.x + text2bbox.width / 2) + \\\",\\\" + text2bbox.y\\n });\\n };\\n\\n Donut.prototype.drawEmptyDonutLabel = function(xPos, yPos, color, fontSize, fontWeight) {\\n var text;\\n text = this.raphael.text(xPos, yPos, '').attr('font-size', fontSize).attr('fill', color);\\n if (fontWeight != null) {\\n text.attr('font-weight', fontWeight);\\n }\\n return text;\\n };\\n\\n Donut.prototype.resizeHandler = function() {\\n this.timeoutId = null;\\n this.raphael.setSize(this.el.width(), this.el.height());\\n return this.redraw();\\n };\\n\\n return Donut;\\n\\n })(Morris.EventEmitter);\\n\\n Morris.DonutSegment = (function(_super) {\\n __extends(DonutSegment, _super);\\n\\n function DonutSegment(cx, cy, inner, outer, p0, p1, color, backgroundColor, index, raphael) {\\n this.cx = cx;\\n this.cy = cy;\\n this.inner = inner;\\n this.outer = outer;\\n this.color = color;\\n this.backgroundColor = backgroundColor;\\n this.index = index;\\n this.raphael = raphael;\\n this.deselect = __bind(this.deselect, this);\\n this.select = __bind(this.select, this);\\n this.sin_p0 = Math.sin(p0);\\n this.cos_p0 = Math.cos(p0);\\n this.sin_p1 = Math.sin(p1);\\n this.cos_p1 = Math.cos(p1);\\n this.is_long = (p1 - p0) > Math.PI ? 1 : 0;\\n this.path = this.calcSegment(this.inner + 3, this.inner + this.outer - 5);\\n this.selectedPath = this.calcSegment(this.inner + 3, this.inner + this.outer);\\n this.hilight = this.calcArc(this.inner);\\n }\\n\\n DonutSegment.prototype.calcArcPoints = function(r) {\\n return [this.cx + r * this.sin_p0, this.cy + r * this.cos_p0, this.cx + r * this.sin_p1, this.cy + r * this.cos_p1];\\n };\\n\\n DonutSegment.prototype.calcSegment = function(r1, r2) {\\n var ix0, ix1, iy0, iy1, ox0, ox1, oy0, oy1, _ref, _ref1;\\n _ref = this.calcArcPoints(r1), ix0 = _ref[0], iy0 = _ref[1], ix1 = _ref[2], iy1 = _ref[3];\\n _ref1 = this.calcArcPoints(r2), ox0 = _ref1[0], oy0 = _ref1[1], ox1 = _ref1[2], oy1 = _ref1[3];\\n return (\\\"M\\\" + ix0 + \\\",\\\" + iy0) + (\\\"A\\\" + r1 + \\\",\\\" + r1 + \\\",0,\\\" + this.is_long + \\\",0,\\\" + ix1 + \\\",\\\" + iy1) + (\\\"L\\\" + ox1 + \\\",\\\" + oy1) + (\\\"A\\\" + r2 + \\\",\\\" + r2 + \\\",0,\\\" + this.is_long + \\\",1,\\\" + ox0 + \\\",\\\" + oy0) + \\\"Z\\\";\\n };\\n\\n DonutSegment.prototype.calcArc = function(r) {\\n var ix0, ix1, iy0, iy1, _ref;\\n _ref = this.calcArcPoints(r), ix0 = _ref[0], iy0 = _ref[1], ix1 = _ref[2], iy1 = _ref[3];\\n return (\\\"M\\\" + ix0 + \\\",\\\" + iy0) + (\\\"A\\\" + r + \\\",\\\" + r + \\\",0,\\\" + this.is_long + \\\",0,\\\" + ix1 + \\\",\\\" + iy1);\\n };\\n\\n DonutSegment.prototype.render = function() {\\n var _this = this;\\n this.arc = this.drawDonutArc(this.hilight, this.color);\\n return this.seg = this.drawDonutSegment(this.path, this.color, this.backgroundColor, function() {\\n return _this.fire('hover', _this.index);\\n }, function() {\\n return _this.fire('click', _this.index);\\n });\\n };\\n\\n DonutSegment.prototype.drawDonutArc = function(path, color) {\\n return this.raphael.path(path).attr({\\n stroke: color,\\n 'stroke-width': 2,\\n opacity: 0\\n });\\n };\\n\\n DonutSegment.prototype.drawDonutSegment = function(path, fillColor, strokeColor, hoverFunction, clickFunction) {\\n return this.raphael.path(path).attr({\\n fill: fillColor,\\n stroke: strokeColor,\\n 'stroke-width': 3\\n }).hover(hoverFunction).click(clickFunction);\\n };\\n\\n DonutSegment.prototype.select = function() {\\n if (!this.selected) {\\n this.seg.animate({\\n path: this.selectedPath\\n }, 150, '<>');\\n this.arc.animate({\\n opacity: 1\\n }, 150, '<>');\\n return this.selected = true;\\n }\\n };\\n\\n DonutSegment.prototype.deselect = function() {\\n if (this.selected) {\\n this.seg.animate({\\n path: this.path\\n }, 150, '<>');\\n this.arc.animate({\\n opacity: 0\\n }, 150, '<>');\\n return this.selected = false;\\n }\\n };\\n\\n return DonutSegment;\\n\\n })(Morris.EventEmitter);\\n\\n}).call(this);\\n\"\n\n/***/ }),\n\n/***/ 2187:\n/***/ (function(module, exports, __webpack_require__) {\n\n__webpack_require__(3)(__webpack_require__(2188))\n\n/***/ }),\n\n/***/ 2188:\n/***/ (function(module, exports) {\n\nmodule.exports = \"(function(t,e){\\\"object\\\"==typeof exports?module.exports=e():\\\"function\\\"==typeof define&&define.amd?define(e):t.Spinner=e()})(this,function(){\\\"use strict\\\";function t(t,e){var i,n=document.createElement(t||\\\"div\\\");for(i in e)n[i]=e[i];return n}function e(t){for(var e=1,i=arguments.length;i>e;e++)t.appendChild(arguments[e]);return t}function i(t,e,i,n){var r=[\\\"opacity\\\",e,~~(100*t),i,n].join(\\\"-\\\"),o=.01+100*(i/n),a=Math.max(1-(1-t)/e*(100-o),t),s=u.substring(0,u.indexOf(\\\"Animation\\\")).toLowerCase(),l=s&&\\\"-\\\"+s+\\\"-\\\"||\\\"\\\";return c[r]||(p.insertRule(\\\"@\\\"+l+\\\"keyframes \\\"+r+\\\"{\\\"+\\\"0%{opacity:\\\"+a+\\\"}\\\"+o+\\\"%{opacity:\\\"+t+\\\"}\\\"+(o+.01)+\\\"%{opacity:1}\\\"+(o+e)%100+\\\"%{opacity:\\\"+t+\\\"}\\\"+\\\"100%{opacity:\\\"+a+\\\"}\\\"+\\\"}\\\",p.cssRules.length),c[r]=1),r}function n(t,e){var i,n,r=t.style;for(e=e.charAt(0).toUpperCase()+e.slice(1),n=0;d.length>n;n++)if(i=d[n]+e,void 0!==r[i])return i;return void 0!==r[e]?e:void 0}function r(t,e){for(var i in e)t.style[n(t,i)||i]=e[i];return t}function o(t){for(var e=1;arguments.length>e;e++){var i=arguments[e];for(var n in i)void 0===t[n]&&(t[n]=i[n])}return t}function a(t,e){return\\\"string\\\"==typeof t?t:t[e%t.length]}function s(t){this.opts=o(t||{},s.defaults,f)}function l(){function i(e,i){return t(\\\"<\\\"+e+' xmlns=\\\"urn:schemas-microsoft.com:vml\\\" class=\\\"spin-vml\\\">',i)}p.addRule(\\\".spin-vml\\\",\\\"behavior:url(#default#VML)\\\"),s.prototype.lines=function(t,n){function o(){return r(i(\\\"group\\\",{coordsize:d+\\\" \\\"+d,coordorigin:-u+\\\" \\\"+-u}),{width:d,height:d})}function s(t,s,l){e(p,e(r(o(),{rotation:360/n.lines*t+\\\"deg\\\",left:~~s}),e(r(i(\\\"roundrect\\\",{arcsize:n.corners}),{width:u,height:n.width,left:n.radius,top:-n.width>>1,filter:l}),i(\\\"fill\\\",{color:a(n.color,t),opacity:n.opacity}),i(\\\"stroke\\\",{opacity:0}))))}var l,u=n.length+n.width,d=2*u,c=2*-(n.width+n.length)+\\\"px\\\",p=r(o(),{position:\\\"absolute\\\",top:c,left:c});if(n.shadow)for(l=1;n.lines>=l;l++)s(l,-2,\\\"progid:DXImageTransform.Microsoft.Blur(pixelradius=2,makeshadow=1,shadowopacity=.3)\\\");for(l=1;n.lines>=l;l++)s(l);return e(t,p)},s.prototype.opacity=function(t,e,i,n){var r=t.firstChild;n=n.shadow&&n.lines||0,r&&r.childNodes.length>e+n&&(r=r.childNodes[e+n],r=r&&r.firstChild,r=r&&r.firstChild,r&&(r.opacity=i))}}var u,d=[\\\"webkit\\\",\\\"Moz\\\",\\\"ms\\\",\\\"O\\\"],c={},p=function(){var i=t(\\\"style\\\",{type:\\\"text/css\\\"});return e(document.getElementsByTagName(\\\"head\\\")[0],i),i.sheet||i.styleSheet}(),f={lines:12,length:7,width:5,radius:10,rotate:0,corners:1,color:\\\"#000\\\",direction:1,speed:1,trail:100,opacity:.25,fps:20,zIndex:2e9,className:\\\"spinner\\\",top:\\\"50%\\\",left:\\\"50%\\\",position:\\\"absolute\\\"};s.defaults={},o(s.prototype,{spin:function(e){this.stop();var i=this,n=i.opts,o=i.el=r(t(0,{className:n.className}),{position:n.position,width:0,zIndex:n.zIndex});if(n.radius+n.length+n.width,r(o,{left:n.left,top:n.top}),e&&e.insertBefore(o,e.firstChild||null),o.setAttribute(\\\"role\\\",\\\"progressbar\\\"),i.lines(o,i.opts),!u){var a,s=0,l=(n.lines-1)*(1-n.direction)/2,d=n.fps,c=d/n.speed,p=(1-n.opacity)/(c*n.trail/100),f=c/n.lines;(function h(){s++;for(var t=0;n.lines>t;t++)a=Math.max(1-(s+(n.lines-t)*f)%c*p,n.opacity),i.opacity(o,t*n.direction+l,a,n);i.timeout=i.el&&setTimeout(h,~~(1e3/d))})()}return i},stop:function(){var t=this.el;return t&&(clearTimeout(this.timeout),t.parentNode&&t.parentNode.removeChild(t),this.el=void 0),this},lines:function(n,o){function s(e,i){return r(t(),{position:\\\"absolute\\\",width:o.length+o.width+\\\"px\\\",height:o.width+\\\"px\\\",background:e,boxShadow:i,transformOrigin:\\\"left\\\",transform:\\\"rotate(\\\"+~~(360/o.lines*d+o.rotate)+\\\"deg) translate(\\\"+o.radius+\\\"px\\\"+\\\",0)\\\",borderRadius:(o.corners*o.width>>1)+\\\"px\\\"})}for(var l,d=0,c=(o.lines-1)*(1-o.direction)/2;o.lines>d;d++)l=r(t(),{position:\\\"absolute\\\",top:1+~(o.width/2)+\\\"px\\\",transform:o.hwaccel?\\\"translate3d(0,0,0)\\\":\\\"\\\",opacity:o.opacity,animation:u&&i(o.opacity,o.trail,c+d*o.direction,o.lines)+\\\" \\\"+1/o.speed+\\\"s linear infinite\\\"}),o.shadow&&e(l,r(s(\\\"#000\\\",\\\"0 0 4px #000\\\"),{top:\\\"2px\\\"})),e(n,e(l,s(a(o.color,d),\\\"0 0 1px rgba(0,0,0,.1)\\\")));return n},opacity:function(t,e,i){t.childNodes.length>e&&(t.childNodes[e].style.opacity=i)}});var h=r(t(\\\"group\\\"),{behavior:\\\"url(#default#VML)\\\"});return!n(h,\\\"transform\\\")&&h.adj?l():u=n(h,\\\"animation\\\"),s});\"\n\n/***/ }),\n\n/***/ 2189:\n/***/ (function(module, exports, __webpack_require__) {\n\n__webpack_require__(3)(__webpack_require__(2190))\n\n/***/ }),\n\n/***/ 2190:\n/***/ (function(module, exports) {\n\nmodule.exports = \"/*!\\n * Ladda 0.9.8 (2015-03-19, 17:22)\\n * http://lab.hakim.se/ladda\\n * MIT licensed\\n *\\n * Copyright (C) 2015 Hakim El Hattab, http://hakim.se\\n */\\n(function(t,e){\\\"object\\\"==typeof exports?module.exports=e(require(\\\"spin.js\\\")):\\\"function\\\"==typeof define&&define.amd?define([\\\"spin.min.js\\\"],e):t.Ladda=e(t.Spinner)})(this,function(t){\\\"use strict\\\";function e(t){if(t===void 0)return console.warn(\\\"Ladda button target must be defined.\\\"),void 0;t.querySelector(\\\".ladda-label\\\")||(t.innerHTML='<span class=\\\"ladda-label\\\">'+t.innerHTML+\\\"</span>\\\");var e,n=t.querySelector(\\\".ladda-spinner\\\");n||(n=document.createElement(\\\"span\\\"),n.className=\\\"ladda-spinner\\\"),t.appendChild(n);var r,a={start:function(){return e||(e=o(t)),t.setAttribute(\\\"disabled\\\",\\\"\\\"),t.setAttribute(\\\"data-loading\\\",\\\"\\\"),clearTimeout(r),e.spin(n),this.setProgress(0),this},startAfter:function(t){return clearTimeout(r),r=setTimeout(function(){a.start()},t),this},stop:function(){return t.removeAttribute(\\\"disabled\\\"),t.removeAttribute(\\\"data-loading\\\"),clearTimeout(r),e&&(r=setTimeout(function(){e.stop()},1e3)),this},toggle:function(){return this.isLoading()?this.stop():this.start(),this},setProgress:function(e){e=Math.max(Math.min(e,1),0);var n=t.querySelector(\\\".ladda-progress\\\");0===e&&n&&n.parentNode?n.parentNode.removeChild(n):(n||(n=document.createElement(\\\"div\\\"),n.className=\\\"ladda-progress\\\",t.appendChild(n)),n.style.width=(e||0)*t.offsetWidth+\\\"px\\\")},enable:function(){return this.stop(),this},disable:function(){return this.stop(),t.setAttribute(\\\"disabled\\\",\\\"\\\"),this},isLoading:function(){return t.hasAttribute(\\\"data-loading\\\")},remove:function(){clearTimeout(r),t.removeAttribute(\\\"disabled\\\",\\\"\\\"),t.removeAttribute(\\\"data-loading\\\",\\\"\\\"),e&&(e.stop(),e=null);for(var n=0,i=u.length;i>n;n++)if(a===u[n]){u.splice(n,1);break}}};return u.push(a),a}function n(t,e){for(;t.parentNode&&t.tagName!==e;)t=t.parentNode;return e===t.tagName?t:void 0}function r(t){for(var e=[\\\"input\\\",\\\"textarea\\\",\\\"select\\\"],n=[],r=0;e.length>r;r++)for(var a=t.getElementsByTagName(e[r]),i=0;a.length>i;i++)a[i].hasAttribute(\\\"required\\\")&&n.push(a[i]);return n}function a(t,a){a=a||{};var i=[];\\\"string\\\"==typeof t?i=s(document.querySelectorAll(t)):\\\"object\\\"==typeof t&&\\\"string\\\"==typeof t.nodeName&&(i=[t]);for(var o=0,u=i.length;u>o;o++)(function(){var t=i[o];if(\\\"function\\\"==typeof t.addEventListener){var s=e(t),u=-1;t.addEventListener(\\\"click\\\",function(){var e=!0,i=n(t,\\\"FORM\\\");if(i!==void 0)for(var o=r(i),d=0;o.length>d;d++)\\\"\\\"===o[d].value.replace(/^\\\\s+|\\\\s+$/g,\\\"\\\")&&(e=!1),\\\"checkbox\\\"!==o[d].type&&\\\"radio\\\"!==o[d].type||o[d].checked||(e=!1),\\\"email\\\"===o[d].type&&(e=/^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\\\\.[a-zA-Z0-9-.]+$/.test(o[d].value));e&&(s.startAfter(1),\\\"number\\\"==typeof a.timeout&&(clearTimeout(u),u=setTimeout(s.stop,a.timeout)),\\\"function\\\"==typeof a.callback&&a.callback.apply(null,[s]))},!1)}})()}function i(){for(var t=0,e=u.length;e>t;t++)u[t].stop()}function o(e){var n,r=e.offsetHeight;0===r&&(r=parseFloat(window.getComputedStyle(e).height)),r>32&&(r*=.8),e.hasAttribute(\\\"data-spinner-size\\\")&&(r=parseInt(e.getAttribute(\\\"data-spinner-size\\\"),10)),e.hasAttribute(\\\"data-spinner-color\\\")&&(n=e.getAttribute(\\\"data-spinner-color\\\"));var a=12,i=.2*r,o=.6*i,s=7>i?2:3;return new t({color:n||\\\"#fff\\\",lines:a,radius:i,length:o,width:s,zIndex:\\\"auto\\\",top:\\\"auto\\\",left:\\\"auto\\\",className:\\\"\\\"})}function s(t){for(var e=[],n=0;t.length>n;n++)e.push(t[n]);return e}var u=[];return{bind:a,create:e,stopAll:i}});\"\n\n/***/ }),\n\n/***/ 2191:\n/***/ (function(module, exports, __webpack_require__) {\n\n__webpack_require__(3)(__webpack_require__(2192))\n\n/***/ }),\n\n/***/ 2192:\n/***/ (function(module, exports) {\n\nmodule.exports = \"/*! angular-ladda 0.3.1 */\\n!function(e,t){\\\"use strict\\\";if(\\\"function\\\"==typeof define&&define.amd)define([\\\"angular\\\",\\\"ladda\\\"],t);else{if(\\\"undefined\\\"==typeof module||\\\"object\\\"!=typeof module.exports)return t(e.angular,e.Ladda);module.exports=t(require(\\\"angular\\\"),require(\\\"ladda\\\"))}}(this,function(e,t){\\\"use strict\\\";var a=\\\"angular-ladda\\\";return e.module(a,[]).provider(\\\"ladda\\\",function(){var t={style:\\\"zoom-in\\\"};return{setOption:function(a){e.extend(t,a)},$get:function(){return t}}}).directive(\\\"ladda\\\",[\\\"ladda\\\",function(a){return{restrict:\\\"A\\\",priority:-1,link:function(n,d,r){if(d.addClass(\\\"ladda-button\\\"),e.isUndefined(d.attr(\\\"data-style\\\"))&&d.attr(\\\"data-style\\\",a.style||\\\"zoom-in\\\"),!d[0].querySelector(\\\".ladda-label\\\")){var i=document.createElement(\\\"span\\\");i.className=\\\"ladda-label\\\",e.element(i).append(d.contents()),d.append(i)}var l=t.create(d[0]);n.$watch(r.ladda,function(t){return t||e.isNumber(t)?(l.isLoading()||l.start(),void(e.isNumber(t)&&l.setProgress(t))):(l.stop(),void(r.ngDisabled&&d.attr(\\\"disabled\\\",n.$eval(r.ngDisabled))))})}}}]),a});\"\n\n/***/ }),\n\n/***/ 2193:\n/***/ (function(module, exports, __webpack_require__) {\n\n__webpack_require__(3)(__webpack_require__(2194))\n\n/***/ }),\n\n/***/ 2194:\n/***/ (function(module, exports) {\n\nmodule.exports = \"/**\\n * INSPINIA - Responsive Admin Theme\\n * 2.7.1\\n *\\n * Custom scripts\\n */\\n\\n/**\\n * Adds all of the event listeners to change props based on document size\\n *\\n */\\n(function documentResizeConfiguration() {\\n let fixHeightTimer;\\n let fixHeightBodySmallTimer;\\n let fixBodySmallTimer;\\n let fixSidebarTopTimer;\\n\\n /**\\n * Sets the heights of nav and wrapper elements to the tallest\\n *\\n */\\n function fixHeight() {\\n clearTimeout(fixHeightTimer);\\n\\n fixHeightTimer = setTimeout(() => {\\n try {\\n const navbarHeight = document.getElementsByClassName('navbar-default')[0].clientHeight;\\n const wrapperHeight = document.getElementById('page-wrapper').clientHeight;\\n\\n if (navbarHeight > wrapperHeight) {\\n document.getElementById('page-wrapper').style.minHeight = `${navbarHeight}px`;\\n }\\n\\n if (navbarHeight < wrapperHeight) {\\n document.getElementById('page-wrapper').style.minHeight = `${window.innerHeight}px`;\\n }\\n\\n if (document.body.classList.contains('fixed-nav')) {\\n if (navbarHeight > wrapperHeight) {\\n document.getElementById('page-wrapper').style.minHeight = `${navbarHeight}px`;\\n } else {\\n document.getElementById('page-wrapper').style.minHeight = `${window.innerHeight - 60}px`;\\n }\\n }\\n } catch (err) {\\n console.log(err);\\n }\\n }, 250);\\n }\\n\\n function fixHeightBodySmall() {\\n clearTimeout(fixHeightBodySmallTimer);\\n\\n fixHeightBodySmallTimer = setTimeout(() => {\\n if (!document.body.classList.contains('body-small')) {\\n fixHeight();\\n }\\n }, 250);\\n }\\n\\n /**\\n * Adds the body-small class to the body element if below the media query threshold\\n *\\n */\\n function fixBodySmall() {\\n clearTimeout(fixBodySmallTimer);\\n\\n fixBodySmallTimer = setTimeout(() => {\\n if ($('body').hasClass('mini-navbar')) {\\n return;\\n }\\n\\n if (document.body.clientWidth < 769) {\\n return document.body.classList.add('body-small');\\n }\\n document.body.classList.remove('body-small');\\n }, 250);\\n }\\n\\n /**\\n * Not even clear if this is useful =P\\n *\\n */\\n function fixSidebarTop() {\\n clearTimeout(fixSidebarTopTimer);\\n\\n fixSidebarTopTimer = setTimeout(() => {\\n try {\\n if (window.pageXOffset > 0 && !document.body.classList.contains('fixed-nav')) {\\n document.getElementById('right-sidebar').classList.add('sidebar-top');\\n } else {\\n document.getElementById('right-sidebar').classList.remove('sidebar-top');\\n }\\n } catch (err) {\\n console.log(err);\\n }\\n }, 250);\\n }\\n\\n document.addEventListener('readystatechange', event => {\\n if (event.target.readyState === 'complete') {\\n setTimeout(function() {\\n fixHeight();\\n }, 200);\\n }\\n });\\n\\n window.addEventListener('load', event => {\\n fixBodySmall();\\n fixHeightBodySmall();\\n });\\n\\n window.addEventListener('resize', event => {\\n fixBodySmall();\\n fixHeightBodySmall();\\n });\\n\\n window.addEventListener('scroll', event => {\\n fixHeightBodySmall();\\n fixSidebarTop();\\n });\\n})();\\n\"\n\n/***/ }),\n\n/***/ 2195:\n/***/ (function(module, exports, __webpack_require__) {\n\n__webpack_require__(3)(__webpack_require__(2196))\n\n/***/ }),\n\n/***/ 2196:\n/***/ (function(module, exports) {\n\nmodule.exports = \"/*\\r\\n * metismenu - v2.0.2\\r\\n * A jQuery menu plugin\\r\\n * https://github.com/onokumus/metisMenu\\r\\n *\\r\\n * Made by Osman Nuri Okumus\\r\\n * Under MIT License\\r\\n */\\r\\n\\r\\n!function(a){\\\"use strict\\\";function b(){var a=document.createElement(\\\"mm\\\"),b={WebkitTransition:\\\"webkitTransitionEnd\\\",MozTransition:\\\"transitionend\\\",OTransition:\\\"oTransitionEnd otransitionend\\\",transition:\\\"transitionend\\\"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}function c(b){return this.each(function(){var c=a(this),d=c.data(\\\"mm\\\"),f=a.extend({},e.DEFAULTS,c.data(),\\\"object\\\"==typeof b&&b);d||c.data(\\\"mm\\\",d=new e(this,f)),\\\"string\\\"==typeof b&&d[b]()})}a.fn.emulateTransitionEnd=function(b){var c=!1,e=this;a(this).one(\\\"mmTransitionEnd\\\",function(){c=!0});var f=function(){c||a(e).trigger(d.end)};return setTimeout(f,b),this};var d=b();d&&(a.event.special.mmTransitionEnd={bindType:d.end,delegateType:d.end,handle:function(b){return a(b.target).is(this)?b.handleObj.handler.apply(this,arguments):void 0}});var e=function(b,c){this.$element=a(b),this.options=a.extend({},e.DEFAULTS,c),this.transitioning=null,this.init()};e.TRANSITION_DURATION=350,e.DEFAULTS={toggle:!0,doubleTapToGo:!1,activeClass:\\\"active\\\"},e.prototype.init=function(){var b=this,c=this.options.activeClass;this.$element.find(\\\"li.\\\"+c).has(\\\"ul\\\").children(\\\"ul\\\").addClass(\\\"collapse in\\\"),this.$element.find(\\\"li\\\").not(\\\".\\\"+c).has(\\\"ul\\\").children(\\\"ul\\\").addClass(\\\"collapse\\\"),this.options.doubleTapToGo&&this.$element.find(\\\"li.\\\"+c).has(\\\"ul\\\").children(\\\"a\\\").addClass(\\\"doubleTapToGo\\\"),this.$element.find(\\\"li\\\").has(\\\"ul\\\").children(\\\"a\\\").on(\\\"click.metisMenu\\\",function(d){var e=a(this),f=e.parent(\\\"li\\\"),g=f.children(\\\"ul\\\");return d.preventDefault(),f.hasClass(c)?b.hide(g):b.show(g),b.options.doubleTapToGo&&b.doubleTapToGo(e)&&\\\"#\\\"!==e.attr(\\\"href\\\")&&\\\"\\\"!==e.attr(\\\"href\\\")?(d.stopPropagation(),void(document.location=e.attr(\\\"href\\\"))):void 0})},e.prototype.doubleTapToGo=function(a){var b=this.$element;return a.hasClass(\\\"doubleTapToGo\\\")?(a.removeClass(\\\"doubleTapToGo\\\"),!0):a.parent().children(\\\"ul\\\").length?(b.find(\\\".doubleTapToGo\\\").removeClass(\\\"doubleTapToGo\\\"),a.addClass(\\\"doubleTapToGo\\\"),!1):void 0},e.prototype.show=function(b){var c=this.options.activeClass,f=a(b),g=f.parent(\\\"li\\\");if(!this.transitioning&&!f.hasClass(\\\"in\\\")){g.addClass(c),this.options.toggle&&this.hide(g.siblings().children(\\\"ul.in\\\")),f.removeClass(\\\"collapse\\\").addClass(\\\"collapsing\\\").height(0),this.transitioning=1;var h=function(){f.removeClass(\\\"collapsing\\\").addClass(\\\"collapse in\\\").height(\\\"\\\"),this.transitioning=0};return d?void f.one(\\\"mmTransitionEnd\\\",a.proxy(h,this)).emulateTransitionEnd(e.TRANSITION_DURATION).height(f[0].scrollHeight):h.call(this)}},e.prototype.hide=function(b){var c=this.options.activeClass,f=a(b);if(!this.transitioning&&f.hasClass(\\\"in\\\")){f.parent(\\\"li\\\").removeClass(c),f.height(f.height())[0].offsetHeight,f.addClass(\\\"collapsing\\\").removeClass(\\\"collapse\\\").removeClass(\\\"in\\\"),this.transitioning=1;var g=function(){this.transitioning=0,f.removeClass(\\\"collapsing\\\").addClass(\\\"collapse\\\")};return d?void f.height(0).one(\\\"mmTransitionEnd\\\",a.proxy(g,this)).emulateTransitionEnd(e.TRANSITION_DURATION):g.call(this)}};var f=a.fn.metisMenu;a.fn.metisMenu=c,a.fn.metisMenu.Constructor=e,a.fn.metisMenu.noConflict=function(){return a.fn.metisMenu=f,this}}(jQuery);\\r\\n\"\n\n/***/ }),\n\n/***/ 2197:\n/***/ (function(module, exports, __webpack_require__) {\n\n__webpack_require__(3)(__webpack_require__(2198))\n\n/***/ }),\n\n/***/ 2198:\n/***/ (function(module, exports) {\n\nmodule.exports = \"/*! \\n * jQuery Steps v1.0.6 - 04/27/2014\\n * Copyright (c) 2014 Rafael Staib (http://www.jquery-steps.com)\\n * Licensed under MIT http://www.opensource.org/licenses/MIT\\n */\\n!function(a,b){function c(a,b){o(a).push(b)}function d(d,e,f){var g=d.children(e.headerTag),h=d.children(e.bodyTag);g.length>h.length?R(Z,\\\"contents\\\"):g.length<h.length&&R(Z,\\\"titles\\\");var i=e.startIndex;if(f.stepCount=g.length,e.saveState&&a.cookie){var j=a.cookie(U+q(d)),k=parseInt(j,0);!isNaN(k)&&k<f.stepCount&&(i=k)}f.currentIndex=i,g.each(function(e){var f=a(this),g=h.eq(e),i=g.data(\\\"mode\\\"),j=null==i?$.html:r($,/^\\\\s*$/.test(i)||isNaN(i)?i:parseInt(i,0)),k=j===$.html||g.data(\\\"url\\\")===b?\\\"\\\":g.data(\\\"url\\\"),l=j!==$.html&&\\\"1\\\"===g.data(\\\"loaded\\\"),m=a.extend({},bb,{title:f.html(),content:j===$.html?g.html():\\\"\\\",contentUrl:k,contentMode:j,contentLoaded:l});c(d,m)})}function e(a){a.triggerHandler(\\\"canceled\\\")}function f(a,b){return a.currentIndex-b}function g(b,c){var d=i(b);b.unbind(d).removeData(\\\"uid\\\").removeData(\\\"options\\\").removeData(\\\"state\\\").removeData(\\\"steps\\\").removeData(\\\"eventNamespace\\\").find(\\\".actions a\\\").unbind(d),b.removeClass(c.clearFixCssClass+\\\" vertical\\\");var e=b.find(\\\".content > *\\\");e.removeData(\\\"loaded\\\").removeData(\\\"mode\\\").removeData(\\\"url\\\"),e.removeAttr(\\\"id\\\").removeAttr(\\\"role\\\").removeAttr(\\\"tabindex\\\").removeAttr(\\\"class\\\").removeAttr(\\\"style\\\")._removeAria(\\\"labelledby\\\")._removeAria(\\\"hidden\\\"),b.find(\\\".content > [data-mode='async'],.content > [data-mode='iframe']\\\").empty();var f=a('<{0} class=\\\"{1}\\\"></{0}>'.format(b.get(0).tagName,b.attr(\\\"class\\\"))),g=b._id();return null!=g&&\\\"\\\"!==g&&f._id(g),f.html(b.find(\\\".content\\\").html()),b.after(f),b.remove(),f}function h(a,b){var c=a.find(\\\".steps li\\\").eq(b.currentIndex);a.triggerHandler(\\\"finishing\\\",[b.currentIndex])?(c.addClass(\\\"done\\\").removeClass(\\\"error\\\"),a.triggerHandler(\\\"finished\\\",[b.currentIndex])):c.addClass(\\\"error\\\")}function i(a){var b=a.data(\\\"eventNamespace\\\");return null==b&&(b=\\\".\\\"+q(a),a.data(\\\"eventNamespace\\\",b)),b}function j(a,b){var c=q(a);return a.find(\\\"#\\\"+c+V+b)}function k(a,b){var c=q(a);return a.find(\\\"#\\\"+c+W+b)}function l(a,b){var c=q(a);return a.find(\\\"#\\\"+c+X+b)}function m(a){return a.data(\\\"options\\\")}function n(a){return a.data(\\\"state\\\")}function o(a){return a.data(\\\"steps\\\")}function p(a,b){var c=o(a);return(0>b||b>=c.length)&&R(Y),c[b]}function q(a){var b=a.data(\\\"uid\\\");return null==b&&(b=a._id(),null==b&&(b=\\\"steps-uid-\\\".concat(T),a._id(b)),T++,a.data(\\\"uid\\\",b)),b}function r(a,c){if(S(\\\"enumType\\\",a),S(\\\"keyOrValue\\\",c),\\\"string\\\"==typeof c){var d=a[c];return d===b&&R(\\\"The enum key '{0}' does not exist.\\\",c),d}if(\\\"number\\\"==typeof c){for(var e in a)if(a[e]===c)return c;R(\\\"Invalid enum value '{0}'.\\\",c)}else R(\\\"Invalid key or value type.\\\")}function s(a,b,c){return B(a,b,c,v(c,1))}function t(a,b,c){return B(a,b,c,f(c,1))}function u(a,b,c,d){if((0>d||d>=c.stepCount)&&R(Y),!(b.forceMoveForward&&d<c.currentIndex)){var e=c.currentIndex;return a.triggerHandler(\\\"stepChanging\\\",[c.currentIndex,d])?(c.currentIndex=d,O(a,b,c),E(a,b,c,e),D(a,b,c),A(a,b,c),P(a,b,c,d,e),a.triggerHandler(\\\"stepChanged\\\",[d,e])):a.find(\\\".steps li\\\").eq(e).addClass(\\\"error\\\"),!0}}function v(a,b){return a.currentIndex+b}function w(b){var c=a.extend(!0,{},cb,b);return this.each(function(){var b=a(this),e={currentIndex:c.startIndex,currentStep:null,stepCount:0,transitionElement:null};b.data(\\\"options\\\",c),b.data(\\\"state\\\",e),b.data(\\\"steps\\\",[]),d(b,c,e),J(b,c,e),G(b,c),c.autoFocus&&0===T&&j(b,c.startIndex).focus()})}function x(b,c,d,e,f){(0>e||e>d.stepCount)&&R(Y),f=a.extend({},bb,f),y(b,e,f),d.currentIndex!==d.stepCount&&d.currentIndex>=e&&(d.currentIndex++,O(b,c,d)),d.stepCount++;var g=b.find(\\\".content\\\"),h=a(\\\"<{0}>{1}</{0}>\\\".format(c.headerTag,f.title)),i=a(\\\"<{0}></{0}>\\\".format(c.bodyTag));return(null==f.contentMode||f.contentMode===$.html)&&i.html(f.content),0===e?g.prepend(i).prepend(h):k(b,e-1).after(i).after(h),K(b,d,i,e),N(b,c,d,h,e),F(b,c,d,e),e===d.currentIndex&&E(b,c,d),D(b,c,d),b}function y(a,b,c){o(a).splice(b,0,c)}function z(b){var c=a(this),d=m(c),e=n(c);if(d.suppressPaginationOnFocus&&c.find(\\\":focus\\\").is(\\\":input\\\"))return b.preventDefault(),!1;var f={left:37,right:39};b.keyCode===f.left?(b.preventDefault(),t(c,d,e)):b.keyCode===f.right&&(b.preventDefault(),s(c,d,e))}function A(b,c,d){if(d.stepCount>0){var e=p(b,d.currentIndex);if(!c.enableContentCache||!e.contentLoaded)switch(r($,e.contentMode)){case $.iframe:b.find(\\\".content > .body\\\").eq(d.currentIndex).empty().html('<iframe src=\\\"'+e.contentUrl+'\\\" frameborder=\\\"0\\\" scrolling=\\\"no\\\" />').data(\\\"loaded\\\",\\\"1\\\");break;case $.async:var f=k(b,d.currentIndex)._aria(\\\"busy\\\",\\\"true\\\").empty().append(M(c.loadingTemplate,{text:c.labels.loading}));a.ajax({url:e.contentUrl,cache:!1}).done(function(a){f.empty().html(a)._aria(\\\"busy\\\",\\\"false\\\").data(\\\"loaded\\\",\\\"1\\\")})}}}function B(a,b,c,d){var e=c.currentIndex;if(d>=0&&d<c.stepCount&&!(b.forceMoveForward&&d<c.currentIndex)){var f=j(a,d),g=f.parent(),h=g.hasClass(\\\"disabled\\\");return g._enableAria(),f.click(),e===c.currentIndex&&h?(g._enableAria(!1),!1):!0}return!1}function C(b){b.preventDefault();var c=a(this),d=c.parent().parent().parent().parent(),f=m(d),g=n(d),i=c.attr(\\\"href\\\");switch(i.substring(i.lastIndexOf(\\\"#\\\")+1)){case\\\"cancel\\\":e(d);break;case\\\"finish\\\":h(d,g);break;case\\\"next\\\":s(d,f,g);break;case\\\"previous\\\":t(d,f,g)}}function D(a,b,c){if(b.enablePagination){var d=a.find(\\\".actions a[href$='#finish']\\\").parent(),e=a.find(\\\".actions a[href$='#next']\\\").parent();if(!b.forceMoveForward){var f=a.find(\\\".actions a[href$='#previous']\\\").parent();f._enableAria(c.currentIndex>0)}b.enableFinishButton&&b.showFinishButtonAlways?(d._enableAria(c.stepCount>0),e._enableAria(c.stepCount>1&&c.stepCount>c.currentIndex+1)):(d._showAria(b.enableFinishButton&&c.stepCount>=c.currentIndex+1),e._showAria(0===c.stepCount||c.stepCount>c.currentIndex+1)._enableAria(c.stepCount>c.currentIndex+1||!b.enableFinishButton))}}function E(b,c,d,e){var f=j(b,d.currentIndex),g=a('<span class=\\\"current-info audible\\\">'+c.labels.current+\\\" </span>\\\"),h=b.find(\\\".content > .title\\\");if(null!=e){var i=j(b,e);i.parent().addClass(\\\"done\\\").removeClass(\\\"error\\\")._selectAria(!1),h.eq(e).removeClass(\\\"current\\\").next(\\\".body\\\").removeClass(\\\"current\\\"),g=i.find(\\\".current-info\\\"),f.focus()}f.prepend(g).parent()._selectAria().removeClass(\\\"done\\\")._enableAria(),h.eq(d.currentIndex).addClass(\\\"current\\\").next(\\\".body\\\").addClass(\\\"current\\\")}function F(a,b,c,d){for(var e=q(a),f=d;f<c.stepCount;f++){var g=e+V+f,h=e+W+f,i=e+X+f,j=a.find(\\\".title\\\").eq(f)._id(i);a.find(\\\".steps a\\\").eq(f)._id(g)._aria(\\\"controls\\\",h).attr(\\\"href\\\",\\\"#\\\"+i).html(M(b.titleTemplate,{index:f+1,title:j.html()})),a.find(\\\".body\\\").eq(f)._id(h)._aria(\\\"labelledby\\\",i)}}function G(a,b){var c=i(a);a.bind(\\\"canceled\\\"+c,b.onCanceled),a.bind(\\\"finishing\\\"+c,b.onFinishing),a.bind(\\\"finished\\\"+c,b.onFinished),a.bind(\\\"stepChanging\\\"+c,b.onStepChanging),a.bind(\\\"stepChanged\\\"+c,b.onStepChanged),b.enableKeyNavigation&&a.bind(\\\"keyup\\\"+c,z),a.find(\\\".actions a\\\").bind(\\\"click\\\"+c,C)}function H(a,b,c,d){return 0>d||d>=c.stepCount||c.currentIndex===d?!1:(I(a,d),c.currentIndex>d&&(c.currentIndex--,O(a,b,c)),c.stepCount--,l(a,d).remove(),k(a,d).remove(),j(a,d).parent().remove(),0===d&&a.find(\\\".steps li\\\").first().addClass(\\\"first\\\"),d===c.stepCount&&a.find(\\\".steps li\\\").eq(d).addClass(\\\"last\\\"),F(a,b,c,d),D(a,b,c),!0)}function I(a,b){o(a).splice(b,1)}function J(b,c,d){var e='<{0} class=\\\"{1}\\\">{2}</{0}>',f=r(_,c.stepsOrientation),g=f===_.vertical?\\\" vertical\\\":\\\"\\\",h=a(e.format(c.contentContainerTag,\\\"content \\\"+c.clearFixCssClass,b.html())),i=a(e.format(c.stepsContainerTag,\\\"steps \\\"+c.clearFixCssClass,'<ul role=\\\"tablist\\\"></ul>')),j=h.children(c.headerTag),k=h.children(c.bodyTag);b.attr(\\\"role\\\",\\\"application\\\").empty().append(i).append(h).addClass(c.cssClass+\\\" \\\"+c.clearFixCssClass+g),k.each(function(c){K(b,d,a(this),c)}),j.each(function(e){N(b,c,d,a(this),e)}),E(b,c,d),L(b,c,d)}function K(a,b,c,d){var e=q(a),f=e+W+d,g=e+X+d;c._id(f).attr(\\\"role\\\",\\\"tabpanel\\\")._aria(\\\"labelledby\\\",g).addClass(\\\"body\\\")._showAria(b.currentIndex===d)}function L(a,b,c){if(b.enablePagination){var d='<{0} class=\\\"actions {1}\\\"><ul role=\\\"menu\\\" aria-label=\\\"{2}\\\">{3}</ul></{0}>',e='<li><a href=\\\"#{0}\\\" role=\\\"menuitem\\\">{1}</a></li>',f=\\\"\\\";b.forceMoveForward||(f+=e.format(\\\"previous\\\",b.labels.previous)),f+=e.format(\\\"next\\\",b.labels.next),b.enableFinishButton&&(f+=e.format(\\\"finish\\\",b.labels.finish)),b.enableCancelButton&&(f+=e.format(\\\"cancel\\\",b.labels.cancel)),a.append(d.format(b.actionContainerTag,b.clearFixCssClass,b.labels.pagination,f)),D(a,b,c),A(a,b,c)}}function M(a,c){for(var d=a.match(/#([a-z]*)#/gi),e=0;e<d.length;e++){var f=d[e],g=f.substring(1,f.length-1);c[g]===b&&R(\\\"The key '{0}' does not exist in the substitute collection!\\\",g),a=a.replace(f,c[g])}return a}function N(b,c,d,e,f){var g=q(b),h=g+V+f,j=g+W+f,k=g+X+f,l=b.find(\\\".steps > ul\\\"),m=M(c.titleTemplate,{index:f+1,title:e.html()}),n=a('<li role=\\\"tab\\\"><a id=\\\"'+h+'\\\" href=\\\"#'+k+'\\\" aria-controls=\\\"'+j+'\\\">'+m+\\\"</a></li>\\\");n._enableAria(c.enableAllSteps||d.currentIndex>f),d.currentIndex>f&&n.addClass(\\\"done\\\"),e._id(k).attr(\\\"tabindex\\\",\\\"-1\\\").addClass(\\\"title\\\"),0===f?l.prepend(n):l.find(\\\"li\\\").eq(f-1).after(n),0===f&&l.find(\\\"li\\\").removeClass(\\\"first\\\").eq(f).addClass(\\\"first\\\"),f===d.stepCount-1&&l.find(\\\"li\\\").removeClass(\\\"last\\\").eq(f).addClass(\\\"last\\\"),n.children(\\\"a\\\").bind(\\\"click\\\"+i(b),Q)}function O(b,c,d){c.saveState&&a.cookie&&a.cookie(U+q(b),d.currentIndex)}function P(b,c,d,e,f){var g=b.find(\\\".content > .body\\\"),h=r(ab,c.transitionEffect),i=c.transitionEffectSpeed,j=g.eq(e),k=g.eq(f);switch(h){case ab.fade:case ab.slide:var l=h===ab.fade?\\\"fadeOut\\\":\\\"slideUp\\\",m=h===ab.fade?\\\"fadeIn\\\":\\\"slideDown\\\";d.transitionElement=j,k[l](i,function(){var b=a(this)._showAria(!1).parent().parent(),c=n(b);c.transitionElement&&(c.transitionElement[m](i,function(){a(this)._showAria()}),c.transitionElement=null)}).promise();break;case ab.slideLeft:var o=k.outerWidth(!0),p=e>f?-o:o,q=e>f?o:-o;k.animate({left:p},i,function(){a(this)._showAria(!1)}).promise(),j.css(\\\"left\\\",q+\\\"px\\\")._showAria().animate({left:0},i).promise();break;default:k._showAria(!1),j._showAria()}}function Q(b){b.preventDefault();var c=a(this),d=c.parent().parent().parent().parent(),e=m(d),f=n(d),g=f.currentIndex;if(c.parent().is(\\\":not(.disabled):not(.current)\\\")){var h=c.attr(\\\"href\\\"),i=parseInt(h.substring(h.lastIndexOf(\\\"-\\\")+1),0);u(d,e,f,i)}return g===f.currentIndex?(j(d,g).focus(),!1):void 0}function R(a){throw arguments.length>1&&(a=a.format(Array.prototype.slice.call(arguments,1))),new Error(a)}function S(a,b){null==b&&R(\\\"The argument '{0}' is null or undefined.\\\",a)}a.fn.extend({_aria:function(a,b){return this.attr(\\\"aria-\\\"+a,b)},_removeAria:function(a){return this.removeAttr(\\\"aria-\\\"+a)},_enableAria:function(a){return null==a||a?this.removeClass(\\\"disabled\\\")._aria(\\\"disabled\\\",\\\"false\\\"):this.addClass(\\\"disabled\\\")._aria(\\\"disabled\\\",\\\"true\\\")},_showAria:function(a){return null==a||a?this.show()._aria(\\\"hidden\\\",\\\"false\\\"):this.hide()._aria(\\\"hidden\\\",\\\"true\\\")},_selectAria:function(a){return null==a||a?this.addClass(\\\"current\\\")._aria(\\\"selected\\\",\\\"true\\\"):this.removeClass(\\\"current\\\")._aria(\\\"selected\\\",\\\"false\\\")},_id:function(a){return a?this.attr(\\\"id\\\",a):this.attr(\\\"id\\\")}}),String.prototype.format||(String.prototype.format=function(){for(var b=1===arguments.length&&a.isArray(arguments[0])?arguments[0]:arguments,c=this,d=0;d<b.length;d++){var e=new RegExp(\\\"\\\\\\\\{\\\"+d+\\\"\\\\\\\\}\\\",\\\"gm\\\");c=c.replace(e,b[d])}return c});var T=0,U=\\\"jQu3ry_5teps_St@te_\\\",V=\\\"-t-\\\",W=\\\"-p-\\\",X=\\\"-h-\\\",Y=\\\"Index out of range.\\\",Z=\\\"One or more corresponding step {0} are missing.\\\";a.fn.steps=function(b){return a.fn.steps[b]?a.fn.steps[b].apply(this,Array.prototype.slice.call(arguments,1)):\\\"object\\\"!=typeof b&&b?void a.error(\\\"Method \\\"+b+\\\" does not exist on jQuery.steps\\\"):w.apply(this,arguments)},a.fn.steps.add=function(a){var b=n(this);return x(this,m(this),b,b.stepCount,a)},a.fn.steps.destroy=function(){return g(this,m(this))},a.fn.steps.finish=function(){h(this,n(this))},a.fn.steps.getCurrentIndex=function(){return n(this).currentIndex},a.fn.steps.getCurrentStep=function(){return p(this,n(this).currentIndex)},a.fn.steps.getStep=function(a){return p(this,a)},a.fn.steps.insert=function(a,b){return x(this,m(this),n(this),a,b)},a.fn.steps.next=function(){return s(this,m(this),n(this))},a.fn.steps.previous=function(){return t(this,m(this),n(this))},a.fn.steps.remove=function(a){return H(this,m(this),n(this),a)},a.fn.steps.setStep=function(){throw new Error(\\\"Not yet implemented!\\\")},a.fn.steps.skip=function(){throw new Error(\\\"Not yet implemented!\\\")};var $=a.fn.steps.contentMode={html:0,iframe:1,async:2},_=a.fn.steps.stepsOrientation={horizontal:0,vertical:1},ab=a.fn.steps.transitionEffect={none:0,fade:1,slide:2,slideLeft:3},bb=a.fn.steps.stepModel={title:\\\"\\\",content:\\\"\\\",contentUrl:\\\"\\\",contentMode:$.html,contentLoaded:!1},cb=a.fn.steps.defaults={headerTag:\\\"h1\\\",bodyTag:\\\"div\\\",contentContainerTag:\\\"div\\\",actionContainerTag:\\\"div\\\",stepsContainerTag:\\\"div\\\",cssClass:\\\"wizard\\\",clearFixCssClass:\\\"clearfix\\\",stepsOrientation:_.horizontal,titleTemplate:'<span class=\\\"number\\\">#index#.</span> #title#',loadingTemplate:'<span class=\\\"spinner\\\"></span> #text#',autoFocus:!1,enableAllSteps:!1,enableKeyNavigation:!0,enablePagination:!0,suppressPaginationOnFocus:!0,enableContentCache:!0,enableCancelButton:!0,enableFinishButton:!0,preloadContent:!1,showFinishButtonAlways:!1,forceMoveForward:!1,saveState:!1,startIndex:0,transitionEffect:ab.none,transitionEffectSpeed:200,onStepChanging:function(){return!0},onStepChanged:function(){},onCanceled:function(){},onFinishing:function(){return!0},onFinished:function(){},labels:{cancel:\\\"Cancel\\\",current:\\\"current step:\\\",pagination:\\\"Pagination\\\",finish:\\\"Finish\\\",next:\\\"Next\\\",previous:\\\"Previous\\\",loading:\\\"Loading ...\\\"}}}(jQuery);\"\n\n/***/ }),\n\n/***/ 2199:\n/***/ (function(module, exports, __webpack_require__) {\n\n__webpack_require__(3)(__webpack_require__(2200))\n\n/***/ }),\n\n/***/ 2200:\n/***/ (function(module, exports) {\n\nmodule.exports = \"/*! Copyright (c) 2011 Piotr Rochala (http://rocha.la)\\n * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)\\n * and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.\\n *\\n * Version: 1.3.6\\n *\\n */\\n(function(e){e.fn.extend({slimScroll:function(g){var a=e.extend({width:\\\"auto\\\",height:\\\"250px\\\",size:\\\"7px\\\",color:\\\"#000\\\",position:\\\"right\\\",distance:\\\"1px\\\",start:\\\"top\\\",opacity:.4,alwaysVisible:!1,disableFadeOut:!1,railVisible:!1,railColor:\\\"#333\\\",railOpacity:.2,railDraggable:!0,railClass:\\\"slimScrollRail\\\",barClass:\\\"slimScrollBar\\\",wrapperClass:\\\"slimScrollDiv\\\",allowPageScroll:!1,wheelStep:20,touchScrollStep:200,borderRadius:\\\"7px\\\",railBorderRadius:\\\"7px\\\"},g);this.each(function(){function v(d){if(r){d=d||window.event;\\n var c=0;d.wheelDelta&&(c=-d.wheelDelta/120);d.detail&&(c=d.detail/3);e(d.target||d.srcTarget||d.srcElement).closest(\\\".\\\"+a.wrapperClass).is(b.parent())&&m(c,!0);d.preventDefault&&!k&&d.preventDefault();k||(d.returnValue=!1)}}function m(d,e,g){k=!1;var f=d,h=b.outerHeight()-c.outerHeight();e&&(f=parseInt(c.css(\\\"top\\\"))+d*parseInt(a.wheelStep)/100*c.outerHeight(),f=Math.min(Math.max(f,0),h),f=0<d?Math.ceil(f):Math.floor(f),c.css({top:f+\\\"px\\\"}));l=parseInt(c.css(\\\"top\\\"))/(b.outerHeight()-c.outerHeight());\\n f=l*(b[0].scrollHeight-b.outerHeight());g&&(f=d,d=f/b[0].scrollHeight*b.outerHeight(),d=Math.min(Math.max(d,0),h),c.css({top:d+\\\"px\\\"}));b.scrollTop(f);b.trigger(\\\"slimscrolling\\\",~~f);w();p()}function x(){u=Math.max(b.outerHeight()/b[0].scrollHeight*b.outerHeight(),30);c.css({height:u+\\\"px\\\"});var a=u==b.outerHeight()?\\\"none\\\":\\\"block\\\";c.css({display:a})}function w(){x();clearTimeout(B);l==~~l?(k=a.allowPageScroll,C!=l&&b.trigger(\\\"slimscroll\\\",0==~~l?\\\"top\\\":\\\"bottom\\\")):k=!1;C=l;u>=b.outerHeight()?k=!0:(c.stop(!0,\\n !0).fadeIn(\\\"fast\\\"),a.railVisible&&h.stop(!0,!0).fadeIn(\\\"fast\\\"))}function p(){a.alwaysVisible||(B=setTimeout(function(){a.disableFadeOut&&r||y||z||(c.fadeOut(\\\"slow\\\"),h.fadeOut(\\\"slow\\\"))},1E3))}var r,y,z,B,A,u,l,C,k=!1,b=e(this);if(b.parent().hasClass(a.wrapperClass)){var n=b.scrollTop(),c=b.closest(\\\".\\\"+a.barClass),h=b.closest(\\\".\\\"+a.railClass);x();if(e.isPlainObject(g)){if(\\\"height\\\"in g&&\\\"auto\\\"==g.height){b.parent().css(\\\"height\\\",\\\"auto\\\");b.css(\\\"height\\\",\\\"auto\\\");var q=b.parent().parent().height();b.parent().css(\\\"height\\\",\\n q);b.css(\\\"height\\\",q)}if(\\\"scrollTo\\\"in g)n=parseInt(a.scrollTo);else if(\\\"scrollBy\\\"in g)n+=parseInt(a.scrollBy);else if(\\\"destroy\\\"in g){c.remove();h.remove();b.unwrap();return}m(n,!1,!0)}}else if(!(e.isPlainObject(g)&&\\\"destroy\\\"in g)){a.height=\\\"auto\\\"==a.height?b.parent().height():a.height;n=e(\\\"<div></div>\\\").addClass(a.wrapperClass).css({position:\\\"relative\\\",overflow:\\\"hidden\\\",width:a.width,height:a.height});b.css({overflow:\\\"hidden\\\",width:a.width,height:a.height});var h=e(\\\"<div></div>\\\").addClass(a.railClass).css({width:a.size,\\n height:\\\"100%\\\",position:\\\"absolute\\\",top:0,display:a.alwaysVisible&&a.railVisible?\\\"block\\\":\\\"none\\\",\\\"border-radius\\\":a.railBorderRadius,background:a.railColor,opacity:a.railOpacity,zIndex:90}),c=e(\\\"<div></div>\\\").addClass(a.barClass).css({background:a.color,width:a.size,position:\\\"absolute\\\",top:0,opacity:a.opacity,display:a.alwaysVisible?\\\"block\\\":\\\"none\\\",\\\"border-radius\\\":a.borderRadius,BorderRadius:a.borderRadius,MozBorderRadius:a.borderRadius,WebkitBorderRadius:a.borderRadius,zIndex:99}),q=\\\"right\\\"==a.position?\\n{right:a.distance}:{left:a.distance};h.css(q);c.css(q);b.wrap(n);b.parent().append(c);b.parent().append(h);a.railDraggable&&c.bind(\\\"mousedown\\\",function(a){var b=e(document);z=!0;t=parseFloat(c.css(\\\"top\\\"));pageY=a.pageY;b.bind(\\\"mousemove.slimscroll\\\",function(a){currTop=t+a.pageY-pageY;c.css(\\\"top\\\",currTop);m(0,c.position().top,!1)});b.bind(\\\"mouseup.slimscroll\\\",function(a){z=!1;p();b.unbind(\\\".slimscroll\\\")});return!1}).bind(\\\"selectstart.slimscroll\\\",function(a){a.stopPropagation();a.preventDefault();return!1});\\n h.hover(function(){w()},function(){p()});c.hover(function(){y=!0},function(){y=!1});b.hover(function(){r=!0;w();p()},function(){r=!1;p()});b.bind(\\\"touchstart\\\",function(a,b){a.originalEvent.touches.length&&(A=a.originalEvent.touches[0].pageY)});b.bind(\\\"touchmove\\\",function(b){k||b.originalEvent.preventDefault();b.originalEvent.touches.length&&(m((A-b.originalEvent.touches[0].pageY)/a.touchScrollStep,!0),A=b.originalEvent.touches[0].pageY)});x();\\\"bottom\\\"===a.start?(c.css({top:b.outerHeight()-c.outerHeight()}),\\n m(0,!0)):\\\"top\\\"!==a.start&&(m(e(a.start).position().top,null,!0),a.alwaysVisible||c.hide());window.addEventListener?(this.addEventListener(\\\"DOMMouseScroll\\\",v,!1),this.addEventListener(\\\"mousewheel\\\",v,!1)):document.attachEvent(\\\"onmousewheel\\\",v)}});return this}});e.fn.extend({slimscroll:e.fn.slimScroll})})(jQuery);\"\n\n/***/ }),\n\n/***/ 2201:\n/***/ (function(module, exports, __webpack_require__) {\n\n__webpack_require__(3)(__webpack_require__(2202))\n\n/***/ }),\n\n/***/ 2202:\n/***/ (function(module, exports) {\n\nmodule.exports = \"/*! pace 1.0.0 */\\n(function(){var a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X=[].slice,Y={}.hasOwnProperty,Z=function(a,b){function c(){this.constructor=a}for(var d in b)Y.call(b,d)&&(a[d]=b[d]);return c.prototype=b.prototype,a.prototype=new c,a.__super__=b.prototype,a},$=[].indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(b in this&&this[b]===a)return b;return-1};for(u={catchupTime:100,initialRate:.03,minTime:250,ghostTime:100,maxProgressPerFrame:20,easeFactor:1.25,startOnPageLoad:!0,restartOnPushState:!0,restartOnRequestAfter:500,target:\\\"body\\\",elements:{checkInterval:100,selectors:[\\\"body\\\"]},eventLag:{minSamples:10,sampleCount:3,lagThreshold:3},ajax:{trackMethods:[\\\"GET\\\"],trackWebSockets:!0,ignoreURLs:[]}},C=function(){var a;return null!=(a=\\\"undefined\\\"!=typeof performance&&null!==performance&&\\\"function\\\"==typeof performance.now?performance.now():void 0)?a:+new Date},E=window.requestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||window.msRequestAnimationFrame,t=window.cancelAnimationFrame||window.mozCancelAnimationFrame,null==E&&(E=function(a){return setTimeout(a,50)},t=function(a){return clearTimeout(a)}),G=function(a){var b,c;return b=C(),(c=function(){var d;return d=C()-b,d>=33?(b=C(),a(d,function(){return E(c)})):setTimeout(c,33-d)})()},F=function(){var a,b,c;return c=arguments[0],b=arguments[1],a=3<=arguments.length?X.call(arguments,2):[],\\\"function\\\"==typeof c[b]?c[b].apply(c,a):c[b]},v=function(){var a,b,c,d,e,f,g;for(b=arguments[0],d=2<=arguments.length?X.call(arguments,1):[],f=0,g=d.length;g>f;f++)if(c=d[f])for(a in c)Y.call(c,a)&&(e=c[a],null!=b[a]&&\\\"object\\\"==typeof b[a]&&null!=e&&\\\"object\\\"==typeof e?v(b[a],e):b[a]=e);return b},q=function(a){var b,c,d,e,f;for(c=b=0,e=0,f=a.length;f>e;e++)d=a[e],c+=Math.abs(d),b++;return c/b},x=function(a,b){var c,d,e;if(null==a&&(a=\\\"options\\\"),null==b&&(b=!0),e=document.querySelector(\\\"[data-pace-\\\"+a+\\\"]\\\")){if(c=e.getAttribute(\\\"data-pace-\\\"+a),!b)return c;try{return JSON.parse(c)}catch(f){return d=f,\\\"undefined\\\"!=typeof console&&null!==console?console.error(\\\"Error parsing inline pace options\\\",d):void 0}}},g=function(){function a(){}return a.prototype.on=function(a,b,c,d){var e;return null==d&&(d=!1),null==this.bindings&&(this.bindings={}),null==(e=this.bindings)[a]&&(e[a]=[]),this.bindings[a].push({handler:b,ctx:c,once:d})},a.prototype.once=function(a,b,c){return this.on(a,b,c,!0)},a.prototype.off=function(a,b){var c,d,e;if(null!=(null!=(d=this.bindings)?d[a]:void 0)){if(null==b)return delete this.bindings[a];for(c=0,e=[];c<this.bindings[a].length;)e.push(this.bindings[a][c].handler===b?this.bindings[a].splice(c,1):c++);return e}},a.prototype.trigger=function(){var a,b,c,d,e,f,g,h,i;if(c=arguments[0],a=2<=arguments.length?X.call(arguments,1):[],null!=(g=this.bindings)?g[c]:void 0){for(e=0,i=[];e<this.bindings[c].length;)h=this.bindings[c][e],d=h.handler,b=h.ctx,f=h.once,d.apply(null!=b?b:this,a),i.push(f?this.bindings[c].splice(e,1):e++);return i}},a}(),j=window.Pace||{},window.Pace=j,v(j,g.prototype),D=j.options=v({},u,window.paceOptions,x()),U=[\\\"ajax\\\",\\\"document\\\",\\\"eventLag\\\",\\\"elements\\\"],Q=0,S=U.length;S>Q;Q++)K=U[Q],D[K]===!0&&(D[K]=u[K]);i=function(a){function b(){return V=b.__super__.constructor.apply(this,arguments)}return Z(b,a),b}(Error),b=function(){function a(){this.progress=0}return a.prototype.getElement=function(){var a;if(null==this.el){if(a=document.querySelector(D.target),!a)throw new i;this.el=document.createElement(\\\"div\\\"),this.el.className=\\\"pace pace-active\\\",document.body.className=document.body.className.replace(/pace-done/g,\\\"\\\"),document.body.className+=\\\" pace-running\\\",this.el.innerHTML='<div class=\\\"pace-progress\\\">\\\\n <div class=\\\"pace-progress-inner\\\"></div>\\\\n</div>\\\\n<div class=\\\"pace-activity\\\"></div>',null!=a.firstChild?a.insertBefore(this.el,a.firstChild):a.appendChild(this.el)}return this.el},a.prototype.finish=function(){var a;return a=this.getElement(),a.className=a.className.replace(\\\"pace-active\\\",\\\"\\\"),a.className+=\\\" pace-inactive\\\",document.body.className=document.body.className.replace(\\\"pace-running\\\",\\\"\\\"),document.body.className+=\\\" pace-done\\\"},a.prototype.update=function(a){return this.progress=a,this.render()},a.prototype.destroy=function(){try{this.getElement().parentNode.removeChild(this.getElement())}catch(a){i=a}return this.el=void 0},a.prototype.render=function(){var a,b,c,d,e,f,g;if(null==document.querySelector(D.target))return!1;for(a=this.getElement(),d=\\\"translate3d(\\\"+this.progress+\\\"%, 0, 0)\\\",g=[\\\"webkitTransform\\\",\\\"msTransform\\\",\\\"transform\\\"],e=0,f=g.length;f>e;e++)b=g[e],a.children[0].style[b]=d;return(!this.lastRenderedProgress||this.lastRenderedProgress|0!==this.progress|0)&&(a.children[0].setAttribute(\\\"data-progress-text\\\",\\\"\\\"+(0|this.progress)+\\\"%\\\"),this.progress>=100?c=\\\"99\\\":(c=this.progress<10?\\\"0\\\":\\\"\\\",c+=0|this.progress),a.children[0].setAttribute(\\\"data-progress\\\",\\\"\\\"+c)),this.lastRenderedProgress=this.progress},a.prototype.done=function(){return this.progress>=100},a}(),h=function(){function a(){this.bindings={}}return a.prototype.trigger=function(a,b){var c,d,e,f,g;if(null!=this.bindings[a]){for(f=this.bindings[a],g=[],d=0,e=f.length;e>d;d++)c=f[d],g.push(c.call(this,b));return g}},a.prototype.on=function(a,b){var c;return null==(c=this.bindings)[a]&&(c[a]=[]),this.bindings[a].push(b)},a}(),P=window.XMLHttpRequest,O=window.XDomainRequest,N=window.WebSocket,w=function(a,b){var c,d,e,f;f=[];for(d in b.prototype)try{e=b.prototype[d],f.push(null==a[d]&&\\\"function\\\"!=typeof e?a[d]=e:void 0)}catch(g){c=g}return f},A=[],j.ignore=function(){var a,b,c;return b=arguments[0],a=2<=arguments.length?X.call(arguments,1):[],A.unshift(\\\"ignore\\\"),c=b.apply(null,a),A.shift(),c},j.track=function(){var a,b,c;return b=arguments[0],a=2<=arguments.length?X.call(arguments,1):[],A.unshift(\\\"track\\\"),c=b.apply(null,a),A.shift(),c},J=function(a){var b;if(null==a&&(a=\\\"GET\\\"),\\\"track\\\"===A[0])return\\\"force\\\";if(!A.length&&D.ajax){if(\\\"socket\\\"===a&&D.ajax.trackWebSockets)return!0;if(b=a.toUpperCase(),$.call(D.ajax.trackMethods,b)>=0)return!0}return!1},k=function(a){function b(){var a,c=this;b.__super__.constructor.apply(this,arguments),a=function(a){var b;return b=a.open,a.open=function(d,e){return J(d)&&c.trigger(\\\"request\\\",{type:d,url:e,request:a}),b.apply(a,arguments)}},window.XMLHttpRequest=function(b){var c;return c=new P(b),a(c),c};try{w(window.XMLHttpRequest,P)}catch(d){}if(null!=O){window.XDomainRequest=function(){var b;return b=new O,a(b),b};try{w(window.XDomainRequest,O)}catch(d){}}if(null!=N&&D.ajax.trackWebSockets){window.WebSocket=function(a,b){var d;return d=null!=b?new N(a,b):new N(a),J(\\\"socket\\\")&&c.trigger(\\\"request\\\",{type:\\\"socket\\\",url:a,protocols:b,request:d}),d};try{w(window.WebSocket,N)}catch(d){}}}return Z(b,a),b}(h),R=null,y=function(){return null==R&&(R=new k),R},I=function(a){var b,c,d,e;for(e=D.ajax.ignoreURLs,c=0,d=e.length;d>c;c++)if(b=e[c],\\\"string\\\"==typeof b){if(-1!==a.indexOf(b))return!0}else if(b.test(a))return!0;return!1},y().on(\\\"request\\\",function(b){var c,d,e,f,g;return f=b.type,e=b.request,g=b.url,I(g)?void 0:j.running||D.restartOnRequestAfter===!1&&\\\"force\\\"!==J(f)?void 0:(d=arguments,c=D.restartOnRequestAfter||0,\\\"boolean\\\"==typeof c&&(c=0),setTimeout(function(){var b,c,g,h,i,k;if(b=\\\"socket\\\"===f?e.readyState<2:0<(h=e.readyState)&&4>h){for(j.restart(),i=j.sources,k=[],c=0,g=i.length;g>c;c++){if(K=i[c],K instanceof a){K.watch.apply(K,d);break}k.push(void 0)}return k}},c))}),a=function(){function a(){var a=this;this.elements=[],y().on(\\\"request\\\",function(){return a.watch.apply(a,arguments)})}return a.prototype.watch=function(a){var b,c,d,e;return d=a.type,b=a.request,e=a.url,I(e)?void 0:(c=\\\"socket\\\"===d?new n(b):new o(b),this.elements.push(c))},a}(),o=function(){function a(a){var b,c,d,e,f,g,h=this;if(this.progress=0,null!=window.ProgressEvent)for(c=null,a.addEventListener(\\\"progress\\\",function(a){return h.progress=a.lengthComputable?100*a.loaded/a.total:h.progress+(100-h.progress)/2},!1),g=[\\\"load\\\",\\\"abort\\\",\\\"timeout\\\",\\\"error\\\"],d=0,e=g.length;e>d;d++)b=g[d],a.addEventListener(b,function(){return h.progress=100},!1);else f=a.onreadystatechange,a.onreadystatechange=function(){var b;return 0===(b=a.readyState)||4===b?h.progress=100:3===a.readyState&&(h.progress=50),\\\"function\\\"==typeof f?f.apply(null,arguments):void 0}}return a}(),n=function(){function a(a){var b,c,d,e,f=this;for(this.progress=0,e=[\\\"error\\\",\\\"open\\\"],c=0,d=e.length;d>c;c++)b=e[c],a.addEventListener(b,function(){return f.progress=100},!1)}return a}(),d=function(){function a(a){var b,c,d,f;for(null==a&&(a={}),this.elements=[],null==a.selectors&&(a.selectors=[]),f=a.selectors,c=0,d=f.length;d>c;c++)b=f[c],this.elements.push(new e(b))}return a}(),e=function(){function a(a){this.selector=a,this.progress=0,this.check()}return a.prototype.check=function(){var a=this;return document.querySelector(this.selector)?this.done():setTimeout(function(){return a.check()},D.elements.checkInterval)},a.prototype.done=function(){return this.progress=100},a}(),c=function(){function a(){var a,b,c=this;this.progress=null!=(b=this.states[document.readyState])?b:100,a=document.onreadystatechange,document.onreadystatechange=function(){return null!=c.states[document.readyState]&&(c.progress=c.states[document.readyState]),\\\"function\\\"==typeof a?a.apply(null,arguments):void 0}}return a.prototype.states={loading:0,interactive:50,complete:100},a}(),f=function(){function a(){var a,b,c,d,e,f=this;this.progress=0,a=0,e=[],d=0,c=C(),b=setInterval(function(){var g;return g=C()-c-50,c=C(),e.push(g),e.length>D.eventLag.sampleCount&&e.shift(),a=q(e),++d>=D.eventLag.minSamples&&a<D.eventLag.lagThreshold?(f.progress=100,clearInterval(b)):f.progress=100*(3/(a+3))},50)}return a}(),m=function(){function a(a){this.source=a,this.last=this.sinceLastUpdate=0,this.rate=D.initialRate,this.catchup=0,this.progress=this.lastProgress=0,null!=this.source&&(this.progress=F(this.source,\\\"progress\\\"))}return a.prototype.tick=function(a,b){var c;return null==b&&(b=F(this.source,\\\"progress\\\")),b>=100&&(this.done=!0),b===this.last?this.sinceLastUpdate+=a:(this.sinceLastUpdate&&(this.rate=(b-this.last)/this.sinceLastUpdate),this.catchup=(b-this.progress)/D.catchupTime,this.sinceLastUpdate=0,this.last=b),b>this.progress&&(this.progress+=this.catchup*a),c=1-Math.pow(this.progress/100,D.easeFactor),this.progress+=c*this.rate*a,this.progress=Math.min(this.lastProgress+D.maxProgressPerFrame,this.progress),this.progress=Math.max(0,this.progress),this.progress=Math.min(100,this.progress),this.lastProgress=this.progress,this.progress},a}(),L=null,H=null,r=null,M=null,p=null,s=null,j.running=!1,z=function(){return D.restartOnPushState?j.restart():void 0},null!=window.history.pushState&&(T=window.history.pushState,window.history.pushState=function(){return z(),T.apply(window.history,arguments)}),null!=window.history.replaceState&&(W=window.history.replaceState,window.history.replaceState=function(){return z(),W.apply(window.history,arguments)}),l={ajax:a,elements:d,document:c,eventLag:f},(B=function(){var a,c,d,e,f,g,h,i;for(j.sources=L=[],g=[\\\"ajax\\\",\\\"elements\\\",\\\"document\\\",\\\"eventLag\\\"],c=0,e=g.length;e>c;c++)a=g[c],D[a]!==!1&&L.push(new l[a](D[a]));for(i=null!=(h=D.extraSources)?h:[],d=0,f=i.length;f>d;d++)K=i[d],L.push(new K(D));return j.bar=r=new b,H=[],M=new m})(),j.stop=function(){return j.trigger(\\\"stop\\\"),j.running=!1,r.destroy(),s=!0,null!=p&&(\\\"function\\\"==typeof t&&t(p),p=null),B()},j.restart=function(){return j.trigger(\\\"restart\\\"),j.stop(),j.start()},j.go=function(){var a;return j.running=!0,r.render(),a=C(),s=!1,p=G(function(b,c){var d,e,f,g,h,i,k,l,n,o,p,q,t,u,v,w;for(l=100-r.progress,e=p=0,f=!0,i=q=0,u=L.length;u>q;i=++q)for(K=L[i],o=null!=H[i]?H[i]:H[i]=[],h=null!=(w=K.elements)?w:[K],k=t=0,v=h.length;v>t;k=++t)g=h[k],n=null!=o[k]?o[k]:o[k]=new m(g),f&=n.done,n.done||(e++,p+=n.tick(b));return d=p/e,r.update(M.tick(b,d)),r.done()||f||s?(r.update(100),j.trigger(\\\"done\\\"),setTimeout(function(){return r.finish(),j.running=!1,j.trigger(\\\"hide\\\")},Math.max(D.ghostTime,Math.max(D.minTime-(C()-a),0)))):c()})},j.start=function(a){v(D,a),j.running=!0;try{r.render()}catch(b){i=b}return document.querySelector(\\\".pace\\\")?(j.trigger(\\\"start\\\"),j.go()):setTimeout(j.start,50)},\\\"function\\\"==typeof define&&define.amd?define(function(){return j}):\\\"object\\\"==typeof exports?module.exports=j:D.startOnPageLoad&&j.start()}).call(this);\"\n\n/***/ }),\n\n/***/ 2203:\n/***/ (function(module, exports, __webpack_require__) {\n\n__webpack_require__(3)(__webpack_require__(2204))\n\n/***/ }),\n\n/***/ 2204:\n/***/ (function(module, exports) {\n\nmodule.exports = \"\\\"use strict\\\";\\r\\n\\r\\nangular.module(\\\"ui.checkbox\\\", []).directive(\\\"checkbox\\\", function() {\\r\\n return {\\r\\n scope: {},\\r\\n require: \\\"ngModel\\\",\\r\\n restrict: \\\"E\\\",\\r\\n replace: \\\"true\\\",\\r\\n template: \\\"<button type=\\\\\\\"button\\\\\\\" ng-style=\\\\\\\"stylebtn\\\\\\\" class=\\\\\\\"btn btn-white\\\\\\\" ng-class=\\\\\\\"{'btn-xs': size==='default', 'btn-sm': size==='large', 'btn-lg': size==='largest'}\\\\\\\">\\\" +\\r\\n \\\"<span ng-style=\\\\\\\"styleicon\\\\\\\" class=\\\\\\\"glyphicon\\\\\\\" ng-class=\\\\\\\"{'fa fa-check': checked===true}\\\\\\\"></span>\\\" +\\r\\n \\\"</button>\\\",\\r\\n link: function(scope, elem, attrs, modelCtrl) {\\r\\n\\r\\n var label = elem.next('span');\\r\\n\\r\\n scope.size = \\\"default\\\";\\r\\n // Default Button Styling\\r\\n scope.stylebtn = {};\\r\\n // Default Checkmark Styling\\r\\n scope.styleicon = {\\\"width\\\": \\\"10px\\\", \\\"left\\\": \\\"-1px\\\"};\\r\\n // If size is undefined, Checkbox has normal size (Bootstrap 'xs')\\r\\n if(attrs.large !== undefined) {\\r\\n scope.size = \\\"large\\\";\\r\\n scope.stylebtn = {\\\"padding-top\\\": \\\"2px\\\", \\\"padding-bottom\\\": \\\"2px\\\", \\\"height\\\": \\\"30px\\\"};\\r\\n scope.styleicon = {\\\"width\\\": \\\"8px\\\", \\\"left\\\": \\\"-5px\\\", \\\"font-size\\\": \\\"17px\\\"};\\r\\n }\\r\\n if(attrs.larger !== undefined) {\\r\\n scope.size = \\\"larger\\\";\\r\\n scope.stylebtn = {\\\"padding-top\\\": \\\"2px\\\", \\\"padding-bottom\\\": \\\"2px\\\", \\\"height\\\": \\\"34px\\\"};\\r\\n scope.styleicon = {\\\"width\\\": \\\"8px\\\", \\\"left\\\": \\\"-8px\\\", \\\"font-size\\\": \\\"22px\\\"};\\r\\n }\\r\\n if(attrs.largest !== undefined) {\\r\\n scope.size = \\\"largest\\\";\\r\\n scope.stylebtn = {\\\"padding-top\\\": \\\"2px\\\", \\\"padding-bottom\\\": \\\"2px\\\", \\\"height\\\": \\\"45px\\\"};\\r\\n scope.styleicon = {\\\"width\\\": \\\"11px\\\", \\\"left\\\": \\\"-11px\\\", \\\"font-size\\\": \\\"30px\\\"};\\r\\n }\\r\\n\\r\\n var trueValue = true;\\r\\n var falseValue = false;\\r\\n\\r\\n // If defined set true value\\r\\n if(attrs.ngTrueValue !== undefined) {\\r\\n trueValue = attrs.ngTrueValue;\\r\\n\\r\\n }\\r\\n // If defined set false value\\r\\n if(attrs.ngFalseValue !== undefined) {\\r\\n falseValue = attrs.ngFalseValue;\\r\\n }\\r\\n\\r\\n // Check if name attribute is set and if so add it to the DOM element\\r\\n if(scope.name !== undefined) {\\r\\n elem.name = scope.name;\\r\\n }\\r\\n\\r\\n // Update element when model changes\\r\\n scope.$watch(function() {\\r\\n if(modelCtrl.$modelValue === trueValue || modelCtrl.$modelValue === true) {\\r\\n modelCtrl.$setViewValue(trueValue);\\r\\n label.addClass('todo-completed');\\r\\n } else {\\r\\n modelCtrl.$setViewValue(falseValue);\\r\\n }\\r\\n return modelCtrl.$modelValue;\\r\\n }, function(newVal, oldVal) {\\r\\n scope.checked = modelCtrl.$modelValue === trueValue;\\r\\n }, true);\\r\\n\\r\\n // On click swap value and trigger onChange function\\r\\n elem.bind(\\\"click\\\", function() {\\r\\n\\r\\n scope.$apply(function() {\\r\\n if(modelCtrl.$modelValue === falseValue) {\\r\\n modelCtrl.$setViewValue(trueValue);\\r\\n label.toggleClass('todo-completed');\\r\\n } else {\\r\\n modelCtrl.$setViewValue(falseValue);\\r\\n label.toggleClass('todo-completed');\\r\\n }\\r\\n });\\r\\n });\\r\\n }\\r\\n };\\r\\n});\"\n\n/***/ }),\n\n/***/ 2205:\n/***/ (function(module, exports, __webpack_require__) {\n\n__webpack_require__(3)(__webpack_require__(2206))\n\n/***/ }),\n\n/***/ 2206:\n/***/ (function(module, exports) {\n\nmodule.exports = \"/* Javascript plotting library for jQuery, version 0.8.3.\\n\\nCopyright (c) 2007-2014 IOLA and Ole Laursen.\\nLicensed under the MIT license.\\n\\n*/\\n\\n// first an inline dependency, jquery.colorhelpers.js, we inline it here\\n// for convenience\\n\\n/* Plugin for jQuery for working with colors.\\n *\\n * Version 1.1.\\n *\\n * Inspiration from jQuery color animation plugin by John Resig.\\n *\\n * Released under the MIT license by Ole Laursen, October 2009.\\n *\\n * Examples:\\n *\\n * $.color.parse(\\\"#fff\\\").scale('rgb', 0.25).add('a', -0.5).toString()\\n * var c = $.color.extract($(\\\"#mydiv\\\"), 'background-color');\\n * console.log(c.r, c.g, c.b, c.a);\\n * $.color.make(100, 50, 25, 0.4).toString() // returns \\\"rgba(100,50,25,0.4)\\\"\\n *\\n * Note that .scale() and .add() return the same modified object\\n * instead of making a new one.\\n *\\n * V. 1.1: Fix error handling so e.g. parsing an empty string does\\n * produce a color rather than just crashing.\\n */\\n(function($){$.color={};$.color.make=function(r,g,b,a){var o={};o.r=r||0;o.g=g||0;o.b=b||0;o.a=a!=null?a:1;o.add=function(c,d){for(var i=0;i<c.length;++i)o[c.charAt(i)]+=d;return o.normalize()};o.scale=function(c,f){for(var i=0;i<c.length;++i)o[c.charAt(i)]*=f;return o.normalize()};o.toString=function(){if(o.a>=1){return\\\"rgb(\\\"+[o.r,o.g,o.b].join(\\\",\\\")+\\\")\\\"}else{return\\\"rgba(\\\"+[o.r,o.g,o.b,o.a].join(\\\",\\\")+\\\")\\\"}};o.normalize=function(){function clamp(min,value,max){return value<min?min:value>max?max:value}o.r=clamp(0,parseInt(o.r),255);o.g=clamp(0,parseInt(o.g),255);o.b=clamp(0,parseInt(o.b),255);o.a=clamp(0,o.a,1);return o};o.clone=function(){return $.color.make(o.r,o.b,o.g,o.a)};return o.normalize()};$.color.extract=function(elem,css){var c;do{c=elem.css(css).toLowerCase();if(c!=\\\"\\\"&&c!=\\\"transparent\\\")break;elem=elem.parent()}while(elem.length&&!$.nodeName(elem.get(0),\\\"body\\\"));if(c==\\\"rgba(0, 0, 0, 0)\\\")c=\\\"transparent\\\";return $.color.parse(c)};$.color.parse=function(str){var res,m=$.color.make;if(res=/rgb\\\\(\\\\s*([0-9]{1,3})\\\\s*,\\\\s*([0-9]{1,3})\\\\s*,\\\\s*([0-9]{1,3})\\\\s*\\\\)/.exec(str))return m(parseInt(res[1],10),parseInt(res[2],10),parseInt(res[3],10));if(res=/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*\\\\)/.exec(str))return m(parseInt(res[1],10),parseInt(res[2],10),parseInt(res[3],10),parseFloat(res[4]));if(res=/rgb\\\\(\\\\s*([0-9]+(?:\\\\.[0-9]+)?)\\\\%\\\\s*,\\\\s*([0-9]+(?:\\\\.[0-9]+)?)\\\\%\\\\s*,\\\\s*([0-9]+(?:\\\\.[0-9]+)?)\\\\%\\\\s*\\\\)/.exec(str))return m(parseFloat(res[1])*2.55,parseFloat(res[2])*2.55,parseFloat(res[3])*2.55);if(res=/rgba\\\\(\\\\s*([0-9]+(?:\\\\.[0-9]+)?)\\\\%\\\\s*,\\\\s*([0-9]+(?:\\\\.[0-9]+)?)\\\\%\\\\s*,\\\\s*([0-9]+(?:\\\\.[0-9]+)?)\\\\%\\\\s*,\\\\s*([0-9]+(?:\\\\.[0-9]+)?)\\\\s*\\\\)/.exec(str))return m(parseFloat(res[1])*2.55,parseFloat(res[2])*2.55,parseFloat(res[3])*2.55,parseFloat(res[4]));if(res=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(str))return m(parseInt(res[1],16),parseInt(res[2],16),parseInt(res[3],16));if(res=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(str))return m(parseInt(res[1]+res[1],16),parseInt(res[2]+res[2],16),parseInt(res[3]+res[3],16));var name=$.trim(str).toLowerCase();if(name==\\\"transparent\\\")return m(255,255,255,0);else{res=lookupColors[name]||[0,0,0];return m(res[0],res[1],res[2])}};var lookupColors={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0,0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0]}})(jQuery);\\n\\n// the actual Flot code\\n(function($) {\\n\\n\\t// Cache the prototype hasOwnProperty for faster access\\n\\n\\tvar hasOwnProperty = Object.prototype.hasOwnProperty;\\n\\n // A shim to provide 'detach' to jQuery versions prior to 1.4. Using a DOM\\n // operation produces the same effect as detach, i.e. removing the element\\n // without touching its jQuery data.\\n\\n // Do not merge this into Flot 0.9, since it requires jQuery 1.4.4+.\\n\\n if (!$.fn.detach) {\\n $.fn.detach = function() {\\n return this.each(function() {\\n if (this.parentNode) {\\n this.parentNode.removeChild( this );\\n }\\n });\\n };\\n }\\n\\n\\t///////////////////////////////////////////////////////////////////////////\\n\\t// The Canvas object is a wrapper around an HTML5 <canvas> tag.\\n\\t//\\n\\t// @constructor\\n\\t// @param {string} cls List of classes to apply to the canvas.\\n\\t// @param {element} container Element onto which to append the canvas.\\n\\t//\\n\\t// Requiring a container is a little iffy, but unfortunately canvas\\n\\t// operations don't work unless the canvas is attached to the DOM.\\n\\n\\tfunction Canvas(cls, container) {\\n\\n\\t\\tvar element = container.children(\\\".\\\" + cls)[0];\\n\\n\\t\\tif (element == null) {\\n\\n\\t\\t\\telement = document.createElement(\\\"canvas\\\");\\n\\t\\t\\telement.className = cls;\\n\\n\\t\\t\\t$(element).css({ direction: \\\"ltr\\\", position: \\\"absolute\\\", left: 0, top: 0 })\\n\\t\\t\\t\\t.appendTo(container);\\n\\n\\t\\t\\t// If HTML5 Canvas isn't available, fall back to [Ex|Flash]canvas\\n\\n\\t\\t\\tif (!element.getContext) {\\n\\t\\t\\t\\tif (window.G_vmlCanvasManager) {\\n\\t\\t\\t\\t\\telement = window.G_vmlCanvasManager.initElement(element);\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\tthrow new Error(\\\"Canvas is not available. If you're using IE with a fall-back such as Excanvas, then there's either a mistake in your conditional include, or the page has no DOCTYPE and is rendering in Quirks Mode.\\\");\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\tthis.element = element;\\n\\n\\t\\tvar context = this.context = element.getContext(\\\"2d\\\");\\n\\n\\t\\t// Determine the screen's ratio of physical to device-independent\\n\\t\\t// pixels. This is the ratio between the canvas width that the browser\\n\\t\\t// advertises and the number of pixels actually present in that space.\\n\\n\\t\\t// The iPhone 4, for example, has a device-independent width of 320px,\\n\\t\\t// but its screen is actually 640px wide. It therefore has a pixel\\n\\t\\t// ratio of 2, while most normal devices have a ratio of 1.\\n\\n\\t\\tvar devicePixelRatio = window.devicePixelRatio || 1,\\n\\t\\t\\tbackingStoreRatio =\\n\\t\\t\\t\\tcontext.webkitBackingStorePixelRatio ||\\n\\t\\t\\t\\tcontext.mozBackingStorePixelRatio ||\\n\\t\\t\\t\\tcontext.msBackingStorePixelRatio ||\\n\\t\\t\\t\\tcontext.oBackingStorePixelRatio ||\\n\\t\\t\\t\\tcontext.backingStorePixelRatio || 1;\\n\\n\\t\\tthis.pixelRatio = devicePixelRatio / backingStoreRatio;\\n\\n\\t\\t// Size the canvas to match the internal dimensions of its container\\n\\n\\t\\tthis.resize(container.width(), container.height());\\n\\n\\t\\t// Collection of HTML div layers for text overlaid onto the canvas\\n\\n\\t\\tthis.textContainer = null;\\n\\t\\tthis.text = {};\\n\\n\\t\\t// Cache of text fragments and metrics, so we can avoid expensively\\n\\t\\t// re-calculating them when the plot is re-rendered in a loop.\\n\\n\\t\\tthis._textCache = {};\\n\\t}\\n\\n\\t// Resizes the canvas to the given dimensions.\\n\\t//\\n\\t// @param {number} width New width of the canvas, in pixels.\\n\\t// @param {number} width New height of the canvas, in pixels.\\n\\n\\tCanvas.prototype.resize = function(width, height) {\\n\\n\\t\\tif (width <= 0 || height <= 0) {\\n\\t\\t\\tthrow new Error(\\\"Invalid dimensions for plot, width = \\\" + width + \\\", height = \\\" + height);\\n\\t\\t}\\n\\n\\t\\tvar element = this.element,\\n\\t\\t\\tcontext = this.context,\\n\\t\\t\\tpixelRatio = this.pixelRatio;\\n\\n\\t\\t// Resize the canvas, increasing its density based on the display's\\n\\t\\t// pixel ratio; basically giving it more pixels without increasing the\\n\\t\\t// size of its element, to take advantage of the fact that retina\\n\\t\\t// displays have that many more pixels in the same advertised space.\\n\\n\\t\\t// Resizing should reset the state (excanvas seems to be buggy though)\\n\\n\\t\\tif (this.width != width) {\\n\\t\\t\\telement.width = width * pixelRatio;\\n\\t\\t\\telement.style.width = width + \\\"px\\\";\\n\\t\\t\\tthis.width = width;\\n\\t\\t}\\n\\n\\t\\tif (this.height != height) {\\n\\t\\t\\telement.height = height * pixelRatio;\\n\\t\\t\\telement.style.height = height + \\\"px\\\";\\n\\t\\t\\tthis.height = height;\\n\\t\\t}\\n\\n\\t\\t// Save the context, so we can reset in case we get replotted. The\\n\\t\\t// restore ensure that we're really back at the initial state, and\\n\\t\\t// should be safe even if we haven't saved the initial state yet.\\n\\n\\t\\tcontext.restore();\\n\\t\\tcontext.save();\\n\\n\\t\\t// Scale the coordinate space to match the display density; so even though we\\n\\t\\t// may have twice as many pixels, we still want lines and other drawing to\\n\\t\\t// appear at the same size; the extra pixels will just make them crisper.\\n\\n\\t\\tcontext.scale(pixelRatio, pixelRatio);\\n\\t};\\n\\n\\t// Clears the entire canvas area, not including any overlaid HTML text\\n\\n\\tCanvas.prototype.clear = function() {\\n\\t\\tthis.context.clearRect(0, 0, this.width, this.height);\\n\\t};\\n\\n\\t// Finishes rendering the canvas, including managing the text overlay.\\n\\n\\tCanvas.prototype.render = function() {\\n\\n\\t\\tvar cache = this._textCache;\\n\\n\\t\\t// For each text layer, add elements marked as active that haven't\\n\\t\\t// already been rendered, and remove those that are no longer active.\\n\\n\\t\\tfor (var layerKey in cache) {\\n\\t\\t\\tif (hasOwnProperty.call(cache, layerKey)) {\\n\\n\\t\\t\\t\\tvar layer = this.getTextLayer(layerKey),\\n\\t\\t\\t\\t\\tlayerCache = cache[layerKey];\\n\\n\\t\\t\\t\\tlayer.hide();\\n\\n\\t\\t\\t\\tfor (var styleKey in layerCache) {\\n\\t\\t\\t\\t\\tif (hasOwnProperty.call(layerCache, styleKey)) {\\n\\t\\t\\t\\t\\t\\tvar styleCache = layerCache[styleKey];\\n\\t\\t\\t\\t\\t\\tfor (var key in styleCache) {\\n\\t\\t\\t\\t\\t\\t\\tif (hasOwnProperty.call(styleCache, key)) {\\n\\n\\t\\t\\t\\t\\t\\t\\t\\tvar positions = styleCache[key].positions;\\n\\n\\t\\t\\t\\t\\t\\t\\t\\tfor (var i = 0, position; position = positions[i]; i++) {\\n\\t\\t\\t\\t\\t\\t\\t\\t\\tif (position.active) {\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\tif (!position.rendered) {\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\tlayer.append(position.element);\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\tposition.rendered = true;\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\tpositions.splice(i--, 1);\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\tif (position.rendered) {\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\tposition.element.detach();\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\t\\t\\t\\tif (positions.length == 0) {\\n\\t\\t\\t\\t\\t\\t\\t\\t\\tdelete styleCache[key];\\n\\t\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\tlayer.show();\\n\\t\\t\\t}\\n\\t\\t}\\n\\t};\\n\\n\\t// Creates (if necessary) and returns the text overlay container.\\n\\t//\\n\\t// @param {string} classes String of space-separated CSS classes used to\\n\\t// uniquely identify the text layer.\\n\\t// @return {object} The jQuery-wrapped text-layer div.\\n\\n\\tCanvas.prototype.getTextLayer = function(classes) {\\n\\n\\t\\tvar layer = this.text[classes];\\n\\n\\t\\t// Create the text layer if it doesn't exist\\n\\n\\t\\tif (layer == null) {\\n\\n\\t\\t\\t// Create the text layer container, if it doesn't exist\\n\\n\\t\\t\\tif (this.textContainer == null) {\\n\\t\\t\\t\\tthis.textContainer = $(\\\"<div class='flot-text'></div>\\\")\\n\\t\\t\\t\\t\\t.css({\\n\\t\\t\\t\\t\\t\\tposition: \\\"absolute\\\",\\n\\t\\t\\t\\t\\t\\ttop: 0,\\n\\t\\t\\t\\t\\t\\tleft: 0,\\n\\t\\t\\t\\t\\t\\tbottom: 0,\\n\\t\\t\\t\\t\\t\\tright: 0,\\n\\t\\t\\t\\t\\t\\t'font-size': \\\"smaller\\\",\\n\\t\\t\\t\\t\\t\\tcolor: \\\"#545454\\\"\\n\\t\\t\\t\\t\\t})\\n\\t\\t\\t\\t\\t.insertAfter(this.element);\\n\\t\\t\\t}\\n\\n\\t\\t\\tlayer = this.text[classes] = $(\\\"<div></div>\\\")\\n\\t\\t\\t\\t.addClass(classes)\\n\\t\\t\\t\\t.css({\\n\\t\\t\\t\\t\\tposition: \\\"absolute\\\",\\n\\t\\t\\t\\t\\ttop: 0,\\n\\t\\t\\t\\t\\tleft: 0,\\n\\t\\t\\t\\t\\tbottom: 0,\\n\\t\\t\\t\\t\\tright: 0\\n\\t\\t\\t\\t})\\n\\t\\t\\t\\t.appendTo(this.textContainer);\\n\\t\\t}\\n\\n\\t\\treturn layer;\\n\\t};\\n\\n\\t// Creates (if necessary) and returns a text info object.\\n\\t//\\n\\t// The object looks like this:\\n\\t//\\n\\t// {\\n\\t// width: Width of the text's wrapper div.\\n\\t// height: Height of the text's wrapper div.\\n\\t// element: The jQuery-wrapped HTML div containing the text.\\n\\t// positions: Array of positions at which this text is drawn.\\n\\t// }\\n\\t//\\n\\t// The positions array contains objects that look like this:\\n\\t//\\n\\t// {\\n\\t// active: Flag indicating whether the text should be visible.\\n\\t// rendered: Flag indicating whether the text is currently visible.\\n\\t// element: The jQuery-wrapped HTML div containing the text.\\n\\t// x: X coordinate at which to draw the text.\\n\\t// y: Y coordinate at which to draw the text.\\n\\t// }\\n\\t//\\n\\t// Each position after the first receives a clone of the original element.\\n\\t//\\n\\t// The idea is that that the width, height, and general 'identity' of the\\n\\t// text is constant no matter where it is placed; the placements are a\\n\\t// secondary property.\\n\\t//\\n\\t// Canvas maintains a cache of recently-used text info objects; getTextInfo\\n\\t// either returns the cached element or creates a new entry.\\n\\t//\\n\\t// @param {string} layer A string of space-separated CSS classes uniquely\\n\\t// identifying the layer containing this text.\\n\\t// @param {string} text Text string to retrieve info for.\\n\\t// @param {(string|object)=} font Either a string of space-separated CSS\\n\\t// classes or a font-spec object, defining the text's font and style.\\n\\t// @param {number=} angle Angle at which to rotate the text, in degrees.\\n\\t// Angle is currently unused, it will be implemented in the future.\\n\\t// @param {number=} width Maximum width of the text before it wraps.\\n\\t// @return {object} a text info object.\\n\\n\\tCanvas.prototype.getTextInfo = function(layer, text, font, angle, width) {\\n\\n\\t\\tvar textStyle, layerCache, styleCache, info;\\n\\n\\t\\t// Cast the value to a string, in case we were given a number or such\\n\\n\\t\\ttext = \\\"\\\" + text;\\n\\n\\t\\t// If the font is a font-spec object, generate a CSS font definition\\n\\n\\t\\tif (typeof font === \\\"object\\\") {\\n\\t\\t\\ttextStyle = font.style + \\\" \\\" + font.variant + \\\" \\\" + font.weight + \\\" \\\" + font.size + \\\"px/\\\" + font.lineHeight + \\\"px \\\" + font.family;\\n\\t\\t} else {\\n\\t\\t\\ttextStyle = font;\\n\\t\\t}\\n\\n\\t\\t// Retrieve (or create) the cache for the text's layer and styles\\n\\n\\t\\tlayerCache = this._textCache[layer];\\n\\n\\t\\tif (layerCache == null) {\\n\\t\\t\\tlayerCache = this._textCache[layer] = {};\\n\\t\\t}\\n\\n\\t\\tstyleCache = layerCache[textStyle];\\n\\n\\t\\tif (styleCache == null) {\\n\\t\\t\\tstyleCache = layerCache[textStyle] = {};\\n\\t\\t}\\n\\n\\t\\tinfo = styleCache[text];\\n\\n\\t\\t// If we can't find a matching element in our cache, create a new one\\n\\n\\t\\tif (info == null) {\\n\\n\\t\\t\\tvar element = $(\\\"<div></div>\\\").html(text)\\n\\t\\t\\t\\t.css({\\n\\t\\t\\t\\t\\tposition: \\\"absolute\\\",\\n\\t\\t\\t\\t\\t'max-width': width,\\n\\t\\t\\t\\t\\ttop: -9999\\n\\t\\t\\t\\t})\\n\\t\\t\\t\\t.appendTo(this.getTextLayer(layer));\\n\\n\\t\\t\\tif (typeof font === \\\"object\\\") {\\n\\t\\t\\t\\telement.css({\\n\\t\\t\\t\\t\\tfont: textStyle,\\n\\t\\t\\t\\t\\tcolor: font.color\\n\\t\\t\\t\\t});\\n\\t\\t\\t} else if (typeof font === \\\"string\\\") {\\n\\t\\t\\t\\telement.addClass(font);\\n\\t\\t\\t}\\n\\n\\t\\t\\tinfo = styleCache[text] = {\\n\\t\\t\\t\\twidth: element.outerWidth(true),\\n\\t\\t\\t\\theight: element.outerHeight(true),\\n\\t\\t\\t\\telement: element,\\n\\t\\t\\t\\tpositions: []\\n\\t\\t\\t};\\n\\n\\t\\t\\telement.detach();\\n\\t\\t}\\n\\n\\t\\treturn info;\\n\\t};\\n\\n\\t// Adds a text string to the canvas text overlay.\\n\\t//\\n\\t// The text isn't drawn immediately; it is marked as rendering, which will\\n\\t// result in its addition to the canvas on the next render pass.\\n\\t//\\n\\t// @param {string} layer A string of space-separated CSS classes uniquely\\n\\t// identifying the layer containing this text.\\n\\t// @param {number} x X coordinate at which to draw the text.\\n\\t// @param {number} y Y coordinate at which to draw the text.\\n\\t// @param {string} text Text string to draw.\\n\\t// @param {(string|object)=} font Either a string of space-separated CSS\\n\\t// classes or a font-spec object, defining the text's font and style.\\n\\t// @param {number=} angle Angle at which to rotate the text, in degrees.\\n\\t// Angle is currently unused, it will be implemented in the future.\\n\\t// @param {number=} width Maximum width of the text before it wraps.\\n\\t// @param {string=} halign Horizontal alignment of the text; either \\\"left\\\",\\n\\t// \\\"center\\\" or \\\"right\\\".\\n\\t// @param {string=} valign Vertical alignment of the text; either \\\"top\\\",\\n\\t// \\\"middle\\\" or \\\"bottom\\\".\\n\\n\\tCanvas.prototype.addText = function(layer, x, y, text, font, angle, width, halign, valign) {\\n\\n\\t\\tvar info = this.getTextInfo(layer, text, font, angle, width),\\n\\t\\t\\tpositions = info.positions;\\n\\n\\t\\t// Tweak the div's position to match the text's alignment\\n\\n\\t\\tif (halign == \\\"center\\\") {\\n\\t\\t\\tx -= info.width / 2;\\n\\t\\t} else if (halign == \\\"right\\\") {\\n\\t\\t\\tx -= info.width;\\n\\t\\t}\\n\\n\\t\\tif (valign == \\\"middle\\\") {\\n\\t\\t\\ty -= info.height / 2;\\n\\t\\t} else if (valign == \\\"bottom\\\") {\\n\\t\\t\\ty -= info.height;\\n\\t\\t}\\n\\n\\t\\t// Determine whether this text already exists at this position.\\n\\t\\t// If so, mark it for inclusion in the next render pass.\\n\\n\\t\\tfor (var i = 0, position; position = positions[i]; i++) {\\n\\t\\t\\tif (position.x == x && position.y == y) {\\n\\t\\t\\t\\tposition.active = true;\\n\\t\\t\\t\\treturn;\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t// If the text doesn't exist at this position, create a new entry\\n\\n\\t\\t// For the very first position we'll re-use the original element,\\n\\t\\t// while for subsequent ones we'll clone it.\\n\\n\\t\\tposition = {\\n\\t\\t\\tactive: true,\\n\\t\\t\\trendered: false,\\n\\t\\t\\telement: positions.length ? info.element.clone() : info.element,\\n\\t\\t\\tx: x,\\n\\t\\t\\ty: y\\n\\t\\t};\\n\\n\\t\\tpositions.push(position);\\n\\n\\t\\t// Move the element to its final position within the container\\n\\n\\t\\tposition.element.css({\\n\\t\\t\\ttop: Math.round(y),\\n\\t\\t\\tleft: Math.round(x),\\n\\t\\t\\t'text-align': halign\\t// In case the text wraps\\n\\t\\t});\\n\\t};\\n\\n\\t// Removes one or more text strings from the canvas text overlay.\\n\\t//\\n\\t// If no parameters are given, all text within the layer is removed.\\n\\t//\\n\\t// Note that the text is not immediately removed; it is simply marked as\\n\\t// inactive, which will result in its removal on the next render pass.\\n\\t// This avoids the performance penalty for 'clear and redraw' behavior,\\n\\t// where we potentially get rid of all text on a layer, but will likely\\n\\t// add back most or all of it later, as when redrawing axes, for example.\\n\\t//\\n\\t// @param {string} layer A string of space-separated CSS classes uniquely\\n\\t// identifying the layer containing this text.\\n\\t// @param {number=} x X coordinate of the text.\\n\\t// @param {number=} y Y coordinate of the text.\\n\\t// @param {string=} text Text string to remove.\\n\\t// @param {(string|object)=} font Either a string of space-separated CSS\\n\\t// classes or a font-spec object, defining the text's font and style.\\n\\t// @param {number=} angle Angle at which the text is rotated, in degrees.\\n\\t// Angle is currently unused, it will be implemented in the future.\\n\\n\\tCanvas.prototype.removeText = function(layer, x, y, text, font, angle) {\\n\\t\\tif (text == null) {\\n\\t\\t\\tvar layerCache = this._textCache[layer];\\n\\t\\t\\tif (layerCache != null) {\\n\\t\\t\\t\\tfor (var styleKey in layerCache) {\\n\\t\\t\\t\\t\\tif (hasOwnProperty.call(layerCache, styleKey)) {\\n\\t\\t\\t\\t\\t\\tvar styleCache = layerCache[styleKey];\\n\\t\\t\\t\\t\\t\\tfor (var key in styleCache) {\\n\\t\\t\\t\\t\\t\\t\\tif (hasOwnProperty.call(styleCache, key)) {\\n\\t\\t\\t\\t\\t\\t\\t\\tvar positions = styleCache[key].positions;\\n\\t\\t\\t\\t\\t\\t\\t\\tfor (var i = 0, position; position = positions[i]; i++) {\\n\\t\\t\\t\\t\\t\\t\\t\\t\\tposition.active = false;\\n\\t\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t} else {\\n\\t\\t\\tvar positions = this.getTextInfo(layer, text, font, angle).positions;\\n\\t\\t\\tfor (var i = 0, position; position = positions[i]; i++) {\\n\\t\\t\\t\\tif (position.x == x && position.y == y) {\\n\\t\\t\\t\\t\\tposition.active = false;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t};\\n\\n\\t///////////////////////////////////////////////////////////////////////////\\n\\t// The top-level container for the entire plot.\\n\\n function Plot(placeholder, data_, options_, plugins) {\\n // data is on the form:\\n // [ series1, series2 ... ]\\n // where series is either just the data as [ [x1, y1], [x2, y2], ... ]\\n // or { data: [ [x1, y1], [x2, y2], ... ], label: \\\"some label\\\", ... }\\n\\n var series = [],\\n options = {\\n // the color theme used for graphs\\n colors: [\\\"#edc240\\\", \\\"#afd8f8\\\", \\\"#cb4b4b\\\", \\\"#4da74d\\\", \\\"#9440ed\\\"],\\n legend: {\\n show: true,\\n noColumns: 1, // number of colums in legend table\\n labelFormatter: null, // fn: string -> string\\n labelBoxBorderColor: \\\"#ccc\\\", // border color for the little label boxes\\n container: null, // container (as jQuery object) to put legend in, null means default on top of graph\\n position: \\\"ne\\\", // position of default legend container within plot\\n margin: 5, // distance from grid edge to default legend container within plot\\n backgroundColor: null, // null means auto-detect\\n backgroundOpacity: 0.85, // set to 0 to avoid background\\n sorted: null // default to no legend sorting\\n },\\n xaxis: {\\n show: null, // null = auto-detect, true = always, false = never\\n position: \\\"bottom\\\", // or \\\"top\\\"\\n mode: null, // null or \\\"time\\\"\\n font: null, // null (derived from CSS in placeholder) or object like { size: 11, lineHeight: 13, style: \\\"italic\\\", weight: \\\"bold\\\", family: \\\"sans-serif\\\", variant: \\\"small-caps\\\" }\\n color: null, // base color, labels, ticks\\n tickColor: null, // possibly different color of ticks, e.g. \\\"rgba(0,0,0,0.15)\\\"\\n transform: null, // null or f: number -> number to transform axis\\n inverseTransform: null, // if transform is set, this should be the inverse function\\n min: null, // min. value to show, null means set automatically\\n max: null, // max. value to show, null means set automatically\\n autoscaleMargin: null, // margin in % to add if auto-setting min/max\\n ticks: null, // either [1, 3] or [[1, \\\"a\\\"], 3] or (fn: axis info -> ticks) or app. number of ticks for auto-ticks\\n tickFormatter: null, // fn: number -> string\\n labelWidth: null, // size of tick labels in pixels\\n labelHeight: null,\\n reserveSpace: null, // whether to reserve space even if axis isn't shown\\n tickLength: null, // size in pixels of ticks, or \\\"full\\\" for whole line\\n alignTicksWithAxis: null, // axis number or null for no sync\\n tickDecimals: null, // no. of decimals, null means auto\\n tickSize: null, // number or [number, \\\"unit\\\"]\\n minTickSize: null // number or [number, \\\"unit\\\"]\\n },\\n yaxis: {\\n autoscaleMargin: 0.02,\\n position: \\\"left\\\" // or \\\"right\\\"\\n },\\n xaxes: [],\\n yaxes: [],\\n series: {\\n points: {\\n show: false,\\n radius: 3,\\n lineWidth: 2, // in pixels\\n fill: true,\\n fillColor: \\\"#ffffff\\\",\\n symbol: \\\"circle\\\" // or callback\\n },\\n lines: {\\n // we don't put in show: false so we can see\\n // whether lines were actively disabled\\n lineWidth: 2, // in pixels\\n fill: false,\\n fillColor: null,\\n steps: false\\n // Omit 'zero', so we can later default its value to\\n // match that of the 'fill' option.\\n },\\n bars: {\\n show: false,\\n lineWidth: 2, // in pixels\\n barWidth: 1, // in units of the x axis\\n fill: true,\\n fillColor: null,\\n align: \\\"left\\\", // \\\"left\\\", \\\"right\\\", or \\\"center\\\"\\n horizontal: false,\\n zero: true\\n },\\n shadowSize: 3,\\n highlightColor: null\\n },\\n grid: {\\n show: true,\\n aboveData: false,\\n color: \\\"#545454\\\", // primary color used for outline and labels\\n backgroundColor: null, // null for transparent, else color\\n borderColor: null, // set if different from the grid color\\n tickColor: null, // color for the ticks, e.g. \\\"rgba(0,0,0,0.15)\\\"\\n margin: 0, // distance from the canvas edge to the grid\\n labelMargin: 5, // in pixels\\n axisMargin: 8, // in pixels\\n borderWidth: 2, // in pixels\\n minBorderMargin: null, // in pixels, null means taken from points radius\\n markings: null, // array of ranges or fn: axes -> array of ranges\\n markingsColor: \\\"#f4f4f4\\\",\\n markingsLineWidth: 2,\\n // interactive stuff\\n clickable: false,\\n hoverable: false,\\n autoHighlight: true, // highlight in case mouse is near\\n mouseActiveRadius: 10 // how far the mouse can be away to activate an item\\n },\\n interaction: {\\n redrawOverlayInterval: 1000/60 // time between updates, -1 means in same flow\\n },\\n hooks: {}\\n },\\n surface = null, // the canvas for the plot itself\\n overlay = null, // canvas for interactive stuff on top of plot\\n eventHolder = null, // jQuery object that events should be bound to\\n ctx = null, octx = null,\\n xaxes = [], yaxes = [],\\n plotOffset = { left: 0, right: 0, top: 0, bottom: 0},\\n plotWidth = 0, plotHeight = 0,\\n hooks = {\\n processOptions: [],\\n processRawData: [],\\n processDatapoints: [],\\n processOffset: [],\\n drawBackground: [],\\n drawSeries: [],\\n draw: [],\\n bindEvents: [],\\n drawOverlay: [],\\n shutdown: []\\n },\\n plot = this;\\n\\n // public functions\\n plot.setData = setData;\\n plot.setupGrid = setupGrid;\\n plot.draw = draw;\\n plot.getPlaceholder = function() { return placeholder; };\\n plot.getCanvas = function() { return surface.element; };\\n plot.getPlotOffset = function() { return plotOffset; };\\n plot.width = function () { return plotWidth; };\\n plot.height = function () { return plotHeight; };\\n plot.offset = function () {\\n var o = eventHolder.offset();\\n o.left += plotOffset.left;\\n o.top += plotOffset.top;\\n return o;\\n };\\n plot.getData = function () { return series; };\\n plot.getAxes = function () {\\n var res = {}, i;\\n $.each(xaxes.concat(yaxes), function (_, axis) {\\n if (axis)\\n res[axis.direction + (axis.n != 1 ? axis.n : \\\"\\\") + \\\"axis\\\"] = axis;\\n });\\n return res;\\n };\\n plot.getXAxes = function () { return xaxes; };\\n plot.getYAxes = function () { return yaxes; };\\n plot.c2p = canvasToAxisCoords;\\n plot.p2c = axisToCanvasCoords;\\n plot.getOptions = function () { return options; };\\n plot.highlight = highlight;\\n plot.unhighlight = unhighlight;\\n plot.triggerRedrawOverlay = triggerRedrawOverlay;\\n plot.pointOffset = function(point) {\\n return {\\n left: parseInt(xaxes[axisNumber(point, \\\"x\\\") - 1].p2c(+point.x) + plotOffset.left, 10),\\n top: parseInt(yaxes[axisNumber(point, \\\"y\\\") - 1].p2c(+point.y) + plotOffset.top, 10)\\n };\\n };\\n plot.shutdown = shutdown;\\n plot.destroy = function () {\\n shutdown();\\n placeholder.removeData(\\\"plot\\\").empty();\\n\\n series = [];\\n options = null;\\n surface = null;\\n overlay = null;\\n eventHolder = null;\\n ctx = null;\\n octx = null;\\n xaxes = [];\\n yaxes = [];\\n hooks = null;\\n highlights = [];\\n plot = null;\\n };\\n plot.resize = function () {\\n \\tvar width = placeholder.width(),\\n \\t\\theight = placeholder.height();\\n surface.resize(width, height);\\n overlay.resize(width, height);\\n };\\n\\n // public attributes\\n plot.hooks = hooks;\\n\\n // initialize\\n initPlugins(plot);\\n parseOptions(options_);\\n setupCanvases();\\n setData(data_);\\n setupGrid();\\n draw();\\n bindEvents();\\n\\n\\n function executeHooks(hook, args) {\\n args = [plot].concat(args);\\n for (var i = 0; i < hook.length; ++i)\\n hook[i].apply(this, args);\\n }\\n\\n function initPlugins() {\\n\\n // References to key classes, allowing plugins to modify them\\n\\n var classes = {\\n Canvas: Canvas\\n };\\n\\n for (var i = 0; i < plugins.length; ++i) {\\n var p = plugins[i];\\n p.init(plot, classes);\\n if (p.options)\\n $.extend(true, options, p.options);\\n }\\n }\\n\\n function parseOptions(opts) {\\n\\n $.extend(true, options, opts);\\n\\n // $.extend merges arrays, rather than replacing them. When less\\n // colors are provided than the size of the default palette, we\\n // end up with those colors plus the remaining defaults, which is\\n // not expected behavior; avoid it by replacing them here.\\n\\n if (opts && opts.colors) {\\n \\toptions.colors = opts.colors;\\n }\\n\\n if (options.xaxis.color == null)\\n options.xaxis.color = $.color.parse(options.grid.color).scale('a', 0.22).toString();\\n if (options.yaxis.color == null)\\n options.yaxis.color = $.color.parse(options.grid.color).scale('a', 0.22).toString();\\n\\n if (options.xaxis.tickColor == null) // grid.tickColor for back-compatibility\\n options.xaxis.tickColor = options.grid.tickColor || options.xaxis.color;\\n if (options.yaxis.tickColor == null) // grid.tickColor for back-compatibility\\n options.yaxis.tickColor = options.grid.tickColor || options.yaxis.color;\\n\\n if (options.grid.borderColor == null)\\n options.grid.borderColor = options.grid.color;\\n if (options.grid.tickColor == null)\\n options.grid.tickColor = $.color.parse(options.grid.color).scale('a', 0.22).toString();\\n\\n // Fill in defaults for axis options, including any unspecified\\n // font-spec fields, if a font-spec was provided.\\n\\n // If no x/y axis options were provided, create one of each anyway,\\n // since the rest of the code assumes that they exist.\\n\\n var i, axisOptions, axisCount,\\n fontSize = placeholder.css(\\\"font-size\\\"),\\n fontSizeDefault = fontSize ? +fontSize.replace(\\\"px\\\", \\\"\\\") : 13,\\n fontDefaults = {\\n style: placeholder.css(\\\"font-style\\\"),\\n size: Math.round(0.8 * fontSizeDefault),\\n variant: placeholder.css(\\\"font-variant\\\"),\\n weight: placeholder.css(\\\"font-weight\\\"),\\n family: placeholder.css(\\\"font-family\\\")\\n };\\n\\n axisCount = options.xaxes.length || 1;\\n for (i = 0; i < axisCount; ++i) {\\n\\n axisOptions = options.xaxes[i];\\n if (axisOptions && !axisOptions.tickColor) {\\n axisOptions.tickColor = axisOptions.color;\\n }\\n\\n axisOptions = $.extend(true, {}, options.xaxis, axisOptions);\\n options.xaxes[i] = axisOptions;\\n\\n if (axisOptions.font) {\\n axisOptions.font = $.extend({}, fontDefaults, axisOptions.font);\\n if (!axisOptions.font.color) {\\n axisOptions.font.color = axisOptions.color;\\n }\\n if (!axisOptions.font.lineHeight) {\\n axisOptions.font.lineHeight = Math.round(axisOptions.font.size * 1.15);\\n }\\n }\\n }\\n\\n axisCount = options.yaxes.length || 1;\\n for (i = 0; i < axisCount; ++i) {\\n\\n axisOptions = options.yaxes[i];\\n if (axisOptions && !axisOptions.tickColor) {\\n axisOptions.tickColor = axisOptions.color;\\n }\\n\\n axisOptions = $.extend(true, {}, options.yaxis, axisOptions);\\n options.yaxes[i] = axisOptions;\\n\\n if (axisOptions.font) {\\n axisOptions.font = $.extend({}, fontDefaults, axisOptions.font);\\n if (!axisOptions.font.color) {\\n axisOptions.font.color = axisOptions.color;\\n }\\n if (!axisOptions.font.lineHeight) {\\n axisOptions.font.lineHeight = Math.round(axisOptions.font.size * 1.15);\\n }\\n }\\n }\\n\\n // backwards compatibility, to be removed in future\\n if (options.xaxis.noTicks && options.xaxis.ticks == null)\\n options.xaxis.ticks = options.xaxis.noTicks;\\n if (options.yaxis.noTicks && options.yaxis.ticks == null)\\n options.yaxis.ticks = options.yaxis.noTicks;\\n if (options.x2axis) {\\n options.xaxes[1] = $.extend(true, {}, options.xaxis, options.x2axis);\\n options.xaxes[1].position = \\\"top\\\";\\n // Override the inherit to allow the axis to auto-scale\\n if (options.x2axis.min == null) {\\n options.xaxes[1].min = null;\\n }\\n if (options.x2axis.max == null) {\\n options.xaxes[1].max = null;\\n }\\n }\\n if (options.y2axis) {\\n options.yaxes[1] = $.extend(true, {}, options.yaxis, options.y2axis);\\n options.yaxes[1].position = \\\"right\\\";\\n // Override the inherit to allow the axis to auto-scale\\n if (options.y2axis.min == null) {\\n options.yaxes[1].min = null;\\n }\\n if (options.y2axis.max == null) {\\n options.yaxes[1].max = null;\\n }\\n }\\n if (options.grid.coloredAreas)\\n options.grid.markings = options.grid.coloredAreas;\\n if (options.grid.coloredAreasColor)\\n options.grid.markingsColor = options.grid.coloredAreasColor;\\n if (options.lines)\\n $.extend(true, options.series.lines, options.lines);\\n if (options.points)\\n $.extend(true, options.series.points, options.points);\\n if (options.bars)\\n $.extend(true, options.series.bars, options.bars);\\n if (options.shadowSize != null)\\n options.series.shadowSize = options.shadowSize;\\n if (options.highlightColor != null)\\n options.series.highlightColor = options.highlightColor;\\n\\n // save options on axes for future reference\\n for (i = 0; i < options.xaxes.length; ++i)\\n getOrCreateAxis(xaxes, i + 1).options = options.xaxes[i];\\n for (i = 0; i < options.yaxes.length; ++i)\\n getOrCreateAxis(yaxes, i + 1).options = options.yaxes[i];\\n\\n // add hooks from options\\n for (var n in hooks)\\n if (options.hooks[n] && options.hooks[n].length)\\n hooks[n] = hooks[n].concat(options.hooks[n]);\\n\\n executeHooks(hooks.processOptions, [options]);\\n }\\n\\n function setData(d) {\\n series = parseData(d);\\n fillInSeriesOptions();\\n processData();\\n }\\n\\n function parseData(d) {\\n var res = [];\\n for (var i = 0; i < d.length; ++i) {\\n var s = $.extend(true, {}, options.series);\\n\\n if (d[i].data != null) {\\n s.data = d[i].data; // move the data instead of deep-copy\\n delete d[i].data;\\n\\n $.extend(true, s, d[i]);\\n\\n d[i].data = s.data;\\n }\\n else\\n s.data = d[i];\\n res.push(s);\\n }\\n\\n return res;\\n }\\n\\n function axisNumber(obj, coord) {\\n var a = obj[coord + \\\"axis\\\"];\\n if (typeof a == \\\"object\\\") // if we got a real axis, extract number\\n a = a.n;\\n if (typeof a != \\\"number\\\")\\n a = 1; // default to first axis\\n return a;\\n }\\n\\n function allAxes() {\\n // return flat array without annoying null entries\\n return $.grep(xaxes.concat(yaxes), function (a) { return a; });\\n }\\n\\n function canvasToAxisCoords(pos) {\\n // return an object with x/y corresponding to all used axes\\n var res = {}, i, axis;\\n for (i = 0; i < xaxes.length; ++i) {\\n axis = xaxes[i];\\n if (axis && axis.used)\\n res[\\\"x\\\" + axis.n] = axis.c2p(pos.left);\\n }\\n\\n for (i = 0; i < yaxes.length; ++i) {\\n axis = yaxes[i];\\n if (axis && axis.used)\\n res[\\\"y\\\" + axis.n] = axis.c2p(pos.top);\\n }\\n\\n if (res.x1 !== undefined)\\n res.x = res.x1;\\n if (res.y1 !== undefined)\\n res.y = res.y1;\\n\\n return res;\\n }\\n\\n function axisToCanvasCoords(pos) {\\n // get canvas coords from the first pair of x/y found in pos\\n var res = {}, i, axis, key;\\n\\n for (i = 0; i < xaxes.length; ++i) {\\n axis = xaxes[i];\\n if (axis && axis.used) {\\n key = \\\"x\\\" + axis.n;\\n if (pos[key] == null && axis.n == 1)\\n key = \\\"x\\\";\\n\\n if (pos[key] != null) {\\n res.left = axis.p2c(pos[key]);\\n break;\\n }\\n }\\n }\\n\\n for (i = 0; i < yaxes.length; ++i) {\\n axis = yaxes[i];\\n if (axis && axis.used) {\\n key = \\\"y\\\" + axis.n;\\n if (pos[key] == null && axis.n == 1)\\n key = \\\"y\\\";\\n\\n if (pos[key] != null) {\\n res.top = axis.p2c(pos[key]);\\n break;\\n }\\n }\\n }\\n\\n return res;\\n }\\n\\n function getOrCreateAxis(axes, number) {\\n if (!axes[number - 1])\\n axes[number - 1] = {\\n n: number, // save the number for future reference\\n direction: axes == xaxes ? \\\"x\\\" : \\\"y\\\",\\n options: $.extend(true, {}, axes == xaxes ? options.xaxis : options.yaxis)\\n };\\n\\n return axes[number - 1];\\n }\\n\\n function fillInSeriesOptions() {\\n\\n var neededColors = series.length, maxIndex = -1, i;\\n\\n // Subtract the number of series that already have fixed colors or\\n // color indexes from the number that we still need to generate.\\n\\n for (i = 0; i < series.length; ++i) {\\n var sc = series[i].color;\\n if (sc != null) {\\n neededColors--;\\n if (typeof sc == \\\"number\\\" && sc > maxIndex) {\\n maxIndex = sc;\\n }\\n }\\n }\\n\\n // If any of the series have fixed color indexes, then we need to\\n // generate at least as many colors as the highest index.\\n\\n if (neededColors <= maxIndex) {\\n neededColors = maxIndex + 1;\\n }\\n\\n // Generate all the colors, using first the option colors and then\\n // variations on those colors once they're exhausted.\\n\\n var c, colors = [], colorPool = options.colors,\\n colorPoolSize = colorPool.length, variation = 0;\\n\\n for (i = 0; i < neededColors; i++) {\\n\\n c = $.color.parse(colorPool[i % colorPoolSize] || \\\"#666\\\");\\n\\n // Each time we exhaust the colors in the pool we adjust\\n // a scaling factor used to produce more variations on\\n // those colors. The factor alternates negative/positive\\n // to produce lighter/darker colors.\\n\\n // Reset the variation after every few cycles, or else\\n // it will end up producing only white or black colors.\\n\\n if (i % colorPoolSize == 0 && i) {\\n if (variation >= 0) {\\n if (variation < 0.5) {\\n variation = -variation - 0.2;\\n } else variation = 0;\\n } else variation = -variation;\\n }\\n\\n colors[i] = c.scale('rgb', 1 + variation);\\n }\\n\\n // Finalize the series options, filling in their colors\\n\\n var colori = 0, s;\\n for (i = 0; i < series.length; ++i) {\\n s = series[i];\\n\\n // assign colors\\n if (s.color == null) {\\n s.color = colors[colori].toString();\\n ++colori;\\n }\\n else if (typeof s.color == \\\"number\\\")\\n s.color = colors[s.color].toString();\\n\\n // turn on lines automatically in case nothing is set\\n if (s.lines.show == null) {\\n var v, show = true;\\n for (v in s)\\n if (s[v] && s[v].show) {\\n show = false;\\n break;\\n }\\n if (show)\\n s.lines.show = true;\\n }\\n\\n // If nothing was provided for lines.zero, default it to match\\n // lines.fill, since areas by default should extend to zero.\\n\\n if (s.lines.zero == null) {\\n s.lines.zero = !!s.lines.fill;\\n }\\n\\n // setup axes\\n s.xaxis = getOrCreateAxis(xaxes, axisNumber(s, \\\"x\\\"));\\n s.yaxis = getOrCreateAxis(yaxes, axisNumber(s, \\\"y\\\"));\\n }\\n }\\n\\n function processData() {\\n var topSentry = Number.POSITIVE_INFINITY,\\n bottomSentry = Number.NEGATIVE_INFINITY,\\n fakeInfinity = Number.MAX_VALUE,\\n i, j, k, m, length,\\n s, points, ps, x, y, axis, val, f, p,\\n data, format;\\n\\n function updateAxis(axis, min, max) {\\n if (min < axis.datamin && min != -fakeInfinity)\\n axis.datamin = min;\\n if (max > axis.datamax && max != fakeInfinity)\\n axis.datamax = max;\\n }\\n\\n $.each(allAxes(), function (_, axis) {\\n // init axis\\n axis.datamin = topSentry;\\n axis.datamax = bottomSentry;\\n axis.used = false;\\n });\\n\\n for (i = 0; i < series.length; ++i) {\\n s = series[i];\\n s.datapoints = { points: [] };\\n\\n executeHooks(hooks.processRawData, [ s, s.data, s.datapoints ]);\\n }\\n\\n // first pass: clean and copy data\\n for (i = 0; i < series.length; ++i) {\\n s = series[i];\\n\\n data = s.data;\\n format = s.datapoints.format;\\n\\n if (!format) {\\n format = [];\\n // find out how to copy\\n format.push({ x: true, number: true, required: true });\\n format.push({ y: true, number: true, required: true });\\n\\n if (s.bars.show || (s.lines.show && s.lines.fill)) {\\n var autoscale = !!((s.bars.show && s.bars.zero) || (s.lines.show && s.lines.zero));\\n format.push({ y: true, number: true, required: false, defaultValue: 0, autoscale: autoscale });\\n if (s.bars.horizontal) {\\n delete format[format.length - 1].y;\\n format[format.length - 1].x = true;\\n }\\n }\\n\\n s.datapoints.format = format;\\n }\\n\\n if (s.datapoints.pointsize != null)\\n continue; // already filled in\\n\\n s.datapoints.pointsize = format.length;\\n\\n ps = s.datapoints.pointsize;\\n points = s.datapoints.points;\\n\\n var insertSteps = s.lines.show && s.lines.steps;\\n s.xaxis.used = s.yaxis.used = true;\\n\\n for (j = k = 0; j < data.length; ++j, k += ps) {\\n p = data[j];\\n\\n var nullify = p == null;\\n if (!nullify) {\\n for (m = 0; m < ps; ++m) {\\n val = p[m];\\n f = format[m];\\n\\n if (f) {\\n if (f.number && val != null) {\\n val = +val; // convert to number\\n if (isNaN(val))\\n val = null;\\n else if (val == Infinity)\\n val = fakeInfinity;\\n else if (val == -Infinity)\\n val = -fakeInfinity;\\n }\\n\\n if (val == null) {\\n if (f.required)\\n nullify = true;\\n\\n if (f.defaultValue != null)\\n val = f.defaultValue;\\n }\\n }\\n\\n points[k + m] = val;\\n }\\n }\\n\\n if (nullify) {\\n for (m = 0; m < ps; ++m) {\\n val = points[k + m];\\n if (val != null) {\\n f = format[m];\\n // extract min/max info\\n if (f.autoscale !== false) {\\n if (f.x) {\\n updateAxis(s.xaxis, val, val);\\n }\\n if (f.y) {\\n updateAxis(s.yaxis, val, val);\\n }\\n }\\n }\\n points[k + m] = null;\\n }\\n }\\n else {\\n // a little bit of line specific stuff that\\n // perhaps shouldn't be here, but lacking\\n // better means...\\n if (insertSteps && k > 0\\n && points[k - ps] != null\\n && points[k - ps] != points[k]\\n && points[k - ps + 1] != points[k + 1]) {\\n // copy the point to make room for a middle point\\n for (m = 0; m < ps; ++m)\\n points[k + ps + m] = points[k + m];\\n\\n // middle point has same y\\n points[k + 1] = points[k - ps + 1];\\n\\n // we've added a point, better reflect that\\n k += ps;\\n }\\n }\\n }\\n }\\n\\n // give the hooks a chance to run\\n for (i = 0; i < series.length; ++i) {\\n s = series[i];\\n\\n executeHooks(hooks.processDatapoints, [ s, s.datapoints]);\\n }\\n\\n // second pass: find datamax/datamin for auto-scaling\\n for (i = 0; i < series.length; ++i) {\\n s = series[i];\\n points = s.datapoints.points;\\n ps = s.datapoints.pointsize;\\n format = s.datapoints.format;\\n\\n var xmin = topSentry, ymin = topSentry,\\n xmax = bottomSentry, ymax = bottomSentry;\\n\\n for (j = 0; j < points.length; j += ps) {\\n if (points[j] == null)\\n continue;\\n\\n for (m = 0; m < ps; ++m) {\\n val = points[j + m];\\n f = format[m];\\n if (!f || f.autoscale === false || val == fakeInfinity || val == -fakeInfinity)\\n continue;\\n\\n if (f.x) {\\n if (val < xmin)\\n xmin = val;\\n if (val > xmax)\\n xmax = val;\\n }\\n if (f.y) {\\n if (val < ymin)\\n ymin = val;\\n if (val > ymax)\\n ymax = val;\\n }\\n }\\n }\\n\\n if (s.bars.show) {\\n // make sure we got room for the bar on the dancing floor\\n var delta;\\n\\n switch (s.bars.align) {\\n case \\\"left\\\":\\n delta = 0;\\n break;\\n case \\\"right\\\":\\n delta = -s.bars.barWidth;\\n break;\\n default:\\n delta = -s.bars.barWidth / 2;\\n }\\n\\n if (s.bars.horizontal) {\\n ymin += delta;\\n ymax += delta + s.bars.barWidth;\\n }\\n else {\\n xmin += delta;\\n xmax += delta + s.bars.barWidth;\\n }\\n }\\n\\n updateAxis(s.xaxis, xmin, xmax);\\n updateAxis(s.yaxis, ymin, ymax);\\n }\\n\\n $.each(allAxes(), function (_, axis) {\\n if (axis.datamin == topSentry)\\n axis.datamin = null;\\n if (axis.datamax == bottomSentry)\\n axis.datamax = null;\\n });\\n }\\n\\n function setupCanvases() {\\n\\n // Make sure the placeholder is clear of everything except canvases\\n // from a previous plot in this container that we'll try to re-use.\\n\\n placeholder.css(\\\"padding\\\", 0) // padding messes up the positioning\\n .children().filter(function(){\\n return !$(this).hasClass(\\\"flot-overlay\\\") && !$(this).hasClass('flot-base');\\n }).remove();\\n\\n if (placeholder.css(\\\"position\\\") == 'static')\\n placeholder.css(\\\"position\\\", \\\"relative\\\"); // for positioning labels and overlay\\n\\n surface = new Canvas(\\\"flot-base\\\", placeholder);\\n overlay = new Canvas(\\\"flot-overlay\\\", placeholder); // overlay canvas for interactive features\\n\\n ctx = surface.context;\\n octx = overlay.context;\\n\\n // define which element we're listening for events on\\n eventHolder = $(overlay.element).unbind();\\n\\n // If we're re-using a plot object, shut down the old one\\n\\n var existing = placeholder.data(\\\"plot\\\");\\n\\n if (existing) {\\n existing.shutdown();\\n overlay.clear();\\n }\\n\\n // save in case we get replotted\\n placeholder.data(\\\"plot\\\", plot);\\n }\\n\\n function bindEvents() {\\n // bind events\\n if (options.grid.hoverable) {\\n eventHolder.mousemove(onMouseMove);\\n\\n // Use bind, rather than .mouseleave, because we officially\\n // still support jQuery 1.2.6, which doesn't define a shortcut\\n // for mouseenter or mouseleave. This was a bug/oversight that\\n // was fixed somewhere around 1.3.x. We can return to using\\n // .mouseleave when we drop support for 1.2.6.\\n\\n eventHolder.bind(\\\"mouseleave\\\", onMouseLeave);\\n }\\n\\n if (options.grid.clickable)\\n eventHolder.click(onClick);\\n\\n executeHooks(hooks.bindEvents, [eventHolder]);\\n }\\n\\n function shutdown() {\\n if (redrawTimeout)\\n clearTimeout(redrawTimeout);\\n\\n eventHolder.unbind(\\\"mousemove\\\", onMouseMove);\\n eventHolder.unbind(\\\"mouseleave\\\", onMouseLeave);\\n eventHolder.unbind(\\\"click\\\", onClick);\\n\\n executeHooks(hooks.shutdown, [eventHolder]);\\n }\\n\\n function setTransformationHelpers(axis) {\\n // set helper functions on the axis, assumes plot area\\n // has been computed already\\n\\n function identity(x) { return x; }\\n\\n var s, m, t = axis.options.transform || identity,\\n it = axis.options.inverseTransform;\\n\\n // precompute how much the axis is scaling a point\\n // in canvas space\\n if (axis.direction == \\\"x\\\") {\\n s = axis.scale = plotWidth / Math.abs(t(axis.max) - t(axis.min));\\n m = Math.min(t(axis.max), t(axis.min));\\n }\\n else {\\n s = axis.scale = plotHeight / Math.abs(t(axis.max) - t(axis.min));\\n s = -s;\\n m = Math.max(t(axis.max), t(axis.min));\\n }\\n\\n // data point to canvas coordinate\\n if (t == identity) // slight optimization\\n axis.p2c = function (p) { return (p - m) * s; };\\n else\\n axis.p2c = function (p) { return (t(p) - m) * s; };\\n // canvas coordinate to data point\\n if (!it)\\n axis.c2p = function (c) { return m + c / s; };\\n else\\n axis.c2p = function (c) { return it(m + c / s); };\\n }\\n\\n function measureTickLabels(axis) {\\n\\n var opts = axis.options,\\n ticks = axis.ticks || [],\\n labelWidth = opts.labelWidth || 0,\\n labelHeight = opts.labelHeight || 0,\\n maxWidth = labelWidth || (axis.direction == \\\"x\\\" ? Math.floor(surface.width / (ticks.length || 1)) : null),\\n legacyStyles = axis.direction + \\\"Axis \\\" + axis.direction + axis.n + \\\"Axis\\\",\\n layer = \\\"flot-\\\" + axis.direction + \\\"-axis flot-\\\" + axis.direction + axis.n + \\\"-axis \\\" + legacyStyles,\\n font = opts.font || \\\"flot-tick-label tickLabel\\\";\\n\\n for (var i = 0; i < ticks.length; ++i) {\\n\\n var t = ticks[i];\\n\\n if (!t.label)\\n continue;\\n\\n var info = surface.getTextInfo(layer, t.label, font, null, maxWidth);\\n\\n labelWidth = Math.max(labelWidth, info.width);\\n labelHeight = Math.max(labelHeight, info.height);\\n }\\n\\n axis.labelWidth = opts.labelWidth || labelWidth;\\n axis.labelHeight = opts.labelHeight || labelHeight;\\n }\\n\\n function allocateAxisBoxFirstPhase(axis) {\\n // find the bounding box of the axis by looking at label\\n // widths/heights and ticks, make room by diminishing the\\n // plotOffset; this first phase only looks at one\\n // dimension per axis, the other dimension depends on the\\n // other axes so will have to wait\\n\\n var lw = axis.labelWidth,\\n lh = axis.labelHeight,\\n pos = axis.options.position,\\n isXAxis = axis.direction === \\\"x\\\",\\n tickLength = axis.options.tickLength,\\n axisMargin = options.grid.axisMargin,\\n padding = options.grid.labelMargin,\\n innermost = true,\\n outermost = true,\\n first = true,\\n found = false;\\n\\n // Determine the axis's position in its direction and on its side\\n\\n $.each(isXAxis ? xaxes : yaxes, function(i, a) {\\n if (a && (a.show || a.reserveSpace)) {\\n if (a === axis) {\\n found = true;\\n } else if (a.options.position === pos) {\\n if (found) {\\n outermost = false;\\n } else {\\n innermost = false;\\n }\\n }\\n if (!found) {\\n first = false;\\n }\\n }\\n });\\n\\n // The outermost axis on each side has no margin\\n\\n if (outermost) {\\n axisMargin = 0;\\n }\\n\\n // The ticks for the first axis in each direction stretch across\\n\\n if (tickLength == null) {\\n tickLength = first ? \\\"full\\\" : 5;\\n }\\n\\n if (!isNaN(+tickLength))\\n padding += +tickLength;\\n\\n if (isXAxis) {\\n lh += padding;\\n\\n if (pos == \\\"bottom\\\") {\\n plotOffset.bottom += lh + axisMargin;\\n axis.box = { top: surface.height - plotOffset.bottom, height: lh };\\n }\\n else {\\n axis.box = { top: plotOffset.top + axisMargin, height: lh };\\n plotOffset.top += lh + axisMargin;\\n }\\n }\\n else {\\n lw += padding;\\n\\n if (pos == \\\"left\\\") {\\n axis.box = { left: plotOffset.left + axisMargin, width: lw };\\n plotOffset.left += lw + axisMargin;\\n }\\n else {\\n plotOffset.right += lw + axisMargin;\\n axis.box = { left: surface.width - plotOffset.right, width: lw };\\n }\\n }\\n\\n // save for future reference\\n axis.position = pos;\\n axis.tickLength = tickLength;\\n axis.box.padding = padding;\\n axis.innermost = innermost;\\n }\\n\\n function allocateAxisBoxSecondPhase(axis) {\\n // now that all axis boxes have been placed in one\\n // dimension, we can set the remaining dimension coordinates\\n if (axis.direction == \\\"x\\\") {\\n axis.box.left = plotOffset.left - axis.labelWidth / 2;\\n axis.box.width = surface.width - plotOffset.left - plotOffset.right + axis.labelWidth;\\n }\\n else {\\n axis.box.top = plotOffset.top - axis.labelHeight / 2;\\n axis.box.height = surface.height - plotOffset.bottom - plotOffset.top + axis.labelHeight;\\n }\\n }\\n\\n function adjustLayoutForThingsStickingOut() {\\n // possibly adjust plot offset to ensure everything stays\\n // inside the canvas and isn't clipped off\\n\\n var minMargin = options.grid.minBorderMargin,\\n axis, i;\\n\\n // check stuff from the plot (FIXME: this should just read\\n // a value from the series, otherwise it's impossible to\\n // customize)\\n if (minMargin == null) {\\n minMargin = 0;\\n for (i = 0; i < series.length; ++i)\\n minMargin = Math.max(minMargin, 2 * (series[i].points.radius + series[i].points.lineWidth/2));\\n }\\n\\n var margins = {\\n left: minMargin,\\n right: minMargin,\\n top: minMargin,\\n bottom: minMargin\\n };\\n\\n // check axis labels, note we don't check the actual\\n // labels but instead use the overall width/height to not\\n // jump as much around with replots\\n $.each(allAxes(), function (_, axis) {\\n if (axis.reserveSpace && axis.ticks && axis.ticks.length) {\\n if (axis.direction === \\\"x\\\") {\\n margins.left = Math.max(margins.left, axis.labelWidth / 2);\\n margins.right = Math.max(margins.right, axis.labelWidth / 2);\\n } else {\\n margins.bottom = Math.max(margins.bottom, axis.labelHeight / 2);\\n margins.top = Math.max(margins.top, axis.labelHeight / 2);\\n }\\n }\\n });\\n\\n plotOffset.left = Math.ceil(Math.max(margins.left, plotOffset.left));\\n plotOffset.right = Math.ceil(Math.max(margins.right, plotOffset.right));\\n plotOffset.top = Math.ceil(Math.max(margins.top, plotOffset.top));\\n plotOffset.bottom = Math.ceil(Math.max(margins.bottom, plotOffset.bottom));\\n }\\n\\n function setupGrid() {\\n var i, axes = allAxes(), showGrid = options.grid.show;\\n\\n // Initialize the plot's offset from the edge of the canvas\\n\\n for (var a in plotOffset) {\\n var margin = options.grid.margin || 0;\\n plotOffset[a] = typeof margin == \\\"number\\\" ? margin : margin[a] || 0;\\n }\\n\\n executeHooks(hooks.processOffset, [plotOffset]);\\n\\n // If the grid is visible, add its border width to the offset\\n\\n for (var a in plotOffset) {\\n if(typeof(options.grid.borderWidth) == \\\"object\\\") {\\n plotOffset[a] += showGrid ? options.grid.borderWidth[a] : 0;\\n }\\n else {\\n plotOffset[a] += showGrid ? options.grid.borderWidth : 0;\\n }\\n }\\n\\n $.each(axes, function (_, axis) {\\n var axisOpts = axis.options;\\n axis.show = axisOpts.show == null ? axis.used : axisOpts.show;\\n axis.reserveSpace = axisOpts.reserveSpace == null ? axis.show : axisOpts.reserveSpace;\\n setRange(axis);\\n });\\n\\n if (showGrid) {\\n\\n var allocatedAxes = $.grep(axes, function (axis) {\\n return axis.show || axis.reserveSpace;\\n });\\n\\n $.each(allocatedAxes, function (_, axis) {\\n // make the ticks\\n setupTickGeneration(axis);\\n setTicks(axis);\\n snapRangeToTicks(axis, axis.ticks);\\n // find labelWidth/Height for axis\\n measureTickLabels(axis);\\n });\\n\\n // with all dimensions calculated, we can compute the\\n // axis bounding boxes, start from the outside\\n // (reverse order)\\n for (i = allocatedAxes.length - 1; i >= 0; --i)\\n allocateAxisBoxFirstPhase(allocatedAxes[i]);\\n\\n // make sure we've got enough space for things that\\n // might stick out\\n adjustLayoutForThingsStickingOut();\\n\\n $.each(allocatedAxes, function (_, axis) {\\n allocateAxisBoxSecondPhase(axis);\\n });\\n }\\n\\n plotWidth = surface.width - plotOffset.left - plotOffset.right;\\n plotHeight = surface.height - plotOffset.bottom - plotOffset.top;\\n\\n // now we got the proper plot dimensions, we can compute the scaling\\n $.each(axes, function (_, axis) {\\n setTransformationHelpers(axis);\\n });\\n\\n if (showGrid) {\\n drawAxisLabels();\\n }\\n\\n insertLegend();\\n }\\n\\n function setRange(axis) {\\n var opts = axis.options,\\n min = +(opts.min != null ? opts.min : axis.datamin),\\n max = +(opts.max != null ? opts.max : axis.datamax),\\n delta = max - min;\\n\\n if (delta == 0.0) {\\n // degenerate case\\n var widen = max == 0 ? 1 : 0.01;\\n\\n if (opts.min == null)\\n min -= widen;\\n // always widen max if we couldn't widen min to ensure we\\n // don't fall into min == max which doesn't work\\n if (opts.max == null || opts.min != null)\\n max += widen;\\n }\\n else {\\n // consider autoscaling\\n var margin = opts.autoscaleMargin;\\n if (margin != null) {\\n if (opts.min == null) {\\n min -= delta * margin;\\n // make sure we don't go below zero if all values\\n // are positive\\n if (min < 0 && axis.datamin != null && axis.datamin >= 0)\\n min = 0;\\n }\\n if (opts.max == null) {\\n max += delta * margin;\\n if (max > 0 && axis.datamax != null && axis.datamax <= 0)\\n max = 0;\\n }\\n }\\n }\\n axis.min = min;\\n axis.max = max;\\n }\\n\\n function setupTickGeneration(axis) {\\n var opts = axis.options;\\n\\n // estimate number of ticks\\n var noTicks;\\n if (typeof opts.ticks == \\\"number\\\" && opts.ticks > 0)\\n noTicks = opts.ticks;\\n else\\n // heuristic based on the model a*sqrt(x) fitted to\\n // some data points that seemed reasonable\\n noTicks = 0.3 * Math.sqrt(axis.direction == \\\"x\\\" ? surface.width : surface.height);\\n\\n var delta = (axis.max - axis.min) / noTicks,\\n dec = -Math.floor(Math.log(delta) / Math.LN10),\\n maxDec = opts.tickDecimals;\\n\\n if (maxDec != null && dec > maxDec) {\\n dec = maxDec;\\n }\\n\\n var magn = Math.pow(10, -dec),\\n norm = delta / magn, // norm is between 1.0 and 10.0\\n size;\\n\\n if (norm < 1.5) {\\n size = 1;\\n } else if (norm < 3) {\\n size = 2;\\n // special case for 2.5, requires an extra decimal\\n if (norm > 2.25 && (maxDec == null || dec + 1 <= maxDec)) {\\n size = 2.5;\\n ++dec;\\n }\\n } else if (norm < 7.5) {\\n size = 5;\\n } else {\\n size = 10;\\n }\\n\\n size *= magn;\\n\\n if (opts.minTickSize != null && size < opts.minTickSize) {\\n size = opts.minTickSize;\\n }\\n\\n axis.delta = delta;\\n axis.tickDecimals = Math.max(0, maxDec != null ? maxDec : dec);\\n axis.tickSize = opts.tickSize || size;\\n\\n // Time mode was moved to a plug-in in 0.8, and since so many people use it\\n // we'll add an especially friendly reminder to make sure they included it.\\n\\n if (opts.mode == \\\"time\\\" && !axis.tickGenerator) {\\n throw new Error(\\\"Time mode requires the flot.time plugin.\\\");\\n }\\n\\n // Flot supports base-10 axes; any other mode else is handled by a plug-in,\\n // like flot.time.js.\\n\\n if (!axis.tickGenerator) {\\n\\n axis.tickGenerator = function (axis) {\\n\\n var ticks = [],\\n start = floorInBase(axis.min, axis.tickSize),\\n i = 0,\\n v = Number.NaN,\\n prev;\\n\\n do {\\n prev = v;\\n v = start + i * axis.tickSize;\\n ticks.push(v);\\n ++i;\\n } while (v < axis.max && v != prev);\\n return ticks;\\n };\\n\\n\\t\\t\\t\\taxis.tickFormatter = function (value, axis) {\\n\\n\\t\\t\\t\\t\\tvar factor = axis.tickDecimals ? Math.pow(10, axis.tickDecimals) : 1;\\n\\t\\t\\t\\t\\tvar formatted = \\\"\\\" + Math.round(value * factor) / factor;\\n\\n\\t\\t\\t\\t\\t// If tickDecimals was specified, ensure that we have exactly that\\n\\t\\t\\t\\t\\t// much precision; otherwise default to the value's own precision.\\n\\n\\t\\t\\t\\t\\tif (axis.tickDecimals != null) {\\n\\t\\t\\t\\t\\t\\tvar decimal = formatted.indexOf(\\\".\\\");\\n\\t\\t\\t\\t\\t\\tvar precision = decimal == -1 ? 0 : formatted.length - decimal - 1;\\n\\t\\t\\t\\t\\t\\tif (precision < axis.tickDecimals) {\\n\\t\\t\\t\\t\\t\\t\\treturn (precision ? formatted : formatted + \\\".\\\") + (\\\"\\\" + factor).substr(1, axis.tickDecimals - precision);\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}\\n\\n return formatted;\\n };\\n }\\n\\n if ($.isFunction(opts.tickFormatter))\\n axis.tickFormatter = function (v, axis) { return \\\"\\\" + opts.tickFormatter(v, axis); };\\n\\n if (opts.alignTicksWithAxis != null) {\\n var otherAxis = (axis.direction == \\\"x\\\" ? xaxes : yaxes)[opts.alignTicksWithAxis - 1];\\n if (otherAxis && otherAxis.used && otherAxis != axis) {\\n // consider snapping min/max to outermost nice ticks\\n var niceTicks = axis.tickGenerator(axis);\\n if (niceTicks.length > 0) {\\n if (opts.min == null)\\n axis.min = Math.min(axis.min, niceTicks[0]);\\n if (opts.max == null && niceTicks.length > 1)\\n axis.max = Math.max(axis.max, niceTicks[niceTicks.length - 1]);\\n }\\n\\n axis.tickGenerator = function (axis) {\\n // copy ticks, scaled to this axis\\n var ticks = [], v, i;\\n for (i = 0; i < otherAxis.ticks.length; ++i) {\\n v = (otherAxis.ticks[i].v - otherAxis.min) / (otherAxis.max - otherAxis.min);\\n v = axis.min + v * (axis.max - axis.min);\\n ticks.push(v);\\n }\\n return ticks;\\n };\\n\\n // we might need an extra decimal since forced\\n // ticks don't necessarily fit naturally\\n if (!axis.mode && opts.tickDecimals == null) {\\n var extraDec = Math.max(0, -Math.floor(Math.log(axis.delta) / Math.LN10) + 1),\\n ts = axis.tickGenerator(axis);\\n\\n // only proceed if the tick interval rounded\\n // with an extra decimal doesn't give us a\\n // zero at end\\n if (!(ts.length > 1 && /\\\\..*0$/.test((ts[1] - ts[0]).toFixed(extraDec))))\\n axis.tickDecimals = extraDec;\\n }\\n }\\n }\\n }\\n\\n function setTicks(axis) {\\n var oticks = axis.options.ticks, ticks = [];\\n if (oticks == null || (typeof oticks == \\\"number\\\" && oticks > 0))\\n ticks = axis.tickGenerator(axis);\\n else if (oticks) {\\n if ($.isFunction(oticks))\\n // generate the ticks\\n ticks = oticks(axis);\\n else\\n ticks = oticks;\\n }\\n\\n // clean up/labelify the supplied ticks, copy them over\\n var i, v;\\n axis.ticks = [];\\n for (i = 0; i < ticks.length; ++i) {\\n var label = null;\\n var t = ticks[i];\\n if (typeof t == \\\"object\\\") {\\n v = +t[0];\\n if (t.length > 1)\\n label = t[1];\\n }\\n else\\n v = +t;\\n if (label == null)\\n label = axis.tickFormatter(v, axis);\\n if (!isNaN(v))\\n axis.ticks.push({ v: v, label: label });\\n }\\n }\\n\\n function snapRangeToTicks(axis, ticks) {\\n if (axis.options.autoscaleMargin && ticks.length > 0) {\\n // snap to ticks\\n if (axis.options.min == null)\\n axis.min = Math.min(axis.min, ticks[0].v);\\n if (axis.options.max == null && ticks.length > 1)\\n axis.max = Math.max(axis.max, ticks[ticks.length - 1].v);\\n }\\n }\\n\\n function draw() {\\n\\n surface.clear();\\n\\n executeHooks(hooks.drawBackground, [ctx]);\\n\\n var grid = options.grid;\\n\\n // draw background, if any\\n if (grid.show && grid.backgroundColor)\\n drawBackground();\\n\\n if (grid.show && !grid.aboveData) {\\n drawGrid();\\n }\\n\\n for (var i = 0; i < series.length; ++i) {\\n executeHooks(hooks.drawSeries, [ctx, series[i]]);\\n drawSeries(series[i]);\\n }\\n\\n executeHooks(hooks.draw, [ctx]);\\n\\n if (grid.show && grid.aboveData) {\\n drawGrid();\\n }\\n\\n surface.render();\\n\\n // A draw implies that either the axes or data have changed, so we\\n // should probably update the overlay highlights as well.\\n\\n triggerRedrawOverlay();\\n }\\n\\n function extractRange(ranges, coord) {\\n var axis, from, to, key, axes = allAxes();\\n\\n for (var i = 0; i < axes.length; ++i) {\\n axis = axes[i];\\n if (axis.direction == coord) {\\n key = coord + axis.n + \\\"axis\\\";\\n if (!ranges[key] && axis.n == 1)\\n key = coord + \\\"axis\\\"; // support x1axis as xaxis\\n if (ranges[key]) {\\n from = ranges[key].from;\\n to = ranges[key].to;\\n break;\\n }\\n }\\n }\\n\\n // backwards-compat stuff - to be removed in future\\n if (!ranges[key]) {\\n axis = coord == \\\"x\\\" ? xaxes[0] : yaxes[0];\\n from = ranges[coord + \\\"1\\\"];\\n to = ranges[coord + \\\"2\\\"];\\n }\\n\\n // auto-reverse as an added bonus\\n if (from != null && to != null && from > to) {\\n var tmp = from;\\n from = to;\\n to = tmp;\\n }\\n\\n return { from: from, to: to, axis: axis };\\n }\\n\\n function drawBackground() {\\n ctx.save();\\n ctx.translate(plotOffset.left, plotOffset.top);\\n\\n ctx.fillStyle = getColorOrGradient(options.grid.backgroundColor, plotHeight, 0, \\\"rgba(255, 255, 255, 0)\\\");\\n ctx.fillRect(0, 0, plotWidth, plotHeight);\\n ctx.restore();\\n }\\n\\n function drawGrid() {\\n var i, axes, bw, bc;\\n\\n ctx.save();\\n ctx.translate(plotOffset.left, plotOffset.top);\\n\\n // draw markings\\n var markings = options.grid.markings;\\n if (markings) {\\n if ($.isFunction(markings)) {\\n axes = plot.getAxes();\\n // xmin etc. is backwards compatibility, to be\\n // removed in the future\\n axes.xmin = axes.xaxis.min;\\n axes.xmax = axes.xaxis.max;\\n axes.ymin = axes.yaxis.min;\\n axes.ymax = axes.yaxis.max;\\n\\n markings = markings(axes);\\n }\\n\\n for (i = 0; i < markings.length; ++i) {\\n var m = markings[i],\\n xrange = extractRange(m, \\\"x\\\"),\\n yrange = extractRange(m, \\\"y\\\");\\n\\n // fill in missing\\n if (xrange.from == null)\\n xrange.from = xrange.axis.min;\\n if (xrange.to == null)\\n xrange.to = xrange.axis.max;\\n if (yrange.from == null)\\n yrange.from = yrange.axis.min;\\n if (yrange.to == null)\\n yrange.to = yrange.axis.max;\\n\\n // clip\\n if (xrange.to < xrange.axis.min || xrange.from > xrange.axis.max ||\\n yrange.to < yrange.axis.min || yrange.from > yrange.axis.max)\\n continue;\\n\\n xrange.from = Math.max(xrange.from, xrange.axis.min);\\n xrange.to = Math.min(xrange.to, xrange.axis.max);\\n yrange.from = Math.max(yrange.from, yrange.axis.min);\\n yrange.to = Math.min(yrange.to, yrange.axis.max);\\n\\n var xequal = xrange.from === xrange.to,\\n yequal = yrange.from === yrange.to;\\n\\n if (xequal && yequal) {\\n continue;\\n }\\n\\n // then draw\\n xrange.from = Math.floor(xrange.axis.p2c(xrange.from));\\n xrange.to = Math.floor(xrange.axis.p2c(xrange.to));\\n yrange.from = Math.floor(yrange.axis.p2c(yrange.from));\\n yrange.to = Math.floor(yrange.axis.p2c(yrange.to));\\n\\n if (xequal || yequal) {\\n var lineWidth = m.lineWidth || options.grid.markingsLineWidth,\\n subPixel = lineWidth % 2 ? 0.5 : 0;\\n ctx.beginPath();\\n ctx.strokeStyle = m.color || options.grid.markingsColor;\\n ctx.lineWidth = lineWidth;\\n if (xequal) {\\n ctx.moveTo(xrange.to + subPixel, yrange.from);\\n ctx.lineTo(xrange.to + subPixel, yrange.to);\\n } else {\\n ctx.moveTo(xrange.from, yrange.to + subPixel);\\n ctx.lineTo(xrange.to, yrange.to + subPixel); \\n }\\n ctx.stroke();\\n } else {\\n ctx.fillStyle = m.color || options.grid.markingsColor;\\n ctx.fillRect(xrange.from, yrange.to,\\n xrange.to - xrange.from,\\n yrange.from - yrange.to);\\n }\\n }\\n }\\n\\n // draw the ticks\\n axes = allAxes();\\n bw = options.grid.borderWidth;\\n\\n for (var j = 0; j < axes.length; ++j) {\\n var axis = axes[j], box = axis.box,\\n t = axis.tickLength, x, y, xoff, yoff;\\n if (!axis.show || axis.ticks.length == 0)\\n continue;\\n\\n ctx.lineWidth = 1;\\n\\n // find the edges\\n if (axis.direction == \\\"x\\\") {\\n x = 0;\\n if (t == \\\"full\\\")\\n y = (axis.position == \\\"top\\\" ? 0 : plotHeight);\\n else\\n y = box.top - plotOffset.top + (axis.position == \\\"top\\\" ? box.height : 0);\\n }\\n else {\\n y = 0;\\n if (t == \\\"full\\\")\\n x = (axis.position == \\\"left\\\" ? 0 : plotWidth);\\n else\\n x = box.left - plotOffset.left + (axis.position == \\\"left\\\" ? box.width : 0);\\n }\\n\\n // draw tick bar\\n if (!axis.innermost) {\\n ctx.strokeStyle = axis.options.color;\\n ctx.beginPath();\\n xoff = yoff = 0;\\n if (axis.direction == \\\"x\\\")\\n xoff = plotWidth + 1;\\n else\\n yoff = plotHeight + 1;\\n\\n if (ctx.lineWidth == 1) {\\n if (axis.direction == \\\"x\\\") {\\n y = Math.floor(y) + 0.5;\\n } else {\\n x = Math.floor(x) + 0.5;\\n }\\n }\\n\\n ctx.moveTo(x, y);\\n ctx.lineTo(x + xoff, y + yoff);\\n ctx.stroke();\\n }\\n\\n // draw ticks\\n\\n ctx.strokeStyle = axis.options.tickColor;\\n\\n ctx.beginPath();\\n for (i = 0; i < axis.ticks.length; ++i) {\\n var v = axis.ticks[i].v;\\n\\n xoff = yoff = 0;\\n\\n if (isNaN(v) || v < axis.min || v > axis.max\\n // skip those lying on the axes if we got a border\\n || (t == \\\"full\\\"\\n && ((typeof bw == \\\"object\\\" && bw[axis.position] > 0) || bw > 0)\\n && (v == axis.min || v == axis.max)))\\n continue;\\n\\n if (axis.direction == \\\"x\\\") {\\n x = axis.p2c(v);\\n yoff = t == \\\"full\\\" ? -plotHeight : t;\\n\\n if (axis.position == \\\"top\\\")\\n yoff = -yoff;\\n }\\n else {\\n y = axis.p2c(v);\\n xoff = t == \\\"full\\\" ? -plotWidth : t;\\n\\n if (axis.position == \\\"left\\\")\\n xoff = -xoff;\\n }\\n\\n if (ctx.lineWidth == 1) {\\n if (axis.direction == \\\"x\\\")\\n x = Math.floor(x) + 0.5;\\n else\\n y = Math.floor(y) + 0.5;\\n }\\n\\n ctx.moveTo(x, y);\\n ctx.lineTo(x + xoff, y + yoff);\\n }\\n\\n ctx.stroke();\\n }\\n\\n\\n // draw border\\n if (bw) {\\n // If either borderWidth or borderColor is an object, then draw the border\\n // line by line instead of as one rectangle\\n bc = options.grid.borderColor;\\n if(typeof bw == \\\"object\\\" || typeof bc == \\\"object\\\") {\\n if (typeof bw !== \\\"object\\\") {\\n bw = {top: bw, right: bw, bottom: bw, left: bw};\\n }\\n if (typeof bc !== \\\"object\\\") {\\n bc = {top: bc, right: bc, bottom: bc, left: bc};\\n }\\n\\n if (bw.top > 0) {\\n ctx.strokeStyle = bc.top;\\n ctx.lineWidth = bw.top;\\n ctx.beginPath();\\n ctx.moveTo(0 - bw.left, 0 - bw.top/2);\\n ctx.lineTo(plotWidth, 0 - bw.top/2);\\n ctx.stroke();\\n }\\n\\n if (bw.right > 0) {\\n ctx.strokeStyle = bc.right;\\n ctx.lineWidth = bw.right;\\n ctx.beginPath();\\n ctx.moveTo(plotWidth + bw.right / 2, 0 - bw.top);\\n ctx.lineTo(plotWidth + bw.right / 2, plotHeight);\\n ctx.stroke();\\n }\\n\\n if (bw.bottom > 0) {\\n ctx.strokeStyle = bc.bottom;\\n ctx.lineWidth = bw.bottom;\\n ctx.beginPath();\\n ctx.moveTo(plotWidth + bw.right, plotHeight + bw.bottom / 2);\\n ctx.lineTo(0, plotHeight + bw.bottom / 2);\\n ctx.stroke();\\n }\\n\\n if (bw.left > 0) {\\n ctx.strokeStyle = bc.left;\\n ctx.lineWidth = bw.left;\\n ctx.beginPath();\\n ctx.moveTo(0 - bw.left/2, plotHeight + bw.bottom);\\n ctx.lineTo(0- bw.left/2, 0);\\n ctx.stroke();\\n }\\n }\\n else {\\n ctx.lineWidth = bw;\\n ctx.strokeStyle = options.grid.borderColor;\\n ctx.strokeRect(-bw/2, -bw/2, plotWidth + bw, plotHeight + bw);\\n }\\n }\\n\\n ctx.restore();\\n }\\n\\n function drawAxisLabels() {\\n\\n $.each(allAxes(), function (_, axis) {\\n var box = axis.box,\\n legacyStyles = axis.direction + \\\"Axis \\\" + axis.direction + axis.n + \\\"Axis\\\",\\n layer = \\\"flot-\\\" + axis.direction + \\\"-axis flot-\\\" + axis.direction + axis.n + \\\"-axis \\\" + legacyStyles,\\n font = axis.options.font || \\\"flot-tick-label tickLabel\\\",\\n tick, x, y, halign, valign;\\n\\n // Remove text before checking for axis.show and ticks.length;\\n // otherwise plugins, like flot-tickrotor, that draw their own\\n // tick labels will end up with both theirs and the defaults.\\n\\n surface.removeText(layer);\\n\\n if (!axis.show || axis.ticks.length == 0)\\n return;\\n\\n for (var i = 0; i < axis.ticks.length; ++i) {\\n\\n tick = axis.ticks[i];\\n if (!tick.label || tick.v < axis.min || tick.v > axis.max)\\n continue;\\n\\n if (axis.direction == \\\"x\\\") {\\n halign = \\\"center\\\";\\n x = plotOffset.left + axis.p2c(tick.v);\\n if (axis.position == \\\"bottom\\\") {\\n y = box.top + box.padding;\\n } else {\\n y = box.top + box.height - box.padding;\\n valign = \\\"bottom\\\";\\n }\\n } else {\\n valign = \\\"middle\\\";\\n y = plotOffset.top + axis.p2c(tick.v);\\n if (axis.position == \\\"left\\\") {\\n x = box.left + box.width - box.padding;\\n halign = \\\"right\\\";\\n } else {\\n x = box.left + box.padding;\\n }\\n }\\n\\n surface.addText(layer, x, y, tick.label, font, null, null, halign, valign);\\n }\\n });\\n }\\n\\n function drawSeries(series) {\\n if (series.lines.show)\\n drawSeriesLines(series);\\n if (series.bars.show)\\n drawSeriesBars(series);\\n if (series.points.show)\\n drawSeriesPoints(series);\\n }\\n\\n function drawSeriesLines(series) {\\n function plotLine(datapoints, xoffset, yoffset, axisx, axisy) {\\n var points = datapoints.points,\\n ps = datapoints.pointsize,\\n prevx = null, prevy = null;\\n\\n ctx.beginPath();\\n for (var i = ps; i < points.length; i += ps) {\\n var x1 = points[i - ps], y1 = points[i - ps + 1],\\n x2 = points[i], y2 = points[i + 1];\\n\\n if (x1 == null || x2 == null)\\n continue;\\n\\n // clip with ymin\\n if (y1 <= y2 && y1 < axisy.min) {\\n if (y2 < axisy.min)\\n continue; // line segment is outside\\n // compute new intersection point\\n x1 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1;\\n y1 = axisy.min;\\n }\\n else if (y2 <= y1 && y2 < axisy.min) {\\n if (y1 < axisy.min)\\n continue;\\n x2 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1;\\n y2 = axisy.min;\\n }\\n\\n // clip with ymax\\n if (y1 >= y2 && y1 > axisy.max) {\\n if (y2 > axisy.max)\\n continue;\\n x1 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1;\\n y1 = axisy.max;\\n }\\n else if (y2 >= y1 && y2 > axisy.max) {\\n if (y1 > axisy.max)\\n continue;\\n x2 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1;\\n y2 = axisy.max;\\n }\\n\\n // clip with xmin\\n if (x1 <= x2 && x1 < axisx.min) {\\n if (x2 < axisx.min)\\n continue;\\n y1 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1;\\n x1 = axisx.min;\\n }\\n else if (x2 <= x1 && x2 < axisx.min) {\\n if (x1 < axisx.min)\\n continue;\\n y2 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1;\\n x2 = axisx.min;\\n }\\n\\n // clip with xmax\\n if (x1 >= x2 && x1 > axisx.max) {\\n if (x2 > axisx.max)\\n continue;\\n y1 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1;\\n x1 = axisx.max;\\n }\\n else if (x2 >= x1 && x2 > axisx.max) {\\n if (x1 > axisx.max)\\n continue;\\n y2 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1;\\n x2 = axisx.max;\\n }\\n\\n if (x1 != prevx || y1 != prevy)\\n ctx.moveTo(axisx.p2c(x1) + xoffset, axisy.p2c(y1) + yoffset);\\n\\n prevx = x2;\\n prevy = y2;\\n ctx.lineTo(axisx.p2c(x2) + xoffset, axisy.p2c(y2) + yoffset);\\n }\\n ctx.stroke();\\n }\\n\\n function plotLineArea(datapoints, axisx, axisy) {\\n var points = datapoints.points,\\n ps = datapoints.pointsize,\\n bottom = Math.min(Math.max(0, axisy.min), axisy.max),\\n i = 0, top, areaOpen = false,\\n ypos = 1, segmentStart = 0, segmentEnd = 0;\\n\\n // we process each segment in two turns, first forward\\n // direction to sketch out top, then once we hit the\\n // end we go backwards to sketch the bottom\\n while (true) {\\n if (ps > 0 && i > points.length + ps)\\n break;\\n\\n i += ps; // ps is negative if going backwards\\n\\n var x1 = points[i - ps],\\n y1 = points[i - ps + ypos],\\n x2 = points[i], y2 = points[i + ypos];\\n\\n if (areaOpen) {\\n if (ps > 0 && x1 != null && x2 == null) {\\n // at turning point\\n segmentEnd = i;\\n ps = -ps;\\n ypos = 2;\\n continue;\\n }\\n\\n if (ps < 0 && i == segmentStart + ps) {\\n // done with the reverse sweep\\n ctx.fill();\\n areaOpen = false;\\n ps = -ps;\\n ypos = 1;\\n i = segmentStart = segmentEnd + ps;\\n continue;\\n }\\n }\\n\\n if (x1 == null || x2 == null)\\n continue;\\n\\n // clip x values\\n\\n // clip with xmin\\n if (x1 <= x2 && x1 < axisx.min) {\\n if (x2 < axisx.min)\\n continue;\\n y1 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1;\\n x1 = axisx.min;\\n }\\n else if (x2 <= x1 && x2 < axisx.min) {\\n if (x1 < axisx.min)\\n continue;\\n y2 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1;\\n x2 = axisx.min;\\n }\\n\\n // clip with xmax\\n if (x1 >= x2 && x1 > axisx.max) {\\n if (x2 > axisx.max)\\n continue;\\n y1 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1;\\n x1 = axisx.max;\\n }\\n else if (x2 >= x1 && x2 > axisx.max) {\\n if (x1 > axisx.max)\\n continue;\\n y2 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1;\\n x2 = axisx.max;\\n }\\n\\n if (!areaOpen) {\\n // open area\\n ctx.beginPath();\\n ctx.moveTo(axisx.p2c(x1), axisy.p2c(bottom));\\n areaOpen = true;\\n }\\n\\n // now first check the case where both is outside\\n if (y1 >= axisy.max && y2 >= axisy.max) {\\n ctx.lineTo(axisx.p2c(x1), axisy.p2c(axisy.max));\\n ctx.lineTo(axisx.p2c(x2), axisy.p2c(axisy.max));\\n continue;\\n }\\n else if (y1 <= axisy.min && y2 <= axisy.min) {\\n ctx.lineTo(axisx.p2c(x1), axisy.p2c(axisy.min));\\n ctx.lineTo(axisx.p2c(x2), axisy.p2c(axisy.min));\\n continue;\\n }\\n\\n // else it's a bit more complicated, there might\\n // be a flat maxed out rectangle first, then a\\n // triangular cutout or reverse; to find these\\n // keep track of the current x values\\n var x1old = x1, x2old = x2;\\n\\n // clip the y values, without shortcutting, we\\n // go through all cases in turn\\n\\n // clip with ymin\\n if (y1 <= y2 && y1 < axisy.min && y2 >= axisy.min) {\\n x1 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1;\\n y1 = axisy.min;\\n }\\n else if (y2 <= y1 && y2 < axisy.min && y1 >= axisy.min) {\\n x2 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1;\\n y2 = axisy.min;\\n }\\n\\n // clip with ymax\\n if (y1 >= y2 && y1 > axisy.max && y2 <= axisy.max) {\\n x1 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1;\\n y1 = axisy.max;\\n }\\n else if (y2 >= y1 && y2 > axisy.max && y1 <= axisy.max) {\\n x2 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1;\\n y2 = axisy.max;\\n }\\n\\n // if the x value was changed we got a rectangle\\n // to fill\\n if (x1 != x1old) {\\n ctx.lineTo(axisx.p2c(x1old), axisy.p2c(y1));\\n // it goes to (x1, y1), but we fill that below\\n }\\n\\n // fill triangular section, this sometimes result\\n // in redundant points if (x1, y1) hasn't changed\\n // from previous line to, but we just ignore that\\n ctx.lineTo(axisx.p2c(x1), axisy.p2c(y1));\\n ctx.lineTo(axisx.p2c(x2), axisy.p2c(y2));\\n\\n // fill the other rectangle if it's there\\n if (x2 != x2old) {\\n ctx.lineTo(axisx.p2c(x2), axisy.p2c(y2));\\n ctx.lineTo(axisx.p2c(x2old), axisy.p2c(y2));\\n }\\n }\\n }\\n\\n ctx.save();\\n ctx.translate(plotOffset.left, plotOffset.top);\\n ctx.lineJoin = \\\"round\\\";\\n\\n var lw = series.lines.lineWidth,\\n sw = series.shadowSize;\\n // FIXME: consider another form of shadow when filling is turned on\\n if (lw > 0 && sw > 0) {\\n // draw shadow as a thick and thin line with transparency\\n ctx.lineWidth = sw;\\n ctx.strokeStyle = \\\"rgba(0,0,0,0.1)\\\";\\n // position shadow at angle from the mid of line\\n var angle = Math.PI/18;\\n plotLine(series.datapoints, Math.sin(angle) * (lw/2 + sw/2), Math.cos(angle) * (lw/2 + sw/2), series.xaxis, series.yaxis);\\n ctx.lineWidth = sw/2;\\n plotLine(series.datapoints, Math.sin(angle) * (lw/2 + sw/4), Math.cos(angle) * (lw/2 + sw/4), series.xaxis, series.yaxis);\\n }\\n\\n ctx.lineWidth = lw;\\n ctx.strokeStyle = series.color;\\n var fillStyle = getFillStyle(series.lines, series.color, 0, plotHeight);\\n if (fillStyle) {\\n ctx.fillStyle = fillStyle;\\n plotLineArea(series.datapoints, series.xaxis, series.yaxis);\\n }\\n\\n if (lw > 0)\\n plotLine(series.datapoints, 0, 0, series.xaxis, series.yaxis);\\n ctx.restore();\\n }\\n\\n function drawSeriesPoints(series) {\\n function plotPoints(datapoints, radius, fillStyle, offset, shadow, axisx, axisy, symbol) {\\n var points = datapoints.points, ps = datapoints.pointsize;\\n\\n for (var i = 0; i < points.length; i += ps) {\\n var x = points[i], y = points[i + 1];\\n if (x == null || x < axisx.min || x > axisx.max || y < axisy.min || y > axisy.max)\\n continue;\\n\\n ctx.beginPath();\\n x = axisx.p2c(x);\\n y = axisy.p2c(y) + offset;\\n if (symbol == \\\"circle\\\")\\n ctx.arc(x, y, radius, 0, shadow ? Math.PI : Math.PI * 2, false);\\n else\\n symbol(ctx, x, y, radius, shadow);\\n ctx.closePath();\\n\\n if (fillStyle) {\\n ctx.fillStyle = fillStyle;\\n ctx.fill();\\n }\\n ctx.stroke();\\n }\\n }\\n\\n ctx.save();\\n ctx.translate(plotOffset.left, plotOffset.top);\\n\\n var lw = series.points.lineWidth,\\n sw = series.shadowSize,\\n radius = series.points.radius,\\n symbol = series.points.symbol;\\n\\n // If the user sets the line width to 0, we change it to a very \\n // small value. A line width of 0 seems to force the default of 1.\\n // Doing the conditional here allows the shadow setting to still be \\n // optional even with a lineWidth of 0.\\n\\n if( lw == 0 )\\n lw = 0.0001;\\n\\n if (lw > 0 && sw > 0) {\\n // draw shadow in two steps\\n var w = sw / 2;\\n ctx.lineWidth = w;\\n ctx.strokeStyle = \\\"rgba(0,0,0,0.1)\\\";\\n plotPoints(series.datapoints, radius, null, w + w/2, true,\\n series.xaxis, series.yaxis, symbol);\\n\\n ctx.strokeStyle = \\\"rgba(0,0,0,0.2)\\\";\\n plotPoints(series.datapoints, radius, null, w/2, true,\\n series.xaxis, series.yaxis, symbol);\\n }\\n\\n ctx.lineWidth = lw;\\n ctx.strokeStyle = series.color;\\n plotPoints(series.datapoints, radius,\\n getFillStyle(series.points, series.color), 0, false,\\n series.xaxis, series.yaxis, symbol);\\n ctx.restore();\\n }\\n\\n function drawBar(x, y, b, barLeft, barRight, fillStyleCallback, axisx, axisy, c, horizontal, lineWidth) {\\n var left, right, bottom, top,\\n drawLeft, drawRight, drawTop, drawBottom,\\n tmp;\\n\\n // in horizontal mode, we start the bar from the left\\n // instead of from the bottom so it appears to be\\n // horizontal rather than vertical\\n if (horizontal) {\\n drawBottom = drawRight = drawTop = true;\\n drawLeft = false;\\n left = b;\\n right = x;\\n top = y + barLeft;\\n bottom = y + barRight;\\n\\n // account for negative bars\\n if (right < left) {\\n tmp = right;\\n right = left;\\n left = tmp;\\n drawLeft = true;\\n drawRight = false;\\n }\\n }\\n else {\\n drawLeft = drawRight = drawTop = true;\\n drawBottom = false;\\n left = x + barLeft;\\n right = x + barRight;\\n bottom = b;\\n top = y;\\n\\n // account for negative bars\\n if (top < bottom) {\\n tmp = top;\\n top = bottom;\\n bottom = tmp;\\n drawBottom = true;\\n drawTop = false;\\n }\\n }\\n\\n // clip\\n if (right < axisx.min || left > axisx.max ||\\n top < axisy.min || bottom > axisy.max)\\n return;\\n\\n if (left < axisx.min) {\\n left = axisx.min;\\n drawLeft = false;\\n }\\n\\n if (right > axisx.max) {\\n right = axisx.max;\\n drawRight = false;\\n }\\n\\n if (bottom < axisy.min) {\\n bottom = axisy.min;\\n drawBottom = false;\\n }\\n\\n if (top > axisy.max) {\\n top = axisy.max;\\n drawTop = false;\\n }\\n\\n left = axisx.p2c(left);\\n bottom = axisy.p2c(bottom);\\n right = axisx.p2c(right);\\n top = axisy.p2c(top);\\n\\n // fill the bar\\n if (fillStyleCallback) {\\n c.fillStyle = fillStyleCallback(bottom, top);\\n c.fillRect(left, top, right - left, bottom - top)\\n }\\n\\n // draw outline\\n if (lineWidth > 0 && (drawLeft || drawRight || drawTop || drawBottom)) {\\n c.beginPath();\\n\\n // FIXME: inline moveTo is buggy with excanvas\\n c.moveTo(left, bottom);\\n if (drawLeft)\\n c.lineTo(left, top);\\n else\\n c.moveTo(left, top);\\n if (drawTop)\\n c.lineTo(right, top);\\n else\\n c.moveTo(right, top);\\n if (drawRight)\\n c.lineTo(right, bottom);\\n else\\n c.moveTo(right, bottom);\\n if (drawBottom)\\n c.lineTo(left, bottom);\\n else\\n c.moveTo(left, bottom);\\n c.stroke();\\n }\\n }\\n\\n function drawSeriesBars(series) {\\n function plotBars(datapoints, barLeft, barRight, fillStyleCallback, axisx, axisy) {\\n var points = datapoints.points, ps = datapoints.pointsize;\\n\\n for (var i = 0; i < points.length; i += ps) {\\n if (points[i] == null)\\n continue;\\n drawBar(points[i], points[i + 1], points[i + 2], barLeft, barRight, fillStyleCallback, axisx, axisy, ctx, series.bars.horizontal, series.bars.lineWidth);\\n }\\n }\\n\\n ctx.save();\\n ctx.translate(plotOffset.left, plotOffset.top);\\n\\n // FIXME: figure out a way to add shadows (for instance along the right edge)\\n ctx.lineWidth = series.bars.lineWidth;\\n ctx.strokeStyle = series.color;\\n\\n var barLeft;\\n\\n switch (series.bars.align) {\\n case \\\"left\\\":\\n barLeft = 0;\\n break;\\n case \\\"right\\\":\\n barLeft = -series.bars.barWidth;\\n break;\\n default:\\n barLeft = -series.bars.barWidth / 2;\\n }\\n\\n var fillStyleCallback = series.bars.fill ? function (bottom, top) { return getFillStyle(series.bars, series.color, bottom, top); } : null;\\n plotBars(series.datapoints, barLeft, barLeft + series.bars.barWidth, fillStyleCallback, series.xaxis, series.yaxis);\\n ctx.restore();\\n }\\n\\n function getFillStyle(filloptions, seriesColor, bottom, top) {\\n var fill = filloptions.fill;\\n if (!fill)\\n return null;\\n\\n if (filloptions.fillColor)\\n return getColorOrGradient(filloptions.fillColor, bottom, top, seriesColor);\\n\\n var c = $.color.parse(seriesColor);\\n c.a = typeof fill == \\\"number\\\" ? fill : 0.4;\\n c.normalize();\\n return c.toString();\\n }\\n\\n function insertLegend() {\\n\\n if (options.legend.container != null) {\\n $(options.legend.container).html(\\\"\\\");\\n } else {\\n placeholder.find(\\\".legend\\\").remove();\\n }\\n\\n if (!options.legend.show) {\\n return;\\n }\\n\\n var fragments = [], entries = [], rowStarted = false,\\n lf = options.legend.labelFormatter, s, label;\\n\\n // Build a list of legend entries, with each having a label and a color\\n\\n for (var i = 0; i < series.length; ++i) {\\n s = series[i];\\n if (s.label) {\\n label = lf ? lf(s.label, s) : s.label;\\n if (label) {\\n entries.push({\\n label: label,\\n color: s.color\\n });\\n }\\n }\\n }\\n\\n // Sort the legend using either the default or a custom comparator\\n\\n if (options.legend.sorted) {\\n if ($.isFunction(options.legend.sorted)) {\\n entries.sort(options.legend.sorted);\\n } else if (options.legend.sorted == \\\"reverse\\\") {\\n \\tentries.reverse();\\n } else {\\n var ascending = options.legend.sorted != \\\"descending\\\";\\n entries.sort(function(a, b) {\\n return a.label == b.label ? 0 : (\\n (a.label < b.label) != ascending ? 1 : -1 // Logical XOR\\n );\\n });\\n }\\n }\\n\\n // Generate markup for the list of entries, in their final order\\n\\n for (var i = 0; i < entries.length; ++i) {\\n\\n var entry = entries[i];\\n\\n if (i % options.legend.noColumns == 0) {\\n if (rowStarted)\\n fragments.push('</tr>');\\n fragments.push('<tr>');\\n rowStarted = true;\\n }\\n\\n fragments.push(\\n '<td class=\\\"legendColorBox\\\"><div style=\\\"border:1px solid ' + options.legend.labelBoxBorderColor + ';padding:1px\\\"><div style=\\\"width:4px;height:0;border:5px solid ' + entry.color + ';overflow:hidden\\\"></div></div></td>' +\\n '<td class=\\\"legendLabel\\\">' + entry.label + '</td>'\\n );\\n }\\n\\n if (rowStarted)\\n fragments.push('</tr>');\\n\\n if (fragments.length == 0)\\n return;\\n\\n var table = '<table style=\\\"font-size:smaller;color:' + options.grid.color + '\\\">' + fragments.join(\\\"\\\") + '</table>';\\n if (options.legend.container != null)\\n $(options.legend.container).html(table);\\n else {\\n var pos = \\\"\\\",\\n p = options.legend.position,\\n m = options.legend.margin;\\n if (m[0] == null)\\n m = [m, m];\\n if (p.charAt(0) == \\\"n\\\")\\n pos += 'top:' + (m[1] + plotOffset.top) + 'px;';\\n else if (p.charAt(0) == \\\"s\\\")\\n pos += 'bottom:' + (m[1] + plotOffset.bottom) + 'px;';\\n if (p.charAt(1) == \\\"e\\\")\\n pos += 'right:' + (m[0] + plotOffset.right) + 'px;';\\n else if (p.charAt(1) == \\\"w\\\")\\n pos += 'left:' + (m[0] + plotOffset.left) + 'px;';\\n var legend = $('<div class=\\\"legend\\\">' + table.replace('style=\\\"', 'style=\\\"position:absolute;' + pos +';') + '</div>').appendTo(placeholder);\\n if (options.legend.backgroundOpacity != 0.0) {\\n // put in the transparent background\\n // separately to avoid blended labels and\\n // label boxes\\n var c = options.legend.backgroundColor;\\n if (c == null) {\\n c = options.grid.backgroundColor;\\n if (c && typeof c == \\\"string\\\")\\n c = $.color.parse(c);\\n else\\n c = $.color.extract(legend, 'background-color');\\n c.a = 1;\\n c = c.toString();\\n }\\n var div = legend.children();\\n $('<div style=\\\"position:absolute;width:' + div.width() + 'px;height:' + div.height() + 'px;' + pos +'background-color:' + c + ';\\\"> </div>').prependTo(legend).css('opacity', options.legend.backgroundOpacity);\\n }\\n }\\n }\\n\\n\\n // interactive features\\n\\n var highlights = [],\\n redrawTimeout = null;\\n\\n // returns the data item the mouse is over, or null if none is found\\n function findNearbyItem(mouseX, mouseY, seriesFilter) {\\n var maxDistance = options.grid.mouseActiveRadius,\\n smallestDistance = maxDistance * maxDistance + 1,\\n item = null, foundPoint = false, i, j, ps;\\n\\n for (i = series.length - 1; i >= 0; --i) {\\n if (!seriesFilter(series[i]))\\n continue;\\n\\n var s = series[i],\\n axisx = s.xaxis,\\n axisy = s.yaxis,\\n points = s.datapoints.points,\\n mx = axisx.c2p(mouseX), // precompute some stuff to make the loop faster\\n my = axisy.c2p(mouseY),\\n maxx = maxDistance / axisx.scale,\\n maxy = maxDistance / axisy.scale;\\n\\n ps = s.datapoints.pointsize;\\n // with inverse transforms, we can't use the maxx/maxy\\n // optimization, sadly\\n if (axisx.options.inverseTransform)\\n maxx = Number.MAX_VALUE;\\n if (axisy.options.inverseTransform)\\n maxy = Number.MAX_VALUE;\\n\\n if (s.lines.show || s.points.show) {\\n for (j = 0; j < points.length; j += ps) {\\n var x = points[j], y = points[j + 1];\\n if (x == null)\\n continue;\\n\\n // For points and lines, the cursor must be within a\\n // certain distance to the data point\\n if (x - mx > maxx || x - mx < -maxx ||\\n y - my > maxy || y - my < -maxy)\\n continue;\\n\\n // We have to calculate distances in pixels, not in\\n // data units, because the scales of the axes may be different\\n var dx = Math.abs(axisx.p2c(x) - mouseX),\\n dy = Math.abs(axisy.p2c(y) - mouseY),\\n dist = dx * dx + dy * dy; // we save the sqrt\\n\\n // use <= to ensure last point takes precedence\\n // (last generally means on top of)\\n if (dist < smallestDistance) {\\n smallestDistance = dist;\\n item = [i, j / ps];\\n }\\n }\\n }\\n\\n if (s.bars.show && !item) { // no other point can be nearby\\n\\n var barLeft, barRight;\\n\\n switch (s.bars.align) {\\n case \\\"left\\\":\\n barLeft = 0;\\n break;\\n case \\\"right\\\":\\n barLeft = -s.bars.barWidth;\\n break;\\n default:\\n barLeft = -s.bars.barWidth / 2;\\n }\\n\\n barRight = barLeft + s.bars.barWidth;\\n\\n for (j = 0; j < points.length; j += ps) {\\n var x = points[j], y = points[j + 1], b = points[j + 2];\\n if (x == null)\\n continue;\\n\\n // for a bar graph, the cursor must be inside the bar\\n if (series[i].bars.horizontal ?\\n (mx <= Math.max(b, x) && mx >= Math.min(b, x) &&\\n my >= y + barLeft && my <= y + barRight) :\\n (mx >= x + barLeft && mx <= x + barRight &&\\n my >= Math.min(b, y) && my <= Math.max(b, y)))\\n item = [i, j / ps];\\n }\\n }\\n }\\n\\n if (item) {\\n i = item[0];\\n j = item[1];\\n ps = series[i].datapoints.pointsize;\\n\\n return { datapoint: series[i].datapoints.points.slice(j * ps, (j + 1) * ps),\\n dataIndex: j,\\n series: series[i],\\n seriesIndex: i };\\n }\\n\\n return null;\\n }\\n\\n function onMouseMove(e) {\\n if (options.grid.hoverable)\\n triggerClickHoverEvent(\\\"plothover\\\", e,\\n function (s) { return s[\\\"hoverable\\\"] != false; });\\n }\\n\\n function onMouseLeave(e) {\\n if (options.grid.hoverable)\\n triggerClickHoverEvent(\\\"plothover\\\", e,\\n function (s) { return false; });\\n }\\n\\n function onClick(e) {\\n triggerClickHoverEvent(\\\"plotclick\\\", e,\\n function (s) { return s[\\\"clickable\\\"] != false; });\\n }\\n\\n // trigger click or hover event (they send the same parameters\\n // so we share their code)\\n function triggerClickHoverEvent(eventname, event, seriesFilter) {\\n var offset = eventHolder.offset(),\\n canvasX = event.pageX - offset.left - plotOffset.left,\\n canvasY = event.pageY - offset.top - plotOffset.top,\\n pos = canvasToAxisCoords({ left: canvasX, top: canvasY });\\n\\n pos.pageX = event.pageX;\\n pos.pageY = event.pageY;\\n\\n var item = findNearbyItem(canvasX, canvasY, seriesFilter);\\n\\n if (item) {\\n // fill in mouse pos for any listeners out there\\n item.pageX = parseInt(item.series.xaxis.p2c(item.datapoint[0]) + offset.left + plotOffset.left, 10);\\n item.pageY = parseInt(item.series.yaxis.p2c(item.datapoint[1]) + offset.top + plotOffset.top, 10);\\n }\\n\\n if (options.grid.autoHighlight) {\\n // clear auto-highlights\\n for (var i = 0; i < highlights.length; ++i) {\\n var h = highlights[i];\\n if (h.auto == eventname &&\\n !(item && h.series == item.series &&\\n h.point[0] == item.datapoint[0] &&\\n h.point[1] == item.datapoint[1]))\\n unhighlight(h.series, h.point);\\n }\\n\\n if (item)\\n highlight(item.series, item.datapoint, eventname);\\n }\\n\\n placeholder.trigger(eventname, [ pos, item ]);\\n }\\n\\n function triggerRedrawOverlay() {\\n var t = options.interaction.redrawOverlayInterval;\\n if (t == -1) { // skip event queue\\n drawOverlay();\\n return;\\n }\\n\\n if (!redrawTimeout)\\n redrawTimeout = setTimeout(drawOverlay, t);\\n }\\n\\n function drawOverlay() {\\n redrawTimeout = null;\\n\\n // draw highlights\\n octx.save();\\n overlay.clear();\\n octx.translate(plotOffset.left, plotOffset.top);\\n\\n var i, hi;\\n for (i = 0; i < highlights.length; ++i) {\\n hi = highlights[i];\\n\\n if (hi.series.bars.show)\\n drawBarHighlight(hi.series, hi.point);\\n else\\n drawPointHighlight(hi.series, hi.point);\\n }\\n octx.restore();\\n\\n executeHooks(hooks.drawOverlay, [octx]);\\n }\\n\\n function highlight(s, point, auto) {\\n if (typeof s == \\\"number\\\")\\n s = series[s];\\n\\n if (typeof point == \\\"number\\\") {\\n var ps = s.datapoints.pointsize;\\n point = s.datapoints.points.slice(ps * point, ps * (point + 1));\\n }\\n\\n var i = indexOfHighlight(s, point);\\n if (i == -1) {\\n highlights.push({ series: s, point: point, auto: auto });\\n\\n triggerRedrawOverlay();\\n }\\n else if (!auto)\\n highlights[i].auto = false;\\n }\\n\\n function unhighlight(s, point) {\\n if (s == null && point == null) {\\n highlights = [];\\n triggerRedrawOverlay();\\n return;\\n }\\n\\n if (typeof s == \\\"number\\\")\\n s = series[s];\\n\\n if (typeof point == \\\"number\\\") {\\n var ps = s.datapoints.pointsize;\\n point = s.datapoints.points.slice(ps * point, ps * (point + 1));\\n }\\n\\n var i = indexOfHighlight(s, point);\\n if (i != -1) {\\n highlights.splice(i, 1);\\n\\n triggerRedrawOverlay();\\n }\\n }\\n\\n function indexOfHighlight(s, p) {\\n for (var i = 0; i < highlights.length; ++i) {\\n var h = highlights[i];\\n if (h.series == s && h.point[0] == p[0]\\n && h.point[1] == p[1])\\n return i;\\n }\\n return -1;\\n }\\n\\n function drawPointHighlight(series, point) {\\n var x = point[0], y = point[1],\\n axisx = series.xaxis, axisy = series.yaxis,\\n highlightColor = (typeof series.highlightColor === \\\"string\\\") ? series.highlightColor : $.color.parse(series.color).scale('a', 0.5).toString();\\n\\n if (x < axisx.min || x > axisx.max || y < axisy.min || y > axisy.max)\\n return;\\n\\n var pointRadius = series.points.radius + series.points.lineWidth / 2;\\n octx.lineWidth = pointRadius;\\n octx.strokeStyle = highlightColor;\\n var radius = 1.5 * pointRadius;\\n x = axisx.p2c(x);\\n y = axisy.p2c(y);\\n\\n octx.beginPath();\\n if (series.points.symbol == \\\"circle\\\")\\n octx.arc(x, y, radius, 0, 2 * Math.PI, false);\\n else\\n series.points.symbol(octx, x, y, radius, false);\\n octx.closePath();\\n octx.stroke();\\n }\\n\\n function drawBarHighlight(series, point) {\\n var highlightColor = (typeof series.highlightColor === \\\"string\\\") ? series.highlightColor : $.color.parse(series.color).scale('a', 0.5).toString(),\\n fillStyle = highlightColor,\\n barLeft;\\n\\n switch (series.bars.align) {\\n case \\\"left\\\":\\n barLeft = 0;\\n break;\\n case \\\"right\\\":\\n barLeft = -series.bars.barWidth;\\n break;\\n default:\\n barLeft = -series.bars.barWidth / 2;\\n }\\n\\n octx.lineWidth = series.bars.lineWidth;\\n octx.strokeStyle = highlightColor;\\n\\n drawBar(point[0], point[1], point[2] || 0, barLeft, barLeft + series.bars.barWidth,\\n function () { return fillStyle; }, series.xaxis, series.yaxis, octx, series.bars.horizontal, series.bars.lineWidth);\\n }\\n\\n function getColorOrGradient(spec, bottom, top, defaultColor) {\\n if (typeof spec == \\\"string\\\")\\n return spec;\\n else {\\n // assume this is a gradient spec; IE currently only\\n // supports a simple vertical gradient properly, so that's\\n // what we support too\\n var gradient = ctx.createLinearGradient(0, top, 0, bottom);\\n\\n for (var i = 0, l = spec.colors.length; i < l; ++i) {\\n var c = spec.colors[i];\\n if (typeof c != \\\"string\\\") {\\n var co = $.color.parse(defaultColor);\\n if (c.brightness != null)\\n co = co.scale('rgb', c.brightness);\\n if (c.opacity != null)\\n co.a *= c.opacity;\\n c = co.toString();\\n }\\n gradient.addColorStop(i / (l - 1), c);\\n }\\n\\n return gradient;\\n }\\n }\\n }\\n\\n // Add the plot function to the top level of the jQuery object\\n\\n $.plot = function(placeholder, data, options) {\\n //var t0 = new Date();\\n var plot = new Plot($(placeholder), data, options, $.plot.plugins);\\n //(window.console ? console.log : alert)(\\\"time used (msecs): \\\" + ((new Date()).getTime() - t0.getTime()));\\n return plot;\\n };\\n\\n $.plot.version = \\\"0.8.3\\\";\\n\\n $.plot.plugins = [];\\n\\n // Also add the plot function as a chainable property\\n\\n $.fn.plot = function(data, options) {\\n return this.each(function() {\\n $.plot(this, data, options);\\n });\\n };\\n\\n // round to nearby lower multiple of base\\n function floorInBase(n, base) {\\n return base * Math.floor(n / base);\\n }\\n\\n})(jQuery);\\n\"\n\n/***/ }),\n\n/***/ 2207:\n/***/ (function(module, exports, __webpack_require__) {\n\n__webpack_require__(3)(__webpack_require__(2208))\n\n/***/ }),\n\n/***/ 2208:\n/***/ (function(module, exports) {\n\nmodule.exports = \"/* Pretty handling of time axes.\\n\\nCopyright (c) 2007-2014 IOLA and Ole Laursen.\\nLicensed under the MIT license.\\n\\nSet axis.mode to \\\"time\\\" to enable. See the section \\\"Time series data\\\" in\\nAPI.txt for details.\\n\\n*/\\n\\n(function($) {\\n\\n\\tvar options = {\\n\\t\\txaxis: {\\n\\t\\t\\ttimezone: null,\\t\\t// \\\"browser\\\" for local to the client or timezone for timezone-js\\n\\t\\t\\ttimeformat: null,\\t// format string to use\\n\\t\\t\\ttwelveHourClock: false,\\t// 12 or 24 time in time mode\\n\\t\\t\\tmonthNames: null\\t// list of names of months\\n\\t\\t}\\n\\t};\\n\\n\\t// round to nearby lower multiple of base\\n\\n\\tfunction floorInBase(n, base) {\\n\\t\\treturn base * Math.floor(n / base);\\n\\t}\\n\\n\\t// Returns a string with the date d formatted according to fmt.\\n\\t// A subset of the Open Group's strftime format is supported.\\n\\n\\tfunction formatDate(d, fmt, monthNames, dayNames) {\\n\\n\\t\\tif (typeof d.strftime == \\\"function\\\") {\\n\\t\\t\\treturn d.strftime(fmt);\\n\\t\\t}\\n\\n\\t\\tvar leftPad = function(n, pad) {\\n\\t\\t\\tn = \\\"\\\" + n;\\n\\t\\t\\tpad = \\\"\\\" + (pad == null ? \\\"0\\\" : pad);\\n\\t\\t\\treturn n.length == 1 ? pad + n : n;\\n\\t\\t};\\n\\n\\t\\tvar r = [];\\n\\t\\tvar escape = false;\\n\\t\\tvar hours = d.getHours();\\n\\t\\tvar isAM = hours < 12;\\n\\n\\t\\tif (monthNames == null) {\\n\\t\\t\\tmonthNames = [\\\"Jan\\\", \\\"Feb\\\", \\\"Mar\\\", \\\"Apr\\\", \\\"May\\\", \\\"Jun\\\", \\\"Jul\\\", \\\"Aug\\\", \\\"Sep\\\", \\\"Oct\\\", \\\"Nov\\\", \\\"Dec\\\"];\\n\\t\\t}\\n\\n\\t\\tif (dayNames == null) {\\n\\t\\t\\tdayNames = [\\\"Sun\\\", \\\"Mon\\\", \\\"Tue\\\", \\\"Wed\\\", \\\"Thu\\\", \\\"Fri\\\", \\\"Sat\\\"];\\n\\t\\t}\\n\\n\\t\\tvar hours12;\\n\\n\\t\\tif (hours > 12) {\\n\\t\\t\\thours12 = hours - 12;\\n\\t\\t} else if (hours == 0) {\\n\\t\\t\\thours12 = 12;\\n\\t\\t} else {\\n\\t\\t\\thours12 = hours;\\n\\t\\t}\\n\\n\\t\\tfor (var i = 0; i < fmt.length; ++i) {\\n\\n\\t\\t\\tvar c = fmt.charAt(i);\\n\\n\\t\\t\\tif (escape) {\\n\\t\\t\\t\\tswitch (c) {\\n\\t\\t\\t\\t\\tcase 'a': c = \\\"\\\" + dayNames[d.getDay()]; break;\\n\\t\\t\\t\\t\\tcase 'b': c = \\\"\\\" + monthNames[d.getMonth()]; break;\\n\\t\\t\\t\\t\\tcase 'd': c = leftPad(d.getDate()); break;\\n\\t\\t\\t\\t\\tcase 'e': c = leftPad(d.getDate(), \\\" \\\"); break;\\n\\t\\t\\t\\t\\tcase 'h':\\t// For back-compat with 0.7; remove in 1.0\\n\\t\\t\\t\\t\\tcase 'H': c = leftPad(hours); break;\\n\\t\\t\\t\\t\\tcase 'I': c = leftPad(hours12); break;\\n\\t\\t\\t\\t\\tcase 'l': c = leftPad(hours12, \\\" \\\"); break;\\n\\t\\t\\t\\t\\tcase 'm': c = leftPad(d.getMonth() + 1); break;\\n\\t\\t\\t\\t\\tcase 'M': c = leftPad(d.getMinutes()); break;\\n\\t\\t\\t\\t\\t// quarters not in Open Group's strftime specification\\n\\t\\t\\t\\t\\tcase 'q':\\n\\t\\t\\t\\t\\t\\tc = \\\"\\\" + (Math.floor(d.getMonth() / 3) + 1); break;\\n\\t\\t\\t\\t\\tcase 'S': c = leftPad(d.getSeconds()); break;\\n\\t\\t\\t\\t\\tcase 'y': c = leftPad(d.getFullYear() % 100); break;\\n\\t\\t\\t\\t\\tcase 'Y': c = \\\"\\\" + d.getFullYear(); break;\\n\\t\\t\\t\\t\\tcase 'p': c = (isAM) ? (\\\"\\\" + \\\"am\\\") : (\\\"\\\" + \\\"pm\\\"); break;\\n\\t\\t\\t\\t\\tcase 'P': c = (isAM) ? (\\\"\\\" + \\\"AM\\\") : (\\\"\\\" + \\\"PM\\\"); break;\\n\\t\\t\\t\\t\\tcase 'w': c = \\\"\\\" + d.getDay(); break;\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tr.push(c);\\n\\t\\t\\t\\tescape = false;\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tif (c == \\\"%\\\") {\\n\\t\\t\\t\\t\\tescape = true;\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\tr.push(c);\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\treturn r.join(\\\"\\\");\\n\\t}\\n\\n\\t// To have a consistent view of time-based data independent of which time\\n\\t// zone the client happens to be in we need a date-like object independent\\n\\t// of time zones. This is done through a wrapper that only calls the UTC\\n\\t// versions of the accessor methods.\\n\\n\\tfunction makeUtcWrapper(d) {\\n\\n\\t\\tfunction addProxyMethod(sourceObj, sourceMethod, targetObj, targetMethod) {\\n\\t\\t\\tsourceObj[sourceMethod] = function() {\\n\\t\\t\\t\\treturn targetObj[targetMethod].apply(targetObj, arguments);\\n\\t\\t\\t};\\n\\t\\t};\\n\\n\\t\\tvar utc = {\\n\\t\\t\\tdate: d\\n\\t\\t};\\n\\n\\t\\t// support strftime, if found\\n\\n\\t\\tif (d.strftime != undefined) {\\n\\t\\t\\taddProxyMethod(utc, \\\"strftime\\\", d, \\\"strftime\\\");\\n\\t\\t}\\n\\n\\t\\taddProxyMethod(utc, \\\"getTime\\\", d, \\\"getTime\\\");\\n\\t\\taddProxyMethod(utc, \\\"setTime\\\", d, \\\"setTime\\\");\\n\\n\\t\\tvar props = [\\\"Date\\\", \\\"Day\\\", \\\"FullYear\\\", \\\"Hours\\\", \\\"Milliseconds\\\", \\\"Minutes\\\", \\\"Month\\\", \\\"Seconds\\\"];\\n\\n\\t\\tfor (var p = 0; p < props.length; p++) {\\n\\t\\t\\taddProxyMethod(utc, \\\"get\\\" + props[p], d, \\\"getUTC\\\" + props[p]);\\n\\t\\t\\taddProxyMethod(utc, \\\"set\\\" + props[p], d, \\\"setUTC\\\" + props[p]);\\n\\t\\t}\\n\\n\\t\\treturn utc;\\n\\t};\\n\\n\\t// select time zone strategy. This returns a date-like object tied to the\\n\\t// desired timezone\\n\\n\\tfunction dateGenerator(ts, opts) {\\n\\t\\tif (opts.timezone == \\\"browser\\\") {\\n\\t\\t\\treturn new Date(ts);\\n\\t\\t} else if (!opts.timezone || opts.timezone == \\\"utc\\\") {\\n\\t\\t\\treturn makeUtcWrapper(new Date(ts));\\n\\t\\t} else if (typeof timezoneJS != \\\"undefined\\\" && typeof timezoneJS.Date != \\\"undefined\\\") {\\n\\t\\t\\tvar d = new timezoneJS.Date();\\n\\t\\t\\t// timezone-js is fickle, so be sure to set the time zone before\\n\\t\\t\\t// setting the time.\\n\\t\\t\\td.setTimezone(opts.timezone);\\n\\t\\t\\td.setTime(ts);\\n\\t\\t\\treturn d;\\n\\t\\t} else {\\n\\t\\t\\treturn makeUtcWrapper(new Date(ts));\\n\\t\\t}\\n\\t}\\n\\t\\n\\t// map of app. size of time units in milliseconds\\n\\n\\tvar timeUnitSize = {\\n\\t\\t\\\"second\\\": 1000,\\n\\t\\t\\\"minute\\\": 60 * 1000,\\n\\t\\t\\\"hour\\\": 60 * 60 * 1000,\\n\\t\\t\\\"day\\\": 24 * 60 * 60 * 1000,\\n\\t\\t\\\"month\\\": 30 * 24 * 60 * 60 * 1000,\\n\\t\\t\\\"quarter\\\": 3 * 30 * 24 * 60 * 60 * 1000,\\n\\t\\t\\\"year\\\": 365.2425 * 24 * 60 * 60 * 1000\\n\\t};\\n\\n\\t// the allowed tick sizes, after 1 year we use\\n\\t// an integer algorithm\\n\\n\\tvar baseSpec = [\\n\\t\\t[1, \\\"second\\\"], [2, \\\"second\\\"], [5, \\\"second\\\"], [10, \\\"second\\\"],\\n\\t\\t[30, \\\"second\\\"], \\n\\t\\t[1, \\\"minute\\\"], [2, \\\"minute\\\"], [5, \\\"minute\\\"], [10, \\\"minute\\\"],\\n\\t\\t[30, \\\"minute\\\"], \\n\\t\\t[1, \\\"hour\\\"], [2, \\\"hour\\\"], [4, \\\"hour\\\"],\\n\\t\\t[8, \\\"hour\\\"], [12, \\\"hour\\\"],\\n\\t\\t[1, \\\"day\\\"], [2, \\\"day\\\"], [3, \\\"day\\\"],\\n\\t\\t[0.25, \\\"month\\\"], [0.5, \\\"month\\\"], [1, \\\"month\\\"],\\n\\t\\t[2, \\\"month\\\"]\\n\\t];\\n\\n\\t// we don't know which variant(s) we'll need yet, but generating both is\\n\\t// cheap\\n\\n\\tvar specMonths = baseSpec.concat([[3, \\\"month\\\"], [6, \\\"month\\\"],\\n\\t\\t[1, \\\"year\\\"]]);\\n\\tvar specQuarters = baseSpec.concat([[1, \\\"quarter\\\"], [2, \\\"quarter\\\"],\\n\\t\\t[1, \\\"year\\\"]]);\\n\\n\\tfunction init(plot) {\\n\\t\\tplot.hooks.processOptions.push(function (plot, options) {\\n\\t\\t\\t$.each(plot.getAxes(), function(axisName, axis) {\\n\\n\\t\\t\\t\\tvar opts = axis.options;\\n\\n\\t\\t\\t\\tif (opts.mode == \\\"time\\\") {\\n\\t\\t\\t\\t\\taxis.tickGenerator = function(axis) {\\n\\n\\t\\t\\t\\t\\t\\tvar ticks = [];\\n\\t\\t\\t\\t\\t\\tvar d = dateGenerator(axis.min, opts);\\n\\t\\t\\t\\t\\t\\tvar minSize = 0;\\n\\n\\t\\t\\t\\t\\t\\t// make quarter use a possibility if quarters are\\n\\t\\t\\t\\t\\t\\t// mentioned in either of these options\\n\\n\\t\\t\\t\\t\\t\\tvar spec = (opts.tickSize && opts.tickSize[1] ===\\n\\t\\t\\t\\t\\t\\t\\t\\\"quarter\\\") ||\\n\\t\\t\\t\\t\\t\\t\\t(opts.minTickSize && opts.minTickSize[1] ===\\n\\t\\t\\t\\t\\t\\t\\t\\\"quarter\\\") ? specQuarters : specMonths;\\n\\n\\t\\t\\t\\t\\t\\tif (opts.minTickSize != null) {\\n\\t\\t\\t\\t\\t\\t\\tif (typeof opts.tickSize == \\\"number\\\") {\\n\\t\\t\\t\\t\\t\\t\\t\\tminSize = opts.tickSize;\\n\\t\\t\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\t\\t\\tminSize = opts.minTickSize[0] * timeUnitSize[opts.minTickSize[1]];\\n\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\t\\tfor (var i = 0; i < spec.length - 1; ++i) {\\n\\t\\t\\t\\t\\t\\t\\tif (axis.delta < (spec[i][0] * timeUnitSize[spec[i][1]]\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t + spec[i + 1][0] * timeUnitSize[spec[i + 1][1]]) / 2\\n\\t\\t\\t\\t\\t\\t\\t\\t&& spec[i][0] * timeUnitSize[spec[i][1]] >= minSize) {\\n\\t\\t\\t\\t\\t\\t\\t\\tbreak;\\n\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\t\\tvar size = spec[i][0];\\n\\t\\t\\t\\t\\t\\tvar unit = spec[i][1];\\n\\n\\t\\t\\t\\t\\t\\t// special-case the possibility of several years\\n\\n\\t\\t\\t\\t\\t\\tif (unit == \\\"year\\\") {\\n\\n\\t\\t\\t\\t\\t\\t\\t// if given a minTickSize in years, just use it,\\n\\t\\t\\t\\t\\t\\t\\t// ensuring that it's an integer\\n\\n\\t\\t\\t\\t\\t\\t\\tif (opts.minTickSize != null && opts.minTickSize[1] == \\\"year\\\") {\\n\\t\\t\\t\\t\\t\\t\\t\\tsize = Math.floor(opts.minTickSize[0]);\\n\\t\\t\\t\\t\\t\\t\\t} else {\\n\\n\\t\\t\\t\\t\\t\\t\\t\\tvar magn = Math.pow(10, Math.floor(Math.log(axis.delta / timeUnitSize.year) / Math.LN10));\\n\\t\\t\\t\\t\\t\\t\\t\\tvar norm = (axis.delta / timeUnitSize.year) / magn;\\n\\n\\t\\t\\t\\t\\t\\t\\t\\tif (norm < 1.5) {\\n\\t\\t\\t\\t\\t\\t\\t\\t\\tsize = 1;\\n\\t\\t\\t\\t\\t\\t\\t\\t} else if (norm < 3) {\\n\\t\\t\\t\\t\\t\\t\\t\\t\\tsize = 2;\\n\\t\\t\\t\\t\\t\\t\\t\\t} else if (norm < 7.5) {\\n\\t\\t\\t\\t\\t\\t\\t\\t\\tsize = 5;\\n\\t\\t\\t\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\t\\t\\t\\tsize = 10;\\n\\t\\t\\t\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\t\\t\\t\\tsize *= magn;\\n\\t\\t\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\t\\t\\t// minimum size for years is 1\\n\\n\\t\\t\\t\\t\\t\\t\\tif (size < 1) {\\n\\t\\t\\t\\t\\t\\t\\t\\tsize = 1;\\n\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\t\\taxis.tickSize = opts.tickSize || [size, unit];\\n\\t\\t\\t\\t\\t\\tvar tickSize = axis.tickSize[0];\\n\\t\\t\\t\\t\\t\\tunit = axis.tickSize[1];\\n\\n\\t\\t\\t\\t\\t\\tvar step = tickSize * timeUnitSize[unit];\\n\\n\\t\\t\\t\\t\\t\\tif (unit == \\\"second\\\") {\\n\\t\\t\\t\\t\\t\\t\\td.setSeconds(floorInBase(d.getSeconds(), tickSize));\\n\\t\\t\\t\\t\\t\\t} else if (unit == \\\"minute\\\") {\\n\\t\\t\\t\\t\\t\\t\\td.setMinutes(floorInBase(d.getMinutes(), tickSize));\\n\\t\\t\\t\\t\\t\\t} else if (unit == \\\"hour\\\") {\\n\\t\\t\\t\\t\\t\\t\\td.setHours(floorInBase(d.getHours(), tickSize));\\n\\t\\t\\t\\t\\t\\t} else if (unit == \\\"month\\\") {\\n\\t\\t\\t\\t\\t\\t\\td.setMonth(floorInBase(d.getMonth(), tickSize));\\n\\t\\t\\t\\t\\t\\t} else if (unit == \\\"quarter\\\") {\\n\\t\\t\\t\\t\\t\\t\\td.setMonth(3 * floorInBase(d.getMonth() / 3,\\n\\t\\t\\t\\t\\t\\t\\t\\ttickSize));\\n\\t\\t\\t\\t\\t\\t} else if (unit == \\\"year\\\") {\\n\\t\\t\\t\\t\\t\\t\\td.setFullYear(floorInBase(d.getFullYear(), tickSize));\\n\\t\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\t\\t// reset smaller components\\n\\n\\t\\t\\t\\t\\t\\td.setMilliseconds(0);\\n\\n\\t\\t\\t\\t\\t\\tif (step >= timeUnitSize.minute) {\\n\\t\\t\\t\\t\\t\\t\\td.setSeconds(0);\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\tif (step >= timeUnitSize.hour) {\\n\\t\\t\\t\\t\\t\\t\\td.setMinutes(0);\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\tif (step >= timeUnitSize.day) {\\n\\t\\t\\t\\t\\t\\t\\td.setHours(0);\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\tif (step >= timeUnitSize.day * 4) {\\n\\t\\t\\t\\t\\t\\t\\td.setDate(1);\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\tif (step >= timeUnitSize.month * 2) {\\n\\t\\t\\t\\t\\t\\t\\td.setMonth(floorInBase(d.getMonth(), 3));\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\tif (step >= timeUnitSize.quarter * 2) {\\n\\t\\t\\t\\t\\t\\t\\td.setMonth(floorInBase(d.getMonth(), 6));\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\tif (step >= timeUnitSize.year) {\\n\\t\\t\\t\\t\\t\\t\\td.setMonth(0);\\n\\t\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\t\\tvar carry = 0;\\n\\t\\t\\t\\t\\t\\tvar v = Number.NaN;\\n\\t\\t\\t\\t\\t\\tvar prev;\\n\\n\\t\\t\\t\\t\\t\\tdo {\\n\\n\\t\\t\\t\\t\\t\\t\\tprev = v;\\n\\t\\t\\t\\t\\t\\t\\tv = d.getTime();\\n\\t\\t\\t\\t\\t\\t\\tticks.push(v);\\n\\n\\t\\t\\t\\t\\t\\t\\tif (unit == \\\"month\\\" || unit == \\\"quarter\\\") {\\n\\t\\t\\t\\t\\t\\t\\t\\tif (tickSize < 1) {\\n\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t// a bit complicated - we'll divide the\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t// month/quarter up but we need to take\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t// care of fractions so we don't end up in\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t// the middle of a day\\n\\n\\t\\t\\t\\t\\t\\t\\t\\t\\td.setDate(1);\\n\\t\\t\\t\\t\\t\\t\\t\\t\\tvar start = d.getTime();\\n\\t\\t\\t\\t\\t\\t\\t\\t\\td.setMonth(d.getMonth() +\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t(unit == \\\"quarter\\\" ? 3 : 1));\\n\\t\\t\\t\\t\\t\\t\\t\\t\\tvar end = d.getTime();\\n\\t\\t\\t\\t\\t\\t\\t\\t\\td.setTime(v + carry * timeUnitSize.hour + (end - start) * tickSize);\\n\\t\\t\\t\\t\\t\\t\\t\\t\\tcarry = d.getHours();\\n\\t\\t\\t\\t\\t\\t\\t\\t\\td.setHours(0);\\n\\t\\t\\t\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\t\\t\\t\\td.setMonth(d.getMonth() +\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\ttickSize * (unit == \\\"quarter\\\" ? 3 : 1));\\n\\t\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t\\t} else if (unit == \\\"year\\\") {\\n\\t\\t\\t\\t\\t\\t\\t\\td.setFullYear(d.getFullYear() + tickSize);\\n\\t\\t\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\t\\t\\td.setTime(v + step);\\n\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t} while (v < axis.max && v != prev);\\n\\n\\t\\t\\t\\t\\t\\treturn ticks;\\n\\t\\t\\t\\t\\t};\\n\\n\\t\\t\\t\\t\\taxis.tickFormatter = function (v, axis) {\\n\\n\\t\\t\\t\\t\\t\\tvar d = dateGenerator(v, axis.options);\\n\\n\\t\\t\\t\\t\\t\\t// first check global format\\n\\n\\t\\t\\t\\t\\t\\tif (opts.timeformat != null) {\\n\\t\\t\\t\\t\\t\\t\\treturn formatDate(d, opts.timeformat, opts.monthNames, opts.dayNames);\\n\\t\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\t\\t// possibly use quarters if quarters are mentioned in\\n\\t\\t\\t\\t\\t\\t// any of these places\\n\\n\\t\\t\\t\\t\\t\\tvar useQuarters = (axis.options.tickSize &&\\n\\t\\t\\t\\t\\t\\t\\t\\taxis.options.tickSize[1] == \\\"quarter\\\") ||\\n\\t\\t\\t\\t\\t\\t\\t(axis.options.minTickSize &&\\n\\t\\t\\t\\t\\t\\t\\t\\taxis.options.minTickSize[1] == \\\"quarter\\\");\\n\\n\\t\\t\\t\\t\\t\\tvar t = axis.tickSize[0] * timeUnitSize[axis.tickSize[1]];\\n\\t\\t\\t\\t\\t\\tvar span = axis.max - axis.min;\\n\\t\\t\\t\\t\\t\\tvar suffix = (opts.twelveHourClock) ? \\\" %p\\\" : \\\"\\\";\\n\\t\\t\\t\\t\\t\\tvar hourCode = (opts.twelveHourClock) ? \\\"%I\\\" : \\\"%H\\\";\\n\\t\\t\\t\\t\\t\\tvar fmt;\\n\\n\\t\\t\\t\\t\\t\\tif (t < timeUnitSize.minute) {\\n\\t\\t\\t\\t\\t\\t\\tfmt = hourCode + \\\":%M:%S\\\" + suffix;\\n\\t\\t\\t\\t\\t\\t} else if (t < timeUnitSize.day) {\\n\\t\\t\\t\\t\\t\\t\\tif (span < 2 * timeUnitSize.day) {\\n\\t\\t\\t\\t\\t\\t\\t\\tfmt = hourCode + \\\":%M\\\" + suffix;\\n\\t\\t\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\t\\t\\tfmt = \\\"%b %d \\\" + hourCode + \\\":%M\\\" + suffix;\\n\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t} else if (t < timeUnitSize.month) {\\n\\t\\t\\t\\t\\t\\t\\tfmt = \\\"%b %d\\\";\\n\\t\\t\\t\\t\\t\\t} else if ((useQuarters && t < timeUnitSize.quarter) ||\\n\\t\\t\\t\\t\\t\\t\\t(!useQuarters && t < timeUnitSize.year)) {\\n\\t\\t\\t\\t\\t\\t\\tif (span < timeUnitSize.year) {\\n\\t\\t\\t\\t\\t\\t\\t\\tfmt = \\\"%b\\\";\\n\\t\\t\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\t\\t\\tfmt = \\\"%b %Y\\\";\\n\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t} else if (useQuarters && t < timeUnitSize.year) {\\n\\t\\t\\t\\t\\t\\t\\tif (span < timeUnitSize.year) {\\n\\t\\t\\t\\t\\t\\t\\t\\tfmt = \\\"Q%q\\\";\\n\\t\\t\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\t\\t\\tfmt = \\\"Q%q %Y\\\";\\n\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\t\\tfmt = \\\"%Y\\\";\\n\\t\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\t\\tvar rt = formatDate(d, fmt, opts.monthNames, opts.dayNames);\\n\\n\\t\\t\\t\\t\\t\\treturn rt;\\n\\t\\t\\t\\t\\t};\\n\\t\\t\\t\\t}\\n\\t\\t\\t});\\n\\t\\t});\\n\\t}\\n\\n\\t$.plot.plugins.push({\\n\\t\\tinit: init,\\n\\t\\toptions: options,\\n\\t\\tname: 'time',\\n\\t\\tversion: '1.0'\\n\\t});\\n\\n\\t// Time-axis support used to be in Flot core, which exposed the\\n\\t// formatDate function on the plot object. Various plugins depend\\n\\t// on the function, so we need to re-expose it here.\\n\\n\\t$.plot.formatDate = formatDate;\\n\\t$.plot.dateGenerator = dateGenerator;\\n\\n})(jQuery);\\n\"\n\n/***/ }),\n\n/***/ 2209:\n/***/ (function(module, exports, __webpack_require__) {\n\n__webpack_require__(3)(__webpack_require__(2210))\n\n/***/ }),\n\n/***/ 2210:\n/***/ (function(module, exports) {\n\nmodule.exports = \"/*\\r\\n * jquery.flot.tooltip\\r\\n * \\r\\n * description: easy-to-use tooltips for Flot charts\\r\\n * version: 0.6.2\\r\\n * author: Krzysztof Urbas @krzysu [myviews.pl]\\r\\n * website: https://github.com/krzysu/flot.tooltip\\r\\n * \\r\\n * build on 2013-09-30\\r\\n * released under MIT License, 2012\\r\\n*/ \\r\\n(function(t){var o={tooltip:!1,tooltipOpts:{content:\\\"%s | X: %x | Y: %y\\\",xDateFormat:null,yDateFormat:null,shifts:{x:10,y:20},defaultTheme:!0,onHover:function(){}}},i=function(t){this.tipPosition={x:0,y:0},this.init(t)};i.prototype.init=function(o){function i(t){var o={};o.x=t.pageX,o.y=t.pageY,s.updateTooltipPosition(o)}function e(t,o,i){var e=s.getDomElement();if(i){var n;n=s.stringFormat(s.tooltipOptions.content,i),e.html(n),s.updateTooltipPosition({x:o.pageX,y:o.pageY}),e.css({left:s.tipPosition.x+s.tooltipOptions.shifts.x,top:s.tipPosition.y+s.tooltipOptions.shifts.y}).show(),\\\"function\\\"==typeof s.tooltipOptions.onHover&&s.tooltipOptions.onHover(i,e)}else e.hide().html(\\\"\\\")}var s=this;o.hooks.bindEvents.push(function(o,n){s.plotOptions=o.getOptions(),s.plotOptions.tooltip!==!1&&void 0!==s.plotOptions.tooltip&&(s.tooltipOptions=s.plotOptions.tooltipOpts,s.getDomElement(),t(o.getPlaceholder()).bind(\\\"plothover\\\",e),t(n).bind(\\\"mousemove\\\",i))}),o.hooks.shutdown.push(function(o,s){t(o.getPlaceholder()).unbind(\\\"plothover\\\",e),t(s).unbind(\\\"mousemove\\\",i)})},i.prototype.getDomElement=function(){var o;return t(\\\"#flotTip\\\").length>0?o=t(\\\"#flotTip\\\"):(o=t(\\\"<div />\\\").attr(\\\"id\\\",\\\"flotTip\\\"),o.appendTo(\\\"body\\\").hide().css({position:\\\"absolute\\\"}),this.tooltipOptions.defaultTheme&&o.css({background:\\\"#fff\\\",\\\"z-index\\\":\\\"100\\\",padding:\\\"0.4em 0.6em\\\",\\\"border-radius\\\":\\\"0.5em\\\",\\\"font-size\\\":\\\"0.8em\\\",border:\\\"1px solid #111\\\",display:\\\"none\\\",\\\"white-space\\\":\\\"nowrap\\\"})),o},i.prototype.updateTooltipPosition=function(o){var i=t(\\\"#flotTip\\\").outerWidth()+this.tooltipOptions.shifts.x,e=t(\\\"#flotTip\\\").outerHeight()+this.tooltipOptions.shifts.y;o.x-t(window).scrollLeft()>t(window).innerWidth()-i&&(o.x-=i),o.y-t(window).scrollTop()>t(window).innerHeight()-e&&(o.y-=e),this.tipPosition.x=o.x,this.tipPosition.y=o.y},i.prototype.stringFormat=function(t,o){var i=/%p\\\\.{0,1}(\\\\d{0,})/,e=/%s/,s=/%x\\\\.{0,1}(?:\\\\d{0,})/,n=/%y\\\\.{0,1}(?:\\\\d{0,})/;return\\\"function\\\"==typeof t&&(t=t(o.series.label,o.series.data[o.dataIndex][0],o.series.data[o.dataIndex][1],o)),o.series.percent!==void 0&&(t=this.adjustValPrecision(i,t,o.series.percent)),o.series.label!==void 0&&(t=t.replace(e,o.series.label)),this.isTimeMode(\\\"xaxis\\\",o)&&this.isXDateFormat(o)&&(t=t.replace(s,this.timestampToDate(o.series.data[o.dataIndex][0],this.tooltipOptions.xDateFormat))),this.isTimeMode(\\\"yaxis\\\",o)&&this.isYDateFormat(o)&&(t=t.replace(n,this.timestampToDate(o.series.data[o.dataIndex][1],this.tooltipOptions.yDateFormat))),\\\"number\\\"==typeof o.series.data[o.dataIndex][0]&&(t=this.adjustValPrecision(s,t,o.series.data[o.dataIndex][0])),\\\"number\\\"==typeof o.series.data[o.dataIndex][1]&&(t=this.adjustValPrecision(n,t,o.series.data[o.dataIndex][1])),o.series.xaxis.tickFormatter!==void 0&&(t=t.replace(s,o.series.xaxis.tickFormatter(o.series.data[o.dataIndex][0],o.series.xaxis))),o.series.yaxis.tickFormatter!==void 0&&(t=t.replace(n,o.series.yaxis.tickFormatter(o.series.data[o.dataIndex][1],o.series.yaxis))),t},i.prototype.isTimeMode=function(t,o){return o.series[t].options.mode!==void 0&&\\\"time\\\"===o.series[t].options.mode},i.prototype.isXDateFormat=function(){return this.tooltipOptions.xDateFormat!==void 0&&null!==this.tooltipOptions.xDateFormat},i.prototype.isYDateFormat=function(){return this.tooltipOptions.yDateFormat!==void 0&&null!==this.tooltipOptions.yDateFormat},i.prototype.timestampToDate=function(o,i){var e=new Date(o);return t.plot.formatDate(e,i)},i.prototype.adjustValPrecision=function(t,o,i){var e,s=o.match(t);return null!==s&&\\\"\\\"!==RegExp.$1&&(e=RegExp.$1,i=i.toFixed(e),o=o.replace(t,i)),o};var e=function(t){new i(t)};t.plot.plugins.push({init:e,options:o,name:\\\"tooltip\\\",version:\\\"0.6.1\\\"})})(jQuery);\"\n\n/***/ }),\n\n/***/ 2211:\n/***/ (function(module, exports, __webpack_require__) {\n\n__webpack_require__(3)(__webpack_require__(2212))\n\n/***/ }),\n\n/***/ 2212:\n/***/ (function(module, exports) {\n\nmodule.exports = \"/**\\r\\n * Flot plugin that provides spline interpolation for line graphs\\r\\n * author: Alex Bardas < alex.bardas@gmail.com >\\r\\n * modified by: Avi Kohn https://github.com/AMKohn\\r\\n * based on the spline interpolation described at:\\r\\n *\\t\\t http://scaledinnovation.com/analytics/splines/aboutSplines.html\\r\\n *\\r\\n * Example usage: (add in plot options series object)\\r\\n *\\t\\tfor linespline:\\r\\n *\\t\\t\\tseries: {\\r\\n *\\t\\t\\t\\t...\\r\\n *\\t\\t\\t\\tlines: {\\r\\n *\\t\\t\\t\\t\\tshow: false\\r\\n *\\t\\t\\t\\t},\\r\\n *\\t\\t\\t\\tsplines: {\\r\\n *\\t\\t\\t\\t\\tshow: true,\\r\\n *\\t\\t\\t\\t\\ttension: x, (float between 0 and 1, defaults to 0.5),\\r\\n *\\t\\t\\t\\t\\tlineWidth: y (number, defaults to 2),\\r\\n *\\t\\t\\t\\t\\tfill: z (float between 0 .. 1 or false, as in flot documentation)\\r\\n *\\t\\t\\t\\t},\\r\\n *\\t\\t\\t\\t...\\r\\n *\\t\\t\\t}\\r\\n *\\t\\tareaspline:\\r\\n *\\t\\t\\tseries: {\\r\\n *\\t\\t\\t\\t...\\r\\n *\\t\\t\\t\\tlines: {\\r\\n *\\t\\t\\t\\t\\tshow: true,\\r\\n *\\t\\t\\t\\t\\tlineWidth: 0, (line drawing will not execute)\\r\\n *\\t\\t\\t\\t\\tfill: x, (float between 0 .. 1, as in flot documentation)\\r\\n *\\t\\t\\t\\t\\t...\\r\\n *\\t\\t\\t\\t},\\r\\n *\\t\\t\\t\\tsplines: {\\r\\n *\\t\\t\\t\\t\\tshow: true,\\r\\n *\\t\\t\\t\\t\\ttension: 0.5 (float between 0 and 1)\\r\\n *\\t\\t\\t\\t},\\r\\n *\\t\\t\\t\\t...\\r\\n *\\t\\t\\t}\\r\\n *\\r\\n */\\r\\n\\r\\n(function($) {\\r\\n 'use strict'\\r\\n\\r\\n /**\\r\\n * @param {Number} x0, y0, x1, y1: coordinates of the end (knot) points of the segment\\r\\n * @param {Number} x2, y2: the next knot (not connected, but needed to calculate p2)\\r\\n * @param {Number} tension: control how far the control points spread\\r\\n * @return {Array}: p1 -> control point, from x1 back toward x0\\r\\n * \\t\\t\\t\\t\\tp2 -> the next control point, returned to become the next segment's p1\\r\\n *\\r\\n * @api private\\r\\n */\\r\\n function getControlPoints(x0, y0, x1, y1, x2, y2, tension) {\\r\\n\\r\\n var pow = Math.pow,\\r\\n sqrt = Math.sqrt,\\r\\n d01, d12, fa, fb, p1x, p1y, p2x, p2y;\\r\\n\\r\\n // Scaling factors: distances from this knot to the previous and following knots.\\r\\n d01 = sqrt(pow(x1 - x0, 2) + pow(y1 - y0, 2));\\r\\n d12 = sqrt(pow(x2 - x1, 2) + pow(y2 - y1, 2));\\r\\n\\r\\n fa = tension * d01 / (d01 + d12);\\r\\n fb = tension - fa;\\r\\n\\r\\n p1x = x1 + fa * (x0 - x2);\\r\\n p1y = y1 + fa * (y0 - y2);\\r\\n\\r\\n p2x = x1 - fb * (x0 - x2);\\r\\n p2y = y1 - fb * (y0 - y2);\\r\\n\\r\\n return [p1x, p1y, p2x, p2y];\\r\\n }\\r\\n\\r\\n var line = [];\\r\\n\\r\\n function drawLine(points, ctx, height, fill, seriesColor) {\\r\\n var c = $.color.parse(seriesColor);\\r\\n\\r\\n c.a = typeof fill == \\\"number\\\" ? fill : .3;\\r\\n c.normalize();\\r\\n c = c.toString();\\r\\n\\r\\n ctx.beginPath();\\r\\n ctx.moveTo(points[0][0], points[0][1]);\\r\\n\\r\\n var plength = points.length;\\r\\n\\r\\n for (var i = 0; i < plength; i++) {\\r\\n ctx[points[i][3]].apply(ctx, points[i][2]);\\r\\n }\\r\\n\\r\\n ctx.stroke();\\r\\n\\r\\n ctx.lineWidth = 0;\\r\\n ctx.lineTo(points[plength - 1][0], height);\\r\\n ctx.lineTo(points[0][0], height);\\r\\n\\r\\n ctx.closePath();\\r\\n\\r\\n if (fill !== false) {\\r\\n ctx.fillStyle = c;\\r\\n ctx.fill();\\r\\n }\\r\\n }\\r\\n\\r\\n /**\\r\\n * @param {Object} ctx: canvas context\\r\\n * @param {String} type: accepted strings: 'bezier' or 'quadratic' (defaults to quadratic)\\r\\n * @param {Array} points: 2 points for which to draw the interpolation\\r\\n * @param {Array} cpoints: control points for those segment points\\r\\n *\\r\\n * @api private\\r\\n */\\r\\n function queue(ctx, type, points, cpoints) {\\r\\n if (type === void 0 || (type !== 'bezier' && type !== 'quadratic')) {\\r\\n type = 'quadratic';\\r\\n }\\r\\n type = type + 'CurveTo';\\r\\n\\r\\n if (line.length == 0) line.push([points[0], points[1], cpoints.concat(points.slice(2)), type]);\\r\\n else if (type == \\\"quadraticCurveTo\\\" && points.length == 2) {\\r\\n cpoints = cpoints.slice(0, 2).concat(points);\\r\\n\\r\\n line.push([points[0], points[1], cpoints, type]);\\r\\n }\\r\\n else line.push([points[2], points[3], cpoints.concat(points.slice(2)), type]);\\r\\n }\\r\\n\\r\\n /**\\r\\n * @param {Object} plot\\r\\n * @param {Object} ctx: canvas context\\r\\n * @param {Object} series\\r\\n *\\r\\n * @api private\\r\\n */\\r\\n\\r\\n function drawSpline(plot, ctx, series) {\\r\\n // Not interested if spline is not requested\\r\\n if (series.splines.show !== true) {\\r\\n return;\\r\\n }\\r\\n\\r\\n var cp = [],\\r\\n // array of control points\\r\\n tension = series.splines.tension || 0.5,\\r\\n idx, x, y, points = series.datapoints.points,\\r\\n ps = series.datapoints.pointsize,\\r\\n plotOffset = plot.getPlotOffset(),\\r\\n len = points.length,\\r\\n pts = [];\\r\\n\\r\\n line = [];\\r\\n\\r\\n // Cannot display a linespline/areaspline if there are less than 3 points\\r\\n if (len / ps < 4) {\\r\\n $.extend(series.lines, series.splines);\\r\\n return;\\r\\n }\\r\\n\\r\\n for (idx = 0; idx < len; idx += ps) {\\r\\n x = points[idx];\\r\\n y = points[idx + 1];\\r\\n if (x == null || x < series.xaxis.min || x > series.xaxis.max || y < series.yaxis.min || y > series.yaxis.max) {\\r\\n continue;\\r\\n }\\r\\n\\r\\n pts.push(series.xaxis.p2c(x) + plotOffset.left, series.yaxis.p2c(y) + plotOffset.top);\\r\\n }\\r\\n\\r\\n len = pts.length;\\r\\n\\r\\n // Draw an open curve, not connected at the ends\\r\\n for (idx = 0; idx < len - 2; idx += 2) {\\r\\n cp = cp.concat(getControlPoints.apply(this, pts.slice(idx, idx + 6).concat([tension])));\\r\\n }\\r\\n\\r\\n ctx.save();\\r\\n ctx.strokeStyle = series.color;\\r\\n ctx.lineWidth = series.splines.lineWidth;\\r\\n\\r\\n queue(ctx, 'quadratic', pts.slice(0, 4), cp.slice(0, 2));\\r\\n\\r\\n for (idx = 2; idx < len - 3; idx += 2) {\\r\\n queue(ctx, 'bezier', pts.slice(idx, idx + 4), cp.slice(2 * idx - 2, 2 * idx + 2));\\r\\n }\\r\\n\\r\\n queue(ctx, 'quadratic', pts.slice(len - 2, len), [cp[2 * len - 10], cp[2 * len - 9], pts[len - 4], pts[len - 3]]);\\r\\n\\r\\n drawLine(line, ctx, plot.height() + 10, series.splines.fill, series.color);\\r\\n\\r\\n ctx.restore();\\r\\n }\\r\\n\\r\\n $.plot.plugins.push({\\r\\n init: function(plot) {\\r\\n plot.hooks.drawSeries.push(drawSpline);\\r\\n },\\r\\n options: {\\r\\n series: {\\r\\n splines: {\\r\\n show: false,\\r\\n lineWidth: 2,\\r\\n tension: 0.5,\\r\\n fill: false\\r\\n }\\r\\n }\\r\\n },\\r\\n name: 'spline',\\r\\n version: '0.8.2'\\r\\n });\\r\\n})(jQuery);\\r\\n\"\n\n/***/ }),\n\n/***/ 2213:\n/***/ (function(module, exports, __webpack_require__) {\n\n__webpack_require__(3)(__webpack_require__(2214))\n\n/***/ }),\n\n/***/ 2214:\n/***/ (function(module, exports) {\n\nmodule.exports = \"/* Flot plugin for automatically redrawing plots as the placeholder resizes.\\n\\nCopyright (c) 2007-2014 IOLA and Ole Laursen.\\nLicensed under the MIT license.\\n\\nIt works by listening for changes on the placeholder div (through the jQuery\\nresize event plugin) - if the size changes, it will redraw the plot.\\n\\nThere are no options. If you need to disable the plugin for some plots, you\\ncan just fix the size of their placeholders.\\n\\n*/\\n\\n/* Inline dependency:\\n * jQuery resize event - v1.1 - 3/14/2010\\n * http://benalman.com/projects/jquery-resize-plugin/\\n *\\n * Copyright (c) 2010 \\\"Cowboy\\\" Ben Alman\\n * Dual licensed under the MIT and GPL licenses.\\n * http://benalman.com/about/license/\\n */\\n(function($,e,t){\\\"$:nomunge\\\";var i=[],n=$.resize=$.extend($.resize,{}),a,r=false,s=\\\"setTimeout\\\",u=\\\"resize\\\",m=u+\\\"-special-event\\\",o=\\\"pendingDelay\\\",l=\\\"activeDelay\\\",f=\\\"throttleWindow\\\";n[o]=200;n[l]=20;n[f]=true;$.event.special[u]={setup:function(){if(!n[f]&&this[s]){return false}var e=$(this);i.push(this);e.data(m,{w:e.width(),h:e.height()});if(i.length===1){a=t;h()}},teardown:function(){if(!n[f]&&this[s]){return false}var e=$(this);for(var t=i.length-1;t>=0;t--){if(i[t]==this){i.splice(t,1);break}}e.removeData(m);if(!i.length){if(r){cancelAnimationFrame(a)}else{clearTimeout(a)}a=null}},add:function(e){if(!n[f]&&this[s]){return false}var i;function a(e,n,a){var r=$(this),s=r.data(m)||{};s.w=n!==t?n:r.width();s.h=a!==t?a:r.height();i.apply(this,arguments)}if($.isFunction(e)){i=e;return a}else{i=e.handler;e.handler=a}}};function h(t){if(r===true){r=t||1}for(var s=i.length-1;s>=0;s--){var l=$(i[s]);if(l[0]==e||l.is(\\\":visible\\\")){var f=l.width(),c=l.height(),d=l.data(m);if(d&&(f!==d.w||c!==d.h)){l.trigger(u,[d.w=f,d.h=c]);r=t||true}}else{d=l.data(m);d.w=0;d.h=0}}if(a!==null){if(r&&(t==null||t-r<1e3)){a=e.requestAnimationFrame(h)}else{a=setTimeout(h,n[o]);r=false}}}if(!e.requestAnimationFrame){e.requestAnimationFrame=function(){return e.webkitRequestAnimationFrame||e.mozRequestAnimationFrame||e.oRequestAnimationFrame||e.msRequestAnimationFrame||function(t,i){return e.setTimeout(function(){t((new Date).getTime())},n[l])}}()}if(!e.cancelAnimationFrame){e.cancelAnimationFrame=function(){return e.webkitCancelRequestAnimationFrame||e.mozCancelRequestAnimationFrame||e.oCancelRequestAnimationFrame||e.msCancelRequestAnimationFrame||clearTimeout}()}})(jQuery,this);\\n\\n(function ($) {\\n var options = { }; // no options\\n\\n function init(plot) {\\n function onResize() {\\n var placeholder = plot.getPlaceholder();\\n\\n // somebody might have hidden us and we can't plot\\n // when we don't have the dimensions\\n if (placeholder.width() == 0 || placeholder.height() == 0)\\n return;\\n\\n plot.resize();\\n plot.setupGrid();\\n plot.draw();\\n }\\n \\n function bindEvents(plot, eventHolder) {\\n plot.getPlaceholder().resize(onResize);\\n }\\n\\n function shutdown(plot, eventHolder) {\\n plot.getPlaceholder().unbind(\\\"resize\\\", onResize);\\n }\\n \\n plot.hooks.bindEvents.push(bindEvents);\\n plot.hooks.shutdown.push(shutdown);\\n }\\n \\n $.plot.plugins.push({\\n init: init,\\n options: options,\\n name: 'resize',\\n version: '1.0'\\n });\\n})(jQuery);\\n\"\n\n/***/ }),\n\n/***/ 2215:\n/***/ (function(module, exports, __webpack_require__) {\n\n__webpack_require__(3)(__webpack_require__(2216))\n\n/***/ }),\n\n/***/ 2216:\n/***/ (function(module, exports) {\n\nmodule.exports = \"/* Flot plugin for rendering pie charts.\\n\\nCopyright (c) 2007-2014 IOLA and Ole Laursen.\\nLicensed under the MIT license.\\n\\nThe plugin assumes that each series has a single data value, and that each\\nvalue is a positive integer or zero. Negative numbers don't make sense for a\\npie chart, and have unpredictable results. The values do NOT need to be\\npassed in as percentages; the plugin will calculate the total and per-slice\\npercentages internally.\\n\\n* Created by Brian Medendorp\\n\\n* Updated with contributions from btburnett3, Anthony Aragues and Xavi Ivars\\n\\nThe plugin supports these options:\\n\\n\\tseries: {\\n\\t\\tpie: {\\n\\t\\t\\tshow: true/false\\n\\t\\t\\tradius: 0-1 for percentage of fullsize, or a specified pixel length, or 'auto'\\n\\t\\t\\tinnerRadius: 0-1 for percentage of fullsize or a specified pixel length, for creating a donut effect\\n\\t\\t\\tstartAngle: 0-2 factor of PI used for starting angle (in radians) i.e 3/2 starts at the top, 0 and 2 have the same result\\n\\t\\t\\ttilt: 0-1 for percentage to tilt the pie, where 1 is no tilt, and 0 is completely flat (nothing will show)\\n\\t\\t\\toffset: {\\n\\t\\t\\t\\ttop: integer value to move the pie up or down\\n\\t\\t\\t\\tleft: integer value to move the pie left or right, or 'auto'\\n\\t\\t\\t},\\n\\t\\t\\tstroke: {\\n\\t\\t\\t\\tcolor: any hexidecimal color value (other formats may or may not work, so best to stick with something like '#FFF')\\n\\t\\t\\t\\twidth: integer pixel width of the stroke\\n\\t\\t\\t},\\n\\t\\t\\tlabel: {\\n\\t\\t\\t\\tshow: true/false, or 'auto'\\n\\t\\t\\t\\tformatter: a user-defined function that modifies the text/style of the label text\\n\\t\\t\\t\\tradius: 0-1 for percentage of fullsize, or a specified pixel length\\n\\t\\t\\t\\tbackground: {\\n\\t\\t\\t\\t\\tcolor: any hexidecimal color value (other formats may or may not work, so best to stick with something like '#000')\\n\\t\\t\\t\\t\\topacity: 0-1\\n\\t\\t\\t\\t},\\n\\t\\t\\t\\tthreshold: 0-1 for the percentage value at which to hide labels (if they're too small)\\n\\t\\t\\t},\\n\\t\\t\\tcombine: {\\n\\t\\t\\t\\tthreshold: 0-1 for the percentage value at which to combine slices (if they're too small)\\n\\t\\t\\t\\tcolor: any hexidecimal color value (other formats may or may not work, so best to stick with something like '#CCC'), if null, the plugin will automatically use the color of the first slice to be combined\\n\\t\\t\\t\\tlabel: any text value of what the combined slice should be labeled\\n\\t\\t\\t}\\n\\t\\t\\thighlight: {\\n\\t\\t\\t\\topacity: 0-1\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\nMore detail and specific examples can be found in the included HTML file.\\n\\n*/\\n\\n(function($) {\\n\\n\\t// Maximum redraw attempts when fitting labels within the plot\\n\\n\\tvar REDRAW_ATTEMPTS = 10;\\n\\n\\t// Factor by which to shrink the pie when fitting labels within the plot\\n\\n\\tvar REDRAW_SHRINK = 0.95;\\n\\n\\tfunction init(plot) {\\n\\n\\t\\tvar canvas = null,\\n\\t\\t\\ttarget = null,\\n\\t\\t\\toptions = null,\\n\\t\\t\\tmaxRadius = null,\\n\\t\\t\\tcenterLeft = null,\\n\\t\\t\\tcenterTop = null,\\n\\t\\t\\tprocessed = false,\\n\\t\\t\\tctx = null;\\n\\n\\t\\t// interactive variables\\n\\n\\t\\tvar highlights = [];\\n\\n\\t\\t// add hook to determine if pie plugin in enabled, and then perform necessary operations\\n\\n\\t\\tplot.hooks.processOptions.push(function(plot, options) {\\n\\t\\t\\tif (options.series.pie.show) {\\n\\n\\t\\t\\t\\toptions.grid.show = false;\\n\\n\\t\\t\\t\\t// set labels.show\\n\\n\\t\\t\\t\\tif (options.series.pie.label.show == \\\"auto\\\") {\\n\\t\\t\\t\\t\\tif (options.legend.show) {\\n\\t\\t\\t\\t\\t\\toptions.series.pie.label.show = false;\\n\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\toptions.series.pie.label.show = true;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t// set radius\\n\\n\\t\\t\\t\\tif (options.series.pie.radius == \\\"auto\\\") {\\n\\t\\t\\t\\t\\tif (options.series.pie.label.show) {\\n\\t\\t\\t\\t\\t\\toptions.series.pie.radius = 3/4;\\n\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\toptions.series.pie.radius = 1;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t// ensure sane tilt\\n\\n\\t\\t\\t\\tif (options.series.pie.tilt > 1) {\\n\\t\\t\\t\\t\\toptions.series.pie.tilt = 1;\\n\\t\\t\\t\\t} else if (options.series.pie.tilt < 0) {\\n\\t\\t\\t\\t\\toptions.series.pie.tilt = 0;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t});\\n\\n\\t\\tplot.hooks.bindEvents.push(function(plot, eventHolder) {\\n\\t\\t\\tvar options = plot.getOptions();\\n\\t\\t\\tif (options.series.pie.show) {\\n\\t\\t\\t\\tif (options.grid.hoverable) {\\n\\t\\t\\t\\t\\teventHolder.unbind(\\\"mousemove\\\").mousemove(onMouseMove);\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tif (options.grid.clickable) {\\n\\t\\t\\t\\t\\teventHolder.unbind(\\\"click\\\").click(onClick);\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t});\\n\\n\\t\\tplot.hooks.processDatapoints.push(function(plot, series, data, datapoints) {\\n\\t\\t\\tvar options = plot.getOptions();\\n\\t\\t\\tif (options.series.pie.show) {\\n\\t\\t\\t\\tprocessDatapoints(plot, series, data, datapoints);\\n\\t\\t\\t}\\n\\t\\t});\\n\\n\\t\\tplot.hooks.drawOverlay.push(function(plot, octx) {\\n\\t\\t\\tvar options = plot.getOptions();\\n\\t\\t\\tif (options.series.pie.show) {\\n\\t\\t\\t\\tdrawOverlay(plot, octx);\\n\\t\\t\\t}\\n\\t\\t});\\n\\n\\t\\tplot.hooks.draw.push(function(plot, newCtx) {\\n\\t\\t\\tvar options = plot.getOptions();\\n\\t\\t\\tif (options.series.pie.show) {\\n\\t\\t\\t\\tdraw(plot, newCtx);\\n\\t\\t\\t}\\n\\t\\t});\\n\\n\\t\\tfunction processDatapoints(plot, series, datapoints) {\\n\\t\\t\\tif (!processed)\\t{\\n\\t\\t\\t\\tprocessed = true;\\n\\t\\t\\t\\tcanvas = plot.getCanvas();\\n\\t\\t\\t\\ttarget = $(canvas).parent();\\n\\t\\t\\t\\toptions = plot.getOptions();\\n\\t\\t\\t\\tplot.setData(combine(plot.getData()));\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\tfunction combine(data) {\\n\\n\\t\\t\\tvar total = 0,\\n\\t\\t\\t\\tcombined = 0,\\n\\t\\t\\t\\tnumCombined = 0,\\n\\t\\t\\t\\tcolor = options.series.pie.combine.color,\\n\\t\\t\\t\\tnewdata = [];\\n\\n\\t\\t\\t// Fix up the raw data from Flot, ensuring the data is numeric\\n\\n\\t\\t\\tfor (var i = 0; i < data.length; ++i) {\\n\\n\\t\\t\\t\\tvar value = data[i].data;\\n\\n\\t\\t\\t\\t// If the data is an array, we'll assume that it's a standard\\n\\t\\t\\t\\t// Flot x-y pair, and are concerned only with the second value.\\n\\n\\t\\t\\t\\t// Note how we use the original array, rather than creating a\\n\\t\\t\\t\\t// new one; this is more efficient and preserves any extra data\\n\\t\\t\\t\\t// that the user may have stored in higher indexes.\\n\\n\\t\\t\\t\\tif ($.isArray(value) && value.length == 1) {\\n \\t\\t\\t\\tvalue = value[0];\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\tif ($.isArray(value)) {\\n\\t\\t\\t\\t\\t// Equivalent to $.isNumeric() but compatible with jQuery < 1.7\\n\\t\\t\\t\\t\\tif (!isNaN(parseFloat(value[1])) && isFinite(value[1])) {\\n\\t\\t\\t\\t\\t\\tvalue[1] = +value[1];\\n\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\tvalue[1] = 0;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t} else if (!isNaN(parseFloat(value)) && isFinite(value)) {\\n\\t\\t\\t\\t\\tvalue = [1, +value];\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\tvalue = [1, 0];\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\tdata[i].data = [value];\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Sum up all the slices, so we can calculate percentages for each\\n\\n\\t\\t\\tfor (var i = 0; i < data.length; ++i) {\\n\\t\\t\\t\\ttotal += data[i].data[0][1];\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Count the number of slices with percentages below the combine\\n\\t\\t\\t// threshold; if it turns out to be just one, we won't combine.\\n\\n\\t\\t\\tfor (var i = 0; i < data.length; ++i) {\\n\\t\\t\\t\\tvar value = data[i].data[0][1];\\n\\t\\t\\t\\tif (value / total <= options.series.pie.combine.threshold) {\\n\\t\\t\\t\\t\\tcombined += value;\\n\\t\\t\\t\\t\\tnumCombined++;\\n\\t\\t\\t\\t\\tif (!color) {\\n\\t\\t\\t\\t\\t\\tcolor = data[i].color;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\n\\t\\t\\tfor (var i = 0; i < data.length; ++i) {\\n\\t\\t\\t\\tvar value = data[i].data[0][1];\\n\\t\\t\\t\\tif (numCombined < 2 || value / total > options.series.pie.combine.threshold) {\\n\\t\\t\\t\\t\\tnewdata.push(\\n\\t\\t\\t\\t\\t\\t$.extend(data[i], { /* extend to allow keeping all other original data values\\n\\t\\t\\t\\t\\t\\t and using them e.g. in labelFormatter. */\\n\\t\\t\\t\\t\\t\\t\\tdata: [[1, value]],\\n\\t\\t\\t\\t\\t\\t\\tcolor: data[i].color,\\n\\t\\t\\t\\t\\t\\t\\tlabel: data[i].label,\\n\\t\\t\\t\\t\\t\\t\\tangle: value * Math.PI * 2 / total,\\n\\t\\t\\t\\t\\t\\t\\tpercent: value / (total / 100)\\n\\t\\t\\t\\t\\t\\t})\\n\\t\\t\\t\\t\\t);\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\n\\t\\t\\tif (numCombined > 1) {\\n\\t\\t\\t\\tnewdata.push({\\n\\t\\t\\t\\t\\tdata: [[1, combined]],\\n\\t\\t\\t\\t\\tcolor: color,\\n\\t\\t\\t\\t\\tlabel: options.series.pie.combine.label,\\n\\t\\t\\t\\t\\tangle: combined * Math.PI * 2 / total,\\n\\t\\t\\t\\t\\tpercent: combined / (total / 100)\\n\\t\\t\\t\\t});\\n\\t\\t\\t}\\n\\n\\t\\t\\treturn newdata;\\n\\t\\t}\\n\\n\\t\\tfunction draw(plot, newCtx) {\\n\\n\\t\\t\\tif (!target) {\\n\\t\\t\\t\\treturn; // if no series were passed\\n\\t\\t\\t}\\n\\n\\t\\t\\tvar canvasWidth = plot.getPlaceholder().width(),\\n\\t\\t\\t\\tcanvasHeight = plot.getPlaceholder().height(),\\n\\t\\t\\t\\tlegendWidth = target.children().filter(\\\".legend\\\").children().width() || 0;\\n\\n\\t\\t\\tctx = newCtx;\\n\\n\\t\\t\\t// WARNING: HACK! REWRITE THIS CODE AS SOON AS POSSIBLE!\\n\\n\\t\\t\\t// When combining smaller slices into an 'other' slice, we need to\\n\\t\\t\\t// add a new series. Since Flot gives plugins no way to modify the\\n\\t\\t\\t// list of series, the pie plugin uses a hack where the first call\\n\\t\\t\\t// to processDatapoints results in a call to setData with the new\\n\\t\\t\\t// list of series, then subsequent processDatapoints do nothing.\\n\\n\\t\\t\\t// The plugin-global 'processed' flag is used to control this hack;\\n\\t\\t\\t// it starts out false, and is set to true after the first call to\\n\\t\\t\\t// processDatapoints.\\n\\n\\t\\t\\t// Unfortunately this turns future setData calls into no-ops; they\\n\\t\\t\\t// call processDatapoints, the flag is true, and nothing happens.\\n\\n\\t\\t\\t// To fix this we'll set the flag back to false here in draw, when\\n\\t\\t\\t// all series have been processed, so the next sequence of calls to\\n\\t\\t\\t// processDatapoints once again starts out with a slice-combine.\\n\\t\\t\\t// This is really a hack; in 0.9 we need to give plugins a proper\\n\\t\\t\\t// way to modify series before any processing begins.\\n\\n\\t\\t\\tprocessed = false;\\n\\n\\t\\t\\t// calculate maximum radius and center point\\n\\n\\t\\t\\tmaxRadius = Math.min(canvasWidth, canvasHeight / options.series.pie.tilt) / 2;\\n\\t\\t\\tcenterTop = canvasHeight / 2 + options.series.pie.offset.top;\\n\\t\\t\\tcenterLeft = canvasWidth / 2;\\n\\n\\t\\t\\tif (options.series.pie.offset.left == \\\"auto\\\") {\\n\\t\\t\\t\\tif (options.legend.position.match(\\\"w\\\")) {\\n\\t\\t\\t\\t\\tcenterLeft += legendWidth / 2;\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\tcenterLeft -= legendWidth / 2;\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tif (centerLeft < maxRadius) {\\n\\t\\t\\t\\t\\tcenterLeft = maxRadius;\\n\\t\\t\\t\\t} else if (centerLeft > canvasWidth - maxRadius) {\\n\\t\\t\\t\\t\\tcenterLeft = canvasWidth - maxRadius;\\n\\t\\t\\t\\t}\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tcenterLeft += options.series.pie.offset.left;\\n\\t\\t\\t}\\n\\n\\t\\t\\tvar slices = plot.getData(),\\n\\t\\t\\t\\tattempts = 0;\\n\\n\\t\\t\\t// Keep shrinking the pie's radius until drawPie returns true,\\n\\t\\t\\t// indicating that all the labels fit, or we try too many times.\\n\\n\\t\\t\\tdo {\\n\\t\\t\\t\\tif (attempts > 0) {\\n\\t\\t\\t\\t\\tmaxRadius *= REDRAW_SHRINK;\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tattempts += 1;\\n\\t\\t\\t\\tclear();\\n\\t\\t\\t\\tif (options.series.pie.tilt <= 0.8) {\\n\\t\\t\\t\\t\\tdrawShadow();\\n\\t\\t\\t\\t}\\n\\t\\t\\t} while (!drawPie() && attempts < REDRAW_ATTEMPTS)\\n\\n\\t\\t\\tif (attempts >= REDRAW_ATTEMPTS) {\\n\\t\\t\\t\\tclear();\\n\\t\\t\\t\\ttarget.prepend(\\\"<div class='error'>Could not draw pie with labels contained inside canvas</div>\\\");\\n\\t\\t\\t}\\n\\n\\t\\t\\tif (plot.setSeries && plot.insertLegend) {\\n\\t\\t\\t\\tplot.setSeries(slices);\\n\\t\\t\\t\\tplot.insertLegend();\\n\\t\\t\\t}\\n\\n\\t\\t\\t// we're actually done at this point, just defining internal functions at this point\\n\\n\\t\\t\\tfunction clear() {\\n\\t\\t\\t\\tctx.clearRect(0, 0, canvasWidth, canvasHeight);\\n\\t\\t\\t\\ttarget.children().filter(\\\".pieLabel, .pieLabelBackground\\\").remove();\\n\\t\\t\\t}\\n\\n\\t\\t\\tfunction drawShadow() {\\n\\n\\t\\t\\t\\tvar shadowLeft = options.series.pie.shadow.left;\\n\\t\\t\\t\\tvar shadowTop = options.series.pie.shadow.top;\\n\\t\\t\\t\\tvar edge = 10;\\n\\t\\t\\t\\tvar alpha = options.series.pie.shadow.alpha;\\n\\t\\t\\t\\tvar radius = options.series.pie.radius > 1 ? options.series.pie.radius : maxRadius * options.series.pie.radius;\\n\\n\\t\\t\\t\\tif (radius >= canvasWidth / 2 - shadowLeft || radius * options.series.pie.tilt >= canvasHeight / 2 - shadowTop || radius <= edge) {\\n\\t\\t\\t\\t\\treturn;\\t// shadow would be outside canvas, so don't draw it\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\tctx.save();\\n\\t\\t\\t\\tctx.translate(shadowLeft,shadowTop);\\n\\t\\t\\t\\tctx.globalAlpha = alpha;\\n\\t\\t\\t\\tctx.fillStyle = \\\"#000\\\";\\n\\n\\t\\t\\t\\t// center and rotate to starting position\\n\\n\\t\\t\\t\\tctx.translate(centerLeft,centerTop);\\n\\t\\t\\t\\tctx.scale(1, options.series.pie.tilt);\\n\\n\\t\\t\\t\\t//radius -= edge;\\n\\n\\t\\t\\t\\tfor (var i = 1; i <= edge; i++) {\\n\\t\\t\\t\\t\\tctx.beginPath();\\n\\t\\t\\t\\t\\tctx.arc(0, 0, radius, 0, Math.PI * 2, false);\\n\\t\\t\\t\\t\\tctx.fill();\\n\\t\\t\\t\\t\\tradius -= i;\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\tctx.restore();\\n\\t\\t\\t}\\n\\n\\t\\t\\tfunction drawPie() {\\n\\n\\t\\t\\t\\tvar startAngle = Math.PI * options.series.pie.startAngle;\\n\\t\\t\\t\\tvar radius = options.series.pie.radius > 1 ? options.series.pie.radius : maxRadius * options.series.pie.radius;\\n\\n\\t\\t\\t\\t// center and rotate to starting position\\n\\n\\t\\t\\t\\tctx.save();\\n\\t\\t\\t\\tctx.translate(centerLeft,centerTop);\\n\\t\\t\\t\\tctx.scale(1, options.series.pie.tilt);\\n\\t\\t\\t\\t//ctx.rotate(startAngle); // start at top; -- This doesn't work properly in Opera\\n\\n\\t\\t\\t\\t// draw slices\\n\\n\\t\\t\\t\\tctx.save();\\n\\t\\t\\t\\tvar currentAngle = startAngle;\\n\\t\\t\\t\\tfor (var i = 0; i < slices.length; ++i) {\\n\\t\\t\\t\\t\\tslices[i].startAngle = currentAngle;\\n\\t\\t\\t\\t\\tdrawSlice(slices[i].angle, slices[i].color, true);\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tctx.restore();\\n\\n\\t\\t\\t\\t// draw slice outlines\\n\\n\\t\\t\\t\\tif (options.series.pie.stroke.width > 0) {\\n\\t\\t\\t\\t\\tctx.save();\\n\\t\\t\\t\\t\\tctx.lineWidth = options.series.pie.stroke.width;\\n\\t\\t\\t\\t\\tcurrentAngle = startAngle;\\n\\t\\t\\t\\t\\tfor (var i = 0; i < slices.length; ++i) {\\n\\t\\t\\t\\t\\t\\tdrawSlice(slices[i].angle, options.series.pie.stroke.color, false);\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\tctx.restore();\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t// draw donut hole\\n\\n\\t\\t\\t\\tdrawDonutHole(ctx);\\n\\n\\t\\t\\t\\tctx.restore();\\n\\n\\t\\t\\t\\t// Draw the labels, returning true if they fit within the plot\\n\\n\\t\\t\\t\\tif (options.series.pie.label.show) {\\n\\t\\t\\t\\t\\treturn drawLabels();\\n\\t\\t\\t\\t} else return true;\\n\\n\\t\\t\\t\\tfunction drawSlice(angle, color, fill) {\\n\\n\\t\\t\\t\\t\\tif (angle <= 0 || isNaN(angle)) {\\n\\t\\t\\t\\t\\t\\treturn;\\n\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\tif (fill) {\\n\\t\\t\\t\\t\\t\\tctx.fillStyle = color;\\n\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\tctx.strokeStyle = color;\\n\\t\\t\\t\\t\\t\\tctx.lineJoin = \\\"round\\\";\\n\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\tctx.beginPath();\\n\\t\\t\\t\\t\\tif (Math.abs(angle - Math.PI * 2) > 0.000000001) {\\n\\t\\t\\t\\t\\t\\tctx.moveTo(0, 0); // Center of the pie\\n\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\t//ctx.arc(0, 0, radius, 0, angle, false); // This doesn't work properly in Opera\\n\\t\\t\\t\\t\\tctx.arc(0, 0, radius,currentAngle, currentAngle + angle / 2, false);\\n\\t\\t\\t\\t\\tctx.arc(0, 0, radius,currentAngle + angle / 2, currentAngle + angle, false);\\n\\t\\t\\t\\t\\tctx.closePath();\\n\\t\\t\\t\\t\\t//ctx.rotate(angle); // This doesn't work properly in Opera\\n\\t\\t\\t\\t\\tcurrentAngle += angle;\\n\\n\\t\\t\\t\\t\\tif (fill) {\\n\\t\\t\\t\\t\\t\\tctx.fill();\\n\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\tctx.stroke();\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\tfunction drawLabels() {\\n\\n\\t\\t\\t\\t\\tvar currentAngle = startAngle;\\n\\t\\t\\t\\t\\tvar radius = options.series.pie.label.radius > 1 ? options.series.pie.label.radius : maxRadius * options.series.pie.label.radius;\\n\\n\\t\\t\\t\\t\\tfor (var i = 0; i < slices.length; ++i) {\\n\\t\\t\\t\\t\\t\\tif (slices[i].percent >= options.series.pie.label.threshold * 100) {\\n\\t\\t\\t\\t\\t\\t\\tif (!drawLabel(slices[i], currentAngle, i)) {\\n\\t\\t\\t\\t\\t\\t\\t\\treturn false;\\n\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\tcurrentAngle += slices[i].angle;\\n\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\treturn true;\\n\\n\\t\\t\\t\\t\\tfunction drawLabel(slice, startAngle, index) {\\n\\n\\t\\t\\t\\t\\t\\tif (slice.data[0][1] == 0) {\\n\\t\\t\\t\\t\\t\\t\\treturn true;\\n\\t\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\t\\t// format label text\\n\\n\\t\\t\\t\\t\\t\\tvar lf = options.legend.labelFormatter, text, plf = options.series.pie.label.formatter;\\n\\n\\t\\t\\t\\t\\t\\tif (lf) {\\n\\t\\t\\t\\t\\t\\t\\ttext = lf(slice.label, slice);\\n\\t\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\t\\ttext = slice.label;\\n\\t\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\t\\tif (plf) {\\n\\t\\t\\t\\t\\t\\t\\ttext = plf(text, slice);\\n\\t\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\t\\tvar halfAngle = ((startAngle + slice.angle) + startAngle) / 2;\\n\\t\\t\\t\\t\\t\\tvar x = centerLeft + Math.round(Math.cos(halfAngle) * radius);\\n\\t\\t\\t\\t\\t\\tvar y = centerTop + Math.round(Math.sin(halfAngle) * radius) * options.series.pie.tilt;\\n\\n\\t\\t\\t\\t\\t\\tvar html = \\\"<span class='pieLabel' id='pieLabel\\\" + index + \\\"' style='position:absolute;top:\\\" + y + \\\"px;left:\\\" + x + \\\"px;'>\\\" + text + \\\"</span>\\\";\\n\\t\\t\\t\\t\\t\\ttarget.append(html);\\n\\n\\t\\t\\t\\t\\t\\tvar label = target.children(\\\"#pieLabel\\\" + index);\\n\\t\\t\\t\\t\\t\\tvar labelTop = (y - label.height() / 2);\\n\\t\\t\\t\\t\\t\\tvar labelLeft = (x - label.width() / 2);\\n\\n\\t\\t\\t\\t\\t\\tlabel.css(\\\"top\\\", labelTop);\\n\\t\\t\\t\\t\\t\\tlabel.css(\\\"left\\\", labelLeft);\\n\\n\\t\\t\\t\\t\\t\\t// check to make sure that the label is not outside the canvas\\n\\n\\t\\t\\t\\t\\t\\tif (0 - labelTop > 0 || 0 - labelLeft > 0 || canvasHeight - (labelTop + label.height()) < 0 || canvasWidth - (labelLeft + label.width()) < 0) {\\n\\t\\t\\t\\t\\t\\t\\treturn false;\\n\\t\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\t\\tif (options.series.pie.label.background.opacity != 0) {\\n\\n\\t\\t\\t\\t\\t\\t\\t// put in the transparent background separately to avoid blended labels and label boxes\\n\\n\\t\\t\\t\\t\\t\\t\\tvar c = options.series.pie.label.background.color;\\n\\n\\t\\t\\t\\t\\t\\t\\tif (c == null) {\\n\\t\\t\\t\\t\\t\\t\\t\\tc = slice.color;\\n\\t\\t\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\t\\t\\tvar pos = \\\"top:\\\" + labelTop + \\\"px;left:\\\" + labelLeft + \\\"px;\\\";\\n\\t\\t\\t\\t\\t\\t\\t$(\\\"<div class='pieLabelBackground' style='position:absolute;width:\\\" + label.width() + \\\"px;height:\\\" + label.height() + \\\"px;\\\" + pos + \\\"background-color:\\\" + c + \\\";'></div>\\\")\\n\\t\\t\\t\\t\\t\\t\\t\\t.css(\\\"opacity\\\", options.series.pie.label.background.opacity)\\n\\t\\t\\t\\t\\t\\t\\t\\t.insertBefore(label);\\n\\t\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\t\\treturn true;\\n\\t\\t\\t\\t\\t} // end individual label function\\n\\t\\t\\t\\t} // end drawLabels function\\n\\t\\t\\t} // end drawPie function\\n\\t\\t} // end draw function\\n\\n\\t\\t// Placed here because it needs to be accessed from multiple locations\\n\\n\\t\\tfunction drawDonutHole(layer) {\\n\\t\\t\\tif (options.series.pie.innerRadius > 0) {\\n\\n\\t\\t\\t\\t// subtract the center\\n\\n\\t\\t\\t\\tlayer.save();\\n\\t\\t\\t\\tvar innerRadius = options.series.pie.innerRadius > 1 ? options.series.pie.innerRadius : maxRadius * options.series.pie.innerRadius;\\n\\t\\t\\t\\tlayer.globalCompositeOperation = \\\"destination-out\\\"; // this does not work with excanvas, but it will fall back to using the stroke color\\n\\t\\t\\t\\tlayer.beginPath();\\n\\t\\t\\t\\tlayer.fillStyle = options.series.pie.stroke.color;\\n\\t\\t\\t\\tlayer.arc(0, 0, innerRadius, 0, Math.PI * 2, false);\\n\\t\\t\\t\\tlayer.fill();\\n\\t\\t\\t\\tlayer.closePath();\\n\\t\\t\\t\\tlayer.restore();\\n\\n\\t\\t\\t\\t// add inner stroke\\n\\n\\t\\t\\t\\tlayer.save();\\n\\t\\t\\t\\tlayer.beginPath();\\n\\t\\t\\t\\tlayer.strokeStyle = options.series.pie.stroke.color;\\n\\t\\t\\t\\tlayer.arc(0, 0, innerRadius, 0, Math.PI * 2, false);\\n\\t\\t\\t\\tlayer.stroke();\\n\\t\\t\\t\\tlayer.closePath();\\n\\t\\t\\t\\tlayer.restore();\\n\\n\\t\\t\\t\\t// TODO: add extra shadow inside hole (with a mask) if the pie is tilted.\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t//-- Additional Interactive related functions --\\n\\n\\t\\tfunction isPointInPoly(poly, pt) {\\n\\t\\t\\tfor(var c = false, i = -1, l = poly.length, j = l - 1; ++i < l; j = i)\\n\\t\\t\\t\\t((poly[i][1] <= pt[1] && pt[1] < poly[j][1]) || (poly[j][1] <= pt[1] && pt[1]< poly[i][1]))\\n\\t\\t\\t\\t&& (pt[0] < (poly[j][0] - poly[i][0]) * (pt[1] - poly[i][1]) / (poly[j][1] - poly[i][1]) + poly[i][0])\\n\\t\\t\\t\\t&& (c = !c);\\n\\t\\t\\treturn c;\\n\\t\\t}\\n\\n\\t\\tfunction findNearbySlice(mouseX, mouseY) {\\n\\n\\t\\t\\tvar slices = plot.getData(),\\n\\t\\t\\t\\toptions = plot.getOptions(),\\n\\t\\t\\t\\tradius = options.series.pie.radius > 1 ? options.series.pie.radius : maxRadius * options.series.pie.radius,\\n\\t\\t\\t\\tx, y;\\n\\n\\t\\t\\tfor (var i = 0; i < slices.length; ++i) {\\n\\n\\t\\t\\t\\tvar s = slices[i];\\n\\n\\t\\t\\t\\tif (s.pie.show) {\\n\\n\\t\\t\\t\\t\\tctx.save();\\n\\t\\t\\t\\t\\tctx.beginPath();\\n\\t\\t\\t\\t\\tctx.moveTo(0, 0); // Center of the pie\\n\\t\\t\\t\\t\\t//ctx.scale(1, options.series.pie.tilt);\\t// this actually seems to break everything when here.\\n\\t\\t\\t\\t\\tctx.arc(0, 0, radius, s.startAngle, s.startAngle + s.angle / 2, false);\\n\\t\\t\\t\\t\\tctx.arc(0, 0, radius, s.startAngle + s.angle / 2, s.startAngle + s.angle, false);\\n\\t\\t\\t\\t\\tctx.closePath();\\n\\t\\t\\t\\t\\tx = mouseX - centerLeft;\\n\\t\\t\\t\\t\\ty = mouseY - centerTop;\\n\\n\\t\\t\\t\\t\\tif (ctx.isPointInPath) {\\n\\t\\t\\t\\t\\t\\tif (ctx.isPointInPath(mouseX - centerLeft, mouseY - centerTop)) {\\n\\t\\t\\t\\t\\t\\t\\tctx.restore();\\n\\t\\t\\t\\t\\t\\t\\treturn {\\n\\t\\t\\t\\t\\t\\t\\t\\tdatapoint: [s.percent, s.data],\\n\\t\\t\\t\\t\\t\\t\\t\\tdataIndex: 0,\\n\\t\\t\\t\\t\\t\\t\\t\\tseries: s,\\n\\t\\t\\t\\t\\t\\t\\t\\tseriesIndex: i\\n\\t\\t\\t\\t\\t\\t\\t};\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t} else {\\n\\n\\t\\t\\t\\t\\t\\t// excanvas for IE doesn;t support isPointInPath, this is a workaround.\\n\\n\\t\\t\\t\\t\\t\\tvar p1X = radius * Math.cos(s.startAngle),\\n\\t\\t\\t\\t\\t\\t\\tp1Y = radius * Math.sin(s.startAngle),\\n\\t\\t\\t\\t\\t\\t\\tp2X = radius * Math.cos(s.startAngle + s.angle / 4),\\n\\t\\t\\t\\t\\t\\t\\tp2Y = radius * Math.sin(s.startAngle + s.angle / 4),\\n\\t\\t\\t\\t\\t\\t\\tp3X = radius * Math.cos(s.startAngle + s.angle / 2),\\n\\t\\t\\t\\t\\t\\t\\tp3Y = radius * Math.sin(s.startAngle + s.angle / 2),\\n\\t\\t\\t\\t\\t\\t\\tp4X = radius * Math.cos(s.startAngle + s.angle / 1.5),\\n\\t\\t\\t\\t\\t\\t\\tp4Y = radius * Math.sin(s.startAngle + s.angle / 1.5),\\n\\t\\t\\t\\t\\t\\t\\tp5X = radius * Math.cos(s.startAngle + s.angle),\\n\\t\\t\\t\\t\\t\\t\\tp5Y = radius * Math.sin(s.startAngle + s.angle),\\n\\t\\t\\t\\t\\t\\t\\tarrPoly = [[0, 0], [p1X, p1Y], [p2X, p2Y], [p3X, p3Y], [p4X, p4Y], [p5X, p5Y]],\\n\\t\\t\\t\\t\\t\\t\\tarrPoint = [x, y];\\n\\n\\t\\t\\t\\t\\t\\t// TODO: perhaps do some mathmatical trickery here with the Y-coordinate to compensate for pie tilt?\\n\\n\\t\\t\\t\\t\\t\\tif (isPointInPoly(arrPoly, arrPoint)) {\\n\\t\\t\\t\\t\\t\\t\\tctx.restore();\\n\\t\\t\\t\\t\\t\\t\\treturn {\\n\\t\\t\\t\\t\\t\\t\\t\\tdatapoint: [s.percent, s.data],\\n\\t\\t\\t\\t\\t\\t\\t\\tdataIndex: 0,\\n\\t\\t\\t\\t\\t\\t\\t\\tseries: s,\\n\\t\\t\\t\\t\\t\\t\\t\\tseriesIndex: i\\n\\t\\t\\t\\t\\t\\t\\t};\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\tctx.restore();\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\n\\t\\t\\treturn null;\\n\\t\\t}\\n\\n\\t\\tfunction onMouseMove(e) {\\n\\t\\t\\ttriggerClickHoverEvent(\\\"plothover\\\", e);\\n\\t\\t}\\n\\n\\t\\tfunction onClick(e) {\\n\\t\\t\\ttriggerClickHoverEvent(\\\"plotclick\\\", e);\\n\\t\\t}\\n\\n\\t\\t// trigger click or hover event (they send the same parameters so we share their code)\\n\\n\\t\\tfunction triggerClickHoverEvent(eventname, e) {\\n\\n\\t\\t\\tvar offset = plot.offset();\\n\\t\\t\\tvar canvasX = parseInt(e.pageX - offset.left);\\n\\t\\t\\tvar canvasY = parseInt(e.pageY - offset.top);\\n\\t\\t\\tvar item = findNearbySlice(canvasX, canvasY);\\n\\n\\t\\t\\tif (options.grid.autoHighlight) {\\n\\n\\t\\t\\t\\t// clear auto-highlights\\n\\n\\t\\t\\t\\tfor (var i = 0; i < highlights.length; ++i) {\\n\\t\\t\\t\\t\\tvar h = highlights[i];\\n\\t\\t\\t\\t\\tif (h.auto == eventname && !(item && h.series == item.series)) {\\n\\t\\t\\t\\t\\t\\tunhighlight(h.series);\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\n\\t\\t\\t// highlight the slice\\n\\n\\t\\t\\tif (item) {\\n\\t\\t\\t\\thighlight(item.series, eventname);\\n\\t\\t\\t}\\n\\n\\t\\t\\t// trigger any hover bind events\\n\\n\\t\\t\\tvar pos = { pageX: e.pageX, pageY: e.pageY };\\n\\t\\t\\ttarget.trigger(eventname, [pos, item]);\\n\\t\\t}\\n\\n\\t\\tfunction highlight(s, auto) {\\n\\t\\t\\t//if (typeof s == \\\"number\\\") {\\n\\t\\t\\t//\\ts = series[s];\\n\\t\\t\\t//}\\n\\n\\t\\t\\tvar i = indexOfHighlight(s);\\n\\n\\t\\t\\tif (i == -1) {\\n\\t\\t\\t\\thighlights.push({ series: s, auto: auto });\\n\\t\\t\\t\\tplot.triggerRedrawOverlay();\\n\\t\\t\\t} else if (!auto) {\\n\\t\\t\\t\\thighlights[i].auto = false;\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\tfunction unhighlight(s) {\\n\\t\\t\\tif (s == null) {\\n\\t\\t\\t\\thighlights = [];\\n\\t\\t\\t\\tplot.triggerRedrawOverlay();\\n\\t\\t\\t}\\n\\n\\t\\t\\t//if (typeof s == \\\"number\\\") {\\n\\t\\t\\t//\\ts = series[s];\\n\\t\\t\\t//}\\n\\n\\t\\t\\tvar i = indexOfHighlight(s);\\n\\n\\t\\t\\tif (i != -1) {\\n\\t\\t\\t\\thighlights.splice(i, 1);\\n\\t\\t\\t\\tplot.triggerRedrawOverlay();\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\tfunction indexOfHighlight(s) {\\n\\t\\t\\tfor (var i = 0; i < highlights.length; ++i) {\\n\\t\\t\\t\\tvar h = highlights[i];\\n\\t\\t\\t\\tif (h.series == s)\\n\\t\\t\\t\\t\\treturn i;\\n\\t\\t\\t}\\n\\t\\t\\treturn -1;\\n\\t\\t}\\n\\n\\t\\tfunction drawOverlay(plot, octx) {\\n\\n\\t\\t\\tvar options = plot.getOptions();\\n\\n\\t\\t\\tvar radius = options.series.pie.radius > 1 ? options.series.pie.radius : maxRadius * options.series.pie.radius;\\n\\n\\t\\t\\toctx.save();\\n\\t\\t\\toctx.translate(centerLeft, centerTop);\\n\\t\\t\\toctx.scale(1, options.series.pie.tilt);\\n\\n\\t\\t\\tfor (var i = 0; i < highlights.length; ++i) {\\n\\t\\t\\t\\tdrawHighlight(highlights[i].series);\\n\\t\\t\\t}\\n\\n\\t\\t\\tdrawDonutHole(octx);\\n\\n\\t\\t\\toctx.restore();\\n\\n\\t\\t\\tfunction drawHighlight(series) {\\n\\n\\t\\t\\t\\tif (series.angle <= 0 || isNaN(series.angle)) {\\n\\t\\t\\t\\t\\treturn;\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t//octx.fillStyle = parseColor(options.series.pie.highlight.color).scale(null, null, null, options.series.pie.highlight.opacity).toString();\\n\\t\\t\\t\\toctx.fillStyle = \\\"rgba(255, 255, 255, \\\" + options.series.pie.highlight.opacity + \\\")\\\"; // this is temporary until we have access to parseColor\\n\\t\\t\\t\\toctx.beginPath();\\n\\t\\t\\t\\tif (Math.abs(series.angle - Math.PI * 2) > 0.000000001) {\\n\\t\\t\\t\\t\\toctx.moveTo(0, 0); // Center of the pie\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\toctx.arc(0, 0, radius, series.startAngle, series.startAngle + series.angle / 2, false);\\n\\t\\t\\t\\toctx.arc(0, 0, radius, series.startAngle + series.angle / 2, series.startAngle + series.angle, false);\\n\\t\\t\\t\\toctx.closePath();\\n\\t\\t\\t\\toctx.fill();\\n\\t\\t\\t}\\n\\t\\t}\\n\\t} // end init (plugin body)\\n\\n\\t// define pie specific options and their default values\\n\\n\\tvar options = {\\n\\t\\tseries: {\\n\\t\\t\\tpie: {\\n\\t\\t\\t\\tshow: false,\\n\\t\\t\\t\\tradius: \\\"auto\\\",\\t// actual radius of the visible pie (based on full calculated radius if <=1, or hard pixel value)\\n\\t\\t\\t\\tinnerRadius: 0, /* for donut */\\n\\t\\t\\t\\tstartAngle: 3/2,\\n\\t\\t\\t\\ttilt: 1,\\n\\t\\t\\t\\tshadow: {\\n\\t\\t\\t\\t\\tleft: 5,\\t// shadow left offset\\n\\t\\t\\t\\t\\ttop: 15,\\t// shadow top offset\\n\\t\\t\\t\\t\\talpha: 0.02\\t// shadow alpha\\n\\t\\t\\t\\t},\\n\\t\\t\\t\\toffset: {\\n\\t\\t\\t\\t\\ttop: 0,\\n\\t\\t\\t\\t\\tleft: \\\"auto\\\"\\n\\t\\t\\t\\t},\\n\\t\\t\\t\\tstroke: {\\n\\t\\t\\t\\t\\tcolor: \\\"#fff\\\",\\n\\t\\t\\t\\t\\twidth: 1\\n\\t\\t\\t\\t},\\n\\t\\t\\t\\tlabel: {\\n\\t\\t\\t\\t\\tshow: \\\"auto\\\",\\n\\t\\t\\t\\t\\tformatter: function(label, slice) {\\n\\t\\t\\t\\t\\t\\treturn \\\"<div style='font-size:x-small;text-align:center;padding:2px;color:\\\" + slice.color + \\\";'>\\\" + label + \\\"<br/>\\\" + Math.round(slice.percent) + \\\"%</div>\\\";\\n\\t\\t\\t\\t\\t},\\t// formatter function\\n\\t\\t\\t\\t\\tradius: 1,\\t// radius at which to place the labels (based on full calculated radius if <=1, or hard pixel value)\\n\\t\\t\\t\\t\\tbackground: {\\n\\t\\t\\t\\t\\t\\tcolor: null,\\n\\t\\t\\t\\t\\t\\topacity: 0\\n\\t\\t\\t\\t\\t},\\n\\t\\t\\t\\t\\tthreshold: 0\\t// percentage at which to hide the label (i.e. the slice is too narrow)\\n\\t\\t\\t\\t},\\n\\t\\t\\t\\tcombine: {\\n\\t\\t\\t\\t\\tthreshold: -1,\\t// percentage at which to combine little slices into one larger slice\\n\\t\\t\\t\\t\\tcolor: null,\\t// color to give the new slice (auto-generated if null)\\n\\t\\t\\t\\t\\tlabel: \\\"Other\\\"\\t// label to give the new slice\\n\\t\\t\\t\\t},\\n\\t\\t\\t\\thighlight: {\\n\\t\\t\\t\\t\\t//color: \\\"#fff\\\",\\t\\t// will add this functionality once parseColor is available\\n\\t\\t\\t\\t\\topacity: 0.5\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t};\\n\\n\\t$.plot.plugins.push({\\n\\t\\tinit: init,\\n\\t\\toptions: options,\\n\\t\\tname: \\\"pie\\\",\\n\\t\\tversion: \\\"1.1\\\"\\n\\t});\\n\\n})(jQuery);\\n\"\n\n/***/ }),\n\n/***/ 2217:\n/***/ (function(module, exports, __webpack_require__) {\n\n__webpack_require__(3)(__webpack_require__(2218))\n\n/***/ }),\n\n/***/ 2218:\n/***/ (function(module, exports) {\n\nmodule.exports = \"/* The MIT License\\r\\n\\r\\n Copyright (c) 2011 by Michael Zinsmaier and nergal.dev\\r\\n Copyright (c) 2012 by Thomas Ritou\\r\\n\\r\\n Permission is hereby granted, free of charge, to any person obtaining a copy\\r\\n of this software and associated documentation files (the \\\"Software\\\"), to deal\\r\\n in the Software without restriction, including without limitation the rights\\r\\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\\r\\n copies of the Software, and to permit persons to whom the Software is\\r\\n furnished to do so, subject to the following conditions:\\r\\n\\r\\n The above copyright notice and this permission notice shall be included in\\r\\n all copies or substantial portions of the Software.\\r\\n\\r\\n THE SOFTWARE IS PROVIDED \\\"AS IS\\\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\\r\\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\\r\\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\\r\\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\\r\\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\\r\\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\\r\\n THE SOFTWARE.\\r\\n */\\r\\n\\r\\n/*\\r\\n\\r\\n ____________________________________________________\\r\\n\\r\\n what it is:\\r\\n ____________________________________________________\\r\\n\\r\\n curvedLines is a plugin for flot, that tries to display lines in a smoother way.\\r\\n The plugin is based on nergal.dev's work https://code.google.com/p/flot/issues/detail?id=226\\r\\n and further extended with a mode that forces the min/max points of the curves to be on the\\r\\n points. Both modes are achieved through adding of more data points\\r\\n => 1) with large data sets you may get trouble\\r\\n => 2) if you want to display the points too, you have to plot them as 2nd data series over the lines\\r\\n\\r\\n && 3) consecutive x data points are not allowed to have the same value\\r\\n\\r\\n This is version 0.5 of curvedLines so it will probably not work in every case. However\\r\\n the basic form of use descirbed next works (:\\r\\n\\r\\n Feel free to further improve the code\\r\\n\\r\\n ____________________________________________________\\r\\n\\r\\n how to use it:\\r\\n ____________________________________________________\\r\\n\\r\\n var d1 = [[5,5],[7,3],[9,12]];\\r\\n\\r\\n var options = { series: { curvedLines: { active: true }}};\\r\\n\\r\\n $.plot($(\\\"#placeholder\\\"), [{data = d1, lines: { show: true}, curvedLines: {apply: true}}], options);\\r\\n\\r\\n _____________________________________________________\\r\\n\\r\\n options:\\r\\n _____________________________________________________\\r\\n\\r\\n active: bool true => plugin can be used\\r\\n apply: bool true => series will be drawn as curved line\\r\\n fit: bool true => forces the max,mins of the curve to be on the datapoints\\r\\n curvePointFactor int defines how many \\\"virtual\\\" points are used per \\\"real\\\" data point to\\r\\n emulate the curvedLines (points total = real points * curvePointFactor)\\r\\n fitPointDist: int defines the x axis distance of the additional two points that are used\\r\\n to enforce the min max condition.\\r\\n\\r\\n + line options (since v0.5 curved lines use flots line implementation for drawing\\r\\n => line options like fill, show ... are supported out of the box)\\r\\n\\r\\n */\\r\\n\\r\\n/*\\r\\n * v0.1 initial commit\\r\\n * v0.15 negative values should work now (outcommented a negative -> 0 hook hope it does no harm)\\r\\n * v0.2 added fill option (thanks to monemihir) and multi axis support (thanks to soewono effendi)\\r\\n * v0.3 improved saddle handling and added basic handling of Dates\\r\\n * v0.4 rewritten fill option (thomas ritou) mostly from original flot code (now fill between points rather than to graph bottom), corrected fill Opacity bug\\r\\n * v0.5 rewritten instead of implementing a own draw function CurvedLines is now based on the processDatapoints flot hook (credits go to thomas ritou).\\r\\n * \\t\\t This change breakes existing code however CurvedLines are now just many tiny straight lines to flot and therefore all flot lines options (like gradient fill,\\r\\n * \\t shadow) are now supported out of the box\\r\\n * v0.6 flot 0.8 compatibility and some bug fixes\\r\\n */\\r\\n\\r\\n(function($) {\\r\\n\\r\\n var options = {\\r\\n series : {\\r\\n curvedLines : {\\r\\n active : false,\\r\\n apply: false,\\r\\n fit : false,\\r\\n curvePointFactor : 20,\\r\\n fitPointDist : undefined\\r\\n }\\r\\n }\\r\\n };\\r\\n\\r\\n function init(plot) {\\r\\n\\r\\n plot.hooks.processOptions.push(processOptions);\\r\\n\\r\\n //if the plugin is active register processDatapoints method\\r\\n function processOptions(plot, options) {\\r\\n if (options.series.curvedLines.active) {\\r\\n plot.hooks.processDatapoints.unshift(processDatapoints);\\r\\n }\\r\\n }\\r\\n\\r\\n //only if the plugin is active\\r\\n function processDatapoints(plot, series, datapoints) {\\r\\n var nrPoints = datapoints.points.length / datapoints.pointsize;\\r\\n var EPSILON = 0.5; //pretty large epsilon but save\\r\\n\\r\\n if (series.curvedLines.apply == true && series.originSeries === undefined && nrPoints > (1 + EPSILON)) {\\r\\n if (series.lines.fill) {\\r\\n\\r\\n var pointsTop = calculateCurvePoints(datapoints, series.curvedLines, 1)\\r\\n ,pointsBottom = calculateCurvePoints(datapoints, series.curvedLines, 2); //flot makes sure for us that we've got a second y point if fill is true !\\r\\n\\r\\n //Merge top and bottom curve\\r\\n datapoints.pointsize = 3;\\r\\n datapoints.points = [];\\r\\n var j = 0;\\r\\n var k = 0;\\r\\n var i = 0;\\r\\n var ps = 2;\\r\\n while (i < pointsTop.length || j < pointsBottom.length) {\\r\\n if (pointsTop[i] == pointsBottom[j]) {\\r\\n datapoints.points[k] = pointsTop[i];\\r\\n datapoints.points[k + 1] = pointsTop[i + 1];\\r\\n datapoints.points[k + 2] = pointsBottom[j + 1];\\r\\n j += ps;\\r\\n i += ps;\\r\\n\\r\\n } else if (pointsTop[i] < pointsBottom[j]) {\\r\\n datapoints.points[k] = pointsTop[i];\\r\\n datapoints.points[k + 1] = pointsTop[i + 1];\\r\\n datapoints.points[k + 2] = k > 0 ? datapoints.points[k-1] : null;\\r\\n i += ps;\\r\\n } else {\\r\\n datapoints.points[k] = pointsBottom[j];\\r\\n datapoints.points[k + 1] = k > 1 ? datapoints.points[k-2] : null;\\r\\n datapoints.points[k + 2] = pointsBottom[j + 1];\\r\\n j += ps;\\r\\n }\\r\\n k += 3;\\r\\n }\\r\\n } else if (series.lines.lineWidth > 0) {\\r\\n datapoints.points = calculateCurvePoints(datapoints, series.curvedLines, 1);\\r\\n datapoints.pointsize = 2;\\r\\n }\\r\\n }\\r\\n }\\r\\n\\r\\n //no real idea whats going on here code mainly from https://code.google.com/p/flot/issues/detail?id=226\\r\\n //if fit option is selected additional datapoints get inserted before the curve calculations in nergal.dev s code.\\r\\n function calculateCurvePoints(datapoints, curvedLinesOptions, yPos) {\\r\\n\\r\\n var points = datapoints.points, ps = datapoints.pointsize;\\r\\n var num = curvedLinesOptions.curvePointFactor * (points.length / ps);\\r\\n\\r\\n var xdata = new Array;\\r\\n var ydata = new Array;\\r\\n\\r\\n var curX = -1;\\r\\n var curY = -1;\\r\\n var j = 0;\\r\\n\\r\\n if (curvedLinesOptions.fit) {\\r\\n //insert a point before and after the \\\"real\\\" data point to force the line\\r\\n //to have a max,min at the data point.\\r\\n\\r\\n var fpDist;\\r\\n if(typeof curvedLinesOptions.fitPointDist == 'undefined') {\\r\\n //estimate it\\r\\n var minX = points[0];\\r\\n var maxX = points[points.length-ps];\\r\\n fpDist = (maxX - minX) / (500 * 100); //x range / (estimated pixel length of placeholder * factor)\\r\\n } else {\\r\\n //use user defined value\\r\\n fpDist = curvedLinesOptions.fitPointDist;\\r\\n }\\r\\n\\r\\n for (var i = 0; i < points.length; i += ps) {\\r\\n\\r\\n var frontX;\\r\\n var backX;\\r\\n curX = i;\\r\\n curY = i + yPos;\\r\\n\\r\\n //add point X s\\r\\n frontX = points[curX] - fpDist;\\r\\n backX = points[curX] + fpDist;\\r\\n\\r\\n var factor = 2;\\r\\n while (frontX == points[curX] || backX == points[curX]) {\\r\\n //inside the ulp\\r\\n frontX = points[curX] - (fpDist * factor);\\r\\n backX = points[curX] + (fpDist * factor);\\r\\n factor++;\\r\\n }\\r\\n\\r\\n //add curve points\\r\\n xdata[j] = frontX;\\r\\n ydata[j] = points[curY];\\r\\n j++;\\r\\n\\r\\n xdata[j] = points[curX];\\r\\n ydata[j] = points[curY];\\r\\n j++;\\r\\n\\r\\n xdata[j] = backX;\\r\\n ydata[j] = points[curY];\\r\\n j++;\\r\\n }\\r\\n } else {\\r\\n //just use the datapoints\\r\\n for (var i = 0; i < points.length; i += ps) {\\r\\n curX = i;\\r\\n curY = i + yPos;\\r\\n\\r\\n xdata[j] = points[curX];\\r\\n ydata[j] = points[curY];\\r\\n j++;\\r\\n }\\r\\n }\\r\\n\\r\\n var n = xdata.length;\\r\\n\\r\\n var y2 = new Array();\\r\\n var delta = new Array();\\r\\n y2[0] = 0;\\r\\n y2[n - 1] = 0;\\r\\n delta[0] = 0;\\r\\n\\r\\n for (var i = 1; i < n - 1; ++i) {\\r\\n var d = (xdata[i + 1] - xdata[i - 1]);\\r\\n if (d == 0) {\\r\\n //point before current point and after current point need some space in between\\r\\n return [];\\r\\n }\\r\\n\\r\\n var s = (xdata[i] - xdata[i - 1]) / d;\\r\\n var p = s * y2[i - 1] + 2;\\r\\n y2[i] = (s - 1) / p;\\r\\n delta[i] = (ydata[i + 1] - ydata[i]) / (xdata[i + 1] - xdata[i]) - (ydata[i] - ydata[i - 1]) / (xdata[i] - xdata[i - 1]);\\r\\n delta[i] = (6 * delta[i] / (xdata[i + 1] - xdata[i - 1]) - s * delta[i - 1]) / p;\\r\\n }\\r\\n\\r\\n for (var j = n - 2; j >= 0; --j) {\\r\\n y2[j] = y2[j] * y2[j + 1] + delta[j];\\r\\n }\\r\\n\\r\\n // xmax - xmin / #points\\r\\n var step = (xdata[n - 1] - xdata[0]) / (num - 1);\\r\\n\\r\\n var xnew = new Array;\\r\\n var ynew = new Array;\\r\\n var result = new Array;\\r\\n\\r\\n xnew[0] = xdata[0];\\r\\n ynew[0] = ydata[0];\\r\\n\\r\\n result.push(xnew[0]);\\r\\n result.push(ynew[0]);\\r\\n\\r\\n for ( j = 1; j < num; ++j) {\\r\\n //new x point (sampling point for the created curve)\\r\\n xnew[j] = xnew[0] + j * step;\\r\\n\\r\\n var max = n - 1;\\r\\n var min = 0;\\r\\n\\r\\n while (max - min > 1) {\\r\\n var k = Math.round((max + min) / 2);\\r\\n if (xdata[k] > xnew[j]) {\\r\\n max = k;\\r\\n } else {\\r\\n min = k;\\r\\n }\\r\\n }\\r\\n\\r\\n //found point one to the left and one to the right of generated new point\\r\\n var h = (xdata[max] - xdata[min]);\\r\\n\\r\\n if (h == 0) {\\r\\n //similar to above two points from original x data need some space between them\\r\\n return [];\\r\\n }\\r\\n\\r\\n var a = (xdata[max] - xnew[j]) / h;\\r\\n var b = (xnew[j] - xdata[min]) / h;\\r\\n\\r\\n ynew[j] = a * ydata[min] + b * ydata[max] + ((a * a * a - a) * y2[min] + (b * b * b - b) * y2[max]) * (h * h) / 6;\\r\\n\\r\\n result.push(xnew[j]);\\r\\n result.push(ynew[j]);\\r\\n }\\r\\n\\r\\n return result;\\r\\n }\\r\\n\\r\\n }//end init\\r\\n\\r\\n $.plot.plugins.push({\\r\\n init : init,\\r\\n options : options,\\r\\n name : 'curvedLines',\\r\\n version : '0.5'\\r\\n });\\r\\n\\r\\n})(jQuery);\\r\\n\"\n\n/***/ }),\n\n/***/ 2219:\n/***/ (function(module, exports, __webpack_require__) {\n\n__webpack_require__(3)(__webpack_require__(2220))\n\n/***/ }),\n\n/***/ 2220:\n/***/ (function(module, exports) {\n\nmodule.exports = \"// Generated by CoffeeScript 1.8.0\\nangular.module('angular-flot', []).directive('flot', function() {\\n return {\\n restrict: 'EA',\\n template: '<div></div>',\\n scope: {\\n dataset: '=',\\n options: '=',\\n callback: '='\\n },\\n link: function(scope, element, attributes) {\\n var height, init, onDatasetChanged, onOptionsChanged, plot, plotArea, width, _ref, _ref1;\\n plot = null;\\n width = attributes.width || '100%';\\n height = attributes.height || '100%';\\n if (((_ref = scope.options) != null ? (_ref1 = _ref.legend) != null ? _ref1.container : void 0 : void 0) instanceof jQuery) {\\n throw 'Please use a jQuery expression string with the \\\"legend.container\\\" option.';\\n }\\n if (!scope.dataset) {\\n scope.dataset = [];\\n }\\n if (!scope.options) {\\n scope.options = {\\n legend: {\\n show: false\\n }\\n };\\n }\\n plotArea = $(element.children()[0]);\\n plotArea.css({\\n width: width,\\n height: height\\n });\\n init = function() {\\n var plotObj;\\n plotObj = $.plot(plotArea, scope.dataset, scope.options);\\n if (scope.callback) {\\n scope.callback(plotObj);\\n }\\n return plotObj;\\n };\\n onDatasetChanged = function(dataset) {\\n if (plot) {\\n plot.setData(dataset);\\n plot.setupGrid();\\n return plot.draw();\\n } else {\\n return plot = init();\\n }\\n };\\n scope.$watch('dataset', onDatasetChanged, true);\\n onOptionsChanged = function() {\\n return plot = init();\\n };\\n return scope.$watch('options', onOptionsChanged, true);\\n }\\n };\\n});\\n\"\n\n/***/ }),\n\n/***/ 2221:\n/***/ (function(module, exports, __webpack_require__) {\n\n__webpack_require__(3)(__webpack_require__(2222))\n\n/***/ }),\n\n/***/ 2222:\n/***/ (function(module, exports) {\n\nmodule.exports = \"/**\\n * jVectorMap version 2.0.2\\n *\\n * Copyright 2011-2014, Kirill Lebedev\\n *\\n */\\n\\n(function( $ ){\\n var apiParams = {\\n set: {\\n colors: 1,\\n values: 1,\\n backgroundColor: 1,\\n scaleColors: 1,\\n normalizeFunction: 1,\\n focus: 1\\n },\\n get: {\\n selectedRegions: 1,\\n selectedMarkers: 1,\\n mapObject: 1,\\n regionName: 1\\n }\\n };\\n\\n $.fn.vectorMap = function(options) {\\n var map,\\n methodName,\\n map = this.children('.jvectormap-container').data('mapObject');\\n\\n if (options === 'addMap') {\\n jvm.Map.maps[arguments[1]] = arguments[2];\\n } else if ((options === 'set' || options === 'get') && apiParams[options][arguments[1]]) {\\n methodName = arguments[1].charAt(0).toUpperCase()+arguments[1].substr(1);\\n return map[options+methodName].apply(map, Array.prototype.slice.call(arguments, 2));\\n } else {\\n options = options || {};\\n options.container = this;\\n map = new jvm.Map(options);\\n }\\n\\n return this;\\n };\\n})( jQuery );\\n/*! Copyright (c) 2013 Brandon Aaron (http://brandon.aaron.sh)\\n * Licensed under the MIT License (LICENSE.txt).\\n *\\n * Version: 3.1.9\\n *\\n * Requires: jQuery 1.2.2+\\n */\\n\\n(function (factory) {\\n if ( typeof define === 'function' && define.amd ) {\\n // AMD. Register as an anonymous module.\\n define(['jquery'], factory);\\n } else if (typeof exports === 'object') {\\n // Node/CommonJS style for Browserify\\n module.exports = factory;\\n } else {\\n // Browser globals\\n factory(jQuery);\\n }\\n}(function ($) {\\n\\n var toFix = ['wheel', 'mousewheel', 'DOMMouseScroll', 'MozMousePixelScroll'],\\n toBind = ( 'onwheel' in document || document.documentMode >= 9 ) ?\\n ['wheel'] : ['mousewheel', 'DomMouseScroll', 'MozMousePixelScroll'],\\n slice = Array.prototype.slice,\\n nullLowestDeltaTimeout, lowestDelta;\\n\\n if ( $.event.fixHooks ) {\\n for ( var i = toFix.length; i; ) {\\n $.event.fixHooks[ toFix[--i] ] = $.event.mouseHooks;\\n }\\n }\\n\\n var special = $.event.special.mousewheel = {\\n version: '3.1.9',\\n\\n setup: function() {\\n if ( this.addEventListener ) {\\n for ( var i = toBind.length; i; ) {\\n this.addEventListener( toBind[--i], handler, false );\\n }\\n } else {\\n this.onmousewheel = handler;\\n }\\n // Store the line height and page height for this particular element\\n $.data(this, 'mousewheel-line-height', special.getLineHeight(this));\\n $.data(this, 'mousewheel-page-height', special.getPageHeight(this));\\n },\\n\\n teardown: function() {\\n if ( this.removeEventListener ) {\\n for ( var i = toBind.length; i; ) {\\n this.removeEventListener( toBind[--i], handler, false );\\n }\\n } else {\\n this.onmousewheel = null;\\n }\\n },\\n\\n getLineHeight: function(elem) {\\n return parseInt($(elem)['offsetParent' in $.fn ? 'offsetParent' : 'parent']().css('fontSize'), 10);\\n },\\n\\n getPageHeight: function(elem) {\\n return $(elem).height();\\n },\\n\\n settings: {\\n adjustOldDeltas: true\\n }\\n };\\n\\n $.fn.extend({\\n mousewheel: function(fn) {\\n return fn ? this.bind('mousewheel', fn) : this.trigger('mousewheel');\\n },\\n\\n unmousewheel: function(fn) {\\n return this.unbind('mousewheel', fn);\\n }\\n });\\n\\n\\n function handler(event) {\\n var orgEvent = event || window.event,\\n args = slice.call(arguments, 1),\\n delta = 0,\\n deltaX = 0,\\n deltaY = 0,\\n absDelta = 0;\\n event = $.event.fix(orgEvent);\\n event.type = 'mousewheel';\\n\\n // Old school scrollwheel delta\\n if ( 'detail' in orgEvent ) { deltaY = orgEvent.detail * -1; }\\n if ( 'wheelDelta' in orgEvent ) { deltaY = orgEvent.wheelDelta; }\\n if ( 'wheelDeltaY' in orgEvent ) { deltaY = orgEvent.wheelDeltaY; }\\n if ( 'wheelDeltaX' in orgEvent ) { deltaX = orgEvent.wheelDeltaX * -1; }\\n\\n // Firefox < 17 horizontal scrolling related to DOMMouseScroll event\\n if ( 'axis' in orgEvent && orgEvent.axis === orgEvent.HORIZONTAL_AXIS ) {\\n deltaX = deltaY * -1;\\n deltaY = 0;\\n }\\n\\n // Set delta to be deltaY or deltaX if deltaY is 0 for backwards compatabilitiy\\n delta = deltaY === 0 ? deltaX : deltaY;\\n\\n // New school wheel delta (wheel event)\\n if ( 'deltaY' in orgEvent ) {\\n deltaY = orgEvent.deltaY * -1;\\n delta = deltaY;\\n }\\n if ( 'deltaX' in orgEvent ) {\\n deltaX = orgEvent.deltaX;\\n if ( deltaY === 0 ) { delta = deltaX * -1; }\\n }\\n\\n // No change actually happened, no reason to go any further\\n if ( deltaY === 0 && deltaX === 0 ) { return; }\\n\\n // Need to convert lines and pages to pixels if we aren't already in pixels\\n // There are three delta modes:\\n // * deltaMode 0 is by pixels, nothing to do\\n // * deltaMode 1 is by lines\\n // * deltaMode 2 is by pages\\n if ( orgEvent.deltaMode === 1 ) {\\n var lineHeight = $.data(this, 'mousewheel-line-height');\\n delta *= lineHeight;\\n deltaY *= lineHeight;\\n deltaX *= lineHeight;\\n } else if ( orgEvent.deltaMode === 2 ) {\\n var pageHeight = $.data(this, 'mousewheel-page-height');\\n delta *= pageHeight;\\n deltaY *= pageHeight;\\n deltaX *= pageHeight;\\n }\\n\\n // Store lowest absolute delta to normalize the delta values\\n absDelta = Math.max( Math.abs(deltaY), Math.abs(deltaX) );\\n\\n if ( !lowestDelta || absDelta < lowestDelta ) {\\n lowestDelta = absDelta;\\n\\n // Adjust older deltas if necessary\\n if ( shouldAdjustOldDeltas(orgEvent, absDelta) ) {\\n lowestDelta /= 40;\\n }\\n }\\n\\n // Adjust older deltas if necessary\\n if ( shouldAdjustOldDeltas(orgEvent, absDelta) ) {\\n // Divide all the things by 40!\\n delta /= 40;\\n deltaX /= 40;\\n deltaY /= 40;\\n }\\n\\n // Get a whole, normalized value for the deltas\\n delta = Math[ delta >= 1 ? 'floor' : 'ceil' ](delta / lowestDelta);\\n deltaX = Math[ deltaX >= 1 ? 'floor' : 'ceil' ](deltaX / lowestDelta);\\n deltaY = Math[ deltaY >= 1 ? 'floor' : 'ceil' ](deltaY / lowestDelta);\\n\\n // Add information to the event object\\n event.deltaX = deltaX;\\n event.deltaY = deltaY;\\n event.deltaFactor = lowestDelta;\\n // Go ahead and set deltaMode to 0 since we converted to pixels\\n // Although this is a little odd since we overwrite the deltaX/Y\\n // properties with normalized deltas.\\n event.deltaMode = 0;\\n\\n // Add event and delta to the front of the arguments\\n args.unshift(event, delta, deltaX, deltaY);\\n\\n // Clearout lowestDelta after sometime to better\\n // handle multiple device types that give different\\n // a different lowestDelta\\n // Ex: trackpad = 3 and mouse wheel = 120\\n if (nullLowestDeltaTimeout) { clearTimeout(nullLowestDeltaTimeout); }\\n nullLowestDeltaTimeout = setTimeout(nullLowestDelta, 200);\\n\\n return ($.event.dispatch || $.event.handle).apply(this, args);\\n }\\n\\n function nullLowestDelta() {\\n lowestDelta = null;\\n }\\n\\n function shouldAdjustOldDeltas(orgEvent, absDelta) {\\n // If this is an older event and the delta is divisable by 120,\\n // then we are assuming that the browser is treating this as an\\n // older mouse wheel event and that we should divide the deltas\\n // by 40 to try and get a more usable deltaFactor.\\n // Side note, this actually impacts the reported scroll distance\\n // in older browsers and can cause scrolling to be slower than native.\\n // Turn this off by setting $.event.special.mousewheel.settings.adjustOldDeltas to false.\\n return special.settings.adjustOldDeltas && orgEvent.type === 'mousewheel' && absDelta % 120 === 0;\\n }\\n\\n}));/**\\n * @namespace jvm Holds core methods and classes used by jVectorMap.\\n */\\nvar jvm = {\\n\\n /**\\n * Inherits child's prototype from the parent's one.\\n * @param {Function} child\\n * @param {Function} parent\\n */\\n inherits: function(child, parent) {\\n function temp() {}\\n temp.prototype = parent.prototype;\\n child.prototype = new temp();\\n child.prototype.constructor = child;\\n child.parentClass = parent;\\n },\\n\\n /**\\n * Mixes in methods from the source constructor to the target one.\\n * @param {Function} target\\n * @param {Function} source\\n */\\n mixin: function(target, source){\\n var prop;\\n\\n for (prop in source.prototype) {\\n if (source.prototype.hasOwnProperty(prop)) {\\n target.prototype[prop] = source.prototype[prop];\\n }\\n }\\n },\\n\\n min: function(values){\\n var min = Number.MAX_VALUE,\\n i;\\n\\n if (values instanceof Array) {\\n for (i = 0; i < values.length; i++) {\\n if (values[i] < min) {\\n min = values[i];\\n }\\n }\\n } else {\\n for (i in values) {\\n if (values[i] < min) {\\n min = values[i];\\n }\\n }\\n }\\n return min;\\n },\\n\\n max: function(values){\\n var max = Number.MIN_VALUE,\\n i;\\n\\n if (values instanceof Array) {\\n for (i = 0; i < values.length; i++) {\\n if (values[i] > max) {\\n max = values[i];\\n }\\n }\\n } else {\\n for (i in values) {\\n if (values[i] > max) {\\n max = values[i];\\n }\\n }\\n }\\n return max;\\n },\\n\\n keys: function(object){\\n var keys = [],\\n key;\\n\\n for (key in object) {\\n keys.push(key);\\n }\\n return keys;\\n },\\n\\n values: function(object){\\n var values = [],\\n key,\\n i;\\n\\n for (i = 0; i < arguments.length; i++) {\\n object = arguments[i];\\n for (key in object) {\\n values.push(object[key]);\\n }\\n }\\n return values;\\n },\\n\\n whenImageLoaded: function(url){\\n var deferred = new jvm.$.Deferred(),\\n img = jvm.$('<img/>');\\n\\n img.error(function(){\\n deferred.reject();\\n }).load(function(){\\n deferred.resolve(img);\\n });\\n img.attr('src', url);\\n\\n return deferred;\\n },\\n\\n isImageUrl: function(s){\\n return /\\\\.\\\\w{3,4}$/.test(s);\\n }\\n};\\n\\njvm.$ = jQuery;\\n\\n/**\\n * indexOf polyfill for IE < 9\\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf\\n */\\nif (!Array.prototype.indexOf) {\\n Array.prototype.indexOf = function (searchElement, fromIndex) {\\n\\n var k;\\n\\n // 1. Let O be the result of calling ToObject passing\\n // the this value as the argument.\\n if (this == null) {\\n throw new TypeError('\\\"this\\\" is null or not defined');\\n }\\n\\n var O = Object(this);\\n\\n // 2. Let lenValue be the result of calling the Get\\n // internal method of O with the argument \\\"length\\\".\\n // 3. Let len be ToUint32(lenValue).\\n var len = O.length >>> 0;\\n\\n // 4. If len is 0, return -1.\\n if (len === 0) {\\n return -1;\\n }\\n\\n // 5. If argument fromIndex was passed let n be\\n // ToInteger(fromIndex); else let n be 0.\\n var n = +fromIndex || 0;\\n\\n if (Math.abs(n) === Infinity) {\\n n = 0;\\n }\\n\\n // 6. If n >= len, return -1.\\n if (n >= len) {\\n return -1;\\n }\\n\\n // 7. If n >= 0, then Let k be n.\\n // 8. Else, n<0, Let k be len - abs(n).\\n // If k is less than 0, then let k be 0.\\n k = Math.max(n >= 0 ? n : len - Math.abs(n), 0);\\n\\n // 9. Repeat, while k < len\\n while (k < len) {\\n // a. Let Pk be ToString(k).\\n // This is implicit for LHS operands of the in operator\\n // b. Let kPresent be the result of calling the\\n // HasProperty internal method of O with argument Pk.\\n // This step can be combined with c\\n // c. If kPresent is true, then\\n // i. Let elementK be the result of calling the Get\\n // internal method of O with the argument ToString(k).\\n // ii. Let same be the result of applying the\\n // Strict Equality Comparison Algorithm to\\n // searchElement and elementK.\\n // iii. If same is true, return k.\\n if (k in O && O[k] === searchElement) {\\n return k;\\n }\\n k++;\\n }\\n return -1;\\n };\\n}/**\\n * Basic wrapper for DOM element.\\n * @constructor\\n * @param {String} name Tag name of the element\\n * @param {Object} config Set of parameters to initialize element with\\n */\\njvm.AbstractElement = function(name, config){\\n /**\\n * Underlying DOM element\\n * @type {DOMElement}\\n * @private\\n */\\n this.node = this.createElement(name);\\n\\n /**\\n * Name of underlying element\\n * @type {String}\\n * @private\\n */\\n this.name = name;\\n\\n /**\\n * Internal store of attributes\\n * @type {Object}\\n * @private\\n */\\n this.properties = {};\\n\\n if (config) {\\n this.set(config);\\n }\\n};\\n\\n/**\\n * Set attribute of the underlying DOM element.\\n * @param {String} name Name of attribute\\n * @param {Number|String} config Set of parameters to initialize element with\\n */\\njvm.AbstractElement.prototype.set = function(property, value){\\n var key;\\n\\n if (typeof property === 'object') {\\n for (key in property) {\\n this.properties[key] = property[key];\\n this.applyAttr(key, property[key]);\\n }\\n } else {\\n this.properties[property] = value;\\n this.applyAttr(property, value);\\n }\\n};\\n\\n/**\\n * Returns value of attribute.\\n * @param {String} name Name of attribute\\n */\\njvm.AbstractElement.prototype.get = function(property){\\n return this.properties[property];\\n};\\n\\n/**\\n * Applies attribute value to the underlying DOM element.\\n * @param {String} name Name of attribute\\n * @param {Number|String} config Value of attribute to apply\\n * @private\\n */\\njvm.AbstractElement.prototype.applyAttr = function(property, value){\\n this.node.setAttribute(property, value);\\n};\\n\\njvm.AbstractElement.prototype.remove = function(){\\n jvm.$(this.node).remove();\\n};/**\\n * Implements abstract vector canvas.\\n * @constructor\\n * @param {HTMLElement} container Container to put element to.\\n * @param {Number} width Width of canvas.\\n * @param {Number} height Height of canvas.\\n */\\njvm.AbstractCanvasElement = function(container, width, height){\\n this.container = container;\\n this.setSize(width, height);\\n this.rootElement = new jvm[this.classPrefix+'GroupElement']();\\n this.node.appendChild( this.rootElement.node );\\n this.container.appendChild(this.node);\\n}\\n\\n/**\\n * Add element to the certain group inside of the canvas.\\n * @param {HTMLElement} element Element to add to canvas.\\n * @param {HTMLElement} group Group to add element into or into root group if not provided.\\n */\\njvm.AbstractCanvasElement.prototype.add = function(element, group){\\n group = group || this.rootElement;\\n group.add(element);\\n element.canvas = this;\\n}\\n\\n/**\\n * Create path and add it to the canvas.\\n * @param {Object} config Parameters of path to create.\\n * @param {Object} style Styles of the path to create.\\n * @param {HTMLElement} group Group to add path into.\\n */\\njvm.AbstractCanvasElement.prototype.addPath = function(config, style, group){\\n var el = new jvm[this.classPrefix+'PathElement'](config, style);\\n\\n this.add(el, group);\\n return el;\\n};\\n\\n/**\\n * Create circle and add it to the canvas.\\n * @param {Object} config Parameters of path to create.\\n * @param {Object} style Styles of the path to create.\\n * @param {HTMLElement} group Group to add circle into.\\n */\\njvm.AbstractCanvasElement.prototype.addCircle = function(config, style, group){\\n var el = new jvm[this.classPrefix+'CircleElement'](config, style);\\n\\n this.add(el, group);\\n return el;\\n};\\n\\n/**\\n * Create circle and add it to the canvas.\\n * @param {Object} config Parameters of path to create.\\n * @param {Object} style Styles of the path to create.\\n * @param {HTMLElement} group Group to add circle into.\\n */\\njvm.AbstractCanvasElement.prototype.addImage = function(config, style, group){\\n var el = new jvm[this.classPrefix+'ImageElement'](config, style);\\n\\n this.add(el, group);\\n return el;\\n};\\n\\n/**\\n * Create text and add it to the canvas.\\n * @param {Object} config Parameters of path to create.\\n * @param {Object} style Styles of the path to create.\\n * @param {HTMLElement} group Group to add circle into.\\n */\\njvm.AbstractCanvasElement.prototype.addText = function(config, style, group){\\n var el = new jvm[this.classPrefix+'TextElement'](config, style);\\n\\n this.add(el, group);\\n return el;\\n};\\n\\n/**\\n * Add group to the another group inside of the canvas.\\n * @param {HTMLElement} group Group to add circle into or root group if not provided.\\n */\\njvm.AbstractCanvasElement.prototype.addGroup = function(parentGroup){\\n var el = new jvm[this.classPrefix+'GroupElement']();\\n\\n if (parentGroup) {\\n parentGroup.node.appendChild(el.node);\\n } else {\\n this.node.appendChild(el.node);\\n }\\n el.canvas = this;\\n return el;\\n};/**\\n * Abstract shape element. Shape element represents some visual vector or raster object.\\n * @constructor\\n * @param {String} name Tag name of the element.\\n * @param {Object} config Set of parameters to initialize element with.\\n * @param {Object} style Object with styles to set on element initialization.\\n */\\njvm.AbstractShapeElement = function(name, config, style){\\n this.style = style || {};\\n this.style.current = this.style.current || {};\\n this.isHovered = false;\\n this.isSelected = false;\\n this.updateStyle();\\n};\\n\\n/**\\n * Set element's style.\\n * @param {Object|String} property Could be string to set only one property or object to set several style properties at once.\\n * @param {String} value Value to set in case only one property should be set.\\n */\\njvm.AbstractShapeElement.prototype.setStyle = function(property, value){\\n var styles = {};\\n\\n if (typeof property === 'object') {\\n styles = property;\\n } else {\\n styles[property] = value;\\n }\\n jvm.$.extend(this.style.current, styles);\\n this.updateStyle();\\n};\\n\\n\\njvm.AbstractShapeElement.prototype.updateStyle = function(){\\n var attrs = {};\\n\\n jvm.AbstractShapeElement.mergeStyles(attrs, this.style.initial);\\n jvm.AbstractShapeElement.mergeStyles(attrs, this.style.current);\\n if (this.isHovered) {\\n jvm.AbstractShapeElement.mergeStyles(attrs, this.style.hover);\\n }\\n if (this.isSelected) {\\n jvm.AbstractShapeElement.mergeStyles(attrs, this.style.selected);\\n if (this.isHovered) {\\n jvm.AbstractShapeElement.mergeStyles(attrs, this.style.selectedHover);\\n }\\n }\\n this.set(attrs);\\n};\\n\\njvm.AbstractShapeElement.mergeStyles = function(styles, newStyles){\\n var key;\\n\\n newStyles = newStyles || {};\\n for (key in newStyles) {\\n if (newStyles[key] === null) {\\n delete styles[key];\\n } else {\\n styles[key] = newStyles[key];\\n }\\n }\\n}/**\\n * Wrapper for SVG element.\\n * @constructor\\n * @extends jvm.AbstractElement\\n * @param {String} name Tag name of the element\\n * @param {Object} config Set of parameters to initialize element with\\n */\\n\\njvm.SVGElement = function(name, config){\\n jvm.SVGElement.parentClass.apply(this, arguments);\\n}\\n\\njvm.inherits(jvm.SVGElement, jvm.AbstractElement);\\n\\njvm.SVGElement.svgns = \\\"http://www.w3.org/2000/svg\\\";\\n\\n/**\\n * Creates DOM element.\\n * @param {String} tagName Name of element\\n * @private\\n * @returns DOMElement\\n */\\njvm.SVGElement.prototype.createElement = function( tagName ){\\n return document.createElementNS( jvm.SVGElement.svgns, tagName );\\n};\\n\\n/**\\n * Adds CSS class for underlying DOM element.\\n * @param {String} className Name of CSS class name\\n */\\njvm.SVGElement.prototype.addClass = function( className ){\\n this.node.setAttribute('class', className);\\n};\\n\\n/**\\n * Returns constructor for element by name prefixed with 'VML'.\\n * @param {String} ctr Name of basic constructor to return\\n * proper implementation for.\\n * @returns Function\\n * @private\\n */\\njvm.SVGElement.prototype.getElementCtr = function( ctr ){\\n return jvm['SVG'+ctr];\\n};\\n\\njvm.SVGElement.prototype.getBBox = function(){\\n return this.node.getBBox();\\n};jvm.SVGGroupElement = function(){\\n jvm.SVGGroupElement.parentClass.call(this, 'g');\\n}\\n\\njvm.inherits(jvm.SVGGroupElement, jvm.SVGElement);\\n\\njvm.SVGGroupElement.prototype.add = function(element){\\n this.node.appendChild( element.node );\\n};jvm.SVGCanvasElement = function(container, width, height){\\n this.classPrefix = 'SVG';\\n jvm.SVGCanvasElement.parentClass.call(this, 'svg');\\n\\n this.defsElement = new jvm.SVGElement('defs');\\n this.node.appendChild( this.defsElement.node );\\n\\n jvm.AbstractCanvasElement.apply(this, arguments);\\n}\\n\\njvm.inherits(jvm.SVGCanvasElement, jvm.SVGElement);\\njvm.mixin(jvm.SVGCanvasElement, jvm.AbstractCanvasElement);\\n\\njvm.SVGCanvasElement.prototype.setSize = function(width, height){\\n this.width = width;\\n this.height = height;\\n this.node.setAttribute('width', width);\\n this.node.setAttribute('height', height);\\n};\\n\\njvm.SVGCanvasElement.prototype.applyTransformParams = function(scale, transX, transY) {\\n this.scale = scale;\\n this.transX = transX;\\n this.transY = transY;\\n this.rootElement.node.setAttribute('transform', 'scale('+scale+') translate('+transX+', '+transY+')');\\n};jvm.SVGShapeElement = function(name, config, style){\\n jvm.SVGShapeElement.parentClass.call(this, name, config);\\n jvm.AbstractShapeElement.apply(this, arguments);\\n};\\n\\njvm.inherits(jvm.SVGShapeElement, jvm.SVGElement);\\njvm.mixin(jvm.SVGShapeElement, jvm.AbstractShapeElement);\\n\\njvm.SVGShapeElement.prototype.applyAttr = function(attr, value){\\n var patternEl,\\n imageEl,\\n that = this;\\n\\n if (attr === 'fill' && jvm.isImageUrl(value)) {\\n if (!jvm.SVGShapeElement.images[value]) {\\n jvm.whenImageLoaded(value).then(function(img){\\n imageEl = new jvm.SVGElement('image');\\n imageEl.node.setAttributeNS('http://www.w3.org/1999/xlink', 'href', value);\\n imageEl.applyAttr('x', '0');\\n imageEl.applyAttr('y', '0');\\n imageEl.applyAttr('width', img[0].width);\\n imageEl.applyAttr('height', img[0].height);\\n\\n patternEl = new jvm.SVGElement('pattern');\\n patternEl.applyAttr('id', 'image'+jvm.SVGShapeElement.imageCounter);\\n patternEl.applyAttr('x', 0);\\n patternEl.applyAttr('y', 0);\\n patternEl.applyAttr('width', img[0].width / 2);\\n patternEl.applyAttr('height', img[0].height / 2);\\n patternEl.applyAttr('viewBox', '0 0 '+img[0].width+' '+img[0].height);\\n patternEl.applyAttr('patternUnits', 'userSpaceOnUse');\\n patternEl.node.appendChild( imageEl.node );\\n\\n that.canvas.defsElement.node.appendChild( patternEl.node );\\n\\n jvm.SVGShapeElement.images[value] = jvm.SVGShapeElement.imageCounter++;\\n\\n that.applyAttr('fill', 'url(#image'+jvm.SVGShapeElement.images[value]+')');\\n });\\n } else {\\n this.applyAttr('fill', 'url(#image'+jvm.SVGShapeElement.images[value]+')');\\n }\\n } else {\\n jvm.SVGShapeElement.parentClass.prototype.applyAttr.apply(this, arguments);\\n }\\n};\\n\\njvm.SVGShapeElement.imageCounter = 1;\\njvm.SVGShapeElement.images = {};jvm.SVGPathElement = function(config, style){\\n jvm.SVGPathElement.parentClass.call(this, 'path', config, style);\\n this.node.setAttribute('fill-rule', 'evenodd');\\n}\\n\\njvm.inherits(jvm.SVGPathElement, jvm.SVGShapeElement);jvm.SVGCircleElement = function(config, style){\\n jvm.SVGCircleElement.parentClass.call(this, 'circle', config, style);\\n};\\n\\njvm.inherits(jvm.SVGCircleElement, jvm.SVGShapeElement);jvm.SVGImageElement = function(config, style){\\n jvm.SVGImageElement.parentClass.call(this, 'image', config, style);\\n};\\n\\njvm.inherits(jvm.SVGImageElement, jvm.SVGShapeElement);\\n\\njvm.SVGImageElement.prototype.applyAttr = function(attr, value){\\n var that = this;\\n\\n if (attr == 'image') {\\n jvm.whenImageLoaded(value).then(function(img){\\n that.node.setAttributeNS('http://www.w3.org/1999/xlink', 'href', value);\\n that.width = img[0].width;\\n that.height = img[0].height;\\n that.applyAttr('width', that.width);\\n that.applyAttr('height', that.height);\\n\\n that.applyAttr('x', that.cx - that.width / 2);\\n that.applyAttr('y', that.cy - that.height / 2);\\n\\n jvm.$(that.node).trigger('imageloaded', [img]);\\n });\\n } else if(attr == 'cx') {\\n this.cx = value;\\n if (this.width) {\\n this.applyAttr('x', value - this.width / 2);\\n }\\n } else if(attr == 'cy') {\\n this.cy = value;\\n if (this.height) {\\n this.applyAttr('y', value - this.height / 2);\\n }\\n } else {\\n jvm.SVGImageElement.parentClass.prototype.applyAttr.apply(this, arguments);\\n }\\n};jvm.SVGTextElement = function(config, style){\\n jvm.SVGTextElement.parentClass.call(this, 'text', config, style);\\n}\\n\\njvm.inherits(jvm.SVGTextElement, jvm.SVGShapeElement);\\n\\njvm.SVGTextElement.prototype.applyAttr = function(attr, value){\\n if (attr === 'text') {\\n this.node.textContent = value;\\n } else {\\n jvm.SVGTextElement.parentClass.prototype.applyAttr.apply(this, arguments);\\n }\\n};/**\\n * Wrapper for VML element.\\n * @constructor\\n * @extends jvm.AbstractElement\\n * @param {String} name Tag name of the element\\n * @param {Object} config Set of parameters to initialize element with\\n */\\n\\njvm.VMLElement = function(name, config){\\n if (!jvm.VMLElement.VMLInitialized) {\\n jvm.VMLElement.initializeVML();\\n }\\n\\n jvm.VMLElement.parentClass.apply(this, arguments);\\n};\\n\\njvm.inherits(jvm.VMLElement, jvm.AbstractElement);\\n\\n/**\\n * Shows if VML was already initialized for the current document or not.\\n * @static\\n * @private\\n * @type {Boolean}\\n */\\njvm.VMLElement.VMLInitialized = false;\\n\\n/**\\n * Initializes VML handling before creating the first element\\n * (adds CSS class and creates namespace). Adds one of two forms\\n * of createElement method depending of support by browser.\\n * @static\\n * @private\\n */\\n\\n // The following method of VML handling is borrowed from the\\n // Raphael library by Dmitry Baranovsky.\\n\\njvm.VMLElement.initializeVML = function(){\\n try {\\n if (!document.namespaces.rvml) {\\n document.namespaces.add(\\\"rvml\\\",\\\"urn:schemas-microsoft-com:vml\\\");\\n }\\n /**\\n * Creates DOM element.\\n * @param {String} tagName Name of element\\n * @private\\n * @returns DOMElement\\n */\\n jvm.VMLElement.prototype.createElement = function (tagName) {\\n return document.createElement('<rvml:' + tagName + ' class=\\\"rvml\\\">');\\n };\\n } catch (e) {\\n /**\\n * @private\\n */\\n jvm.VMLElement.prototype.createElement = function (tagName) {\\n return document.createElement('<' + tagName + ' xmlns=\\\"urn:schemas-microsoft.com:vml\\\" class=\\\"rvml\\\">');\\n };\\n }\\n document.createStyleSheet().addRule(\\\".rvml\\\", \\\"behavior:url(#default#VML)\\\");\\n jvm.VMLElement.VMLInitialized = true;\\n};\\n\\n/**\\n * Returns constructor for element by name prefixed with 'VML'.\\n * @param {String} ctr Name of basic constructor to return\\n * proper implementation for.\\n * @returns Function\\n * @private\\n */\\njvm.VMLElement.prototype.getElementCtr = function( ctr ){\\n return jvm['VML'+ctr];\\n};\\n\\n/**\\n * Adds CSS class for underlying DOM element.\\n * @param {String} className Name of CSS class name\\n */\\njvm.VMLElement.prototype.addClass = function( className ){\\n jvm.$(this.node).addClass(className);\\n};\\n\\n/**\\n * Applies attribute value to the underlying DOM element.\\n * @param {String} name Name of attribute\\n * @param {Number|String} config Value of attribute to apply\\n * @private\\n */\\njvm.VMLElement.prototype.applyAttr = function( attr, value ){\\n this.node[attr] = value;\\n};\\n\\n/**\\n * Returns boundary box for the element.\\n * @returns {Object} Boundary box with numeric fields: x, y, width, height\\n * @override\\n */\\njvm.VMLElement.prototype.getBBox = function(){\\n var node = jvm.$(this.node);\\n\\n return {\\n x: node.position().left / this.canvas.scale,\\n y: node.position().top / this.canvas.scale,\\n width: node.width() / this.canvas.scale,\\n height: node.height() / this.canvas.scale\\n };\\n};jvm.VMLGroupElement = function(){\\n jvm.VMLGroupElement.parentClass.call(this, 'group');\\n\\n this.node.style.left = '0px';\\n this.node.style.top = '0px';\\n this.node.coordorigin = \\\"0 0\\\";\\n};\\n\\njvm.inherits(jvm.VMLGroupElement, jvm.VMLElement);\\n\\njvm.VMLGroupElement.prototype.add = function(element){\\n this.node.appendChild( element.node );\\n};jvm.VMLCanvasElement = function(container, width, height){\\n this.classPrefix = 'VML';\\n jvm.VMLCanvasElement.parentClass.call(this, 'group');\\n jvm.AbstractCanvasElement.apply(this, arguments);\\n this.node.style.position = 'absolute';\\n};\\n\\njvm.inherits(jvm.VMLCanvasElement, jvm.VMLElement);\\njvm.mixin(jvm.VMLCanvasElement, jvm.AbstractCanvasElement);\\n\\njvm.VMLCanvasElement.prototype.setSize = function(width, height){\\n var paths,\\n groups,\\n i,\\n l;\\n\\n this.width = width;\\n this.height = height;\\n this.node.style.width = width + \\\"px\\\";\\n this.node.style.height = height + \\\"px\\\";\\n this.node.coordsize = width+' '+height;\\n this.node.coordorigin = \\\"0 0\\\";\\n if (this.rootElement) {\\n paths = this.rootElement.node.getElementsByTagName('shape');\\n for(i = 0, l = paths.length; i < l; i++) {\\n paths[i].coordsize = width+' '+height;\\n paths[i].style.width = width+'px';\\n paths[i].style.height = height+'px';\\n }\\n groups = this.node.getElementsByTagName('group');\\n for(i = 0, l = groups.length; i < l; i++) {\\n groups[i].coordsize = width+' '+height;\\n groups[i].style.width = width+'px';\\n groups[i].style.height = height+'px';\\n }\\n }\\n};\\n\\njvm.VMLCanvasElement.prototype.applyTransformParams = function(scale, transX, transY) {\\n this.scale = scale;\\n this.transX = transX;\\n this.transY = transY;\\n this.rootElement.node.coordorigin = (this.width-transX-this.width/100)+','+(this.height-transY-this.height/100);\\n this.rootElement.node.coordsize = this.width/scale+','+this.height/scale;\\n};jvm.VMLShapeElement = function(name, config){\\n jvm.VMLShapeElement.parentClass.call(this, name, config);\\n\\n this.fillElement = new jvm.VMLElement('fill');\\n this.strokeElement = new jvm.VMLElement('stroke');\\n this.node.appendChild(this.fillElement.node);\\n this.node.appendChild(this.strokeElement.node);\\n this.node.stroked = false;\\n\\n jvm.AbstractShapeElement.apply(this, arguments);\\n};\\n\\njvm.inherits(jvm.VMLShapeElement, jvm.VMLElement);\\njvm.mixin(jvm.VMLShapeElement, jvm.AbstractShapeElement);\\n\\njvm.VMLShapeElement.prototype.applyAttr = function(attr, value){\\n switch (attr) {\\n case 'fill':\\n this.node.fillcolor = value;\\n break;\\n case 'fill-opacity':\\n this.fillElement.node.opacity = Math.round(value*100)+'%';\\n break;\\n case 'stroke':\\n if (value === 'none') {\\n this.node.stroked = false;\\n } else {\\n this.node.stroked = true;\\n }\\n this.node.strokecolor = value;\\n break;\\n case 'stroke-opacity':\\n this.strokeElement.node.opacity = Math.round(value*100)+'%';\\n break;\\n case 'stroke-width':\\n if (parseInt(value, 10) === 0) {\\n this.node.stroked = false;\\n } else {\\n this.node.stroked = true;\\n }\\n this.node.strokeweight = value;\\n break;\\n case 'd':\\n this.node.path = jvm.VMLPathElement.pathSvgToVml(value);\\n break;\\n default:\\n jvm.VMLShapeElement.parentClass.prototype.applyAttr.apply(this, arguments);\\n }\\n};jvm.VMLPathElement = function(config, style){\\n var scale = new jvm.VMLElement('skew');\\n\\n jvm.VMLPathElement.parentClass.call(this, 'shape', config, style);\\n\\n this.node.coordorigin = \\\"0 0\\\";\\n\\n scale.node.on = true;\\n scale.node.matrix = '0.01,0,0,0.01,0,0';\\n scale.node.offset = '0,0';\\n\\n this.node.appendChild(scale.node);\\n};\\n\\njvm.inherits(jvm.VMLPathElement, jvm.VMLShapeElement);\\n\\njvm.VMLPathElement.prototype.applyAttr = function(attr, value){\\n if (attr === 'd') {\\n this.node.path = jvm.VMLPathElement.pathSvgToVml(value);\\n } else {\\n jvm.VMLShapeElement.prototype.applyAttr.call(this, attr, value);\\n }\\n};\\n\\njvm.VMLPathElement.pathSvgToVml = function(path) {\\n var cx = 0, cy = 0, ctrlx, ctrly;\\n\\n path = path.replace(/(-?\\\\d+)e(-?\\\\d+)/g, '0');\\n return path.replace(/([MmLlHhVvCcSs])\\\\s*((?:-?\\\\d*(?:\\\\.\\\\d+)?\\\\s*,?\\\\s*)+)/g, function(segment, letter, coords, index){\\n coords = coords.replace(/(\\\\d)-/g, '$1,-')\\n .replace(/^\\\\s+/g, '')\\n .replace(/\\\\s+$/g, '')\\n .replace(/\\\\s+/g, ',').split(',');\\n if (!coords[0]) coords.shift();\\n for (var i=0, l=coords.length; i<l; i++) {\\n coords[i] = Math.round(100*coords[i]);\\n }\\n switch (letter) {\\n case 'm':\\n cx += coords[0];\\n cy += coords[1];\\n return 't'+coords.join(',');\\n case 'M':\\n cx = coords[0];\\n cy = coords[1];\\n return 'm'+coords.join(',');\\n case 'l':\\n cx += coords[0];\\n cy += coords[1];\\n return 'r'+coords.join(',');\\n case 'L':\\n cx = coords[0];\\n cy = coords[1];\\n return 'l'+coords.join(',');\\n case 'h':\\n cx += coords[0];\\n return 'r'+coords[0]+',0';\\n case 'H':\\n cx = coords[0];\\n return 'l'+cx+','+cy;\\n case 'v':\\n cy += coords[0];\\n return 'r0,'+coords[0];\\n case 'V':\\n cy = coords[0];\\n return 'l'+cx+','+cy;\\n case 'c':\\n ctrlx = cx + coords[coords.length-4];\\n ctrly = cy + coords[coords.length-3];\\n cx += coords[coords.length-2];\\n cy += coords[coords.length-1];\\n return 'v'+coords.join(',');\\n case 'C':\\n ctrlx = coords[coords.length-4];\\n ctrly = coords[coords.length-3];\\n cx = coords[coords.length-2];\\n cy = coords[coords.length-1];\\n return 'c'+coords.join(',');\\n case 's':\\n coords.unshift(cy-ctrly);\\n coords.unshift(cx-ctrlx);\\n ctrlx = cx + coords[coords.length-4];\\n ctrly = cy + coords[coords.length-3];\\n cx += coords[coords.length-2];\\n cy += coords[coords.length-1];\\n return 'v'+coords.join(',');\\n case 'S':\\n coords.unshift(cy+cy-ctrly);\\n coords.unshift(cx+cx-ctrlx);\\n ctrlx = coords[coords.length-4];\\n ctrly = coords[coords.length-3];\\n cx = coords[coords.length-2];\\n cy = coords[coords.length-1];\\n return 'c'+coords.join(',');\\n }\\n return '';\\n }).replace(/z/g, 'e');\\n};jvm.VMLCircleElement = function(config, style){\\n jvm.VMLCircleElement.parentClass.call(this, 'oval', config, style);\\n};\\n\\njvm.inherits(jvm.VMLCircleElement, jvm.VMLShapeElement);\\n\\njvm.VMLCircleElement.prototype.applyAttr = function(attr, value){\\n switch (attr) {\\n case 'r':\\n this.node.style.width = value*2+'px';\\n this.node.style.height = value*2+'px';\\n this.applyAttr('cx', this.get('cx') || 0);\\n this.applyAttr('cy', this.get('cy') || 0);\\n break;\\n case 'cx':\\n if (!value) return;\\n this.node.style.left = value - (this.get('r') || 0) + 'px';\\n break;\\n case 'cy':\\n if (!value) return;\\n this.node.style.top = value - (this.get('r') || 0) + 'px';\\n break;\\n default:\\n jvm.VMLCircleElement.parentClass.prototype.applyAttr.call(this, attr, value);\\n }\\n};/**\\n * Class for vector images manipulations.\\n * @constructor\\n * @param {DOMElement} container to place canvas to\\n * @param {Number} width\\n * @param {Number} height\\n */\\njvm.VectorCanvas = function(container, width, height) {\\n this.mode = window.SVGAngle ? 'svg' : 'vml';\\n\\n if (this.mode == 'svg') {\\n this.impl = new jvm.SVGCanvasElement(container, width, height);\\n } else {\\n this.impl = new jvm.VMLCanvasElement(container, width, height);\\n }\\n this.impl.mode = this.mode;\\n return this.impl;\\n};jvm.SimpleScale = function(scale){\\n this.scale = scale;\\n};\\n\\njvm.SimpleScale.prototype.getValue = function(value){\\n return value;\\n};jvm.OrdinalScale = function(scale){\\n this.scale = scale;\\n};\\n\\njvm.OrdinalScale.prototype.getValue = function(value){\\n return this.scale[value];\\n};\\n\\njvm.OrdinalScale.prototype.getTicks = function(){\\n var ticks = [],\\n key;\\n\\n for (key in this.scale) {\\n ticks.push({\\n label: key,\\n value: this.scale[key]\\n });\\n }\\n\\n return ticks;\\n};jvm.NumericScale = function(scale, normalizeFunction, minValue, maxValue) {\\n this.scale = [];\\n\\n normalizeFunction = normalizeFunction || 'linear';\\n\\n if (scale) this.setScale(scale);\\n if (normalizeFunction) this.setNormalizeFunction(normalizeFunction);\\n if (typeof minValue !== 'undefined' ) this.setMin(minValue);\\n if (typeof maxValue !== 'undefined' ) this.setMax(maxValue);\\n};\\n\\njvm.NumericScale.prototype = {\\n setMin: function(min) {\\n this.clearMinValue = min;\\n if (typeof this.normalize === 'function') {\\n this.minValue = this.normalize(min);\\n } else {\\n this.minValue = min;\\n }\\n },\\n\\n setMax: function(max) {\\n this.clearMaxValue = max;\\n if (typeof this.normalize === 'function') {\\n this.maxValue = this.normalize(max);\\n } else {\\n this.maxValue = max;\\n }\\n },\\n\\n setScale: function(scale) {\\n var i;\\n\\n this.scale = [];\\n for (i = 0; i < scale.length; i++) {\\n this.scale[i] = [scale[i]];\\n }\\n },\\n\\n setNormalizeFunction: function(f) {\\n if (f === 'polynomial') {\\n this.normalize = function(value) {\\n return Math.pow(value, 0.2);\\n }\\n } else if (f === 'linear') {\\n delete this.normalize;\\n } else {\\n this.normalize = f;\\n }\\n this.setMin(this.clearMinValue);\\n this.setMax(this.clearMaxValue);\\n },\\n\\n getValue: function(value) {\\n var lengthes = [],\\n fullLength = 0,\\n l,\\n i = 0,\\n c;\\n\\n if (typeof this.normalize === 'function') {\\n value = this.normalize(value);\\n }\\n for (i = 0; i < this.scale.length-1; i++) {\\n l = this.vectorLength(this.vectorSubtract(this.scale[i+1], this.scale[i]));\\n lengthes.push(l);\\n fullLength += l;\\n }\\n\\n c = (this.maxValue - this.minValue) / fullLength;\\n for (i=0; i<lengthes.length; i++) {\\n lengthes[i] *= c;\\n }\\n\\n i = 0;\\n value -= this.minValue;\\n while (value - lengthes[i] >= 0) {\\n value -= lengthes[i];\\n i++;\\n }\\n\\n if (i == this.scale.length - 1) {\\n value = this.vectorToNum(this.scale[i])\\n } else {\\n value = (\\n this.vectorToNum(\\n this.vectorAdd(this.scale[i],\\n this.vectorMult(\\n this.vectorSubtract(this.scale[i+1], this.scale[i]),\\n (value) / (lengthes[i])\\n )\\n )\\n )\\n );\\n }\\n\\n return value;\\n },\\n\\n vectorToNum: function(vector) {\\n var num = 0,\\n i;\\n\\n for (i = 0; i < vector.length; i++) {\\n num += Math.round(vector[i])*Math.pow(256, vector.length-i-1);\\n }\\n return num;\\n },\\n\\n vectorSubtract: function(vector1, vector2) {\\n var vector = [],\\n i;\\n\\n for (i = 0; i < vector1.length; i++) {\\n vector[i] = vector1[i] - vector2[i];\\n }\\n return vector;\\n },\\n\\n vectorAdd: function(vector1, vector2) {\\n var vector = [],\\n i;\\n\\n for (i = 0; i < vector1.length; i++) {\\n vector[i] = vector1[i] + vector2[i];\\n }\\n return vector;\\n },\\n\\n vectorMult: function(vector, num) {\\n var result = [],\\n i;\\n\\n for (i = 0; i < vector.length; i++) {\\n result[i] = vector[i] * num;\\n }\\n return result;\\n },\\n\\n vectorLength: function(vector) {\\n var result = 0,\\n i;\\n for (i = 0; i < vector.length; i++) {\\n result += vector[i] * vector[i];\\n }\\n return Math.sqrt(result);\\n },\\n\\n /* Derived from d3 implementation https://github.com/mbostock/d3/blob/master/src/scale/linear.js#L94 */\\n getTicks: function(){\\n var m = 5,\\n extent = [this.clearMinValue, this.clearMaxValue],\\n span = extent[1] - extent[0],\\n step = Math.pow(10, Math.floor(Math.log(span / m) / Math.LN10)),\\n err = m / span * step,\\n ticks = [],\\n tick,\\n v;\\n\\n if (err <= .15) step *= 10;\\n else if (err <= .35) step *= 5;\\n else if (err <= .75) step *= 2;\\n\\n extent[0] = Math.floor(extent[0] / step) * step;\\n extent[1] = Math.ceil(extent[1] / step) * step;\\n\\n tick = extent[0];\\n while (tick <= extent[1]) {\\n if (tick == extent[0]) {\\n v = this.clearMinValue;\\n } else if (tick == extent[1]) {\\n v = this.clearMaxValue;\\n } else {\\n v = tick;\\n }\\n ticks.push({\\n label: tick,\\n value: this.getValue(v)\\n });\\n tick += step;\\n }\\n\\n return ticks;\\n }\\n};\\njvm.ColorScale = function(colors, normalizeFunction, minValue, maxValue) {\\n jvm.ColorScale.parentClass.apply(this, arguments);\\n}\\n\\njvm.inherits(jvm.ColorScale, jvm.NumericScale);\\n\\njvm.ColorScale.prototype.setScale = function(scale) {\\n var i;\\n\\n for (i = 0; i < scale.length; i++) {\\n this.scale[i] = jvm.ColorScale.rgbToArray(scale[i]);\\n }\\n};\\n\\njvm.ColorScale.prototype.getValue = function(value) {\\n return jvm.ColorScale.numToRgb(jvm.ColorScale.parentClass.prototype.getValue.call(this, value));\\n};\\n\\njvm.ColorScale.arrayToRgb = function(ar) {\\n var rgb = '#',\\n d,\\n i;\\n\\n for (i = 0; i < ar.length; i++) {\\n d = ar[i].toString(16);\\n rgb += d.length == 1 ? '0'+d : d;\\n }\\n return rgb;\\n};\\n\\njvm.ColorScale.numToRgb = function(num) {\\n num = num.toString(16);\\n\\n while (num.length < 6) {\\n num = '0' + num;\\n }\\n\\n return '#'+num;\\n};\\n\\njvm.ColorScale.rgbToArray = function(rgb) {\\n rgb = rgb.substr(1);\\n return [parseInt(rgb.substr(0, 2), 16), parseInt(rgb.substr(2, 2), 16), parseInt(rgb.substr(4, 2), 16)];\\n};/**\\n * Represents map legend.\\n * @constructor\\n * @param {Object} params Configuration parameters.\\n * @param {String} params.cssClass Additional CSS class to apply to legend element.\\n * @param {Boolean} params.vertical If <code>true</code> legend will be rendered as vertical.\\n * @param {String} params.title Legend title.\\n * @param {Function} params.labelRender Method to convert series values to legend labels.\\n */\\njvm.Legend = function(params) {\\n this.params = params || {};\\n this.map = this.params.map;\\n this.series = this.params.series;\\n this.body = jvm.$('<div/>');\\n this.body.addClass('jvectormap-legend');\\n if (this.params.cssClass) {\\n this.body.addClass(this.params.cssClass);\\n }\\n\\n if (params.vertical) {\\n this.map.legendCntVertical.append( this.body );\\n } else {\\n this.map.legendCntHorizontal.append( this.body );\\n }\\n\\n this.render();\\n}\\n\\njvm.Legend.prototype.render = function(){\\n var ticks = this.series.scale.getTicks(),\\n i,\\n inner = jvm.$('<div/>').addClass('jvectormap-legend-inner'),\\n tick,\\n sample,\\n label;\\n\\n this.body.html('');\\n if (this.params.title) {\\n this.body.append(\\n jvm.$('<div/>').addClass('jvectormap-legend-title').html(this.params.title)\\n );\\n }\\n this.body.append(inner);\\n\\n for (i = 0; i < ticks.length; i++) {\\n tick = jvm.$('<div/>').addClass('jvectormap-legend-tick');\\n sample = jvm.$('<div/>').addClass('jvectormap-legend-tick-sample');\\n\\n switch (this.series.params.attribute) {\\n case 'fill':\\n if (jvm.isImageUrl(ticks[i].value)) {\\n sample.css('background', 'url('+ticks[i].value+')');\\n } else {\\n sample.css('background', ticks[i].value);\\n }\\n break;\\n case 'stroke':\\n sample.css('background', ticks[i].value);\\n break;\\n case 'image':\\n sample.css('background', 'url('+ticks[i].value+') no-repeat center center');\\n break;\\n case 'r':\\n jvm.$('<div/>').css({\\n 'border-radius': ticks[i].value,\\n border: this.map.params.markerStyle.initial['stroke-width']+'px '+\\n this.map.params.markerStyle.initial['stroke']+' solid',\\n width: ticks[i].value * 2 + 'px',\\n height: ticks[i].value * 2 + 'px',\\n background: this.map.params.markerStyle.initial['fill']\\n }).appendTo(sample);\\n break;\\n }\\n tick.append( sample );\\n label = ticks[i].label;\\n if (this.params.labelRender) {\\n label = this.params.labelRender(label);\\n }\\n tick.append( jvm.$('<div>'+label+' </div>').addClass('jvectormap-legend-tick-text') );\\n inner.append(tick);\\n }\\n inner.append( jvm.$('<div/>').css('clear', 'both') );\\n}/**\\n * Creates data series.\\n * @constructor\\n * @param {Object} params Parameters to initialize series with.\\n * @param {Array} params.values The data set to visualize.\\n * @param {String} params.attribute Numberic or color attribute to use for data visualization. This could be: <code>fill</code>, <code>stroke</code>, <code>fill-opacity</code>, <code>stroke-opacity</code> for markers and regions and <code>r</code> (radius) for markers only.\\n * @param {Array} params.scale Values used to map a dimension of data to a visual representation. The first value sets visualization for minimum value from the data set and the last value sets visualization for the maximum value. There also could be intermidiate values. Default value is <code>['#C8EEFF', '#0071A4']</code>\\n * @param {Function|String} params.normalizeFunction The function used to map input values to the provided scale. This parameter could be provided as function or one of the strings: <code>'linear'</code> or <code>'polynomial'</code>, while <code>'linear'</code> is used by default. The function provided takes value from the data set as an input and returns corresponding value from the scale.\\n * @param {Number} params.min Minimum value of the data set. Could be calculated automatically if not provided.\\n * @param {Number} params.min Maximum value of the data set. Could be calculated automatically if not provided.\\n */\\njvm.DataSeries = function(params, elements, map) {\\n var scaleConstructor;\\n\\n params = params || {};\\n params.attribute = params.attribute || 'fill';\\n\\n this.elements = elements;\\n this.params = params;\\n this.map = map;\\n\\n if (params.attributes) {\\n this.setAttributes(params.attributes);\\n }\\n\\n if (jvm.$.isArray(params.scale)) {\\n scaleConstructor = (params.attribute === 'fill' || params.attribute === 'stroke') ? jvm.ColorScale : jvm.NumericScale;\\n this.scale = new scaleConstructor(params.scale, params.normalizeFunction, params.min, params.max);\\n } else if (params.scale) {\\n this.scale = new jvm.OrdinalScale(params.scale);\\n } else {\\n this.scale = new jvm.SimpleScale(params.scale);\\n }\\n\\n this.values = params.values || {};\\n this.setValues(this.values);\\n\\n if (this.params.legend) {\\n this.legend = new jvm.Legend($.extend({\\n map: this.map,\\n series: this\\n }, this.params.legend))\\n }\\n};\\n\\njvm.DataSeries.prototype = {\\n setAttributes: function(key, attr){\\n var attrs = key,\\n code;\\n\\n if (typeof key == 'string') {\\n if (this.elements[key]) {\\n this.elements[key].setStyle(this.params.attribute, attr);\\n }\\n } else {\\n for (code in attrs) {\\n if (this.elements[code]) {\\n this.elements[code].element.setStyle(this.params.attribute, attrs[code]);\\n }\\n }\\n }\\n },\\n\\n /**\\n * Set values for the data set.\\n * @param {Object} values Object which maps codes of regions or markers to values.\\n */\\n setValues: function(values) {\\n var max = -Number.MAX_VALUE,\\n min = Number.MAX_VALUE,\\n val,\\n cc,\\n attrs = {};\\n\\n if (!(this.scale instanceof jvm.OrdinalScale) && !(this.scale instanceof jvm.SimpleScale)) {\\n // we have a color scale as an array\\n if (typeof this.params.min === 'undefined' || typeof this.params.max === 'undefined') {\\n // min and/or max are not defined, so calculate them\\n for (cc in values) {\\n val = parseFloat(values[cc]);\\n if (val > max) max = val;\\n if (val < min) min = val;\\n }\\n }\\n\\n if (typeof this.params.min === 'undefined') {\\n this.scale.setMin(min);\\n this.params.min = min;\\n } else {\\n this.scale.setMin(this.params.min);\\n }\\n\\n if (typeof this.params.max === 'undefined') {\\n this.scale.setMax(max);\\n this.params.max = max;\\n } else {\\n this.scale.setMax(this.params.max);\\n }\\n\\n for (cc in values) {\\n if (cc != 'indexOf') {\\n val = parseFloat(values[cc]);\\n if (!isNaN(val)) {\\n attrs[cc] = this.scale.getValue(val);\\n } else {\\n attrs[cc] = this.elements[cc].element.style.initial[this.params.attribute];\\n }\\n }\\n }\\n } else {\\n for (cc in values) {\\n if (values[cc]) {\\n attrs[cc] = this.scale.getValue(values[cc]);\\n } else {\\n attrs[cc] = this.elements[cc].element.style.initial[this.params.attribute];\\n }\\n }\\n }\\n\\n this.setAttributes(attrs);\\n jvm.$.extend(this.values, values);\\n },\\n\\n clear: function(){\\n var key,\\n attrs = {};\\n\\n for (key in this.values) {\\n if (this.elements[key]) {\\n attrs[key] = this.elements[key].element.shape.style.initial[this.params.attribute];\\n }\\n }\\n this.setAttributes(attrs);\\n this.values = {};\\n },\\n\\n /**\\n * Set scale of the data series.\\n * @param {Array} scale Values representing scale.\\n */\\n setScale: function(scale) {\\n this.scale.setScale(scale);\\n if (this.values) {\\n this.setValues(this.values);\\n }\\n },\\n\\n /**\\n * Set normalize function of the data series.\\n * @param {Function|String} normilizeFunction.\\n */\\n setNormalizeFunction: function(f) {\\n this.scale.setNormalizeFunction(f);\\n if (this.values) {\\n this.setValues(this.values);\\n }\\n }\\n};\\n/**\\n * Contains methods for transforming point on sphere to\\n * Cartesian coordinates using various projections.\\n * @class\\n */\\njvm.Proj = {\\n degRad: 180 / Math.PI,\\n radDeg: Math.PI / 180,\\n radius: 6381372,\\n\\n sgn: function(n){\\n if (n > 0) {\\n return 1;\\n } else if (n < 0) {\\n return -1;\\n } else {\\n return n;\\n }\\n },\\n\\n /**\\n * Converts point on sphere to the Cartesian coordinates using Miller projection\\n * @param {Number} lat Latitude in degrees\\n * @param {Number} lng Longitude in degrees\\n * @param {Number} c Central meridian in degrees\\n */\\n mill: function(lat, lng, c){\\n return {\\n x: this.radius * (lng - c) * this.radDeg,\\n y: - this.radius * Math.log(Math.tan((45 + 0.4 * lat) * this.radDeg)) / 0.8\\n };\\n },\\n\\n /**\\n * Inverse function of mill()\\n * Converts Cartesian coordinates to point on sphere using Miller projection\\n * @param {Number} x X of point in Cartesian system as integer\\n * @param {Number} y Y of point in Cartesian system as integer\\n * @param {Number} c Central meridian in degrees\\n */\\n mill_inv: function(x, y, c){\\n return {\\n lat: (2.5 * Math.atan(Math.exp(0.8 * y / this.radius)) - 5 * Math.PI / 8) * this.degRad,\\n lng: (c * this.radDeg + x / this.radius) * this.degRad\\n };\\n },\\n\\n /**\\n * Converts point on sphere to the Cartesian coordinates using Mercator projection\\n * @param {Number} lat Latitude in degrees\\n * @param {Number} lng Longitude in degrees\\n * @param {Number} c Central meridian in degrees\\n */\\n merc: function(lat, lng, c){\\n return {\\n x: this.radius * (lng - c) * this.radDeg,\\n y: - this.radius * Math.log(Math.tan(Math.PI / 4 + lat * Math.PI / 360))\\n };\\n },\\n\\n /**\\n * Inverse function of merc()\\n * Converts Cartesian coordinates to point on sphere using Mercator projection\\n * @param {Number} x X of point in Cartesian system as integer\\n * @param {Number} y Y of point in Cartesian system as integer\\n * @param {Number} c Central meridian in degrees\\n */\\n merc_inv: function(x, y, c){\\n return {\\n lat: (2 * Math.atan(Math.exp(y / this.radius)) - Math.PI / 2) * this.degRad,\\n lng: (c * this.radDeg + x / this.radius) * this.degRad\\n };\\n },\\n\\n /**\\n * Converts point on sphere to the Cartesian coordinates using Albers Equal-Area Conic\\n * projection\\n * @see <a href=\\\"http://mathworld.wolfram.com/AlbersEqual-AreaConicProjection.html\\\">Albers Equal-Area Conic projection</a>\\n * @param {Number} lat Latitude in degrees\\n * @param {Number} lng Longitude in degrees\\n * @param {Number} c Central meridian in degrees\\n */\\n aea: function(lat, lng, c){\\n var fi0 = 0,\\n lambda0 = c * this.radDeg,\\n fi1 = 29.5 * this.radDeg,\\n fi2 = 45.5 * this.radDeg,\\n fi = lat * this.radDeg,\\n lambda = lng * this.radDeg,\\n n = (Math.sin(fi1)+Math.sin(fi2)) / 2,\\n C = Math.cos(fi1)*Math.cos(fi1)+2*n*Math.sin(fi1),\\n theta = n*(lambda-lambda0),\\n ro = Math.sqrt(C-2*n*Math.sin(fi))/n,\\n ro0 = Math.sqrt(C-2*n*Math.sin(fi0))/n;\\n\\n return {\\n x: ro * Math.sin(theta) * this.radius,\\n y: - (ro0 - ro * Math.cos(theta)) * this.radius\\n };\\n },\\n\\n /**\\n * Converts Cartesian coordinates to the point on sphere using Albers Equal-Area Conic\\n * projection\\n * @see <a href=\\\"http://mathworld.wolfram.com/AlbersEqual-AreaConicProjection.html\\\">Albers Equal-Area Conic projection</a>\\n * @param {Number} x X of point in Cartesian system as integer\\n * @param {Number} y Y of point in Cartesian system as integer\\n * @param {Number} c Central meridian in degrees\\n */\\n aea_inv: function(xCoord, yCoord, c){\\n var x = xCoord / this.radius,\\n y = yCoord / this.radius,\\n fi0 = 0,\\n lambda0 = c * this.radDeg,\\n fi1 = 29.5 * this.radDeg,\\n fi2 = 45.5 * this.radDeg,\\n n = (Math.sin(fi1)+Math.sin(fi2)) / 2,\\n C = Math.cos(fi1)*Math.cos(fi1)+2*n*Math.sin(fi1),\\n ro0 = Math.sqrt(C-2*n*Math.sin(fi0))/n,\\n ro = Math.sqrt(x*x+(ro0-y)*(ro0-y)),\\n theta = Math.atan( x / (ro0 - y) );\\n\\n return {\\n lat: (Math.asin((C - ro * ro * n * n) / (2 * n))) * this.degRad,\\n lng: (lambda0 + theta / n) * this.degRad\\n };\\n },\\n\\n /**\\n * Converts point on sphere to the Cartesian coordinates using Lambert conformal\\n * conic projection\\n * @see <a href=\\\"http://mathworld.wolfram.com/LambertConformalConicProjection.html\\\">Lambert Conformal Conic Projection</a>\\n * @param {Number} lat Latitude in degrees\\n * @param {Number} lng Longitude in degrees\\n * @param {Number} c Central meridian in degrees\\n */\\n lcc: function(lat, lng, c){\\n var fi0 = 0,\\n lambda0 = c * this.radDeg,\\n lambda = lng * this.radDeg,\\n fi1 = 33 * this.radDeg,\\n fi2 = 45 * this.radDeg,\\n fi = lat * this.radDeg,\\n n = Math.log( Math.cos(fi1) * (1 / Math.cos(fi2)) ) / Math.log( Math.tan( Math.PI / 4 + fi2 / 2) * (1 / Math.tan( Math.PI / 4 + fi1 / 2) ) ),\\n F = ( Math.cos(fi1) * Math.pow( Math.tan( Math.PI / 4 + fi1 / 2 ), n ) ) / n,\\n ro = F * Math.pow( 1 / Math.tan( Math.PI / 4 + fi / 2 ), n ),\\n ro0 = F * Math.pow( 1 / Math.tan( Math.PI / 4 + fi0 / 2 ), n );\\n\\n return {\\n x: ro * Math.sin( n * (lambda - lambda0) ) * this.radius,\\n y: - (ro0 - ro * Math.cos( n * (lambda - lambda0) ) ) * this.radius\\n };\\n },\\n\\n /**\\n * Converts Cartesian coordinates to the point on sphere using Lambert conformal conic\\n * projection\\n * @see <a href=\\\"http://mathworld.wolfram.com/LambertConformalConicProjection.html\\\">Lambert Conformal Conic Projection</a>\\n * @param {Number} x X of point in Cartesian system as integer\\n * @param {Number} y Y of point in Cartesian system as integer\\n * @param {Number} c Central meridian in degrees\\n */\\n lcc_inv: function(xCoord, yCoord, c){\\n var x = xCoord / this.radius,\\n y = yCoord / this.radius,\\n fi0 = 0,\\n lambda0 = c * this.radDeg,\\n fi1 = 33 * this.radDeg,\\n fi2 = 45 * this.radDeg,\\n n = Math.log( Math.cos(fi1) * (1 / Math.cos(fi2)) ) / Math.log( Math.tan( Math.PI / 4 + fi2 / 2) * (1 / Math.tan( Math.PI / 4 + fi1 / 2) ) ),\\n F = ( Math.cos(fi1) * Math.pow( Math.tan( Math.PI / 4 + fi1 / 2 ), n ) ) / n,\\n ro0 = F * Math.pow( 1 / Math.tan( Math.PI / 4 + fi0 / 2 ), n ),\\n ro = this.sgn(n) * Math.sqrt(x*x+(ro0-y)*(ro0-y)),\\n theta = Math.atan( x / (ro0 - y) );\\n\\n return {\\n lat: (2 * Math.atan(Math.pow(F/ro, 1/n)) - Math.PI / 2) * this.degRad,\\n lng: (lambda0 + theta / n) * this.degRad\\n };\\n }\\n};jvm.MapObject = function(config){};\\n\\njvm.MapObject.prototype.getLabelText = function(key){\\n var text;\\n\\n if (this.config.label) {\\n if (typeof this.config.label.render === 'function') {\\n text = this.config.label.render(key);\\n } else {\\n text = key;\\n }\\n } else {\\n text = null;\\n }\\n return text;\\n}\\n\\njvm.MapObject.prototype.getLabelOffsets = function(key){\\n var offsets;\\n\\n if (this.config.label) {\\n if (typeof this.config.label.offsets === 'function') {\\n offsets = this.config.label.offsets(key);\\n } else if (typeof this.config.label.offsets === 'object') {\\n offsets = this.config.label.offsets[key];\\n }\\n }\\n return offsets || [0, 0];\\n}\\n\\n/**\\n * Set hovered state to the element. Hovered state means mouse cursor is over element. Styles will be updates respectively.\\n * @param {Boolean} isHovered <code>true</code> to make element hovered, <code>false</code> otherwise.\\n */\\njvm.MapObject.prototype.setHovered = function(isHovered){\\n if (this.isHovered !== isHovered) {\\n this.isHovered = isHovered;\\n this.shape.isHovered = isHovered;\\n this.shape.updateStyle();\\n if (this.label) {\\n this.label.isHovered = isHovered;\\n this.label.updateStyle();\\n }\\n }\\n};\\n\\n/**\\n * Set selected state to the element. Styles will be updates respectively.\\n * @param {Boolean} isSelected <code>true</code> to make element selected, <code>false</code> otherwise.\\n */\\njvm.MapObject.prototype.setSelected = function(isSelected){\\n if (this.isSelected !== isSelected) {\\n this.isSelected = isSelected;\\n this.shape.isSelected = isSelected;\\n this.shape.updateStyle();\\n if (this.label) {\\n this.label.isSelected = isSelected;\\n this.label.updateStyle();\\n }\\n jvm.$(this.shape).trigger('selected', [isSelected]);\\n }\\n};\\n\\njvm.MapObject.prototype.setStyle = function(){\\n\\tthis.shape.setStyle.apply(this.shape, arguments);\\n};\\n\\njvm.MapObject.prototype.remove = function(){\\n this.shape.remove();\\n if (this.label) {\\n this.label.remove();\\n }\\n};jvm.Region = function(config){\\n var bbox,\\n text,\\n offsets,\\n labelDx,\\n labelDy;\\n\\n this.config = config;\\n this.map = this.config.map;\\n\\n this.shape = config.canvas.addPath({\\n d: config.path,\\n 'data-code': config.code\\n }, config.style, config.canvas.rootElement);\\n this.shape.addClass('jvectormap-region jvectormap-element');\\n\\n bbox = this.shape.getBBox();\\n\\n text = this.getLabelText(config.code);\\n if (this.config.label && text) {\\n offsets = this.getLabelOffsets(config.code);\\n this.labelX = bbox.x + bbox.width / 2 + offsets[0];\\n this.labelY = bbox.y + bbox.height / 2 + offsets[1];\\n this.label = config.canvas.addText({\\n text: text,\\n 'text-anchor': 'middle',\\n 'alignment-baseline': 'central',\\n x: this.labelX,\\n y: this.labelY,\\n 'data-code': config.code\\n }, config.labelStyle, config.labelsGroup);\\n this.label.addClass('jvectormap-region jvectormap-element');\\n }\\n};\\n\\njvm.inherits(jvm.Region, jvm.MapObject);\\n\\njvm.Region.prototype.updateLabelPosition = function(){\\n if (this.label) {\\n this.label.set({\\n x: this.labelX * this.map.scale + this.map.transX * this.map.scale,\\n y: this.labelY * this.map.scale + this.map.transY * this.map.scale\\n });\\n }\\n};jvm.Marker = function(config){\\n var text,\\n offsets;\\n\\n this.config = config;\\n this.map = this.config.map;\\n\\n this.isImage = !!this.config.style.initial.image;\\n this.createShape();\\n\\n text = this.getLabelText(config.index);\\n if (this.config.label && text) {\\n this.offsets = this.getLabelOffsets(config.index);\\n this.labelX = config.cx / this.map.scale - this.map.transX;\\n this.labelY = config.cy / this.map.scale - this.map.transY;\\n this.label = config.canvas.addText({\\n text: text,\\n 'data-index': config.index,\\n dy: \\\"0.6ex\\\",\\n x: this.labelX,\\n y: this.labelY\\n }, config.labelStyle, config.labelsGroup);\\n\\n this.label.addClass('jvectormap-marker jvectormap-element');\\n }\\n};\\n\\njvm.inherits(jvm.Marker, jvm.MapObject);\\n\\njvm.Marker.prototype.createShape = function(){\\n var that = this;\\n\\n if (this.shape) {\\n this.shape.remove();\\n }\\n this.shape = this.config.canvas[this.isImage ? 'addImage' : 'addCircle']({\\n \\\"data-index\\\": this.config.index,\\n cx: this.config.cx,\\n cy: this.config.cy\\n }, this.config.style, this.config.group);\\n\\n this.shape.addClass('jvectormap-marker jvectormap-element');\\n\\n if (this.isImage) {\\n jvm.$(this.shape.node).on('imageloaded', function(){\\n that.updateLabelPosition();\\n });\\n }\\n};\\n\\njvm.Marker.prototype.updateLabelPosition = function(){\\n if (this.label) {\\n this.label.set({\\n x: this.labelX * this.map.scale + this.offsets[0] +\\n this.map.transX * this.map.scale + 5 + (this.isImage ? (this.shape.width || 0) / 2 : this.shape.properties.r),\\n y: this.labelY * this.map.scale + this.map.transY * this.map.scale + this.offsets[1]\\n });\\n }\\n};\\n\\njvm.Marker.prototype.setStyle = function(property, value){\\n var isImage;\\n\\n jvm.Marker.parentClass.prototype.setStyle.apply(this, arguments);\\n\\n if (property === 'r') {\\n this.updateLabelPosition();\\n }\\n\\n isImage = !!this.shape.get('image');\\n if (isImage != this.isImage) {\\n this.isImage = isImage;\\n this.config.style = jvm.$.extend(true, {}, this.shape.style);\\n this.createShape();\\n }\\n};/**\\n * Creates map, draws paths, binds events.\\n * @constructor\\n * @param {Object} params Parameters to initialize map with.\\n * @param {String} params.map Name of the map in the format <code>territory_proj_lang</code> where <code>territory</code> is a unique code or name of the territory which the map represents (ISO 3166 standard is used where possible), <code>proj</code> is a name of projection used to generate representation of the map on the plane (projections are named according to the conventions of proj4 utility) and <code>lang</code> is a code of the language, used for the names of regions.\\n * @param {String} params.backgroundColor Background color of the map in CSS format.\\n * @param {Boolean} params.zoomOnScroll When set to true map could be zoomed using mouse scroll. Default value is <code>true</code>.\\n * @param {Boolean} params.zoomOnScrollSpeed Mouse scroll speed. Number from 1 to 10. Default value is <code>3</code>.\\n * @param {Boolean} params.panOnDrag When set to true, the map pans when being dragged. Default value is <code>true</code>.\\n * @param {Number} params.zoomMax Indicates the maximum zoom ratio which could be reached zooming the map. Default value is <code>8</code>.\\n * @param {Number} params.zoomMin Indicates the minimum zoom ratio which could be reached zooming the map. Default value is <code>1</code>.\\n * @param {Number} params.zoomStep Indicates the multiplier used to zoom map with +/- buttons. Default value is <code>1.6</code>.\\n * @param {Boolean} params.zoomAnimate Indicates whether or not to animate changing of map zoom with zoom buttons.\\n * @param {Boolean} params.regionsSelectable When set to true regions of the map could be selected. Default value is <code>false</code>.\\n * @param {Boolean} params.regionsSelectableOne Allow only one region to be selected at the moment. Default value is <code>false</code>.\\n * @param {Boolean} params.markersSelectable When set to true markers on the map could be selected. Default value is <code>false</code>.\\n * @param {Boolean} params.markersSelectableOne Allow only one marker to be selected at the moment. Default value is <code>false</code>.\\n * @param {Object} params.regionStyle Set the styles for the map's regions. Each region or marker has four states: <code>initial</code> (default state), <code>hover</code> (when the mouse cursor is over the region or marker), <code>selected</code> (when region or marker is selected), <code>selectedHover</code> (when the mouse cursor is over the region or marker and it's selected simultaneously). Styles could be set for each of this states. Default value for that parameter is:\\n<pre>{\\n initial: {\\n fill: 'white',\\n \\\"fill-opacity\\\": 1,\\n stroke: 'none',\\n \\\"stroke-width\\\": 0,\\n \\\"stroke-opacity\\\": 1\\n },\\n hover: {\\n \\\"fill-opacity\\\": 0.8,\\n cursor: 'pointer'\\n },\\n selected: {\\n fill: 'yellow'\\n },\\n selectedHover: {\\n }\\n}</pre>\\n* @param {Object} params.regionLabelStyle Set the styles for the regions' labels. Each region or marker has four states: <code>initial</code> (default state), <code>hover</code> (when the mouse cursor is over the region or marker), <code>selected</code> (when region or marker is selected), <code>selectedHover</code> (when the mouse cursor is over the region or marker and it's selected simultaneously). Styles could be set for each of this states. Default value for that parameter is:\\n<pre>{\\n initial: {\\n 'font-family': 'Verdana',\\n 'font-size': '12',\\n 'font-weight': 'bold',\\n cursor: 'default',\\n fill: 'black'\\n },\\n hover: {\\n cursor: 'pointer'\\n }\\n}</pre>\\n * @param {Object} params.markerStyle Set the styles for the map's markers. Any parameter suitable for <code>regionStyle</code> could be used as well as numeric parameter <code>r</code> to set the marker's radius. Default value for that parameter is:\\n<pre>{\\n initial: {\\n fill: 'grey',\\n stroke: '#505050',\\n \\\"fill-opacity\\\": 1,\\n \\\"stroke-width\\\": 1,\\n \\\"stroke-opacity\\\": 1,\\n r: 5\\n },\\n hover: {\\n stroke: 'black',\\n \\\"stroke-width\\\": 2,\\n cursor: 'pointer'\\n },\\n selected: {\\n fill: 'blue'\\n },\\n selectedHover: {\\n }\\n}</pre>\\n * @param {Object} params.markerLabelStyle Set the styles for the markers' labels. Default value for that parameter is:\\n<pre>{\\n initial: {\\n 'font-family': 'Verdana',\\n 'font-size': '12',\\n 'font-weight': 'bold',\\n cursor: 'default',\\n fill: 'black'\\n },\\n hover: {\\n cursor: 'pointer'\\n }\\n}</pre>\\n * @param {Object|Array} params.markers Set of markers to add to the map during initialization. In case of array is provided, codes of markers will be set as string representations of array indexes. Each marker is represented by <code>latLng</code> (array of two numeric values), <code>name</code> (string which will be show on marker's tip) and any marker styles.\\n * @param {Object} params.series Object with two keys: <code>markers</code> and <code>regions</code>. Each of which is an array of series configs to be applied to the respective map elements. See <a href=\\\"jvm.DataSeries.html\\\">DataSeries</a> description for a list of parameters available.\\n * @param {Object|String} params.focusOn This parameter sets the initial position and scale of the map viewport. See <code>setFocus</code> docuemntation for possible parameters.\\n * @param {Object} params.labels Defines parameters for rendering static labels. Object could contain two keys: <code>regions</code> and <code>markers</code>. Each key value defines configuration object with the following possible options:\\n<ul>\\n <li><code>render {Function}</code> - defines method for converting region code or marker index to actual label value.</li>\\n <li><code>offsets {Object|Function}</code> - provides method or object which could be used to define label offset by region code or marker index.</li>\\n</ul>\\n<b>Plase note: static labels feature is not supported in Internet Explorer 8 and below.</b>\\n * @param {Array|Object|String} params.selectedRegions Set initially selected regions.\\n * @param {Array|Object|String} params.selectedMarkers Set initially selected markers.\\n * @param {Function} params.onRegionTipShow <code>(Event e, Object tip, String code)</code> Will be called right before the region tip is going to be shown.\\n * @param {Function} params.onRegionOver <code>(Event e, String code)</code> Will be called on region mouse over event.\\n * @param {Function} params.onRegionOut <code>(Event e, String code)</code> Will be called on region mouse out event.\\n * @param {Function} params.onRegionClick <code>(Event e, String code)</code> Will be called on region click event.\\n * @param {Function} params.onRegionSelected <code>(Event e, String code, Boolean isSelected, Array selectedRegions)</code> Will be called when region is (de)selected. <code>isSelected</code> parameter of the callback indicates whether region is selected or not. <code>selectedRegions</code> contains codes of all currently selected regions.\\n * @param {Function} params.onMarkerTipShow <code>(Event e, Object tip, String code)</code> Will be called right before the marker tip is going to be shown.\\n * @param {Function} params.onMarkerOver <code>(Event e, String code)</code> Will be called on marker mouse over event.\\n * @param {Function} params.onMarkerOut <code>(Event e, String code)</code> Will be called on marker mouse out event.\\n * @param {Function} params.onMarkerClick <code>(Event e, String code)</code> Will be called on marker click event.\\n * @param {Function} params.onMarkerSelected <code>(Event e, String code, Boolean isSelected, Array selectedMarkers)</code> Will be called when marker is (de)selected. <code>isSelected</code> parameter of the callback indicates whether marker is selected or not. <code>selectedMarkers</code> contains codes of all currently selected markers.\\n * @param {Function} params.onViewportChange <code>(Event e, Number scale)</code> Triggered when the map's viewport is changed (map was panned or zoomed).\\n */\\njvm.Map = function(params) {\\n var map = this,\\n e;\\n\\n this.params = jvm.$.extend(true, {}, jvm.Map.defaultParams, params);\\n\\n if (!jvm.Map.maps[this.params.map]) {\\n throw new Error('Attempt to use map which was not loaded: '+this.params.map);\\n }\\n\\n this.mapData = jvm.Map.maps[this.params.map];\\n this.markers = {};\\n this.regions = {};\\n this.regionsColors = {};\\n this.regionsData = {};\\n\\n this.container = jvm.$('<div>').addClass('jvectormap-container');\\n if (this.params.container) {\\n this.params.container.append( this.container );\\n }\\n this.container.data('mapObject', this);\\n\\n this.defaultWidth = this.mapData.width;\\n this.defaultHeight = this.mapData.height;\\n\\n this.setBackgroundColor(this.params.backgroundColor);\\n\\n this.onResize = function(){\\n map.updateSize();\\n }\\n jvm.$(window).resize(this.onResize);\\n\\n for (e in jvm.Map.apiEvents) {\\n if (this.params[e]) {\\n this.container.bind(jvm.Map.apiEvents[e]+'.jvectormap', this.params[e]);\\n }\\n }\\n\\n this.canvas = new jvm.VectorCanvas(this.container[0], this.width, this.height);\\n\\n if ( ('ontouchstart' in window) || (window.DocumentTouch && document instanceof DocumentTouch) ) {\\n if (this.params.bindTouchEvents) {\\n this.bindContainerTouchEvents();\\n }\\n }\\n this.bindContainerEvents();\\n this.bindElementEvents();\\n this.createTip();\\n if (this.params.zoomButtons) {\\n this.bindZoomButtons();\\n }\\n\\n this.createRegions();\\n this.createMarkers(this.params.markers || {});\\n\\n this.updateSize();\\n\\n if (this.params.focusOn) {\\n if (typeof this.params.focusOn === 'string') {\\n this.params.focusOn = {region: this.params.focusOn};\\n } else if (jvm.$.isArray(this.params.focusOn)) {\\n this.params.focusOn = {regions: this.params.focusOn};\\n }\\n this.setFocus(this.params.focusOn);\\n }\\n\\n if (this.params.selectedRegions) {\\n this.setSelectedRegions(this.params.selectedRegions);\\n }\\n if (this.params.selectedMarkers) {\\n this.setSelectedMarkers(this.params.selectedMarkers);\\n }\\n\\n this.legendCntHorizontal = jvm.$('<div/>').addClass('jvectormap-legend-cnt jvectormap-legend-cnt-h');\\n this.legendCntVertical = jvm.$('<div/>').addClass('jvectormap-legend-cnt jvectormap-legend-cnt-v');\\n this.container.append(this.legendCntHorizontal);\\n this.container.append(this.legendCntVertical);\\n\\n if (this.params.series) {\\n this.createSeries();\\n }\\n};\\n\\njvm.Map.prototype = {\\n transX: 0,\\n transY: 0,\\n scale: 1,\\n baseTransX: 0,\\n baseTransY: 0,\\n baseScale: 1,\\n\\n width: 0,\\n height: 0,\\n\\n /**\\n * Set background color of the map.\\n * @param {String} backgroundColor Background color in CSS format.\\n */\\n setBackgroundColor: function(backgroundColor) {\\n this.container.css('background-color', backgroundColor);\\n },\\n\\n resize: function() {\\n var curBaseScale = this.baseScale;\\n if (this.width / this.height > this.defaultWidth / this.defaultHeight) {\\n this.baseScale = this.height / this.defaultHeight;\\n this.baseTransX = Math.abs(this.width - this.defaultWidth * this.baseScale) / (2 * this.baseScale);\\n } else {\\n this.baseScale = this.width / this.defaultWidth;\\n this.baseTransY = Math.abs(this.height - this.defaultHeight * this.baseScale) / (2 * this.baseScale);\\n }\\n this.scale *= this.baseScale / curBaseScale;\\n this.transX *= this.baseScale / curBaseScale;\\n this.transY *= this.baseScale / curBaseScale;\\n },\\n\\n /**\\n * Synchronize the size of the map with the size of the container. Suitable in situations where the size of the container is changed programmatically or container is shown after it became visible.\\n */\\n updateSize: function(){\\n this.width = this.container.width();\\n this.height = this.container.height();\\n this.resize();\\n this.canvas.setSize(this.width, this.height);\\n this.applyTransform();\\n },\\n\\n /**\\n * Reset all the series and show the map with the initial zoom.\\n */\\n reset: function() {\\n var key,\\n i;\\n\\n for (key in this.series) {\\n for (i = 0; i < this.series[key].length; i++) {\\n this.series[key][i].clear();\\n }\\n }\\n this.scale = this.baseScale;\\n this.transX = this.baseTransX;\\n this.transY = this.baseTransY;\\n this.applyTransform();\\n },\\n\\n applyTransform: function() {\\n var maxTransX,\\n maxTransY,\\n minTransX,\\n minTransY;\\n\\n if (this.defaultWidth * this.scale <= this.width) {\\n maxTransX = (this.width - this.defaultWidth * this.scale) / (2 * this.scale);\\n minTransX = (this.width - this.defaultWidth * this.scale) / (2 * this.scale);\\n } else {\\n maxTransX = 0;\\n minTransX = (this.width - this.defaultWidth * this.scale) / this.scale;\\n }\\n\\n if (this.defaultHeight * this.scale <= this.height) {\\n maxTransY = (this.height - this.defaultHeight * this.scale) / (2 * this.scale);\\n minTransY = (this.height - this.defaultHeight * this.scale) / (2 * this.scale);\\n } else {\\n maxTransY = 0;\\n minTransY = (this.height - this.defaultHeight * this.scale) / this.scale;\\n }\\n\\n if (this.transY > maxTransY) {\\n this.transY = maxTransY;\\n } else if (this.transY < minTransY) {\\n this.transY = minTransY;\\n }\\n if (this.transX > maxTransX) {\\n this.transX = maxTransX;\\n } else if (this.transX < minTransX) {\\n this.transX = minTransX;\\n }\\n\\n this.canvas.applyTransformParams(this.scale, this.transX, this.transY);\\n\\n if (this.markers) {\\n this.repositionMarkers();\\n }\\n\\n this.repositionLabels();\\n\\n this.container.trigger('viewportChange', [this.scale/this.baseScale, this.transX, this.transY]);\\n },\\n\\n bindContainerEvents: function(){\\n var mouseDown = false,\\n oldPageX,\\n oldPageY,\\n map = this;\\n\\n if (this.params.panOnDrag) {\\n this.container.mousemove(function(e){\\n if (mouseDown) {\\n map.transX -= (oldPageX - e.pageX) / map.scale;\\n map.transY -= (oldPageY - e.pageY) / map.scale;\\n\\n map.applyTransform();\\n\\n oldPageX = e.pageX;\\n oldPageY = e.pageY;\\n }\\n return false;\\n }).mousedown(function(e){\\n mouseDown = true;\\n oldPageX = e.pageX;\\n oldPageY = e.pageY;\\n return false;\\n });\\n\\n this.onContainerMouseUp = function(){\\n mouseDown = false;\\n };\\n jvm.$('body').mouseup(this.onContainerMouseUp);\\n }\\n\\n if (this.params.zoomOnScroll) {\\n this.container.mousewheel(function(event, delta, deltaX, deltaY) {\\n var offset = jvm.$(map.container).offset(),\\n centerX = event.pageX - offset.left,\\n centerY = event.pageY - offset.top,\\n zoomStep = Math.pow(1 + map.params.zoomOnScrollSpeed / 1000, event.deltaFactor * event.deltaY);\\n\\n map.tip.hide();\\n\\n map.setScale(map.scale * zoomStep, centerX, centerY);\\n event.preventDefault();\\n });\\n }\\n },\\n\\n bindContainerTouchEvents: function(){\\n var touchStartScale,\\n touchStartDistance,\\n map = this,\\n touchX,\\n touchY,\\n centerTouchX,\\n centerTouchY,\\n lastTouchesLength,\\n handleTouchEvent = function(e){\\n var touches = e.originalEvent.touches,\\n offset,\\n scale,\\n transXOld,\\n transYOld;\\n\\n if (e.type == 'touchstart') {\\n lastTouchesLength = 0;\\n }\\n\\n if (touches.length == 1) {\\n if (lastTouchesLength == 1) {\\n transXOld = map.transX;\\n transYOld = map.transY;\\n map.transX -= (touchX - touches[0].pageX) / map.scale;\\n map.transY -= (touchY - touches[0].pageY) / map.scale;\\n map.applyTransform();\\n map.tip.hide();\\n if (transXOld != map.transX || transYOld != map.transY) {\\n e.preventDefault();\\n }\\n }\\n touchX = touches[0].pageX;\\n touchY = touches[0].pageY;\\n } else if (touches.length == 2) {\\n if (lastTouchesLength == 2) {\\n scale = Math.sqrt(\\n Math.pow(touches[0].pageX - touches[1].pageX, 2) +\\n Math.pow(touches[0].pageY - touches[1].pageY, 2)\\n ) / touchStartDistance;\\n map.setScale(\\n touchStartScale * scale,\\n centerTouchX,\\n centerTouchY\\n )\\n map.tip.hide();\\n e.preventDefault();\\n } else {\\n offset = jvm.$(map.container).offset();\\n if (touches[0].pageX > touches[1].pageX) {\\n centerTouchX = touches[1].pageX + (touches[0].pageX - touches[1].pageX) / 2;\\n } else {\\n centerTouchX = touches[0].pageX + (touches[1].pageX - touches[0].pageX) / 2;\\n }\\n if (touches[0].pageY > touches[1].pageY) {\\n centerTouchY = touches[1].pageY + (touches[0].pageY - touches[1].pageY) / 2;\\n } else {\\n centerTouchY = touches[0].pageY + (touches[1].pageY - touches[0].pageY) / 2;\\n }\\n centerTouchX -= offset.left;\\n centerTouchY -= offset.top;\\n touchStartScale = map.scale;\\n touchStartDistance = Math.sqrt(\\n Math.pow(touches[0].pageX - touches[1].pageX, 2) +\\n Math.pow(touches[0].pageY - touches[1].pageY, 2)\\n );\\n }\\n }\\n\\n lastTouchesLength = touches.length;\\n };\\n\\n jvm.$(this.container).bind('touchstart', handleTouchEvent);\\n jvm.$(this.container).bind('touchmove', handleTouchEvent);\\n },\\n\\n bindElementEvents: function(){\\n var map = this,\\n mouseMoved;\\n\\n this.container.mousemove(function(){\\n mouseMoved = true;\\n });\\n\\n /* Can not use common class selectors here because of the bug in jQuery\\n SVG handling, use with caution. */\\n this.container.delegate(\\\"[class~='jvectormap-element']\\\", 'mouseover mouseout', function(e){\\n var baseVal = jvm.$(this).attr('class').baseVal || jvm.$(this).attr('class'),\\n type = baseVal.indexOf('jvectormap-region') === -1 ? 'marker' : 'region',\\n code = type == 'region' ? jvm.$(this).attr('data-code') : jvm.$(this).attr('data-index'),\\n element = type == 'region' ? map.regions[code].element : map.markers[code].element,\\n tipText = type == 'region' ? map.mapData.paths[code].name : (map.markers[code].config.name || ''),\\n tipShowEvent = jvm.$.Event(type+'TipShow.jvectormap'),\\n overEvent = jvm.$.Event(type+'Over.jvectormap');\\n\\n if (e.type == 'mouseover') {\\n map.container.trigger(overEvent, [code]);\\n if (!overEvent.isDefaultPrevented()) {\\n element.setHovered(true);\\n }\\n\\n map.tip.text(tipText);\\n map.container.trigger(tipShowEvent, [map.tip, code]);\\n if (!tipShowEvent.isDefaultPrevented()) {\\n map.tip.show();\\n map.tipWidth = map.tip.width();\\n map.tipHeight = map.tip.height();\\n }\\n } else {\\n element.setHovered(false);\\n map.tip.hide();\\n map.container.trigger(type+'Out.jvectormap', [code]);\\n }\\n });\\n\\n /* Can not use common class selectors here because of the bug in jQuery\\n SVG handling, use with caution. */\\n this.container.delegate(\\\"[class~='jvectormap-element']\\\", 'mousedown', function(){\\n mouseMoved = false;\\n });\\n\\n /* Can not use common class selectors here because of the bug in jQuery\\n SVG handling, use with caution. */\\n this.container.delegate(\\\"[class~='jvectormap-element']\\\", 'mouseup', function(){\\n var baseVal = jvm.$(this).attr('class').baseVal ? jvm.$(this).attr('class').baseVal : jvm.$(this).attr('class'),\\n type = baseVal.indexOf('jvectormap-region') === -1 ? 'marker' : 'region',\\n code = type == 'region' ? jvm.$(this).attr('data-code') : jvm.$(this).attr('data-index'),\\n clickEvent = jvm.$.Event(type+'Click.jvectormap'),\\n element = type == 'region' ? map.regions[code].element : map.markers[code].element;\\n\\n if (!mouseMoved) {\\n map.container.trigger(clickEvent, [code]);\\n if ((type === 'region' && map.params.regionsSelectable) || (type === 'marker' && map.params.markersSelectable)) {\\n if (!clickEvent.isDefaultPrevented()) {\\n if (map.params[type+'sSelectableOne']) {\\n map.clearSelected(type+'s');\\n }\\n element.setSelected(!element.isSelected);\\n }\\n }\\n }\\n });\\n },\\n\\n bindZoomButtons: function() {\\n var map = this;\\n\\n jvm.$('<div/>').addClass('jvectormap-zoomin').text('+').appendTo(this.container);\\n jvm.$('<div/>').addClass('jvectormap-zoomout').html('−').appendTo(this.container);\\n\\n this.container.find('.jvectormap-zoomin').click(function(){\\n map.setScale(map.scale * map.params.zoomStep, map.width / 2, map.height / 2, false, map.params.zoomAnimate);\\n });\\n this.container.find('.jvectormap-zoomout').click(function(){\\n map.setScale(map.scale / map.params.zoomStep, map.width / 2, map.height / 2, false, map.params.zoomAnimate);\\n });\\n },\\n\\n createTip: function(){\\n var map = this;\\n\\n this.tip = jvm.$('<div/>').addClass('jvectormap-tip').appendTo(jvm.$('body'));\\n\\n this.container.mousemove(function(e){\\n var left = e.pageX-15-map.tipWidth,\\n top = e.pageY-15-map.tipHeight;\\n\\n if (left < 5) {\\n left = e.pageX + 15;\\n }\\n if (top < 5) {\\n top = e.pageY + 15;\\n }\\n\\n map.tip.css({\\n left: left,\\n top: top\\n });\\n });\\n },\\n\\n setScale: function(scale, anchorX, anchorY, isCentered, animate) {\\n var viewportChangeEvent = jvm.$.Event('zoom.jvectormap'),\\n interval,\\n that = this,\\n i = 0,\\n count = Math.abs(Math.round((scale - this.scale) * 60 / Math.max(scale, this.scale))),\\n scaleStart,\\n scaleDiff,\\n transXStart,\\n transXDiff,\\n transYStart,\\n transYDiff,\\n transX,\\n transY,\\n deferred = new jvm.$.Deferred();\\n\\n if (scale > this.params.zoomMax * this.baseScale) {\\n scale = this.params.zoomMax * this.baseScale;\\n } else if (scale < this.params.zoomMin * this.baseScale) {\\n scale = this.params.zoomMin * this.baseScale;\\n }\\n\\n if (typeof anchorX != 'undefined' && typeof anchorY != 'undefined') {\\n zoomStep = scale / this.scale;\\n if (isCentered) {\\n transX = anchorX + this.defaultWidth * (this.width / (this.defaultWidth * scale)) / 2;\\n transY = anchorY + this.defaultHeight * (this.height / (this.defaultHeight * scale)) / 2;\\n } else {\\n transX = this.transX - (zoomStep - 1) / scale * anchorX;\\n transY = this.transY - (zoomStep - 1) / scale * anchorY;\\n }\\n }\\n\\n if (animate && count > 0) {\\n scaleStart = this.scale;\\n scaleDiff = (scale - scaleStart) / count;\\n transXStart = this.transX * this.scale;\\n transYStart = this.transY * this.scale;\\n transXDiff = (transX * scale - transXStart) / count;\\n transYDiff = (transY * scale - transYStart) / count;\\n interval = setInterval(function(){\\n i += 1;\\n that.scale = scaleStart + scaleDiff * i;\\n that.transX = (transXStart + transXDiff * i) / that.scale;\\n that.transY = (transYStart + transYDiff * i) / that.scale;\\n that.applyTransform();\\n if (i == count) {\\n clearInterval(interval);\\n that.container.trigger(viewportChangeEvent, [scale/that.baseScale]);\\n deferred.resolve();\\n }\\n }, 10);\\n } else {\\n this.transX = transX;\\n this.transY = transY;\\n this.scale = scale;\\n this.applyTransform();\\n this.container.trigger(viewportChangeEvent, [scale/this.baseScale]);\\n deferred.resolve();\\n }\\n\\n return deferred;\\n },\\n\\n /**\\n * Set the map's viewport to the specific point and set zoom of the map to the specific level. Point and zoom level could be defined in two ways: using the code of some region to focus on or a central point and zoom level as numbers.\\n * @param This method takes a configuration object as the single argument. The options passed to it are the following:\\n * @param {Array} params.regions Array of region codes to zoom to.\\n * @param {String} params.region Region code to zoom to.\\n * @param {Number} params.scale Map scale to set.\\n * @param {Number} params.lat Latitude to set viewport to.\\n * @param {Number} params.lng Longitude to set viewport to.\\n * @param {Number} params.x Number from 0 to 1 specifying the horizontal coordinate of the central point of the viewport.\\n * @param {Number} params.y Number from 0 to 1 specifying the vertical coordinate of the central point of the viewport.\\n * @param {Boolean} params.animate Indicates whether or not to animate the scale change and transition.\\n */\\n setFocus: function(config){\\n var bbox,\\n itemBbox,\\n newBbox,\\n codes,\\n i,\\n point;\\n\\n config = config || {};\\n\\n if (config.region) {\\n codes = [config.region];\\n } else if (config.regions) {\\n codes = config.regions;\\n }\\n\\n if (codes) {\\n for (i = 0; i < codes.length; i++) {\\n if (this.regions[codes[i]]) {\\n itemBbox = this.regions[codes[i]].element.shape.getBBox();\\n if (itemBbox) {\\n if (typeof bbox == 'undefined') {\\n bbox = itemBbox;\\n } else {\\n newBbox = {\\n x: Math.min(bbox.x, itemBbox.x),\\n y: Math.min(bbox.y, itemBbox.y),\\n width: Math.max(bbox.x + bbox.width, itemBbox.x + itemBbox.width) - Math.min(bbox.x, itemBbox.x),\\n height: Math.max(bbox.y + bbox.height, itemBbox.y + itemBbox.height) - Math.min(bbox.y, itemBbox.y)\\n }\\n bbox = newBbox;\\n }\\n }\\n }\\n }\\n return this.setScale(\\n Math.min(this.width / bbox.width, this.height / bbox.height),\\n - (bbox.x + bbox.width / 2),\\n - (bbox.y + bbox.height / 2),\\n true,\\n config.animate\\n );\\n } else {\\n if (config.lat && config.lng) {\\n point = this.latLngToPoint(config.lat, config.lng);\\n config.x = this.transX - point.x / this.scale;\\n config.y = this.transY - point.y / this.scale;\\n } else if (config.x && config.y) {\\n config.x *= -this.defaultWidth;\\n config.y *= -this.defaultHeight;\\n }\\n return this.setScale(config.scale * this.baseScale, config.x, config.y, true, config.animate);\\n }\\n },\\n\\n getSelected: function(type){\\n var key,\\n selected = [];\\n\\n for (key in this[type]) {\\n if (this[type][key].element.isSelected) {\\n selected.push(key);\\n }\\n }\\n return selected;\\n },\\n\\n /**\\n * Return the codes of currently selected regions.\\n * @returns {Array}\\n */\\n getSelectedRegions: function(){\\n return this.getSelected('regions');\\n },\\n\\n /**\\n * Return the codes of currently selected markers.\\n * @returns {Array}\\n */\\n getSelectedMarkers: function(){\\n return this.getSelected('markers');\\n },\\n\\n setSelected: function(type, keys){\\n var i;\\n\\n if (typeof keys != 'object') {\\n keys = [keys];\\n }\\n\\n if (jvm.$.isArray(keys)) {\\n for (i = 0; i < keys.length; i++) {\\n this[type][keys[i]].element.setSelected(true);\\n }\\n } else {\\n for (i in keys) {\\n this[type][i].element.setSelected(!!keys[i]);\\n }\\n }\\n },\\n\\n /**\\n * Set or remove selected state for the regions.\\n * @param {String|Array|Object} keys If <code>String</code> or <code>Array</code> the region(s) with the corresponding code(s) will be selected. If <code>Object</code> was provided its keys are codes of regions, state of which should be changed. Selected state will be set if value is true, removed otherwise.\\n */\\n setSelectedRegions: function(keys){\\n this.setSelected('regions', keys);\\n },\\n\\n /**\\n * Set or remove selected state for the markers.\\n * @param {String|Array|Object} keys If <code>String</code> or <code>Array</code> the marker(s) with the corresponding code(s) will be selected. If <code>Object</code> was provided its keys are codes of markers, state of which should be changed. Selected state will be set if value is true, removed otherwise.\\n */\\n setSelectedMarkers: function(keys){\\n this.setSelected('markers', keys);\\n },\\n\\n clearSelected: function(type){\\n var select = {},\\n selected = this.getSelected(type),\\n i;\\n\\n for (i = 0; i < selected.length; i++) {\\n select[selected[i]] = false;\\n };\\n\\n this.setSelected(type, select);\\n },\\n\\n /**\\n * Remove the selected state from all the currently selected regions.\\n */\\n clearSelectedRegions: function(){\\n this.clearSelected('regions');\\n },\\n\\n /**\\n * Remove the selected state from all the currently selected markers.\\n */\\n clearSelectedMarkers: function(){\\n this.clearSelected('markers');\\n },\\n\\n /**\\n * Return the instance of Map. Useful when instantiated as a jQuery plug-in.\\n * @returns {Map}\\n */\\n getMapObject: function(){\\n return this;\\n },\\n\\n /**\\n * Return the name of the region by region code.\\n * @returns {String}\\n */\\n getRegionName: function(code){\\n return this.mapData.paths[code].name;\\n },\\n\\n createRegions: function(){\\n var key,\\n region,\\n map = this;\\n\\n this.regionLabelsGroup = this.regionLabelsGroup || this.canvas.addGroup();\\n\\n for (key in this.mapData.paths) {\\n region = new jvm.Region({\\n map: this,\\n path: this.mapData.paths[key].path,\\n code: key,\\n style: jvm.$.extend(true, {}, this.params.regionStyle),\\n labelStyle: jvm.$.extend(true, {}, this.params.regionLabelStyle),\\n canvas: this.canvas,\\n labelsGroup: this.regionLabelsGroup,\\n label: this.canvas.mode != 'vml' ? (this.params.labels && this.params.labels.regions) : null\\n });\\n\\n jvm.$(region.shape).bind('selected', function(e, isSelected){\\n map.container.trigger('regionSelected.jvectormap', [jvm.$(this.node).attr('data-code'), isSelected, map.getSelectedRegions()]);\\n });\\n this.regions[key] = {\\n element: region,\\n config: this.mapData.paths[key]\\n };\\n }\\n },\\n\\n createMarkers: function(markers) {\\n var i,\\n marker,\\n point,\\n markerConfig,\\n markersArray,\\n map = this;\\n\\n this.markersGroup = this.markersGroup || this.canvas.addGroup();\\n this.markerLabelsGroup = this.markerLabelsGroup || this.canvas.addGroup();\\n\\n if (jvm.$.isArray(markers)) {\\n markersArray = markers.slice();\\n markers = {};\\n for (i = 0; i < markersArray.length; i++) {\\n markers[i] = markersArray[i];\\n }\\n }\\n\\n for (i in markers) {\\n markerConfig = markers[i] instanceof Array ? {latLng: markers[i]} : markers[i];\\n point = this.getMarkerPosition( markerConfig );\\n\\n if (point !== false) {\\n marker = new jvm.Marker({\\n map: this,\\n style: jvm.$.extend(true, {}, this.params.markerStyle, {initial: markerConfig.style || {}}),\\n labelStyle: jvm.$.extend(true, {}, this.params.markerLabelStyle),\\n index: i,\\n cx: point.x,\\n cy: point.y,\\n group: this.markersGroup,\\n canvas: this.canvas,\\n labelsGroup: this.markerLabelsGroup,\\n label: this.canvas.mode != 'vml' ? (this.params.labels && this.params.labels.markers) : null\\n });\\n\\n jvm.$(marker.shape).bind('selected', function(e, isSelected){\\n map.container.trigger('markerSelected.jvectormap', [jvm.$(this.node).attr('data-index'), isSelected, map.getSelectedMarkers()]);\\n });\\n if (this.markers[i]) {\\n this.removeMarkers([i]);\\n }\\n this.markers[i] = {element: marker, config: markerConfig};\\n }\\n }\\n },\\n\\n repositionMarkers: function() {\\n var i,\\n point;\\n\\n for (i in this.markers) {\\n point = this.getMarkerPosition( this.markers[i].config );\\n if (point !== false) {\\n this.markers[i].element.setStyle({cx: point.x, cy: point.y});\\n }\\n }\\n },\\n\\n repositionLabels: function() {\\n var key;\\n\\n for (key in this.regions) {\\n this.regions[key].element.updateLabelPosition();\\n }\\n\\n for (key in this.markers) {\\n this.markers[key].element.updateLabelPosition();\\n }\\n },\\n\\n getMarkerPosition: function(markerConfig) {\\n if (jvm.Map.maps[this.params.map].projection) {\\n return this.latLngToPoint.apply(this, markerConfig.latLng || [0, 0]);\\n } else {\\n return {\\n x: markerConfig.coords[0]*this.scale + this.transX*this.scale,\\n y: markerConfig.coords[1]*this.scale + this.transY*this.scale\\n };\\n }\\n },\\n\\n /**\\n * Add one marker to the map.\\n * @param {String} key Marker unique code.\\n * @param {Object} marker Marker configuration parameters.\\n * @param {Array} seriesData Values to add to the data series.\\n */\\n addMarker: function(key, marker, seriesData){\\n var markers = {},\\n data = [],\\n values,\\n i,\\n seriesData = seriesData || [];\\n\\n markers[key] = marker;\\n\\n for (i = 0; i < seriesData.length; i++) {\\n values = {};\\n if (typeof seriesData[i] !== 'undefined') {\\n values[key] = seriesData[i];\\n }\\n data.push(values);\\n }\\n this.addMarkers(markers, data);\\n },\\n\\n /**\\n * Add set of marker to the map.\\n * @param {Object|Array} markers Markers to add to the map. In case of array is provided, codes of markers will be set as string representations of array indexes.\\n * @param {Array} seriesData Values to add to the data series.\\n */\\n addMarkers: function(markers, seriesData){\\n var i;\\n\\n seriesData = seriesData || [];\\n\\n this.createMarkers(markers);\\n for (i = 0; i < seriesData.length; i++) {\\n this.series.markers[i].setValues(seriesData[i] || {});\\n };\\n },\\n\\n /**\\n * Remove some markers from the map.\\n * @param {Array} markers Array of marker codes to be removed.\\n */\\n removeMarkers: function(markers){\\n var i;\\n\\n for (i = 0; i < markers.length; i++) {\\n this.markers[ markers[i] ].element.remove();\\n delete this.markers[ markers[i] ];\\n };\\n },\\n\\n /**\\n * Remove all markers from the map.\\n */\\n removeAllMarkers: function(){\\n var i,\\n markers = [];\\n\\n for (i in this.markers) {\\n markers.push(i);\\n }\\n this.removeMarkers(markers)\\n },\\n\\n /**\\n * Converts coordinates expressed as latitude and longitude to the coordinates in pixels on the map.\\n * @param {Number} lat Latitide of point in degrees.\\n * @param {Number} lng Longitude of point in degrees.\\n */\\n latLngToPoint: function(lat, lng) {\\n var point,\\n proj = jvm.Map.maps[this.params.map].projection,\\n centralMeridian = proj.centralMeridian,\\n inset,\\n bbox;\\n\\n if (lng < (-180 + centralMeridian)) {\\n lng += 360;\\n }\\n\\n point = jvm.Proj[proj.type](lat, lng, centralMeridian);\\n\\n inset = this.getInsetForPoint(point.x, point.y);\\n if (inset) {\\n bbox = inset.bbox;\\n\\n point.x = (point.x - bbox[0].x) / (bbox[1].x - bbox[0].x) * inset.width * this.scale;\\n point.y = (point.y - bbox[0].y) / (bbox[1].y - bbox[0].y) * inset.height * this.scale;\\n\\n return {\\n x: point.x + this.transX*this.scale + inset.left*this.scale,\\n y: point.y + this.transY*this.scale + inset.top*this.scale\\n };\\n } else {\\n return false;\\n }\\n },\\n\\n /**\\n * Converts cartesian coordinates into coordinates expressed as latitude and longitude.\\n * @param {Number} x X-axis of point on map in pixels.\\n * @param {Number} y Y-axis of point on map in pixels.\\n */\\n pointToLatLng: function(x, y) {\\n var proj = jvm.Map.maps[this.params.map].projection,\\n centralMeridian = proj.centralMeridian,\\n insets = jvm.Map.maps[this.params.map].insets,\\n i,\\n inset,\\n bbox,\\n nx,\\n ny;\\n\\n for (i = 0; i < insets.length; i++) {\\n inset = insets[i];\\n bbox = inset.bbox;\\n\\n nx = x - (this.transX*this.scale + inset.left*this.scale);\\n ny = y - (this.transY*this.scale + inset.top*this.scale);\\n\\n nx = (nx / (inset.width * this.scale)) * (bbox[1].x - bbox[0].x) + bbox[0].x;\\n ny = (ny / (inset.height * this.scale)) * (bbox[1].y - bbox[0].y) + bbox[0].y;\\n\\n if (nx > bbox[0].x && nx < bbox[1].x && ny > bbox[0].y && ny < bbox[1].y) {\\n return jvm.Proj[proj.type + '_inv'](nx, -ny, centralMeridian);\\n }\\n }\\n\\n return false;\\n },\\n\\n getInsetForPoint: function(x, y){\\n var insets = jvm.Map.maps[this.params.map].insets,\\n i,\\n bbox;\\n\\n for (i = 0; i < insets.length; i++) {\\n bbox = insets[i].bbox;\\n if (x > bbox[0].x && x < bbox[1].x && y > bbox[0].y && y < bbox[1].y) {\\n return insets[i];\\n }\\n }\\n },\\n\\n createSeries: function(){\\n var i,\\n key;\\n\\n this.series = {\\n markers: [],\\n regions: []\\n };\\n\\n for (key in this.params.series) {\\n for (i = 0; i < this.params.series[key].length; i++) {\\n this.series[key][i] = new jvm.DataSeries(\\n this.params.series[key][i],\\n this[key],\\n this\\n );\\n }\\n }\\n },\\n\\n /**\\n * Gracefully remove the map and and all its accessories, unbind event handlers.\\n */\\n remove: function(){\\n this.tip.remove();\\n this.container.remove();\\n jvm.$(window).unbind('resize', this.onResize);\\n jvm.$('body').unbind('mouseup', this.onContainerMouseUp);\\n }\\n};\\n\\njvm.Map.maps = {};\\njvm.Map.defaultParams = {\\n map: 'world_mill_en',\\n backgroundColor: '#505050',\\n zoomButtons: true,\\n zoomOnScroll: true,\\n zoomOnScrollSpeed: 3,\\n panOnDrag: true,\\n zoomMax: 8,\\n zoomMin: 1,\\n zoomStep: 1.6,\\n zoomAnimate: true,\\n regionsSelectable: false,\\n markersSelectable: false,\\n bindTouchEvents: true,\\n regionStyle: {\\n initial: {\\n fill: 'white',\\n \\\"fill-opacity\\\": 1,\\n stroke: 'none',\\n \\\"stroke-width\\\": 0,\\n \\\"stroke-opacity\\\": 1\\n },\\n hover: {\\n \\\"fill-opacity\\\": 0.8,\\n cursor: 'pointer'\\n },\\n selected: {\\n fill: 'yellow'\\n },\\n selectedHover: {\\n }\\n },\\n regionLabelStyle: {\\n initial: {\\n 'font-family': 'Verdana',\\n 'font-size': '12',\\n 'font-weight': 'bold',\\n cursor: 'default',\\n fill: 'black'\\n },\\n hover: {\\n cursor: 'pointer'\\n }\\n },\\n markerStyle: {\\n initial: {\\n fill: 'grey',\\n stroke: '#505050',\\n \\\"fill-opacity\\\": 1,\\n \\\"stroke-width\\\": 1,\\n \\\"stroke-opacity\\\": 1,\\n r: 5\\n },\\n hover: {\\n stroke: 'black',\\n \\\"stroke-width\\\": 2,\\n cursor: 'pointer'\\n },\\n selected: {\\n fill: 'blue'\\n },\\n selectedHover: {\\n }\\n },\\n markerLabelStyle: {\\n initial: {\\n 'font-family': 'Verdana',\\n 'font-size': '12',\\n 'font-weight': 'bold',\\n cursor: 'default',\\n fill: 'black'\\n },\\n hover: {\\n cursor: 'pointer'\\n }\\n }\\n};\\njvm.Map.apiEvents = {\\n onRegionTipShow: 'regionTipShow',\\n onRegionOver: 'regionOver',\\n onRegionOut: 'regionOut',\\n onRegionClick: 'regionClick',\\n onRegionSelected: 'regionSelected',\\n onMarkerTipShow: 'markerTipShow',\\n onMarkerOver: 'markerOver',\\n onMarkerOut: 'markerOut',\\n onMarkerClick: 'markerClick',\\n onMarkerSelected: 'markerSelected',\\n onViewportChange: 'viewportChange'\\n};\\n/**\\n * Creates map with drill-down functionality.\\n * @constructor\\n * @param {Object} params Parameters to initialize map with.\\n * @param {Number} params.maxLevel Maximum number of levels user can go through\\n * @param {Object} params.main Config of the main map. See <a href=\\\"./jvm-map/\\\">jvm.Map</a> for more information.\\n * @param {Function} params.mapNameByCode Function go generate map name by region code. Default value is:\\n<pre>\\nfunction(code, multiMap) {\\n return code.toLowerCase()+'_'+\\n multiMap.defaultProjection+'_en';\\n}\\n</pre>\\n * @param {Function} params.mapUrlByCode Function to generate map url by region code. Default value is:\\n<pre>\\nfunction(code, multiMap){\\n return 'jquery-jvectormap-data-'+\\n code.toLowerCase()+'-'+\\n multiMap.defaultProjection+'-en.js';\\n}\\n</pre>\\n */\\njvm.MultiMap = function(params) {\\n var that = this;\\n\\n this.maps = {};\\n this.params = jvm.$.extend(true, {}, jvm.MultiMap.defaultParams, params);\\n this.params.maxLevel = this.params.maxLevel || Number.MAX_VALUE;\\n this.params.main = this.params.main || {};\\n this.params.main.multiMapLevel = 0;\\n this.history = [ this.addMap(this.params.main.map, this.params.main) ];\\n this.defaultProjection = this.history[0].mapData.projection.type;\\n this.mapsLoaded = {};\\n\\n this.params.container.css({position: 'relative'});\\n this.backButton = jvm.$('<div/>').addClass('jvectormap-goback').text('Back').appendTo(this.params.container);\\n this.backButton.hide();\\n this.backButton.click(function(){\\n that.goBack();\\n });\\n\\n this.spinner = jvm.$('<div/>').addClass('jvectormap-spinner').appendTo(this.params.container);\\n this.spinner.hide();\\n};\\n\\njvm.MultiMap.prototype = {\\n addMap: function(name, config){\\n var cnt = jvm.$('<div/>').css({\\n width: '100%',\\n height: '100%'\\n });\\n\\n this.params.container.append(cnt);\\n\\n this.maps[name] = new jvm.Map(jvm.$.extend(config, {container: cnt}));\\n if (this.params.maxLevel > config.multiMapLevel) {\\n this.maps[name].container.on('regionClick.jvectormap', {scope: this}, function(e, code){\\n var multimap = e.data.scope,\\n mapName = multimap.params.mapNameByCode(code, multimap);\\n\\n if (!multimap.drillDownPromise || multimap.drillDownPromise.state() !== 'pending') {\\n multimap.drillDown(mapName, code);\\n }\\n });\\n }\\n\\n\\n return this.maps[name];\\n },\\n\\n downloadMap: function(code){\\n var that = this,\\n deferred = jvm.$.Deferred();\\n\\n if (!this.mapsLoaded[code]) {\\n jvm.$.get(this.params.mapUrlByCode(code, this)).then(function(){\\n that.mapsLoaded[code] = true;\\n deferred.resolve();\\n }, function(){\\n deferred.reject();\\n });\\n } else {\\n deferred.resolve();\\n }\\n return deferred;\\n },\\n\\n drillDown: function(name, code){\\n var currentMap = this.history[this.history.length - 1],\\n that = this,\\n focusPromise = currentMap.setFocus({region: code, animate: true}),\\n downloadPromise = this.downloadMap(code);\\n\\n focusPromise.then(function(){\\n if (downloadPromise.state() === 'pending') {\\n that.spinner.show();\\n }\\n });\\n downloadPromise.always(function(){\\n that.spinner.hide();\\n });\\n this.drillDownPromise = jvm.$.when(downloadPromise, focusPromise);\\n this.drillDownPromise.then(function(){\\n currentMap.params.container.hide();\\n if (!that.maps[name]) {\\n that.addMap(name, {map: name, multiMapLevel: currentMap.params.multiMapLevel + 1});\\n } else {\\n that.maps[name].params.container.show();\\n }\\n that.history.push( that.maps[name] );\\n that.backButton.show();\\n });\\n },\\n\\n goBack: function(){\\n var currentMap = this.history.pop(),\\n prevMap = this.history[this.history.length - 1],\\n that = this;\\n\\n currentMap.setFocus({scale: 1, x: 0.5, y: 0.5, animate: true}).then(function(){\\n currentMap.params.container.hide();\\n prevMap.params.container.show();\\n prevMap.updateSize();\\n if (that.history.length === 1) {\\n that.backButton.hide();\\n }\\n prevMap.setFocus({scale: 1, x: 0.5, y: 0.5, animate: true});\\n });\\n }\\n};\\n\\njvm.MultiMap.defaultParams = {\\n mapNameByCode: function(code, multiMap){\\n return code.toLowerCase()+'_'+multiMap.defaultProjection+'_en';\\n },\\n mapUrlByCode: function(code, multiMap){\\n return 'jquery-jvectormap-data-'+code.toLowerCase()+'-'+multiMap.defaultProjection+'-en.js';\\n }\\n}\\n\"\n\n/***/ }),\n\n/***/ 2223:\n/***/ (function(module, exports, __webpack_require__) {\n\n__webpack_require__(3)(__webpack_require__(2224))\n\n/***/ }),\n\n/***/ 2224:\n/***/ (function(module, exports) {\n\nmodule.exports = \"$.fn.vectorMap('addMap', 'world_mill_en',{\\\"insets\\\": [{\\\"width\\\": 900.0, \\\"top\\\": 0, \\\"height\\\": 440.7063107441331, \\\"bbox\\\": [{\\\"y\\\": -12671671.123330014, \\\"x\\\": -20004297.151525836}, {\\\"y\\\": 6930392.02513512, \\\"x\\\": 20026572.394749384}], \\\"left\\\": 0}], \\\"paths\\\": {\\\"BD\\\": {\\\"path\\\": \\\"M652.71,228.85l-0.04,1.38l-0.46,-0.21l-0.42,0.3l0.05,0.65l-0.17,-1.37l-0.48,-1.26l-1.08,-1.6l-0.23,-0.13l-2.31,-0.11l-0.31,0.36l0.21,0.98l-0.6,1.11l-0.8,-0.4l-0.37,0.09l-0.23,0.3l-0.54,-0.21l-0.78,-0.19l-0.38,-2.04l-0.83,-1.89l0.4,-1.5l-0.16,-0.35l-1.24,-0.57l0.36,-0.62l1.5,-0.95l0.02,-0.49l-1.62,-1.26l0.64,-1.31l1.7,1.0l0.12,0.04l0.96,0.11l0.19,1.62l0.25,0.26l2.38,0.37l2.32,-0.04l1.06,0.33l-0.92,1.79l-0.97,0.13l-0.23,0.16l-0.77,1.51l0.05,0.35l1.37,1.37l0.5,-0.14l0.35,-1.46l0.24,-0.0l1.24,3.92Z\\\", \\\"name\\\": \\\"Bangladesh\\\"}, \\\"BE\\\": {\\\"path\\\": \\\"M429.28,143.95l1.76,0.25l0.13,-0.01l2.16,-0.64l1.46,1.34l1.26,0.71l-0.23,1.8l-0.44,0.08l-0.24,0.25l-0.2,1.36l-1.8,-1.22l-0.23,-0.05l-1.14,0.23l-1.62,-1.43l-1.15,-1.31l-0.21,-0.1l-0.95,-0.04l-0.21,-0.68l1.66,-0.54Z\\\", \\\"name\\\": \\\"Belgium\\\"}, \\\"BF\\\": {\\\"path\\\": \\\"M413.48,260.21l-1.22,-0.46l-0.13,-0.02l-1.17,0.1l-0.15,0.06l-0.73,0.53l-0.87,-0.41l-0.39,-0.75l-0.13,-0.13l-0.98,-0.48l-0.14,-1.2l0.63,-0.99l0.05,-0.18l-0.05,-0.73l1.9,-2.01l0.08,-0.14l0.35,-1.65l0.49,-0.44l1.05,0.3l0.21,-0.02l1.05,-0.52l0.13,-0.13l0.3,-0.58l1.87,-1.1l0.11,-0.1l0.43,-0.72l2.23,-1.01l1.21,-0.32l0.51,0.4l0.19,0.06l1.25,-0.01l-0.14,0.89l0.01,0.13l0.34,1.16l0.06,0.11l1.35,1.59l0.07,1.13l0.24,0.28l2.64,0.53l-0.05,1.39l-0.42,0.59l-1.11,0.21l-0.22,0.17l-0.46,0.99l-0.69,0.23l-2.12,-0.05l-1.14,-0.2l-0.19,0.03l-0.72,0.36l-1.07,-0.17l-4.35,0.12l-0.29,0.29l-0.06,1.44l0.25,1.45Z\\\", \\\"name\\\": \\\"Burkina Faso\\\"}, \\\"BG\\\": {\\\"path\\\": \\\"M477.63,166.84l0.51,0.9l0.33,0.14l0.9,-0.21l1.91,0.47l3.68,0.16l0.17,-0.05l1.2,-0.75l2.78,-0.67l1.72,1.05l1.02,0.24l-0.97,0.97l-0.91,2.17l0.0,0.24l0.56,1.19l-1.58,-0.3l-0.16,0.01l-2.55,0.95l-0.2,0.28l-0.02,1.23l-1.92,0.24l-1.68,-0.99l-0.27,-0.02l-1.94,0.8l-1.52,-0.07l-0.15,-1.72l-0.12,-0.21l-0.99,-0.76l0.18,-0.18l0.02,-0.39l-0.17,-0.22l0.33,-0.75l0.91,-0.91l0.01,-0.42l-1.16,-1.25l-0.18,-0.89l0.24,-0.27Z\\\", \\\"name\\\": \\\"Bulgaria\\\"}, \\\"BA\\\": {\\\"path\\\": \\\"M468.39,164.66l0.16,0.04l0.43,-0.0l-0.43,0.93l0.06,0.34l1.08,1.06l-0.28,1.09l-0.5,0.13l-0.47,0.28l-0.86,0.74l-0.1,0.16l-0.28,1.29l-1.81,-0.94l-0.9,-1.22l-1.0,-0.73l-1.1,-1.1l-0.55,-0.96l-1.11,-1.3l0.3,-0.75l0.59,0.46l0.42,-0.04l0.46,-0.54l1.0,-0.06l2.11,0.5l1.72,-0.03l1.06,0.64Z\\\", \\\"name\\\": \\\"Bosnia and Herzegovina\\\"}, \\\"BN\\\": {\\\"path\\\": \\\"M707.34,273.57l0.76,-0.72l1.59,-1.03l-0.18,1.93l-0.9,-0.06l-0.28,0.14l-0.31,0.51l-0.68,-0.78Z\\\", \\\"name\\\": \\\"Brunei\\\"}, \\\"BO\\\": {\\\"path\\\": \\\"M263.83,340.79l-0.23,-0.12l-2.86,-0.11l-0.28,0.17l-0.77,1.67l-1.17,-1.51l-0.18,-0.11l-3.28,-0.64l-0.28,0.1l-2.02,2.3l-1.43,0.29l-0.91,-3.35l-1.31,-2.88l0.75,-2.41l-0.09,-0.32l-1.23,-1.03l-0.31,-1.76l-0.05,-0.12l-1.12,-1.6l1.49,-2.62l0.01,-0.28l-1.0,-2.0l0.48,-0.72l0.02,-0.29l-0.37,-0.78l0.87,-1.13l0.06,-0.18l0.05,-2.17l0.12,-1.71l0.5,-0.8l0.01,-0.3l-1.9,-3.58l1.3,0.15l1.34,-0.05l0.23,-0.12l0.51,-0.7l2.12,-0.99l1.31,-0.93l2.81,-0.37l-0.21,1.51l0.01,0.13l0.29,0.91l-0.19,1.64l0.11,0.27l2.72,2.27l0.15,0.07l2.71,0.41l0.92,0.88l0.12,0.07l1.64,0.49l1.0,0.71l0.18,0.06l1.5,-0.02l1.24,0.64l0.1,1.31l0.05,0.14l0.44,0.68l0.02,0.73l-0.44,0.03l-0.27,0.39l0.96,2.99l0.28,0.21l4.43,0.1l-0.28,1.12l0.0,0.15l0.27,1.02l0.15,0.19l1.27,0.67l0.52,1.42l-0.42,1.91l-0.66,1.1l-0.04,0.2l0.21,1.3l-0.19,0.13l-0.01,-0.27l-0.15,-0.24l-2.33,-1.33l-0.14,-0.04l-2.38,-0.03l-4.36,0.76l-0.21,0.16l-1.2,2.29l-0.03,0.13l-0.06,1.37l-0.79,2.53l-0.05,-0.08Z\\\", \\\"name\\\": \\\"Bolivia\\\"}, \\\"JP\\\": {\\\"path\\\": \\\"M781.17,166.78l1.8,0.67l0.28,-0.04l1.38,-1.01l0.43,2.67l-3.44,0.77l-0.18,0.12l-2.04,2.79l-3.71,-1.94l-0.42,0.15l-1.29,3.11l-2.32,0.04l-0.3,-2.63l1.12,-2.1l2.51,-0.16l0.28,-0.25l0.73,-4.22l0.58,-1.9l2.59,2.84l2.0,1.1ZM773.66,187.36l-0.92,2.24l-0.01,0.2l0.4,1.3l-1.18,1.81l-3.06,1.28l-4.35,0.17l-0.19,0.08l-3.4,3.06l-1.36,-0.87l-0.1,-1.95l-0.34,-0.28l-4.35,0.62l-2.99,1.33l-2.87,0.05l-0.28,0.2l0.09,0.33l2.37,1.93l-1.57,4.44l-1.35,0.97l-0.9,-0.79l0.57,-2.32l-0.15,-0.34l-1.5,-0.77l-0.81,-1.53l2.04,-0.75l0.14,-0.1l1.28,-1.72l2.47,-1.43l1.84,-1.92l4.83,-0.82l2.62,0.57l0.33,-0.16l2.45,-4.77l1.38,1.14l0.38,0.0l5.1,-4.02l0.09,-0.11l1.57,-3.57l0.02,-0.16l-0.42,-3.22l0.94,-1.67l2.27,-0.47l1.26,3.82l-0.07,2.23l-2.26,2.86l-0.06,0.19l0.04,2.93ZM757.85,196.18l0.22,0.66l-1.11,1.33l-0.8,-0.7l-0.33,-0.04l-1.28,0.65l-0.14,0.15l-0.54,1.34l-1.17,-0.57l0.02,-1.03l1.2,-1.45l1.24,0.28l0.29,-0.1l0.9,-1.03l1.51,0.5Z\\\", \\\"name\\\": \\\"Japan\\\"}, \\\"BI\\\": {\\\"path\\\": \\\"M494.7,295.83l-0.14,-2.71l-0.04,-0.13l-0.34,-0.62l0.93,0.12l0.3,-0.16l0.67,-1.25l0.9,0.11l0.11,0.76l0.08,0.16l0.46,0.48l0.02,0.56l-0.55,0.48l-0.96,1.29l-0.82,0.82l-0.61,0.07Z\\\", \\\"name\\\": \\\"Burundi\\\"}, \\\"BJ\\\": {\\\"path\\\": \\\"M427.4,268.94l-1.58,0.22l-0.52,-1.45l0.11,-5.73l-0.08,-0.21l-0.43,-0.44l-0.09,-1.13l-0.09,-0.19l-1.52,-1.52l0.24,-1.01l0.7,-0.23l0.18,-0.16l0.45,-0.97l1.07,-0.21l0.19,-0.12l0.53,-0.73l0.73,-0.65l0.68,-0.0l1.69,1.3l-0.08,0.67l0.02,0.14l0.52,1.38l-0.44,0.9l-0.01,0.24l0.2,0.52l-1.1,1.42l-0.76,0.76l-0.08,0.13l-0.47,1.59l0.05,1.69l-0.13,3.79Z\\\", \\\"name\\\": \\\"Benin\\\"}, \\\"BT\\\": {\\\"path\\\": \\\"M650.38,213.78l0.88,0.75l-0.13,1.24l-1.77,0.07l-2.1,-0.18l-1.57,0.4l-2.02,-0.91l-0.02,-0.24l1.54,-1.87l1.18,-0.6l1.67,0.59l1.32,0.08l1.01,0.67Z\\\", \\\"name\\\": \\\"Bhutan\\\"}, \\\"JM\\\": {\\\"path\\\": \\\"M226.67,238.37l1.64,0.23l1.2,0.56l0.11,0.19l-1.25,0.03l-0.14,0.04l-0.65,0.37l-1.24,-0.37l-1.17,-0.77l0.11,-0.22l0.86,-0.15l0.52,0.08Z\\\", \\\"name\\\": \\\"Jamaica\\\"}, \\\"BW\\\": {\\\"path\\\": \\\"M484.91,331.96l0.53,0.52l0.82,1.53l2.83,2.86l0.14,0.08l0.85,0.22l0.03,0.81l0.74,1.66l0.21,0.17l1.87,0.39l1.17,0.87l-3.13,1.71l-2.3,2.01l-0.07,0.1l-0.82,1.74l-0.66,0.88l-1.24,0.19l-0.24,0.2l-0.65,1.98l-1.4,0.55l-1.9,-0.12l-1.2,-0.74l-1.06,-0.32l-0.22,0.02l-1.22,0.62l-0.14,0.14l-0.58,1.21l-1.16,0.79l-1.18,1.13l-1.5,0.23l-0.4,-0.68l0.22,-1.53l-0.04,-0.19l-1.48,-2.54l-0.11,-0.11l-0.53,-0.31l-0.0,-7.25l2.18,-0.08l0.29,-0.3l0.07,-9.0l1.63,-0.08l3.69,-0.86l0.84,0.93l0.38,0.05l1.53,-0.97l0.79,-0.03l1.3,-0.53l0.23,0.1l0.92,1.96Z\\\", \\\"name\\\": \\\"Botswana\\\"}, \\\"BR\\\": {\\\"path\\\": \\\"M259.49,274.87l1.42,0.25l1.97,0.62l0.28,-0.05l0.67,-0.55l1.76,-0.38l2.8,-0.94l0.12,-0.08l0.92,-0.96l0.05,-0.33l-0.15,-0.32l0.73,-0.06l0.36,0.35l-0.27,0.93l0.17,0.36l0.76,0.34l0.44,0.9l-0.58,0.73l-0.06,0.13l-0.4,2.13l0.03,0.19l0.62,1.22l0.17,1.11l0.11,0.19l1.54,1.18l0.15,0.06l1.23,0.12l0.29,-0.15l0.2,-0.36l0.71,-0.11l1.13,-0.44l0.79,-0.63l1.25,0.19l0.65,-0.08l1.32,0.2l0.32,-0.18l0.23,-0.51l-0.05,-0.31l-0.31,-0.37l0.11,-0.31l0.75,0.17l0.13,0.0l1.1,-0.24l1.34,0.5l1.08,0.51l0.33,-0.05l0.67,-0.58l0.27,0.05l0.28,0.57l0.31,0.17l1.2,-0.18l0.17,-0.08l1.03,-1.05l0.76,-1.82l1.39,-2.16l0.49,-0.07l0.52,1.17l1.4,4.37l0.2,0.2l1.14,0.35l0.05,1.39l-1.8,1.97l0.01,0.42l0.78,0.75l0.18,0.08l4.16,0.37l0.08,2.25l0.5,0.22l1.78,-1.54l2.98,0.85l4.07,1.5l1.07,1.28l-0.37,1.23l0.36,0.38l2.83,-0.75l4.8,1.3l3.75,-0.09l3.6,2.02l3.27,2.84l1.93,0.72l2.13,0.11l0.76,0.66l1.22,4.56l-0.96,4.03l-1.22,1.58l-3.52,3.51l-1.63,2.91l-1.75,2.09l-0.5,0.04l-0.26,0.19l-0.72,1.99l0.18,4.76l-0.95,5.56l-0.74,0.96l-0.06,0.15l-0.43,3.39l-2.49,3.34l-0.06,0.13l-0.4,2.56l-1.9,1.07l-0.13,0.16l-0.51,1.38l-2.59,0.0l-3.94,1.01l-1.82,1.19l-2.85,0.81l-3.01,2.17l-2.12,2.65l-0.06,0.13l-0.36,2.0l0.01,0.13l0.4,1.42l-0.45,2.63l-0.53,1.23l-1.76,1.53l-2.76,4.79l-2.16,2.15l-1.69,1.29l-0.09,0.12l-1.12,2.6l-1.3,1.26l-0.45,-1.02l0.99,-1.18l0.01,-0.37l-1.5,-1.95l-1.98,-1.54l-2.58,-1.77l-0.2,-0.05l-0.81,0.07l-2.42,-2.05l-0.25,-0.07l-0.77,0.14l2.75,-3.07l2.8,-2.61l1.67,-1.09l2.11,-1.49l0.13,-0.24l0.05,-2.15l-0.07,-0.2l-1.26,-1.54l-0.35,-0.09l-0.64,0.27l0.3,-0.95l0.34,-1.57l0.01,-1.52l-0.16,-0.26l-0.9,-0.48l-0.27,-0.01l-0.86,0.39l-0.65,-0.08l-0.23,-0.8l-0.23,-2.39l-0.04,-0.12l-0.47,-0.79l-0.14,-0.12l-1.69,-0.71l-0.25,0.01l-0.93,0.47l-2.29,-0.44l0.15,-3.3l-0.03,-0.15l-0.62,-1.22l0.57,-0.39l0.13,-0.3l-0.22,-1.37l0.67,-1.13l0.44,-2.04l-0.01,-0.17l-0.59,-1.61l-0.14,-0.16l-1.25,-0.66l-0.22,-0.82l0.35,-1.41l-0.28,-0.37l-4.59,-0.1l-0.78,-2.41l0.34,-0.02l0.28,-0.31l-0.03,-1.1l-0.05,-0.16l-0.45,-0.68l-0.1,-1.4l-0.16,-0.24l-1.45,-0.76l-0.14,-0.03l-1.48,0.02l-1.04,-0.73l-1.62,-0.48l-0.93,-0.9l-0.16,-0.08l-2.72,-0.41l-2.53,-2.12l0.18,-1.54l-0.01,-0.13l-0.29,-0.91l0.26,-1.83l-0.34,-0.34l-3.28,0.43l-0.14,0.05l-1.3,0.93l-2.16,1.01l-0.12,0.09l-0.47,0.65l-1.12,0.05l-1.84,-0.21l-0.12,0.01l-1.33,0.41l-0.82,-0.21l0.16,-3.6l-0.48,-0.26l-1.97,1.43l-1.96,-0.06l-0.86,-1.23l-0.22,-0.13l-1.23,-0.11l0.34,-0.69l-0.05,-0.33l-1.36,-1.5l-0.92,-2.0l0.45,-0.32l0.13,-0.25l-0.0,-0.87l1.34,-0.64l0.17,-0.32l-0.23,-1.23l0.56,-0.77l0.05,-0.13l0.16,-1.03l2.7,-1.61l2.01,-0.47l0.16,-0.09l0.24,-0.27l2.11,0.11l0.31,-0.25l1.13,-6.87l0.06,-1.12l-0.4,-1.53l-0.1,-0.15l-1.0,-0.82l0.01,-1.45l1.08,-0.32l0.39,0.2l0.44,-0.24l0.08,-0.96l-0.25,-0.32l-1.22,-0.22l-0.02,-1.01l4.57,0.05l0.22,-0.09l0.6,-0.63l0.44,0.5l0.47,1.42l0.45,0.16l0.27,-0.18l1.21,1.16l0.23,0.08l1.95,-0.16l0.23,-0.14l0.43,-0.67l1.76,-0.55l1.05,-0.42l0.18,-0.2l0.25,-0.92l1.65,-0.66l0.18,-0.35l-0.14,-0.53l-0.26,-0.22l-1.91,-0.19l-0.29,-1.33l0.1,-1.64l-0.15,-0.28l-0.44,-0.25Z\\\", \\\"name\\\": \\\"Brazil\\\"}, \\\"BS\\\": {\\\"path\\\": \\\"M227.51,216.69l0.3,0.18l-0.24,1.07l0.03,-1.04l-0.09,-0.21ZM226.5,224.03l-0.13,0.03l-0.54,-1.3l-0.09,-0.12l-0.78,-0.64l0.4,-1.26l0.33,0.05l0.79,2.0l0.01,1.24ZM225.76,216.5l-2.16,0.34l-0.07,-0.41l0.85,-0.16l1.36,0.07l0.02,0.16Z\\\", \\\"name\\\": \\\"The Bahamas\\\"}, \\\"BY\\\": {\\\"path\\\": \\\"M480.08,135.28l2.09,0.02l0.13,-0.03l2.72,-1.3l0.16,-0.19l0.55,-1.83l1.94,-1.06l0.15,-0.31l-0.2,-1.33l1.33,-0.52l2.58,-1.3l2.39,0.8l0.3,0.75l0.37,0.17l1.22,-0.39l2.18,0.75l0.2,1.36l-0.48,0.85l0.01,0.32l1.57,2.26l0.92,0.6l-0.1,0.41l0.19,0.35l1.61,0.57l0.48,0.6l-0.64,0.49l-1.91,-0.11l-0.18,0.05l-0.48,0.32l-0.1,0.39l0.57,1.1l0.51,1.78l-1.79,0.17l-0.18,0.08l-0.77,0.73l-0.09,0.19l-0.13,1.31l-0.75,-0.22l-2.11,0.15l-0.56,-0.66l-0.39,-0.06l-0.8,0.49l-0.79,-0.4l-0.13,-0.03l-1.94,-0.07l-2.76,-0.79l-2.58,-0.27l-1.98,0.07l-0.15,0.05l-1.31,0.86l-0.8,0.09l-0.04,-1.16l-0.03,-0.12l-0.63,-1.28l1.22,-0.56l0.17,-0.27l0.01,-1.35l-0.04,-0.15l-0.66,-1.24l-0.08,-1.12Z\\\", \\\"name\\\": \\\"Belarus\\\"}, \\\"BZ\\\": {\\\"path\\\": \\\"M198.03,239.7l0.28,0.19l0.43,-0.1l0.82,-1.42l0.0,0.07l0.29,0.29l0.16,0.0l-0.02,0.35l-0.39,1.08l0.02,0.25l0.16,0.29l-0.23,0.8l0.04,0.24l0.09,0.14l-0.25,1.12l-0.38,0.53l-0.33,0.06l-0.21,0.15l-0.41,0.74l-0.25,0.0l0.17,-2.58l0.01,-2.2Z\\\", \\\"name\\\": \\\"Belize\\\"}, \\\"RU\\\": {\\\"path\\\": \\\"M688.57,38.85l0.63,2.39l0.44,0.19l2.22,-1.23l7.18,0.07l5.54,2.49l1.85,1.77l-0.55,2.34l-2.64,1.42l-6.57,2.76l-1.95,1.5l0.12,0.53l3.09,0.68l3.69,1.23l0.21,-0.01l1.98,-0.81l1.16,2.84l0.5,0.08l1.03,-1.18l3.86,-0.74l7.79,0.78l0.56,2.05l0.27,0.22l10.47,0.71l0.32,-0.29l0.13,-3.34l4.98,0.8l3.96,-0.02l3.88,2.43l1.06,2.79l-1.38,1.83l0.01,0.38l3.15,3.64l0.1,0.08l3.94,1.86l0.4,-0.14l2.28,-4.56l3.75,1.94l0.22,0.02l4.18,-1.22l4.76,1.4l0.26,-0.04l1.74,-1.23l3.98,0.63l0.32,-0.41l-1.71,-4.1l3.0,-1.86l22.39,3.04l2.06,2.67l0.1,0.08l6.55,3.51l0.17,0.03l10.08,-0.86l4.86,0.73l1.91,1.72l-0.29,3.13l0.18,0.31l3.08,1.26l0.19,0.01l3.32,-0.9l4.37,-0.11l4.78,0.87l4.61,-0.48l4.26,3.82l0.32,0.05l3.1,-1.4l0.12,-0.45l-1.91,-2.67l0.92,-1.64l7.78,1.22l5.22,-0.26l7.12,2.1l9.6,5.22l6.4,4.15l-0.2,2.44l0.14,0.28l1.69,1.04l0.45,-0.31l-0.51,-2.66l6.31,0.58l4.52,3.61l-2.1,1.52l-4.02,0.42l-0.27,0.29l-0.06,3.83l-0.81,0.67l-2.14,-0.11l-1.91,-1.39l-3.19,-1.13l-0.51,-1.63l-0.21,-0.2l-2.54,-0.67l-0.13,-0.0l-2.69,0.5l-1.12,-1.19l0.48,-1.36l-0.38,-0.39l-3.0,0.98l-0.17,0.44l1.02,1.76l-1.27,1.55l-3.09,1.71l-3.15,-0.29l-0.3,0.18l0.07,0.34l2.22,2.1l1.47,3.22l1.15,1.09l0.25,1.41l-0.48,0.76l-4.47,-0.81l-0.17,0.02l-6.97,2.9l-2.2,0.44l-0.11,0.05l-3.83,2.68l-3.63,2.32l-0.1,0.11l-0.76,1.4l-3.3,-2.4l-0.3,-0.03l-6.31,2.85l-0.99,-1.21l-0.4,-0.06l-2.32,1.54l-3.23,-0.49l-0.33,0.2l-0.79,2.39l-2.97,3.51l-0.07,0.21l0.09,1.47l0.22,0.27l2.62,0.74l-0.3,4.7l-2.06,0.12l-0.26,0.2l-1.07,2.94l0.04,0.27l0.83,1.19l-4.03,1.63l-0.18,0.21l-0.83,3.72l-3.55,0.79l-0.23,0.23l-0.73,3.32l-3.22,2.76l-0.76,-1.88l-1.07,-4.88l-1.39,-7.59l1.17,-4.76l2.05,-2.08l0.09,-0.19l0.11,-1.46l3.67,-0.77l0.15,-0.08l4.47,-4.61l4.29,-3.82l4.48,-3.01l0.11,-0.14l2.01,-5.43l-0.31,-0.4l-3.04,0.33l-0.24,0.17l-1.47,3.11l-5.98,3.94l-1.91,-4.36l-0.33,-0.17l-6.46,1.3l-0.15,0.08l-6.27,6.33l-0.01,0.41l1.7,1.87l-5.04,0.87l-3.51,0.34l0.16,-2.32l-0.26,-0.32l-3.89,-0.56l-0.19,0.04l-3.02,1.77l-7.63,-0.63l-8.24,1.1l-0.16,0.07l-8.11,7.09l-9.6,8.31l0.16,0.52l3.79,0.42l1.16,2.03l0.17,0.14l2.43,0.76l0.31,-0.08l1.5,-1.61l2.49,0.2l3.46,3.6l0.08,2.67l-1.91,3.26l-0.04,0.14l-0.21,3.91l-1.11,5.09l-3.73,4.55l-0.87,2.21l-6.73,7.14l-1.59,1.77l-3.23,1.72l-1.38,0.03l-1.48,-1.39l-0.37,-0.03l-3.36,2.22l-0.11,0.14l-0.16,0.42l-0.01,-1.09l1.0,-0.06l0.28,-0.27l0.36,-3.6l-0.61,-2.51l1.85,-0.94l2.94,0.53l0.32,-0.15l1.71,-3.1l0.84,-3.38l0.97,-1.18l1.32,-2.88l-0.34,-0.42l-4.14,0.95l-2.18,1.25l-3.51,-0.0l-0.95,-2.81l-0.1,-0.14l-2.97,-2.3l-0.11,-0.05l-4.19,-1.0l-0.89,-3.08l-0.87,-2.03l-0.95,-1.46l-1.54,-3.37l-0.12,-0.14l-2.27,-1.28l-3.83,-1.02l-3.37,0.1l-3.11,0.61l-0.13,0.06l-2.07,1.69l0.04,0.49l1.23,0.72l0.03,1.53l-1.34,1.05l-2.26,3.51l-0.05,0.17l0.02,1.27l-3.25,1.9l-2.87,-1.17l-0.14,-0.02l-2.86,0.26l-1.22,-1.02l-0.12,-0.06l-1.5,-0.35l-0.23,0.04l-3.62,2.27l-3.24,0.53l-2.28,0.79l-3.08,-0.51l-2.24,0.03l-1.49,-1.61l-2.45,-1.57l-0.11,-0.04l-2.6,-0.43l-3.17,0.43l-2.31,0.59l-3.31,-1.28l-0.45,-2.31l-0.21,-0.23l-2.94,-0.85l-2.26,-0.39l-2.77,-1.36l-0.37,0.09l-2.59,3.45l-0.03,0.32l0.91,1.74l-2.15,2.01l-3.47,-0.79l-2.44,-0.12l-1.59,-1.46l-0.2,-0.08l-2.55,-0.05l-2.12,-0.98l-0.24,-0.01l-3.85,1.57l-4.74,2.79l-2.59,0.55l-0.79,0.21l-1.21,-1.81l-0.29,-0.13l-3.05,0.41l-0.96,-1.25l-0.14,-0.1l-1.65,-0.6l-1.15,-1.82l-0.13,-0.12l-1.38,-0.6l-0.19,-0.02l-3.49,0.82l-3.35,-1.85l-0.38,0.08l-1.08,1.4l-5.36,-8.17l-3.02,-2.52l0.72,-0.85l0.01,-0.38l-0.37,-0.08l-6.22,3.21l-1.98,0.16l0.17,-1.51l-0.2,-0.31l-3.22,-1.17l-0.19,-0.0l-2.3,0.74l-0.72,-3.27l-0.24,-0.23l-4.5,-0.75l-0.21,0.04l-2.2,1.42l-6.21,1.27l-0.11,0.05l-1.16,0.81l-9.3,1.19l-0.18,0.09l-1.15,1.17l-0.02,0.39l1.56,2.01l-2.02,0.74l-0.16,0.42l0.35,0.68l-2.18,1.49l0.02,0.51l3.83,2.16l-0.45,1.13l-3.31,-0.13l-0.25,0.12l-0.57,0.77l-2.97,-1.59l-0.15,-0.04l-3.97,0.07l-0.13,0.03l-2.53,1.32l-2.84,-1.28l-5.52,-2.3l-0.12,-0.02l-3.91,0.09l-0.16,0.05l-5.17,3.6l-0.13,0.21l-0.25,1.89l-2.17,-1.6l-0.44,0.1l-2.0,3.59l0.06,0.37l0.55,0.5l-1.32,2.23l0.04,0.36l2.13,2.17l0.23,0.09l1.7,-0.08l1.42,1.89l-0.23,1.5l0.19,0.32l0.94,0.38l-0.89,1.44l-2.3,0.49l-0.17,0.11l-2.49,3.2l0.0,0.37l2.2,2.81l-0.23,1.93l0.06,0.22l2.56,3.32l-1.27,1.02l-0.4,0.66l-0.8,-0.15l-1.65,-1.75l-0.18,-0.09l-0.66,-0.09l-1.45,-0.64l-0.72,-1.16l-0.18,-0.13l-2.34,-0.63l-0.17,0.0l-1.32,0.41l-0.31,-0.4l-0.12,-0.09l-3.49,-1.48l-3.67,-0.49l-2.1,-0.52l-0.3,0.1l-0.12,0.14l-2.96,-2.4l-2.89,-1.19l-1.69,-1.42l1.27,-0.35l0.16,-0.1l2.08,-2.61l-0.04,-0.41l-1.02,-0.9l3.21,-1.12l0.2,-0.31l-0.07,-0.69l-0.37,-0.26l-1.86,0.42l0.05,-0.86l1.11,-0.76l2.35,-0.23l0.25,-0.19l0.39,-1.07l0.0,-0.19l-0.51,-1.64l0.95,-1.58l0.04,-0.16l-0.03,-0.95l-0.22,-0.28l-3.69,-1.06l-1.43,0.02l-1.45,-1.44l-0.29,-0.08l-1.83,0.49l-2.88,-1.04l0.04,-0.42l-0.04,-0.18l-0.89,-1.43l-0.23,-0.14l-1.77,-0.14l-0.13,-0.66l0.52,-0.56l0.01,-0.4l-1.6,-1.9l-0.27,-0.1l-2.55,0.32l-0.71,-0.16l-0.3,0.1l-0.53,0.63l-0.58,-0.08l-0.56,-1.97l-0.48,-0.94l0.17,-0.11l1.92,0.11l0.2,-0.06l0.97,-0.74l0.05,-0.42l-0.72,-0.91l-0.13,-0.1l-1.43,-0.51l0.09,-0.36l-0.13,-0.33l-0.97,-0.59l-1.43,-2.06l0.44,-0.77l0.04,-0.19l-0.25,-1.64l-0.2,-0.24l-2.45,-0.84l-0.19,-0.0l-1.05,0.34l-0.25,-0.62l-0.18,-0.17l-2.5,-0.84l-0.74,-1.93l-0.21,-1.7l-0.13,-0.21l-0.92,-0.63l0.83,-0.89l0.07,-0.27l-0.71,-3.26l1.69,-2.01l0.03,-0.34l-0.24,-0.41l2.63,-1.9l-0.01,-0.49l-2.31,-1.57l5.08,-4.61l2.33,-2.24l1.01,-2.08l-0.09,-0.37l-3.52,-2.56l0.94,-2.38l-0.04,-0.29l-2.14,-2.86l1.61,-3.35l-0.01,-0.29l-2.81,-4.58l2.19,-3.04l-0.06,-0.42l-3.7,-2.76l0.32,-2.67l1.87,-0.38l4.26,-1.77l2.46,-1.47l3.96,2.58l0.12,0.05l6.81,1.04l9.37,4.87l1.81,1.92l0.15,2.55l-2.61,2.06l-3.95,1.07l-11.1,-3.15l-0.17,0.0l-1.84,0.53l-0.1,0.53l3.97,2.97l0.15,1.77l0.16,4.14l0.19,0.27l3.21,1.22l1.94,1.03l0.44,-0.22l0.32,-1.94l-0.07,-0.25l-1.32,-1.52l1.25,-1.2l5.87,2.45l0.24,-0.01l2.11,-0.98l0.13,-0.42l-1.55,-2.75l5.52,-3.84l2.13,0.22l2.28,1.42l0.43,-0.12l1.46,-2.87l-0.04,-0.33l-1.97,-2.37l1.14,-2.38l-0.02,-0.3l-1.42,-2.07l6.15,1.22l1.14,1.92l-2.74,0.46l-0.25,0.3l0.02,2.36l0.12,0.24l1.97,1.44l0.25,0.05l3.87,-0.91l0.22,-0.23l0.58,-2.55l5.09,-1.98l8.67,-3.69l1.22,0.14l-2.06,2.2l0.18,0.5l3.11,0.45l0.23,-0.07l1.71,-1.41l4.59,-0.12l0.12,-0.03l3.53,-1.72l2.7,2.48l0.42,-0.01l2.85,-2.88l-0.0,-0.43l-2.42,-2.35l1.0,-1.13l7.2,1.31l3.42,1.36l9.06,4.97l0.39,-0.08l1.67,-2.27l-0.04,-0.4l-2.46,-2.23l-0.06,-0.82l-0.26,-0.27l-2.64,-0.38l0.69,-1.76l0.0,-0.22l-1.32,-3.47l-0.07,-1.27l4.52,-4.09l0.08,-0.11l1.6,-4.18l1.67,-0.84l6.33,1.2l0.46,2.31l-2.31,3.67l0.05,0.38l1.49,1.41l0.77,3.04l-0.56,6.05l0.09,0.24l2.62,2.54l-0.99,2.65l-4.87,5.96l0.17,0.48l2.86,0.61l0.31,-0.13l0.94,-1.42l2.67,-1.04l0.18,-0.19l0.64,-2.01l2.11,-1.98l0.05,-0.37l-1.38,-2.32l1.11,-2.74l-0.24,-0.41l-2.53,-0.33l-0.53,-2.16l1.96,-4.42l-0.05,-0.32l-3.03,-3.48l4.21,-2.94l0.12,-0.3l-0.52,-3.04l0.72,-0.06l1.18,2.35l-0.97,4.39l0.2,0.35l2.68,0.84l0.37,-0.38l-1.05,-3.07l3.89,-1.71l5.05,-0.24l4.55,2.62l0.36,-0.05l0.05,-0.36l-2.19,-3.84l-0.23,-4.78l4.07,-0.92l5.98,0.21l5.47,-0.64l0.2,-0.48l-1.88,-2.37l2.65,-2.99l2.75,-0.13l0.12,-0.03l4.82,-2.48l6.56,-0.67l0.23,-0.14l0.76,-1.27l6.33,-0.46l1.97,1.11l0.28,0.01l5.55,-2.71l4.53,0.08l0.29,-0.21l0.67,-2.18l2.29,-2.15l5.75,-2.13l3.48,1.4l-2.7,1.03l-0.19,0.31l0.26,0.26l5.47,0.78ZM871.83,65.73l0.25,-0.15l1.99,0.01l3.3,1.2l-0.08,0.22l-2.41,1.03l-5.73,0.49l-0.31,-1.0l2.99,-1.8ZM797.64,48.44l-2.22,1.51l-3.85,-0.43l-4.35,-1.85l0.42,-1.13l4.42,0.72l5.59,1.17ZM783.82,46.06l-1.71,3.25l-9.05,-0.14l-4.11,1.15l-4.64,-3.04l1.21,-3.13l3.11,-0.91l6.53,0.22l8.66,2.59ZM780.37,145.71l2.28,5.23l-3.09,-0.89l-0.37,0.19l-1.54,4.65l0.04,0.27l2.38,3.17l-0.05,1.4l-1.41,-1.41l-0.46,0.04l-1.23,1.81l-0.33,-1.86l0.28,-3.1l-0.28,-3.41l0.58,-2.46l0.11,-4.39l-0.03,-0.13l-1.44,-3.2l0.21,-4.39l2.19,-1.49l0.09,-0.41l-0.81,-1.3l0.48,-0.21l0.56,1.94l0.86,3.23l-0.05,3.36l1.03,3.35ZM780.16,57.18l-3.4,0.03l-5.06,-0.53l1.97,-1.59l2.95,-0.42l3.35,1.75l0.18,0.77ZM683.84,31.18l-13.29,1.97l4.16,-6.56l1.88,-0.58l1.77,0.34l6.08,3.02l-0.6,1.8ZM670.94,28.02l-5.18,0.65l-6.89,-1.58l-4.03,-2.07l-1.88,-3.98l-0.18,-0.16l-2.8,-0.93l5.91,-3.62l5.25,-1.29l4.73,2.88l5.63,5.44l-0.57,4.66ZM564.37,68.98l-0.85,0.23l-7.93,-0.57l-0.6,-1.84l-0.21,-0.2l-4.34,-1.18l-0.3,-2.08l2.34,-0.92l0.19,-0.29l-0.08,-2.43l4.85,-4.0l-0.12,-0.52l-1.68,-0.43l5.47,-3.94l0.11,-0.33l-0.6,-2.02l5.36,-2.55l8.22,-3.27l8.29,-0.96l4.34,-1.94l4.67,-0.65l1.45,1.72l-1.43,1.37l-8.8,2.52l-7.65,2.42l-7.92,4.84l-3.73,4.75l-3.92,4.58l-0.07,0.23l0.51,3.88l0.11,0.2l4.32,3.39ZM548.86,18.57l-3.28,0.75l-2.25,0.44l-0.22,0.19l-0.3,0.81l-2.67,0.86l-2.27,-1.14l1.2,-1.51l-0.23,-0.49l-3.14,-0.1l2.48,-0.54l3.55,-0.07l0.44,1.36l0.49,0.12l1.4,-1.35l2.2,-0.9l3.13,1.08l-0.54,0.49ZM477.5,133.25l-4.21,0.05l-2.69,-0.34l0.39,-1.03l3.24,-1.06l2.51,0.58l0.85,0.43l-0.2,0.71l-0.0,0.15l0.12,0.52Z\\\", \\\"name\\\": \\\"Russia\\\"}, \\\"RW\\\": {\\\"path\\\": \\\"M497.03,288.12l0.78,1.11l-0.12,1.19l-0.49,0.21l-1.25,-0.15l-0.3,0.16l-0.67,1.24l-1.01,-0.13l0.16,-0.92l0.22,-0.12l0.15,-0.24l0.09,-1.37l0.49,-0.48l0.42,0.18l0.25,-0.01l1.26,-0.65Z\\\", \\\"name\\\": \\\"Rwanda\\\"}, \\\"RS\\\": {\\\"path\\\": \\\"M469.75,168.65l0.21,-0.21l0.36,-1.44l-0.08,-0.29l-1.06,-1.03l0.54,-1.16l-0.28,-0.43l-0.26,0.0l0.55,-0.67l-0.01,-0.39l-0.77,-0.86l-0.45,-0.89l1.56,-0.67l1.39,0.12l1.22,1.1l0.26,0.91l0.16,0.19l1.38,0.66l0.17,1.12l0.14,0.21l1.46,0.9l0.35,-0.03l0.62,-0.54l0.09,0.06l-0.28,0.25l-0.03,0.42l0.29,0.34l-0.44,0.5l-0.07,0.26l0.22,1.12l0.07,0.14l1.02,1.1l-0.81,0.84l-0.42,0.96l0.04,0.3l0.12,0.15l-0.15,0.16l-1.04,0.04l-0.39,0.08l0.33,-0.81l-0.29,-0.41l-0.21,0.01l-0.39,-0.45l-0.13,-0.09l-0.32,-0.11l-0.27,-0.4l-0.14,-0.11l-0.4,-0.16l-0.31,-0.37l-0.34,-0.09l-0.45,0.17l-0.18,0.18l-0.29,0.84l-0.96,-0.65l-0.81,-0.33l-0.32,-0.37l-0.22,-0.18Z\\\", \\\"name\\\": \\\"Republic of Serbia\\\"}, \\\"LT\\\": {\\\"path\\\": \\\"M478.13,133.31l-0.14,-0.63l0.25,-0.88l-0.15,-0.35l-1.17,-0.58l-2.43,-0.57l-0.45,-2.51l2.58,-0.97l4.14,0.22l2.3,-0.32l0.26,0.54l0.22,0.17l1.26,0.22l2.25,1.6l0.19,1.23l-1.87,1.01l-0.14,0.18l-0.54,1.83l-2.54,1.21l-2.18,-0.02l-0.52,-0.91l-0.18,-0.14l-1.11,-0.32Z\\\", \\\"name\\\": \\\"Lithuania\\\"}, \\\"LU\\\": {\\\"path\\\": \\\"M435.95,147.99l0.33,0.49l-0.11,1.07l-0.39,0.04l-0.29,-0.15l0.21,-1.4l0.25,-0.05Z\\\", \\\"name\\\": \\\"Luxembourg\\\"}, \\\"LR\\\": {\\\"path\\\": \\\"M401.37,273.67l-0.32,0.01l-2.48,-1.15l-2.24,-1.89l-2.14,-1.38l-1.47,-1.42l0.44,-0.59l0.05,-0.13l0.12,-0.65l1.07,-1.3l1.08,-1.09l0.52,-0.07l0.43,-0.18l0.84,1.24l-0.15,0.89l0.07,0.25l0.49,0.54l0.22,0.1l0.71,0.01l0.27,-0.16l0.42,-0.83l0.19,0.02l-0.06,0.52l0.23,1.12l-0.5,1.03l0.06,0.35l0.73,0.69l0.14,0.08l0.71,0.15l0.92,0.91l0.06,0.76l-0.17,0.22l-0.06,0.15l-0.17,1.8Z\\\", \\\"name\\\": \\\"Liberia\\\"}, \\\"RO\\\": {\\\"path\\\": \\\"M477.94,155.19l1.02,-0.64l1.49,0.33l1.52,0.01l1.09,0.73l0.32,0.01l0.81,-0.46l1.8,-0.3l0.18,-0.1l0.54,-0.64l0.86,0.0l0.64,0.26l0.71,0.87l0.8,1.35l1.39,1.81l0.07,1.25l-0.26,1.3l0.01,0.15l0.45,1.42l0.15,0.18l1.12,0.57l0.25,0.01l1.05,-0.45l0.86,0.4l0.03,0.43l-0.92,0.51l-0.63,-0.24l-0.4,0.22l-0.64,3.41l-1.12,-0.24l-1.78,-1.09l-0.23,-0.04l-2.95,0.71l-1.25,0.77l-3.55,-0.16l-1.89,-0.47l-0.14,-0.0l-0.75,0.17l-0.61,-1.07l-0.3,-0.36l0.36,-0.32l-0.04,-0.48l-0.62,-0.38l-0.36,0.03l-0.62,0.54l-1.15,-0.71l-0.18,-1.14l-0.17,-0.22l-1.4,-0.67l-0.24,-0.86l-0.09,-0.14l-0.96,-0.87l1.49,-0.44l0.16,-0.11l1.51,-2.14l1.15,-2.09l1.44,-0.63Z\\\", \\\"name\\\": \\\"Romania\\\"}, \\\"GW\\\": {\\\"path\\\": \\\"M383.03,256.73l-1.12,-0.88l-0.14,-0.06l-0.94,-0.15l-0.43,-0.54l0.01,-0.27l-0.13,-0.26l-0.68,-0.48l-0.05,-0.16l0.99,-0.31l0.77,0.08l0.15,-0.02l0.61,-0.26l4.25,0.1l-0.02,0.44l-0.19,0.18l-0.08,0.29l0.17,0.66l-0.17,0.14l-0.44,0.0l-0.16,0.05l-0.57,0.37l-0.66,-0.04l-0.24,0.1l-0.92,1.03Z\\\", \\\"name\\\": \\\"Guinea Bissau\\\"}, \\\"GT\\\": {\\\"path\\\": \\\"M195.13,249.89l-1.05,-0.35l-1.5,-0.04l-1.06,-0.47l-1.19,-0.93l0.04,-0.53l0.27,-0.55l-0.03,-0.31l-0.24,-0.32l1.02,-1.77l3.04,-0.01l0.3,-0.28l0.06,-0.88l-0.19,-0.3l-0.3,-0.11l-0.23,-0.45l-0.11,-0.12l-0.9,-0.58l-0.35,-0.33l0.37,-0.0l0.3,-0.3l0.0,-1.15l4.05,0.02l-0.02,1.74l-0.2,2.89l0.3,0.32l0.67,-0.0l0.75,0.42l0.4,-0.11l-0.62,0.53l-1.17,0.7l-0.13,0.16l-0.18,0.49l0.0,0.21l0.14,0.34l-0.35,0.44l-0.49,0.13l-0.2,0.41l0.03,0.06l-0.27,0.16l-0.86,0.64l-0.12,0.22ZM199.35,245.38l0.07,-0.13l0.05,0.02l-0.13,0.11Z\\\", \\\"name\\\": \\\"Guatemala\\\"}, \\\"GR\\\": {\\\"path\\\": \\\"M487.2,174.55l-0.64,1.54l-0.43,0.24l-1.41,-0.08l-1.28,-0.28l-0.14,0.0l-3.03,0.77l-0.13,0.51l1.39,1.34l-0.78,0.29l-1.2,0.0l-1.23,-1.42l-0.47,0.02l-0.47,0.65l-0.04,0.27l0.56,1.76l0.06,0.11l1.02,1.12l-0.66,0.45l-0.04,0.46l1.39,1.35l1.15,0.79l0.02,1.06l-1.91,-0.63l-0.36,0.42l0.56,1.12l-1.2,0.23l-0.22,0.4l0.8,2.14l-1.15,0.02l-1.89,-1.15l-0.89,-2.19l-0.43,-1.91l-0.05,-0.11l-0.98,-1.35l-1.24,-1.62l-0.13,-0.63l1.07,-1.32l0.06,-0.14l0.13,-0.81l0.68,-0.36l0.16,-0.25l0.03,-0.54l1.4,-0.23l0.12,-0.05l0.87,-0.6l1.26,0.05l0.25,-0.11l0.34,-0.43l0.33,-0.07l1.81,0.08l0.13,-0.02l1.87,-0.77l1.64,0.97l0.19,0.04l2.28,-0.28l0.26,-0.29l0.02,-0.95l0.56,0.36ZM480.44,192.0l1.05,0.74l0.01,0.0l-1.26,-0.23l0.2,-0.51ZM481.76,192.79l1.86,-0.15l1.53,0.17l-0.02,0.19l0.34,0.3l-2.28,0.15l0.01,-0.13l-0.25,-0.31l-1.19,-0.22ZM485.65,193.28l0.65,-0.16l-0.05,0.12l-0.6,0.04Z\\\", \\\"name\\\": \\\"Greece\\\"}, \\\"GQ\\\": {\\\"path\\\": \\\"M444.81,282.04l-0.21,-0.17l0.74,-2.4l3.56,0.05l0.02,2.42l-3.34,-0.02l-0.76,0.13Z\\\", \\\"name\\\": \\\"Equatorial Guinea\\\"}, \\\"GY\\\": {\\\"path\\\": \\\"M271.34,264.25l1.43,0.81l1.44,1.53l0.06,1.19l0.28,0.28l0.84,0.05l2.13,1.92l-0.34,1.93l-1.37,0.59l-0.17,0.34l0.12,0.51l-0.43,1.21l0.03,0.26l1.11,1.82l0.26,0.14l0.56,0.0l0.32,1.29l1.25,1.78l-0.08,0.01l-1.34,-0.21l-0.24,0.06l-0.78,0.64l-1.06,0.41l-0.76,0.1l-0.22,0.15l-0.18,0.32l-0.95,-0.1l-1.38,-1.05l-0.19,-1.13l-0.6,-1.18l0.37,-1.96l0.65,-0.83l0.03,-0.32l-0.57,-1.17l-0.15,-0.14l-0.62,-0.27l0.25,-0.85l-0.08,-0.3l-0.58,-0.58l-0.24,-0.09l-1.15,0.1l-1.41,-1.58l0.48,-0.49l0.09,-0.22l-0.04,-0.92l1.31,-0.34l0.73,-0.52l0.04,-0.44l-0.75,-0.82l0.16,-0.66l1.74,-1.3Z\\\", \\\"name\\\": \\\"Guyana\\\"}, \\\"GE\\\": {\\\"path\\\": \\\"M525.41,174.19l0.26,-0.88l-0.0,-0.17l-0.63,-2.06l-0.1,-0.15l-1.45,-1.12l-0.11,-0.05l-1.31,-0.33l-0.66,-0.69l1.97,0.48l3.65,0.49l3.3,1.41l0.39,0.5l0.33,0.1l1.43,-0.45l2.14,0.58l0.7,1.14l0.13,0.12l1.06,0.47l-0.18,0.11l-0.08,0.43l1.08,1.41l-0.06,0.06l-1.16,-0.15l-1.82,-0.84l-0.31,0.04l-0.55,0.44l-3.29,0.44l-2.32,-1.41l-0.17,-0.04l-2.25,0.12Z\\\", \\\"name\\\": \\\"Georgia\\\"}, \\\"GB\\\": {\\\"path\\\": \\\"M412.82,118.6l-2.31,3.4l-0.0,0.33l0.31,0.13l2.52,-0.49l2.34,0.02l-0.56,2.51l-2.22,3.13l0.22,0.47l2.43,0.21l2.35,4.35l0.17,0.14l1.58,0.51l1.49,3.78l0.73,1.37l0.2,0.15l2.76,0.59l-0.25,1.75l-1.18,0.91l-0.08,0.39l0.87,1.49l-1.96,1.51l-3.31,-0.02l-4.15,0.88l-1.07,-0.59l-0.35,0.04l-1.55,1.44l-2.17,-0.35l-0.22,0.05l-1.61,1.15l-0.78,-0.38l3.31,-3.12l2.18,-0.7l0.21,-0.31l-0.26,-0.27l-3.78,-0.54l-0.48,-0.9l2.3,-0.92l0.13,-0.46l-1.29,-1.71l0.39,-1.83l3.46,0.29l0.32,-0.24l0.37,-1.99l-0.06,-0.24l-1.71,-2.17l-0.18,-0.11l-2.91,-0.58l-0.43,-0.68l0.82,-1.4l-0.03,-0.35l-0.82,-0.97l-0.46,0.01l-0.85,1.05l-0.11,-2.6l-0.05,-0.16l-1.19,-1.7l0.86,-3.53l1.81,-2.75l1.88,0.26l2.38,-0.24ZM406.39,132.84l-1.09,1.92l-1.65,-0.62l-1.26,0.02l0.41,-1.46l0.0,-0.16l-0.42,-1.51l1.62,-0.11l2.39,1.92Z\\\", \\\"name\\\": \\\"United Kingdom\\\"}, \\\"GA\\\": {\\\"path\\\": \\\"M448.76,294.47l-2.38,-2.34l-1.63,-2.04l-1.46,-2.48l0.06,-0.66l0.54,-0.81l0.61,-1.82l0.46,-1.69l0.63,-0.11l3.62,0.03l0.3,-0.3l-0.02,-2.75l0.88,-0.12l1.47,0.32l0.13,0.0l1.39,-0.3l-0.13,0.87l0.03,0.19l0.7,1.29l0.3,0.16l1.74,-0.19l0.36,0.29l-1.01,2.7l0.05,0.29l1.13,1.42l0.25,1.82l-0.3,1.56l-0.64,0.99l-1.93,-0.09l-1.26,-1.13l-0.5,0.17l-0.16,0.91l-1.48,0.27l-0.12,0.05l-0.86,0.63l-0.08,0.39l0.81,1.42l-1.48,1.08Z\\\", \\\"name\\\": \\\"Gabon\\\"}, \\\"GN\\\": {\\\"path\\\": \\\"M399.83,265.31l-0.69,-0.06l-0.3,0.16l-0.43,0.85l-0.39,-0.01l-0.3,-0.33l0.14,-0.87l-0.05,-0.22l-1.05,-1.54l-0.37,-0.11l-0.61,0.27l-0.84,0.12l0.02,-0.54l-0.04,-0.17l-0.35,-0.57l0.07,-0.63l-0.03,-0.17l-0.57,-1.11l-0.7,-0.9l-0.24,-0.12l-2.0,-0.0l-0.19,0.07l-0.51,0.42l-0.6,0.05l-0.21,0.11l-0.43,0.55l-0.3,0.7l-1.04,0.86l-0.91,-1.24l-1.0,-1.02l-0.69,-0.37l-0.52,-0.42l-0.3,-1.11l-0.37,-0.56l-0.1,-0.1l-0.4,-0.23l0.77,-0.85l0.62,0.04l0.18,-0.05l0.58,-0.38l0.46,-0.0l0.19,-0.07l0.39,-0.34l0.1,-0.3l-0.17,-0.67l0.15,-0.14l0.09,-0.2l0.03,-0.57l0.87,0.02l1.76,0.6l0.13,0.01l0.55,-0.06l0.22,-0.13l0.08,-0.12l1.18,0.17l0.17,-0.02l0.09,0.56l0.3,0.25l0.4,-0.0l0.14,-0.03l0.56,-0.29l0.23,0.05l0.63,0.59l0.15,0.07l1.07,0.2l0.24,-0.06l0.65,-0.52l0.77,-0.32l0.55,-0.32l0.3,0.04l0.44,0.45l0.34,0.74l0.84,0.87l-0.35,0.45l-0.06,0.15l-0.1,0.82l0.42,0.31l0.35,-0.16l0.05,0.04l-0.1,0.59l0.09,0.27l0.42,0.4l-0.06,0.02l-0.18,0.21l-0.2,0.86l0.03,0.21l0.56,1.02l0.52,1.71l-0.65,0.21l-0.15,0.12l-0.24,0.35l-0.03,0.28l0.16,0.41l-0.1,0.76l-0.12,0.0Z\\\", \\\"name\\\": \\\"Guinea\\\"}, \\\"GM\\\": {\\\"path\\\": \\\"M379.18,251.48l0.15,-0.55l2.51,-0.07l0.21,-0.09l0.48,-0.52l0.58,-0.03l0.91,0.58l0.16,0.05l0.78,0.01l0.14,-0.03l0.59,-0.31l0.16,0.24l-0.71,0.38l-0.94,-0.04l-1.02,-0.51l-0.3,0.01l-0.86,0.55l-0.37,0.02l-0.14,0.04l-0.53,0.31l-1.81,-0.04Z\\\", \\\"name\\\": \\\"Gambia\\\"}, \\\"GL\\\": {\\\"path\\\": \\\"M304.13,6.6l8.19,-3.63l8.72,0.28l0.19,-0.06l3.12,-2.28l8.75,-0.61l19.94,0.8l14.93,4.75l-3.92,2.01l-9.52,0.27l-13.48,0.6l-0.27,0.2l0.09,0.33l1.26,1.09l0.22,0.07l8.81,-0.67l7.49,2.07l0.19,-0.01l4.68,-1.78l1.76,1.84l-2.59,3.26l-0.01,0.36l0.34,0.11l6.35,-2.2l12.09,-2.32l7.31,1.14l1.17,2.13l-9.9,4.05l-1.43,1.32l-7.91,0.98l-0.26,0.31l0.29,0.29l5.25,0.25l-2.63,3.72l-2.02,3.61l-0.04,0.15l0.08,6.05l0.07,0.19l2.61,3.0l-3.4,0.2l-4.12,1.66l-0.04,0.54l4.5,2.67l0.53,3.9l-2.39,0.42l-0.19,0.48l2.91,3.83l-5.0,0.32l-0.27,0.22l0.12,0.33l2.69,1.84l-0.65,1.35l-3.36,0.71l-3.46,0.01l-0.21,0.51l3.05,3.15l0.02,1.53l-4.54,-1.79l-0.32,0.06l-1.29,1.26l0.11,0.5l3.33,1.15l3.17,2.74l0.85,3.29l-4.0,0.78l-1.83,-1.66l-3.1,-2.64l-0.36,-0.02l-0.13,0.33l0.8,2.92l-2.76,2.26l-0.09,0.33l0.28,0.2l6.59,0.19l2.47,0.18l-5.86,3.38l-6.76,3.43l-7.26,1.48l-2.73,0.02l-0.16,0.05l-2.67,1.72l-3.44,4.42l-5.28,2.86l-1.73,0.18l-3.33,1.01l-3.59,0.96l-0.15,0.1l-2.15,2.52l-0.07,0.19l-0.03,2.76l-1.21,2.49l-4.03,3.1l-0.1,0.33l0.98,2.94l-2.31,6.57l-3.21,0.21l-3.6,-3.0l-0.19,-0.07l-4.9,-0.02l-2.29,-1.97l-1.69,-3.78l-4.31,-4.86l-1.23,-2.52l-0.34,-3.58l-0.08,-0.17l-3.35,-3.67l0.85,-2.92l-0.09,-0.31l-1.5,-1.34l2.33,-4.7l3.67,-1.57l0.15,-0.13l1.02,-1.93l0.52,-3.47l-0.44,-0.31l-2.85,1.57l-1.33,0.64l-2.12,0.59l-2.81,-1.32l-0.15,-2.79l0.88,-2.17l2.09,-0.06l5.07,1.2l0.34,-0.17l-0.11,-0.37l-4.3,-2.9l-2.24,-1.58l-0.25,-0.05l-2.38,0.62l-1.7,-0.93l2.62,-4.1l-0.03,-0.36l-1.51,-1.75l-1.97,-3.3l-3.01,-5.21l-0.1,-0.11l-3.04,-1.85l0.03,-1.94l-0.18,-0.28l-6.82,-3.01l-5.35,-0.38l-6.69,0.21l-6.03,0.37l-2.81,-1.59l-3.84,-2.9l5.94,-1.5l5.01,-0.28l0.28,-0.29l-0.26,-0.31l-10.68,-1.38l-5.38,-2.1l0.27,-1.68l9.3,-2.6l9.18,-2.68l0.19,-0.16l0.97,-2.05l-0.18,-0.42l-6.29,-1.91l1.81,-1.9l8.58,-4.05l3.6,-0.63l0.23,-0.4l-0.92,-2.37l5.59,-1.5l7.66,-0.95l7.58,-0.05l2.65,1.84l0.31,0.02l6.52,-3.29l5.85,2.24l3.55,0.49l5.17,1.95l0.38,-0.16l-0.13,-0.39l-5.77,-3.16l0.29,-2.26Z\\\", \\\"name\\\": \\\"Greenland\\\"}, \\\"KW\\\": {\\\"path\\\": \\\"M540.87,207.81l0.41,0.94l-0.18,0.51l0.0,0.21l0.65,1.66l-1.15,0.05l-0.54,-1.12l-0.24,-0.17l-1.73,-0.2l1.44,-2.06l1.33,0.18Z\\\", \\\"name\\\": \\\"Kuwait\\\"}, \\\"GH\\\": {\\\"path\\\": \\\"M423.16,269.88l-3.58,1.34l-1.41,0.87l-2.13,0.69l-1.91,-0.61l0.09,-0.75l-0.03,-0.17l-1.04,-2.07l0.62,-2.7l1.04,-2.08l0.03,-0.19l-1.0,-5.46l0.05,-1.12l4.04,-0.11l1.08,0.18l0.18,-0.03l0.72,-0.36l0.75,0.13l-0.11,0.48l0.06,0.26l0.98,1.22l-0.0,1.77l0.24,1.99l0.05,0.13l0.55,0.81l-0.52,2.14l0.19,1.37l0.69,1.66l0.38,0.62Z\\\", \\\"name\\\": \\\"Ghana\\\"}, \\\"OM\\\": {\\\"path\\\": \\\"M568.16,231.0l-0.08,0.1l-0.84,1.61l-0.93,-0.11l-0.27,0.11l-0.58,0.73l-0.4,1.32l-0.01,0.14l0.29,1.61l-0.07,0.09l-1.0,-0.01l-0.16,0.04l-1.56,0.97l-0.14,0.2l-0.23,1.17l-0.41,0.4l-1.44,-0.02l-0.17,0.05l-0.98,0.65l-0.13,0.25l0.01,0.87l-0.97,0.57l-1.27,-0.22l-0.19,0.03l-1.63,0.84l-0.88,0.11l-2.55,-5.57l7.2,-2.49l0.19,-0.19l1.67,-5.23l-0.03,-0.25l-1.1,-1.78l0.05,-0.89l0.68,-1.03l0.05,-0.16l0.01,-0.89l0.96,-0.44l0.07,-0.5l-0.32,-0.26l0.16,-1.31l0.85,-0.01l1.03,1.67l0.09,0.09l1.4,0.96l0.11,0.05l1.82,0.34l1.37,0.45l1.75,2.32l0.13,0.1l0.7,0.26l-0.0,0.3l-1.25,2.19l-1.01,0.8ZM561.88,218.47l-0.01,0.02l-0.15,-0.29l0.3,-0.38l-0.14,0.65Z\\\", \\\"name\\\": \\\"Oman\\\"}, \\\"_3\\\": {\\\"path\\\": \\\"M543.2,261.06l-1.07,1.46l-1.65,1.99l-1.91,0.01l-8.08,-2.95l-0.89,-0.84l-0.9,-1.19l-0.81,-1.23l0.44,-0.73l0.76,-1.12l0.49,0.28l0.52,1.05l1.13,1.06l0.2,0.08l1.24,0.01l2.42,-0.65l2.77,-0.31l2.17,-0.78l1.31,-0.19l0.84,-0.43l1.03,-0.06l-0.01,4.54Z\\\", \\\"name\\\": \\\"Somaliland\\\"}, \\\"_2\\\": {\\\"path\\\": \\\"M384.23,230.37l0.07,-0.06l0.28,-0.89l0.99,-1.13l0.07,-0.13l0.8,-3.54l3.4,-2.8l0.09,-0.13l0.76,-2.17l0.07,5.5l-2.07,0.21l-0.24,0.17l-0.61,1.36l-0.02,0.16l0.43,3.46l-4.01,-0.01ZM391.82,218.2l0.07,-0.06l0.75,-1.93l1.86,-0.25l0.94,0.34l1.14,0.0l0.18,-0.06l0.73,-0.56l1.41,-0.08l-0.0,2.72l-7.08,-0.12Z\\\", \\\"name\\\": \\\"Western Sahara\\\"}, \\\"_1\\\": {\\\"path\\\": \\\"M472.71,172.84l-0.07,-0.43l-0.16,-0.22l-0.53,-0.27l-0.38,-0.58l0.3,-0.43l0.51,-0.19l0.18,-0.18l0.3,-0.87l0.12,-0.04l0.22,0.26l0.12,0.09l0.38,0.15l0.28,0.41l0.15,0.12l0.34,0.12l0.43,0.5l0.15,0.07l-0.12,0.3l-0.27,0.32l-0.03,0.18l-0.31,0.06l-1.48,0.47l-0.15,0.17Z\\\", \\\"name\\\": \\\"Kosovo\\\"}, \\\"_0\\\": {\\\"path\\\": \\\"M503.54,192.92l0.09,-0.17l0.41,0.01l-0.08,0.01l-0.42,0.15ZM504.23,192.76l1.02,0.02l0.4,-0.13l-0.09,0.29l0.03,0.08l-0.35,0.16l-0.24,-0.04l-0.06,-0.1l-0.18,-0.17l-0.19,-0.08l-0.33,-0.02Z\\\", \\\"name\\\": \\\"Northern Cyprus\\\"}, \\\"JO\\\": {\\\"path\\\": \\\"M510.26,200.93l0.28,-0.57l2.53,1.0l0.27,-0.02l4.57,-2.77l0.84,2.84l-0.28,0.25l-4.95,1.37l-0.14,0.49l2.24,2.48l-0.5,0.28l-0.13,0.14l-0.35,0.78l-1.76,0.35l-0.2,0.14l-0.57,0.94l-0.94,0.73l-2.45,-0.38l-0.03,-0.12l1.23,-4.32l-0.04,-1.1l0.34,-0.75l0.03,-0.12l0.0,-1.63Z\\\", \\\"name\\\": \\\"Jordan\\\"}, \\\"HR\\\": {\\\"path\\\": \\\"M455.49,162.73l1.53,0.09l0.24,-0.1l0.29,-0.34l0.64,0.38l0.14,0.04l0.98,0.06l0.32,-0.3l-0.01,-0.66l0.67,-0.25l0.19,-0.22l0.21,-1.11l1.72,-0.72l0.65,0.32l1.94,1.37l2.07,0.6l0.22,-0.02l0.67,-0.33l0.47,0.94l0.67,0.76l-0.63,0.77l-0.91,-0.55l-0.16,-0.04l-1.69,0.04l-2.2,-0.51l-1.17,0.07l-0.21,0.11l-0.36,0.42l-0.67,-0.53l-0.46,0.12l-0.52,1.29l0.05,0.31l1.21,1.42l0.58,0.99l1.15,1.14l0.95,0.68l0.92,1.23l0.1,0.09l1.75,0.91l-1.87,-0.89l-1.5,-1.11l-2.23,-0.88l-1.77,-1.9l0.12,-0.06l0.1,-0.47l-1.07,-1.22l-0.04,-0.94l-0.21,-0.27l-1.61,-0.49l-0.35,0.14l-0.53,0.93l-0.41,-0.57l0.04,-0.73Z\\\", \\\"name\\\": \\\"Croatia\\\"}, \\\"HT\\\": {\\\"path\\\": \\\"M237.82,234.68l1.35,0.1l1.95,0.37l0.18,1.15l-0.16,0.83l-0.51,0.37l-0.06,0.44l0.57,0.68l-0.02,0.22l-1.31,-0.35l-1.26,0.17l-1.49,-0.18l-0.15,0.02l-1.03,0.43l-1.02,-0.61l0.09,-0.36l2.04,0.32l1.9,0.21l0.19,-0.05l0.9,-0.58l0.05,-0.47l-1.05,-1.03l0.02,-0.86l-0.23,-0.3l-1.13,-0.29l0.18,-0.23Z\\\", \\\"name\\\": \\\"Haiti\\\"}, \\\"HU\\\": {\\\"path\\\": \\\"M461.96,157.92l0.68,-1.66l-0.03,-0.29l-0.15,-0.22l0.84,-0.0l0.3,-0.26l0.12,-0.84l0.88,0.57l0.98,0.38l0.16,0.01l2.1,-0.39l0.23,-0.21l0.14,-0.45l0.88,-0.1l1.06,-0.43l0.13,0.1l0.28,0.04l1.18,-0.4l0.14,-0.1l0.52,-0.67l0.63,-0.15l2.6,0.95l0.26,-0.03l0.38,-0.23l1.12,0.7l0.1,0.49l-1.31,0.57l-0.14,0.13l-1.18,2.14l-1.44,2.04l-1.85,0.55l-1.51,-0.13l-0.14,0.02l-1.92,0.82l-0.85,0.42l-1.91,-0.55l-1.83,-1.31l-0.74,-0.37l-0.44,-0.97l-0.26,-0.18Z\\\", \\\"name\\\": \\\"Hungary\\\"}, \\\"HN\\\": {\\\"path\\\": \\\"M202.48,251.87l-0.33,-0.62l-0.18,-0.14l-0.5,-0.15l0.13,-0.76l-0.11,-0.28l-0.34,-0.28l-0.6,-0.23l-0.18,-0.01l-0.81,0.22l-0.16,-0.24l-0.72,-0.39l-0.51,-0.48l-0.12,-0.07l-0.31,-0.09l0.24,-0.3l0.04,-0.3l-0.16,-0.4l0.1,-0.28l1.14,-0.69l1.0,-0.86l0.09,0.04l0.3,-0.05l0.47,-0.39l0.49,-0.03l0.14,0.13l0.29,0.06l0.31,-0.1l1.16,0.22l1.24,-0.08l0.81,-0.28l0.29,-0.25l0.63,0.1l0.69,0.18l0.65,-0.06l0.49,-0.2l1.04,0.32l0.38,0.06l0.7,0.44l0.71,0.56l0.92,0.41l0.1,0.11l-0.11,-0.01l-0.23,0.09l-0.3,0.3l-0.76,0.29l-0.58,0.0l-0.15,0.04l-0.45,0.26l-0.31,-0.07l-0.37,-0.34l-0.28,-0.07l-0.26,0.07l-0.18,0.15l-0.23,0.43l-0.04,-0.0l-0.33,0.28l-0.03,0.4l-0.76,0.61l-0.45,0.3l-0.15,0.16l-0.51,-0.36l-0.41,0.06l-0.45,0.56l-0.41,-0.01l-0.59,0.06l-0.27,0.31l0.04,0.96l-0.07,0.0l-0.25,0.16l-0.24,0.45l-0.42,0.06Z\\\", \\\"name\\\": \\\"Honduras\\\"}, \\\"PR\\\": {\\\"path\\\": \\\"M254.95,238.31l1.15,0.21l0.2,0.23l-0.36,0.36l-1.76,-0.01l-1.2,0.07l-0.09,-0.69l0.17,-0.18l1.89,0.01Z\\\", \\\"name\\\": \\\"Puerto Rico\\\"}, \\\"PS\\\": {\\\"path\\\": \\\"M509.66,201.06l-0.0,1.44l-0.29,0.63l-0.59,0.19l0.02,-0.11l0.52,-0.31l-0.02,-0.53l-0.41,-0.2l0.36,-1.28l0.41,0.17Z\\\", \\\"name\\\": \\\"West Bank\\\"}, \\\"PT\\\": {\\\"path\\\": \\\"M398.65,173.6l0.75,-0.63l0.7,-0.3l0.51,1.2l0.28,0.18l1.48,-0.0l0.2,-0.08l0.33,-0.3l1.16,0.08l0.52,1.11l-0.95,0.66l-0.13,0.24l-0.03,2.2l-0.33,0.35l-0.08,0.18l-0.08,1.17l-0.86,0.19l-0.2,0.44l0.93,1.64l-0.64,1.79l0.07,0.31l0.72,0.72l-0.24,0.56l-0.9,1.05l-0.07,0.26l0.17,0.77l-0.73,0.54l-1.18,-0.36l-0.16,-0.0l-0.85,0.21l0.31,-1.81l-0.23,-1.87l-0.23,-0.25l-0.99,-0.24l-0.49,-0.91l0.18,-1.72l0.93,-0.99l0.08,-0.16l0.17,-1.17l0.52,-1.76l-0.04,-1.36l-0.51,-1.14l-0.09,-0.8Z\\\", \\\"name\\\": \\\"Portugal\\\"}, \\\"PY\\\": {\\\"path\\\": \\\"M264.33,341.43l0.93,-2.96l0.07,-1.42l1.1,-2.1l4.19,-0.73l2.22,0.04l2.12,1.21l0.07,0.76l0.7,1.38l-0.16,3.48l0.24,0.31l2.64,0.5l0.19,-0.03l0.9,-0.45l1.47,0.62l0.38,0.64l0.23,2.35l0.3,1.07l0.25,0.21l0.93,0.12l0.16,-0.02l0.8,-0.37l0.61,0.33l-0.0,1.25l-0.33,1.53l-0.5,1.57l-0.39,2.26l-2.14,1.94l-1.85,0.4l-2.74,-0.4l-2.13,-0.62l2.26,-3.75l0.03,-0.24l-0.36,-1.18l-0.17,-0.19l-2.55,-1.03l-3.04,-1.95l-2.07,-0.43l-4.4,-4.12Z\\\", \\\"name\\\": \\\"Paraguay\\\"}, \\\"PA\\\": {\\\"path\\\": \\\"M213.65,263.79l0.18,-0.43l0.02,-0.18l-0.06,-0.28l0.23,-0.18l-0.01,-0.48l-0.4,-0.29l-0.01,-0.62l0.57,-0.13l0.68,0.69l-0.04,0.39l0.26,0.33l1.0,0.11l0.27,-0.1l0.49,0.44l0.24,0.07l1.34,-0.22l1.04,-0.62l1.49,-0.5l0.86,-0.73l0.99,0.11l0.18,0.28l1.35,0.08l1.02,0.4l0.78,0.72l0.71,0.53l-0.1,0.12l-0.05,0.3l0.53,1.34l-0.28,0.44l-0.6,-0.13l-0.36,0.22l-0.2,0.76l-0.41,-0.36l-0.44,-1.12l0.49,-0.53l-0.14,-0.49l-0.51,-0.14l-0.41,-0.72l-0.11,-0.11l-1.25,-0.7l-0.19,-0.04l-1.1,0.16l-0.22,0.15l-0.47,0.81l-0.9,0.56l-0.49,0.08l-0.22,0.17l-0.25,0.52l0.05,0.32l0.93,1.07l-0.41,0.21l-0.29,0.3l-0.81,0.09l-0.36,-1.26l-0.53,-0.1l-0.21,0.28l-0.5,-0.09l-0.44,-0.88l-0.22,-0.16l-0.99,-0.16l-0.61,-0.28l-0.13,-0.03l-1.0,0.0Z\\\", \\\"name\\\": \\\"Panama\\\"}, \\\"PG\\\": {\\\"path\\\": \\\"M808.4,298.6l0.62,0.46l1.19,1.56l1.04,0.77l-0.18,0.37l-0.42,0.15l-0.92,-0.82l-1.05,-1.53l-0.27,-0.96ZM804.09,296.06l-0.3,0.26l-0.36,-1.11l-0.66,-1.06l-2.55,-1.89l-1.42,-0.59l0.17,-0.15l1.16,0.6l0.85,0.55l1.01,0.58l0.97,1.02l0.9,0.76l0.24,1.03ZM796.71,297.99l0.15,0.82l0.34,0.24l1.43,-0.19l0.19,-0.11l0.68,-0.82l1.36,-0.87l0.13,-0.31l-0.21,-1.13l1.04,-0.03l0.3,0.25l-0.04,1.17l-0.74,1.34l-1.17,0.18l-0.22,0.15l-0.35,0.62l-2.51,1.13l-1.21,-0.0l-1.99,-0.71l-1.19,-0.58l0.07,-0.28l1.98,0.32l1.46,-0.2l0.24,-0.21l0.25,-0.79ZM789.24,303.52l0.11,0.15l2.19,1.62l1.6,2.62l0.27,0.14l1.09,-0.06l-0.07,0.77l0.23,0.32l1.23,0.27l-0.14,0.09l0.05,0.53l2.39,0.95l-0.11,0.28l-1.33,0.14l-0.51,-0.55l-0.18,-0.09l-4.59,-0.65l-1.87,-1.55l-1.38,-1.35l-1.28,-2.17l-0.16,-0.13l-3.27,-1.1l-0.19,0.0l-2.12,0.72l-1.58,0.85l-0.15,0.31l0.28,1.63l-1.65,0.73l-1.37,-0.4l-2.3,-0.09l-0.08,-15.65l3.95,1.57l4.58,1.42l1.67,1.25l1.32,1.19l0.36,1.39l0.19,0.21l4.06,1.51l0.39,0.85l-1.9,0.22l-0.25,0.39l0.55,1.68Z\\\", \\\"name\\\": \\\"Papua New Guinea\\\"}, \\\"PE\\\": {\\\"path\\\": \\\"M246.44,329.21l-0.63,1.25l-1.05,0.54l-2.25,-1.33l-0.19,-0.93l-0.16,-0.21l-4.95,-2.58l-4.46,-2.79l-1.87,-1.52l-0.94,-1.91l0.33,-0.6l-0.01,-0.31l-2.11,-3.33l-2.46,-4.66l-2.36,-5.02l-1.04,-1.18l-0.77,-1.81l-0.08,-0.11l-1.95,-1.64l-1.54,-0.88l0.61,-0.85l0.02,-0.31l-1.15,-2.27l0.69,-1.56l1.59,-1.26l0.12,0.42l-0.56,0.47l-0.11,0.25l0.07,0.92l0.36,0.27l0.97,-0.19l0.85,0.23l0.99,1.19l0.41,0.05l1.42,-1.03l0.11,-0.16l0.46,-1.64l1.45,-2.06l2.92,-0.96l0.11,-0.07l2.73,-2.62l0.84,-1.72l0.02,-0.18l-0.3,-1.65l0.28,-0.1l1.49,1.06l0.77,1.14l0.1,0.09l1.08,0.6l1.43,2.55l0.21,0.15l1.86,0.31l0.18,-0.03l1.25,-0.6l0.77,0.37l0.17,0.03l1.4,-0.2l1.57,0.96l-1.45,2.29l0.23,0.46l0.63,0.05l0.66,0.7l-1.51,-0.08l-0.24,0.1l-0.27,0.31l-1.96,0.46l-2.95,1.74l-0.14,0.21l-0.17,1.1l-0.6,0.82l-0.05,0.23l0.21,1.13l-1.31,0.63l-0.17,0.27l0.0,0.91l-0.53,0.37l-0.1,0.37l1.04,2.27l1.31,1.46l-0.44,0.9l0.24,0.43l1.52,0.13l0.87,1.23l0.24,0.13l2.21,0.07l0.18,-0.06l1.55,-1.13l-0.14,3.22l0.23,0.3l1.14,0.29l0.16,-0.0l1.18,-0.36l1.97,3.71l-0.45,0.71l-0.04,0.14l-0.12,1.8l-0.05,2.07l-0.92,1.2l-0.03,0.31l0.38,0.8l-0.48,0.72l-0.02,0.3l1.01,2.02l-1.5,2.64Z\\\", \\\"name\\\": \\\"Peru\\\"}, \\\"PK\\\": {\\\"path\\\": \\\"M609.08,187.76l1.66,1.21l0.71,2.11l0.2,0.19l3.62,1.01l-1.98,1.95l-2.65,0.4l-3.75,-0.68l-0.26,0.08l-1.23,1.22l-0.07,0.31l0.89,2.46l0.88,1.92l0.1,0.12l1.67,1.14l-1.8,1.35l-0.12,0.25l0.04,1.85l-2.35,2.67l-1.59,2.79l-2.5,2.72l-2.76,-0.2l-0.24,0.09l-2.76,2.83l0.04,0.45l1.54,1.13l0.27,1.94l0.09,0.17l1.34,1.29l0.4,1.83l-5.14,-0.01l-0.22,0.09l-1.53,1.63l-1.52,-0.56l-0.76,-1.88l-1.93,-2.03l-0.25,-0.09l-4.6,0.5l-4.05,0.05l-3.1,0.33l0.77,-2.53l3.48,-1.33l0.19,-0.33l-0.21,-1.24l-0.19,-0.23l-1.01,-0.37l-0.06,-2.18l-0.17,-0.26l-2.32,-1.16l-0.96,-1.57l-0.56,-0.65l3.16,1.05l0.14,0.01l2.45,-0.4l1.44,0.33l0.3,-0.1l0.4,-0.47l1.58,0.22l0.14,-0.01l3.25,-1.14l0.2,-0.27l0.08,-2.23l1.23,-1.38l1.73,0.0l0.28,-0.2l0.22,-0.61l1.68,-0.32l0.86,0.24l0.27,-0.05l0.98,-0.78l0.11,-0.26l-0.13,-1.57l0.96,-1.52l1.51,-0.67l0.14,-0.41l-0.74,-1.4l1.86,0.07l0.26,-0.13l0.69,-1.01l0.05,-0.2l-0.09,-0.94l1.14,-1.09l0.09,-0.28l-0.29,-1.41l-0.51,-1.07l1.23,-1.05l2.6,-0.58l2.86,-0.33l1.33,-0.54l1.3,-0.29Z\\\", \\\"name\\\": \\\"Pakistan\\\"}, \\\"PH\\\": {\\\"path\\\": \\\"M737.11,263.82l0.25,1.66l0.14,1.34l-0.54,1.46l-0.64,-1.79l-0.5,-0.1l-1.17,1.28l-0.05,0.32l0.74,1.71l-0.49,0.81l-2.6,-1.28l-0.61,-1.57l0.68,-1.07l-0.07,-0.4l-1.59,-1.19l-0.42,0.06l-0.69,0.91l-1.01,-0.08l-0.21,0.06l-1.58,1.2l-0.17,-0.3l0.87,-1.88l1.48,-0.66l1.18,-0.81l0.71,0.92l0.34,0.1l1.9,-0.69l0.18,-0.18l0.34,-0.94l1.57,-0.06l0.29,-0.32l-0.1,-1.38l1.41,0.83l0.36,2.06ZM734.94,254.42l0.56,2.24l-1.41,-0.49l-0.4,0.3l0.07,0.94l0.51,1.3l-0.54,0.26l-0.08,-1.34l-0.25,-0.28l-0.56,-0.1l-0.23,-0.91l1.03,0.14l0.34,-0.31l-0.03,-0.96l-0.06,-0.18l-1.14,-1.44l1.62,0.04l0.57,0.78ZM724.68,238.33l1.48,0.71l0.33,-0.04l0.44,-0.38l0.05,0.13l-0.37,0.97l0.01,0.23l0.81,1.75l-0.59,1.92l-1.37,0.79l-0.14,0.2l-0.39,2.07l0.01,0.14l0.56,2.04l0.23,0.21l1.33,0.28l0.14,-0.0l1.0,-0.27l2.82,1.28l-0.2,1.16l0.12,0.29l0.66,0.5l-0.13,0.56l-1.54,-0.99l-0.89,-1.29l-0.49,0.0l-0.44,0.65l-1.34,-1.28l-0.26,-0.08l-2.18,0.36l-0.96,-0.44l0.09,-0.72l0.69,-0.57l-0.01,-0.47l-0.75,-0.59l-0.47,0.14l-0.15,0.43l-0.86,-1.02l-0.34,-1.02l-0.07,-1.74l0.49,0.41l0.49,-0.21l0.26,-3.99l0.73,-2.1l1.23,0.0ZM731.12,258.92l-0.82,0.75l-0.83,1.64l-0.52,0.5l-1.17,-1.33l0.36,-0.47l0.62,-0.7l0.07,-0.15l0.24,-1.35l0.73,-0.08l-0.31,1.29l0.16,0.34l0.37,-0.09l1.21,-1.6l-0.12,1.24ZM726.66,255.58l0.85,0.45l0.14,0.03l1.28,-0.0l-0.03,0.62l-1.04,0.96l-1.15,0.55l-0.05,-0.71l0.17,-1.26l-0.01,-0.13l-0.16,-0.51ZM724.92,252.06l-0.45,1.5l-0.7,-0.83l-0.95,-1.43l1.44,0.06l0.67,0.7ZM717.48,261.28l-1.87,1.35l0.21,-0.3l1.81,-1.57l1.5,-1.75l0.97,-1.84l0.23,1.08l-1.56,1.33l-1.29,1.7Z\\\", \\\"name\\\": \\\"Philippines\\\"}, \\\"PL\\\": {\\\"path\\\": \\\"M458.8,144.25l-0.96,-1.98l0.18,-1.06l-0.01,-0.15l-0.62,-1.8l-0.82,-1.11l0.56,-0.73l0.05,-0.28l-0.51,-1.51l1.48,-0.87l3.88,-1.58l3.06,-1.14l2.23,0.52l0.15,0.66l0.29,0.23l2.4,0.04l3.11,0.39l4.56,-0.05l1.12,0.32l0.51,0.89l0.1,1.45l0.03,0.12l0.66,1.23l-0.01,1.08l-1.33,0.61l-0.14,0.41l0.74,1.5l0.07,1.53l1.22,2.79l-0.19,0.66l-1.09,0.33l-0.14,0.09l-2.27,2.72l-0.04,0.31l0.35,0.8l-2.22,-1.16l-0.21,-0.02l-1.72,0.44l-1.1,-0.31l-0.21,0.02l-1.3,0.61l-1.11,-1.02l-0.32,-0.05l-0.81,0.35l-1.15,-1.61l-0.21,-0.12l-1.65,-0.17l-0.19,-0.82l-0.23,-0.23l-1.72,-0.37l-0.34,0.17l-0.25,0.56l-0.88,-0.44l0.12,-0.69l-0.25,-0.35l-1.78,-0.27l-1.08,-0.97Z\\\", \\\"name\\\": \\\"Poland\\\"}, \\\"ZM\\\": {\\\"path\\\": \\\"M502.81,308.32l1.09,1.04l0.58,1.94l-0.39,0.66l-0.5,2.05l-0.0,0.14l0.45,1.95l-0.69,0.77l-0.06,0.11l-0.76,2.37l0.15,0.36l0.62,0.31l-6.85,1.9l-0.22,0.33l0.2,1.54l-1.62,0.3l-0.12,0.05l-1.43,1.02l-0.11,0.15l-0.25,0.73l-0.73,0.17l-0.14,0.08l-2.18,2.12l-1.33,1.6l-0.65,0.05l-0.83,-0.29l-2.75,-0.28l-0.24,-0.1l-0.15,-0.27l-0.99,-0.58l-0.12,-0.04l-1.73,-0.14l-1.88,0.54l-1.5,-1.48l-1.61,-2.01l0.11,-7.73l4.92,0.03l0.29,-0.37l-0.19,-0.79l0.34,-0.86l0.0,-0.21l-0.41,-1.11l0.26,-1.14l-0.01,-0.16l-0.12,-0.36l0.18,0.01l0.1,0.56l0.31,0.25l1.14,-0.06l1.44,0.21l0.76,1.05l0.19,0.12l2.01,0.35l0.19,-0.03l1.24,-0.65l0.44,1.03l0.22,0.18l1.81,0.34l0.85,0.99l1.02,1.39l0.24,0.12l1.92,0.02l0.3,-0.32l-0.21,-2.74l-0.47,-0.23l-0.53,0.36l-1.58,-0.89l-0.51,-0.34l0.29,-2.36l0.44,-2.99l-0.03,-0.18l-0.5,-0.99l0.61,-1.38l0.53,-0.24l3.26,-0.41l0.89,0.23l1.01,0.62l1.04,0.44l1.6,0.43l1.35,0.72Z\\\", \\\"name\\\": \\\"Zambia\\\"}, \\\"EE\\\": {\\\"path\\\": \\\"M482.19,120.88l0.23,-1.68l-0.43,-0.31l-0.75,0.37l-1.34,-1.1l-0.18,-1.75l2.92,-0.95l3.07,-0.53l2.66,0.6l2.48,-0.1l0.18,0.31l-1.65,1.96l-0.06,0.26l0.71,3.25l-0.88,0.94l-1.85,-0.01l-2.08,-1.3l-1.14,-0.47l-0.2,-0.01l-1.69,0.51Z\\\", \\\"name\\\": \\\"Estonia\\\"}, \\\"EG\\\": {\\\"path\\\": \\\"M508.07,208.8l-0.66,1.06l-0.53,2.03l-0.64,1.32l-0.32,0.26l-1.74,-1.85l-1.77,-3.86l-0.48,-0.09l-0.26,0.25l-0.07,0.32l1.04,2.88l1.55,2.76l1.89,4.18l0.94,1.48l0.83,1.54l2.08,2.73l-0.3,0.28l-0.1,0.23l0.08,1.72l0.11,0.22l2.91,2.37l-28.78,0.0l0.0,-19.06l-0.73,-2.2l0.61,-1.59l0.0,-0.2l-0.34,-1.04l0.73,-1.08l3.13,-0.04l2.36,0.72l2.48,0.81l1.15,0.43l0.23,-0.01l1.93,-0.87l1.02,-0.78l2.08,-0.21l1.59,0.31l0.62,1.24l0.52,0.03l0.46,-0.71l1.86,0.59l1.95,0.16l0.17,-0.04l0.92,-0.52l1.48,4.24Z\\\", \\\"name\\\": \\\"Egypt\\\"}, \\\"ZA\\\": {\\\"path\\\": \\\"M467.06,373.27l-0.13,-0.29l0.01,-1.58l-0.02,-0.12l-0.71,-1.64l0.59,-0.37l0.14,-0.26l-0.07,-2.13l-0.05,-0.15l-1.63,-2.58l-1.25,-2.31l-1.71,-3.37l0.88,-0.98l0.7,0.52l0.39,1.08l0.23,0.19l1.1,0.19l1.55,0.51l0.14,0.01l1.35,-0.2l0.11,-0.04l2.24,-1.39l0.14,-0.25l0.0,-9.4l0.16,0.09l1.39,2.38l-0.22,1.53l0.04,0.19l0.56,0.94l0.3,0.14l1.79,-0.27l0.16,-0.08l1.23,-1.18l1.17,-0.79l0.1,-0.12l0.57,-1.19l1.02,-0.52l0.9,0.28l1.16,0.73l0.14,0.05l2.04,0.13l0.13,-0.02l1.6,-0.62l0.18,-0.19l0.63,-1.93l1.18,-0.19l0.19,-0.12l0.78,-1.05l0.81,-1.71l2.18,-1.91l3.44,-1.88l0.89,0.02l1.17,0.43l0.21,-0.0l0.76,-0.29l1.07,0.21l1.15,3.55l0.63,1.82l-0.44,2.9l0.1,0.52l-0.74,-0.29l-0.18,-0.01l-0.72,0.19l-0.21,0.2l-0.22,0.74l-0.66,0.97l-0.05,0.18l0.02,0.93l0.09,0.21l1.49,1.46l0.27,0.08l1.47,-0.29l0.22,-0.18l0.43,-1.01l1.29,0.02l-0.51,1.63l-0.29,2.2l-0.59,1.12l-2.2,1.78l-1.06,1.39l-0.72,1.44l-1.39,1.93l-2.81,2.84l-1.75,1.65l-1.85,1.24l-2.55,1.06l-1.23,0.14l-0.24,0.18l-0.22,0.54l-1.27,-0.35l-0.2,0.01l-1.15,0.5l-2.62,-0.52l-0.12,0.0l-1.46,0.33l-0.98,-0.14l-0.16,0.02l-2.55,1.1l-2.11,0.44l-1.59,1.07l-0.93,0.06l-0.97,-0.92l-0.19,-0.08l-0.72,-0.04l-1.0,-1.16l-0.25,0.05ZM493.72,359.24l-1.12,-0.86l-0.31,-0.03l-1.23,0.59l-1.36,1.07l-1.39,1.78l0.01,0.38l1.88,2.11l0.31,0.09l0.9,-0.27l0.18,-0.15l0.4,-0.77l1.28,-0.39l0.18,-0.16l0.42,-0.88l0.76,-1.32l-0.05,-0.37l-0.87,-0.82Z\\\", \\\"name\\\": \\\"South Africa\\\"}, \\\"EC\\\": {\\\"path\\\": \\\"M220.2,293.48l1.25,-1.76l0.02,-0.31l-0.54,-1.09l-0.5,-0.06l-0.78,0.94l-1.03,-0.75l0.33,-0.46l0.05,-0.23l-0.38,-2.04l0.66,-0.28l0.17,-0.19l0.45,-1.52l0.93,-1.58l0.04,-0.2l-0.13,-0.78l1.19,-0.47l1.57,-0.91l2.35,1.34l0.17,0.04l0.28,-0.02l0.52,0.91l0.21,0.15l2.12,0.35l0.2,-0.03l0.55,-0.31l1.08,0.73l0.97,0.54l0.31,1.67l-0.71,1.49l-2.64,2.54l-2.95,0.97l-0.15,0.11l-1.53,2.18l-0.49,1.68l-1.1,0.8l-0.87,-1.05l-0.15,-0.1l-1.01,-0.27l-0.13,-0.0l-0.7,0.14l-0.03,-0.43l0.6,-0.5l0.1,-0.31l-0.26,-0.91Z\\\", \\\"name\\\": \\\"Ecuador\\\"}, \\\"AL\\\": {\\\"path\\\": \\\"M470.27,171.7l0.38,0.19l0.45,-0.18l0.4,0.61l0.11,0.1l0.46,0.24l0.13,0.87l-0.3,0.95l-0.0,0.17l0.36,1.28l0.12,0.17l0.9,0.63l-0.03,0.44l-0.67,0.35l-0.16,0.22l-0.14,0.88l-0.96,1.18l-0.06,-0.03l-0.04,-0.48l-0.12,-0.22l-1.28,-0.92l-0.19,-1.25l0.2,-1.96l0.33,-0.89l-0.06,-0.3l-0.36,-0.41l-0.13,-0.75l0.66,-0.9Z\\\", \\\"name\\\": \\\"Albania\\\"}, \\\"AO\\\": {\\\"path\\\": \\\"M461.62,299.93l0.55,1.67l0.73,1.54l1.56,2.18l0.28,0.12l1.66,-0.2l0.81,-0.34l1.28,0.33l0.33,-0.14l0.39,-0.67l0.56,-1.3l1.37,-0.09l0.27,-0.21l0.07,-0.23l0.67,-0.01l-0.13,0.53l0.29,0.37l2.74,-0.02l0.04,1.29l0.03,0.13l0.46,0.87l-0.35,1.52l0.18,1.55l0.07,0.16l0.75,0.85l-0.13,2.89l0.41,0.29l0.56,-0.21l1.11,0.05l1.5,-0.37l0.9,0.12l0.18,0.53l-0.27,1.15l0.01,0.17l0.4,1.08l-0.33,0.85l-0.01,0.18l0.12,0.51l-4.83,-0.03l-0.3,0.3l-0.12,8.13l0.07,0.19l1.69,2.1l1.27,1.25l-4.03,0.92l-5.93,-0.36l-1.66,-1.19l-0.18,-0.06l-10.15,0.11l-0.34,0.13l-1.35,-1.05l-0.17,-0.06l-1.62,-0.08l-1.6,0.45l-0.88,0.36l-0.17,-1.2l0.34,-2.19l0.85,-2.32l0.14,-1.13l0.79,-2.24l0.57,-1.0l1.42,-1.64l0.82,-1.15l0.05,-0.13l0.26,-1.88l-0.13,-1.51l-0.07,-0.16l-0.72,-0.87l-1.23,-2.91l0.09,-0.37l0.73,-0.95l0.05,-0.27l-1.27,-4.12l-1.19,-1.54l0.1,-0.2l0.86,-0.28l0.78,0.03l0.83,-0.29l7.12,0.03ZM451.81,298.94l-0.17,0.07l-0.5,-1.42l0.85,-0.92l0.53,-0.29l0.48,0.44l-0.56,0.32l-0.1,0.1l-0.41,0.65l-0.05,0.14l-0.07,0.91Z\\\", \\\"name\\\": \\\"Angola\\\"}, \\\"KZ\\\": {\\\"path\\\": \\\"M598.42,172.08l-1.37,0.54l-3.3,2.09l-0.11,0.12l-1.01,1.97l-0.56,0.01l-0.6,-1.24l-0.26,-0.17l-2.95,-0.09l-0.46,-2.22l-0.29,-0.24l-0.91,-0.02l0.17,-2.72l-0.12,-0.26l-3.0,-2.22l-0.2,-0.06l-4.29,0.24l-2.8,0.42l-2.36,-2.7l-6.4,-3.65l-0.23,-0.03l-6.45,1.83l-0.22,0.29l0.1,10.94l-0.84,0.1l-1.65,-2.21l-0.11,-0.09l-1.69,-0.84l-0.2,-0.02l-2.84,0.63l-0.14,0.07l-0.71,0.64l-0.02,-0.11l0.57,-1.17l0.0,-0.26l-0.48,-1.05l-0.17,-0.16l-2.78,-0.99l-1.08,-2.62l-0.13,-0.15l-1.24,-0.7l-0.04,-0.48l2.07,0.25l0.34,-0.29l0.09,-2.03l1.84,-0.44l2.12,0.45l0.36,-0.25l0.45,-3.04l-0.45,-2.06l-0.31,-0.23l-2.44,0.15l-2.07,-0.75l-0.23,0.01l-2.88,1.38l-2.21,0.62l-0.96,-0.38l0.22,-1.39l-0.06,-0.23l-1.6,-2.12l-0.25,-0.12l-1.72,0.08l-1.87,-1.91l1.33,-2.24l-0.06,-0.38l-0.55,-0.5l1.72,-3.08l2.3,1.7l0.48,-0.2l0.29,-2.26l4.99,-3.48l3.76,-0.08l5.46,2.27l2.96,1.33l0.26,-0.01l2.59,-1.36l3.82,-0.06l3.13,1.67l0.38,-0.09l0.63,-0.85l3.36,0.14l0.29,-0.19l0.63,-1.57l-0.13,-0.37l-3.64,-2.05l2.0,-1.36l0.1,-0.38l-0.32,-0.62l2.09,-0.76l0.13,-0.47l-1.65,-2.13l0.89,-0.91l9.27,-1.18l0.13,-0.05l1.17,-0.82l6.2,-1.27l2.26,-1.43l4.19,0.7l0.74,3.39l0.38,0.22l2.52,-0.81l2.9,1.06l-0.18,1.63l0.32,0.33l2.52,-0.23l5.0,-2.58l0.03,0.39l3.16,2.62l5.57,8.48l0.49,0.02l1.18,-1.53l3.22,1.78l0.21,0.03l3.5,-0.83l1.21,0.52l1.16,1.82l0.15,0.12l1.67,0.61l1.01,1.32l0.28,0.11l3.04,-0.41l1.1,1.64l-1.68,1.89l-1.97,0.28l-0.26,0.29l-0.12,3.09l-1.2,1.23l-4.81,-1.01l-0.35,0.2l-1.77,5.51l-1.14,0.62l-4.92,1.23l-0.2,0.41l2.14,5.06l-1.45,0.67l-0.17,0.31l0.15,1.28l-1.05,-0.3l-1.21,-1.04l-0.17,-0.07l-3.73,-0.32l-4.15,-0.08l-0.92,0.31l-3.46,-1.24l-0.22,0.01l-1.42,0.63l-0.17,0.21l-0.32,1.49l-3.82,-0.97l-0.15,0.0l-1.65,0.43l-0.2,0.17l-0.51,1.21Z\\\", \\\"name\\\": \\\"Kazakhstan\\\"}, \\\"ET\\\": {\\\"path\\\": \\\"M516.0,247.63l1.21,0.92l0.3,0.04l1.3,-0.53l0.46,0.41l0.19,0.08l1.65,0.03l2.05,0.96l0.67,0.88l1.07,0.79l1.0,1.45l0.7,0.68l-0.72,0.92l-0.85,1.19l-0.04,0.25l0.19,0.67l0.04,0.74l0.29,0.28l1.4,0.04l0.55,-0.15l0.23,0.19l-0.41,0.67l0.01,0.32l0.92,1.39l0.93,1.23l0.99,0.94l0.1,0.06l8.19,2.99l1.51,0.01l-6.51,6.95l-3.14,0.11l-0.18,0.06l-2.15,1.71l-1.51,0.04l-0.22,0.1l-0.6,0.69l-1.46,-0.0l-0.93,-0.78l-0.32,-0.04l-2.29,1.05l-0.12,0.1l-0.64,0.9l-1.44,-0.17l-0.51,-0.26l-0.17,-0.03l-0.56,0.07l-0.68,-0.02l-3.1,-2.08l-0.17,-0.05l-1.62,0.0l-0.68,-0.65l0.0,-1.28l-0.21,-0.29l-1.19,-0.38l-1.42,-2.63l-0.13,-0.12l-1.05,-0.53l-0.46,-1.0l-1.27,-1.23l-0.17,-0.08l-1.08,-0.13l0.53,-0.9l1.17,-0.05l0.26,-0.17l0.37,-0.77l0.03,-0.14l-0.03,-2.23l0.7,-2.49l1.08,-0.65l0.14,-0.19l0.24,-1.0l1.03,-1.85l1.47,-1.22l0.09,-0.12l1.02,-2.51l0.36,-1.96l2.62,0.48l0.33,-0.18l0.63,-1.55Z\\\", \\\"name\\\": \\\"Ethiopia\\\"}, \\\"ZW\\\": {\\\"path\\\": \\\"M498.95,341.2l-1.16,-0.23l-0.16,0.01l-0.74,0.28l-1.11,-0.41l-1.02,-0.04l-1.52,-1.13l-0.12,-0.05l-1.79,-0.37l-0.65,-1.46l-0.01,-0.86l-0.22,-0.29l-0.99,-0.26l-2.74,-2.77l-0.77,-1.46l-0.52,-0.5l-0.72,-1.54l2.24,0.23l0.78,0.28l0.12,0.02l0.85,-0.06l0.21,-0.11l1.38,-1.66l2.11,-2.05l0.81,-0.18l0.22,-0.2l0.27,-0.8l1.29,-0.93l1.53,-0.28l0.11,0.66l0.3,0.25l2.02,-0.05l1.04,0.48l0.5,0.59l0.18,0.1l1.13,0.18l1.11,0.7l0.01,3.06l-0.49,1.82l-0.11,1.94l0.03,0.16l0.35,0.68l-0.24,1.3l-0.27,0.17l-0.12,0.15l-0.64,1.83l-2.49,2.8Z\\\", \\\"name\\\": \\\"Zimbabwe\\\"}, \\\"ES\\\": {\\\"path\\\": \\\"M398.67,172.8l0.09,-1.45l-0.06,-0.2l-0.82,-1.05l3.16,-1.96l3.01,0.54l3.33,-0.02l2.64,0.52l2.14,-0.15l3.9,0.1l0.91,1.08l0.14,0.09l4.61,1.38l0.26,-0.04l0.77,-0.55l2.66,1.29l0.17,0.03l2.59,-0.35l0.1,1.28l-2.2,1.85l-3.13,0.62l-0.23,0.23l-0.21,0.92l-1.54,1.68l-0.97,2.4l0.02,0.26l0.85,1.46l-1.27,1.14l-0.09,0.14l-0.5,1.73l-1.73,0.53l-0.15,0.1l-1.68,2.1l-3.03,0.04l-2.38,-0.05l-0.17,0.05l-1.57,1.01l-0.9,1.01l-0.96,-0.19l-0.82,-0.86l-0.69,-1.6l-0.22,-0.18l-2.14,-0.41l-0.13,-0.62l0.83,-0.97l0.39,-0.86l-0.06,-0.33l-0.73,-0.73l0.63,-1.74l-0.02,-0.25l-0.8,-1.41l0.69,-0.15l0.23,-0.27l0.09,-1.29l0.33,-0.36l0.08,-0.2l0.03,-2.16l1.03,-0.72l0.1,-0.37l-0.7,-1.5l-0.25,-0.17l-1.46,-0.11l-0.22,0.07l-0.34,0.3l-1.17,0.0l-0.55,-1.29l-0.39,-0.16l-1.02,0.44l-0.45,0.36Z\\\", \\\"name\\\": \\\"Spain\\\"}, \\\"ER\\\": {\\\"path\\\": \\\"M527.15,253.05l-0.77,-0.74l-1.01,-1.47l-1.14,-0.86l-0.62,-0.84l-0.11,-0.09l-2.18,-1.02l-0.12,-0.03l-1.61,-0.03l-0.52,-0.46l-0.31,-0.05l-1.31,0.54l-1.38,-1.06l-0.46,0.12l-0.69,1.68l-2.49,-0.46l-0.2,-0.76l1.06,-3.69l0.24,-1.65l0.66,-0.66l1.76,-0.4l0.16,-0.1l0.97,-1.13l1.24,2.55l0.68,2.34l0.09,0.14l1.4,1.27l3.39,2.4l1.37,1.43l2.14,2.34l0.94,0.6l-0.32,0.26l-0.85,-0.17Z\\\", \\\"name\\\": \\\"Eritrea\\\"}, \\\"ME\\\": {\\\"path\\\": \\\"M469.05,172.9l-0.57,-0.8l-0.1,-0.09l-0.82,-0.46l0.16,-0.33l0.35,-1.57l0.72,-0.62l0.27,-0.16l0.48,0.38l0.35,0.4l0.12,0.08l0.79,0.32l0.66,0.43l-0.43,0.62l-0.28,0.11l-0.07,-0.25l-0.53,-0.1l-1.09,1.49l-0.05,0.23l0.06,0.32Z\\\", \\\"name\\\": \\\"Montenegro\\\"}, \\\"MD\\\": {\\\"path\\\": \\\"M488.2,153.75l0.14,-0.11l1.49,-0.28l1.75,0.95l1.06,0.14l0.92,0.7l-0.15,0.9l0.15,0.31l0.8,0.46l0.33,1.2l0.09,0.14l0.72,0.66l-0.11,0.28l0.1,0.33l-0.06,0.02l-1.25,-0.08l-0.17,-0.29l-0.39,-0.12l-0.52,0.25l-0.16,0.36l0.13,0.42l-0.6,0.88l-0.43,1.03l-0.22,0.12l-0.32,-1.0l0.25,-1.34l-0.08,-1.38l-0.06,-0.17l-1.43,-1.87l-0.81,-1.36l-0.78,-0.95l-0.12,-0.09l-0.29,-0.12Z\\\", \\\"name\\\": \\\"Moldova\\\"}, \\\"MG\\\": {\\\"path\\\": \\\"M544.77,316.45l0.64,1.04l0.6,1.62l0.4,3.04l0.63,1.21l-0.22,1.07l-0.15,0.26l-0.59,-1.05l-0.52,-0.01l-0.47,0.76l-0.04,0.23l0.46,1.84l-0.19,0.92l-0.61,0.53l-0.1,0.21l-0.16,2.15l-0.97,2.98l-1.24,3.59l-1.55,4.97l-0.96,3.67l-1.08,2.93l-1.94,0.61l-2.05,1.06l-3.2,-1.53l-0.62,-1.26l-0.18,-2.39l-0.87,-2.07l-0.22,-1.8l0.4,-1.69l1.01,-0.4l0.19,-0.28l0.01,-0.79l1.15,-1.91l0.04,-0.11l0.23,-1.66l-0.03,-0.17l-0.57,-1.21l-0.46,-1.58l-0.19,-2.25l0.82,-1.36l0.33,-1.51l1.11,-0.1l1.4,-0.53l0.9,-0.45l1.03,-0.03l0.21,-0.09l1.41,-1.45l2.12,-1.65l0.75,-1.29l0.03,-0.24l-0.17,-0.56l0.53,0.15l0.32,-0.1l1.38,-1.77l0.06,-0.18l0.04,-1.44l0.54,-0.74l0.62,0.77Z\\\", \\\"name\\\": \\\"Madagascar\\\"}, \\\"MA\\\": {\\\"path\\\": \\\"M378.66,230.13l0.07,-0.75l0.93,-0.72l0.82,-1.37l0.04,-0.21l-0.14,-0.8l0.8,-1.74l1.33,-1.61l0.79,-0.4l0.14,-0.15l0.66,-1.55l0.08,-1.46l0.83,-1.52l1.6,-0.94l0.11,-0.11l1.56,-2.71l1.2,-0.99l2.24,-0.29l0.17,-0.08l1.95,-1.83l1.3,-0.77l2.09,-2.28l0.07,-0.26l-0.61,-3.34l0.92,-2.3l0.33,-1.44l1.52,-1.79l2.48,-1.27l1.86,-1.16l0.1,-0.11l1.67,-2.93l0.72,-1.59l1.54,0.01l1.43,1.14l0.21,0.06l2.33,-0.19l2.55,0.62l0.97,0.03l0.83,1.6l0.15,1.71l0.86,2.96l0.09,0.14l0.5,0.45l-0.31,0.73l-3.11,0.44l-0.16,0.07l-1.07,0.97l-1.36,0.23l-0.25,0.28l-0.1,1.85l-2.74,1.02l-0.14,0.11l-0.9,1.3l-1.93,0.69l-2.56,0.44l-4.04,2.01l-0.17,0.27l0.02,2.91l-0.08,0.0l-0.3,0.31l0.05,1.15l-1.25,0.07l-0.16,0.06l-0.73,0.55l-0.98,0.0l-0.85,-0.33l-0.15,-0.02l-2.11,0.29l-0.24,0.19l-0.76,1.95l-0.63,0.16l-0.21,0.19l-1.15,3.29l-3.42,2.81l-0.1,0.17l-0.81,3.57l-0.98,1.12l-0.3,0.85l-5.13,0.19Z\\\", \\\"name\\\": \\\"Morocco\\\"}, \\\"UZ\\\": {\\\"path\\\": \\\"M587.83,186.48l0.06,-1.46l-0.19,-0.29l-3.31,-1.24l-2.57,-1.4l-1.63,-1.38l-2.79,-1.98l-1.2,-2.98l-0.12,-0.14l-0.84,-0.54l-0.18,-0.05l-2.61,0.13l-0.76,-0.48l-0.25,-2.25l-0.17,-0.24l-3.37,-1.6l-0.32,0.04l-2.08,1.73l-2.11,1.02l-0.16,0.35l0.31,1.14l-2.14,0.03l-0.09,-10.68l6.1,-1.74l6.25,3.57l2.36,2.72l0.27,0.1l2.92,-0.44l4.17,-0.23l2.78,2.06l-0.18,2.87l0.29,0.32l0.98,0.02l0.46,2.22l0.28,0.24l3.0,0.09l0.61,1.25l0.28,0.17l0.93,-0.02l0.26,-0.16l1.06,-2.06l3.21,-2.03l1.3,-0.5l0.19,0.08l-1.75,1.62l0.05,0.48l1.85,1.12l0.27,0.02l1.65,-0.69l2.4,1.27l-2.69,1.79l-1.79,-0.27l-0.89,0.06l-0.22,-0.52l0.48,-1.26l-0.34,-0.4l-3.35,0.69l-0.22,0.18l-0.78,1.87l-1.07,1.47l-1.93,-0.13l-0.29,0.16l-0.65,1.29l0.16,0.42l1.69,0.64l0.48,1.91l-1.25,2.6l-1.64,-0.53l-1.18,-0.03Z\\\", \\\"name\\\": \\\"Uzbekistan\\\"}, \\\"MM\\\": {\\\"path\\\": \\\"M670.1,233.39l-1.46,1.11l-1.68,0.11l-0.26,0.19l-1.1,2.7l-0.95,0.42l-0.14,0.42l1.21,2.27l1.61,1.92l0.94,1.55l-0.82,1.99l-0.77,0.42l-0.13,0.39l0.64,1.35l1.62,1.97l0.26,1.32l-0.04,1.15l0.02,0.13l0.92,2.18l-1.3,2.23l-0.79,1.69l-0.1,-0.77l0.74,-1.87l-0.02,-0.26l-0.8,-1.42l0.2,-2.68l-0.06,-0.2l-0.98,-1.27l-0.8,-2.98l-0.45,-3.22l-1.11,-2.22l-0.45,-0.1l-1.64,1.28l-2.74,1.76l-1.26,-0.2l-1.27,-0.49l0.79,-2.93l0.0,-0.14l-0.52,-2.42l-1.93,-2.97l0.26,-0.8l-0.22,-0.39l-1.37,-0.31l-1.65,-1.98l-0.12,-1.5l0.41,0.19l0.42,-0.26l0.05,-1.7l1.08,-0.54l0.16,-0.34l-0.24,-1.0l0.5,-0.79l0.05,-0.15l0.08,-2.35l1.58,0.49l0.36,-0.15l1.12,-2.19l0.15,-1.34l1.35,-2.18l0.04,-0.17l-0.07,-1.35l2.97,-1.71l1.67,0.45l0.38,-0.33l-0.18,-1.46l0.7,-0.4l0.15,-0.32l-0.13,-0.72l0.94,-0.13l0.74,1.41l0.11,0.12l0.95,0.56l0.07,1.89l-0.09,2.08l-2.28,2.15l-0.09,0.19l-0.3,3.15l0.35,0.32l2.37,-0.39l0.53,2.17l0.2,0.21l1.3,0.42l-0.63,1.9l0.14,0.36l1.86,0.99l1.1,0.49l0.24,0.0l1.45,-0.6l0.04,0.51l-2.01,1.6l-0.56,0.96l-1.34,0.56Z\\\", \\\"name\\\": \\\"Myanmar\\\"}, \\\"ML\\\": {\\\"path\\\": \\\"M390.79,248.2l0.67,-0.37l0.14,-0.18l0.36,-1.31l0.51,-0.04l1.68,0.69l0.21,0.0l1.34,-0.48l0.89,0.16l0.3,-0.13l0.29,-0.44l9.89,-0.04l0.29,-0.21l0.56,-1.8l-0.11,-0.33l-0.33,-0.24l-2.37,-22.1l3.41,-0.04l8.37,5.73l8.38,5.68l0.56,1.15l0.14,0.14l1.56,0.75l0.99,0.36l0.03,1.45l0.33,0.29l2.45,-0.22l0.01,5.52l-1.3,1.64l-0.06,0.15l-0.18,1.37l-1.99,0.36l-3.4,0.22l-0.19,0.09l-0.85,0.83l-1.48,0.09l-1.49,0.01l-0.54,-0.43l-0.26,-0.05l-1.38,0.36l-2.39,1.08l-0.13,0.12l-0.44,0.73l-1.88,1.11l-0.11,0.12l-0.3,0.57l-0.86,0.42l-1.1,-0.31l-0.28,0.07l-0.69,0.62l-0.09,0.16l-0.35,1.66l-1.93,2.04l-0.08,0.23l0.05,0.76l-0.63,0.99l-0.04,0.19l0.14,1.23l-0.81,0.29l-0.32,0.17l-0.27,-0.75l-0.39,-0.18l-0.65,0.26l-0.36,-0.04l-0.29,0.14l-0.37,0.6l-1.69,-0.02l-0.63,-0.34l-0.32,0.02l-0.12,0.09l-0.47,-0.45l0.1,-0.6l-0.09,-0.27l-0.31,-0.3l-0.33,-0.05l-0.05,0.02l0.02,-0.21l0.46,-0.59l-0.02,-0.39l-0.99,-1.02l-0.34,-0.74l-0.56,-0.56l-0.17,-0.09l-0.5,-0.07l-0.19,0.04l-0.58,0.35l-0.79,0.33l-0.65,0.51l-0.85,-0.16l-0.63,-0.59l-0.14,-0.07l-0.41,-0.08l-0.2,0.03l-0.59,0.31l-0.07,0.0l-0.1,-0.63l0.11,-0.85l-0.21,-0.98l-0.11,-0.17l-0.86,-0.66l-0.45,-1.34l-0.1,-1.36Z\\\", \\\"name\\\": \\\"Mali\\\"}, \\\"MN\\\": {\\\"path\\\": \\\"M641.06,150.59l2.41,-0.53l4.76,-2.8l3.67,-1.49l2.06,0.96l0.12,0.03l2.5,0.05l1.59,1.45l0.19,0.08l2.47,0.12l3.59,0.81l0.27,-0.07l2.43,-2.28l0.06,-0.36l-0.93,-1.77l2.33,-3.1l2.66,1.3l2.26,0.39l2.75,0.8l0.44,2.3l0.19,0.22l3.56,1.38l0.18,0.01l2.35,-0.6l3.1,-0.42l2.4,0.41l2.37,1.52l1.49,1.63l0.23,0.1l2.29,-0.03l3.13,0.52l0.15,-0.01l2.28,-0.79l3.27,-0.53l0.11,-0.04l3.56,-2.23l1.31,0.31l1.26,1.05l0.22,0.07l2.45,-0.22l-0.98,1.96l-1.77,3.21l-0.01,0.28l0.64,1.31l0.35,0.16l1.35,-0.38l2.4,0.48l0.22,-0.04l1.78,-1.09l1.82,0.92l2.11,2.07l-0.17,0.68l-1.79,-0.31l-3.74,0.45l-1.85,0.96l-1.78,2.01l-3.74,1.18l-2.46,1.61l-2.45,-0.6l-1.42,-0.28l-0.31,0.13l-1.31,1.99l0.0,0.33l0.78,1.15l0.3,0.74l-1.58,0.93l-1.75,1.59l-2.83,1.03l-3.77,0.12l-4.05,1.05l-2.81,1.54l-0.95,-0.8l-0.19,-0.07l-2.96,0.0l-3.64,-1.8l-2.55,-0.48l-3.38,0.41l-5.13,-0.67l-2.66,0.06l-1.35,-1.65l-1.12,-2.78l-0.21,-0.18l-1.5,-0.33l-2.98,-1.89l-0.12,-0.04l-3.37,-0.43l-2.84,-0.51l-0.75,-1.13l0.93,-3.54l-0.04,-0.24l-1.73,-2.55l-0.15,-0.12l-3.52,-1.18l-1.99,-1.61l-0.54,-1.85Z\\\", \\\"name\\\": \\\"Mongolia\\\"}, \\\"MK\\\": {\\\"path\\\": \\\"M472.73,173.87l0.08,0.01l0.32,-0.25l0.08,-0.44l1.29,-0.41l1.37,-0.28l1.03,-0.04l1.06,0.82l0.14,1.59l-0.22,0.04l-0.17,0.11l-0.32,0.4l-1.2,-0.05l-0.18,0.05l-0.9,0.61l-1.45,0.23l-0.85,-0.59l-0.3,-1.09l0.22,-0.71Z\\\", \\\"name\\\": \\\"Macedonia\\\"}, \\\"MW\\\": {\\\"path\\\": \\\"M507.18,313.84l-0.67,1.85l-0.01,0.16l0.7,3.31l0.31,0.24l0.75,-0.03l0.78,0.71l0.99,1.75l0.2,3.03l-0.91,0.45l-0.14,0.15l-0.59,1.38l-1.24,-1.21l-0.17,-1.62l0.49,-1.12l0.02,-0.16l-0.15,-1.03l-0.13,-0.21l-0.99,-0.65l-0.26,-0.03l-0.53,0.18l-1.31,-1.12l-1.15,-0.59l0.66,-2.06l0.75,-0.84l0.07,-0.27l-0.47,-2.04l0.48,-1.94l0.4,-0.65l0.03,-0.24l-0.64,-2.15l-0.08,-0.13l-0.44,-0.42l1.34,0.26l1.25,1.73l0.67,3.3Z\\\", \\\"name\\\": \\\"Malawi\\\"}, \\\"MR\\\": {\\\"path\\\": \\\"M390.54,247.66l-1.48,-1.58l-1.51,-1.88l-0.12,-0.09l-1.64,-0.67l-1.17,-0.74l-0.17,-0.05l-1.4,0.03l-0.12,0.03l-1.14,0.52l-1.15,-0.21l-0.26,0.08l-0.44,0.43l-0.11,-0.72l0.68,-1.29l0.31,-2.43l-0.28,-2.63l-0.29,-1.27l0.24,-1.24l-0.03,-0.2l-0.65,-1.24l-1.19,-1.05l0.32,-0.51l9.64,0.02l0.3,-0.34l-0.46,-3.71l0.51,-1.12l2.17,-0.22l0.27,-0.3l-0.08,-6.5l7.91,0.13l0.31,-0.3l0.01,-3.5l8.17,5.63l-2.89,0.04l-0.29,0.33l2.42,22.56l0.12,0.21l0.26,0.19l-0.43,1.38l-9.83,0.04l-0.25,0.13l-0.27,0.41l-0.77,-0.14l-0.15,0.01l-1.3,0.47l-1.64,-0.67l-0.14,-0.02l-0.79,0.06l-0.27,0.22l-0.39,1.39l-0.53,0.29Z\\\", \\\"name\\\": \\\"Mauritania\\\"}, \\\"UG\\\": {\\\"path\\\": \\\"M500.74,287.17l-2.84,-0.02l-0.92,0.32l-1.37,0.71l-0.29,-0.12l0.02,-1.6l0.54,-0.89l0.04,-0.13l0.14,-1.96l0.49,-1.09l0.91,-1.24l0.97,-0.68l0.8,-0.89l-0.13,-0.49l-0.79,-0.27l0.13,-2.55l0.78,-0.52l1.45,0.51l0.18,0.01l1.97,-0.57l1.72,0.01l0.18,-0.06l1.29,-0.97l0.98,1.44l0.29,1.24l1.05,2.75l-0.84,1.68l-1.94,2.66l-0.06,0.18l0.02,2.36l-4.8,0.18Z\\\", \\\"name\\\": \\\"Uganda\\\"}, \\\"MY\\\": {\\\"path\\\": \\\"M717.6,273.52l-1.51,0.7l-2.13,-0.41l-2.88,-0.0l-0.29,0.21l-0.84,2.77l-0.9,0.82l-0.08,0.12l-1.23,3.34l-1.81,0.47l-2.29,-0.68l-0.14,-0.01l-1.2,0.22l-0.14,0.07l-1.36,1.18l-1.47,-0.17l-0.12,0.01l-1.46,0.46l-1.51,-1.25l-0.24,-0.97l1.26,0.59l0.2,0.02l1.93,-0.47l0.22,-0.22l0.47,-1.98l0.9,-0.4l2.97,-0.54l0.17,-0.09l1.8,-1.98l1.02,-1.32l0.9,1.03l0.48,-0.04l0.43,-0.7l1.02,0.07l0.32,-0.27l0.25,-2.72l1.84,-1.67l1.23,-1.89l0.73,-0.01l1.12,1.11l0.1,0.99l0.18,0.24l1.66,0.71l1.85,0.67l-0.09,0.51l-1.45,0.11l-0.26,0.4l0.35,0.97ZM673.78,269.53l0.17,1.14l0.35,0.25l1.65,-0.3l0.18,-0.11l0.68,-0.86l0.31,0.13l1.41,1.45l0.99,1.59l0.13,1.57l-0.26,1.09l0.0,0.15l0.24,0.84l0.18,1.46l0.11,0.2l0.82,0.64l0.92,2.08l-0.03,0.52l-1.4,0.13l-2.29,-1.79l-2.86,-1.92l-0.27,-1.16l-0.07,-0.13l-1.39,-1.61l-0.33,-1.99l-0.05,-0.12l-0.84,-1.27l0.26,-1.72l-0.03,-0.18l-0.45,-0.87l0.13,-0.13l1.71,0.92Z\\\", \\\"name\\\": \\\"Malaysia\\\"}, \\\"MX\\\": {\\\"path\\\": \\\"M133.41,213.83l0.61,0.09l0.27,-0.09l0.93,-1.01l0.08,-0.18l0.09,-1.22l-0.09,-0.23l-1.93,-1.94l-1.46,-0.77l-2.96,-5.62l-0.86,-2.1l2.44,-0.18l2.68,-0.25l-0.03,0.08l0.17,0.4l3.79,1.35l5.81,1.97l6.96,-0.02l0.3,-0.3l0.0,-0.84l3.91,0.0l0.87,0.93l1.27,0.87l1.44,1.17l0.79,1.37l0.62,1.49l0.12,0.14l1.35,0.85l2.08,0.82l0.35,-0.1l1.49,-2.04l1.81,-0.05l1.63,1.01l1.21,1.8l0.86,1.58l1.47,1.55l0.53,1.82l0.73,1.32l0.14,0.13l1.98,0.84l1.78,0.59l0.61,-0.03l-0.78,1.89l-0.45,1.96l-0.19,3.58l-0.24,1.27l0.01,0.14l0.43,1.43l0.78,1.31l0.49,1.98l0.06,0.12l1.63,1.9l0.61,1.51l0.98,1.28l0.16,0.11l2.58,0.67l0.98,1.02l0.31,0.08l2.17,-0.71l1.91,-0.26l1.87,-0.47l1.67,-0.49l1.59,-1.06l0.11,-0.14l0.6,-1.52l0.22,-2.21l0.35,-0.62l1.58,-0.64l2.59,-0.59l2.18,0.09l1.43,-0.2l0.39,0.36l-0.07,1.02l-1.28,1.48l-0.65,1.68l0.07,0.32l0.33,0.32l-0.79,2.49l-0.28,-0.3l-0.24,-0.09l-1.0,0.08l-0.24,0.15l-0.74,1.28l-0.19,-0.13l-0.28,-0.03l-0.3,0.12l-0.19,0.29l0.0,0.06l-4.34,-0.02l-0.3,0.3l-0.0,1.16l-0.83,0.0l-0.28,0.19l0.08,0.33l0.93,0.86l0.9,0.58l0.24,0.48l0.16,0.15l0.2,0.08l-0.03,0.38l-2.94,0.01l-0.26,0.15l-1.21,2.09l0.02,0.33l0.25,0.33l-0.21,0.44l-0.04,0.22l-2.42,-2.35l-1.36,-0.87l-2.04,-0.67l-0.13,-0.01l-1.4,0.19l-2.07,0.98l-1.14,0.23l-1.72,-0.66l-1.85,-0.48l-2.31,-1.16l-1.92,-0.38l-2.79,-1.18l-2.04,-1.2l-0.6,-0.66l-0.19,-0.1l-1.37,-0.15l-2.45,-0.78l-1.07,-1.18l-2.63,-1.44l-1.2,-1.56l-0.44,-0.93l0.5,-0.15l0.2,-0.39l-0.2,-0.58l0.46,-0.55l0.07,-0.19l0.01,-0.91l-0.06,-0.18l-0.81,-1.13l-0.25,-1.08l-0.86,-1.36l-2.21,-2.63l-2.53,-2.09l-1.2,-1.63l-0.11,-0.09l-2.08,-1.06l-0.34,-0.48l0.35,-1.53l-0.16,-0.34l-1.24,-0.61l-1.39,-1.23l-0.6,-1.81l-0.24,-0.2l-1.25,-0.2l-1.38,-1.35l-1.11,-1.25l-0.1,-0.76l-0.05,-0.13l-1.33,-2.04l-0.85,-2.02l0.04,-0.99l-0.14,-0.27l-1.81,-1.1l-0.2,-0.04l-0.74,0.11l-1.34,-0.72l-0.42,0.16l-0.4,1.12l-0.0,0.19l0.41,1.3l0.24,2.04l0.06,0.15l0.88,1.16l1.84,1.86l0.4,0.61l0.12,0.1l0.27,0.14l0.29,0.82l0.31,0.2l0.2,-0.02l0.43,1.51l0.09,0.14l0.72,0.65l0.51,0.91l1.58,1.4l0.8,2.42l0.77,1.23l0.66,1.19l0.13,1.34l0.28,0.27l1.08,0.08l0.92,1.1l0.83,1.08l-0.03,0.24l-0.88,0.81l-0.13,-0.0l-0.59,-1.42l-0.07,-0.11l-1.67,-1.53l-1.81,-1.28l-1.15,-0.61l0.07,-1.85l-0.38,-1.45l-0.12,-0.17l-2.91,-2.03l-0.39,0.04l-0.11,0.11l-0.42,-0.46l-0.11,-0.08l-1.49,-0.63l-1.09,-1.16Z\\\", \\\"name\\\": \\\"Mexico\\\"}, \\\"VU\\\": {\\\"path\\\": \\\"M839.92,325.66l0.78,0.73l-0.18,0.07l-0.6,-0.8ZM839.13,322.74l0.27,1.36l-0.13,-0.06l-0.21,-0.02l-0.29,0.08l-0.22,-0.43l-0.03,-1.32l0.61,0.4Z\\\", \\\"name\\\": \\\"Vanuatu\\\"}, \\\"FR\\\": {\\\"path\\\": \\\"M444.58,172.63l-0.68,1.92l-0.72,-0.38l-0.51,-1.79l0.43,-0.95l1.15,-0.83l0.33,2.04ZM429.71,147.03l1.77,1.57l0.26,0.07l1.16,-0.23l2.12,1.44l0.56,0.28l0.16,0.03l0.61,-0.06l1.09,0.78l0.13,0.05l3.18,0.53l-1.09,1.94l-0.3,2.16l-0.48,0.38l-1.0,-0.26l-0.37,0.32l0.07,0.66l-1.73,1.68l-0.09,0.21l-0.04,1.42l0.41,0.29l0.96,-0.4l0.67,1.07l-0.09,0.78l0.04,0.19l0.61,0.97l-0.71,0.78l-0.07,0.28l0.65,2.39l0.21,0.21l1.09,0.31l-0.2,0.95l-2.08,1.58l-4.81,-0.8l-0.13,0.01l-3.65,0.99l-0.22,0.24l-0.25,1.6l-2.59,0.35l-2.74,-1.33l-0.31,0.03l-0.79,0.57l-4.38,-1.31l-0.79,-0.94l1.16,-1.64l0.05,-0.15l0.48,-6.17l-0.06,-0.21l-2.58,-3.3l-1.89,-1.65l-0.11,-0.06l-3.64,-1.17l-0.2,-1.88l2.92,-0.63l4.14,0.82l0.35,-0.36l-0.65,-3.0l1.77,1.05l0.27,0.02l5.83,-2.54l0.17,-0.19l0.71,-2.54l1.75,-0.53l0.27,0.88l0.27,0.21l1.04,0.05l1.08,1.23ZM289.1,278.45l-0.85,0.84l-0.88,0.13l-0.25,-0.51l-0.21,-0.16l-0.56,-0.1l-0.25,0.07l-0.63,0.55l-0.62,-0.29l0.5,-0.88l0.21,-1.11l0.42,-1.05l-0.03,-0.28l-0.93,-1.42l-0.18,-1.54l1.13,-1.87l2.42,0.78l2.55,2.04l0.33,0.81l-1.4,2.16l-0.77,1.84Z\\\", \\\"name\\\": \\\"France\\\"}, \\\"FI\\\": {\\\"path\\\": \\\"M492.26,76.42l-0.38,3.12l0.12,0.28l3.6,2.69l-2.14,2.96l-0.01,0.33l2.83,4.61l-1.61,3.36l0.03,0.31l2.15,2.87l-0.96,2.44l0.1,0.35l3.51,2.55l-0.81,1.72l-2.28,2.19l-5.28,4.79l-4.51,0.31l-4.39,1.37l-3.87,0.75l-1.34,-1.89l-0.11,-0.09l-2.23,-1.14l0.53,-3.54l-0.01,-0.14l-1.17,-3.37l1.12,-2.13l2.23,-2.44l5.69,-4.33l1.65,-0.84l0.16,-0.31l-0.26,-1.73l-0.15,-0.22l-3.4,-1.91l-0.77,-1.47l-0.07,-6.45l-0.12,-0.24l-3.91,-2.94l-3.0,-1.92l0.97,-0.76l2.6,2.17l0.21,0.07l3.2,-0.21l2.63,1.03l0.3,-0.05l2.39,-1.94l0.09,-0.13l1.18,-3.12l3.63,-1.42l2.87,1.59l-0.98,2.87Z\\\", \\\"name\\\": \\\"Finland\\\"}, \\\"FJ\\\": {\\\"path\\\": \\\"M869.98,327.07l-1.31,0.44l-0.14,-0.41l0.96,-0.41l0.85,-0.17l1.43,-0.78l-0.16,0.65l-1.64,0.67ZM867.58,329.12l0.54,0.47l-0.31,1.0l-1.32,0.3l-1.13,-0.26l-0.17,-0.78l0.72,-0.66l0.98,0.27l0.25,-0.04l0.43,-0.29Z\\\", \\\"name\\\": \\\"Fiji\\\"}, \\\"FK\\\": {\\\"path\\\": \\\"M268.15,427.89l2.6,-1.73l1.98,0.77l0.31,-0.05l1.32,-1.17l1.58,1.18l-0.54,0.84l-3.1,0.92l-1.0,-1.04l-0.39,-0.04l-1.9,1.35l-0.86,-1.04Z\\\", \\\"name\\\": \\\"Falkland Islands\\\"}, \\\"NI\\\": {\\\"path\\\": \\\"M202.1,252.6l0.23,-0.0l0.12,-0.11l0.68,-0.09l0.22,-0.15l0.23,-0.43l0.2,-0.01l0.28,-0.31l-0.04,-0.97l0.29,-0.03l0.5,0.02l0.25,-0.11l0.37,-0.46l0.51,0.35l0.4,-0.06l0.23,-0.28l0.45,-0.29l0.87,-0.7l0.11,-0.21l0.02,-0.26l0.23,-0.12l0.25,-0.48l0.29,0.27l0.14,0.07l0.5,0.12l0.22,-0.03l0.48,-0.28l0.66,-0.02l0.87,-0.33l0.36,-0.32l0.21,0.01l-0.11,0.48l0.0,0.14l0.22,0.8l-0.54,0.85l-0.27,1.03l-0.09,1.18l0.14,0.72l0.05,0.95l-0.24,0.15l-0.13,0.19l-0.23,1.09l0.0,0.14l0.14,0.53l-0.42,0.53l-0.06,0.24l0.12,0.69l0.08,0.15l0.18,0.19l-0.26,0.23l-0.49,-0.11l-0.35,-0.44l-0.16,-0.1l-0.79,-0.21l-0.23,0.03l-0.45,0.26l-1.51,-0.62l-0.31,0.05l-0.17,0.15l-1.81,-1.62l-0.6,-0.9l-1.04,-0.79l-0.77,-0.71Z\\\", \\\"name\\\": \\\"Nicaragua\\\"}, \\\"NL\\\": {\\\"path\\\": \\\"M436.22,136.65l1.82,0.08l0.36,0.89l-0.6,2.96l-0.53,1.06l-1.32,0.0l-0.3,0.34l0.35,2.89l-0.83,-0.47l-1.56,-1.43l-0.29,-0.07l-2.26,0.67l-1.02,-0.15l0.68,-0.48l0.1,-0.12l2.14,-4.84l3.25,-1.35Z\\\", \\\"name\\\": \\\"Netherlands\\\"}, \\\"NO\\\": {\\\"path\\\": \\\"M491.45,67.31l7.06,3.0l-2.52,0.94l-0.11,0.49l2.43,2.49l-3.82,1.59l-1.48,0.3l0.89,-2.61l-0.14,-0.36l-3.21,-1.78l-0.25,-0.02l-3.89,1.52l-0.17,0.17l-1.2,3.17l-2.19,1.78l-2.53,-0.99l-0.13,-0.02l-3.15,0.21l-2.69,-2.25l-0.38,-0.01l-1.43,1.11l-1.47,0.17l-0.26,0.26l-0.33,2.57l-4.42,-0.65l-0.33,0.22l-0.6,2.19l-2.17,-0.01l-0.27,0.16l-4.15,7.68l-3.88,5.76l-0.0,0.33l0.81,1.23l-0.7,1.27l-2.3,-0.06l-0.28,0.18l-1.63,3.72l-0.02,0.13l0.15,5.17l0.07,0.18l1.51,1.84l-0.79,4.24l-2.04,2.5l-0.92,1.75l-1.39,-1.88l-0.44,-0.05l-4.89,4.21l-3.16,0.81l-3.24,-1.74l-0.86,-3.82l-0.78,-8.6l2.18,-2.36l6.56,-3.28l5.0,-4.16l4.63,-5.74l5.99,-8.09l4.17,-3.23l6.84,-5.49l5.39,-1.92l4.06,0.24l0.23,-0.09l3.72,-3.67l4.51,0.19l4.4,-0.89ZM484.58,19.95l4.42,1.82l-3.25,2.68l-7.14,0.65l-7.16,-0.91l-0.39,-1.37l-0.28,-0.22l-3.48,-0.1l-2.25,-2.15l7.09,-1.48l3.55,1.36l0.28,-0.03l2.42,-1.66l6.18,1.41ZM481.99,33.92l-4.73,1.85l-3.76,-1.06l1.27,-1.02l0.04,-0.43l-1.18,-1.35l4.46,-0.94l0.89,1.83l0.17,0.15l2.83,0.96ZM466.5,23.95l7.64,3.87l-5.63,1.94l-0.19,0.19l-1.35,3.88l-2.08,0.96l-0.16,0.19l-1.14,4.18l-2.71,0.18l-4.94,-2.95l1.95,-1.63l-0.08,-0.51l-3.7,-1.54l-4.79,-4.54l-1.78,-4.01l6.29,-1.88l1.25,1.81l0.25,0.13l3.57,-0.08l0.26,-0.17l0.87,-1.79l3.41,-0.18l3.08,1.94Z\\\", \\\"name\\\": \\\"Norway\\\"}, \\\"NA\\\": {\\\"path\\\": \\\"M461.88,357.98l-1.61,-1.77l-0.94,-1.9l-0.54,-2.58l-0.62,-1.95l-0.83,-4.05l-0.06,-3.13l-0.33,-1.5l-0.07,-0.14l-0.95,-1.06l-1.27,-2.12l-1.3,-3.1l-0.59,-1.71l-1.98,-2.46l-0.13,-1.67l0.99,-0.4l1.44,-0.42l1.48,0.07l1.42,1.11l0.31,0.03l0.32,-0.15l9.99,-0.11l1.66,1.18l0.16,0.06l6.06,0.37l4.69,-1.06l2.01,-0.57l1.5,0.14l0.63,0.37l-1.0,0.41l-0.7,0.01l-0.16,0.05l-1.38,0.88l-0.79,-0.88l-0.29,-0.09l-3.83,0.9l-1.84,0.08l-0.29,0.3l-0.07,8.99l-2.18,0.08l-0.29,0.3l-0.0,17.47l-2.04,1.27l-1.21,0.18l-1.51,-0.49l-0.99,-0.18l-0.36,-1.0l-0.1,-0.14l-0.99,-0.74l-0.4,0.04l-0.98,1.09Z\\\", \\\"name\\\": \\\"Namibia\\\"}, \\\"NC\\\": {\\\"path\\\": \\\"M835.87,338.68l2.06,1.63l1.01,0.94l-0.49,0.32l-1.21,-0.62l-1.76,-1.16l-1.58,-1.36l-1.61,-1.79l-0.16,-0.41l0.54,0.02l1.32,0.83l1.08,0.87l0.79,0.73Z\\\", \\\"name\\\": \\\"New Caledonia\\\"}, \\\"NE\\\": {\\\"path\\\": \\\"M426.67,254.17l0.03,-1.04l-0.24,-0.3l-2.66,-0.53l-0.06,-1.0l-0.07,-0.17l-1.37,-1.62l-0.3,-1.04l0.15,-0.94l1.37,-0.09l0.19,-0.09l0.85,-0.83l3.34,-0.22l2.22,-0.41l0.24,-0.26l0.2,-1.5l1.32,-1.65l0.07,-0.19l-0.01,-5.74l3.4,-1.13l7.24,-5.12l8.46,-4.95l3.76,1.08l1.35,1.39l0.36,0.05l1.39,-0.77l0.55,3.66l0.12,0.2l0.82,0.6l0.03,0.69l0.1,0.21l0.87,0.74l-0.47,0.99l-0.96,5.26l-0.13,3.25l-3.08,2.34l-0.1,0.15l-1.08,3.37l0.08,0.31l0.94,0.86l-0.01,1.51l0.29,0.3l1.25,0.05l-0.14,0.66l-0.51,0.11l-0.24,0.26l-0.06,0.57l-0.04,0.0l-1.59,-2.62l-0.21,-0.14l-0.59,-0.1l-0.23,0.05l-1.83,1.33l-1.79,-0.68l-1.42,-0.17l-0.17,0.03l-0.65,0.32l-1.39,-0.07l-0.19,0.06l-1.4,1.03l-1.12,0.05l-2.97,-1.29l-0.26,0.01l-1.12,0.59l-1.08,-0.04l-0.85,-0.88l-0.11,-0.07l-2.51,-0.95l-0.14,-0.02l-2.69,0.3l-0.16,0.07l-0.65,0.55l-0.1,0.16l-0.34,1.41l-0.69,0.98l-0.05,0.15l-0.13,1.72l-1.47,-1.13l-0.18,-0.06l-0.9,0.01l-0.2,0.08l-0.32,0.28Z\\\", \\\"name\\\": \\\"Niger\\\"}, \\\"NG\\\": {\\\"path\\\": \\\"M442.0,272.7l-2.4,0.83l-0.88,-0.12l-0.19,0.04l-0.89,0.52l-1.78,-0.05l-1.23,-1.44l-0.88,-1.87l-1.77,-1.66l-0.21,-0.08l-3.78,0.03l0.13,-3.75l-0.06,-1.58l0.44,-1.47l0.74,-0.75l1.21,-1.56l0.04,-0.29l-0.22,-0.56l0.44,-0.9l0.01,-0.24l-0.54,-1.44l0.26,-2.97l0.72,-1.06l0.33,-1.37l0.51,-0.43l2.53,-0.28l2.38,0.9l0.89,0.91l0.2,0.09l1.28,0.04l0.15,-0.03l1.06,-0.56l2.9,1.26l0.13,0.02l1.28,-0.06l0.16,-0.06l1.39,-1.02l1.36,0.07l0.15,-0.03l0.64,-0.32l1.22,0.13l1.9,0.73l0.28,-0.04l1.86,-1.35l0.33,0.06l1.62,2.67l0.29,0.14l0.32,-0.04l0.73,0.74l-0.19,0.37l-0.12,0.74l-2.03,1.89l-0.07,0.11l-0.66,1.62l-0.35,1.28l-0.48,0.51l-0.07,0.12l-0.48,1.67l-1.26,0.98l-0.1,0.15l-0.38,1.24l-0.58,1.07l-0.2,0.91l-1.43,0.7l-1.26,-0.93l-0.19,-0.06l-0.95,0.04l-0.2,0.09l-1.41,1.39l-0.61,0.02l-0.26,0.17l-1.19,2.42l-0.61,1.67Z\\\", \\\"name\\\": \\\"Nigeria\\\"}, \\\"NZ\\\": {\\\"path\\\": \\\"M857.9,379.62l1.85,3.1l0.33,0.14l0.22,-0.28l0.04,-1.41l0.57,0.4l0.35,2.06l0.17,0.22l2.02,0.94l1.78,0.26l0.22,-0.06l1.31,-1.01l0.84,0.22l-0.53,2.27l-0.67,1.5l-1.71,-0.05l-0.25,0.12l-0.67,0.89l-0.05,0.23l0.21,1.15l-0.31,0.46l-2.15,3.57l-1.6,0.99l-0.28,-0.51l-0.15,-0.13l-0.72,-0.3l1.27,-2.15l0.01,-0.29l-0.82,-1.63l-0.15,-0.14l-2.5,-1.09l0.05,-0.69l1.67,-0.94l0.15,-0.21l0.42,-2.24l-0.11,-1.95l-0.03,-0.12l-0.97,-1.85l0.05,-0.41l-0.09,-0.25l-1.18,-1.17l-1.94,-2.49l-0.86,-1.64l0.38,-0.09l1.24,1.43l0.12,0.08l1.81,0.68l0.67,2.39ZM853.93,393.55l0.57,1.24l0.44,0.12l1.51,-1.03l0.52,0.91l0.0,1.09l-0.88,1.31l-1.62,2.2l-1.26,1.2l-0.05,0.38l0.64,1.02l-1.4,0.03l-0.14,0.04l-2.14,1.16l-0.14,0.17l-0.67,2.0l-1.38,3.06l-3.07,2.19l-2.12,-0.06l-1.55,-0.99l-0.14,-0.05l-2.53,-0.2l-0.31,-0.84l1.25,-2.15l3.07,-2.97l1.62,-0.59l1.81,-1.17l2.18,-1.63l1.55,-1.65l1.08,-2.18l0.9,-0.72l0.11,-0.17l0.35,-1.56l1.37,-1.07l0.4,0.91Z\\\", \\\"name\\\": \\\"New Zealand\\\"}, \\\"NP\\\": {\\\"path\\\": \\\"M641.26,213.53l-0.14,0.95l0.32,1.64l-0.21,0.78l-1.83,0.04l-2.98,-0.62l-1.86,-0.25l-1.37,-1.3l-0.18,-0.08l-3.38,-0.34l-3.21,-1.49l-2.38,-1.34l-2.16,-0.92l0.84,-2.2l1.51,-1.18l0.89,-0.57l1.83,0.77l2.5,1.76l1.39,0.41l0.78,1.21l0.17,0.13l1.91,0.53l2.0,1.17l2.92,0.66l2.63,0.24Z\\\", \\\"name\\\": \\\"Nepal\\\"}, \\\"CI\\\": {\\\"path\\\": \\\"M413.53,272.08l-0.83,0.02l-1.79,-0.49l-1.64,0.03l-3.04,0.46l-1.73,0.72l-2.4,0.89l-0.12,-0.02l0.16,-1.7l0.19,-0.25l0.06,-0.2l-0.08,-0.99l-0.09,-0.19l-1.06,-1.05l-0.15,-0.08l-0.71,-0.15l-0.51,-0.48l0.45,-0.92l0.02,-0.19l-0.24,-1.16l0.07,-0.43l0.14,-0.0l0.3,-0.26l0.15,-1.1l-0.02,-0.15l-0.13,-0.34l0.09,-0.13l0.83,-0.27l0.19,-0.37l-0.62,-2.02l-0.55,-1.0l0.14,-0.59l0.35,-0.14l0.24,-0.16l0.53,0.29l0.14,0.04l1.93,0.02l0.26,-0.14l0.36,-0.58l0.39,0.01l0.43,-0.17l0.28,0.79l0.43,0.16l0.56,-0.31l0.89,-0.32l0.92,0.45l0.39,0.75l0.14,0.13l1.13,0.53l0.3,-0.03l0.81,-0.59l1.02,-0.08l1.49,0.57l0.62,3.33l-1.03,2.09l-0.65,2.84l0.02,0.2l1.05,2.08l-0.07,0.64Z\\\", \\\"name\\\": \\\"Ivory Coast\\\"}, \\\"CH\\\": {\\\"path\\\": \\\"M444.71,156.27l0.05,0.3l-0.34,0.69l0.13,0.4l1.13,0.58l1.07,0.1l-0.12,0.81l-0.87,0.42l-1.75,-0.37l-0.34,0.18l-0.47,1.1l-0.86,0.07l-0.33,-0.38l-0.41,-0.04l-1.34,1.01l-1.02,0.13l-0.93,-0.58l-0.82,-1.32l-0.37,-0.12l-0.77,0.32l0.02,-0.84l1.74,-1.69l0.09,-0.25l-0.04,-0.38l0.73,0.19l0.26,-0.06l0.6,-0.48l2.02,0.02l0.24,-0.12l0.38,-0.51l2.31,0.84Z\\\", \\\"name\\\": \\\"Switzerland\\\"}, \\\"CO\\\": {\\\"path\\\": \\\"M232.24,284.95l-0.94,-0.52l-1.22,-0.82l-0.31,-0.01l-0.62,0.35l-1.88,-0.31l-0.54,-0.95l-0.29,-0.15l-0.37,0.03l-2.34,-1.33l-0.15,-0.35l0.57,-0.11l0.24,-0.32l-0.1,-1.15l0.46,-0.71l1.11,-0.15l0.21,-0.13l1.05,-1.57l0.95,-1.31l-0.08,-0.43l-0.73,-0.47l0.4,-1.24l0.01,-0.16l-0.53,-2.15l0.44,-0.54l0.06,-0.24l-0.4,-2.13l-0.06,-0.13l-0.93,-1.22l0.21,-0.8l0.52,0.12l0.32,-0.13l0.47,-0.75l0.03,-0.27l-0.52,-1.32l0.09,-0.11l1.14,0.07l0.22,-0.08l1.82,-1.71l0.96,-0.25l0.22,-0.28l0.02,-0.81l0.43,-2.01l1.28,-1.04l1.48,-0.05l0.27,-0.19l0.12,-0.31l1.73,0.19l0.2,-0.05l1.96,-1.28l0.97,-0.56l1.16,-1.16l0.64,0.11l0.43,0.44l-0.31,0.55l-1.49,0.39l-0.19,0.16l-0.6,1.2l-0.97,0.74l-0.73,0.94l-0.06,0.13l-0.3,1.76l-0.68,1.44l0.23,0.43l1.1,0.14l0.27,0.97l0.08,0.13l0.49,0.49l0.17,0.85l-0.27,0.86l-0.01,0.14l0.09,0.53l0.2,0.23l0.52,0.18l0.54,0.79l0.27,0.13l3.18,-0.24l1.31,0.29l1.7,2.08l0.31,0.1l0.96,-0.26l1.75,0.13l1.41,-0.27l0.56,0.27l-0.36,1.07l-0.54,0.81l-0.05,0.13l-0.2,1.8l0.51,1.79l0.07,0.12l0.65,0.68l0.05,0.32l-1.16,1.14l0.05,0.47l0.86,0.52l0.6,0.79l0.31,1.01l-0.7,-0.81l-0.44,-0.01l-0.74,0.77l-4.75,-0.05l-0.3,0.31l0.03,1.57l0.25,0.29l1.2,0.21l-0.02,0.24l-0.1,-0.05l-0.22,-0.02l-1.41,0.41l-0.22,0.29l-0.01,1.82l0.11,0.23l1.04,0.85l0.35,1.3l-0.06,1.02l-1.02,6.26l-0.84,-0.89l-0.19,-0.09l-0.25,-0.02l1.35,-2.13l-0.1,-0.42l-1.92,-1.17l-0.2,-0.04l-1.41,0.2l-0.82,-0.39l-0.26,0.0l-1.29,0.62l-1.63,-0.27l-1.4,-2.5l-0.12,-0.12l-1.1,-0.61l-0.83,-1.2l-1.67,-1.19l-0.27,-0.04l-0.54,0.19Z\\\", \\\"name\\\": \\\"Colombia\\\"}, \\\"CN\\\": {\\\"path\\\": \\\"M740.32,148.94l0.22,0.21l4.3,1.03l2.84,2.2l0.99,2.92l0.28,0.2l3.8,0.0l0.15,-0.04l2.13,-1.24l3.5,-0.8l-1.05,2.29l-0.95,1.13l-0.06,0.12l-0.85,3.41l-1.56,2.81l-2.83,-0.51l-0.19,0.03l-2.15,1.09l-0.15,0.34l0.65,2.59l-0.33,3.3l-1.03,0.07l-0.28,0.3l0.01,0.75l-1.09,-1.2l-0.48,0.05l-0.94,1.6l-3.76,1.26l-0.2,0.36l0.29,1.19l-1.67,-0.08l-1.11,-0.88l-0.42,0.05l-1.69,2.08l-2.71,1.57l-2.04,1.88l-3.42,0.84l-0.11,0.05l-1.8,1.34l-1.54,0.46l0.52,-0.53l0.06,-0.33l-0.44,-0.96l1.84,-1.84l0.02,-0.41l-1.32,-1.56l-0.36,-0.08l-2.23,1.08l-2.83,2.06l-1.52,1.85l-2.32,0.13l-0.2,0.09l-1.28,1.37l-0.03,0.37l1.32,1.97l0.18,0.13l1.83,0.43l0.07,1.08l0.18,0.26l1.98,0.84l0.3,-0.03l2.66,-1.96l2.06,1.04l0.12,0.03l1.4,0.07l0.27,1.0l-3.24,0.73l-0.17,0.11l-1.13,1.5l-2.38,1.4l-0.1,0.1l-1.29,1.99l0.1,0.42l2.6,1.5l0.97,2.72l1.52,2.56l1.66,2.08l-0.03,1.76l-1.4,0.67l-0.15,0.38l0.6,1.47l0.13,0.15l1.29,0.75l-0.35,2.0l-0.58,1.96l-1.22,0.21l-0.2,0.14l-1.83,2.93l-2.02,3.51l-2.29,3.13l-3.4,2.42l-3.42,2.18l-2.75,0.3l-0.15,0.06l-1.32,1.01l-0.68,-0.67l-0.41,-0.01l-1.37,1.27l-3.42,1.28l-2.62,0.4l-0.24,0.21l-0.8,2.57l-0.95,0.11l-0.53,-1.54l0.52,-0.89l-0.19,-0.44l-3.36,-0.84l-0.17,0.01l-1.09,0.4l-2.36,-0.64l-1.0,-0.9l0.35,-1.34l-0.23,-0.37l-2.22,-0.47l-1.15,-0.94l-0.36,-0.02l-2.08,1.37l-2.35,0.29l-1.98,-0.01l-0.13,0.03l-1.32,0.63l-1.28,0.38l-0.21,0.33l0.33,2.65l-0.78,-0.04l-0.14,-0.39l-0.07,-1.04l-0.41,-0.26l-1.72,0.71l-0.96,-0.43l-1.63,-0.86l0.65,-1.95l-0.19,-0.38l-1.43,-0.46l-0.56,-2.27l-0.34,-0.22l-2.26,0.38l0.25,-2.65l2.29,-2.15l0.09,-0.2l0.1,-2.21l-0.07,-2.09l-0.15,-0.25l-1.02,-0.6l-0.8,-1.52l-0.31,-0.16l-1.42,0.2l-2.16,-0.32l0.55,-0.74l0.01,-0.35l-1.17,-1.7l-0.41,-0.08l-1.67,1.07l-1.97,-0.63l-0.25,0.03l-2.89,1.73l-2.26,1.99l-1.82,0.3l-1.0,-0.66l-0.15,-0.05l-1.28,-0.06l-1.75,-0.61l-0.24,0.02l-1.35,0.69l-0.1,0.08l-1.2,1.45l-0.14,-1.41l-0.4,-0.25l-1.46,0.55l-2.83,-0.26l-2.77,-0.61l-1.99,-1.17l-1.91,-0.54l-0.78,-1.21l-0.17,-0.13l-1.36,-0.38l-2.54,-1.79l-2.01,-0.84l-0.28,0.02l-0.89,0.56l-3.31,-1.83l-2.35,-1.67l-0.57,-2.49l1.34,0.28l0.36,-0.28l0.08,-1.42l-0.05,-0.19l-0.93,-1.34l0.24,-2.18l-0.07,-0.22l-2.69,-3.32l-0.15,-0.1l-3.97,-1.11l-0.69,-2.05l-0.11,-0.15l-1.79,-1.3l-0.39,-0.73l-0.36,-1.57l0.08,-1.09l-0.18,-0.3l-1.52,-0.66l-0.22,-0.01l-0.51,0.18l-0.52,-2.21l0.59,-0.55l0.06,-0.35l-0.22,-0.44l2.12,-1.24l1.63,-0.55l2.58,0.39l0.31,-0.16l0.87,-1.75l3.05,-0.34l0.21,-0.12l0.84,-1.12l3.87,-1.59l0.15,-0.14l0.35,-0.68l0.03,-0.17l-0.17,-1.51l1.52,-0.7l0.15,-0.39l-2.12,-5.0l4.62,-1.15l1.35,-0.72l0.14,-0.17l1.72,-5.37l4.7,0.99l0.28,-0.08l1.39,-1.43l0.08,-0.2l0.11,-2.95l1.83,-0.26l0.18,-0.1l1.85,-2.08l0.61,-0.17l0.57,1.97l0.1,0.15l2.2,1.75l3.48,1.17l1.59,2.36l-0.93,3.53l0.04,0.24l0.9,1.35l0.2,0.13l2.98,0.53l3.32,0.43l2.97,1.89l1.49,0.35l1.08,2.67l1.52,1.88l0.24,0.11l2.74,-0.07l5.15,0.67l3.36,-0.41l2.39,0.43l3.67,1.81l0.13,0.03l2.92,-0.0l1.02,0.86l0.34,0.03l2.88,-1.59l3.98,-1.03l3.81,-0.13l3.02,-1.12l1.77,-1.61l1.73,-1.01l0.13,-0.37l-0.41,-1.01l-0.72,-1.07l1.09,-1.66l1.21,0.24l2.57,0.63l0.24,-0.04l2.46,-1.62l3.78,-1.19l0.13,-0.09l1.8,-2.03l1.66,-0.84l3.54,-0.41l1.93,0.35l0.34,-0.22l0.27,-1.12l-0.08,-0.29l-2.27,-2.22l-2.08,-1.07l-0.29,0.01l-1.82,1.12l-2.36,-0.47l-0.14,0.01l-1.18,0.34l-0.46,-0.94l1.69,-3.08l1.1,-2.21l2.75,1.12l0.26,-0.02l3.53,-2.06l0.15,-0.26l-0.02,-1.35l2.18,-3.39l1.35,-1.04l0.12,-0.24l-0.03,-1.85l-0.15,-0.25l-1.0,-0.58l1.68,-1.37l3.01,-0.59l3.25,-0.09l3.67,0.99l2.08,1.18l1.51,3.3l0.95,1.45l0.85,1.99l0.92,3.19ZM697.0,237.37l-1.95,1.12l-1.74,-0.68l-0.06,-1.9l1.08,-1.03l2.62,-0.7l1.23,0.05l0.37,0.65l-1.01,1.08l-0.54,1.4Z\\\", \\\"name\\\": \\\"China\\\"}, \\\"CM\\\": {\\\"path\\\": \\\"M453.76,278.92l-0.26,-0.11l-0.18,-0.02l-1.42,0.31l-1.56,-0.33l-1.17,0.16l-3.7,-0.05l0.3,-1.63l-0.04,-0.21l-0.98,-1.66l-0.15,-0.13l-1.03,-0.38l-0.46,-1.01l-0.13,-0.14l-0.48,-0.27l0.02,-0.46l0.62,-1.72l1.1,-2.25l0.54,-0.02l0.2,-0.09l1.41,-1.39l0.73,-0.03l1.32,0.97l0.31,0.03l1.72,-0.85l0.16,-0.2l0.22,-1.0l0.57,-1.03l0.36,-1.18l1.26,-0.98l0.1,-0.15l0.49,-1.7l0.48,-0.51l0.07,-0.13l0.35,-1.3l0.63,-1.54l2.06,-1.92l0.09,-0.17l0.12,-0.79l0.24,-0.41l-0.04,-0.36l-0.89,-0.91l0.04,-0.45l0.28,-0.06l0.85,1.39l0.16,1.59l-0.09,1.66l0.04,0.17l1.09,1.84l-0.86,-0.02l-0.72,0.17l-1.07,-0.24l-0.34,0.17l-0.54,1.19l0.06,0.34l1.48,1.47l1.06,0.44l0.32,0.94l0.73,1.6l-0.32,0.57l-1.23,2.49l-0.54,0.41l-0.12,0.21l-0.19,1.95l0.24,1.08l-0.18,0.67l0.07,0.28l1.13,1.25l0.24,0.93l0.92,1.29l1.1,0.8l0.1,1.01l0.26,0.73l-0.12,0.93l-1.65,-0.49l-2.02,-0.66l-3.19,-0.11Z\\\", \\\"name\\\": \\\"Cameroon\\\"}, \\\"CL\\\": {\\\"path\\\": \\\"M246.8,429.1l-1.14,0.78l-2.25,1.21l-0.16,0.23l-0.37,2.94l-0.75,0.06l-2.72,-1.07l-2.83,-2.34l-3.06,-1.9l-0.71,-1.92l0.67,-1.84l-0.02,-0.25l-1.22,-2.13l-0.31,-5.41l1.02,-2.95l2.59,-2.4l-0.13,-0.51l-3.32,-0.8l2.06,-2.4l0.07,-0.15l0.79,-4.77l2.44,0.95l0.4,-0.22l1.31,-6.31l-0.16,-0.33l-1.68,-0.8l-0.42,0.21l-0.72,3.47l-1.01,-0.27l0.74,-4.06l0.85,-5.46l1.12,-1.96l0.03,-0.22l-0.71,-2.82l-0.19,-2.94l0.76,-0.07l0.26,-0.2l1.53,-4.62l1.73,-4.52l1.07,-4.2l-0.56,-4.2l0.73,-2.2l0.01,-0.12l-0.29,-3.3l1.46,-3.34l0.45,-5.19l0.8,-5.52l0.78,-5.89l-0.18,-4.33l-0.49,-3.47l1.1,-0.56l0.13,-0.13l0.44,-0.88l0.9,1.29l0.32,1.8l0.1,0.18l1.16,0.97l-0.73,2.33l0.01,0.21l1.33,2.91l0.97,3.6l0.35,0.22l1.57,-0.31l0.16,0.34l-0.79,2.51l-2.61,1.25l-0.17,0.28l0.08,4.36l-0.48,0.79l0.01,0.33l0.6,0.84l-1.62,1.55l-1.67,2.6l-0.89,2.47l-0.02,0.13l0.23,2.56l-1.5,2.76l-0.03,0.21l1.15,4.8l0.11,0.17l0.54,0.42l-0.01,2.37l-1.4,2.7l-0.03,0.15l0.06,2.25l-1.8,1.78l-0.09,0.21l0.02,2.73l0.71,2.63l-1.33,0.94l-0.12,0.17l-0.67,2.64l-0.59,3.03l0.4,3.55l-0.84,0.51l-0.14,0.31l0.58,3.5l0.08,0.16l0.96,0.99l-0.7,1.08l0.11,0.43l1.04,0.55l0.19,0.8l-0.89,0.48l-0.16,0.31l0.26,1.77l-0.89,4.06l-1.31,2.67l-0.03,0.19l0.28,1.53l-0.73,1.88l-1.85,1.37l-0.12,0.26l0.22,3.46l0.06,0.16l0.88,1.19l0.28,0.12l1.32,-0.17l-0.04,2.13l0.04,0.15l1.04,1.95l0.24,0.16l5.94,0.44ZM248.79,430.71l0.0,7.41l0.3,0.3l2.67,0.0l1.01,0.06l-0.54,0.91l-1.99,1.01l-1.13,-0.1l-1.42,-0.27l-1.87,-1.06l-2.57,-0.49l-3.09,-1.9l-2.52,-1.83l-2.65,-2.93l0.93,0.32l3.54,2.29l3.32,1.23l0.34,-0.09l1.29,-1.57l0.83,-2.32l2.11,-1.28l1.43,0.32Z\\\", \\\"name\\\": \\\"Chile\\\"}, \\\"CA\\\": {\\\"path\\\": \\\"M280.14,145.66l-1.66,2.88l0.06,0.37l0.37,0.03l1.5,-1.01l1.17,0.49l-0.64,0.83l0.13,0.46l2.22,0.89l0.28,-0.03l1.02,-0.7l2.09,0.83l-0.69,2.1l0.37,0.38l1.43,-0.45l0.27,1.43l0.74,1.88l-0.95,2.5l-0.88,0.09l-1.34,-0.48l0.49,-2.34l-0.14,-0.32l-0.7,-0.4l-0.36,0.04l-2.81,2.66l-0.63,-0.05l1.2,-1.01l-0.1,-0.52l-2.4,-0.77l-2.79,0.18l-4.65,-0.09l-0.22,-0.54l1.37,-0.99l0.01,-0.48l-0.82,-0.65l1.91,-1.79l2.57,-5.17l1.49,-1.81l2.04,-1.07l0.63,0.08l-0.27,0.51l-1.33,2.07ZM193.92,74.85l-0.01,4.24l0.19,0.28l0.33,-0.07l3.14,-3.22l2.65,2.5l-0.71,3.04l0.06,0.26l2.42,2.88l0.46,0.0l2.66,-3.14l1.83,-3.74l0.03,-0.12l0.13,-4.53l3.23,0.31l3.63,0.64l3.18,2.08l0.13,1.91l-1.79,2.22l-0.0,0.37l1.69,2.2l-0.28,1.8l-4.74,2.84l-3.33,0.62l-2.5,-1.21l-0.41,0.17l-0.73,2.05l-2.39,3.44l-0.74,1.78l-2.78,2.61l-3.48,0.26l-0.17,0.07l-1.98,1.68l-0.1,0.21l-0.15,2.33l-2.68,0.45l-0.17,0.09l-3.1,3.2l-2.75,4.38l-0.99,3.06l-0.14,4.31l0.25,0.31l3.5,0.58l1.07,3.24l1.18,2.76l0.34,0.18l3.43,-0.69l4.55,1.52l2.45,1.32l1.76,1.65l0.12,0.07l3.11,0.96l2.63,1.46l0.13,0.04l4.12,0.2l2.41,0.3l-0.36,2.81l0.8,3.51l1.81,3.78l0.08,0.1l3.73,3.17l0.34,0.03l1.93,-1.08l0.13,-0.15l1.35,-3.44l0.01,-0.18l-1.31,-5.38l-0.08,-0.14l-1.46,-1.5l3.68,-1.51l2.84,-2.46l1.45,-2.55l0.04,-0.17l-0.2,-2.39l-0.04,-0.12l-1.7,-3.07l-2.9,-2.64l2.79,-3.66l0.05,-0.27l-1.08,-3.38l-0.8,-5.75l1.45,-0.75l4.18,1.03l2.6,0.38l0.18,-0.03l1.93,-0.95l2.18,1.23l3.01,2.18l0.73,1.42l0.25,0.16l4.18,0.27l-0.06,2.95l0.83,4.7l0.22,0.24l2.19,0.55l1.75,2.08l0.38,0.07l3.63,-2.03l0.11,-0.11l2.38,-4.06l1.36,-1.43l1.76,3.01l3.26,4.68l2.68,4.19l-0.94,2.09l0.12,0.38l3.31,1.98l2.23,1.98l0.13,0.07l3.94,0.89l1.48,1.02l0.96,2.82l0.22,0.2l1.85,0.43l0.88,1.13l0.17,3.53l-1.68,1.16l-1.76,1.14l-4.08,1.17l-0.11,0.06l-3.08,2.65l-4.11,0.52l-5.35,-0.69l-3.76,-0.02l-2.62,0.23l-0.2,0.1l-2.05,2.29l-3.13,1.41l-0.11,0.08l-3.6,4.24l-2.87,2.92l-0.05,0.36l0.33,0.14l2.13,-0.52l0.15,-0.08l3.98,-4.15l5.16,-2.63l3.58,-0.31l1.82,1.3l-2.09,1.91l-0.09,0.29l0.8,3.46l0.82,2.37l0.15,0.17l3.25,1.56l0.16,0.03l4.14,-0.45l0.21,-0.12l2.03,-2.86l0.11,1.46l0.13,0.22l1.26,0.88l-2.7,1.78l-5.51,1.83l-2.52,1.26l-2.75,2.16l-1.52,-0.18l-0.08,-2.16l4.19,-2.47l0.14,-0.34l-0.3,-0.22l-4.01,0.1l-2.66,0.36l-1.45,-1.56l0.0,-4.16l-0.11,-0.23l-1.11,-0.91l-0.28,-0.05l-1.5,0.48l-0.7,-0.7l-0.45,0.02l-1.91,2.39l-0.8,2.5l-0.82,1.31l-0.95,0.43l-0.77,0.15l-0.23,0.2l-0.18,0.56l-8.2,0.02l-0.13,0.03l-1.19,0.61l-2.95,2.45l-0.78,1.13l-4.6,0.01l-0.12,0.02l-1.13,0.48l-0.13,0.44l0.37,0.55l0.2,0.82l-0.01,0.09l-3.1,1.42l-2.63,0.5l-2.84,1.57l-0.47,0.0l-0.72,-0.4l-0.18,-0.27l0.03,-0.15l0.52,-1.0l1.2,-1.71l0.73,-1.8l0.02,-0.17l-1.03,-5.47l-0.15,-0.21l-2.35,-1.32l0.16,-0.29l-0.05,-0.35l-0.37,-0.38l-0.22,-0.09l-0.56,0.0l-0.35,-0.34l-0.11,-0.65l-0.46,-0.2l-0.39,0.26l-0.2,-0.03l-0.11,-0.33l-0.48,-0.25l-0.21,-0.71l-0.15,-0.18l-3.97,-2.07l-4.8,-2.39l-0.25,-0.01l-2.19,0.89l-0.72,0.03l-3.04,-0.82l-0.14,-0.0l-1.94,0.4l-2.4,-0.98l-2.56,-0.51l-1.7,-0.19l-0.62,-0.44l-0.42,-1.67l-0.3,-0.23l-0.85,0.02l-0.29,0.3l-0.01,0.95l-69.26,-0.01l-4.77,-3.14l-1.78,-1.41l-4.51,-1.38l-1.3,-2.73l0.34,-1.96l-0.17,-0.33l-3.06,-1.37l-0.41,-2.58l-0.11,-0.18l-2.92,-2.4l-0.05,-1.53l1.32,-1.59l0.07,-0.2l-0.07,-2.21l-0.16,-0.26l-4.19,-2.22l-2.52,-4.02l-1.56,-2.6l-0.08,-0.09l-2.28,-1.64l-1.65,-1.48l-1.31,-1.89l-0.38,-0.1l-2.51,1.21l-2.28,1.92l-2.03,-2.22l-1.85,-1.71l-2.44,-1.04l-2.28,-0.12l0.03,-37.72l4.27,0.98l4.0,2.13l2.61,0.4l0.24,-0.07l2.17,-1.81l2.92,-1.33l3.63,0.53l0.18,-0.03l3.72,-1.94l3.89,-1.06l1.6,1.72l0.37,0.06l1.87,-1.04l0.14,-0.19l0.48,-1.83l1.37,0.38l4.18,3.96l0.41,0.0l2.89,-2.62l0.28,2.79l0.37,0.26l3.08,-0.73l0.17,-0.12l0.85,-1.16l2.81,0.24l3.83,1.86l5.86,1.61l3.46,0.75l2.44,-0.26l2.89,1.89l-3.12,1.89l-0.14,0.31l0.24,0.24l4.53,0.92l6.84,-0.5l2.04,-0.71l2.54,2.44l0.39,0.02l2.72,-2.16l-0.01,-0.48l-2.26,-1.61l1.27,-1.16l2.94,-0.19l1.94,-0.42l1.89,0.97l2.49,2.32l0.24,0.08l2.71,-0.33l4.35,1.9l0.17,0.02l3.86,-0.67l3.62,0.1l0.31,-0.33l-0.26,-2.44l1.9,-0.65l3.58,1.36l-0.01,3.84l0.23,0.29l0.34,-0.17l1.51,-3.23l1.81,0.1l0.31,-0.22l1.13,-4.37l-0.08,-0.29l-2.68,-2.73l-2.83,-1.76l0.19,-4.73l2.77,-3.15l3.06,0.69l2.44,1.97l3.24,4.88l-2.05,2.02l0.15,0.51l4.41,0.85ZM265.85,150.7l-0.84,0.04l-3.15,-0.99l-1.77,-1.17l0.19,-0.06l3.17,0.79l2.39,1.27l0.01,0.12ZM249.41,3.71l6.68,0.49l5.34,0.79l4.34,1.6l-0.08,1.24l-5.91,2.56l-6.03,1.21l-2.36,1.38l-0.14,0.34l0.29,0.22l4.37,-0.02l-4.96,3.01l-4.06,1.64l-0.11,0.08l-4.21,4.62l-5.07,0.92l-0.12,0.05l-1.53,1.1l-7.5,0.59l-0.28,0.28l0.24,0.31l2.67,0.54l-1.04,0.6l-0.09,0.44l1.89,2.49l-2.11,1.66l-3.83,1.52l-0.15,0.13l-1.14,2.01l-3.41,1.55l-0.16,0.36l0.35,1.19l0.3,0.22l3.98,-0.19l0.03,0.78l-6.42,2.99l-6.44,-1.41l-7.41,0.79l-3.72,-0.62l-4.48,-0.26l-0.25,-2.0l4.37,-1.13l0.21,-0.38l-1.14,-3.55l1.13,-0.28l6.61,2.29l0.35,-0.12l-0.04,-0.37l-3.41,-3.45l-0.14,-0.08l-3.57,-0.92l1.62,-1.7l4.36,-1.3l0.2,-0.18l0.71,-1.94l-0.12,-0.36l-3.45,-2.15l-0.88,-2.43l6.36,0.23l1.94,0.61l0.23,-0.02l3.91,-2.1l0.15,-0.32l-0.26,-0.24l-5.69,-0.67l-8.69,0.37l-4.3,-1.92l-2.12,-2.39l-2.82,-1.68l-0.44,-1.65l3.41,-1.06l2.93,-0.2l4.91,-0.99l3.69,-2.28l2.93,0.31l2.64,1.68l0.42,-0.1l1.84,-3.23l3.17,-0.96l4.45,-0.69l7.56,-0.26l1.26,0.64l0.18,0.03l7.2,-1.06l10.81,0.8ZM203.94,57.59l0.01,0.32l1.97,2.97l0.51,-0.01l2.26,-3.75l6.05,-1.89l4.08,4.72l-0.36,2.95l0.38,0.33l4.95,-1.36l0.11,-0.05l2.23,-1.77l5.37,2.31l3.32,2.14l0.3,1.89l0.36,0.25l4.48,-1.01l2.49,2.8l0.14,0.09l5.99,1.78l2.09,1.74l2.18,3.83l-4.29,1.91l-0.01,0.54l5.9,2.83l3.95,0.94l3.54,3.84l0.2,0.1l3.58,0.25l-0.67,2.51l-4.18,4.54l-2.84,-1.61l-3.91,-3.95l-0.26,-0.09l-3.24,0.52l-0.25,0.26l-0.32,2.37l0.1,0.26l2.63,2.38l3.42,1.89l0.96,1.0l1.57,3.8l-0.74,2.43l-2.85,-0.96l-6.26,-3.15l-0.38,0.09l0.04,0.39l3.54,3.4l2.55,2.31l0.23,0.78l-6.26,-1.43l-5.33,-2.25l-2.73,-1.73l0.67,-0.86l-0.09,-0.45l-7.38,-4.01l-0.44,0.27l0.03,0.89l-6.85,0.61l-1.8,-1.17l1.43,-2.6l4.56,-0.07l5.15,-0.52l0.23,-0.45l-0.76,-1.34l0.8,-1.89l3.21,-4.06l0.05,-0.29l-0.72,-1.95l-0.97,-1.47l-0.11,-0.1l-3.84,-2.1l-4.53,-1.33l1.09,-0.75l0.05,-0.45l-2.65,-2.75l-0.18,-0.09l-2.12,-0.24l-1.91,-1.47l-0.39,0.02l-1.27,1.25l-4.4,0.56l-9.06,-0.99l-5.28,-1.31l-4.01,-0.67l-1.72,-1.31l2.32,-1.85l0.1,-0.33l-0.28,-0.2l-3.3,-0.02l-0.74,-4.36l1.86,-4.09l2.46,-1.88l5.74,-1.15l-1.5,2.55ZM261.28,159.28l0.19,0.14l1.82,0.42l1.66,-0.05l-0.66,0.68l-0.75,0.16l-3.0,-1.25l-0.46,-0.77l0.51,-0.52l0.68,1.19ZM230.87,84.48l-2.48,0.19l-0.52,-1.74l0.96,-2.17l2.03,-0.53l1.71,1.04l0.02,1.6l-0.22,0.46l-1.5,1.16ZM229.52,58.19l0.14,0.82l-4.99,-0.22l-2.73,0.63l-0.59,-0.23l-2.61,-2.4l0.08,-1.38l0.94,-0.25l5.61,0.51l4.14,2.54ZM222.12,105.0l-0.79,1.63l-0.75,-0.22l-0.52,-0.91l0.04,-0.09l0.84,-1.01l0.74,0.06l0.44,0.55ZM183.77,38.22l2.72,1.65l0.16,0.04l4.83,-0.01l1.92,1.52l-0.51,1.75l0.18,0.36l2.84,1.14l1.56,1.19l0.16,0.06l3.37,0.22l3.65,0.42l4.07,-1.1l5.05,-0.43l3.96,0.35l2.53,1.8l0.48,1.79l-1.37,1.16l-3.6,1.03l-3.22,-0.59l-7.17,0.76l-5.1,0.09l-4.0,-0.6l-6.48,-1.56l-0.81,-2.57l-0.3,-2.49l-0.1,-0.19l-2.51,-2.25l-0.16,-0.07l-5.12,-0.63l-2.61,-1.45l0.75,-1.71l4.88,0.32ZM207.46,91.26l0.42,1.62l0.42,0.19l1.12,-0.55l1.35,0.99l2.74,1.39l2.73,1.2l0.2,1.74l0.35,0.26l1.72,-0.29l1.31,0.97l-1.72,0.96l-3.68,-0.9l-1.34,-1.71l-0.43,-0.04l-2.46,2.1l-3.23,1.85l-0.74,-1.98l-0.31,-0.19l-2.47,0.28l1.49,-1.34l0.1,-0.19l0.32,-3.15l0.79,-3.45l1.34,0.25ZM215.59,102.66l-2.73,2.0l-1.49,-0.08l-0.37,-0.7l1.61,-1.56l3.0,0.03l-0.02,0.3ZM202.79,24.07l0.11,0.12l2.54,1.53l-3.01,1.47l-4.55,4.07l-4.3,0.38l-5.07,-0.68l-2.51,-2.09l0.03,-1.72l1.86,-1.4l0.1,-0.34l-0.29,-0.2l-4.49,0.04l-2.63,-1.79l-1.45,-2.36l1.61,-2.38l1.65,-1.69l2.47,-0.4l0.19,-0.48l-0.72,-0.89l5.1,-0.26l3.1,3.05l0.13,0.07l4.21,1.25l3.99,1.06l1.92,3.65ZM187.5,59.3l-0.15,0.1l-2.59,3.4l-2.5,-0.15l-1.47,-3.92l0.04,-2.24l1.22,-1.92l2.34,-1.26l5.11,0.17l4.28,1.06l-3.36,3.86l-2.9,0.9ZM186.19,48.8l-1.15,1.63l-3.42,-0.35l-2.68,-1.15l1.11,-1.88l3.34,-1.27l2.01,1.63l0.79,1.38ZM185.78,35.41l-0.95,0.13l-4.48,-0.33l-0.4,-0.91l4.5,0.07l1.45,0.82l-0.1,0.21ZM180.76,32.56l-3.43,1.03l-1.85,-1.14l-1.01,-1.92l-0.16,-1.87l2.87,0.2l1.39,0.35l2.75,1.75l-0.55,1.6ZM181.03,76.32l-1.21,1.2l-3.19,-1.26l-0.18,-0.01l-1.92,0.45l-2.88,-1.67l1.84,-1.16l1.6,-1.77l2.45,1.17l1.45,0.77l2.05,2.28ZM169.72,54.76l2.83,0.97l0.14,0.01l4.25,-0.58l0.47,1.01l-2.19,2.16l0.07,0.48l3.61,1.95l-0.41,3.84l-3.87,1.68l-2.23,-0.36l-1.73,-1.75l-6.07,-3.53l0.03,-1.01l4.79,0.55l0.3,-0.16l-0.04,-0.34l-2.55,-2.89l2.59,-2.05ZM174.44,40.56l1.49,1.87l0.07,2.48l-1.07,3.52l-3.87,0.48l-2.41,-0.72l0.05,-2.72l-0.33,-0.3l-3.79,0.36l-0.13,-3.31l2.36,0.14l0.15,-0.03l3.7,-1.74l3.44,0.29l0.31,-0.22l0.03,-0.12ZM170.14,31.5l0.75,1.74l-3.52,-0.52l-4.19,-1.77l-4.65,-0.17l1.65,-1.11l-0.05,-0.52l-2.86,-1.26l-0.13,-1.58l4.52,0.7l6.66,1.99l1.84,2.5ZM134.64,58.08l-1.08,1.93l0.34,0.44l5.44,-1.41l3.37,2.32l0.37,-0.02l2.66,-2.28l2.03,1.38l2.01,4.53l0.53,0.04l1.26,-1.93l0.03,-0.27l-1.67,-4.55l1.82,-0.58l2.36,0.73l2.69,1.84l1.53,4.46l0.77,3.24l0.15,0.19l4.22,2.26l4.32,2.04l-0.21,1.51l-3.87,0.34l-0.19,0.5l1.45,1.54l-0.65,1.23l-4.3,-0.65l-4.4,-1.19l-2.97,0.28l-4.67,1.48l-6.31,0.65l-4.27,0.39l-1.26,-1.91l-0.15,-0.12l-3.42,-1.2l-0.16,-0.01l-2.05,0.45l-2.66,-3.02l1.2,-0.34l3.82,-0.76l3.58,0.19l3.27,-0.78l0.23,-0.29l-0.24,-0.29l-4.84,-1.06l-5.42,0.35l-3.4,-0.09l-0.97,-1.22l5.39,-1.7l0.21,-0.33l-0.3,-0.25l-3.82,0.06l-3.95,-1.1l1.88,-3.13l1.68,-1.81l6.54,-2.84l2.11,0.77ZM158.85,56.58l-1.82,2.62l-3.38,-2.9l0.49,-0.39l3.17,-0.18l1.54,0.86ZM149.71,42.7l1.0,1.87l0.37,0.14l2.17,-0.83l2.33,0.2l0.38,2.16l-1.38,2.17l-8.33,0.76l-6.34,2.15l-3.51,0.1l-0.22,-1.13l4.98,-2.12l0.17,-0.34l-0.31,-0.23l-11.27,0.6l-3.04,-0.78l3.14,-4.57l2.2,-1.35l6.87,1.7l4.4,3.0l0.14,0.05l4.37,0.39l0.27,-0.48l-3.41,-4.68l1.96,-1.62l2.28,0.53l0.79,2.32ZM145.44,29.83l-2.18,0.77l-3.79,-0.0l0.02,-0.31l2.34,-1.5l1.2,0.23l2.42,0.83ZM144.83,34.5l-4.44,1.46l-3.18,-1.48l1.6,-1.36l3.51,-0.53l3.1,0.75l-0.6,1.16ZM119.02,65.87l-6.17,2.07l-1.19,-1.82l-0.13,-0.11l-5.48,-2.32l0.92,-1.7l1.73,-3.44l2.16,-3.15l-0.02,-0.36l-2.09,-2.56l7.84,-0.71l3.59,1.02l6.32,0.27l2.35,1.37l2.25,1.71l-2.68,1.04l-6.21,3.41l-3.1,3.28l-0.08,0.21l0.0,1.81ZM129.66,35.4l-0.3,3.55l-1.77,1.67l-2.34,0.27l-4.62,2.2l-3.89,0.76l-2.83,-0.93l3.85,-3.52l5.04,-3.36l3.75,0.07l3.11,-0.7ZM111.24,152.74l-0.82,0.29l-3.92,-1.39l-0.7,-1.06l-0.12,-0.1l-2.15,-1.09l-0.41,-0.84l-0.2,-0.16l-2.44,-0.56l-0.84,-1.56l0.1,-0.36l2.34,0.64l1.53,0.5l2.28,0.34l0.78,1.04l1.24,1.55l0.09,0.08l2.42,1.3l0.81,1.39ZM88.54,134.82l0.14,0.02l2.0,-0.23l-0.67,3.48l0.06,0.24l1.78,2.22l-0.24,-0.0l-1.4,-1.42l-0.91,-1.53l-1.26,-1.08l-0.42,-1.35l0.09,-0.66l0.82,0.31Z\\\", \\\"name\\\": \\\"Canada\\\"}, \\\"CG\\\": {\\\"path\\\": \\\"M453.66,296.61l-0.9,-0.82l-0.35,-0.04l-0.83,0.48l-0.77,0.83l-1.65,-2.13l1.66,-1.2l0.08,-0.39l-0.81,-1.43l0.59,-0.43l1.62,-0.29l0.24,-0.24l0.1,-0.58l0.94,0.84l0.19,0.08l2.21,0.11l0.27,-0.14l0.81,-1.29l0.32,-1.76l-0.27,-1.96l-0.06,-0.15l-1.08,-1.35l1.02,-2.74l-0.09,-0.34l-0.62,-0.5l-0.22,-0.06l-1.66,0.18l-0.55,-1.03l0.12,-0.73l2.85,0.09l1.98,0.65l2.0,0.59l0.38,-0.25l0.17,-1.3l1.26,-2.24l1.34,-1.19l1.54,0.38l1.35,0.12l-0.11,1.15l-0.74,1.34l-0.5,1.61l-0.31,2.22l0.12,1.41l-0.4,0.9l-0.06,0.88l-0.24,0.67l-1.57,1.15l-1.24,1.41l-1.09,2.43l-0.03,0.13l0.08,1.95l-0.55,0.69l-1.46,1.23l-1.32,1.41l-0.61,-0.29l-0.13,-0.57l-0.29,-0.23l-1.36,-0.02l-0.23,0.1l-0.72,0.81l-0.41,-0.16Z\\\", \\\"name\\\": \\\"Republic of the Congo\\\"}, \\\"CF\\\": {\\\"path\\\": \\\"M459.41,266.56l1.9,-0.17l0.22,-0.12l0.36,-0.5l0.14,0.02l0.55,0.51l0.29,0.07l3.15,-0.96l0.12,-0.07l1.05,-0.97l1.29,-0.87l0.12,-0.33l-0.17,-0.61l0.38,-0.12l2.36,0.15l0.15,-0.03l2.36,-1.17l0.12,-0.1l1.78,-2.72l1.18,-0.96l1.23,-0.34l0.21,0.79l0.07,0.13l1.37,1.5l0.01,0.86l-0.39,1.0l-0.01,0.17l0.16,0.78l0.1,0.17l0.91,0.76l1.89,1.09l1.24,0.92l0.02,0.67l0.12,0.23l1.67,1.3l0.99,1.03l0.61,1.46l0.14,0.15l1.79,0.95l0.2,0.4l-0.44,0.14l-1.54,-0.06l-1.98,-0.26l-0.93,0.22l-0.19,0.14l-0.3,0.48l-0.57,0.05l-0.91,-0.49l-0.26,-0.01l-2.7,1.21l-1.04,-0.23l-0.21,0.03l-0.34,0.19l-0.12,0.13l-0.64,1.3l-1.67,-0.43l-1.77,-0.24l-1.58,-0.91l-2.06,-0.85l-0.27,0.02l-1.42,0.88l-0.97,1.27l-0.06,0.14l-0.19,1.46l-1.3,-0.11l-1.67,-0.42l-0.27,0.07l-1.55,1.41l-0.99,1.76l-0.14,-1.18l-0.13,-0.22l-1.1,-0.78l-0.86,-1.2l-0.2,-0.84l-0.07,-0.13l-1.07,-1.19l0.16,-0.59l0.0,-0.15l-0.24,-1.01l0.18,-1.77l0.5,-0.38l0.09,-0.11l1.18,-2.4Z\\\", \\\"name\\\": \\\"Central African Republic\\\"}, \\\"CD\\\": {\\\"path\\\": \\\"M497.85,276.25l-0.14,2.77l0.2,0.3l0.57,0.19l-0.47,0.52l-1.0,0.71l-0.96,1.31l-0.56,1.22l-0.16,2.04l-0.54,0.89l-0.04,0.15l-0.02,1.76l-0.63,0.61l-0.09,0.2l-0.08,1.33l-0.2,0.11l-0.15,0.21l-0.23,1.37l0.03,0.2l0.6,1.08l0.16,2.96l0.44,2.29l-0.24,1.25l0.01,0.15l0.5,1.46l0.07,0.12l1.41,1.37l1.09,2.56l-0.51,-0.11l-3.45,0.45l-0.67,0.3l-0.15,0.15l-0.71,1.61l0.01,0.26l0.52,1.03l-0.43,2.9l-0.31,2.55l0.13,0.29l0.7,0.46l1.75,0.99l0.31,-0.01l0.26,-0.17l0.15,1.9l-1.44,-0.02l-0.94,-1.28l-0.94,-1.1l-0.17,-0.1l-1.76,-0.33l-0.5,-1.18l-0.42,-0.15l-1.44,0.75l-1.79,-0.32l-0.77,-1.05l-0.2,-0.12l-1.59,-0.23l-0.97,0.04l-0.1,-0.53l-0.27,-0.25l-0.86,-0.06l-1.13,-0.15l-1.62,0.37l-1.04,-0.06l-0.32,0.09l0.11,-2.56l-0.08,-0.21l-0.77,-0.87l-0.17,-1.41l0.36,-1.47l-0.03,-0.21l-0.48,-0.91l-0.04,-1.52l-0.3,-0.29l-2.65,0.02l0.13,-0.53l-0.29,-0.37l-1.28,0.01l-0.28,0.21l-0.07,0.24l-1.35,0.09l-0.26,0.18l-0.62,1.45l-0.25,0.42l-1.17,-0.3l-0.19,0.01l-0.79,0.34l-1.44,0.18l-1.41,-1.96l-0.7,-1.47l-0.61,-1.86l-0.28,-0.21l-7.39,-0.03l-0.92,0.3l-0.78,-0.03l-0.78,0.25l-0.11,-0.25l0.35,-0.15l0.18,-0.26l0.07,-1.02l0.33,-0.52l0.72,-0.42l0.52,0.2l0.33,-0.08l0.76,-0.86l0.99,0.02l0.11,0.48l0.16,0.2l0.94,0.44l0.35,-0.07l1.46,-1.56l1.44,-1.21l0.68,-0.85l0.06,-0.2l-0.08,-1.99l1.04,-2.33l1.1,-1.23l1.62,-1.19l0.11,-0.14l0.29,-0.8l0.08,-0.94l0.38,-0.82l0.03,-0.16l-0.13,-1.38l0.3,-2.16l0.47,-1.51l0.73,-1.31l0.04,-0.12l0.15,-1.51l0.21,-1.66l0.89,-1.16l1.16,-0.7l1.9,0.79l1.69,0.95l1.81,0.24l1.85,0.48l0.35,-0.16l0.71,-1.43l0.16,-0.09l1.03,0.23l0.19,-0.02l2.65,-1.19l0.86,0.46l0.17,0.03l0.81,-0.08l0.23,-0.14l0.31,-0.5l0.75,-0.17l1.83,0.26l1.64,0.06l0.72,-0.21l1.39,1.9l0.16,0.11l1.12,0.3l0.24,-0.04l0.58,-0.36l1.05,0.15l0.15,-0.02l1.15,-0.44l0.47,0.84l0.08,0.09l2.08,1.57Z\\\", \\\"name\\\": \\\"Democratic Republic of the Congo\\\"}, \\\"CZ\\\": {\\\"path\\\": \\\"M463.29,152.22l-0.88,-0.47l-0.18,-0.03l-1.08,0.15l-1.86,-0.94l-0.21,-0.02l-0.88,0.24l-0.13,0.07l-1.25,1.17l-1.63,-0.91l-1.38,-1.36l-1.22,-0.75l-0.24,-1.24l-0.33,-0.75l1.53,-0.6l0.98,-0.84l1.74,-0.62l0.11,-0.07l0.47,-0.47l0.46,0.27l0.24,0.03l0.96,-0.3l1.06,0.95l0.15,0.07l1.57,0.24l-0.1,0.6l0.16,0.32l1.36,0.68l0.41,-0.15l0.28,-0.62l1.29,0.28l0.19,0.84l0.26,0.23l1.73,0.18l0.74,1.02l-0.17,0.0l-0.25,0.13l-0.32,0.49l-0.46,0.11l-0.22,0.23l-0.13,0.57l-0.32,0.1l-0.2,0.22l-0.03,0.14l-0.65,0.25l-1.05,-0.05l-0.28,0.17l-0.22,0.43Z\\\", \\\"name\\\": \\\"Czech Republic\\\"}, \\\"CY\\\": {\\\"path\\\": \\\"M505.03,193.75l-1.51,0.68l-1.0,-0.3l-0.32,-0.63l0.69,-0.06l0.41,0.13l0.19,-0.0l0.62,-0.22l0.31,0.02l0.06,0.22l0.49,0.17l0.06,-0.01Z\\\", \\\"name\\\": \\\"Cyprus\\\"}, \\\"CR\\\": {\\\"path\\\": \\\"M213.0,263.84l-0.98,-0.4l-0.3,-0.31l0.16,-0.24l0.05,-0.21l-0.09,-0.56l-0.1,-0.18l-0.76,-0.65l-0.99,-0.5l-0.74,-0.28l-0.13,-0.58l-0.12,-0.18l-0.66,-0.45l-0.34,-0.0l-0.13,0.31l0.13,0.59l-0.17,0.21l-0.34,-0.42l-0.14,-0.1l-0.7,-0.22l-0.23,-0.34l0.01,-0.62l0.31,-0.74l-0.14,-0.38l-0.3,-0.15l0.47,-0.4l1.48,0.6l0.26,-0.02l0.47,-0.27l0.58,0.15l0.35,0.44l0.17,0.11l0.74,0.17l0.27,-0.07l0.3,-0.27l0.52,1.09l0.97,1.02l0.77,0.71l-0.41,0.1l-0.23,0.3l0.01,1.02l0.12,0.24l0.2,0.14l-0.07,0.05l-0.11,0.3l0.08,0.37l-0.23,0.63Z\\\", \\\"name\\\": \\\"Costa Rica\\\"}, \\\"CU\\\": {\\\"path\\\": \\\"M215.01,226.09l2.08,0.18l1.94,0.03l2.24,0.86l0.95,0.92l0.25,0.08l2.22,-0.28l0.79,0.55l3.68,2.81l0.19,0.06l0.77,-0.03l1.18,0.42l-0.12,0.47l0.27,0.37l1.78,0.1l1.59,0.9l-0.11,0.22l-1.5,0.3l-1.64,0.13l-1.75,-0.2l-2.69,0.19l1.0,-0.86l-0.03,-0.48l-1.02,-0.68l-0.13,-0.05l-1.52,-0.16l-0.74,-0.64l-0.57,-1.42l-0.3,-0.19l-1.36,0.1l-2.23,-0.67l-0.71,-0.52l-0.14,-0.06l-3.2,-0.4l-0.42,-0.25l0.56,-0.39l0.12,-0.33l-0.27,-0.22l-2.46,-0.13l-0.2,0.06l-1.72,1.31l-0.94,0.03l-0.25,0.15l-0.29,0.53l-1.04,0.24l-0.29,-0.07l0.7,-0.43l0.1,-0.11l0.5,-0.87l1.04,-0.54l1.23,-0.49l1.86,-0.25l0.62,-0.28Z\\\", \\\"name\\\": \\\"Cuba\\\"}, \\\"SZ\\\": {\\\"path\\\": \\\"M500.95,353.41l-0.41,0.97l-1.16,0.23l-1.29,-1.26l-0.02,-0.71l0.63,-0.93l0.23,-0.7l0.47,-0.12l1.04,0.4l0.32,1.05l0.2,1.08Z\\\", \\\"name\\\": \\\"Swaziland\\\"}, \\\"SY\\\": {\\\"path\\\": \\\"M510.84,199.83l0.09,-0.11l0.07,-0.2l-0.04,-1.08l0.56,-1.4l1.3,-1.01l0.1,-0.34l-0.41,-1.11l-0.24,-0.19l-0.89,-0.11l-0.2,-1.84l0.55,-1.05l1.3,-1.22l0.09,-0.19l0.09,-1.09l0.39,0.27l0.25,0.04l2.66,-0.77l1.35,0.52l2.06,-0.01l2.93,-1.08l1.35,0.04l2.14,-0.34l-0.83,1.16l-1.31,0.68l-0.16,0.3l0.23,2.03l-0.9,3.25l-5.43,2.87l-4.79,2.91l-2.32,-0.92Z\\\", \\\"name\\\": \\\"Syria\\\"}, \\\"KG\\\": {\\\"path\\\": \\\"M599.04,172.15l0.38,-0.9l1.43,-0.37l4.04,1.02l0.37,-0.23l0.36,-1.64l1.17,-0.52l3.45,1.24l0.2,-0.0l0.86,-0.31l4.09,0.08l3.61,0.31l1.18,1.02l0.11,0.06l1.19,0.34l-0.13,0.26l-3.84,1.58l-0.13,0.1l-0.81,1.08l-3.08,0.34l-0.24,0.16l-0.85,1.7l-2.43,-0.37l-0.14,0.01l-1.79,0.61l-2.39,1.4l-0.12,0.39l0.25,0.49l-0.48,0.45l-4.57,0.43l-3.04,-0.94l-2.45,0.18l0.14,-1.02l2.42,0.44l0.27,-0.08l0.81,-0.81l1.76,0.27l0.21,-0.05l3.21,-2.14l-0.03,-0.51l-2.97,-1.57l-0.26,-0.01l-1.64,0.69l-1.38,-0.84l1.81,-1.67l-0.09,-0.5l-0.46,-0.18Z\\\", \\\"name\\\": \\\"Kyrgyzstan\\\"}, \\\"KE\\\": {\\\"path\\\": \\\"M523.3,287.04l0.06,0.17l1.29,1.8l-1.46,0.84l-0.11,0.11l-0.55,0.93l-0.81,0.16l-0.24,0.24l-0.34,1.69l-0.81,1.06l-0.46,1.58l-0.76,0.63l-3.3,-2.3l-0.16,-1.32l-0.15,-0.23l-9.35,-5.28l-0.02,-2.4l1.92,-2.63l0.91,-1.83l0.01,-0.24l-1.09,-2.86l-0.29,-1.24l-1.09,-1.63l2.93,-2.85l0.92,0.3l0.0,1.19l0.09,0.22l0.86,0.83l0.21,0.08l1.65,0.0l3.09,2.08l0.16,0.05l0.79,0.03l0.54,-0.06l0.58,0.28l1.67,0.2l0.28,-0.12l0.69,-0.98l2.04,-0.94l0.86,0.73l0.19,0.07l1.1,0.0l-1.82,2.36l-0.06,0.18l0.03,9.12Z\\\", \\\"name\\\": \\\"Kenya\\\"}, \\\"SS\\\": {\\\"path\\\": \\\"M505.7,261.39l0.02,1.64l-0.27,0.55l-1.15,0.05l-0.24,0.15l-0.85,1.44l0.22,0.45l1.44,0.17l1.15,1.12l0.42,0.95l0.14,0.15l1.06,0.54l1.33,2.45l-3.06,2.98l-1.44,1.08l-1.75,0.01l-1.92,0.56l-1.5,-0.53l-0.27,0.03l-0.85,0.57l-1.98,-1.5l-0.56,-1.02l-0.37,-0.13l-1.32,0.5l-1.08,-0.15l-0.2,0.04l-0.56,0.35l-0.9,-0.24l-1.44,-1.97l-0.39,-0.77l-0.13,-0.13l-1.78,-0.94l-0.65,-1.5l-1.08,-1.12l-1.57,-1.22l-0.02,-0.68l-0.12,-0.23l-1.37,-1.02l-1.17,-0.68l0.2,-0.08l0.86,-0.48l0.14,-0.18l0.63,-2.22l0.6,-1.02l1.47,-0.28l0.35,0.56l1.29,1.48l0.14,0.09l0.69,0.22l0.22,-0.02l0.83,-0.4l1.58,0.08l0.26,0.39l0.25,0.13l2.49,0.0l0.3,-0.25l0.06,-0.35l1.13,-0.42l0.18,-0.18l0.22,-0.63l0.68,-0.38l1.95,1.37l0.23,0.05l1.29,-0.26l0.19,-0.12l1.23,-1.8l1.36,-1.37l0.08,-0.25l-0.21,-1.52l-0.06,-0.15l-0.25,-0.3l0.94,-0.08l0.26,-0.21l0.1,-0.32l0.6,0.09l-0.25,1.67l0.3,1.83l0.11,0.19l1.22,0.94l0.25,0.73l-0.04,1.2l0.26,0.31l0.09,0.01Z\\\", \\\"name\\\": \\\"South Sudan\\\"}, \\\"SR\\\": {\\\"path\\\": \\\"M278.1,270.26l2.71,0.45l0.31,-0.14l0.19,-0.32l1.82,-0.16l2.25,0.56l-1.09,1.81l-0.04,0.19l0.2,1.72l0.05,0.13l0.9,1.35l-0.39,0.99l-0.21,1.09l-0.48,0.8l-1.2,-0.44l-0.17,-0.01l-1.12,0.24l-0.95,-0.21l-0.35,0.2l-0.25,0.73l0.05,0.29l0.3,0.35l-0.06,0.13l-1.01,-0.15l-1.42,-2.03l-0.32,-1.36l-0.29,-0.23l-0.63,-0.0l-0.95,-1.56l0.41,-1.16l0.01,-0.17l-0.08,-0.35l1.29,-0.56l0.18,-0.22l0.35,-1.97Z\\\", \\\"name\\\": \\\"Suriname\\\"}, \\\"KH\\\": {\\\"path\\\": \\\"M680.28,257.89l-0.93,-1.2l-1.24,-2.56l-0.56,-2.9l1.45,-1.92l3.07,-0.46l2.26,0.35l2.03,0.98l0.38,-0.11l1.0,-1.55l1.86,0.79l0.52,1.51l-0.28,2.82l-4.05,1.88l-0.12,0.45l0.79,1.1l-2.2,0.17l-2.08,0.98l-1.89,-0.33Z\\\", \\\"name\\\": \\\"Cambodia\\\"}, \\\"SV\\\": {\\\"path\\\": \\\"M197.02,248.89l0.18,-0.05l0.59,0.17l0.55,0.51l0.64,0.35l0.06,0.22l0.37,0.21l1.01,-0.28l0.38,0.13l0.16,0.13l-0.14,0.81l-0.18,0.38l-1.22,-0.03l-0.84,-0.23l-1.11,-0.52l-1.31,-0.15l-0.49,-0.38l0.02,-0.08l0.76,-0.57l0.46,-0.27l0.11,-0.35Z\\\", \\\"name\\\": \\\"El Salvador\\\"}, \\\"SK\\\": {\\\"path\\\": \\\"M468.01,150.02l0.05,0.07l0.36,0.1l0.85,-0.37l1.12,1.02l0.33,0.05l1.38,-0.65l1.07,0.3l0.16,0.0l1.69,-0.43l1.95,1.02l-0.51,0.64l-0.45,1.2l-0.32,0.2l-2.55,-0.93l-0.17,-0.01l-0.82,0.2l-0.17,0.11l-0.53,0.68l-0.94,0.32l-0.14,-0.11l-0.29,-0.04l-1.18,0.48l-0.95,0.09l-0.26,0.21l-0.15,0.47l-1.84,0.34l-0.82,-0.31l-1.14,-0.73l-0.2,-0.89l0.42,-0.84l0.91,0.05l0.12,-0.02l0.86,-0.33l0.18,-0.21l0.03,-0.13l0.32,-0.1l0.2,-0.22l0.12,-0.55l0.39,-0.1l0.18,-0.13l0.3,-0.45l0.43,-0.0Z\\\", \\\"name\\\": \\\"Slovakia\\\"}, \\\"KR\\\": {\\\"path\\\": \\\"M737.31,185.72l0.84,0.08l0.27,-0.12l0.89,-1.2l1.63,-0.13l1.1,-0.2l0.21,-0.16l0.12,-0.24l1.86,2.95l0.59,1.79l0.02,3.17l-0.84,1.38l-2.23,0.55l-1.95,1.14l-1.91,0.21l-0.22,-1.21l0.45,-2.07l-0.01,-0.17l-0.99,-2.67l1.54,-0.4l0.17,-0.46l-1.55,-2.24Z\\\", \\\"name\\\": \\\"South Korea\\\"}, \\\"SI\\\": {\\\"path\\\": \\\"M455.77,159.59l1.79,0.21l0.18,-0.04l1.2,-0.68l2.12,-0.08l0.21,-0.1l0.38,-0.42l0.1,0.01l0.28,0.62l-1.71,0.71l-0.18,0.22l-0.21,1.1l-0.71,0.26l-0.2,0.28l0.01,0.55l-0.59,-0.04l-0.79,-0.47l-0.38,0.06l-0.36,0.41l-0.84,-0.05l0.05,-0.15l-0.56,-1.24l0.21,-1.17Z\\\", \\\"name\\\": \\\"Slovenia\\\"}, \\\"KP\\\": {\\\"path\\\": \\\"M747.76,172.02l-0.23,-0.04l-0.26,0.08l-1.09,1.02l-0.78,1.06l-0.06,0.19l0.09,1.95l-1.12,0.57l-0.53,0.58l-0.88,0.82l-1.69,0.51l-1.09,0.79l-0.12,0.22l-0.07,1.17l-0.22,0.25l0.09,0.47l0.96,0.46l1.22,1.1l-0.19,0.37l-0.91,0.16l-1.75,0.14l-0.22,0.12l-0.87,1.18l-0.95,-0.09l-0.3,0.18l-0.97,-0.44l-0.39,0.13l-0.25,0.44l-0.29,0.09l-0.03,-0.2l-0.18,-0.23l-0.62,-0.25l-0.43,-0.29l0.52,-0.97l0.52,-0.3l0.13,-0.38l-0.18,-0.42l0.59,-1.47l0.01,-0.21l-0.16,-0.48l-0.22,-0.2l-1.41,-0.31l-0.82,-0.55l1.74,-1.62l2.73,-1.58l1.62,-1.96l0.96,0.76l0.17,0.06l2.17,0.11l0.31,-0.37l-0.32,-1.31l3.61,-1.21l0.16,-0.13l0.79,-1.34l1.25,1.38Z\\\", \\\"name\\\": \\\"North Korea\\\"}, \\\"SO\\\": {\\\"path\\\": \\\"M543.8,256.48l0.61,-0.05l1.14,-0.37l1.31,-0.25l0.12,-0.05l1.11,-0.81l0.57,-0.0l0.03,0.39l-0.23,1.49l0.01,1.25l-0.52,0.92l-0.7,2.71l-1.19,2.79l-1.54,3.2l-2.13,3.66l-2.12,2.79l-2.92,3.39l-2.47,2.0l-3.76,2.5l-2.33,1.9l-2.77,3.06l-0.61,1.35l-0.28,0.29l-1.22,-1.69l-0.03,-8.92l2.12,-2.76l0.59,-0.68l1.47,-0.04l0.18,-0.06l2.15,-1.71l3.16,-0.11l0.21,-0.09l7.08,-7.55l1.76,-2.12l1.14,-1.57l0.06,-0.18l0.01,-4.67Z\\\", \\\"name\\\": \\\"Somalia\\\"}, \\\"SN\\\": {\\\"path\\\": \\\"M379.28,250.34l-0.95,-1.82l-0.09,-0.1l-0.83,-0.6l0.62,-0.28l0.13,-0.11l1.21,-1.8l0.6,-1.31l0.71,-0.68l1.09,0.2l0.18,-0.02l1.17,-0.53l1.25,-0.03l1.17,0.73l1.59,0.65l1.47,1.83l1.59,1.7l0.12,1.56l0.49,1.46l0.1,0.14l0.85,0.65l0.18,0.82l-0.08,0.57l-0.13,0.05l-1.29,-0.19l-0.29,0.13l-0.11,0.16l-0.35,0.04l-1.83,-0.61l-5.84,-0.13l-0.12,0.02l-0.6,0.26l-0.87,-0.06l-1.01,0.32l-0.26,-1.26l1.9,0.04l0.16,-0.04l0.54,-0.32l0.37,-0.02l0.15,-0.05l0.78,-0.5l0.92,0.46l0.12,0.03l1.09,0.04l0.15,-0.03l1.08,-0.57l0.11,-0.44l-0.51,-0.74l-0.39,-0.1l-0.76,0.39l-0.62,-0.01l-0.92,-0.58l-0.18,-0.05l-0.79,0.04l-0.2,0.09l-0.48,0.51l-2.41,0.06Z\\\", \\\"name\\\": \\\"Senegal\\\"}, \\\"SL\\\": {\\\"path\\\": \\\"M392.19,267.53l-0.44,-0.12l-1.73,-0.97l-1.24,-1.28l-0.4,-0.84l-0.27,-1.65l1.21,-1.0l0.09,-0.12l0.27,-0.66l0.32,-0.41l0.56,-0.05l0.16,-0.07l0.5,-0.41l1.75,0.0l0.59,0.77l0.49,0.96l-0.07,0.64l0.04,0.19l0.36,0.58l-0.03,0.84l0.24,0.2l-0.64,0.65l-1.13,1.37l-0.06,0.14l-0.12,0.66l-0.43,0.58Z\\\", \\\"name\\\": \\\"Sierra Leone\\\"}, \\\"SB\\\": {\\\"path\\\": \\\"M826.74,311.51l0.23,0.29l-0.95,-0.01l-0.39,-0.63l0.65,0.27l0.45,0.09ZM825.01,308.52l-1.18,-1.39l-0.37,-1.06l0.24,0.0l0.82,1.84l0.49,0.6ZM823.21,309.42l-0.44,0.03l-1.43,-0.24l-0.32,-0.24l0.08,-0.5l1.29,0.31l0.72,0.47l0.11,0.18ZM817.9,303.81l2.59,1.44l0.3,0.41l-1.21,-0.66l-1.34,-0.89l-0.34,-0.3ZM813.77,302.4l0.48,0.34l0.1,0.08l-0.33,-0.17l-0.25,-0.25Z\\\", \\\"name\\\": \\\"Solomon Islands\\\"}, \\\"SA\\\": {\\\"path\\\": \\\"M528.24,243.1l-0.2,-0.69l-0.07,-0.12l-0.69,-0.71l-0.18,-0.94l-0.12,-0.19l-1.24,-0.89l-1.28,-2.09l-0.7,-2.08l-0.07,-0.11l-1.73,-1.79l-0.11,-0.07l-1.03,-0.39l-1.57,-2.36l-0.27,-1.72l0.1,-1.53l-0.03,-0.15l-1.44,-2.93l-1.25,-1.13l-1.34,-0.56l-0.72,-1.33l0.11,-0.49l-0.02,-0.2l-0.7,-1.38l-0.08,-0.1l-0.68,-0.56l-0.97,-1.98l-2.8,-4.03l-0.25,-0.13l-0.85,0.01l0.29,-1.11l0.12,-0.97l0.23,-0.81l2.52,0.39l0.23,-0.06l1.08,-0.84l0.6,-0.95l1.78,-0.35l0.22,-0.17l0.37,-0.83l0.74,-0.42l0.08,-0.46l-2.17,-2.4l4.55,-1.26l0.12,-0.06l0.36,-0.32l2.83,0.71l3.67,1.91l7.04,5.5l0.17,0.06l4.64,0.22l2.06,0.24l0.55,1.15l0.28,0.17l1.56,-0.06l0.9,2.15l0.14,0.15l1.14,0.57l0.39,0.85l0.11,0.13l1.59,1.06l0.12,0.91l-0.23,0.83l0.01,0.18l0.32,0.9l0.07,0.11l0.68,0.7l0.33,0.86l0.37,0.65l0.09,0.1l0.76,0.53l0.25,0.04l0.45,-0.12l0.35,0.75l0.1,0.63l0.96,2.68l0.23,0.19l7.53,1.33l0.27,-0.09l0.24,-0.26l0.87,1.41l-1.58,4.96l-7.34,2.54l-7.28,1.02l-2.34,1.17l-0.12,0.1l-1.74,2.63l-0.86,0.32l-0.49,-0.68l-0.28,-0.12l-0.92,0.12l-2.32,-0.25l-0.41,-0.23l-0.15,-0.04l-2.89,0.06l-0.63,0.2l-0.91,-0.59l-0.43,0.11l-0.66,1.27l-0.03,0.21l0.21,0.89l-0.6,0.45Z\\\", \\\"name\\\": \\\"Saudi Arabia\\\"}, \\\"SE\\\": {\\\"path\\\": \\\"M476.42,90.44l-0.15,0.1l-2.43,2.86l-0.07,0.24l0.36,2.31l-3.84,3.1l-4.83,3.38l-0.11,0.15l-1.82,5.45l0.03,0.26l1.78,2.68l2.27,1.99l-2.13,3.88l-2.49,0.82l-0.2,0.24l-0.95,6.05l-1.32,3.09l-2.82,-0.32l-0.3,0.16l-1.34,2.64l-2.48,0.14l-0.76,-3.15l-2.09,-4.04l-1.85,-5.01l1.03,-1.98l2.06,-2.53l0.06,-0.13l0.83,-4.45l-0.06,-0.25l-1.54,-1.86l-0.15,-5.0l1.52,-3.48l2.28,0.06l0.27,-0.16l0.87,-1.59l-0.01,-0.31l-0.8,-1.21l3.79,-5.63l4.07,-7.54l2.23,0.01l0.29,-0.22l0.59,-2.15l4.46,0.66l0.34,-0.26l0.34,-2.64l1.21,-0.14l3.24,2.08l3.78,2.85l0.06,6.37l0.03,0.14l0.67,1.29l-3.95,1.07Z\\\", \\\"name\\\": \\\"Sweden\\\"}, \\\"SD\\\": {\\\"path\\\": \\\"M505.98,259.75l-0.31,-0.9l-0.1,-0.14l-1.2,-0.93l-0.27,-1.66l0.29,-1.83l-0.25,-0.34l-1.16,-0.17l-0.33,0.21l-0.11,0.37l-1.3,0.11l-0.21,0.49l0.55,0.68l0.18,1.29l-1.31,1.33l-1.18,1.72l-1.04,0.21l-2.0,-1.4l-0.32,-0.02l-0.95,0.52l-0.14,0.16l-0.21,0.6l-1.16,0.43l-0.19,0.23l-0.04,0.27l-2.08,0.0l-0.25,-0.39l-0.24,-0.13l-1.81,-0.09l-0.14,0.03l-0.8,0.38l-0.49,-0.16l-1.22,-1.39l-0.42,-0.67l-0.31,-0.14l-1.81,0.35l-0.2,0.14l-0.72,1.24l-0.61,2.14l-0.73,0.4l-0.62,0.22l-0.83,-0.68l-0.12,-0.6l0.38,-0.97l0.01,-1.14l-0.08,-0.2l-1.39,-1.53l-0.25,-0.97l0.03,-0.57l-0.11,-0.25l-0.81,-0.66l-0.03,-1.34l-0.04,-0.14l-0.52,-0.98l-0.31,-0.15l-0.42,0.07l0.12,-0.44l0.63,-1.03l0.03,-0.23l-0.24,-0.88l0.69,-0.66l0.02,-0.41l-0.4,-0.46l0.58,-1.39l1.04,-1.71l1.97,0.16l0.32,-0.3l-0.12,-10.24l0.02,-0.8l2.59,-0.01l0.3,-0.3l0.0,-4.92l29.19,0.0l0.68,2.17l-0.4,0.35l-0.1,0.27l0.36,2.69l0.93,3.15l0.12,0.16l2.05,1.4l-0.99,1.15l-1.75,0.4l-0.15,0.08l-0.79,0.79l-0.08,0.17l-0.24,1.69l-1.07,3.75l-0.0,0.16l0.25,0.96l-0.38,2.1l-0.98,2.41l-1.52,1.3l-1.07,1.94l-0.25,0.99l-1.08,0.64l-0.13,0.18l-0.46,1.65Z\\\", \\\"name\\\": \\\"Sudan\\\"}, \\\"DO\\\": {\\\"path\\\": \\\"M241.7,234.97l0.15,-0.22l1.73,0.01l1.43,0.64l0.15,0.03l0.45,-0.04l0.36,0.74l0.28,0.17l1.02,-0.04l-0.04,0.43l0.27,0.33l1.03,0.09l0.91,0.7l-0.57,0.64l-0.99,-0.47l-0.16,-0.03l-1.11,0.11l-0.79,-0.12l-0.26,0.09l-0.38,0.4l-0.66,0.11l-0.28,-0.45l-0.38,-0.12l-0.83,0.37l-0.14,0.13l-0.85,1.49l-0.27,-0.17l-0.1,-0.58l0.05,-0.67l-0.07,-0.21l-0.44,-0.53l0.35,-0.25l0.12,-0.19l0.19,-1.0l-0.2,-1.4Z\\\", \\\"name\\\": \\\"Dominican Republic\\\"}, \\\"DJ\\\": {\\\"path\\\": \\\"M528.78,253.36l0.34,0.45l-0.06,0.76l-1.26,0.54l-0.05,0.53l0.82,0.53l-0.57,0.83l-0.3,-0.25l-0.27,-0.05l-0.56,0.17l-1.07,-0.03l-0.04,-0.56l-0.16,-0.56l0.76,-1.07l0.76,-0.97l0.89,0.18l0.25,-0.06l0.51,-0.42Z\\\", \\\"name\\\": \\\"Djibouti\\\"}, \\\"DK\\\": {\\\"path\\\": \\\"M452.4,129.07l-1.27,2.39l-2.25,-1.69l-0.26,-1.08l3.15,-1.0l0.63,1.39ZM447.87,126.25l-0.35,0.76l-0.47,-0.24l-0.38,0.09l-1.8,2.53l-0.03,0.29l0.56,1.4l-1.22,0.4l-1.68,-0.41l-0.92,-1.76l-0.07,-3.47l0.38,-0.88l0.62,-0.93l2.07,-0.21l0.19,-0.1l0.84,-0.95l1.5,-0.76l-0.06,1.26l-0.7,1.1l-0.03,0.25l0.3,1.0l0.18,0.19l1.06,0.42Z\\\", \\\"name\\\": \\\"Denmark\\\"}, \\\"DE\\\": {\\\"path\\\": \\\"M445.51,131.69l0.03,0.94l0.21,0.28l2.32,0.74l-0.02,1.0l0.37,0.3l2.55,-0.65l1.36,-0.89l2.63,1.27l1.09,1.01l0.51,1.51l-0.6,0.78l-0.0,0.36l0.88,1.17l0.58,1.68l-0.18,1.08l0.03,0.18l0.87,1.81l-0.66,0.2l-0.55,-0.32l-0.36,0.05l-0.58,0.58l-1.73,0.62l-0.99,0.84l-1.77,0.7l-0.16,0.4l0.42,0.94l0.26,1.34l0.14,0.2l1.25,0.76l1.22,1.2l-0.71,1.2l-0.81,0.37l-0.17,0.32l0.34,1.99l-0.04,0.09l-0.47,-0.39l-0.17,-0.07l-1.2,-0.1l-1.85,0.57l-2.15,-0.13l-0.29,0.18l-0.21,0.5l-0.96,-0.67l-0.24,-0.05l-0.67,0.16l-2.6,-0.94l-0.34,0.1l-0.42,0.57l-1.64,-0.02l0.26,-1.88l1.24,-2.15l-0.21,-0.45l-3.54,-0.58l-0.98,-0.71l0.12,-1.26l-0.05,-0.2l-0.44,-0.64l0.27,-2.18l-0.38,-3.14l1.17,-0.0l0.27,-0.17l0.63,-1.26l0.65,-3.17l-0.02,-0.17l-0.41,-1.0l0.32,-0.47l1.77,-0.16l0.37,0.6l0.47,0.06l1.7,-1.69l0.06,-0.33l-0.55,-1.24l-0.09,-1.51l1.5,0.36l0.16,-0.01l1.22,-0.4Z\\\", \\\"name\\\": \\\"Germany\\\"}, \\\"YE\\\": {\\\"path\\\": \\\"M553.53,242.65l-1.51,0.58l-0.17,0.16l-0.48,1.14l-0.07,0.79l-2.31,1.0l-3.98,1.19l-2.28,1.8l-0.97,0.12l-0.7,-0.14l-0.23,0.05l-1.42,1.03l-1.51,0.47l-2.07,0.13l-0.68,0.15l-0.17,0.1l-0.49,0.6l-0.57,0.16l-0.18,0.13l-0.3,0.49l-1.06,-0.05l-0.13,0.02l-0.73,0.32l-1.48,-0.11l-0.55,-1.26l0.07,-1.32l-0.04,-0.16l-0.39,-0.72l-0.48,-1.85l-0.52,-0.79l0.08,-0.02l0.22,-0.36l-0.23,-1.05l0.24,-0.39l0.04,-0.19l-0.09,-0.95l0.96,-0.72l0.11,-0.31l-0.23,-0.98l0.46,-0.88l0.75,0.49l0.26,0.03l0.63,-0.22l2.76,-0.06l0.5,0.25l2.42,0.26l0.85,-0.11l0.52,0.71l0.35,0.1l1.17,-0.43l0.15,-0.12l1.75,-2.64l2.22,-1.11l6.95,-0.96l2.55,5.58Z\\\", \\\"name\\\": \\\"Yemen\\\"}, \\\"AT\\\": {\\\"path\\\": \\\"M463.17,154.15l-0.14,0.99l-1.15,0.01l-0.24,0.47l0.39,0.56l-0.75,1.84l-0.36,0.4l-2.06,0.07l-0.14,0.04l-1.18,0.67l-1.96,-0.23l-3.43,-0.78l-0.5,-0.97l-0.33,-0.16l-2.47,0.55l-0.2,0.16l-0.18,0.37l-1.27,-0.38l-1.28,-0.09l-0.81,-0.41l0.25,-0.51l0.03,-0.18l-0.05,-0.28l0.35,-0.08l1.16,0.81l0.45,-0.13l0.27,-0.64l2.0,0.12l1.84,-0.57l1.05,0.09l0.71,0.59l0.47,-0.11l0.23,-0.54l0.02,-0.17l-0.32,-1.85l0.69,-0.31l0.13,-0.12l0.73,-1.23l1.61,0.89l0.35,-0.04l1.35,-1.27l0.7,-0.19l1.84,0.93l0.18,0.03l1.08,-0.15l0.81,0.43l-0.07,0.15l-0.02,0.2l0.24,1.06Z\\\", \\\"name\\\": \\\"Austria\\\"}, \\\"DZ\\\": {\\\"path\\\": \\\"M450.58,224.94l-8.31,4.86l-7.23,5.12l-3.46,1.13l-2.42,0.22l-0.02,-1.33l-0.2,-0.28l-1.15,-0.42l-1.45,-0.69l-0.55,-1.13l-0.1,-0.12l-8.45,-5.72l-17.72,-12.17l0.03,-0.38l-0.02,-3.21l3.84,-1.91l2.46,-0.41l2.1,-0.75l0.14,-0.11l0.9,-1.3l2.84,-1.06l0.19,-0.27l0.09,-1.81l1.21,-0.2l0.15,-0.07l1.06,-0.96l3.19,-0.46l0.23,-0.18l0.46,-1.08l-0.08,-0.34l-0.6,-0.54l-0.83,-2.85l-0.18,-1.8l-0.82,-1.57l2.13,-1.37l2.65,-0.49l0.13,-0.05l1.55,-1.15l2.34,-0.85l4.2,-0.51l4.07,-0.23l1.21,0.41l0.23,-0.01l2.3,-1.11l2.52,-0.02l0.94,0.62l0.2,0.05l1.25,-0.13l-0.36,1.03l-0.01,0.14l0.39,2.66l-0.56,2.2l-1.49,1.52l-0.08,0.24l0.22,2.12l0.11,0.2l1.94,1.58l0.02,0.54l0.12,0.23l1.45,1.06l1.04,4.85l0.81,2.42l0.13,1.19l-0.43,2.17l0.17,1.28l-0.31,1.53l0.2,1.56l-0.9,1.02l-0.01,0.38l1.43,1.88l0.09,1.06l0.04,0.13l0.89,1.48l0.37,0.12l1.03,-0.43l1.79,1.12l0.89,1.34Z\\\", \\\"name\\\": \\\"Algeria\\\"}, \\\"US\\\": {\\\"path\\\": \\\"M892.64,99.05l1.16,0.57l0.21,0.02l1.45,-0.38l1.92,0.99l2.17,0.47l-1.65,0.72l-1.75,-0.79l-0.93,-0.7l-0.21,-0.06l-2.11,0.22l-0.35,-0.2l0.09,-0.87ZM183.29,150.37l0.39,1.54l0.12,0.17l0.78,0.55l0.14,0.05l1.74,0.2l2.52,0.5l2.4,0.98l0.17,0.02l1.96,-0.4l3.01,0.81l0.91,-0.02l2.22,-0.88l4.67,2.33l3.86,2.01l0.21,0.71l0.15,0.18l0.33,0.17l-0.02,0.05l0.23,0.43l0.67,0.1l0.21,-0.05l0.1,-0.07l0.05,0.29l0.09,0.16l0.5,0.5l0.21,0.09l0.56,0.0l0.13,0.13l-0.2,0.36l0.12,0.41l2.49,1.39l0.99,5.24l-0.69,1.68l-1.16,1.64l-0.6,1.18l-0.06,0.31l0.04,0.22l0.28,0.43l0.11,0.1l0.85,0.47l0.15,0.04l0.63,0.0l0.14,-0.04l2.87,-1.58l2.6,-0.49l3.28,-1.5l0.17,-0.23l0.04,-0.43l-0.23,-0.93l-0.24,-0.39l0.74,-0.32l4.7,-0.01l0.25,-0.13l0.77,-1.15l2.9,-2.41l1.04,-0.52l8.35,-0.02l0.28,-0.21l0.2,-0.6l0.7,-0.14l1.06,-0.48l0.13,-0.11l0.92,-1.49l0.75,-2.39l1.67,-2.08l0.59,0.6l0.3,0.07l1.52,-0.49l0.88,0.72l-0.0,4.14l0.08,0.2l1.6,1.72l0.31,0.72l-2.42,1.35l-2.55,1.05l-2.64,0.9l-0.14,0.11l-1.33,1.81l-0.44,0.7l-0.05,0.15l-0.03,1.6l0.03,0.14l0.83,1.59l0.24,0.16l0.78,0.06l-1.15,0.33l-1.25,-0.04l-1.83,0.52l-2.51,0.29l-2.17,0.88l-0.17,0.36l0.33,0.22l3.55,-0.54l0.15,0.11l-2.87,0.73l-1.19,0.0l-0.16,-0.33l-0.36,0.06l-0.76,0.82l0.17,0.5l0.42,0.08l-0.45,1.75l-1.4,1.74l-0.04,-0.17l-0.21,-0.22l-0.48,-0.13l-0.77,-0.69l-0.36,-0.03l-0.12,0.34l0.52,1.58l0.09,0.14l0.52,0.43l0.03,0.87l-0.74,1.05l-0.39,0.63l0.05,-0.12l-0.08,-0.34l-1.19,-1.03l-0.28,-2.31l-0.26,-0.26l-0.32,0.19l-0.48,1.27l-0.01,0.19l0.39,1.33l-1.14,-0.31l-0.36,0.18l0.14,0.38l1.57,0.85l0.1,2.58l0.22,0.28l0.55,0.15l0.21,0.81l0.33,2.72l-1.46,1.94l-2.5,0.81l-0.12,0.07l-1.58,1.58l-1.15,0.17l-0.15,0.06l-1.27,1.03l-0.09,0.13l-0.32,0.85l-2.71,1.79l-1.45,1.37l-1.18,1.64l-0.05,0.12l-0.39,1.96l0.0,0.13l0.44,1.91l0.85,2.37l1.1,1.91l0.03,1.2l1.16,3.07l-0.08,1.74l-0.1,0.99l-0.57,1.48l-0.54,0.24l-0.97,-0.26l-0.34,-1.02l-0.12,-0.16l-0.89,-0.58l-2.44,-4.28l-0.34,-0.94l0.49,-1.71l-0.02,-0.21l-0.7,-1.5l-2.0,-2.35l-0.11,-0.08l-0.98,-0.42l-0.25,0.01l-2.42,1.19l-0.26,-0.08l-1.26,-1.29l-1.57,-0.68l-0.16,-0.02l-2.79,0.34l-2.18,-0.3l-1.98,0.19l-1.12,0.45l-0.14,0.44l0.4,0.65l-0.04,1.02l0.09,0.22l0.29,0.3l-0.06,0.05l-0.77,-0.33l-0.26,0.01l-0.87,0.48l-1.64,-0.08l-1.79,-1.39l-0.23,-0.06l-2.11,0.33l-1.75,-0.61l-0.14,-0.01l-1.61,0.2l-2.11,0.64l-0.11,0.06l-2.25,1.99l-2.53,1.21l-1.43,1.38l-0.58,1.22l-0.03,0.12l-0.03,1.86l0.13,1.32l0.3,0.62l-0.46,0.04l-1.71,-0.57l-1.85,-0.79l-0.63,-1.14l-0.54,-1.85l-0.07,-0.12l-1.45,-1.51l-0.86,-1.58l-1.26,-1.87l-0.09,-0.09l-1.76,-1.09l-0.17,-0.04l-2.05,0.05l-0.23,0.12l-1.44,1.97l-1.84,-0.72l-1.19,-0.76l-0.6,-1.45l-0.9,-1.52l-1.49,-1.21l-1.27,-0.87l-0.89,-0.96l-0.22,-0.1l-4.34,-0.0l-0.3,0.3l-0.0,0.84l-6.62,0.02l-5.66,-1.93l-3.48,-1.24l0.11,-0.25l-0.3,-0.42l-3.18,0.3l-2.6,0.2l-0.35,-1.19l-0.08,-0.13l-1.62,-1.61l-0.13,-0.08l-1.02,-0.29l-0.22,-0.66l-0.25,-0.2l-1.31,-0.13l-0.82,-0.7l-0.16,-0.07l-2.25,-0.27l-0.48,-0.34l-0.28,-1.44l-0.07,-0.14l-2.41,-2.84l-2.03,-3.89l0.08,-0.58l-0.1,-0.27l-1.08,-0.94l-1.87,-2.36l-0.33,-2.31l-0.07,-0.15l-1.24,-1.5l0.52,-2.4l-0.09,-2.57l-0.78,-2.3l0.96,-2.83l0.61,-5.66l-0.46,-4.26l-0.79,-2.71l-0.68,-1.4l0.13,-0.26l3.24,0.97l1.28,2.88l0.52,0.06l0.62,-0.84l0.06,-0.22l-0.4,-2.61l-0.74,-2.29l68.9,-0.0l0.3,-0.3l0.01,-0.95l0.32,-0.01ZM32.5,67.43l1.75,1.99l0.41,0.04l1.02,-0.81l3.79,0.25l-0.1,0.72l0.24,0.34l3.83,0.77l2.6,-0.44l5.21,1.41l4.84,0.43l1.9,0.57l0.15,0.01l3.25,-0.71l3.72,1.32l2.52,0.58l-0.03,38.14l0.29,0.3l2.41,0.11l2.34,1.0l1.7,1.59l2.22,2.42l0.42,0.03l2.41,-2.04l2.25,-1.08l1.23,1.76l1.71,1.53l2.24,1.62l1.54,2.56l2.56,4.09l0.11,0.11l4.1,2.17l0.06,1.93l-1.12,1.35l-1.22,-1.14l-2.08,-1.05l-0.68,-2.94l-0.09,-0.16l-3.18,-2.84l-1.32,-3.35l-0.25,-0.19l-2.43,-0.24l-3.93,-0.09l-2.85,-1.02l-5.24,-3.85l-6.77,-2.04l-3.52,0.3l-4.84,-1.7l-2.96,-1.6l-0.23,-0.02l-2.78,0.8l-0.21,0.35l0.46,2.31l-1.11,0.19l-2.9,0.78l-2.24,1.26l-2.42,0.68l-0.29,-1.79l1.07,-3.49l2.54,-1.11l0.12,-0.45l-0.69,-0.96l-0.41,-0.07l-3.19,2.12l-1.76,2.54l-3.57,2.62l-0.03,0.46l1.63,1.59l-2.14,2.38l-2.64,1.49l-2.49,1.09l-0.16,0.17l-0.58,1.48l-3.8,1.79l-0.14,0.14l-0.75,1.57l-2.75,1.41l-1.62,-0.25l-0.16,0.02l-2.35,0.98l-2.54,1.19l-2.06,1.15l-4.05,0.93l-0.1,-0.15l2.45,-1.45l2.49,-1.1l2.61,-1.88l3.03,-0.39l0.19,-0.1l1.2,-1.41l3.43,-2.11l0.61,-0.75l1.81,-1.24l0.13,-0.2l0.42,-2.7l1.24,-2.12l-0.03,-0.35l-0.34,-0.09l-2.73,1.05l-0.67,-0.53l-0.39,0.02l-1.13,1.11l-1.43,-1.62l-0.49,0.06l-0.41,0.8l-0.67,-1.31l-0.42,-0.12l-2.43,1.43l-1.18,-0.0l-0.18,-1.86l0.43,-1.3l-0.09,-0.33l-1.61,-1.33l-0.26,-0.06l-3.11,0.68l-2.0,-1.66l-1.61,-0.85l-0.01,-1.97l-0.11,-0.23l-1.76,-1.48l0.86,-1.96l2.01,-2.13l0.88,-1.94l1.79,-0.25l1.65,0.6l0.31,-0.06l1.91,-1.8l1.67,0.31l0.22,-0.04l1.91,-1.23l0.13,-0.33l-0.47,-1.82l-0.15,-0.19l-1.0,-0.52l1.51,-1.27l0.09,-0.34l-0.29,-0.19l-1.62,0.06l-2.66,0.88l-0.13,0.09l-0.62,0.72l-1.77,-0.8l-0.16,-0.02l-3.48,0.44l-3.5,-0.92l-1.06,-1.61l-2.78,-2.09l3.07,-1.51l5.52,-2.01l1.65,0.0l-0.28,1.73l0.31,0.35l5.29,-0.16l0.23,-0.49l-2.03,-2.59l-0.1,-0.08l-3.03,-1.58l-1.79,-2.12l-2.4,-1.83l-3.18,-1.27l1.13,-1.84l4.28,-0.14l0.15,-0.05l3.16,-2.0l0.13,-0.17l0.57,-2.07l2.43,-2.02l2.42,-0.52l4.67,-1.98l2.22,0.29l0.2,-0.04l3.74,-2.37l3.57,0.91ZM37.66,123.49l-2.31,1.26l-1.04,-0.75l-0.31,-1.35l2.06,-1.16l1.24,-0.51l1.48,0.22l0.76,0.81l-1.89,1.49ZM30.89,233.84l1.2,0.57l0.35,0.3l0.48,0.69l-1.6,0.86l-0.3,0.31l-0.24,-0.14l0.05,-0.54l-0.02,-0.15l-0.36,-0.83l0.05,-0.12l0.39,-0.38l0.07,-0.31l-0.09,-0.27ZM29.06,231.89l0.5,0.14l0.31,0.19l-0.46,0.1l-0.34,-0.43ZM25.02,230.13l0.2,-0.11l0.4,0.47l-0.43,-0.05l-0.17,-0.31ZM21.29,228.68l0.1,-0.07l0.22,0.02l0.02,0.21l-0.02,0.02l-0.32,-0.18ZM6.0,113.33l-1.19,0.45l-1.5,-0.64l-0.94,-0.63l1.76,-0.46l1.71,0.29l0.16,0.98Z\\\", \\\"name\\\": \\\"United States of America\\\"}, \\\"LV\\\": {\\\"path\\\": \\\"M473.99,127.16l0.07,-2.15l1.15,-2.11l2.05,-1.07l1.84,2.48l0.25,0.12l2.01,-0.07l0.29,-0.25l0.45,-2.58l1.85,-0.56l0.98,0.4l2.13,1.33l0.16,0.05l1.97,0.01l1.02,0.7l0.21,1.67l0.71,1.84l-2.44,1.23l-1.36,0.53l-2.28,-1.62l-0.12,-0.05l-1.18,-0.2l-0.28,-0.6l-0.31,-0.17l-2.43,0.35l-4.17,-0.23l-0.12,0.02l-2.45,0.93Z\\\", \\\"name\\\": \\\"Latvia\\\"}, \\\"UY\\\": {\\\"path\\\": \\\"M276.9,363.17l1.3,-0.23l2.4,2.04l0.22,0.07l0.82,-0.07l2.48,1.7l1.93,1.5l1.28,1.67l-0.95,1.14l-0.04,0.31l0.63,1.45l-0.96,1.57l-2.65,1.47l-1.73,-0.53l-0.15,-0.01l-1.25,0.28l-2.22,-1.16l-0.16,-0.03l-1.56,0.08l-1.33,-1.36l0.17,-1.58l0.48,-0.55l0.07,-0.2l-0.02,-2.74l0.66,-2.8l0.57,-2.02Z\\\", \\\"name\\\": \\\"Uruguay\\\"}, \\\"LB\\\": {\\\"path\\\": \\\"M510.44,198.11l-0.48,0.03l-0.26,0.17l-0.15,0.32l-0.21,-0.0l0.72,-1.85l1.19,-1.9l0.74,0.09l0.27,0.73l-1.19,0.93l-0.09,0.13l-0.54,1.36Z\\\", \\\"name\\\": \\\"Lebanon\\\"}, \\\"LA\\\": {\\\"path\\\": \\\"M684.87,248.8l0.61,-0.86l0.05,-0.16l0.11,-2.17l-0.08,-0.22l-1.96,-2.16l-0.15,-2.44l-0.08,-0.18l-1.9,-2.1l-0.19,-0.1l-1.89,-0.18l-0.29,0.15l-0.42,0.76l-1.21,0.06l-0.67,-0.41l-0.31,-0.0l-2.2,1.29l-0.05,-1.77l0.61,-2.7l-0.27,-0.37l-1.44,-0.1l-0.12,-1.31l-0.12,-0.21l-0.87,-0.65l0.38,-0.68l1.76,-1.41l0.08,0.22l0.27,0.2l1.33,0.07l0.31,-0.34l-0.35,-2.75l0.85,-0.25l1.32,1.88l1.11,2.36l0.27,0.17l2.89,0.02l0.78,1.82l-1.32,0.56l-0.12,0.09l-0.72,0.93l0.1,0.45l2.93,1.52l3.62,5.27l1.88,1.78l0.58,1.67l-0.38,2.11l-1.87,-0.79l-0.37,0.11l-0.99,1.54l-1.51,-0.73Z\\\", \\\"name\\\": \\\"Laos\\\"}, \\\"TW\\\": {\\\"path\\\": \\\"M725.6,222.5l-1.5,4.22l-0.82,1.65l-1.01,-1.7l-0.26,-1.8l1.4,-2.48l1.8,-1.81l0.76,0.53l-0.38,1.39Z\\\", \\\"name\\\": \\\"Taiwan\\\"}, \\\"TT\\\": {\\\"path\\\": \\\"M266.35,259.46l0.41,-0.39l0.09,-0.23l-0.04,-0.75l1.14,-0.26l0.2,0.03l-0.07,1.37l-1.73,0.23Z\\\", \\\"name\\\": \\\"Trinidad and Tobago\\\"}, \\\"TR\\\": {\\\"path\\\": \\\"M513.25,175.38l3.63,1.17l0.14,0.01l2.88,-0.45l2.11,0.26l0.18,-0.03l2.9,-1.53l2.51,-0.13l2.25,1.37l0.36,0.88l-0.23,1.36l0.19,0.33l1.81,0.72l0.61,0.53l-1.31,0.64l-0.16,0.34l0.76,3.24l-0.44,0.8l0.01,0.3l1.19,2.02l-0.71,0.29l-0.74,-0.62l-0.15,-0.07l-2.91,-0.37l-0.15,0.02l-1.04,0.43l-2.78,0.44l-1.44,-0.03l-2.83,1.06l-1.95,0.01l-1.28,-0.52l-0.2,-0.01l-2.62,0.76l-0.7,-0.48l-0.47,0.22l-0.13,1.49l-1.01,0.94l-0.58,-0.82l0.79,-0.9l0.04,-0.34l-0.31,-0.15l-1.46,0.23l-2.03,-0.64l-0.3,0.07l-1.65,1.58l-3.58,0.3l-1.94,-1.47l-0.17,-0.06l-2.7,-0.1l-0.28,0.17l-0.51,1.06l-1.47,0.29l-2.32,-1.46l-0.17,-0.05l-2.55,0.05l-1.4,-2.7l-1.72,-1.54l1.11,-2.06l-0.07,-0.37l-1.35,-1.19l2.47,-2.51l3.74,-0.11l0.26,-0.17l0.96,-2.07l4.56,0.38l0.19,-0.05l2.97,-1.92l2.84,-0.83l4.03,-0.06l4.31,2.08ZM488.85,176.8l-1.81,1.38l-0.57,-1.01l0.02,-0.36l0.45,-0.25l0.13,-0.15l0.78,-1.87l-0.11,-0.37l-0.72,-0.47l1.91,-0.71l1.89,0.35l0.25,0.97l0.17,0.2l1.87,0.83l-0.19,0.31l-2.82,0.16l-0.18,0.07l-1.06,0.91Z\\\", \\\"name\\\": \\\"Turkey\\\"}, \\\"LK\\\": {\\\"path\\\": \\\"M625.44,266.07l-0.35,2.4l-0.9,0.61l-1.91,0.5l-1.04,-1.75l-0.43,-3.5l1.0,-3.6l1.34,1.09l1.13,1.72l1.16,2.52Z\\\", \\\"name\\\": \\\"Sri Lanka\\\"}, \\\"TN\\\": {\\\"path\\\": \\\"M444.91,206.18l-0.99,-4.57l-0.12,-0.18l-1.43,-1.04l-0.02,-0.53l-0.11,-0.22l-1.95,-1.59l-0.19,-1.85l1.44,-1.47l0.08,-0.14l0.59,-2.34l-0.38,-2.77l0.44,-1.28l2.52,-1.08l1.41,0.28l-0.06,1.2l0.43,0.28l1.81,-0.9l0.02,0.06l-1.14,1.28l-0.08,0.2l-0.02,1.32l0.11,0.24l0.74,0.6l-0.29,2.18l-1.56,1.35l-0.09,0.32l0.48,1.54l0.28,0.21l1.11,0.04l0.55,1.17l0.15,0.14l0.76,0.35l-0.12,1.79l-1.1,0.72l-0.8,0.91l-1.68,1.04l-0.13,0.32l0.25,1.08l-0.18,0.96l-0.74,0.39Z\\\", \\\"name\\\": \\\"Tunisia\\\"}, \\\"TL\\\": {\\\"path\\\": \\\"M734.21,307.22l0.17,-0.34l1.99,-0.52l1.72,-0.08l0.78,-0.3l0.29,0.1l-0.43,0.32l-2.57,1.09l-1.71,0.59l-0.05,-0.49l-0.19,-0.36Z\\\", \\\"name\\\": \\\"East Timor\\\"}, \\\"TM\\\": {\\\"path\\\": \\\"M553.16,173.51l-0.12,1.0l-0.26,-0.65l0.38,-0.34ZM553.54,173.16l0.13,-0.12l0.43,-0.09l-0.56,0.21ZM555.68,172.6l0.65,-0.14l1.53,0.76l1.71,2.29l0.27,0.12l1.27,-0.14l2.81,-0.04l0.29,-0.38l-0.35,-1.27l1.98,-0.97l1.96,-1.63l3.05,1.44l0.25,2.23l0.14,0.22l0.96,0.61l0.18,0.05l2.61,-0.13l0.68,0.44l1.2,2.97l0.1,0.13l2.85,2.03l1.67,1.41l2.66,1.45l3.13,1.17l-0.05,1.23l-0.36,-0.04l-1.12,-0.73l-0.44,0.14l-0.34,0.89l-1.96,0.52l-0.22,0.23l-0.47,2.17l-1.26,0.78l-1.93,0.42l-0.21,0.18l-0.46,1.14l-1.64,0.33l-2.3,-0.97l-0.2,-2.23l-0.28,-0.27l-1.76,-0.1l-2.78,-2.48l-0.15,-0.07l-1.95,-0.31l-2.82,-1.48l-1.78,-0.27l-0.18,0.03l-1.03,0.51l-1.6,-0.08l-0.22,0.08l-1.72,1.6l-1.83,0.46l-0.39,-1.7l0.36,-3.0l-0.16,-0.3l-1.73,-0.88l0.57,-1.77l-0.25,-0.39l-1.33,-0.14l0.41,-1.85l2.05,0.63l0.21,-0.01l2.2,-0.95l0.09,-0.49l-1.78,-1.75l-0.69,-1.66l-0.07,-0.03Z\\\", \\\"name\\\": \\\"Turkmenistan\\\"}, \\\"TJ\\\": {\\\"path\\\": \\\"M597.99,178.71l-0.23,0.23l-2.57,-0.47l-0.35,0.25l-0.24,1.7l0.32,0.34l2.66,-0.22l3.15,0.95l4.47,-0.42l0.58,2.45l0.39,0.21l0.71,-0.25l1.22,0.53l-0.06,1.01l0.29,1.28l-2.19,-0.0l-1.71,-0.21l-0.23,0.07l-1.51,1.25l-1.05,0.27l-0.77,0.51l-0.71,-0.67l0.22,-2.28l-0.24,-0.32l-0.43,-0.08l0.17,-0.57l-0.16,-0.36l-1.36,-0.66l-0.34,0.05l-1.08,1.01l-0.09,0.15l-0.25,1.09l-0.24,0.26l-1.36,-0.05l-0.27,0.14l-0.65,1.06l-0.58,-0.39l-0.3,-0.02l-1.68,0.86l-0.36,-0.16l1.28,-2.65l0.02,-0.2l-0.54,-2.17l-0.18,-0.21l-1.53,-0.58l0.41,-0.82l1.89,0.13l0.26,-0.12l1.19,-1.63l0.77,-1.82l2.66,-0.55l-0.33,0.87l0.01,0.23l0.36,0.82l0.3,0.18l0.23,-0.02Z\\\", \\\"name\\\": \\\"Tajikistan\\\"}, \\\"LS\\\": {\\\"path\\\": \\\"M493.32,359.69l0.69,0.65l-0.65,1.12l-0.38,0.8l-1.27,0.39l-0.18,0.15l-0.4,0.77l-0.59,0.18l-1.59,-1.78l1.16,-1.5l1.3,-1.02l0.97,-0.46l0.94,0.72Z\\\", \\\"name\\\": \\\"Lesotho\\\"}, \\\"TH\\\": {\\\"path\\\": \\\"M677.42,253.68l-1.7,-0.88l-0.14,-0.03l-1.77,0.04l0.3,-1.64l-0.3,-0.35l-2.21,0.01l-0.3,0.28l-0.2,2.76l-2.15,5.9l-0.02,0.13l0.17,1.83l0.28,0.27l1.45,0.07l0.93,2.1l0.44,2.15l0.08,0.15l1.4,1.44l0.16,0.09l1.43,0.27l1.04,1.05l-0.58,0.73l-1.24,0.22l-0.15,-0.99l-0.15,-0.22l-2.04,-1.1l-0.36,0.06l-0.23,0.23l-0.72,-0.71l-0.41,-1.18l-0.06,-0.11l-1.33,-1.42l-1.22,-1.2l-0.5,0.13l-0.15,0.54l-0.14,-0.41l0.26,-1.48l0.73,-2.38l1.2,-2.57l1.37,-2.35l0.02,-0.27l-0.95,-2.26l0.03,-1.19l-0.29,-1.42l-0.06,-0.13l-1.65,-2.0l-0.46,-0.99l0.62,-0.34l0.13,-0.15l0.92,-2.23l-0.02,-0.27l-1.05,-1.74l-1.57,-1.86l-1.04,-1.96l0.76,-0.34l0.16,-0.16l1.07,-2.63l1.58,-0.1l0.16,-0.06l1.43,-1.11l1.24,-0.52l0.84,0.62l0.13,1.43l0.28,0.27l1.34,0.09l-0.54,2.39l0.05,2.39l0.45,0.25l2.48,-1.45l0.6,0.36l0.17,0.04l1.47,-0.07l0.25,-0.15l0.41,-0.73l1.58,0.15l1.76,1.93l0.15,2.44l0.08,0.18l1.94,2.15l-0.1,1.96l-0.66,0.93l-2.25,-0.34l-3.24,0.49l-0.19,0.12l-1.6,2.12l-0.06,0.24l0.48,2.46Z\\\", \\\"name\\\": \\\"Thailand\\\"}, \\\"TF\\\": {\\\"path\\\": \\\"M593.76,417.73l1.38,0.84l2.15,0.37l0.04,0.31l-0.59,1.24l-3.36,0.19l-0.05,-1.38l0.43,-1.56Z\\\", \\\"name\\\": \\\"French Southern and Antarctic Lands\\\"}, \\\"TG\\\": {\\\"path\\\": \\\"M425.23,269.29l-1.49,0.4l-0.43,-0.68l-0.64,-1.54l-0.18,-1.16l0.54,-2.21l-0.04,-0.24l-0.59,-0.86l-0.23,-1.9l0.0,-1.82l-0.07,-0.19l-0.95,-1.19l0.1,-0.41l1.58,0.04l-0.23,0.97l0.08,0.28l1.55,1.55l0.09,1.13l0.08,0.19l0.42,0.43l-0.11,5.66l0.52,1.53Z\\\", \\\"name\\\": \\\"Togo\\\"}, \\\"TD\\\": {\\\"path\\\": \\\"M457.57,252.46l0.23,-1.08l-0.28,-0.36l-1.32,-0.05l0.0,-1.35l-0.1,-0.22l-0.9,-0.82l0.99,-3.1l3.12,-2.37l0.12,-0.23l0.13,-3.33l0.95,-5.2l0.53,-1.09l-0.07,-0.36l-0.94,-0.81l-0.03,-0.7l-0.12,-0.23l-0.84,-0.61l-0.57,-3.76l2.21,-1.26l19.67,9.88l0.12,9.74l-1.83,-0.15l-0.28,0.14l-1.14,1.89l-0.68,1.62l0.05,0.31l0.33,0.38l-0.61,0.58l-0.08,0.3l0.25,0.93l-0.58,0.95l-0.29,1.01l0.34,0.37l0.67,-0.11l0.39,0.73l0.03,1.4l0.11,0.23l0.8,0.65l-0.01,0.24l-1.38,0.37l-0.11,0.06l-1.27,1.03l-1.83,2.76l-2.21,1.1l-2.34,-0.15l-0.82,0.25l-0.2,0.37l0.19,0.68l-1.16,0.79l-1.01,0.94l-2.92,0.89l-0.5,-0.46l-0.17,-0.08l-0.41,-0.05l-0.28,0.12l-0.38,0.54l-1.36,0.12l0.1,-0.18l0.01,-0.27l-0.78,-1.72l-0.35,-1.03l-0.17,-0.18l-1.03,-0.41l-1.29,-1.28l0.36,-0.78l0.9,0.2l0.14,-0.0l0.67,-0.17l1.36,0.02l0.26,-0.45l-1.32,-2.22l0.09,-1.64l-0.17,-1.68l-0.04,-0.13l-0.93,-1.53Z\\\", \\\"name\\\": \\\"Chad\\\"}, \\\"LY\\\": {\\\"path\\\": \\\"M457.99,226.38l-1.57,0.87l-1.25,-1.28l-0.13,-0.08l-3.85,-1.11l-1.04,-1.57l-0.09,-0.09l-1.98,-1.23l-0.27,-0.02l-0.93,0.39l-0.72,-1.2l-0.09,-1.07l-0.06,-0.16l-1.33,-1.75l0.83,-0.94l0.07,-0.24l-0.21,-1.64l0.31,-1.43l-0.17,-1.29l0.43,-2.26l-0.15,-1.33l-0.73,-2.18l0.99,-0.52l0.16,-0.21l0.22,-1.16l-0.22,-1.06l1.54,-0.95l0.81,-0.92l1.19,-0.78l0.14,-0.23l0.12,-1.76l2.57,0.84l0.16,0.01l0.99,-0.23l2.01,0.45l3.19,1.2l1.12,2.36l0.2,0.16l2.24,0.53l3.5,1.14l2.65,1.36l0.29,-0.01l1.22,-0.71l1.27,-1.32l0.07,-0.29l-0.55,-2.0l0.69,-1.19l1.7,-1.23l1.61,-0.35l3.2,0.54l0.78,1.14l0.24,0.13l0.85,0.01l0.84,0.47l2.35,0.31l0.42,0.63l-0.79,1.16l-0.04,0.26l0.35,1.08l-0.61,1.6l-0.0,0.2l0.73,2.16l0.0,24.24l-2.58,0.01l-0.3,0.29l-0.02,0.62l-19.55,-9.83l-0.28,0.01l-2.53,1.44Z\\\", \\\"name\\\": \\\"Libya\\\"}, \\\"AE\\\": {\\\"path\\\": \\\"M550.59,223.8l0.12,0.08l1.92,-0.41l3.54,0.15l0.23,-0.09l1.71,-1.79l1.86,-1.7l1.31,-1.36l0.26,0.5l0.28,1.72l-0.93,0.01l-0.3,0.26l-0.21,1.73l0.11,0.27l0.08,0.06l-0.7,0.32l-0.17,0.27l-0.01,0.99l-0.68,1.02l-0.05,0.15l-0.06,0.96l-0.32,0.36l-7.19,-1.27l-0.79,-2.22Z\\\", \\\"name\\\": \\\"United Arab Emirates\\\"}, \\\"VE\\\": {\\\"path\\\": \\\"M240.66,256.5l0.65,0.91l-0.03,1.13l-1.05,1.39l-0.03,0.31l0.95,2.0l0.32,0.17l1.08,-0.16l0.24,-0.21l0.56,-1.83l-0.06,-0.29l-0.71,-0.81l-0.1,-1.58l2.9,-0.96l0.19,-0.37l-0.29,-1.02l0.45,-0.41l0.72,1.43l0.26,0.16l1.65,0.04l1.46,1.27l0.08,0.72l0.3,0.27l2.28,0.02l2.55,-0.25l1.34,1.06l0.14,0.06l1.92,0.31l0.2,-0.03l1.4,-0.79l0.15,-0.25l0.02,-0.36l2.82,-0.14l1.17,-0.01l-0.41,0.14l-0.14,0.46l0.86,1.19l0.22,0.12l1.93,0.18l1.73,1.13l0.37,1.9l0.31,0.24l1.21,-0.05l0.52,0.32l-1.63,1.21l-0.11,0.17l-0.22,0.92l0.07,0.27l0.63,0.69l-0.31,0.24l-1.48,0.39l-0.22,0.3l0.04,1.03l-0.59,0.6l-0.01,0.41l1.67,1.87l0.23,0.48l-0.72,0.76l-2.71,0.91l-1.78,0.39l-0.13,0.06l-0.6,0.49l-1.84,-0.58l-1.89,-0.33l-0.18,0.03l-0.47,0.23l-0.02,0.53l0.96,0.56l-0.08,1.58l0.35,1.58l0.26,0.23l1.91,0.19l0.02,0.07l-1.54,0.62l-0.18,0.2l-0.25,0.92l-0.88,0.35l-1.85,0.58l-0.16,0.13l-0.4,0.64l-1.66,0.14l-1.22,-1.18l-0.79,-2.52l-0.67,-0.88l-0.66,-0.43l0.99,-0.98l0.09,-0.26l-0.09,-0.56l-0.08,-0.16l-0.66,-0.69l-0.47,-1.54l0.18,-1.67l0.55,-0.85l0.45,-1.35l-0.15,-0.36l-0.89,-0.43l-0.19,-0.02l-1.39,0.28l-1.76,-0.13l-0.92,0.23l-1.64,-2.01l-0.17,-0.1l-1.54,-0.33l-3.05,0.23l-0.5,-0.73l-0.15,-0.12l-0.45,-0.15l-0.05,-0.28l0.28,-0.86l0.01,-0.15l-0.2,-1.01l-0.08,-0.15l-0.5,-0.5l-0.3,-1.08l-0.25,-0.22l-0.89,-0.12l0.54,-1.18l0.29,-1.73l0.66,-0.85l0.94,-0.7l0.09,-0.11l0.3,-0.6Z\\\", \\\"name\\\": \\\"Venezuela\\\"}, \\\"AF\\\": {\\\"path\\\": \\\"M574.42,192.1l2.24,0.95l0.18,0.02l1.89,-0.38l0.22,-0.18l0.46,-1.14l1.82,-0.4l1.5,-0.91l0.14,-0.19l0.46,-2.12l1.93,-0.51l0.2,-0.18l0.26,-0.68l0.87,0.57l0.13,0.05l0.79,0.09l1.35,0.02l1.83,0.59l0.75,0.34l0.26,-0.01l1.66,-0.85l0.7,0.46l0.42,-0.09l0.72,-1.17l1.32,0.05l0.23,-0.1l0.39,-0.43l0.07,-0.14l0.24,-1.08l0.86,-0.81l0.94,0.46l-0.2,0.64l0.23,0.38l0.49,0.09l-0.21,2.15l0.09,0.25l0.99,0.94l0.38,0.03l0.83,-0.57l1.06,-0.27l0.12,-0.06l1.46,-1.21l1.63,0.2l2.4,0.0l0.17,0.32l-1.12,0.25l-1.23,0.52l-2.86,0.33l-2.69,0.6l-0.13,0.06l-1.46,1.25l-0.07,0.36l0.58,1.18l0.25,1.21l-1.13,1.08l-0.09,0.25l0.09,0.98l-0.53,0.79l-2.22,-0.08l-0.28,0.44l0.83,1.57l-1.3,0.58l-0.13,0.11l-1.06,1.69l-0.05,0.18l0.13,1.51l-0.73,0.58l-0.78,-0.22l-0.14,-0.01l-1.91,0.36l-0.23,0.19l-0.2,0.57l-1.65,-0.0l-0.22,0.1l-1.4,1.56l-0.08,0.19l-0.08,2.13l-2.99,1.05l-1.67,-0.23l-0.27,0.1l-0.39,0.46l-1.43,-0.31l-2.43,0.4l-3.69,-1.23l1.96,-2.15l0.08,-0.24l-0.21,-1.78l-0.23,-0.26l-1.69,-0.42l-0.19,-1.62l-0.77,-2.08l0.98,-1.41l-0.14,-0.45l-0.82,-0.31l0.6,-1.79l0.93,-3.21Z\\\", \\\"name\\\": \\\"Afghanistan\\\"}, \\\"IQ\\\": {\\\"path\\\": \\\"M534.42,190.89l0.13,0.14l1.5,0.78l0.15,1.34l-1.13,0.87l-0.11,0.16l-0.58,2.2l0.04,0.24l1.73,2.67l0.12,0.1l2.99,1.49l1.18,1.94l-0.39,1.89l0.29,0.36l0.5,-0.0l0.02,1.17l0.08,0.2l0.83,0.86l-2.36,-0.29l-0.29,0.13l-1.74,2.49l-4.4,-0.21l-7.03,-5.49l-3.73,-1.94l-2.92,-0.74l-0.89,-3.0l5.33,-2.81l0.15,-0.19l0.95,-3.43l-0.2,-2.0l1.19,-0.61l0.11,-0.09l1.23,-1.73l0.92,-0.38l2.75,0.35l0.81,0.68l0.31,0.05l0.94,-0.38l1.5,3.17Z\\\", \\\"name\\\": \\\"Iraq\\\"}, \\\"IS\\\": {\\\"path\\\": \\\"M384.26,87.96l-0.51,2.35l0.08,0.28l2.61,2.58l-2.99,2.83l-7.16,2.72l-2.08,0.7l-9.51,-1.71l1.89,-1.36l-0.07,-0.53l-4.4,-1.59l3.33,-0.59l0.25,-0.32l-0.11,-1.2l-0.25,-0.27l-4.82,-0.88l1.38,-2.2l3.54,-0.57l3.8,2.74l0.33,0.01l3.68,-2.18l3.02,1.12l0.25,-0.02l4.01,-2.18l3.72,0.27Z\\\", \\\"name\\\": \\\"Iceland\\\"}, \\\"IR\\\": {\\\"path\\\": \\\"M556.2,187.5l2.05,-0.52l0.13,-0.07l1.69,-1.57l1.55,0.08l0.15,-0.03l1.02,-0.5l1.64,0.25l2.82,1.48l1.91,0.3l2.8,2.49l0.18,0.08l1.61,0.09l0.19,2.09l-1.0,3.47l-0.69,2.04l0.18,0.38l0.73,0.28l-0.85,1.22l-0.04,0.28l0.81,2.19l0.19,1.72l0.23,0.26l1.69,0.42l0.17,1.43l-2.18,2.39l-0.01,0.4l1.22,1.42l1.0,1.62l0.12,0.11l2.23,1.11l0.06,2.2l0.2,0.27l1.03,0.38l0.14,0.83l-3.38,1.3l-0.18,0.19l-0.87,2.85l-4.44,-0.76l-2.75,-0.62l-2.64,-0.32l-1.01,-3.11l-0.17,-0.19l-1.2,-0.48l-0.18,-0.01l-1.99,0.51l-2.42,1.25l-2.89,-0.84l-2.48,-2.03l-2.41,-0.79l-1.61,-2.47l-1.84,-3.63l-0.36,-0.15l-1.22,0.4l-1.48,-0.84l-0.37,0.06l-0.72,0.82l-1.08,-1.12l-0.02,-1.35l-0.3,-0.29l-0.43,0.0l0.34,-1.64l-0.04,-0.22l-1.29,-2.11l-0.12,-0.11l-3.0,-1.49l-1.62,-2.49l0.52,-1.98l1.18,-0.92l0.11,-0.27l-0.19,-1.66l-0.16,-0.23l-1.55,-0.81l-1.58,-3.33l-1.3,-2.2l0.41,-0.75l0.03,-0.21l-0.73,-3.12l1.2,-0.59l0.35,0.9l1.26,1.35l0.15,0.09l1.81,0.39l0.91,-0.09l0.15,-0.06l2.9,-2.13l0.7,-0.16l0.48,0.56l-0.75,1.26l0.05,0.37l1.56,1.53l0.28,0.08l0.37,-0.09l0.7,1.89l0.21,0.19l2.31,0.59l1.69,1.4l0.15,0.07l3.66,0.49l3.91,-0.76l0.23,-0.19l0.19,-0.52Z\\\", \\\"name\\\": \\\"Iran\\\"}, \\\"AM\\\": {\\\"path\\\": \\\"M530.51,176.08l2.91,-0.39l0.41,0.63l0.11,0.1l0.66,0.36l-0.32,0.47l0.07,0.41l1.1,0.84l-0.53,0.7l0.06,0.42l1.06,0.8l1.01,0.44l0.04,1.56l-0.44,0.04l-0.88,-1.46l0.01,-0.37l-0.3,-0.31l-0.98,0.01l-0.65,-0.69l-0.26,-0.09l-0.38,0.06l-0.97,-0.82l-1.64,-0.65l0.2,-1.2l-0.02,-0.16l-0.28,-0.69Z\\\", \\\"name\\\": \\\"Armenia\\\"}, \\\"IT\\\": {\\\"path\\\": \\\"M451.68,158.58l0.2,0.16l3.3,0.75l-0.22,1.26l0.02,0.18l0.35,0.78l-1.4,-0.32l-0.21,0.03l-2.04,1.1l-0.16,0.29l0.13,1.47l-0.29,0.82l0.02,0.24l0.82,1.57l0.1,0.11l2.28,1.5l1.29,2.53l2.79,2.43l0.2,0.07l1.83,-0.02l0.31,0.34l-0.46,0.39l0.06,0.5l4.06,1.97l2.06,1.49l0.17,0.36l-0.24,0.53l-1.08,-1.07l-0.15,-0.08l-2.18,-0.49l-0.33,0.15l-1.05,1.91l0.11,0.4l1.63,0.98l-0.22,1.12l-0.84,0.14l-0.22,0.15l-1.27,2.38l-0.54,0.12l0.01,-0.47l0.48,-1.46l0.5,-0.58l0.03,-0.35l-0.97,-1.69l-0.76,-1.48l-0.17,-0.15l-0.94,-0.33l-0.68,-1.18l-0.16,-0.13l-1.53,-0.52l-1.03,-1.14l-0.19,-0.1l-1.78,-0.19l-1.88,-1.3l-2.27,-1.94l-1.64,-1.68l-0.76,-2.94l-0.21,-0.21l-1.22,-0.35l-2.01,-1.0l-0.24,-0.01l-1.15,0.42l-0.11,0.07l-1.38,1.36l-0.5,0.11l0.19,-0.87l-0.21,-0.35l-1.19,-0.34l-0.56,-2.06l0.76,-0.82l0.03,-0.36l-0.68,-1.08l0.04,-0.31l0.68,0.42l0.19,0.04l1.21,-0.15l0.14,-0.06l1.18,-0.89l0.25,0.29l0.25,0.1l1.19,-0.1l0.25,-0.18l0.45,-1.04l1.61,0.34l0.19,-0.02l1.1,-0.53l0.17,-0.22l0.15,-0.95l1.19,0.35l0.35,-0.16l0.23,-0.47l2.11,-0.47l0.45,0.89ZM459.35,184.63l-0.71,1.81l0.0,0.23l0.33,0.79l-0.37,1.03l-1.6,-0.91l-1.33,-0.34l-3.24,-1.36l0.23,-0.99l2.73,0.24l3.95,-0.5ZM443.95,175.91l1.26,1.77l-0.31,3.47l-0.82,-0.13l-0.26,0.08l-0.83,0.79l-0.64,-0.52l-0.1,-3.42l-0.44,-1.34l0.91,0.1l0.21,-0.06l1.01,-0.74Z\\\", \\\"name\\\": \\\"Italy\\\"}, \\\"VN\\\": {\\\"path\\\": \\\"M690.8,230.21l-2.86,1.93l-2.09,2.46l-0.06,0.11l-0.55,1.8l0.04,0.26l4.26,6.1l2.31,1.63l1.46,1.97l1.12,4.62l-0.32,4.3l-1.97,1.57l-2.85,1.62l-2.09,2.14l-2.83,2.13l-0.67,-1.19l0.65,-1.58l-0.09,-0.35l-1.47,-1.14l1.67,-0.79l2.57,-0.18l0.22,-0.47l-0.89,-1.24l3.88,-1.8l0.17,-0.24l0.31,-3.05l-0.01,-0.13l-0.56,-1.63l0.44,-2.48l-0.01,-0.15l-0.63,-1.81l-0.08,-0.12l-1.87,-1.77l-3.64,-5.3l-0.11,-0.1l-2.68,-1.39l0.45,-0.59l1.53,-0.65l0.16,-0.39l-0.97,-2.27l-0.27,-0.18l-2.89,-0.02l-1.04,-2.21l-1.28,-1.83l0.96,-0.46l1.97,0.01l2.43,-0.3l0.13,-0.05l1.95,-1.29l1.04,0.85l0.13,0.06l1.98,0.42l-0.32,1.21l0.09,0.3l1.19,1.07l0.12,0.07l1.88,0.51Z\\\", \\\"name\\\": \\\"Vietnam\\\"}, \\\"AR\\\": {\\\"path\\\": \\\"M258.11,341.34l1.4,1.81l0.51,-0.06l0.89,-1.94l2.51,0.1l0.36,0.49l4.6,4.31l0.15,0.08l1.99,0.39l3.01,1.93l2.5,1.01l0.28,0.91l-2.4,3.97l0.17,0.44l2.57,0.74l2.81,0.41l2.09,-0.44l0.14,-0.07l2.27,-2.06l0.09,-0.17l0.38,-2.2l0.88,-0.36l1.05,1.29l-0.04,1.88l-1.98,1.4l-1.72,1.13l-2.84,2.65l-3.34,3.73l-0.07,0.12l-0.63,2.22l-0.67,2.85l0.02,2.73l-0.47,0.54l-0.07,0.17l-0.36,3.28l0.12,0.27l3.03,2.32l-0.31,1.78l0.11,0.29l1.44,1.15l-0.11,1.17l-2.32,3.57l-3.59,1.51l-4.95,0.6l-2.72,-0.29l-0.32,0.38l0.5,1.67l-0.49,2.13l0.01,0.16l0.4,1.29l-1.27,0.88l-2.41,0.39l-2.33,-1.05l-0.31,0.04l-0.97,0.78l-0.11,0.27l0.35,2.98l0.16,0.23l1.69,0.91l0.31,-0.02l1.08,-0.75l0.46,0.96l-2.1,0.88l-2.01,1.89l-0.09,0.18l-0.36,3.05l-0.51,1.42l-2.16,0.01l-0.19,0.07l-1.96,1.59l-0.1,0.15l-0.72,2.34l0.08,0.31l2.46,2.31l0.13,0.07l2.09,0.56l-0.74,2.45l-2.86,1.75l-0.12,0.14l-1.59,3.71l-2.2,1.24l-0.1,0.09l-1.03,1.54l-0.04,0.23l0.81,3.45l0.06,0.13l1.13,1.32l-2.59,-0.57l-5.89,-0.44l-0.92,-1.73l0.05,-2.4l-0.34,-0.3l-1.49,0.19l-0.72,-0.98l-0.2,-3.21l1.79,-1.33l0.1,-0.13l0.79,-2.04l0.02,-0.16l-0.27,-1.52l1.31,-2.69l0.91,-4.15l-0.23,-1.72l0.91,-0.49l0.15,-0.33l-0.27,-1.16l-0.15,-0.2l-0.87,-0.46l0.65,-1.01l-0.04,-0.37l-1.06,-1.09l-0.54,-3.2l0.83,-0.51l0.14,-0.29l-0.42,-3.6l0.58,-2.98l0.64,-2.5l1.41,-1.0l0.12,-0.32l-0.75,-2.8l-0.01,-2.48l1.81,-1.78l0.09,-0.22l-0.06,-2.3l1.39,-2.69l0.03,-0.14l0.01,-2.58l-0.11,-0.24l-0.57,-0.45l-1.1,-4.59l1.49,-2.73l0.04,-0.17l-0.23,-2.59l0.86,-2.38l1.6,-2.48l1.74,-1.65l0.04,-0.39l-0.64,-0.89l0.42,-0.7l0.04,-0.16l-0.08,-4.26l2.55,-1.23l0.16,-0.18l0.86,-2.75l-0.01,-0.22l-0.22,-0.48l1.84,-2.1l3.0,0.59ZM256.77,438.98l-2.1,0.15l-1.18,-1.14l-0.19,-0.08l-1.53,-0.09l-2.38,-0.0l-0.0,-6.28l0.4,0.65l1.25,2.55l0.11,0.12l3.26,2.07l3.19,0.8l-0.82,1.26Z\\\", \\\"name\\\": \\\"Argentina\\\"}, \\\"AU\\\": {\\\"path\\\": \\\"M705.55,353.06l0.09,0.09l0.37,0.05l0.13,-0.35l-0.57,-1.69l0.48,0.3l0.71,0.99l0.34,0.11l0.2,-0.29l-0.04,-1.37l-0.04,-0.14l-1.22,-2.07l-0.28,-0.9l-0.51,-0.69l0.24,-1.33l0.52,-0.7l0.34,-1.32l0.01,-0.13l-0.25,-1.44l0.51,-0.94l0.1,1.03l0.23,0.26l0.32,-0.14l1.01,-1.72l1.94,-0.84l1.27,-1.14l1.84,-0.92l1.0,-0.18l0.6,0.28l0.26,-0.0l1.94,-0.96l1.48,-0.28l0.19,-0.13l0.32,-0.49l0.51,-0.18l1.42,0.05l2.63,-0.76l0.11,-0.06l1.36,-1.15l0.08,-0.1l0.61,-1.33l1.42,-1.27l0.1,-0.19l0.11,-1.03l0.06,-1.32l1.39,-1.74l0.85,1.79l0.4,0.14l1.07,-0.51l0.11,-0.45l-0.77,-1.05l0.53,-0.84l0.86,0.43l0.43,-0.22l0.29,-1.85l1.29,-1.19l0.6,-0.98l1.16,-0.4l0.2,-0.27l0.02,-0.34l0.74,0.2l0.38,-0.27l0.03,-0.44l1.98,-0.61l1.7,1.08l1.36,1.48l0.22,0.1l1.55,0.02l1.57,0.24l0.33,-0.4l-0.48,-1.27l1.09,-1.86l1.06,-0.63l0.1,-0.42l-0.28,-0.46l0.93,-1.24l1.36,-0.8l1.16,0.27l0.14,0.0l2.1,-0.48l0.23,-0.3l-0.05,-1.3l-0.18,-0.26l-1.08,-0.49l0.44,-0.12l1.52,0.58l1.39,1.06l2.11,0.65l0.19,-0.0l0.59,-0.21l1.44,0.72l0.27,0.0l1.37,-0.68l0.84,0.2l0.26,-0.06l0.37,-0.3l0.82,0.89l-0.56,1.14l-0.84,0.91l-0.75,0.07l-0.26,0.38l0.26,0.9l-0.67,1.15l-0.88,1.24l-0.05,0.25l0.18,0.72l0.12,0.17l1.99,1.42l1.96,0.84l1.25,0.86l1.8,1.51l0.19,0.07l0.63,-0.0l1.15,0.58l0.34,0.7l0.17,0.15l2.39,0.88l0.24,-0.02l1.65,-0.88l0.14,-0.16l0.49,-1.37l0.52,-1.19l0.31,-1.39l0.75,-2.02l0.01,-0.19l-0.33,-1.16l0.16,-0.67l0.0,-0.13l-0.28,-1.41l0.3,-1.78l0.42,-0.45l0.05,-0.33l-0.33,-0.73l0.56,-1.25l0.48,-1.39l0.07,-0.69l0.58,-0.59l0.48,0.84l0.17,1.53l0.17,0.24l0.47,0.23l0.09,0.9l0.05,0.14l0.87,1.23l0.17,1.33l-0.09,0.89l0.03,0.15l0.9,2.0l0.43,0.13l1.38,-0.83l0.71,0.92l1.06,0.88l-0.22,0.96l0.0,0.14l0.53,2.2l0.38,1.3l0.15,0.18l0.52,0.26l0.62,2.01l-0.23,1.27l0.02,0.18l0.81,1.76l0.14,0.14l2.69,1.35l3.21,2.21l-0.2,0.4l0.04,0.34l1.39,1.6l0.95,2.78l0.43,0.16l0.79,-0.46l0.85,0.96l0.39,0.05l0.22,-0.15l0.36,2.33l0.09,0.18l1.78,1.63l1.16,1.01l1.9,2.1l0.67,2.05l0.06,1.47l-0.17,1.64l0.03,0.17l1.16,2.22l-0.14,2.28l-0.43,1.24l-0.68,2.44l0.04,1.63l-0.48,1.92l-1.06,2.43l-1.79,1.32l-0.1,0.12l-0.91,2.15l-0.82,1.37l-0.76,2.47l-0.98,1.46l-0.63,2.14l-0.33,2.02l0.1,0.82l-1.21,0.85l-2.71,0.1l-0.13,0.03l-2.31,1.19l-1.21,1.17l-1.34,1.11l-1.89,-1.18l-1.33,-0.46l0.32,-1.24l-0.4,-0.35l-1.46,0.61l-2.06,1.98l-1.99,-0.73l-1.43,-0.46l-1.45,-0.22l-2.32,-0.81l-1.51,-1.67l-0.45,-2.11l-0.6,-1.5l-0.07,-0.11l-1.23,-1.16l-0.16,-0.08l-1.96,-0.28l0.59,-0.99l0.03,-0.24l-0.61,-2.1l-0.54,-0.08l-1.16,1.85l-1.23,0.29l0.73,-0.88l0.06,-0.12l0.37,-1.57l0.93,-1.33l0.05,-0.2l-0.2,-2.07l-0.53,-0.17l-2.01,2.35l-1.52,0.94l-0.12,0.14l-0.82,1.93l-1.5,-0.9l0.07,-1.32l-0.06,-0.2l-1.57,-2.04l-1.15,-0.92l0.3,-0.41l-0.1,-0.44l-3.21,-1.69l-0.13,-0.03l-1.69,-0.08l-2.35,-1.31l-0.16,-0.04l-4.55,0.27l-3.24,0.99l-2.8,0.91l-2.33,-0.18l-0.17,0.03l-2.63,1.41l-2.14,0.64l-0.2,0.19l-0.47,1.42l-0.8,0.99l-1.99,0.06l-1.55,0.24l-2.27,-0.5l-1.79,0.3l-1.71,0.13l-0.19,0.09l-1.38,1.39l-0.58,-0.1l-0.21,0.04l-1.26,0.8l-1.13,0.85l-1.72,-0.1l-1.6,-0.0l-2.58,-1.76l-1.21,-0.49l0.04,-1.19l1.04,-0.32l0.16,-0.12l0.42,-0.64l0.05,-0.19l-0.09,-0.97l0.3,-2.0l-0.28,-1.64l-1.34,-2.84l-0.39,-1.49l0.1,-1.51l-0.04,-0.17l-0.96,-1.72l-0.06,-0.73l-0.09,-0.19l-1.04,-1.01l-0.3,-2.02l-0.05,-0.12l-1.23,-1.83ZM784.95,393.35l2.39,1.01l0.2,0.01l3.26,-0.96l1.19,0.16l0.16,3.19l-0.78,0.95l-0.07,0.16l-0.19,1.83l-0.43,-0.41l-0.44,0.03l-1.61,1.96l-0.4,-0.12l-1.38,-0.09l-1.43,-2.42l-0.37,-2.03l-1.4,-2.53l0.04,-0.94l1.27,0.2Z\\\", \\\"name\\\": \\\"Australia\\\"}, \\\"IL\\\": {\\\"path\\\": \\\"M509.04,199.22l0.71,0.0l0.27,-0.17l0.15,-0.33l0.19,-0.01l0.02,0.73l-0.27,0.34l0.02,0.08l-0.32,0.62l-0.65,-0.27l-0.41,0.19l-0.52,1.85l0.16,0.35l0.14,0.07l-0.17,0.1l-0.14,0.21l-0.11,0.73l0.39,0.33l0.81,-0.26l0.03,0.64l-0.97,3.43l-1.28,-3.67l0.62,-0.78l-0.03,-0.41l0.58,-1.16l0.5,-2.07l0.27,-0.54Z\\\", \\\"name\\\": \\\"Israel\\\"}, \\\"IN\\\": {\\\"path\\\": \\\"M615.84,192.58l2.4,2.97l-0.24,2.17l0.05,0.2l0.94,1.35l-0.06,0.97l-1.46,-0.3l-0.35,0.36l0.7,3.06l0.12,0.18l2.46,1.75l3.11,1.72l-1.23,0.96l-0.1,0.13l-0.97,2.55l0.16,0.38l2.41,1.02l2.37,1.33l3.27,1.52l3.43,0.37l1.37,1.3l0.17,0.08l1.92,0.25l3.0,0.62l2.15,-0.04l0.28,-0.22l0.29,-1.06l0.0,-0.13l-0.32,-1.66l0.16,-0.94l1.0,-0.37l0.23,2.28l0.18,0.24l2.28,1.02l0.2,0.02l1.52,-0.41l2.06,0.18l2.08,-0.08l0.29,-0.27l0.18,-1.66l-0.1,-0.26l-0.53,-0.44l1.38,-0.23l0.15,-0.07l2.26,-2.0l2.75,-1.65l1.97,0.63l0.25,-0.03l1.54,-0.99l0.89,1.28l-0.72,0.97l0.2,0.48l2.49,0.37l0.11,0.61l-0.69,0.39l-0.15,0.3l0.15,1.22l-1.36,-0.37l-0.23,0.03l-3.24,1.86l-0.15,0.28l0.07,1.44l-1.33,2.16l-0.04,0.13l-0.12,1.24l-0.98,1.91l-1.72,-0.53l-0.39,0.28l-0.09,2.66l-0.52,0.83l-0.04,0.23l0.21,0.89l-0.71,0.36l-1.21,-3.85l-0.29,-0.21l-0.69,0.01l-0.29,0.23l-0.28,1.17l-0.84,-0.84l0.6,-1.17l0.97,-0.13l0.23,-0.16l1.15,-2.25l-0.18,-0.42l-1.54,-0.47l-2.3,0.04l-2.13,-0.33l-0.19,-1.63l-0.26,-0.26l-1.13,-0.13l-1.93,-1.13l-0.42,0.13l-0.88,1.82l0.08,0.37l1.47,1.15l-1.21,0.77l-0.1,0.1l-0.56,0.97l0.13,0.42l1.31,0.61l-0.36,1.35l0.01,0.2l0.85,1.95l0.37,2.05l-0.26,0.68l-1.55,-0.02l-3.09,0.54l-0.25,0.32l0.13,1.84l-1.21,1.4l-3.64,1.79l-2.79,3.04l-1.86,1.61l-2.48,1.68l-0.13,0.25l-0.0,1.0l-1.07,0.55l-2.21,0.9l-1.13,0.13l-0.25,0.19l-0.75,1.96l-0.02,0.15l0.52,3.31l0.13,2.03l-1.03,2.35l-0.03,0.12l-0.01,4.03l-1.02,0.1l-0.23,0.15l-1.14,1.93l0.04,0.36l0.44,0.48l-1.83,0.57l-0.18,0.15l-0.81,1.65l-0.74,0.53l-2.14,-2.12l-1.14,-3.47l-0.96,-2.57l-0.9,-1.26l-1.3,-2.38l-0.61,-3.14l-0.44,-1.62l-2.29,-3.56l-1.03,-4.94l-0.74,-3.29l0.01,-3.12l-0.49,-2.51l-0.41,-0.22l-3.56,1.53l-1.59,-0.28l-2.96,-2.87l0.94,-0.74l0.06,-0.41l-0.74,-1.03l-2.73,-2.1l1.35,-1.43l5.38,0.01l0.29,-0.36l-0.5,-2.29l-0.09,-0.15l-1.33,-1.28l-0.27,-1.96l-0.12,-0.2l-1.36,-1.0l2.42,-2.48l2.77,0.2l0.24,-0.1l2.62,-2.85l1.59,-2.8l2.41,-2.74l0.07,-0.2l-0.04,-1.82l2.01,-1.51l-0.01,-0.49l-1.95,-1.33l-0.83,-1.81l-0.82,-2.27l0.98,-0.97l3.64,0.66l2.89,-0.42l0.17,-0.08l2.18,-2.15Z\\\", \\\"name\\\": \\\"India\\\"}, \\\"TZ\\\": {\\\"path\\\": \\\"M505.77,287.58l0.36,0.23l8.95,5.03l0.15,1.3l0.13,0.21l3.4,2.37l-1.07,2.88l-0.02,0.14l0.15,1.42l0.15,0.23l1.47,0.84l0.05,0.42l-0.66,1.44l-0.02,0.18l0.13,0.72l-0.16,1.16l0.03,0.19l0.87,1.57l1.03,2.48l0.12,0.14l0.53,0.32l-1.59,1.18l-2.64,0.95l-1.45,-0.04l-0.2,0.07l-0.81,0.69l-1.64,0.06l-0.68,0.3l-2.9,-0.69l-1.71,0.17l-0.65,-3.18l-0.05,-0.12l-1.35,-1.88l-0.19,-0.12l-2.41,-0.46l-1.38,-0.74l-1.63,-0.44l-0.96,-0.41l-0.95,-0.58l-1.31,-3.09l-1.47,-1.46l-0.45,-1.31l0.24,-1.34l-0.39,-1.99l0.71,-0.08l0.18,-0.09l0.91,-0.91l0.98,-1.31l0.59,-0.5l0.11,-0.24l-0.02,-0.81l-0.08,-0.2l-0.47,-0.5l-0.1,-0.67l0.51,-0.23l0.18,-0.25l0.14,-1.47l-0.05,-0.2l-0.76,-1.09l0.45,-0.15l2.71,0.03l5.01,-0.19Z\\\", \\\"name\\\": \\\"Tanzania\\\"}, \\\"AZ\\\": {\\\"path\\\": \\\"M539.36,175.66l0.16,0.09l1.11,0.2l0.32,-0.15l0.4,-0.71l1.22,-0.99l1.11,1.33l1.26,2.09l0.22,0.14l1.06,0.13l0.28,0.29l-1.46,0.17l-0.26,0.24l-0.43,2.26l-0.39,0.92l-0.85,0.63l-0.12,0.25l0.06,1.2l-0.22,0.05l-1.28,-1.25l0.74,-1.25l-0.03,-0.35l-0.74,-0.86l-0.3,-0.1l-1.05,0.27l-2.49,1.82l-0.04,-1.46l-0.18,-0.27l-1.09,-0.47l-0.8,-0.6l0.53,-0.7l-0.06,-0.42l-1.11,-0.84l0.34,-0.51l-0.11,-0.43l-0.89,-0.48l-0.33,-0.49l0.25,-0.2l1.78,0.81l1.35,0.18l0.25,-0.09l0.34,-0.35l0.02,-0.39l-1.04,-1.36l0.28,-0.18l0.49,0.07l1.65,1.74ZM533.53,180.16l0.63,0.67l0.22,0.09l0.8,-0.0l0.04,0.31l0.66,1.09l-0.94,-0.21l-1.16,-1.24l-0.25,-0.71Z\\\", \\\"name\\\": \\\"Azerbaijan\\\"}, \\\"IE\\\": {\\\"path\\\": \\\"M405.17,135.35l0.36,2.16l-1.78,2.84l-4.28,1.91l-3.02,-0.43l1.81,-3.13l0.02,-0.26l-1.23,-3.26l3.24,-2.56l1.54,-1.32l0.37,1.33l-0.49,1.77l0.3,0.38l1.49,-0.05l1.68,0.63Z\\\", \\\"name\\\": \\\"Ireland\\\"}, \\\"ID\\\": {\\\"path\\\": \\\"M756.56,287.86l0.69,4.02l0.15,0.21l2.59,1.5l0.39,-0.07l2.05,-2.61l2.75,-1.45l2.09,-0.0l2.08,0.85l1.85,0.89l2.52,0.46l0.08,15.44l-1.72,-1.6l-0.15,-0.07l-2.54,-0.51l-0.29,0.1l-0.53,0.62l-2.53,0.06l0.78,-1.51l1.48,-0.66l0.17,-0.34l-0.65,-2.74l-1.23,-2.19l-0.14,-0.13l-4.85,-2.13l-2.09,-0.23l-3.7,-2.28l-0.41,0.1l-0.67,1.11l-0.63,0.14l-0.41,-0.67l-0.01,-1.01l-0.14,-0.25l-1.39,-0.89l2.05,-0.69l1.73,0.05l0.29,-0.39l-0.21,-0.66l-0.29,-0.21l-3.5,-0.0l-0.9,-1.36l-0.19,-0.13l-2.14,-0.44l-0.65,-0.76l2.86,-0.51l1.28,-0.79l3.75,0.96l0.32,0.76ZM758.01,300.37l-0.79,1.04l-0.14,-1.07l0.4,-0.81l0.29,-0.47l0.24,0.31l-0.0,1.0ZM747.45,292.9l0.48,1.02l-1.45,-0.69l-2.09,-0.21l-1.45,0.16l-1.28,-0.07l0.35,-0.81l2.86,-0.1l2.58,0.68ZM741.15,285.69l-0.16,-0.25l-0.72,-3.08l0.47,-1.86l0.35,-0.38l0.1,0.73l0.25,0.26l1.28,0.19l0.18,0.78l-0.11,1.8l-0.96,-0.18l-0.35,0.22l-0.38,1.52l0.05,0.24ZM741.19,285.75l0.76,0.97l-0.11,0.05l-0.65,-1.02ZM739.18,293.52l-0.61,0.54l-1.44,-0.38l-0.25,-0.55l1.93,-0.09l0.36,0.48ZM728.4,295.87l-0.27,-0.07l-2.26,0.89l-0.37,-0.41l0.27,-0.8l-0.09,-0.33l-1.68,-1.37l0.17,-2.29l-0.42,-0.3l-1.67,0.76l-0.17,0.29l0.21,2.92l0.09,3.34l-1.22,0.28l-0.78,-0.54l0.65,-2.1l0.01,-0.14l-0.39,-2.42l-0.29,-0.25l-0.86,-0.02l-0.63,-1.4l0.99,-1.61l0.35,-1.97l1.24,-3.73l0.49,-0.96l1.95,-1.7l1.86,0.69l3.16,0.35l2.92,-0.1l0.17,-0.06l2.24,-1.65l0.11,0.14l-1.8,2.22l-1.72,0.44l-2.41,-0.48l-4.21,0.13l-2.19,0.36l-0.25,0.24l-0.36,1.9l0.08,0.27l2.24,2.23l0.4,0.02l1.29,-1.08l3.19,-0.58l-0.19,0.06l-1.04,1.4l-2.13,0.94l-0.12,0.45l2.26,3.06l-0.37,0.69l0.03,0.32l1.51,1.95ZM728.48,295.97l0.59,0.76l-0.02,1.37l-1.0,0.55l-0.64,-0.58l1.09,-1.84l-0.02,-0.26ZM728.64,286.95l0.79,-0.14l-0.07,0.39l-0.72,-0.24ZM732.38,310.1l-1.89,0.49l-0.06,-0.06l0.17,-0.64l1.0,-1.42l2.14,-0.87l0.1,0.2l0.04,0.58l-1.49,1.72ZM728.26,305.71l-0.17,0.63l-3.53,0.67l-3.02,-0.28l-0.0,-0.42l1.66,-0.44l1.47,0.71l0.16,0.03l1.75,-0.21l1.69,-0.69ZM722.98,310.33l-0.74,0.03l-2.52,-1.35l1.42,-0.3l1.19,0.7l0.72,0.63l-0.06,0.28ZM716.24,305.63l0.66,0.49l0.22,0.06l1.35,-0.18l0.31,0.53l-4.18,0.77l-0.8,-0.01l0.51,-0.86l1.2,-0.02l0.24,-0.12l0.49,-0.65ZM715.84,280.21l0.09,0.34l2.25,1.86l-2.25,0.22l-0.24,0.17l-0.84,1.71l-0.03,0.15l0.1,2.11l-2.27,1.62l-0.13,0.24l-0.06,2.46l-0.74,2.92l-0.02,-0.05l-0.39,-0.16l-2.62,1.04l-0.86,-1.33l-0.23,-0.14l-1.71,-0.14l-1.19,-0.76l-0.25,-0.03l-2.78,0.84l-0.79,-1.05l-0.26,-0.12l-1.61,0.13l-1.8,-0.25l-0.36,-3.13l-0.15,-0.23l-1.18,-0.65l-1.13,-2.02l-0.33,-2.1l0.27,-2.19l1.05,-1.17l0.28,1.12l0.1,0.16l1.71,1.41l0.28,0.05l1.55,-0.49l1.54,0.17l0.23,-0.07l1.4,-1.21l1.05,-0.19l2.3,0.68l0.16,0.0l2.04,-0.53l0.21,-0.19l1.26,-3.41l0.91,-0.82l0.09,-0.14l0.8,-2.64l2.63,0.0l1.71,0.33l-1.19,1.89l0.02,0.34l1.74,2.24l-0.37,1.0ZM692.67,302.0l0.26,0.19l4.8,0.25l0.28,-0.16l0.44,-0.83l4.29,1.12l0.85,1.52l0.23,0.15l3.71,0.45l2.37,1.15l-2.06,0.69l-2.77,-1.0l-2.25,0.07l-2.57,-0.18l-2.31,-0.45l-2.94,-0.97l-1.84,-0.25l-0.13,0.01l-0.97,0.29l-4.34,-0.98l-0.38,-0.94l-0.25,-0.19l-1.76,-0.14l1.31,-1.84l2.81,0.14l1.97,0.96l0.95,0.19l0.28,0.74ZM685.63,299.27l-2.36,0.04l-2.07,-2.05l-3.17,-2.02l-1.06,-1.5l-1.88,-2.02l-1.22,-1.85l-1.9,-3.49l-2.2,-2.11l-0.71,-2.08l-0.94,-1.99l-0.1,-0.12l-2.21,-1.54l-1.35,-2.17l-1.86,-1.39l-2.53,-2.68l-0.14,-0.81l1.22,0.08l3.76,0.47l2.16,2.4l1.94,1.7l1.37,1.04l2.35,2.67l0.22,0.1l2.44,0.04l1.99,1.62l1.42,2.06l0.09,0.09l1.67,1.0l-0.88,1.8l0.11,0.39l1.44,0.87l0.13,0.04l0.68,0.05l0.41,1.62l0.87,1.4l0.22,0.14l1.71,0.21l1.06,1.38l-0.61,3.04l-0.09,3.6Z\\\", \\\"name\\\": \\\"Indonesia\\\"}, \\\"UA\\\": {\\\"path\\\": \\\"M500.54,141.42l0.9,0.13l0.27,-0.11l0.52,-0.62l0.68,0.13l2.43,-0.3l1.32,1.57l-0.45,0.48l-0.07,0.26l0.21,1.03l0.27,0.24l1.85,0.15l0.76,1.22l-0.05,0.55l0.2,0.31l3.18,1.15l0.18,0.01l1.75,-0.47l1.42,1.41l0.22,0.09l1.42,-0.03l3.44,0.99l0.02,0.65l-0.97,1.62l-0.03,0.24l0.52,1.67l-0.29,0.79l-2.24,0.22l-0.14,0.05l-1.29,0.89l-0.13,0.23l-0.07,1.16l-1.75,0.22l-0.12,0.04l-1.6,0.98l-2.27,0.16l-0.12,0.04l-2.16,1.17l-0.16,0.29l0.15,1.94l0.14,0.23l1.23,0.75l0.18,0.04l2.06,-0.15l-0.22,0.51l-2.67,0.54l-3.27,1.72l-1.0,-0.45l0.45,-1.19l-0.19,-0.39l-2.34,-0.78l0.15,-0.2l2.32,-1.0l0.09,-0.49l-0.73,-0.72l-0.15,-0.08l-3.69,-0.75l-0.14,-0.96l-0.35,-0.25l-2.32,0.39l-0.21,0.15l-0.91,1.7l-1.77,2.1l-0.93,-0.44l-0.24,-0.0l-1.05,0.45l-0.48,-0.25l0.13,-0.07l0.14,-0.15l0.43,-1.04l0.67,-0.97l0.04,-0.26l-0.1,-0.31l0.04,-0.02l0.11,0.19l0.24,0.15l1.48,0.09l0.78,-0.25l0.07,-0.53l-0.27,-0.19l0.09,-0.25l-0.08,-0.33l-0.81,-0.74l-0.34,-1.24l-0.14,-0.18l-0.73,-0.42l0.15,-0.87l-0.11,-0.29l-1.13,-0.86l-0.15,-0.06l-0.97,-0.11l-1.79,-0.97l-0.2,-0.03l-1.66,0.32l-0.13,0.06l-0.52,0.41l-0.95,-0.0l-0.23,0.11l-0.56,0.66l-1.74,0.29l-0.79,0.43l-1.01,-0.68l-0.16,-0.05l-1.57,-0.01l-1.52,-0.35l-0.23,0.04l-0.71,0.45l-0.09,-0.43l-0.13,-0.19l-1.18,-0.74l0.38,-1.02l0.53,-0.64l0.35,0.12l0.37,-0.41l-0.57,-1.29l2.1,-2.5l1.16,-0.36l0.2,-0.2l0.27,-0.92l-0.01,-0.2l-1.1,-2.52l0.79,-0.09l0.13,-0.05l1.3,-0.86l1.83,-0.07l2.48,0.26l2.84,0.8l1.91,0.06l0.88,0.45l0.29,-0.01l0.72,-0.44l0.49,0.58l0.25,0.11l2.2,-0.16l0.94,0.3l0.39,-0.26l0.15,-1.57l0.61,-0.59l2.01,-0.19Z\\\", \\\"name\\\": \\\"Ukraine\\\"}, \\\"QA\\\": {\\\"path\\\": \\\"M548.47,221.47l-0.15,-1.72l0.59,-1.23l0.38,-0.16l0.54,0.6l0.04,1.4l-0.47,1.37l-0.41,0.11l-0.53,-0.37Z\\\", \\\"name\\\": \\\"Qatar\\\"}, \\\"MZ\\\": {\\\"path\\\": \\\"M507.71,314.14l1.65,-0.18l2.96,0.7l0.2,-0.02l0.6,-0.29l1.68,-0.06l0.18,-0.07l0.8,-0.69l1.5,0.02l2.74,-0.98l1.74,-1.27l0.25,0.7l-0.1,2.47l0.31,2.27l0.1,3.97l0.42,1.24l-0.7,1.71l-0.94,1.73l-1.52,1.52l-5.06,2.21l-2.88,2.8l-1.01,0.51l-1.72,1.81l-0.99,0.58l-0.15,0.23l-0.21,1.86l0.04,0.19l1.17,1.95l0.47,1.47l0.03,0.74l0.39,0.28l0.05,-0.01l-0.06,2.13l-0.39,1.19l0.1,0.33l0.42,0.32l-0.28,0.83l-0.95,0.86l-2.03,0.88l-3.08,1.49l-1.1,0.99l-0.09,0.28l0.21,1.13l0.21,0.23l0.38,0.11l-0.14,0.89l-1.39,-0.02l-0.17,-0.94l-0.38,-1.23l-0.2,-0.89l0.44,-2.91l-0.01,-0.14l-0.65,-1.88l-1.15,-3.55l2.52,-2.85l0.68,-1.89l0.29,-0.18l0.14,-0.2l0.28,-1.53l-0.03,-0.19l-0.36,-0.7l0.1,-1.83l0.49,-1.84l-0.01,-3.26l-0.14,-0.25l-1.3,-0.83l-0.11,-0.04l-1.08,-0.17l-0.47,-0.55l-0.1,-0.08l-1.16,-0.54l-0.13,-0.03l-1.83,0.04l-0.32,-2.25l7.19,-1.99l1.32,1.12l0.29,0.06l0.55,-0.19l0.75,0.49l0.11,0.81l-0.49,1.11l-0.02,0.15l0.19,1.81l0.09,0.18l1.63,1.59l0.48,-0.1l0.72,-1.68l0.99,-0.49l0.17,-0.29l-0.21,-3.29l-0.04,-0.13l-1.11,-1.92l-0.9,-0.82l-0.21,-0.08l-0.62,0.03l-0.63,-2.98l0.61,-1.67Z\\\", \\\"name\\\": \\\"Mozambique\\\"}}, \\\"height\\\": 440.7063107441331, \\\"projection\\\": {\\\"type\\\": \\\"mill\\\", \\\"centralMeridian\\\": 11.5}, \\\"width\\\": 900.0});\"\n\n/***/ })\n\n},[2176]);\n\n\n// WEBPACK FOOTER //\n// js/inspinia.191a634ab75a474d0a25.js","require(\"!!/opt/atlassian/pipelines/agent/build/node_modules/script-loader/addScript.js\")(require(\"!!/opt/atlassian/pipelines/agent/build/node_modules/raw-loader/index.js!/opt/atlassian/pipelines/agent/build/src/assets/inspinia/plugins/c3/c3-angular.min.js\"))\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/script-loader!./src/assets/inspinia/plugins/c3/c3-angular.min.js\n// module id = 2177\n// module chunks = 1","module.exports = \"/*! c3-angular - v0.7.1 - 2015-09-08\\n* https://github.com/jettro/c3-angular-sample\\n* Copyright (c) 2015 ; Licensed */\\n\\nfunction ChartAxes(){var a=function(a,b,c,d){var e=c.valuesX;e&&d.addXAxisValues(e);var f=c.valuesXs,g={};if(f){xsItems=f.split(\\\",\\\");for(var h in xsItems)xsItem=xsItems[h].split(\\\":\\\"),g[xsItem[0]]=xsItem[1];d.addXSValues(g)}var i=c.y,j=c.y2,k={};if(j){var l=j.split(\\\",\\\");for(var m in l)k[l[m]]=\\\"y2\\\";if(i){var n=i.split(\\\",\\\");for(var o in n)k[n[o]]=\\\"y\\\"}d.addYAxis(k)}};return{require:\\\"^c3chart\\\",restrict:\\\"E\\\",scope:{},replace:!0,link:a}}function ChartAxis(){var a=function(a,b,c,d){var e=c.axisRotate;e&&d.rotateAxis()};return{require:\\\"^c3chart\\\",restrict:\\\"E\\\",scope:{},transclude:!0,template:\\\"<div ng-transclude></div>\\\",replace:!0,link:a}}function ChartAxisX(){var a=function(a,b,c,d){var e=c.axisPosition,f=c.axisLabel,g={label:{text:f,position:e}},h=c.paddingLeft,i=c.paddingRight;(h||i)&&(h=h?h:0,i=i?i:0,g.padding={left:parseInt(h),right:parseInt(i)});var j=c.axisHeight;j&&(g.height=parseInt(j)),\\\"false\\\"===c.show&&(g.show=!1),\\\"true\\\"===c.axisLocaltime&&(g.localtime=!0);var k=c.axisMax;k&&(g.max=k);var l=c.axisMin;l&&(g.min=l);var m=c.axisType;m&&(g.type=m),d.addAxisProperties(\\\"x\\\",g)};return{require:\\\"^c3chart\\\",restrict:\\\"E\\\",scope:{},transclude:!0,template:\\\"<div ng-transclude></div>\\\",replace:!0,link:a}}function ChartAxisXTick(){var a=function(a,b,c,d){var e={},f=c.tickCount;f&&(e.count=f);var g=c.tickCulling;g&&(g=angular.lowercase(g),\\\"true\\\"===g?e.culling=!0:\\\"false\\\"===g&&(e.culling=!1));var h=c.tickCullingMax;h&&(e.culling={max:parseInt(h)});var i=c.tickMultiline;i&&(i=angular.lowercase(i),\\\"true\\\"===i?e.multiline=!0:\\\"false\\\"===i&&(e.multiline=!1));var j=c.tickCentered;j&&(j=angular.lowercase(j),\\\"true\\\"===j?e.centered=!0:\\\"false\\\"===j&&(e.centered=!1));var k=c.tickRotate;k&&(e.rotate=k);var l=c.tickFit;l&&(l=angular.lowercase(l),\\\"true\\\"===l?e.fit=!0:\\\"false\\\"===l&&(e.fit=!1));var m=c.tickValues;m&&(e.values=m);var n=c.tickOuter;n&&(n=angular.lowercase(n),\\\"true\\\"===n?e.outer=!0:\\\"false\\\"===n&&(e.outer=!1));var o=c.format;o&&(e.format=d3.format(o)),d.addXTick(e),c.tickFormatFunction&&d.addXTickFormatFunction(a.tickFormatFunction())};return{require:\\\"^c3chart\\\",restrict:\\\"E\\\",scope:{tickFormatFunction:\\\"&\\\"},replace:!0,link:a}}function ChartAxisY(){var a=function(a,b,c,d){var e=c.axisId,f=c.axisPosition,g=c.axisLabel;e=void 0==e?\\\"y\\\":e;var h={label:{text:g,position:f}};\\\"false\\\"===c.show?h.show=!1:\\\"y2\\\"===e&&(h.show=!0);var i=c.paddingTop,j=c.paddingBottom;(i||j)&&(i=i?i:0,j=j?j:0,h.padding={top:parseInt(i),bottom:parseInt(j)});var k=c.axisMax,l=c.axisMin;k&&(h.max=parseInt(k)),l&&(h.min=parseInt(l)),\\\"true\\\"===c.axisInverted&&(h.inverted=!0),\\\"true\\\"===c.axisInner&&(h.inner=!0);var m=c.axisCenter;m&&(h.center=parseInt(m)),d.addAxisProperties(e,h)};return{require:\\\"^c3chart\\\",restrict:\\\"E\\\",scope:{},replace:!0,link:a}}function ChartAxisYTick(){var a=function(a,b,c,d){var e={},f=c.tickCount;f&&(e.count=f);var g=c.tickOuter;g&&(g=angular.lowercase(g),\\\"true\\\"===g?e.outer=!0:\\\"false\\\"===g&&(e.outer=!1));var h=c.tickValues;h&&(e.values=h);var i=c.tickFormat;i&&(e.format=d3.format(i)),d.addYTick(e),c.tickFormatFunction&&d.addYTickFormatFunction(a.tickFormatFunction())};return{require:\\\"^c3chart\\\",restrict:\\\"E\\\",scope:{tickFormatFunction:\\\"&\\\"},replace:!0,link:a}}function ChartBar(){var a=function(a,b,c,d){var e={};c.width&&(e.width=parseInt(c.width)),c.ratio&&(e.width||(e.width={}),e.width.ratio=parseFloat(c.ratio)),c.zerobased&&(e.zerobased=\\\"true\\\"===c.zerobased),d.addBar(e)};return{require:\\\"^c3chart\\\",restrict:\\\"E\\\",scope:{},replace:!0,link:a}}function C3Chart(a){var b=function(b,c,d,e){var f=d.paddingTop,g=d.paddingRight,h=d.paddingBottom,i=d.paddingLeft,j=d.sortData;f&&e.addPadding(\\\"top\\\",f),g&&e.addPadding(\\\"right\\\",g),h&&e.addPadding(\\\"bottom\\\",h),i&&e.addPadding(\\\"left\\\",i),j&&e.addSorting(j),d.labelsFormatFunction&&e.addDataLabelsFormatFunction(b.labelsFormatFunction()),d.callbackFunction&&e.addChartCallbackFunction(b.callbackFunction()),a(function(){e.showGraph()})};return{restrict:\\\"E\\\",controller:\\\"ChartController\\\",scope:{bindto:\\\"@bindtoId\\\",showLabels:\\\"@showLabels\\\",labelsFormatFunction:\\\"&\\\",showSubchart:\\\"@showSubchart\\\",enableZoom:\\\"@enableZoom\\\",chartData:\\\"=chartData\\\",chartColumns:\\\"=chartColumns\\\",chartX:\\\"=chartX\\\",callbackFunction:\\\"&\\\"},template:\\\"<div><div id='{{bindto}}'></div><div ng-transclude></div></div>\\\",replace:!0,transclude:!0,link:b}}function ChartColors(){var a=function(a,b,c,d){var e=c.colorPattern;e&&d.addColors(e.split(\\\",\\\")),c.colorFunction&&d.addColorFunction(a.colorFunction())};return{require:\\\"^c3chart\\\",restrict:\\\"E\\\",scope:{colorFunction:\\\"&\\\"},replace:!0,link:a}}function ChartColumn(){var a=function(a,b,c,d){var e=c.columnValues.split(\\\",\\\");e.unshift(c.columnId),d.addColumn(e,c.columnType,c.columnName,c.columnColor)};return{require:\\\"^c3chart\\\",restrict:\\\"E\\\",scope:{},replace:!0,link:a}}function ChartDonut(){var a=function(a,b,c,d){var e={};c.showLabel&&(e.label={show:\\\"true\\\"===c.showLabel}),c.thresholdLabel&&(e.label||(e.label={}),e.label.threshold=parseFloat(c.thresholdLabel)),c.expand&&(e.expand=\\\"true\\\"===c.expand),c.width&&(e.width=parseInt(c.width)),c.title&&(e.title=c.title),d.addDonut(e),c.labelFormatFunction&&d.addDonutLabelFormatFunction(a.labelFormatFunction())};return{require:\\\"^c3chart\\\",restrict:\\\"E\\\",scope:{labelFormatFunction:\\\"&\\\"},replace:!0,link:a}}function ChartEvents(){var a=function(a,b,c,d){c.onInit&&d.addOnInitFunction(a.onInit),c.onMouseover&&d.addOnMouseoverFunction(a.onMouseover),c.onMouseout&&d.addOnMouseoutFunction(a.onMouseout),c.onResize&&d.addOnResizeFunction(a.onResize),c.onResized&&d.addOnResizedFunction(a.onResized),c.onRendered&&d.addOnRenderedFunction(a.onRendered),c.onClickData&&d.addDataOnClickFunction(a.onClickData),c.onMouseoverData&&d.addDataOnMouseoverFunction(a.onMouseoverData),c.onMouseoutData&&d.addDataOnMouseoutFunction(a.onMouseoutData)};return{require:\\\"^c3chart\\\",restrict:\\\"E\\\",scope:{onInit:\\\"&\\\",onMouseover:\\\"&\\\",onMouseout:\\\"&\\\",onResize:\\\"&\\\",onResized:\\\"&\\\",onRendered:\\\"&\\\",onClickData:\\\"&\\\",onMouseoverData:\\\"&\\\",onMouseoutData:\\\"&\\\"},replace:!0,link:a}}function ChartGauge(){var a=function(a,b,c,d){var e={};c.min&&(e.min=parseInt(c.min)),c.max&&(e.max=parseInt(c.max)),c.width&&(e.width=parseInt(c.width)),c.units&&(e.units=c.units),c.showLabel&&(e.label={show:\\\"true\\\"===c.showLabel}),c.expand&&(e.expand=\\\"true\\\"===c.expand),d.addGauge(e),c.labelFormatFunction&&d.addGaugeLabelFormatFunction(a.labelFormatFunction())};return{require:\\\"^c3chart\\\",restrict:\\\"E\\\",scope:{labelFormatFunction:\\\"&\\\"},replace:!0,link:a}}function ChartGrid(){var a=function(a,b,c,d){var e=c.showX;e&&\\\"true\\\"===e&&d.addGrid(\\\"x\\\");var f=c.showY;f&&\\\"true\\\"===f&&d.addGrid(\\\"y\\\");var g=c.showY2;g&&\\\"true\\\"===g&&d.addGrid(\\\"y2\\\");var h=c.showFocus;h&&\\\"false\\\"===h&&d.hideGridFocus()};return{require:\\\"^c3chart\\\",restrict:\\\"E\\\",scope:{},replace:!0,link:a,transclude:!0,template:\\\"<div ng-transclude></div>\\\"}}function ChartGridOptional(){var a=function(a,b,c,d){var e=c.axisId,f=c.gridValue,g=c.gridText;d.addGridLine(e,f,g)};return{require:\\\"^c3chart\\\",restrict:\\\"E\\\",scope:{},replace:!0,link:a}}function ChartGroup(){var a=function(a,b,c,d){var e=c.groupValues.split(\\\",\\\");d.addGroup(e)};return{require:\\\"^c3chart\\\",restrict:\\\"E\\\",scope:{},replace:!0,link:a}}function ChartLegend(){var a=function(a,b,c,d){var e=null,f=c.showLegend;if(f&&\\\"false\\\"===f)e={show:!1};else{var g=c.legendPosition;g&&(e={position:g});var h=c.legendInset;h&&(e={position:\\\"inset\\\",inset:{anchor:h}})}null!=e&&d.addLegend(e)};return{require:\\\"^c3chart\\\",restrict:\\\"E\\\",scope:{},replace:!0,link:a}}function ChartPie(){var a=function(a,b,c,d){var e={};c.showLabel&&(e.label={show:\\\"true\\\"===c.showLabel}),c.thresholdLabel&&(e.label||(e.label={}),e.label.threshold=parseFloat(c.thresholdLabel)),c.expand&&(e.expand=\\\"true\\\"===c.expand),d.addPie(e),c.labelFormatFunction&&d.addPieLabelFormatFunction(a.labelFormatFunction())};return{require:\\\"^c3chart\\\",restrict:\\\"E\\\",scope:{labelFormatFunction:\\\"&\\\"},replace:!0,link:a}}function ChartPoints(){var a=function(a,b,c,d){var e={};c.showPoint&&(e.show=\\\"true\\\"===c.showPoint),c.pointExpandEnabled&&(e.focus||(e.focus={expand:{}}),e.focus.expand.enabled=\\\"false\\\"!==c.pointsFocusEnabled),c.pointExpandRadius&&(e.focus||(pie.focus={expand:{}}),e.focus.expand.r=parseInt(c.pointFocusRadius)),c.pointRadius&&(e.r=parseInt(c.pointRadius)),c.pointSelectRadius&&(e.select={r:parseInt(c.pointSelectRadius)}),d.addPoint(e)};return{require:\\\"^c3chart\\\",restrict:\\\"E\\\",scope:{},replace:!0,link:a}}function ChartSize(){var a=function(a,b,c,d){var e=null,f=c.chartWidth,g=c.chartHeight;(f||g)&&(e={},f&&(e.width=parseInt(f)),g&&(e.height=parseInt(g)),d.addSize(e))};return{require:\\\"^c3chart\\\",restrict:\\\"E\\\",scope:{},replace:!0,link:a}}function ChartTooltip(){var a=function(a,b,c,d){var e=null,f=c.showTooltip,g=(c.hideTooltipTitle,c.joinedTooltip);if(f&&\\\"false\\\"===f)e={show:!1};else{var h=c.groupTooltip;h&&\\\"false\\\"===h&&(e={grouped:!1})}g&&\\\"true\\\"===g&&(e=e||{},e.contents=function(a,b,c,d){var e,f,g,h,i,j,k,l=this,m=l.config,n=m.tooltip_format_title||b,o=m.tooltip_format_name||function(a){return a},p=m.tooltip_format_value||c;for(k={tooltipContainer:\\\"c3-tooltip-container\\\",tooltip:\\\"c3-tooltip\\\",tooltipName:\\\"c3-tooltip-name\\\"},f=a[0].x;f<a[0].x+1;f++)a[f]&&(a[f].value||0===a[f].value)&&(e||(g=n?n(a[f].x):a[f].x,e=\\\"<table class='\\\"+k.tooltip+\\\"'>\\\"+(g||0===g?\\\"<tr><th colspan='2'>\\\"+g+\\\"</th></tr>\\\":\\\"\\\")),h=p(a[f].value,a[f].ratio,a[f].id,a[f].index),void 0!==h&&(i=o(a[f].name,a[f].ratio,a[f].id,a[f].index),j=l.levelColor?l.levelColor(a[f].value):d(a[f].id),e+=\\\"<tr class='\\\"+k.tooltipName+\\\"-\\\"+a[f].id+\\\"'>\\\",e+=\\\"<td class='name'><span style='background-color:\\\"+j+\\\"'></span>\\\"+i+\\\"</td>\\\",e+=\\\"<td class='value'>\\\"+h+\\\"</td>\\\",e+=\\\"</tr>\\\"));return e+\\\"</table>\\\"}),null!=e&&d.addTooltip(e),c.titleFormatFunction&&d.addTooltipTitleFormatFunction(a.titleFormatFunction()),c.nameFormatFunction&&d.addTooltipNameFormatFunction(a.nameFormatFunction()),c.valueFormatFunction&&d.addTooltipValueFormatFunction(a.valueFormatFunction())};return{require:\\\"^c3chart\\\",restrict:\\\"E\\\",scope:{valueFormatFunction:\\\"&\\\",nameFormatFunction:\\\"&\\\",titleFormatFunction:\\\"&\\\"},replace:!0,link:a}}angular.module(\\\"gridshore.c3js.chart\\\",[]),angular.module(\\\"gridshore.c3js.chart\\\").directive(\\\"chartAxes\\\",ChartAxes),angular.module(\\\"gridshore.c3js.chart\\\").directive(\\\"chartAxis\\\",ChartAxis),angular.module(\\\"gridshore.c3js.chart\\\").directive(\\\"chartAxisX\\\",ChartAxisX),angular.module(\\\"gridshore.c3js.chart\\\").directive(\\\"chartAxisXTick\\\",ChartAxisXTick),angular.module(\\\"gridshore.c3js.chart\\\").directive(\\\"chartAxisY\\\",ChartAxisY),angular.module(\\\"gridshore.c3js.chart\\\").directive(\\\"chartAxisYTick\\\",ChartAxisYTick),angular.module(\\\"gridshore.c3js.chart\\\").directive(\\\"chartBar\\\",ChartBar),angular.module(\\\"gridshore.c3js.chart\\\").directive(\\\"c3chart\\\",[\\\"$timeout\\\",function(a){return C3Chart(a)}]),angular.module(\\\"gridshore.c3js.chart\\\").directive(\\\"chartColors\\\",ChartColors),angular.module(\\\"gridshore.c3js.chart\\\").directive(\\\"chartColumn\\\",ChartColumn),angular.module(\\\"gridshore.c3js.chart\\\").controller(\\\"ChartController\\\",[\\\"$scope\\\",\\\"$timeout\\\",function(a,b){function c(){a.chart=null,a.columns=[],a.types={},a.axis={},a.axes={},a.padding=null,a.xValues=null,a.xsValues=null,a.xTick=null,a.yTick=null,a.names=null,a.colors=null,a.grid=null,a.legend=null,a.tooltip=null,a.chartSize=null,a.colors=null,a.gauge=null,a.jsonKeys=null,a.groups=null,a.sorting=null}function d(b,c,d,e){void 0!==c&&(a.types[b]=c),void 0!==d&&(null===a.names&&(a.names={}),a.names[b]=d),void 0!==e&&(null===a.colors&&(a.colors={}),a.colors[b]=e)}function e(){a.jsonKeys={},a.jsonKeys.value=[],angular.forEach(a.chartColumns,function(b){a.jsonKeys.value.push(b.id),d(b.id,b.type,b.name,b.color)}),a.chartX&&(a.jsonKeys.x=a.chartX.id),a.names&&(a.config.data.names=a.names),a.colors&&(a.config.data.colors=a.colors),a.groups&&(a.config.data.groups=a.groups),a.config.data.keys=a.jsonKeys,a.config.data.json=a.chartData,a.chartIsGenerated?a.chart.load(a.config.data):(a.chart=c3.generate(a.config),a.chartIsGenerated=!0,a.chartCallbackFunction&&a.chartCallbackFunction(a.chart))}c(),this.showGraph=function(){var d={};d.bindto=\\\"#\\\"+a.bindto,d.data={},a.xValues&&(d.data.x=a.xValues),a.xsValues&&(d.data.xs=a.xsValues),a.columns&&(d.data.columns=a.columns),d.data.types=a.types,d.data.axes=a.axes,a.names&&(d.data.names=a.names),null!=a.padding&&(d.padding=a.padding),null!=a.sorting&&(d.data.order=\\\"null\\\"==a.sorting?null:a.sorting),a.colors&&(d.data.colors=a.colors),a.colorFunction&&(d.data.color=a.colorFunction),a.showLabels&&\\\"true\\\"===a.showLabels&&(d.data.labels=!0),a.dataLabelsFormatFunction&&(d.data.labels=d.data.labels||{},d.data.labels.format=a.dataLabelsFormatFunction),null!=a.groups&&(d.data.groups=a.groups),a.showSubchart&&\\\"true\\\"===a.showSubchart&&(d.subchart={show:!0}),a.enableZoom&&\\\"true\\\"===a.enableZoom&&(d.zoom={enabled:!0}),d.axis=a.axis,a.xTick&&(d.axis.x.tick=a.xTick),a.xTickFormatFunction&&(d.axis.x.tick=d.axis.x.tick||{},d.axis.x.tick.format=a.xTickFormatFunction),a.xType&&(d.axis.x.type=a.xType),a.yTick&&(d.axis.y.tick=a.yTick),a.yTickFormatFunction&&(d.axis.y.tick=d.axis.y.tick||{},d.axis.y.tick.format=a.yTickFormatFunction),null!=a.grid&&(d.grid=a.grid),null!=a.legend&&(d.legend=a.legend),d.tooltip=null!=a.tooltip?a.tooltip:{},a.tooltipTitleFormatFunction&&(d.tooltip.format=d.tooltip.format||{},d.tooltip.format.title=a.tooltipTitleFormatFunction),a.tooltipNameFormatFunction&&(d.tooltip.format=d.tooltip.format||{},d.tooltip.format.name=a.tooltipNameFormatFunction),a.tooltipValueFormatFunction&&(d.tooltip.format=d.tooltip.format||{},d.tooltip.format.value=a.tooltipValueFormatFunction),null!=a.chartSize&&(d.size=a.chartSize),null!=a.colors&&(d.color={pattern:a.colors}),d.gauge=null!=a.gauge?a.gauge:{},a.gaugeLabelFormatFunction&&(d.gauge.label=d.gauge.label||{},d.gauge.label.format=a.gaugeLabelFormatFunction),null!=a.point&&(d.point=a.point),null!=a.bar&&(d.bar=a.bar),null!=a.pie&&(d.pie=a.pie),a.pieLabelFormatFunction&&(d.pie.label=d.pie.label||{},d.pie.label.format=a.pieLabelFormatFunction),d.donut=null!=a.donut?a.donut:{},a.donutLabelFormatFunction&&(d.donut.label=d.donut.label||{},d.donut.label.format=a.donutLabelFormatFunction),null!=a.onInit&&(d.oninit=a.onInit),null!=a.onMouseover&&(d.onmouseover=a.onMouseover),null!=a.onMouseout&&(d.onmouseout=a.onMouseout),null!=a.onRendered&&(d.onrendered=a.onRendered),null!=a.onResize&&(d.onresize=a.onResize),null!=a.onResized&&(d.onresized=a.onResized),null!=a.dataOnClick&&(d.data.onclick=function(b){a.$apply(function(){a.dataOnClick({data:b})})}),null!=a.dataOnMouseover&&(d.data.onmouseover=function(b){a.$apply(function(){a.dataOnMouseover({data:b})})}),null!=a.dataOnMouseout&&(d.data.onmouseout=function(b){a.$apply(function(){a.dataOnMouseout({data:b})})}),a.config=d,a.chartData&&a.chartColumns?a.$watchCollection(\\\"chartData\\\",function(){e()}):a.chart=c3.generate(a.config),a.$on(\\\"$destroy\\\",function(){b(function(){angular.isDefined(a.chart)&&(a.chart=a.chart.destroy(),c())},1e4)})},this.addColumn=function(b,c,e,f){a.columns.push(b),d(b[0],c,e,f)},this.addDataLabelsFormatFunction=function(b){a.dataLabelsFormatFunction=b},this.addChartCallbackFunction=function(b){a.chartCallbackFunction=b},this.addYAxis=function(b){a.axes=b,a.axis.y2||(a.axis.y2={show:!0})},this.addXAxisValues=function(b){a.xValues=b},this.addXSValues=function(b){a.xsValues=b},this.addAxisProperties=function(b,c){a.axis[b]=c},this.addXTick=function(b){a.xTick=b},this.addXTickFormatFunction=function(b){a.xTickFormatFunction=b},this.addXType=function(b){a.xType=b},this.addYTick=function(b){a.yTick=b},this.addYTickFormatFunction=function(b){a.yTickFormatFunction=b},this.rotateAxis=function(){a.axis.rotated=!0},this.addPadding=function(b,c){null==a.padding&&(a.padding={}),a.padding[b]=parseInt(c)},this.addSorting=function(b){a.sorting=b},this.addGrid=function(b){null==a.grid&&(a.grid={}),null==a.grid[b]&&(a.grid[b]={}),a.grid[b].show=!0},this.addGridLine=function(b,c,d){null==a.grid&&(a.grid={}),\\\"x\\\"===b?(void 0===a.grid.x&&(a.grid.x={}),void 0===a.grid.x.lines&&(a.grid.x.lines=[])):(void 0===a.grid.y&&(a.grid.y={}),void 0===a.grid.y.lines&&(a.grid.y.lines=[])),\\\"y2\\\"===b?a.grid.y.lines.push({value:c,text:d,axis:\\\"y2\\\"}):a.grid[b].lines.push({value:c,text:d})},this.addLegend=function(b){a.legend=b},this.addTooltip=function(b){a.tooltip=b},this.addTooltipTitleFormatFunction=function(b){a.tooltipTitleFormatFunction=b},this.addTooltipNameFormatFunction=function(b){a.tooltipNameFormatFunction=b},this.addTooltipValueFormatFunction=function(b){a.tooltipValueFormatFunction=b},this.addSize=function(b){a.chartSize=b},this.addColors=function(b){a.colors=b},this.addColorFunction=function(b){a.colorFunction=b},this.addOnInitFunction=function(b){a.onInit=b},this.addOnMouseoverFunction=function(b){a.onMouseover=b},this.addOnMouseoutFunction=function(b){a.onMouseout=b},this.addOnRenderedFunction=function(b){a.onRendered=b},this.addOnResizeFunction=function(b){a.onResize=b},this.addOnResizedFunction=function(b){a.onResized=b},this.addDataOnClickFunction=function(b){a.dataOnClick=b},this.addDataOnMouseoverFunction=function(b){a.dataOnMouseover=b},this.addDataOnMouseoutFunction=function(b){a.dataOnMouseout=b},this.addGauge=function(b){a.gauge=b},this.addGaugeLabelFormatFunction=function(b){a.gaugeLabelFormatFunction=b},this.addBar=function(b){a.bar=b},this.addPie=function(b){a.pie=b},this.addPieLabelFormatFunction=function(b){a.pieLabelFormatFunction=b},this.addDonut=function(b){a.donut=b},this.addDonutLabelFormatFunction=function(b){a.donutLabelFormatFunction=b},this.addGroup=function(b){null==a.groups&&(a.groups=[]),a.groups.push(b)},this.addPoint=function(b){a.point=b},this.hideGridFocus=function(){null==a.grid&&(a.grid={}),a.grid.focus={show:!1}}}]),angular.module(\\\"gridshore.c3js.chart\\\").directive(\\\"chartDonut\\\",ChartDonut),angular.module(\\\"gridshore.c3js.chart\\\").directive(\\\"chartEvents\\\",ChartEvents),angular.module(\\\"gridshore.c3js.chart\\\").directive(\\\"chartGauge\\\",ChartGauge),angular.module(\\\"gridshore.c3js.chart\\\").directive(\\\"chartGrid\\\",ChartGrid),angular.module(\\\"gridshore.c3js.chart\\\").directive(\\\"chartGridOptional\\\",ChartGridOptional),angular.module(\\\"gridshore.c3js.chart\\\").directive(\\\"chartGroup\\\",ChartGroup),angular.module(\\\"gridshore.c3js.chart\\\").directive(\\\"chartLegend\\\",ChartLegend),angular.module(\\\"gridshore.c3js.chart\\\").directive(\\\"chartPie\\\",ChartPie),angular.module(\\\"gridshore.c3js.chart\\\").directive(\\\"chartPoints\\\",ChartPoints),angular.module(\\\"gridshore.c3js.chart\\\").directive(\\\"chartSize\\\",ChartSize),angular.module(\\\"gridshore.c3js.chart\\\").directive(\\\"chartTooltip\\\",ChartTooltip);\\n//# sourceMappingURL=c3-angular.min.js.map\\n\"\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/raw-loader!./src/assets/inspinia/plugins/c3/c3-angular.min.js\n// module id = 2178\n// module chunks = 1","require(\"!!/opt/atlassian/pipelines/agent/build/node_modules/script-loader/addScript.js\")(require(\"!!/opt/atlassian/pipelines/agent/build/node_modules/raw-loader/index.js!/opt/atlassian/pipelines/agent/build/src/assets/inspinia/plugins/d3/d3.min.js\"))\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/script-loader!./src/assets/inspinia/plugins/d3/d3.min.js\n// module id = 2179\n// module chunks = 1","module.exports = \"!function(){function n(n){return n&&(n.ownerDocument||n.document||n).documentElement}function t(n){return n&&(n.ownerDocument&&n.ownerDocument.defaultView||n.document&&n||n.defaultView)}function e(n,t){return t>n?-1:n>t?1:n>=t?0:NaN}function r(n){return null===n?NaN:+n}function u(n){return!isNaN(n)}function i(n){return{left:function(t,e,r,u){for(arguments.length<3&&(r=0),arguments.length<4&&(u=t.length);u>r;){var i=r+u>>>1;n(t[i],e)<0?r=i+1:u=i}return r},right:function(t,e,r,u){for(arguments.length<3&&(r=0),arguments.length<4&&(u=t.length);u>r;){var i=r+u>>>1;n(t[i],e)>0?u=i:r=i+1}return r}}}function a(n){return n.length}function o(n){for(var t=1;n*t%1;)t*=10;return t}function l(n,t){for(var e in t)Object.defineProperty(n.prototype,e,{value:t[e],enumerable:!1})}function c(){this._=Object.create(null)}function s(n){return(n+=\\\"\\\")===xa||n[0]===ba?ba+n:n}function f(n){return(n+=\\\"\\\")[0]===ba?n.slice(1):n}function h(n){return s(n)in this._}function g(n){return(n=s(n))in this._&&delete this._[n]}function p(){var n=[];for(var t in this._)n.push(f(t));return n}function v(){var n=0;for(var t in this._)++n;return n}function d(){for(var n in this._)return!1;return!0}function m(){this._=Object.create(null)}function y(n){return n}function M(n,t,e){return function(){var r=e.apply(t,arguments);return r===t?n:r}}function x(n,t){if(t in n)return t;t=t.charAt(0).toUpperCase()+t.slice(1);for(var e=0,r=_a.length;r>e;++e){var u=_a[e]+t;if(u in n)return u}}function b(){}function _(){}function w(n){function t(){for(var t,r=e,u=-1,i=r.length;++u<i;)(t=r[u].on)&&t.apply(this,arguments);return n}var e=[],r=new c;return t.on=function(t,u){var i,a=r.get(t);return arguments.length<2?a&&a.on:(a&&(a.on=null,e=e.slice(0,i=e.indexOf(a)).concat(e.slice(i+1)),r.remove(t)),u&&e.push(r.set(t,{on:u})),n)},t}function S(){oa.event.preventDefault()}function k(){for(var n,t=oa.event;n=t.sourceEvent;)t=n;return t}function N(n){for(var t=new _,e=0,r=arguments.length;++e<r;)t[arguments[e]]=w(t);return t.of=function(e,r){return function(u){try{var i=u.sourceEvent=oa.event;u.target=n,oa.event=u,t[u.type].apply(e,r)}finally{oa.event=i}}},t}function E(n){return Sa(n,Aa),n}function A(n){return\\\"function\\\"==typeof n?n:function(){return ka(n,this)}}function C(n){return\\\"function\\\"==typeof n?n:function(){return Na(n,this)}}function z(n,t){function e(){this.removeAttribute(n)}function r(){this.removeAttributeNS(n.space,n.local)}function u(){this.setAttribute(n,t)}function i(){this.setAttributeNS(n.space,n.local,t)}function a(){var e=t.apply(this,arguments);null==e?this.removeAttribute(n):this.setAttribute(n,e)}function o(){var e=t.apply(this,arguments);null==e?this.removeAttributeNS(n.space,n.local):this.setAttributeNS(n.space,n.local,e)}return n=oa.ns.qualify(n),null==t?n.local?r:e:\\\"function\\\"==typeof t?n.local?o:a:n.local?i:u}function L(n){return n.trim().replace(/\\\\s+/g,\\\" \\\")}function q(n){return new RegExp(\\\"(?:^|\\\\\\\\s+)\\\"+oa.requote(n)+\\\"(?:\\\\\\\\s+|$)\\\",\\\"g\\\")}function T(n){return(n+\\\"\\\").trim().split(/^|\\\\s+/)}function R(n,t){function e(){for(var e=-1;++e<u;)n[e](this,t)}function r(){for(var e=-1,r=t.apply(this,arguments);++e<u;)n[e](this,r)}n=T(n).map(D);var u=n.length;return\\\"function\\\"==typeof t?r:e}function D(n){var t=q(n);return function(e,r){if(u=e.classList)return r?u.add(n):u.remove(n);var u=e.getAttribute(\\\"class\\\")||\\\"\\\";r?(t.lastIndex=0,t.test(u)||e.setAttribute(\\\"class\\\",L(u+\\\" \\\"+n))):e.setAttribute(\\\"class\\\",L(u.replace(t,\\\" \\\")))}}function P(n,t,e){function r(){this.style.removeProperty(n)}function u(){this.style.setProperty(n,t,e)}function i(){var r=t.apply(this,arguments);null==r?this.style.removeProperty(n):this.style.setProperty(n,r,e)}return null==t?r:\\\"function\\\"==typeof t?i:u}function j(n,t){function e(){delete this[n]}function r(){this[n]=t}function u(){var e=t.apply(this,arguments);null==e?delete this[n]:this[n]=e}return null==t?e:\\\"function\\\"==typeof t?u:r}function U(n){function t(){var t=this.ownerDocument,e=this.namespaceURI;return e?t.createElementNS(e,n):t.createElement(n)}function e(){return this.ownerDocument.createElementNS(n.space,n.local)}return\\\"function\\\"==typeof n?n:(n=oa.ns.qualify(n)).local?e:t}function F(){var n=this.parentNode;n&&n.removeChild(this)}function H(n){return{__data__:n}}function O(n){return function(){return Ea(this,n)}}function I(n){return arguments.length||(n=e),function(t,e){return t&&e?n(t.__data__,e.__data__):!t-!e}}function Y(n,t){for(var e=0,r=n.length;r>e;e++)for(var u,i=n[e],a=0,o=i.length;o>a;a++)(u=i[a])&&t(u,a,e);return n}function Z(n){return Sa(n,za),n}function V(n){var t,e;return function(r,u,i){var a,o=n[i].update,l=o.length;for(i!=e&&(e=i,t=0),u>=t&&(t=u+1);!(a=o[t])&&++t<l;);return a}}function X(n,t,e){function r(){var t=this[a];t&&(this.removeEventListener(n,t,t.$),delete this[a])}function u(){var u=l(t,ca(arguments));r.call(this),this.addEventListener(n,this[a]=u,u.$=e),u._=t}function i(){var t,e=new RegExp(\\\"^__on([^.]+)\\\"+oa.requote(n)+\\\"$\\\");for(var r in this)if(t=r.match(e)){var u=this[r];this.removeEventListener(t[1],u,u.$),delete this[r]}}var a=\\\"__on\\\"+n,o=n.indexOf(\\\".\\\"),l=$;o>0&&(n=n.slice(0,o));var c=La.get(n);return c&&(n=c,l=B),o?t?u:r:t?b:i}function $(n,t){return function(e){var r=oa.event;oa.event=e,t[0]=this.__data__;try{n.apply(this,t)}finally{oa.event=r}}}function B(n,t){var e=$(n,t);return function(n){var t=this,r=n.relatedTarget;r&&(r===t||8&r.compareDocumentPosition(t))||e.call(t,n)}}function W(e){var r=\\\".dragsuppress-\\\"+ ++Ta,u=\\\"click\\\"+r,i=oa.select(t(e)).on(\\\"touchmove\\\"+r,S).on(\\\"dragstart\\\"+r,S).on(\\\"selectstart\\\"+r,S);if(null==qa&&(qa=\\\"onselectstart\\\"in e?!1:x(e.style,\\\"userSelect\\\")),qa){var a=n(e).style,o=a[qa];a[qa]=\\\"none\\\"}return function(n){if(i.on(r,null),qa&&(a[qa]=o),n){var t=function(){i.on(u,null)};i.on(u,function(){S(),t()},!0),setTimeout(t,0)}}}function J(n,e){e.changedTouches&&(e=e.changedTouches[0]);var r=n.ownerSVGElement||n;if(r.createSVGPoint){var u=r.createSVGPoint();if(0>Ra){var i=t(n);if(i.scrollX||i.scrollY){r=oa.select(\\\"body\\\").append(\\\"svg\\\").style({position:\\\"absolute\\\",top:0,left:0,margin:0,padding:0,border:\\\"none\\\"},\\\"important\\\");var a=r[0][0].getScreenCTM();Ra=!(a.f||a.e),r.remove()}}return Ra?(u.x=e.pageX,u.y=e.pageY):(u.x=e.clientX,u.y=e.clientY),u=u.matrixTransform(n.getScreenCTM().inverse()),[u.x,u.y]}var o=n.getBoundingClientRect();return[e.clientX-o.left-n.clientLeft,e.clientY-o.top-n.clientTop]}function G(){return oa.event.changedTouches[0].identifier}function K(n){return n>0?1:0>n?-1:0}function Q(n,t,e){return(t[0]-n[0])*(e[1]-n[1])-(t[1]-n[1])*(e[0]-n[0])}function nn(n){return n>1?0:-1>n?ja:Math.acos(n)}function tn(n){return n>1?Ha:-1>n?-Ha:Math.asin(n)}function en(n){return((n=Math.exp(n))-1/n)/2}function rn(n){return((n=Math.exp(n))+1/n)/2}function un(n){return((n=Math.exp(2*n))-1)/(n+1)}function an(n){return(n=Math.sin(n/2))*n}function on(){}function ln(n,t,e){return this instanceof ln?(this.h=+n,this.s=+t,void(this.l=+e)):arguments.length<2?n instanceof ln?new ln(n.h,n.s,n.l):_n(\\\"\\\"+n,wn,ln):new ln(n,t,e)}function cn(n,t,e){function r(n){return n>360?n-=360:0>n&&(n+=360),60>n?i+(a-i)*n/60:180>n?a:240>n?i+(a-i)*(240-n)/60:i}function u(n){return Math.round(255*r(n))}var i,a;return n=isNaN(n)?0:(n%=360)<0?n+360:n,t=isNaN(t)?0:0>t?0:t>1?1:t,e=0>e?0:e>1?1:e,a=.5>=e?e*(1+t):e+t-e*t,i=2*e-a,new yn(u(n+120),u(n),u(n-120))}function sn(n,t,e){return this instanceof sn?(this.h=+n,this.c=+t,void(this.l=+e)):arguments.length<2?n instanceof sn?new sn(n.h,n.c,n.l):n instanceof hn?pn(n.l,n.a,n.b):pn((n=Sn((n=oa.rgb(n)).r,n.g,n.b)).l,n.a,n.b):new sn(n,t,e)}function fn(n,t,e){return isNaN(n)&&(n=0),isNaN(t)&&(t=0),new hn(e,Math.cos(n*=Oa)*t,Math.sin(n)*t)}function hn(n,t,e){return this instanceof hn?(this.l=+n,this.a=+t,void(this.b=+e)):arguments.length<2?n instanceof hn?new hn(n.l,n.a,n.b):n instanceof sn?fn(n.h,n.c,n.l):Sn((n=yn(n)).r,n.g,n.b):new hn(n,t,e)}function gn(n,t,e){var r=(n+16)/116,u=r+t/500,i=r-e/200;return u=vn(u)*Ka,r=vn(r)*Qa,i=vn(i)*no,new yn(mn(3.2404542*u-1.5371385*r-.4985314*i),mn(-.969266*u+1.8760108*r+.041556*i),mn(.0556434*u-.2040259*r+1.0572252*i))}function pn(n,t,e){return n>0?new sn(Math.atan2(e,t)*Ia,Math.sqrt(t*t+e*e),n):new sn(NaN,NaN,n)}function vn(n){return n>.206893034?n*n*n:(n-4/29)/7.787037}function dn(n){return n>.008856?Math.pow(n,1/3):7.787037*n+4/29}function mn(n){return Math.round(255*(.00304>=n?12.92*n:1.055*Math.pow(n,1/2.4)-.055))}function yn(n,t,e){return this instanceof yn?(this.r=~~n,this.g=~~t,void(this.b=~~e)):arguments.length<2?n instanceof yn?new yn(n.r,n.g,n.b):_n(\\\"\\\"+n,yn,cn):new yn(n,t,e)}function Mn(n){return new yn(n>>16,n>>8&255,255&n)}function xn(n){return Mn(n)+\\\"\\\"}function bn(n){return 16>n?\\\"0\\\"+Math.max(0,n).toString(16):Math.min(255,n).toString(16)}function _n(n,t,e){var r,u,i,a=0,o=0,l=0;if(r=/([a-z]+)\\\\((.*)\\\\)/.exec(n=n.toLowerCase()))switch(u=r[2].split(\\\",\\\"),r[1]){case\\\"hsl\\\":return e(parseFloat(u[0]),parseFloat(u[1])/100,parseFloat(u[2])/100);case\\\"rgb\\\":return t(Nn(u[0]),Nn(u[1]),Nn(u[2]))}return(i=ro.get(n))?t(i.r,i.g,i.b):(null==n||\\\"#\\\"!==n.charAt(0)||isNaN(i=parseInt(n.slice(1),16))||(4===n.length?(a=(3840&i)>>4,a=a>>4|a,o=240&i,o=o>>4|o,l=15&i,l=l<<4|l):7===n.length&&(a=(16711680&i)>>16,o=(65280&i)>>8,l=255&i)),t(a,o,l))}function wn(n,t,e){var r,u,i=Math.min(n/=255,t/=255,e/=255),a=Math.max(n,t,e),o=a-i,l=(a+i)/2;return o?(u=.5>l?o/(a+i):o/(2-a-i),r=n==a?(t-e)/o+(e>t?6:0):t==a?(e-n)/o+2:(n-t)/o+4,r*=60):(r=NaN,u=l>0&&1>l?0:r),new ln(r,u,l)}function Sn(n,t,e){n=kn(n),t=kn(t),e=kn(e);var r=dn((.4124564*n+.3575761*t+.1804375*e)/Ka),u=dn((.2126729*n+.7151522*t+.072175*e)/Qa),i=dn((.0193339*n+.119192*t+.9503041*e)/no);return hn(116*u-16,500*(r-u),200*(u-i))}function kn(n){return(n/=255)<=.04045?n/12.92:Math.pow((n+.055)/1.055,2.4)}function Nn(n){var t=parseFloat(n);return\\\"%\\\"===n.charAt(n.length-1)?Math.round(2.55*t):t}function En(n){return\\\"function\\\"==typeof n?n:function(){return n}}function An(n){return function(t,e,r){return 2===arguments.length&&\\\"function\\\"==typeof e&&(r=e,e=null),Cn(t,e,n,r)}}function Cn(n,t,e,r){function u(){var n,t=l.status;if(!t&&Ln(l)||t>=200&&300>t||304===t){try{n=e.call(i,l)}catch(r){return void a.error.call(i,r)}a.load.call(i,n)}else a.error.call(i,l)}var i={},a=oa.dispatch(\\\"beforesend\\\",\\\"progress\\\",\\\"load\\\",\\\"error\\\"),o={},l=new XMLHttpRequest,c=null;return!this.XDomainRequest||\\\"withCredentials\\\"in l||!/^(http(s)?:)?\\\\/\\\\//.test(n)||(l=new XDomainRequest),\\\"onload\\\"in l?l.onload=l.onerror=u:l.onreadystatechange=function(){l.readyState>3&&u()},l.onprogress=function(n){var t=oa.event;oa.event=n;try{a.progress.call(i,l)}finally{oa.event=t}},i.header=function(n,t){return n=(n+\\\"\\\").toLowerCase(),arguments.length<2?o[n]:(null==t?delete o[n]:o[n]=t+\\\"\\\",i)},i.mimeType=function(n){return arguments.length?(t=null==n?null:n+\\\"\\\",i):t},i.responseType=function(n){return arguments.length?(c=n,i):c},i.response=function(n){return e=n,i},[\\\"get\\\",\\\"post\\\"].forEach(function(n){i[n]=function(){return i.send.apply(i,[n].concat(ca(arguments)))}}),i.send=function(e,r,u){if(2===arguments.length&&\\\"function\\\"==typeof r&&(u=r,r=null),l.open(e,n,!0),null==t||\\\"accept\\\"in o||(o.accept=t+\\\",*/*\\\"),l.setRequestHeader)for(var s in o)l.setRequestHeader(s,o[s]);return null!=t&&l.overrideMimeType&&l.overrideMimeType(t),null!=c&&(l.responseType=c),null!=u&&i.on(\\\"error\\\",u).on(\\\"load\\\",function(n){u(null,n)}),a.beforesend.call(i,l),l.send(null==r?null:r),i},i.abort=function(){return l.abort(),i},oa.rebind(i,a,\\\"on\\\"),null==r?i:i.get(zn(r))}function zn(n){return 1===n.length?function(t,e){n(null==t?e:null)}:n}function Ln(n){var t=n.responseType;return t&&\\\"text\\\"!==t?n.response:n.responseText}function qn(n,t,e){var r=arguments.length;2>r&&(t=0),3>r&&(e=Date.now());var u=e+t,i={c:n,t:u,n:null};return io?io.n=i:uo=i,io=i,ao||(oo=clearTimeout(oo),ao=1,lo(Tn)),i}function Tn(){var n=Rn(),t=Dn()-n;t>24?(isFinite(t)&&(clearTimeout(oo),oo=setTimeout(Tn,t)),ao=0):(ao=1,lo(Tn))}function Rn(){for(var n=Date.now(),t=uo;t;)n>=t.t&&t.c(n-t.t)&&(t.c=null),t=t.n;return n}function Dn(){for(var n,t=uo,e=1/0;t;)t.c?(t.t<e&&(e=t.t),t=(n=t).n):t=n?n.n=t.n:uo=t.n;return io=n,e}function Pn(n,t){return t-(n?Math.ceil(Math.log(n)/Math.LN10):1)}function jn(n,t){var e=Math.pow(10,3*Ma(8-t));return{scale:t>8?function(n){return n/e}:function(n){return n*e},symbol:n}}function Un(n){var t=n.decimal,e=n.thousands,r=n.grouping,u=n.currency,i=r&&e?function(n,t){for(var u=n.length,i=[],a=0,o=r[0],l=0;u>0&&o>0&&(l+o+1>t&&(o=Math.max(1,t-l)),i.push(n.substring(u-=o,u+o)),!((l+=o+1)>t));)o=r[a=(a+1)%r.length];return i.reverse().join(e)}:y;return function(n){var e=so.exec(n),r=e[1]||\\\" \\\",a=e[2]||\\\">\\\",o=e[3]||\\\"-\\\",l=e[4]||\\\"\\\",c=e[5],s=+e[6],f=e[7],h=e[8],g=e[9],p=1,v=\\\"\\\",d=\\\"\\\",m=!1,y=!0;switch(h&&(h=+h.substring(1)),(c||\\\"0\\\"===r&&\\\"=\\\"===a)&&(c=r=\\\"0\\\",a=\\\"=\\\"),g){case\\\"n\\\":f=!0,g=\\\"g\\\";break;case\\\"%\\\":p=100,d=\\\"%\\\",g=\\\"f\\\";break;case\\\"p\\\":p=100,d=\\\"%\\\",g=\\\"r\\\";break;case\\\"b\\\":case\\\"o\\\":case\\\"x\\\":case\\\"X\\\":\\\"#\\\"===l&&(v=\\\"0\\\"+g.toLowerCase());case\\\"c\\\":y=!1;case\\\"d\\\":m=!0,h=0;break;case\\\"s\\\":p=-1,g=\\\"r\\\"}\\\"$\\\"===l&&(v=u[0],d=u[1]),\\\"r\\\"!=g||h||(g=\\\"g\\\"),null!=h&&(\\\"g\\\"==g?h=Math.max(1,Math.min(21,h)):(\\\"e\\\"==g||\\\"f\\\"==g)&&(h=Math.max(0,Math.min(20,h)))),g=fo.get(g)||Fn;var M=c&&f;return function(n){var e=d;if(m&&n%1)return\\\"\\\";var u=0>n||0===n&&0>1/n?(n=-n,\\\"-\\\"):\\\"-\\\"===o?\\\"\\\":o;if(0>p){var l=oa.formatPrefix(n,h);n=l.scale(n),e=l.symbol+d}else n*=p;n=g(n,h);var x,b,_=n.lastIndexOf(\\\".\\\");if(0>_){var w=y?n.lastIndexOf(\\\"e\\\"):-1;0>w?(x=n,b=\\\"\\\"):(x=n.substring(0,w),b=n.substring(w))}else x=n.substring(0,_),b=t+n.substring(_+1);!c&&f&&(x=i(x,1/0));var S=v.length+x.length+b.length+(M?0:u.length),k=s>S?new Array(S=s-S+1).join(r):\\\"\\\";return M&&(x=i(k+x,k.length?s-b.length:1/0)),u+=v,n=x+b,(\\\"<\\\"===a?u+n+k:\\\">\\\"===a?k+u+n:\\\"^\\\"===a?k.substring(0,S>>=1)+u+n+k.substring(S):u+(M?n:k+n))+e}}}function Fn(n){return n+\\\"\\\"}function Hn(){this._=new Date(arguments.length>1?Date.UTC.apply(this,arguments):arguments[0])}function On(n,t,e){function r(t){var e=n(t),r=i(e,1);return r-t>t-e?e:r}function u(e){return t(e=n(new go(e-1)),1),e}function i(n,e){return t(n=new go(+n),e),n}function a(n,r,i){var a=u(n),o=[];if(i>1)for(;r>a;)e(a)%i||o.push(new Date(+a)),t(a,1);else for(;r>a;)o.push(new Date(+a)),t(a,1);return o}function o(n,t,e){try{go=Hn;var r=new Hn;return r._=n,a(r,t,e)}finally{go=Date}}n.floor=n,n.round=r,n.ceil=u,n.offset=i,n.range=a;var l=n.utc=In(n);return l.floor=l,l.round=In(r),l.ceil=In(u),l.offset=In(i),l.range=o,n}function In(n){return function(t,e){try{go=Hn;var r=new Hn;return r._=t,n(r,e)._}finally{go=Date}}}function Yn(n){function t(n){function t(t){for(var e,u,i,a=[],o=-1,l=0;++o<r;)37===n.charCodeAt(o)&&(a.push(n.slice(l,o)),null!=(u=vo[e=n.charAt(++o)])&&(e=n.charAt(++o)),(i=A[e])&&(e=i(t,null==u?\\\"e\\\"===e?\\\" \\\":\\\"0\\\":u)),a.push(e),l=o+1);return a.push(n.slice(l,o)),a.join(\\\"\\\")}var r=n.length;return t.parse=function(t){var r={y:1900,m:0,d:1,H:0,M:0,S:0,L:0,Z:null},u=e(r,n,t,0);if(u!=t.length)return null;\\\"p\\\"in r&&(r.H=r.H%12+12*r.p);var i=null!=r.Z&&go!==Hn,a=new(i?Hn:go);return\\\"j\\\"in r?a.setFullYear(r.y,0,r.j):\\\"W\\\"in r||\\\"U\\\"in r?(\\\"w\\\"in r||(r.w=\\\"W\\\"in r?1:0),a.setFullYear(r.y,0,1),a.setFullYear(r.y,0,\\\"W\\\"in r?(r.w+6)%7+7*r.W-(a.getDay()+5)%7:r.w+7*r.U-(a.getDay()+6)%7)):a.setFullYear(r.y,r.m,r.d),a.setHours(r.H+(r.Z/100|0),r.M+r.Z%100,r.S,r.L),i?a._:a},t.toString=function(){return n},t}function e(n,t,e,r){for(var u,i,a,o=0,l=t.length,c=e.length;l>o;){if(r>=c)return-1;if(u=t.charCodeAt(o++),37===u){if(a=t.charAt(o++),i=C[a in vo?t.charAt(o++):a],!i||(r=i(n,e,r))<0)return-1}else if(u!=e.charCodeAt(r++))return-1}return r}function r(n,t,e){_.lastIndex=0;var r=_.exec(t.slice(e));return r?(n.w=w.get(r[0].toLowerCase()),e+r[0].length):-1}function u(n,t,e){x.lastIndex=0;var r=x.exec(t.slice(e));return r?(n.w=b.get(r[0].toLowerCase()),e+r[0].length):-1}function i(n,t,e){N.lastIndex=0;var r=N.exec(t.slice(e));return r?(n.m=E.get(r[0].toLowerCase()),e+r[0].length):-1}function a(n,t,e){S.lastIndex=0;var r=S.exec(t.slice(e));return r?(n.m=k.get(r[0].toLowerCase()),e+r[0].length):-1}function o(n,t,r){return e(n,A.c.toString(),t,r)}function l(n,t,r){return e(n,A.x.toString(),t,r)}function c(n,t,r){return e(n,A.X.toString(),t,r)}function s(n,t,e){var r=M.get(t.slice(e,e+=2).toLowerCase());return null==r?-1:(n.p=r,e)}var f=n.dateTime,h=n.date,g=n.time,p=n.periods,v=n.days,d=n.shortDays,m=n.months,y=n.shortMonths;t.utc=function(n){function e(n){try{go=Hn;var t=new go;return t._=n,r(t)}finally{go=Date}}var r=t(n);return e.parse=function(n){try{go=Hn;var t=r.parse(n);return t&&t._}finally{go=Date}},e.toString=r.toString,e},t.multi=t.utc.multi=ct;var M=oa.map(),x=Vn(v),b=Xn(v),_=Vn(d),w=Xn(d),S=Vn(m),k=Xn(m),N=Vn(y),E=Xn(y);p.forEach(function(n,t){M.set(n.toLowerCase(),t)});var A={a:function(n){return d[n.getDay()]},A:function(n){return v[n.getDay()]},b:function(n){return y[n.getMonth()]},B:function(n){return m[n.getMonth()]},c:t(f),d:function(n,t){return Zn(n.getDate(),t,2)},e:function(n,t){return Zn(n.getDate(),t,2)},H:function(n,t){return Zn(n.getHours(),t,2)},I:function(n,t){return Zn(n.getHours()%12||12,t,2)},j:function(n,t){return Zn(1+ho.dayOfYear(n),t,3)},L:function(n,t){return Zn(n.getMilliseconds(),t,3)},m:function(n,t){return Zn(n.getMonth()+1,t,2)},M:function(n,t){return Zn(n.getMinutes(),t,2)},p:function(n){return p[+(n.getHours()>=12)]},S:function(n,t){return Zn(n.getSeconds(),t,2)},U:function(n,t){return Zn(ho.sundayOfYear(n),t,2)},w:function(n){return n.getDay()},W:function(n,t){return Zn(ho.mondayOfYear(n),t,2)},x:t(h),X:t(g),y:function(n,t){return Zn(n.getFullYear()%100,t,2)},Y:function(n,t){return Zn(n.getFullYear()%1e4,t,4)},Z:ot,\\\"%\\\":function(){return\\\"%\\\"}},C={a:r,A:u,b:i,B:a,c:o,d:tt,e:tt,H:rt,I:rt,j:et,L:at,m:nt,M:ut,p:s,S:it,U:Bn,w:$n,W:Wn,x:l,X:c,y:Gn,Y:Jn,Z:Kn,\\\"%\\\":lt};return t}function Zn(n,t,e){var r=0>n?\\\"-\\\":\\\"\\\",u=(r?-n:n)+\\\"\\\",i=u.length;return r+(e>i?new Array(e-i+1).join(t)+u:u)}function Vn(n){return new RegExp(\\\"^(?:\\\"+n.map(oa.requote).join(\\\"|\\\")+\\\")\\\",\\\"i\\\")}function Xn(n){for(var t=new c,e=-1,r=n.length;++e<r;)t.set(n[e].toLowerCase(),e);return t}function $n(n,t,e){mo.lastIndex=0;var r=mo.exec(t.slice(e,e+1));return r?(n.w=+r[0],e+r[0].length):-1}function Bn(n,t,e){mo.lastIndex=0;var r=mo.exec(t.slice(e));return r?(n.U=+r[0],e+r[0].length):-1}function Wn(n,t,e){mo.lastIndex=0;var r=mo.exec(t.slice(e));return r?(n.W=+r[0],e+r[0].length):-1}function Jn(n,t,e){mo.lastIndex=0;var r=mo.exec(t.slice(e,e+4));return r?(n.y=+r[0],e+r[0].length):-1}function Gn(n,t,e){mo.lastIndex=0;var r=mo.exec(t.slice(e,e+2));return r?(n.y=Qn(+r[0]),e+r[0].length):-1}function Kn(n,t,e){return/^[+-]\\\\d{4}$/.test(t=t.slice(e,e+5))?(n.Z=-t,e+5):-1}function Qn(n){return n+(n>68?1900:2e3)}function nt(n,t,e){mo.lastIndex=0;var r=mo.exec(t.slice(e,e+2));return r?(n.m=r[0]-1,e+r[0].length):-1}function tt(n,t,e){mo.lastIndex=0;var r=mo.exec(t.slice(e,e+2));return r?(n.d=+r[0],e+r[0].length):-1}function et(n,t,e){mo.lastIndex=0;var r=mo.exec(t.slice(e,e+3));return r?(n.j=+r[0],e+r[0].length):-1}function rt(n,t,e){mo.lastIndex=0;var r=mo.exec(t.slice(e,e+2));return r?(n.H=+r[0],e+r[0].length):-1}function ut(n,t,e){mo.lastIndex=0;var r=mo.exec(t.slice(e,e+2));return r?(n.M=+r[0],e+r[0].length):-1}function it(n,t,e){mo.lastIndex=0;var r=mo.exec(t.slice(e,e+2));return r?(n.S=+r[0],e+r[0].length):-1}function at(n,t,e){mo.lastIndex=0;var r=mo.exec(t.slice(e,e+3));return r?(n.L=+r[0],e+r[0].length):-1}function ot(n){var t=n.getTimezoneOffset(),e=t>0?\\\"-\\\":\\\"+\\\",r=Ma(t)/60|0,u=Ma(t)%60;return e+Zn(r,\\\"0\\\",2)+Zn(u,\\\"0\\\",2)}function lt(n,t,e){yo.lastIndex=0;var r=yo.exec(t.slice(e,e+1));return r?e+r[0].length:-1}function ct(n){for(var t=n.length,e=-1;++e<t;)n[e][0]=this(n[e][0]);return function(t){for(var e=0,r=n[e];!r[1](t);)r=n[++e];return r[0](t)}}function st(){}function ft(n,t,e){var r=e.s=n+t,u=r-n,i=r-u;e.t=n-i+(t-u)}function ht(n,t){n&&_o.hasOwnProperty(n.type)&&_o[n.type](n,t)}function gt(n,t,e){var r,u=-1,i=n.length-e;for(t.lineStart();++u<i;)r=n[u],t.point(r[0],r[1],r[2]);t.lineEnd()}function pt(n,t){var e=-1,r=n.length;for(t.polygonStart();++e<r;)gt(n[e],t,1);t.polygonEnd()}function vt(){function n(n,t){n*=Oa,t=t*Oa/2+ja/4;var e=n-r,a=e>=0?1:-1,o=a*e,l=Math.cos(t),c=Math.sin(t),s=i*c,f=u*l+s*Math.cos(o),h=s*a*Math.sin(o);So.add(Math.atan2(h,f)),r=n,u=l,i=c}var t,e,r,u,i;ko.point=function(a,o){ko.point=n,r=(t=a)*Oa,u=Math.cos(o=(e=o)*Oa/2+ja/4),i=Math.sin(o)},ko.lineEnd=function(){n(t,e)}}function dt(n){var t=n[0],e=n[1],r=Math.cos(e);return[r*Math.cos(t),r*Math.sin(t),Math.sin(e)]}function mt(n,t){return n[0]*t[0]+n[1]*t[1]+n[2]*t[2]}function yt(n,t){return[n[1]*t[2]-n[2]*t[1],n[2]*t[0]-n[0]*t[2],n[0]*t[1]-n[1]*t[0]]}function Mt(n,t){n[0]+=t[0],n[1]+=t[1],n[2]+=t[2]}function xt(n,t){return[n[0]*t,n[1]*t,n[2]*t]}function bt(n){var t=Math.sqrt(n[0]*n[0]+n[1]*n[1]+n[2]*n[2]);n[0]/=t,n[1]/=t,n[2]/=t}function _t(n){return[Math.atan2(n[1],n[0]),tn(n[2])]}function wt(n,t){return Ma(n[0]-t[0])<Da&&Ma(n[1]-t[1])<Da}function St(n,t){n*=Oa;var e=Math.cos(t*=Oa);kt(e*Math.cos(n),e*Math.sin(n),Math.sin(t))}function kt(n,t,e){++No,Ao+=(n-Ao)/No,Co+=(t-Co)/No,zo+=(e-zo)/No}function Nt(){function n(n,u){n*=Oa;var i=Math.cos(u*=Oa),a=i*Math.cos(n),o=i*Math.sin(n),l=Math.sin(u),c=Math.atan2(Math.sqrt((c=e*l-r*o)*c+(c=r*a-t*l)*c+(c=t*o-e*a)*c),t*a+e*o+r*l);Eo+=c,Lo+=c*(t+(t=a)),qo+=c*(e+(e=o)),To+=c*(r+(r=l)),kt(t,e,r)}var t,e,r;jo.point=function(u,i){u*=Oa;var a=Math.cos(i*=Oa);t=a*Math.cos(u),e=a*Math.sin(u),r=Math.sin(i),jo.point=n,kt(t,e,r)}}function Et(){jo.point=St}function At(){function n(n,t){n*=Oa;var e=Math.cos(t*=Oa),a=e*Math.cos(n),o=e*Math.sin(n),l=Math.sin(t),c=u*l-i*o,s=i*a-r*l,f=r*o-u*a,h=Math.sqrt(c*c+s*s+f*f),g=r*a+u*o+i*l,p=h&&-nn(g)/h,v=Math.atan2(h,g);Ro+=p*c,Do+=p*s,Po+=p*f,Eo+=v,Lo+=v*(r+(r=a)),qo+=v*(u+(u=o)),To+=v*(i+(i=l)),kt(r,u,i)}var t,e,r,u,i;jo.point=function(a,o){t=a,e=o,jo.point=n,a*=Oa;var l=Math.cos(o*=Oa);r=l*Math.cos(a),u=l*Math.sin(a),i=Math.sin(o),kt(r,u,i)},jo.lineEnd=function(){n(t,e),jo.lineEnd=Et,jo.point=St}}function Ct(n,t){function e(e,r){return e=n(e,r),t(e[0],e[1])}return n.invert&&t.invert&&(e.invert=function(e,r){return e=t.invert(e,r),e&&n.invert(e[0],e[1])}),e}function zt(){return!0}function Lt(n,t,e,r,u){var i=[],a=[];if(n.forEach(function(n){if(!((t=n.length-1)<=0)){var t,e=n[0],r=n[t];if(wt(e,r)){u.lineStart();for(var o=0;t>o;++o)u.point((e=n[o])[0],e[1]);return void u.lineEnd()}var l=new Tt(e,n,null,!0),c=new Tt(e,null,l,!1);l.o=c,i.push(l),a.push(c),l=new Tt(r,n,null,!1),c=new Tt(r,null,l,!0),l.o=c,i.push(l),a.push(c)}}),a.sort(t),qt(i),qt(a),i.length){for(var o=0,l=e,c=a.length;c>o;++o)a[o].e=l=!l;for(var s,f,h=i[0];;){for(var g=h,p=!0;g.v;)if((g=g.n)===h)return;s=g.z,u.lineStart();do{if(g.v=g.o.v=!0,g.e){if(p)for(var o=0,c=s.length;c>o;++o)u.point((f=s[o])[0],f[1]);else r(g.x,g.n.x,1,u);g=g.n}else{if(p){s=g.p.z;for(var o=s.length-1;o>=0;--o)u.point((f=s[o])[0],f[1])}else r(g.x,g.p.x,-1,u);g=g.p}g=g.o,s=g.z,p=!p}while(!g.v);u.lineEnd()}}}function qt(n){if(t=n.length){for(var t,e,r=0,u=n[0];++r<t;)u.n=e=n[r],e.p=u,u=e;u.n=e=n[0],e.p=u}}function Tt(n,t,e,r){this.x=n,this.z=t,this.o=e,this.e=r,this.v=!1,this.n=this.p=null}function Rt(n,t,e,r){return function(u,i){function a(t,e){var r=u(t,e);n(t=r[0],e=r[1])&&i.point(t,e)}function o(n,t){var e=u(n,t);d.point(e[0],e[1])}function l(){y.point=o,d.lineStart()}function c(){y.point=a,d.lineEnd()}function s(n,t){v.push([n,t]);var e=u(n,t);x.point(e[0],e[1])}function f(){x.lineStart(),v=[]}function h(){s(v[0][0],v[0][1]),x.lineEnd();var n,t=x.clean(),e=M.buffer(),r=e.length;if(v.pop(),p.push(v),v=null,r)if(1&t){n=e[0];var u,r=n.length-1,a=-1;if(r>0){for(b||(i.polygonStart(),b=!0),i.lineStart();++a<r;)i.point((u=n[a])[0],u[1]);i.lineEnd()}}else r>1&&2&t&&e.push(e.pop().concat(e.shift())),g.push(e.filter(Dt))}var g,p,v,d=t(i),m=u.invert(r[0],r[1]),y={point:a,lineStart:l,lineEnd:c,polygonStart:function(){y.point=s,y.lineStart=f,y.lineEnd=h,g=[],p=[]},polygonEnd:function(){y.point=a,y.lineStart=l,y.lineEnd=c,g=oa.merge(g);var n=Ot(m,p);g.length?(b||(i.polygonStart(),b=!0),Lt(g,jt,n,e,i)):n&&(b||(i.polygonStart(),b=!0),i.lineStart(),e(null,null,1,i),i.lineEnd()),b&&(i.polygonEnd(),b=!1),g=p=null},sphere:function(){i.polygonStart(),i.lineStart(),e(null,null,1,i),i.lineEnd(),i.polygonEnd()}},M=Pt(),x=t(M),b=!1;return y}}function Dt(n){return n.length>1}function Pt(){var n,t=[];return{lineStart:function(){t.push(n=[])},point:function(t,e){n.push([t,e])},lineEnd:b,buffer:function(){var e=t;return t=[],n=null,e},rejoin:function(){t.length>1&&t.push(t.pop().concat(t.shift()))}}}function jt(n,t){return((n=n.x)[0]<0?n[1]-Ha-Da:Ha-n[1])-((t=t.x)[0]<0?t[1]-Ha-Da:Ha-t[1])}function Ut(n){var t,e=NaN,r=NaN,u=NaN;return{lineStart:function(){n.lineStart(),t=1},point:function(i,a){var o=i>0?ja:-ja,l=Ma(i-e);Ma(l-ja)<Da?(n.point(e,r=(r+a)/2>0?Ha:-Ha),n.point(u,r),n.lineEnd(),n.lineStart(),n.point(o,r),n.point(i,r),t=0):u!==o&&l>=ja&&(Ma(e-u)<Da&&(e-=u*Da),Ma(i-o)<Da&&(i-=o*Da),r=Ft(e,r,i,a),n.point(u,r),n.lineEnd(),n.lineStart(),n.point(o,r),t=0),n.point(e=i,r=a),u=o},lineEnd:function(){n.lineEnd(),e=r=NaN},clean:function(){return 2-t}}}function Ft(n,t,e,r){var u,i,a=Math.sin(n-e);return Ma(a)>Da?Math.atan((Math.sin(t)*(i=Math.cos(r))*Math.sin(e)-Math.sin(r)*(u=Math.cos(t))*Math.sin(n))/(u*i*a)):(t+r)/2}function Ht(n,t,e,r){var u;if(null==n)u=e*Ha,r.point(-ja,u),r.point(0,u),r.point(ja,u),r.point(ja,0),r.point(ja,-u),r.point(0,-u),r.point(-ja,-u),r.point(-ja,0),r.point(-ja,u);else if(Ma(n[0]-t[0])>Da){var i=n[0]<t[0]?ja:-ja;u=e*i/2,r.point(-i,u),r.point(0,u),r.point(i,u)}else r.point(t[0],t[1])}function Ot(n,t){var e=n[0],r=n[1],u=[Math.sin(e),-Math.cos(e),0],i=0,a=0;So.reset();for(var o=0,l=t.length;l>o;++o){var c=t[o],s=c.length;if(s)for(var f=c[0],h=f[0],g=f[1]/2+ja/4,p=Math.sin(g),v=Math.cos(g),d=1;;){d===s&&(d=0),n=c[d];var m=n[0],y=n[1]/2+ja/4,M=Math.sin(y),x=Math.cos(y),b=m-h,_=b>=0?1:-1,w=_*b,S=w>ja,k=p*M;if(So.add(Math.atan2(k*_*Math.sin(w),v*x+k*Math.cos(w))),i+=S?b+_*Ua:b,S^h>=e^m>=e){var N=yt(dt(f),dt(n));bt(N);var E=yt(u,N);bt(E);var A=(S^b>=0?-1:1)*tn(E[2]);(r>A||r===A&&(N[0]||N[1]))&&(a+=S^b>=0?1:-1)}if(!d++)break;h=m,p=M,v=x,f=n}}return(-Da>i||Da>i&&0>So)^1&a}function It(n){function t(n,t){return Math.cos(n)*Math.cos(t)>i}function e(n){var e,i,l,c,s;return{lineStart:function(){c=l=!1,s=1},point:function(f,h){var g,p=[f,h],v=t(f,h),d=a?v?0:u(f,h):v?u(f+(0>f?ja:-ja),h):0;if(!e&&(c=l=v)&&n.lineStart(),v!==l&&(g=r(e,p),(wt(e,g)||wt(p,g))&&(p[0]+=Da,p[1]+=Da,v=t(p[0],p[1]))),v!==l)s=0,v?(n.lineStart(),g=r(p,e),n.point(g[0],g[1])):(g=r(e,p),n.point(g[0],g[1]),n.lineEnd()),e=g;else if(o&&e&&a^v){var m;d&i||!(m=r(p,e,!0))||(s=0,a?(n.lineStart(),n.point(m[0][0],m[0][1]),n.point(m[1][0],m[1][1]),n.lineEnd()):(n.point(m[1][0],m[1][1]),n.lineEnd(),n.lineStart(),n.point(m[0][0],m[0][1])))}!v||e&&wt(e,p)||n.point(p[0],p[1]),e=p,l=v,i=d},lineEnd:function(){l&&n.lineEnd(),e=null},clean:function(){return s|(c&&l)<<1}}}function r(n,t,e){var r=dt(n),u=dt(t),a=[1,0,0],o=yt(r,u),l=mt(o,o),c=o[0],s=l-c*c;if(!s)return!e&&n;var f=i*l/s,h=-i*c/s,g=yt(a,o),p=xt(a,f),v=xt(o,h);Mt(p,v);var d=g,m=mt(p,d),y=mt(d,d),M=m*m-y*(mt(p,p)-1);if(!(0>M)){var x=Math.sqrt(M),b=xt(d,(-m-x)/y);if(Mt(b,p),b=_t(b),!e)return b;var _,w=n[0],S=t[0],k=n[1],N=t[1];w>S&&(_=w,w=S,S=_);var E=S-w,A=Ma(E-ja)<Da,C=A||Da>E;if(!A&&k>N&&(_=k,k=N,N=_),C?A?k+N>0^b[1]<(Ma(b[0]-w)<Da?k:N):k<=b[1]&&b[1]<=N:E>ja^(w<=b[0]&&b[0]<=S)){var z=xt(d,(-m+x)/y);return Mt(z,p),[b,_t(z)]}}}function u(t,e){var r=a?n:ja-n,u=0;return-r>t?u|=1:t>r&&(u|=2),-r>e?u|=4:e>r&&(u|=8),u}var i=Math.cos(n),a=i>0,o=Ma(i)>Da,l=ve(n,6*Oa);return Rt(t,e,l,a?[0,-n]:[-ja,n-ja])}function Yt(n,t,e,r){return function(u){var i,a=u.a,o=u.b,l=a.x,c=a.y,s=o.x,f=o.y,h=0,g=1,p=s-l,v=f-c;if(i=n-l,p||!(i>0)){if(i/=p,0>p){if(h>i)return;g>i&&(g=i)}else if(p>0){if(i>g)return;i>h&&(h=i)}if(i=e-l,p||!(0>i)){if(i/=p,0>p){if(i>g)return;i>h&&(h=i)}else if(p>0){if(h>i)return;g>i&&(g=i)}if(i=t-c,v||!(i>0)){if(i/=v,0>v){if(h>i)return;g>i&&(g=i)}else if(v>0){if(i>g)return;i>h&&(h=i)}if(i=r-c,v||!(0>i)){if(i/=v,0>v){if(i>g)return;i>h&&(h=i)}else if(v>0){if(h>i)return;g>i&&(g=i)}return h>0&&(u.a={x:l+h*p,y:c+h*v}),1>g&&(u.b={x:l+g*p,y:c+g*v}),u}}}}}}function Zt(n,t,e,r){function u(r,u){return Ma(r[0]-n)<Da?u>0?0:3:Ma(r[0]-e)<Da?u>0?2:1:Ma(r[1]-t)<Da?u>0?1:0:u>0?3:2}function i(n,t){return a(n.x,t.x)}function a(n,t){var e=u(n,1),r=u(t,1);return e!==r?e-r:0===e?t[1]-n[1]:1===e?n[0]-t[0]:2===e?n[1]-t[1]:t[0]-n[0]}return function(o){function l(n){for(var t=0,e=d.length,r=n[1],u=0;e>u;++u)for(var i,a=1,o=d[u],l=o.length,c=o[0];l>a;++a)i=o[a],c[1]<=r?i[1]>r&&Q(c,i,n)>0&&++t:i[1]<=r&&Q(c,i,n)<0&&--t,c=i;return 0!==t}function c(i,o,l,c){var s=0,f=0;if(null==i||(s=u(i,l))!==(f=u(o,l))||a(i,o)<0^l>0){do c.point(0===s||3===s?n:e,s>1?r:t);while((s=(s+l+4)%4)!==f)}else c.point(o[0],o[1])}function s(u,i){return u>=n&&e>=u&&i>=t&&r>=i}function f(n,t){s(n,t)&&o.point(n,t)}function h(){C.point=p,d&&d.push(m=[]),S=!0,w=!1,b=_=NaN}function g(){v&&(p(y,M),x&&w&&E.rejoin(),v.push(E.buffer())),C.point=f,w&&o.lineEnd()}function p(n,t){n=Math.max(-Fo,Math.min(Fo,n)),t=Math.max(-Fo,Math.min(Fo,t));var e=s(n,t);if(d&&m.push([n,t]),S)y=n,M=t,x=e,S=!1,e&&(o.lineStart(),o.point(n,t));else if(e&&w)o.point(n,t);else{var r={a:{x:b,y:_},b:{x:n,y:t}};A(r)?(w||(o.lineStart(),o.point(r.a.x,r.a.y)),o.point(r.b.x,r.b.y),e||o.lineEnd(),k=!1):e&&(o.lineStart(),o.point(n,t),k=!1)}b=n,_=t,w=e}var v,d,m,y,M,x,b,_,w,S,k,N=o,E=Pt(),A=Yt(n,t,e,r),C={point:f,lineStart:h,lineEnd:g,polygonStart:function(){o=E,v=[],d=[],k=!0},polygonEnd:function(){o=N,v=oa.merge(v);var t=l([n,r]),e=k&&t,u=v.length;(e||u)&&(o.polygonStart(),e&&(o.lineStart(),c(null,null,1,o),o.lineEnd()),u&&Lt(v,i,t,c,o),o.polygonEnd()),v=d=m=null}};return C}}function Vt(n){var t=0,e=ja/3,r=oe(n),u=r(t,e);return u.parallels=function(n){return arguments.length?r(t=n[0]*ja/180,e=n[1]*ja/180):[t/ja*180,e/ja*180]},u}function Xt(n,t){function e(n,t){var e=Math.sqrt(i-2*u*Math.sin(t))/u;return[e*Math.sin(n*=u),a-e*Math.cos(n)]}var r=Math.sin(n),u=(r+Math.sin(t))/2,i=1+r*(2*u-r),a=Math.sqrt(i)/u;return e.invert=function(n,t){var e=a-t;return[Math.atan2(n,e)/u,tn((i-(n*n+e*e)*u*u)/(2*u))]},e}function $t(){function n(n,t){Oo+=u*n-r*t,r=n,u=t}var t,e,r,u;Xo.point=function(i,a){Xo.point=n,t=r=i,e=u=a},Xo.lineEnd=function(){n(t,e)}}function Bt(n,t){Io>n&&(Io=n),n>Zo&&(Zo=n),Yo>t&&(Yo=t),t>Vo&&(Vo=t)}function Wt(){function n(n,t){a.push(\\\"M\\\",n,\\\",\\\",t,i)}function t(n,t){a.push(\\\"M\\\",n,\\\",\\\",t),o.point=e}function e(n,t){a.push(\\\"L\\\",n,\\\",\\\",t)}function r(){o.point=n}function u(){a.push(\\\"Z\\\")}var i=Jt(4.5),a=[],o={point:n,lineStart:function(){o.point=t},lineEnd:r,polygonStart:function(){o.lineEnd=u},polygonEnd:function(){o.lineEnd=r,o.point=n},pointRadius:function(n){return i=Jt(n),o},result:function(){if(a.length){var n=a.join(\\\"\\\");return a=[],n}}};return o}function Jt(n){return\\\"m0,\\\"+n+\\\"a\\\"+n+\\\",\\\"+n+\\\" 0 1,1 0,\\\"+-2*n+\\\"a\\\"+n+\\\",\\\"+n+\\\" 0 1,1 0,\\\"+2*n+\\\"z\\\"}function Gt(n,t){Ao+=n,Co+=t,++zo}function Kt(){function n(n,r){var u=n-t,i=r-e,a=Math.sqrt(u*u+i*i);Lo+=a*(t+n)/2,qo+=a*(e+r)/2,To+=a,Gt(t=n,e=r)}var t,e;Bo.point=function(r,u){Bo.point=n,Gt(t=r,e=u)}}function Qt(){Bo.point=Gt}function ne(){function n(n,t){var e=n-r,i=t-u,a=Math.sqrt(e*e+i*i);Lo+=a*(r+n)/2,qo+=a*(u+t)/2,To+=a,a=u*n-r*t,Ro+=a*(r+n),Do+=a*(u+t),Po+=3*a,Gt(r=n,u=t)}var t,e,r,u;Bo.point=function(i,a){Bo.point=n,Gt(t=r=i,e=u=a)},Bo.lineEnd=function(){n(t,e)}}function te(n){function t(t,e){n.moveTo(t+a,e),n.arc(t,e,a,0,Ua)}function e(t,e){n.moveTo(t,e),o.point=r}function r(t,e){n.lineTo(t,e)}function u(){o.point=t}function i(){n.closePath()}var a=4.5,o={point:t,lineStart:function(){o.point=e},lineEnd:u,polygonStart:function(){o.lineEnd=i},polygonEnd:function(){o.lineEnd=u,o.point=t},pointRadius:function(n){return a=n,o},result:b};return o}function ee(n){function t(n){return(o?r:e)(n)}function e(t){return ie(t,function(e,r){e=n(e,r),t.point(e[0],e[1])})}function r(t){function e(e,r){e=n(e,r),t.point(e[0],e[1])}function r(){M=NaN,S.point=i,t.lineStart()}function i(e,r){var i=dt([e,r]),a=n(e,r);u(M,x,y,b,_,w,M=a[0],x=a[1],y=e,b=i[0],_=i[1],w=i[2],o,t),t.point(M,x)}function a(){S.point=e,t.lineEnd()}function l(){r(),S.point=c,S.lineEnd=s}function c(n,t){\\n i(f=n,h=t),g=M,p=x,v=b,d=_,m=w,S.point=i}function s(){u(M,x,y,b,_,w,g,p,f,v,d,m,o,t),S.lineEnd=a,a()}var f,h,g,p,v,d,m,y,M,x,b,_,w,S={point:e,lineStart:r,lineEnd:a,polygonStart:function(){t.polygonStart(),S.lineStart=l},polygonEnd:function(){t.polygonEnd(),S.lineStart=r}};return S}function u(t,e,r,o,l,c,s,f,h,g,p,v,d,m){var y=s-t,M=f-e,x=y*y+M*M;if(x>4*i&&d--){var b=o+g,_=l+p,w=c+v,S=Math.sqrt(b*b+_*_+w*w),k=Math.asin(w/=S),N=Ma(Ma(w)-1)<Da||Ma(r-h)<Da?(r+h)/2:Math.atan2(_,b),E=n(N,k),A=E[0],C=E[1],z=A-t,L=C-e,q=M*z-y*L;(q*q/x>i||Ma((y*z+M*L)/x-.5)>.3||a>o*g+l*p+c*v)&&(u(t,e,r,o,l,c,A,C,N,b/=S,_/=S,w,d,m),m.point(A,C),u(A,C,N,b,_,w,s,f,h,g,p,v,d,m))}}var i=.5,a=Math.cos(30*Oa),o=16;return t.precision=function(n){return arguments.length?(o=(i=n*n)>0&&16,t):Math.sqrt(i)},t}function re(n){var t=ee(function(t,e){return n([t*Ia,e*Ia])});return function(n){return le(t(n))}}function ue(n){this.stream=n}function ie(n,t){return{point:t,sphere:function(){n.sphere()},lineStart:function(){n.lineStart()},lineEnd:function(){n.lineEnd()},polygonStart:function(){n.polygonStart()},polygonEnd:function(){n.polygonEnd()}}}function ae(n){return oe(function(){return n})()}function oe(n){function t(n){return n=o(n[0]*Oa,n[1]*Oa),[n[0]*h+l,c-n[1]*h]}function e(n){return n=o.invert((n[0]-l)/h,(c-n[1])/h),n&&[n[0]*Ia,n[1]*Ia]}function r(){o=Ct(a=fe(m,M,x),i);var n=i(v,d);return l=g-n[0]*h,c=p+n[1]*h,u()}function u(){return s&&(s.valid=!1,s=null),t}var i,a,o,l,c,s,f=ee(function(n,t){return n=i(n,t),[n[0]*h+l,c-n[1]*h]}),h=150,g=480,p=250,v=0,d=0,m=0,M=0,x=0,b=Uo,_=y,w=null,S=null;return t.stream=function(n){return s&&(s.valid=!1),s=le(b(a,f(_(n)))),s.valid=!0,s},t.clipAngle=function(n){return arguments.length?(b=null==n?(w=n,Uo):It((w=+n)*Oa),u()):w},t.clipExtent=function(n){return arguments.length?(S=n,_=n?Zt(n[0][0],n[0][1],n[1][0],n[1][1]):y,u()):S},t.scale=function(n){return arguments.length?(h=+n,r()):h},t.translate=function(n){return arguments.length?(g=+n[0],p=+n[1],r()):[g,p]},t.center=function(n){return arguments.length?(v=n[0]%360*Oa,d=n[1]%360*Oa,r()):[v*Ia,d*Ia]},t.rotate=function(n){return arguments.length?(m=n[0]%360*Oa,M=n[1]%360*Oa,x=n.length>2?n[2]%360*Oa:0,r()):[m*Ia,M*Ia,x*Ia]},oa.rebind(t,f,\\\"precision\\\"),function(){return i=n.apply(this,arguments),t.invert=i.invert&&e,r()}}function le(n){return ie(n,function(t,e){n.point(t*Oa,e*Oa)})}function ce(n,t){return[n,t]}function se(n,t){return[n>ja?n-Ua:-ja>n?n+Ua:n,t]}function fe(n,t,e){return n?t||e?Ct(ge(n),pe(t,e)):ge(n):t||e?pe(t,e):se}function he(n){return function(t,e){return t+=n,[t>ja?t-Ua:-ja>t?t+Ua:t,e]}}function ge(n){var t=he(n);return t.invert=he(-n),t}function pe(n,t){function e(n,t){var e=Math.cos(t),o=Math.cos(n)*e,l=Math.sin(n)*e,c=Math.sin(t),s=c*r+o*u;return[Math.atan2(l*i-s*a,o*r-c*u),tn(s*i+l*a)]}var r=Math.cos(n),u=Math.sin(n),i=Math.cos(t),a=Math.sin(t);return e.invert=function(n,t){var e=Math.cos(t),o=Math.cos(n)*e,l=Math.sin(n)*e,c=Math.sin(t),s=c*i-l*a;return[Math.atan2(l*i+c*a,o*r+s*u),tn(s*r-o*u)]},e}function ve(n,t){var e=Math.cos(n),r=Math.sin(n);return function(u,i,a,o){var l=a*t;null!=u?(u=de(e,u),i=de(e,i),(a>0?i>u:u>i)&&(u+=a*Ua)):(u=n+a*Ua,i=n-.5*l);for(var c,s=u;a>0?s>i:i>s;s-=l)o.point((c=_t([e,-r*Math.cos(s),-r*Math.sin(s)]))[0],c[1])}}function de(n,t){var e=dt(t);e[0]-=n,bt(e);var r=nn(-e[1]);return((-e[2]<0?-r:r)+2*Math.PI-Da)%(2*Math.PI)}function me(n,t,e){var r=oa.range(n,t-Da,e).concat(t);return function(n){return r.map(function(t){return[n,t]})}}function ye(n,t,e){var r=oa.range(n,t-Da,e).concat(t);return function(n){return r.map(function(t){return[t,n]})}}function Me(n){return n.source}function xe(n){return n.target}function be(n,t,e,r){var u=Math.cos(t),i=Math.sin(t),a=Math.cos(r),o=Math.sin(r),l=u*Math.cos(n),c=u*Math.sin(n),s=a*Math.cos(e),f=a*Math.sin(e),h=2*Math.asin(Math.sqrt(an(r-t)+u*a*an(e-n))),g=1/Math.sin(h),p=h?function(n){var t=Math.sin(n*=h)*g,e=Math.sin(h-n)*g,r=e*l+t*s,u=e*c+t*f,a=e*i+t*o;return[Math.atan2(u,r)*Ia,Math.atan2(a,Math.sqrt(r*r+u*u))*Ia]}:function(){return[n*Ia,t*Ia]};return p.distance=h,p}function _e(){function n(n,u){var i=Math.sin(u*=Oa),a=Math.cos(u),o=Ma((n*=Oa)-t),l=Math.cos(o);Wo+=Math.atan2(Math.sqrt((o=a*Math.sin(o))*o+(o=r*i-e*a*l)*o),e*i+r*a*l),t=n,e=i,r=a}var t,e,r;Jo.point=function(u,i){t=u*Oa,e=Math.sin(i*=Oa),r=Math.cos(i),Jo.point=n},Jo.lineEnd=function(){Jo.point=Jo.lineEnd=b}}function we(n,t){function e(t,e){var r=Math.cos(t),u=Math.cos(e),i=n(r*u);return[i*u*Math.sin(t),i*Math.sin(e)]}return e.invert=function(n,e){var r=Math.sqrt(n*n+e*e),u=t(r),i=Math.sin(u),a=Math.cos(u);return[Math.atan2(n*i,r*a),Math.asin(r&&e*i/r)]},e}function Se(n,t){function e(n,t){a>0?-Ha+Da>t&&(t=-Ha+Da):t>Ha-Da&&(t=Ha-Da);var e=a/Math.pow(u(t),i);return[e*Math.sin(i*n),a-e*Math.cos(i*n)]}var r=Math.cos(n),u=function(n){return Math.tan(ja/4+n/2)},i=n===t?Math.sin(n):Math.log(r/Math.cos(t))/Math.log(u(t)/u(n)),a=r*Math.pow(u(n),i)/i;return i?(e.invert=function(n,t){var e=a-t,r=K(i)*Math.sqrt(n*n+e*e);return[Math.atan2(n,e)/i,2*Math.atan(Math.pow(a/r,1/i))-Ha]},e):Ne}function ke(n,t){function e(n,t){var e=i-t;return[e*Math.sin(u*n),i-e*Math.cos(u*n)]}var r=Math.cos(n),u=n===t?Math.sin(n):(r-Math.cos(t))/(t-n),i=r/u+n;return Ma(u)<Da?ce:(e.invert=function(n,t){var e=i-t;return[Math.atan2(n,e)/u,i-K(u)*Math.sqrt(n*n+e*e)]},e)}function Ne(n,t){return[n,Math.log(Math.tan(ja/4+t/2))]}function Ee(n){var t,e=ae(n),r=e.scale,u=e.translate,i=e.clipExtent;return e.scale=function(){var n=r.apply(e,arguments);return n===e?t?e.clipExtent(null):e:n},e.translate=function(){var n=u.apply(e,arguments);return n===e?t?e.clipExtent(null):e:n},e.clipExtent=function(n){var a=i.apply(e,arguments);if(a===e){if(t=null==n){var o=ja*r(),l=u();i([[l[0]-o,l[1]-o],[l[0]+o,l[1]+o]])}}else t&&(a=null);return a},e.clipExtent(null)}function Ae(n,t){return[Math.log(Math.tan(ja/4+t/2)),-n]}function Ce(n){return n[0]}function ze(n){return n[1]}function Le(n){for(var t=n.length,e=[0,1],r=2,u=2;t>u;u++){for(;r>1&&Q(n[e[r-2]],n[e[r-1]],n[u])<=0;)--r;e[r++]=u}return e.slice(0,r)}function qe(n,t){return n[0]-t[0]||n[1]-t[1]}function Te(n,t,e){return(e[0]-t[0])*(n[1]-t[1])<(e[1]-t[1])*(n[0]-t[0])}function Re(n,t,e,r){var u=n[0],i=e[0],a=t[0]-u,o=r[0]-i,l=n[1],c=e[1],s=t[1]-l,f=r[1]-c,h=(o*(l-c)-f*(u-i))/(f*a-o*s);return[u+h*a,l+h*s]}function De(n){var t=n[0],e=n[n.length-1];return!(t[0]-e[0]||t[1]-e[1])}function Pe(){rr(this),this.edge=this.site=this.circle=null}function je(n){var t=ll.pop()||new Pe;return t.site=n,t}function Ue(n){Be(n),il.remove(n),ll.push(n),rr(n)}function Fe(n){var t=n.circle,e=t.x,r=t.cy,u={x:e,y:r},i=n.P,a=n.N,o=[n];Ue(n);for(var l=i;l.circle&&Ma(e-l.circle.x)<Da&&Ma(r-l.circle.cy)<Da;)i=l.P,o.unshift(l),Ue(l),l=i;o.unshift(l),Be(l);for(var c=a;c.circle&&Ma(e-c.circle.x)<Da&&Ma(r-c.circle.cy)<Da;)a=c.N,o.push(c),Ue(c),c=a;o.push(c),Be(c);var s,f=o.length;for(s=1;f>s;++s)c=o[s],l=o[s-1],nr(c.edge,l.site,c.site,u);l=o[0],c=o[f-1],c.edge=Ke(l.site,c.site,null,u),$e(l),$e(c)}function He(n){for(var t,e,r,u,i=n.x,a=n.y,o=il._;o;)if(r=Oe(o,a)-i,r>Da)o=o.L;else{if(u=i-Ie(o,a),!(u>Da)){r>-Da?(t=o.P,e=o):u>-Da?(t=o,e=o.N):t=e=o;break}if(!o.R){t=o;break}o=o.R}var l=je(n);if(il.insert(t,l),t||e){if(t===e)return Be(t),e=je(t.site),il.insert(l,e),l.edge=e.edge=Ke(t.site,l.site),$e(t),void $e(e);if(!e)return void(l.edge=Ke(t.site,l.site));Be(t),Be(e);var c=t.site,s=c.x,f=c.y,h=n.x-s,g=n.y-f,p=e.site,v=p.x-s,d=p.y-f,m=2*(h*d-g*v),y=h*h+g*g,M=v*v+d*d,x={x:(d*y-g*M)/m+s,y:(h*M-v*y)/m+f};nr(e.edge,c,p,x),l.edge=Ke(c,n,null,x),e.edge=Ke(n,p,null,x),$e(t),$e(e)}}function Oe(n,t){var e=n.site,r=e.x,u=e.y,i=u-t;if(!i)return r;var a=n.P;if(!a)return-(1/0);e=a.site;var o=e.x,l=e.y,c=l-t;if(!c)return o;var s=o-r,f=1/i-1/c,h=s/c;return f?(-h+Math.sqrt(h*h-2*f*(s*s/(-2*c)-l+c/2+u-i/2)))/f+r:(r+o)/2}function Ie(n,t){var e=n.N;if(e)return Oe(e,t);var r=n.site;return r.y===t?r.x:1/0}function Ye(n){this.site=n,this.edges=[]}function Ze(n){for(var t,e,r,u,i,a,o,l,c,s,f=n[0][0],h=n[1][0],g=n[0][1],p=n[1][1],v=ul,d=v.length;d--;)if(i=v[d],i&&i.prepare())for(o=i.edges,l=o.length,a=0;l>a;)s=o[a].end(),r=s.x,u=s.y,c=o[++a%l].start(),t=c.x,e=c.y,(Ma(r-t)>Da||Ma(u-e)>Da)&&(o.splice(a,0,new tr(Qe(i.site,s,Ma(r-f)<Da&&p-u>Da?{x:f,y:Ma(t-f)<Da?e:p}:Ma(u-p)<Da&&h-r>Da?{x:Ma(e-p)<Da?t:h,y:p}:Ma(r-h)<Da&&u-g>Da?{x:h,y:Ma(t-h)<Da?e:g}:Ma(u-g)<Da&&r-f>Da?{x:Ma(e-g)<Da?t:f,y:g}:null),i.site,null)),++l)}function Ve(n,t){return t.angle-n.angle}function Xe(){rr(this),this.x=this.y=this.arc=this.site=this.cy=null}function $e(n){var t=n.P,e=n.N;if(t&&e){var r=t.site,u=n.site,i=e.site;if(r!==i){var a=u.x,o=u.y,l=r.x-a,c=r.y-o,s=i.x-a,f=i.y-o,h=2*(l*f-c*s);if(!(h>=-Pa)){var g=l*l+c*c,p=s*s+f*f,v=(f*g-c*p)/h,d=(l*p-s*g)/h,f=d+o,m=cl.pop()||new Xe;m.arc=n,m.site=u,m.x=v+a,m.y=f+Math.sqrt(v*v+d*d),m.cy=f,n.circle=m;for(var y=null,M=ol._;M;)if(m.y<M.y||m.y===M.y&&m.x<=M.x){if(!M.L){y=M.P;break}M=M.L}else{if(!M.R){y=M;break}M=M.R}ol.insert(y,m),y||(al=m)}}}}function Be(n){var t=n.circle;t&&(t.P||(al=t.N),ol.remove(t),cl.push(t),rr(t),n.circle=null)}function We(n){for(var t,e=rl,r=Yt(n[0][0],n[0][1],n[1][0],n[1][1]),u=e.length;u--;)t=e[u],(!Je(t,n)||!r(t)||Ma(t.a.x-t.b.x)<Da&&Ma(t.a.y-t.b.y)<Da)&&(t.a=t.b=null,e.splice(u,1))}function Je(n,t){var e=n.b;if(e)return!0;var r,u,i=n.a,a=t[0][0],o=t[1][0],l=t[0][1],c=t[1][1],s=n.l,f=n.r,h=s.x,g=s.y,p=f.x,v=f.y,d=(h+p)/2,m=(g+v)/2;if(v===g){if(a>d||d>=o)return;if(h>p){if(i){if(i.y>=c)return}else i={x:d,y:l};e={x:d,y:c}}else{if(i){if(i.y<l)return}else i={x:d,y:c};e={x:d,y:l}}}else if(r=(h-p)/(v-g),u=m-r*d,-1>r||r>1)if(h>p){if(i){if(i.y>=c)return}else i={x:(l-u)/r,y:l};e={x:(c-u)/r,y:c}}else{if(i){if(i.y<l)return}else i={x:(c-u)/r,y:c};e={x:(l-u)/r,y:l}}else if(v>g){if(i){if(i.x>=o)return}else i={x:a,y:r*a+u};e={x:o,y:r*o+u}}else{if(i){if(i.x<a)return}else i={x:o,y:r*o+u};e={x:a,y:r*a+u}}return n.a=i,n.b=e,!0}function Ge(n,t){this.l=n,this.r=t,this.a=this.b=null}function Ke(n,t,e,r){var u=new Ge(n,t);return rl.push(u),e&&nr(u,n,t,e),r&&nr(u,t,n,r),ul[n.i].edges.push(new tr(u,n,t)),ul[t.i].edges.push(new tr(u,t,n)),u}function Qe(n,t,e){var r=new Ge(n,null);return r.a=t,r.b=e,rl.push(r),r}function nr(n,t,e,r){n.a||n.b?n.l===e?n.b=r:n.a=r:(n.a=r,n.l=t,n.r=e)}function tr(n,t,e){var r=n.a,u=n.b;this.edge=n,this.site=t,this.angle=e?Math.atan2(e.y-t.y,e.x-t.x):n.l===t?Math.atan2(u.x-r.x,r.y-u.y):Math.atan2(r.x-u.x,u.y-r.y)}function er(){this._=null}function rr(n){n.U=n.C=n.L=n.R=n.P=n.N=null}function ur(n,t){var e=t,r=t.R,u=e.U;u?u.L===e?u.L=r:u.R=r:n._=r,r.U=u,e.U=r,e.R=r.L,e.R&&(e.R.U=e),r.L=e}function ir(n,t){var e=t,r=t.L,u=e.U;u?u.L===e?u.L=r:u.R=r:n._=r,r.U=u,e.U=r,e.L=r.R,e.L&&(e.L.U=e),r.R=e}function ar(n){for(;n.L;)n=n.L;return n}function or(n,t){var e,r,u,i=n.sort(lr).pop();for(rl=[],ul=new Array(n.length),il=new er,ol=new er;;)if(u=al,i&&(!u||i.y<u.y||i.y===u.y&&i.x<u.x))(i.x!==e||i.y!==r)&&(ul[i.i]=new Ye(i),He(i),e=i.x,r=i.y),i=n.pop();else{if(!u)break;Fe(u.arc)}t&&(We(t),Ze(t));var a={cells:ul,edges:rl};return il=ol=rl=ul=null,a}function lr(n,t){return t.y-n.y||t.x-n.x}function cr(n,t,e){return(n.x-e.x)*(t.y-n.y)-(n.x-t.x)*(e.y-n.y)}function sr(n){return n.x}function fr(n){return n.y}function hr(){return{leaf:!0,nodes:[],point:null,x:null,y:null}}function gr(n,t,e,r,u,i){if(!n(t,e,r,u,i)){var a=.5*(e+u),o=.5*(r+i),l=t.nodes;l[0]&&gr(n,l[0],e,r,a,o),l[1]&&gr(n,l[1],a,r,u,o),l[2]&&gr(n,l[2],e,o,a,i),l[3]&&gr(n,l[3],a,o,u,i)}}function pr(n,t,e,r,u,i,a){var o,l=1/0;return function c(n,s,f,h,g){if(!(s>i||f>a||r>h||u>g)){if(p=n.point){var p,v=t-n.x,d=e-n.y,m=v*v+d*d;if(l>m){var y=Math.sqrt(l=m);r=t-y,u=e-y,i=t+y,a=e+y,o=p}}for(var M=n.nodes,x=.5*(s+h),b=.5*(f+g),_=t>=x,w=e>=b,S=w<<1|_,k=S+4;k>S;++S)if(n=M[3&S])switch(3&S){case 0:c(n,s,f,x,b);break;case 1:c(n,x,f,h,b);break;case 2:c(n,s,b,x,g);break;case 3:c(n,x,b,h,g)}}}(n,r,u,i,a),o}function vr(n,t){n=oa.rgb(n),t=oa.rgb(t);var e=n.r,r=n.g,u=n.b,i=t.r-e,a=t.g-r,o=t.b-u;return function(n){return\\\"#\\\"+bn(Math.round(e+i*n))+bn(Math.round(r+a*n))+bn(Math.round(u+o*n))}}function dr(n,t){var e,r={},u={};for(e in n)e in t?r[e]=Mr(n[e],t[e]):u[e]=n[e];for(e in t)e in n||(u[e]=t[e]);return function(n){for(e in r)u[e]=r[e](n);return u}}function mr(n,t){return n=+n,t=+t,function(e){return n*(1-e)+t*e}}function yr(n,t){var e,r,u,i=fl.lastIndex=hl.lastIndex=0,a=-1,o=[],l=[];for(n+=\\\"\\\",t+=\\\"\\\";(e=fl.exec(n))&&(r=hl.exec(t));)(u=r.index)>i&&(u=t.slice(i,u),o[a]?o[a]+=u:o[++a]=u),(e=e[0])===(r=r[0])?o[a]?o[a]+=r:o[++a]=r:(o[++a]=null,l.push({i:a,x:mr(e,r)})),i=hl.lastIndex;return i<t.length&&(u=t.slice(i),o[a]?o[a]+=u:o[++a]=u),o.length<2?l[0]?(t=l[0].x,function(n){return t(n)+\\\"\\\"}):function(){return t}:(t=l.length,function(n){for(var e,r=0;t>r;++r)o[(e=l[r]).i]=e.x(n);return o.join(\\\"\\\")})}function Mr(n,t){for(var e,r=oa.interpolators.length;--r>=0&&!(e=oa.interpolators[r](n,t)););return e}function xr(n,t){var e,r=[],u=[],i=n.length,a=t.length,o=Math.min(n.length,t.length);for(e=0;o>e;++e)r.push(Mr(n[e],t[e]));for(;i>e;++e)u[e]=n[e];for(;a>e;++e)u[e]=t[e];return function(n){for(e=0;o>e;++e)u[e]=r[e](n);return u}}function br(n){return function(t){return 0>=t?0:t>=1?1:n(t)}}function _r(n){return function(t){return 1-n(1-t)}}function wr(n){return function(t){return.5*(.5>t?n(2*t):2-n(2-2*t))}}function Sr(n){return n*n}function kr(n){return n*n*n}function Nr(n){if(0>=n)return 0;if(n>=1)return 1;var t=n*n,e=t*n;return 4*(.5>n?e:3*(n-t)+e-.75)}function Er(n){return function(t){return Math.pow(t,n)}}function Ar(n){return 1-Math.cos(n*Ha)}function Cr(n){return Math.pow(2,10*(n-1))}function zr(n){return 1-Math.sqrt(1-n*n)}function Lr(n,t){var e;return arguments.length<2&&(t=.45),arguments.length?e=t/Ua*Math.asin(1/n):(n=1,e=t/4),function(r){return 1+n*Math.pow(2,-10*r)*Math.sin((r-e)*Ua/t)}}function qr(n){return n||(n=1.70158),function(t){return t*t*((n+1)*t-n)}}function Tr(n){return 1/2.75>n?7.5625*n*n:2/2.75>n?7.5625*(n-=1.5/2.75)*n+.75:2.5/2.75>n?7.5625*(n-=2.25/2.75)*n+.9375:7.5625*(n-=2.625/2.75)*n+.984375}function Rr(n,t){n=oa.hcl(n),t=oa.hcl(t);var e=n.h,r=n.c,u=n.l,i=t.h-e,a=t.c-r,o=t.l-u;return isNaN(a)&&(a=0,r=isNaN(r)?t.c:r),isNaN(i)?(i=0,e=isNaN(e)?t.h:e):i>180?i-=360:-180>i&&(i+=360),function(n){return fn(e+i*n,r+a*n,u+o*n)+\\\"\\\"}}function Dr(n,t){n=oa.hsl(n),t=oa.hsl(t);var e=n.h,r=n.s,u=n.l,i=t.h-e,a=t.s-r,o=t.l-u;return isNaN(a)&&(a=0,r=isNaN(r)?t.s:r),isNaN(i)?(i=0,e=isNaN(e)?t.h:e):i>180?i-=360:-180>i&&(i+=360),function(n){return cn(e+i*n,r+a*n,u+o*n)+\\\"\\\"}}function Pr(n,t){n=oa.lab(n),t=oa.lab(t);var e=n.l,r=n.a,u=n.b,i=t.l-e,a=t.a-r,o=t.b-u;return function(n){return gn(e+i*n,r+a*n,u+o*n)+\\\"\\\"}}function jr(n,t){return t-=n,function(e){return Math.round(n+t*e)}}function Ur(n){var t=[n.a,n.b],e=[n.c,n.d],r=Hr(t),u=Fr(t,e),i=Hr(Or(e,t,-u))||0;t[0]*e[1]<e[0]*t[1]&&(t[0]*=-1,t[1]*=-1,r*=-1,u*=-1),this.rotate=(r?Math.atan2(t[1],t[0]):Math.atan2(-e[0],e[1]))*Ia,this.translate=[n.e,n.f],this.scale=[r,i],this.skew=i?Math.atan2(u,i)*Ia:0}function Fr(n,t){return n[0]*t[0]+n[1]*t[1]}function Hr(n){var t=Math.sqrt(Fr(n,n));return t&&(n[0]/=t,n[1]/=t),t}function Or(n,t,e){return n[0]+=e*t[0],n[1]+=e*t[1],n}function Ir(n){return n.length?n.pop()+\\\",\\\":\\\"\\\"}function Yr(n,t,e,r){if(n[0]!==t[0]||n[1]!==t[1]){var u=e.push(\\\"translate(\\\",null,\\\",\\\",null,\\\")\\\");r.push({i:u-4,x:mr(n[0],t[0])},{i:u-2,x:mr(n[1],t[1])})}else(t[0]||t[1])&&e.push(\\\"translate(\\\"+t+\\\")\\\")}function Zr(n,t,e,r){n!==t?(n-t>180?t+=360:t-n>180&&(n+=360),r.push({i:e.push(Ir(e)+\\\"rotate(\\\",null,\\\")\\\")-2,x:mr(n,t)})):t&&e.push(Ir(e)+\\\"rotate(\\\"+t+\\\")\\\")}function Vr(n,t,e,r){n!==t?r.push({i:e.push(Ir(e)+\\\"skewX(\\\",null,\\\")\\\")-2,x:mr(n,t)}):t&&e.push(Ir(e)+\\\"skewX(\\\"+t+\\\")\\\")}function Xr(n,t,e,r){if(n[0]!==t[0]||n[1]!==t[1]){var u=e.push(Ir(e)+\\\"scale(\\\",null,\\\",\\\",null,\\\")\\\");r.push({i:u-4,x:mr(n[0],t[0])},{i:u-2,x:mr(n[1],t[1])})}else(1!==t[0]||1!==t[1])&&e.push(Ir(e)+\\\"scale(\\\"+t+\\\")\\\")}function $r(n,t){var e=[],r=[];return n=oa.transform(n),t=oa.transform(t),Yr(n.translate,t.translate,e,r),Zr(n.rotate,t.rotate,e,r),Vr(n.skew,t.skew,e,r),Xr(n.scale,t.scale,e,r),n=t=null,function(n){for(var t,u=-1,i=r.length;++u<i;)e[(t=r[u]).i]=t.x(n);return e.join(\\\"\\\")}}function Br(n,t){return t=(t-=n=+n)||1/t,function(e){return(e-n)/t}}function Wr(n,t){return t=(t-=n=+n)||1/t,function(e){return Math.max(0,Math.min(1,(e-n)/t))}}function Jr(n){for(var t=n.source,e=n.target,r=Kr(t,e),u=[t];t!==r;)t=t.parent,u.push(t);for(var i=u.length;e!==r;)u.splice(i,0,e),e=e.parent;return u}function Gr(n){for(var t=[],e=n.parent;null!=e;)t.push(n),n=e,e=e.parent;return t.push(n),t}function Kr(n,t){if(n===t)return n;for(var e=Gr(n),r=Gr(t),u=e.pop(),i=r.pop(),a=null;u===i;)a=u,u=e.pop(),i=r.pop();return a}function Qr(n){n.fixed|=2}function nu(n){n.fixed&=-7}function tu(n){n.fixed|=4,n.px=n.x,n.py=n.y}function eu(n){n.fixed&=-5}function ru(n,t,e){var r=0,u=0;if(n.charge=0,!n.leaf)for(var i,a=n.nodes,o=a.length,l=-1;++l<o;)i=a[l],null!=i&&(ru(i,t,e),n.charge+=i.charge,r+=i.charge*i.cx,u+=i.charge*i.cy);if(n.point){n.leaf||(n.point.x+=Math.random()-.5,n.point.y+=Math.random()-.5);var c=t*e[n.point.index];n.charge+=n.pointCharge=c,r+=c*n.point.x,u+=c*n.point.y}n.cx=r/n.charge,n.cy=u/n.charge}function uu(n,t){return oa.rebind(n,t,\\\"sort\\\",\\\"children\\\",\\\"value\\\"),n.nodes=n,n.links=su,n}function iu(n,t){for(var e=[n];null!=(n=e.pop());)if(t(n),(u=n.children)&&(r=u.length))for(var r,u;--r>=0;)e.push(u[r])}function au(n,t){for(var e=[n],r=[];null!=(n=e.pop());)if(r.push(n),(i=n.children)&&(u=i.length))for(var u,i,a=-1;++a<u;)e.push(i[a]);for(;null!=(n=r.pop());)t(n)}function ou(n){return n.children}function lu(n){return n.value}function cu(n,t){return t.value-n.value}function su(n){return oa.merge(n.map(function(n){return(n.children||[]).map(function(t){return{source:n,target:t}})}))}function fu(n){return n.x}function hu(n){return n.y}function gu(n,t,e){n.y0=t,n.y=e}function pu(n){return oa.range(n.length)}function vu(n){for(var t=-1,e=n[0].length,r=[];++t<e;)r[t]=0;return r}function du(n){for(var t,e=1,r=0,u=n[0][1],i=n.length;i>e;++e)(t=n[e][1])>u&&(r=e,u=t);return r}function mu(n){return n.reduce(yu,0)}function yu(n,t){return n+t[1]}function Mu(n,t){return xu(n,Math.ceil(Math.log(t.length)/Math.LN2+1))}function xu(n,t){for(var e=-1,r=+n[0],u=(n[1]-r)/t,i=[];++e<=t;)i[e]=u*e+r;return i}function bu(n){return[oa.min(n),oa.max(n)]}function _u(n,t){return n.value-t.value}function wu(n,t){var e=n._pack_next;n._pack_next=t,t._pack_prev=n,t._pack_next=e,e._pack_prev=t}function Su(n,t){n._pack_next=t,t._pack_prev=n}function ku(n,t){var e=t.x-n.x,r=t.y-n.y,u=n.r+t.r;return.999*u*u>e*e+r*r}function Nu(n){function t(n){s=Math.min(n.x-n.r,s),f=Math.max(n.x+n.r,f),h=Math.min(n.y-n.r,h),g=Math.max(n.y+n.r,g)}if((e=n.children)&&(c=e.length)){var e,r,u,i,a,o,l,c,s=1/0,f=-(1/0),h=1/0,g=-(1/0);if(e.forEach(Eu),r=e[0],r.x=-r.r,r.y=0,t(r),c>1&&(u=e[1],u.x=u.r,u.y=0,t(u),c>2))for(i=e[2],zu(r,u,i),t(i),wu(r,i),r._pack_prev=i,wu(i,u),u=r._pack_next,a=3;c>a;a++){zu(r,u,i=e[a]);var p=0,v=1,d=1;for(o=u._pack_next;o!==u;o=o._pack_next,v++)if(ku(o,i)){p=1;break}if(1==p)for(l=r._pack_prev;l!==o._pack_prev&&!ku(l,i);l=l._pack_prev,d++);p?(d>v||v==d&&u.r<r.r?Su(r,u=o):Su(r=l,u),a--):(wu(r,i),u=i,t(i))}var m=(s+f)/2,y=(h+g)/2,M=0;for(a=0;c>a;a++)i=e[a],i.x-=m,i.y-=y,M=Math.max(M,i.r+Math.sqrt(i.x*i.x+i.y*i.y));n.r=M,e.forEach(Au)}}function Eu(n){n._pack_next=n._pack_prev=n}function Au(n){delete n._pack_next,delete n._pack_prev}function Cu(n,t,e,r){var u=n.children;if(n.x=t+=r*n.x,n.y=e+=r*n.y,n.r*=r,u)for(var i=-1,a=u.length;++i<a;)Cu(u[i],t,e,r)}function zu(n,t,e){var r=n.r+e.r,u=t.x-n.x,i=t.y-n.y;if(r&&(u||i)){var a=t.r+e.r,o=u*u+i*i;a*=a,r*=r;var l=.5+(r-a)/(2*o),c=Math.sqrt(Math.max(0,2*a*(r+o)-(r-=o)*r-a*a))/(2*o);e.x=n.x+l*u+c*i,e.y=n.y+l*i-c*u}else e.x=n.x+r,e.y=n.y}function Lu(n,t){return n.parent==t.parent?1:2}function qu(n){var t=n.children;return t.length?t[0]:n.t}function Tu(n){var t,e=n.children;return(t=e.length)?e[t-1]:n.t}function Ru(n,t,e){var r=e/(t.i-n.i);t.c-=r,t.s+=e,n.c+=r,t.z+=e,t.m+=e}function Du(n){for(var t,e=0,r=0,u=n.children,i=u.length;--i>=0;)t=u[i],t.z+=e,t.m+=e,e+=t.s+(r+=t.c)}function Pu(n,t,e){return n.a.parent===t.parent?n.a:e}function ju(n){return 1+oa.max(n,function(n){return n.y})}function Uu(n){return n.reduce(function(n,t){return n+t.x},0)/n.length}function Fu(n){var t=n.children;return t&&t.length?Fu(t[0]):n}function Hu(n){var t,e=n.children;return e&&(t=e.length)?Hu(e[t-1]):n}function Ou(n){return{x:n.x,y:n.y,dx:n.dx,dy:n.dy}}function Iu(n,t){var e=n.x+t[3],r=n.y+t[0],u=n.dx-t[1]-t[3],i=n.dy-t[0]-t[2];return 0>u&&(e+=u/2,u=0),0>i&&(r+=i/2,i=0),{x:e,y:r,dx:u,dy:i}}function Yu(n){var t=n[0],e=n[n.length-1];return e>t?[t,e]:[e,t]}function Zu(n){return n.rangeExtent?n.rangeExtent():Yu(n.range())}function Vu(n,t,e,r){var u=e(n[0],n[1]),i=r(t[0],t[1]);return function(n){return i(u(n))}}function Xu(n,t){var e,r=0,u=n.length-1,i=n[r],a=n[u];return i>a&&(e=r,r=u,u=e,e=i,i=a,a=e),n[r]=t.floor(i),n[u]=t.ceil(a),n}function $u(n){return n?{floor:function(t){return Math.floor(t/n)*n},ceil:function(t){return Math.ceil(t/n)*n}}:wl}function Bu(n,t,e,r){var u=[],i=[],a=0,o=Math.min(n.length,t.length)-1;for(n[o]<n[0]&&(n=n.slice().reverse(),t=t.slice().reverse());++a<=o;)u.push(e(n[a-1],n[a])),i.push(r(t[a-1],t[a]));return function(t){var e=oa.bisect(n,t,1,o)-1;return i[e](u[e](t))}}function Wu(n,t,e,r){function u(){var u=Math.min(n.length,t.length)>2?Bu:Vu,l=r?Wr:Br;return a=u(n,t,l,e),o=u(t,n,l,Mr),i}function i(n){return a(n)}var a,o;return i.invert=function(n){return o(n)},i.domain=function(t){return arguments.length?(n=t.map(Number),u()):n},i.range=function(n){return arguments.length?(t=n,u()):t},i.rangeRound=function(n){return i.range(n).interpolate(jr)},i.clamp=function(n){return arguments.length?(r=n,u()):r},i.interpolate=function(n){return arguments.length?(e=n,u()):e},i.ticks=function(t){return Qu(n,t)},i.tickFormat=function(t,e){return ni(n,t,e)},i.nice=function(t){return Gu(n,t),u()},i.copy=function(){return Wu(n,t,e,r)},u()}function Ju(n,t){return oa.rebind(n,t,\\\"range\\\",\\\"rangeRound\\\",\\\"interpolate\\\",\\\"clamp\\\")}function Gu(n,t){return Xu(n,$u(Ku(n,t)[2])),Xu(n,$u(Ku(n,t)[2])),n}function Ku(n,t){null==t&&(t=10);var e=Yu(n),r=e[1]-e[0],u=Math.pow(10,Math.floor(Math.log(r/t)/Math.LN10)),i=t/r*u;return.15>=i?u*=10:.35>=i?u*=5:.75>=i&&(u*=2),e[0]=Math.ceil(e[0]/u)*u,e[1]=Math.floor(e[1]/u)*u+.5*u,e[2]=u,e}function Qu(n,t){return oa.range.apply(oa,Ku(n,t))}function ni(n,t,e){var r=Ku(n,t);if(e){var u=so.exec(e);if(u.shift(),\\\"s\\\"===u[8]){var i=oa.formatPrefix(Math.max(Ma(r[0]),Ma(r[1])));return u[7]||(u[7]=\\\".\\\"+ti(i.scale(r[2]))),u[8]=\\\"f\\\",e=oa.format(u.join(\\\"\\\")),function(n){return e(i.scale(n))+i.symbol}}u[7]||(u[7]=\\\".\\\"+ei(u[8],r)),e=u.join(\\\"\\\")}else e=\\\",.\\\"+ti(r[2])+\\\"f\\\";return oa.format(e)}function ti(n){return-Math.floor(Math.log(n)/Math.LN10+.01)}function ei(n,t){var e=ti(t[2]);return n in Sl?Math.abs(e-ti(Math.max(Ma(t[0]),Ma(t[1]))))+ +(\\\"e\\\"!==n):e-2*(\\\"%\\\"===n)}function ri(n,t,e,r){function u(n){return(e?Math.log(0>n?0:n):-Math.log(n>0?0:-n))/Math.log(t)}function i(n){return e?Math.pow(t,n):-Math.pow(t,-n)}function a(t){return n(u(t))}return a.invert=function(t){return i(n.invert(t))},a.domain=function(t){return arguments.length?(e=t[0]>=0,n.domain((r=t.map(Number)).map(u)),a):r},a.base=function(e){return arguments.length?(t=+e,n.domain(r.map(u)),a):t},a.nice=function(){var t=Xu(r.map(u),e?Math:Nl);return n.domain(t),r=t.map(i),a},a.ticks=function(){var n=Yu(r),a=[],o=n[0],l=n[1],c=Math.floor(u(o)),s=Math.ceil(u(l)),f=t%1?2:t;if(isFinite(s-c)){if(e){for(;s>c;c++)for(var h=1;f>h;h++)a.push(i(c)*h);a.push(i(c))}else for(a.push(i(c));c++<s;)for(var h=f-1;h>0;h--)a.push(i(c)*h);for(c=0;a[c]<o;c++);for(s=a.length;a[s-1]>l;s--);a=a.slice(c,s)}return a},a.tickFormat=function(n,e){if(!arguments.length)return kl;arguments.length<2?e=kl:\\\"function\\\"!=typeof e&&(e=oa.format(e));var r=Math.max(1,t*n/a.ticks().length);return function(n){var a=n/i(Math.round(u(n)));return t-.5>a*t&&(a*=t),r>=a?e(n):\\\"\\\"}},a.copy=function(){return ri(n.copy(),t,e,r)},Ju(a,n)}function ui(n,t,e){function r(t){return n(u(t))}var u=ii(t),i=ii(1/t);return r.invert=function(t){return i(n.invert(t))},r.domain=function(t){return arguments.length?(n.domain((e=t.map(Number)).map(u)),r):e},r.ticks=function(n){return Qu(e,n)},r.tickFormat=function(n,t){return ni(e,n,t)},r.nice=function(n){return r.domain(Gu(e,n))},r.exponent=function(a){return arguments.length?(u=ii(t=a),i=ii(1/t),n.domain(e.map(u)),r):t},r.copy=function(){return ui(n.copy(),t,e)},Ju(r,n)}function ii(n){return function(t){return 0>t?-Math.pow(-t,n):Math.pow(t,n)}}function ai(n,t){function e(e){return i[((u.get(e)||(\\\"range\\\"===t.t?u.set(e,n.push(e)):NaN))-1)%i.length]}function r(t,e){return oa.range(n.length).map(function(n){return t+e*n})}var u,i,a;return e.domain=function(r){if(!arguments.length)return n;n=[],u=new c;for(var i,a=-1,o=r.length;++a<o;)u.has(i=r[a])||u.set(i,n.push(i));return e[t.t].apply(e,t.a)},e.range=function(n){return arguments.length?(i=n,a=0,t={t:\\\"range\\\",a:arguments},e):i},e.rangePoints=function(u,o){arguments.length<2&&(o=0);var l=u[0],c=u[1],s=n.length<2?(l=(l+c)/2,0):(c-l)/(n.length-1+o);return i=r(l+s*o/2,s),a=0,t={t:\\\"rangePoints\\\",a:arguments},e},e.rangeRoundPoints=function(u,o){arguments.length<2&&(o=0);var l=u[0],c=u[1],s=n.length<2?(l=c=Math.round((l+c)/2),0):(c-l)/(n.length-1+o)|0;return i=r(l+Math.round(s*o/2+(c-l-(n.length-1+o)*s)/2),s),a=0,t={t:\\\"rangeRoundPoints\\\",a:arguments},e},e.rangeBands=function(u,o,l){arguments.length<2&&(o=0),arguments.length<3&&(l=o);var c=u[1]<u[0],s=u[c-0],f=u[1-c],h=(f-s)/(n.length-o+2*l);return i=r(s+h*l,h),c&&i.reverse(),a=h*(1-o),t={t:\\\"rangeBands\\\",a:arguments},e},e.rangeRoundBands=function(u,o,l){arguments.length<2&&(o=0),arguments.length<3&&(l=o);var c=u[1]<u[0],s=u[c-0],f=u[1-c],h=Math.floor((f-s)/(n.length-o+2*l));return i=r(s+Math.round((f-s-(n.length-o)*h)/2),h),c&&i.reverse(),a=Math.round(h*(1-o)),t={t:\\\"rangeRoundBands\\\",a:arguments},e},e.rangeBand=function(){return a},e.rangeExtent=function(){return Yu(t.a[0])},e.copy=function(){return ai(n,t)},e.domain(n)}function oi(n,t){function i(){var e=0,r=t.length;for(o=[];++e<r;)o[e-1]=oa.quantile(n,e/r);return a}function a(n){return isNaN(n=+n)?void 0:t[oa.bisect(o,n)]}var o;return a.domain=function(t){return arguments.length?(n=t.map(r).filter(u).sort(e),i()):n},a.range=function(n){return arguments.length?(t=n,i()):t},a.quantiles=function(){return o},a.invertExtent=function(e){return e=t.indexOf(e),0>e?[NaN,NaN]:[e>0?o[e-1]:n[0],e<o.length?o[e]:n[n.length-1]]},a.copy=function(){return oi(n,t)},i()}function li(n,t,e){function r(t){return e[Math.max(0,Math.min(a,Math.floor(i*(t-n))))]}function u(){return i=e.length/(t-n),a=e.length-1,r}var i,a;return r.domain=function(e){return arguments.length?(n=+e[0],t=+e[e.length-1],u()):[n,t]},r.range=function(n){return arguments.length?(e=n,u()):e},r.invertExtent=function(t){return t=e.indexOf(t),t=0>t?NaN:t/i+n,[t,t+1/i]},r.copy=function(){return li(n,t,e)},u()}function ci(n,t){function e(e){return e>=e?t[oa.bisect(n,e)]:void 0}return e.domain=function(t){return arguments.length?(n=t,e):n},e.range=function(n){return arguments.length?(t=n,e):t},e.invertExtent=function(e){return e=t.indexOf(e),[n[e-1],n[e]]},e.copy=function(){return ci(n,t)},e}function si(n){function t(n){return+n}return t.invert=t,t.domain=t.range=function(e){return arguments.length?(n=e.map(t),t):n},t.ticks=function(t){return Qu(n,t)},t.tickFormat=function(t,e){return ni(n,t,e)},t.copy=function(){return si(n)},t}function fi(){return 0}function hi(n){return n.innerRadius}function gi(n){return n.outerRadius}function pi(n){return n.startAngle}function vi(n){return n.endAngle}function di(n){return n&&n.padAngle}function mi(n,t,e,r){return(n-e)*t-(t-r)*n>0?0:1}function yi(n,t,e,r,u){var i=n[0]-t[0],a=n[1]-t[1],o=(u?r:-r)/Math.sqrt(i*i+a*a),l=o*a,c=-o*i,s=n[0]+l,f=n[1]+c,h=t[0]+l,g=t[1]+c,p=(s+h)/2,v=(f+g)/2,d=h-s,m=g-f,y=d*d+m*m,M=e-r,x=s*g-h*f,b=(0>m?-1:1)*Math.sqrt(Math.max(0,M*M*y-x*x)),_=(x*m-d*b)/y,w=(-x*d-m*b)/y,S=(x*m+d*b)/y,k=(-x*d+m*b)/y,N=_-p,E=w-v,A=S-p,C=k-v;return N*N+E*E>A*A+C*C&&(_=S,w=k),[[_-l,w-c],[_*e/M,w*e/M]]}function Mi(n){function t(t){function a(){c.push(\\\"M\\\",i(n(s),o))}for(var l,c=[],s=[],f=-1,h=t.length,g=En(e),p=En(r);++f<h;)u.call(this,l=t[f],f)?s.push([+g.call(this,l,f),+p.call(this,l,f)]):s.length&&(a(),s=[]);return s.length&&a(),c.length?c.join(\\\"\\\"):null}var e=Ce,r=ze,u=zt,i=xi,a=i.key,o=.7;return t.x=function(n){return arguments.length?(e=n,t):e},t.y=function(n){return arguments.length?(r=n,t):r},t.defined=function(n){return arguments.length?(u=n,t):u},t.interpolate=function(n){return arguments.length?(a=\\\"function\\\"==typeof n?i=n:(i=ql.get(n)||xi).key,t):a},t.tension=function(n){return arguments.length?(o=n,t):o},t}function xi(n){return n.length>1?n.join(\\\"L\\\"):n+\\\"Z\\\"}function bi(n){return n.join(\\\"L\\\")+\\\"Z\\\"}function _i(n){for(var t=0,e=n.length,r=n[0],u=[r[0],\\\",\\\",r[1]];++t<e;)u.push(\\\"H\\\",(r[0]+(r=n[t])[0])/2,\\\"V\\\",r[1]);return e>1&&u.push(\\\"H\\\",r[0]),u.join(\\\"\\\")}function wi(n){for(var t=0,e=n.length,r=n[0],u=[r[0],\\\",\\\",r[1]];++t<e;)u.push(\\\"V\\\",(r=n[t])[1],\\\"H\\\",r[0]);return u.join(\\\"\\\")}function Si(n){for(var t=0,e=n.length,r=n[0],u=[r[0],\\\",\\\",r[1]];++t<e;)u.push(\\\"H\\\",(r=n[t])[0],\\\"V\\\",r[1]);return u.join(\\\"\\\")}function ki(n,t){return n.length<4?xi(n):n[1]+Ai(n.slice(1,-1),Ci(n,t))}function Ni(n,t){return n.length<3?bi(n):n[0]+Ai((n.push(n[0]),n),Ci([n[n.length-2]].concat(n,[n[1]]),t))}function Ei(n,t){return n.length<3?xi(n):n[0]+Ai(n,Ci(n,t))}function Ai(n,t){if(t.length<1||n.length!=t.length&&n.length!=t.length+2)return xi(n);var e=n.length!=t.length,r=\\\"\\\",u=n[0],i=n[1],a=t[0],o=a,l=1;if(e&&(r+=\\\"Q\\\"+(i[0]-2*a[0]/3)+\\\",\\\"+(i[1]-2*a[1]/3)+\\\",\\\"+i[0]+\\\",\\\"+i[1],u=n[1],l=2),t.length>1){o=t[1],i=n[l],l++,r+=\\\"C\\\"+(u[0]+a[0])+\\\",\\\"+(u[1]+a[1])+\\\",\\\"+(i[0]-o[0])+\\\",\\\"+(i[1]-o[1])+\\\",\\\"+i[0]+\\\",\\\"+i[1];for(var c=2;c<t.length;c++,l++)i=n[l],o=t[c],r+=\\\"S\\\"+(i[0]-o[0])+\\\",\\\"+(i[1]-o[1])+\\\",\\\"+i[0]+\\\",\\\"+i[1]}if(e){var s=n[l];r+=\\\"Q\\\"+(i[0]+2*o[0]/3)+\\\",\\\"+(i[1]+2*o[1]/3)+\\\",\\\"+s[0]+\\\",\\\"+s[1]}return r}function Ci(n,t){for(var e,r=[],u=(1-t)/2,i=n[0],a=n[1],o=1,l=n.length;++o<l;)e=i,i=a,a=n[o],r.push([u*(a[0]-e[0]),u*(a[1]-e[1])]);return r}function zi(n){if(n.length<3)return xi(n);var t=1,e=n.length,r=n[0],u=r[0],i=r[1],a=[u,u,u,(r=n[1])[0]],o=[i,i,i,r[1]],l=[u,\\\",\\\",i,\\\"L\\\",Ri(Dl,a),\\\",\\\",Ri(Dl,o)];for(n.push(n[e-1]);++t<=e;)r=n[t],a.shift(),a.push(r[0]),o.shift(),o.push(r[1]),Di(l,a,o);return n.pop(),l.push(\\\"L\\\",r),l.join(\\\"\\\")}function Li(n){if(n.length<4)return xi(n);for(var t,e=[],r=-1,u=n.length,i=[0],a=[0];++r<3;)t=n[r],i.push(t[0]),a.push(t[1]);for(e.push(Ri(Dl,i)+\\\",\\\"+Ri(Dl,a)),--r;++r<u;)t=n[r],i.shift(),i.push(t[0]),a.shift(),a.push(t[1]),Di(e,i,a);return e.join(\\\"\\\")}function qi(n){for(var t,e,r=-1,u=n.length,i=u+4,a=[],o=[];++r<4;)e=n[r%u],a.push(e[0]),o.push(e[1]);for(t=[Ri(Dl,a),\\\",\\\",Ri(Dl,o)],--r;++r<i;)e=n[r%u],a.shift(),a.push(e[0]),o.shift(),o.push(e[1]),Di(t,a,o);return t.join(\\\"\\\")}function Ti(n,t){var e=n.length-1;if(e)for(var r,u,i=n[0][0],a=n[0][1],o=n[e][0]-i,l=n[e][1]-a,c=-1;++c<=e;)r=n[c],u=c/e,r[0]=t*r[0]+(1-t)*(i+u*o),r[1]=t*r[1]+(1-t)*(a+u*l);return zi(n)}function Ri(n,t){return n[0]*t[0]+n[1]*t[1]+n[2]*t[2]+n[3]*t[3]}function Di(n,t,e){n.push(\\\"C\\\",Ri(Tl,t),\\\",\\\",Ri(Tl,e),\\\",\\\",Ri(Rl,t),\\\",\\\",Ri(Rl,e),\\\",\\\",Ri(Dl,t),\\\",\\\",Ri(Dl,e))}function Pi(n,t){return(t[1]-n[1])/(t[0]-n[0])}function ji(n){for(var t=0,e=n.length-1,r=[],u=n[0],i=n[1],a=r[0]=Pi(u,i);++t<e;)r[t]=(a+(a=Pi(u=i,i=n[t+1])))/2;return r[t]=a,r}function Ui(n){for(var t,e,r,u,i=[],a=ji(n),o=-1,l=n.length-1;++o<l;)t=Pi(n[o],n[o+1]),Ma(t)<Da?a[o]=a[o+1]=0:(e=a[o]/t,r=a[o+1]/t,u=e*e+r*r,u>9&&(u=3*t/Math.sqrt(u),a[o]=u*e,a[o+1]=u*r));for(o=-1;++o<=l;)u=(n[Math.min(l,o+1)][0]-n[Math.max(0,o-1)][0])/(6*(1+a[o]*a[o])),i.push([u||0,a[o]*u||0]);return i}function Fi(n){return n.length<3?xi(n):n[0]+Ai(n,Ui(n))}function Hi(n){for(var t,e,r,u=-1,i=n.length;++u<i;)t=n[u],e=t[0],r=t[1]-Ha,t[0]=e*Math.cos(r),t[1]=e*Math.sin(r);return n}function Oi(n){function t(t){function l(){v.push(\\\"M\\\",o(n(m),f),s,c(n(d.reverse()),f),\\\"Z\\\")}for(var h,g,p,v=[],d=[],m=[],y=-1,M=t.length,x=En(e),b=En(u),_=e===r?function(){\\n return g}:En(r),w=u===i?function(){return p}:En(i);++y<M;)a.call(this,h=t[y],y)?(d.push([g=+x.call(this,h,y),p=+b.call(this,h,y)]),m.push([+_.call(this,h,y),+w.call(this,h,y)])):d.length&&(l(),d=[],m=[]);return d.length&&l(),v.length?v.join(\\\"\\\"):null}var e=Ce,r=Ce,u=0,i=ze,a=zt,o=xi,l=o.key,c=o,s=\\\"L\\\",f=.7;return t.x=function(n){return arguments.length?(e=r=n,t):r},t.x0=function(n){return arguments.length?(e=n,t):e},t.x1=function(n){return arguments.length?(r=n,t):r},t.y=function(n){return arguments.length?(u=i=n,t):i},t.y0=function(n){return arguments.length?(u=n,t):u},t.y1=function(n){return arguments.length?(i=n,t):i},t.defined=function(n){return arguments.length?(a=n,t):a},t.interpolate=function(n){return arguments.length?(l=\\\"function\\\"==typeof n?o=n:(o=ql.get(n)||xi).key,c=o.reverse||o,s=o.closed?\\\"M\\\":\\\"L\\\",t):l},t.tension=function(n){return arguments.length?(f=n,t):f},t}function Ii(n){return n.radius}function Yi(n){return[n.x,n.y]}function Zi(n){return function(){var t=n.apply(this,arguments),e=t[0],r=t[1]-Ha;return[e*Math.cos(r),e*Math.sin(r)]}}function Vi(){return 64}function Xi(){return\\\"circle\\\"}function $i(n){var t=Math.sqrt(n/ja);return\\\"M0,\\\"+t+\\\"A\\\"+t+\\\",\\\"+t+\\\" 0 1,1 0,\\\"+-t+\\\"A\\\"+t+\\\",\\\"+t+\\\" 0 1,1 0,\\\"+t+\\\"Z\\\"}function Bi(n){return function(){var t,e,r;(t=this[n])&&(r=t[e=t.active])&&(r.timer.c=null,r.timer.t=NaN,--t.count?delete t[e]:delete this[n],t.active+=.5,r.event&&r.event.interrupt.call(this,this.__data__,r.index))}}function Wi(n,t,e){return Sa(n,Il),n.namespace=t,n.id=e,n}function Ji(n,t,e,r){var u=n.id,i=n.namespace;return Y(n,\\\"function\\\"==typeof e?function(n,a,o){n[i][u].tween.set(t,r(e.call(n,n.__data__,a,o)))}:(e=r(e),function(n){n[i][u].tween.set(t,e)}))}function Gi(n){return null==n&&(n=\\\"\\\"),function(){this.textContent=n}}function Ki(n){return null==n?\\\"__transition__\\\":\\\"__transition_\\\"+n+\\\"__\\\"}function Qi(n,t,e,r,u){function i(n){var t=v.delay;return s.t=t+l,n>=t?a(n-t):void(s.c=a)}function a(e){var u=p.active,i=p[u];i&&(i.timer.c=null,i.timer.t=NaN,--p.count,delete p[u],i.event&&i.event.interrupt.call(n,n.__data__,i.index));for(var a in p)if(r>+a){var c=p[a];c.timer.c=null,c.timer.t=NaN,--p.count,delete p[a]}s.c=o,qn(function(){return s.c&&o(e||1)&&(s.c=null,s.t=NaN),1},0,l),p.active=r,v.event&&v.event.start.call(n,n.__data__,t),g=[],v.tween.forEach(function(e,r){(r=r.call(n,n.__data__,t))&&g.push(r)}),h=v.ease,f=v.duration}function o(u){for(var i=u/f,a=h(i),o=g.length;o>0;)g[--o].call(n,a);return i>=1?(v.event&&v.event.end.call(n,n.__data__,t),--p.count?delete p[r]:delete n[e],1):void 0}var l,s,f,h,g,p=n[e]||(n[e]={active:0,count:0}),v=p[r];v||(l=u.time,s=qn(i,0,l),v=p[r]={tween:new c,time:l,timer:s,delay:u.delay,duration:u.duration,ease:u.ease,index:t},u=null,++p.count)}function na(n,t,e){n.attr(\\\"transform\\\",function(n){var r=t(n);return\\\"translate(\\\"+(isFinite(r)?r:e(n))+\\\",0)\\\"})}function ta(n,t,e){n.attr(\\\"transform\\\",function(n){var r=t(n);return\\\"translate(0,\\\"+(isFinite(r)?r:e(n))+\\\")\\\"})}function ea(n){return n.toISOString()}function ra(n,t,e){function r(t){return n(t)}function u(n,e){var r=n[1]-n[0],u=r/e,i=oa.bisect(Gl,u);return i==Gl.length?[t.year,Ku(n.map(function(n){return n/31536e6}),e)[2]]:i?t[u/Gl[i-1]<Gl[i]/u?i-1:i]:[nc,Ku(n,e)[2]]}return r.invert=function(t){return ua(n.invert(t))},r.domain=function(t){return arguments.length?(n.domain(t),r):n.domain().map(ua)},r.nice=function(n,t){function e(e){return!isNaN(e)&&!n.range(e,ua(+e+1),t).length}var i=r.domain(),a=Yu(i),o=null==n?u(a,10):\\\"number\\\"==typeof n&&u(a,n);return o&&(n=o[0],t=o[1]),r.domain(Xu(i,t>1?{floor:function(t){for(;e(t=n.floor(t));)t=ua(t-1);return t},ceil:function(t){for(;e(t=n.ceil(t));)t=ua(+t+1);return t}}:n))},r.ticks=function(n,t){var e=Yu(r.domain()),i=null==n?u(e,10):\\\"number\\\"==typeof n?u(e,n):!n.range&&[{range:n},t];return i&&(n=i[0],t=i[1]),n.range(e[0],ua(+e[1]+1),1>t?1:t)},r.tickFormat=function(){return e},r.copy=function(){return ra(n.copy(),t,e)},Ju(r,n)}function ua(n){return new Date(n)}function ia(n){return JSON.parse(n.responseText)}function aa(n){var t=sa.createRange();return t.selectNode(sa.body),t.createContextualFragment(n.responseText)}var oa={version:\\\"3.5.12\\\"},la=[].slice,ca=function(n){return la.call(n)},sa=this.document;if(sa)try{ca(sa.documentElement.childNodes)[0].nodeType}catch(fa){ca=function(n){for(var t=n.length,e=new Array(t);t--;)e[t]=n[t];return e}}if(Date.now||(Date.now=function(){return+new Date}),sa)try{sa.createElement(\\\"DIV\\\").style.setProperty(\\\"opacity\\\",0,\\\"\\\")}catch(ha){var ga=this.Element.prototype,pa=ga.setAttribute,va=ga.setAttributeNS,da=this.CSSStyleDeclaration.prototype,ma=da.setProperty;ga.setAttribute=function(n,t){pa.call(this,n,t+\\\"\\\")},ga.setAttributeNS=function(n,t,e){va.call(this,n,t,e+\\\"\\\")},da.setProperty=function(n,t,e){ma.call(this,n,t+\\\"\\\",e)}}oa.ascending=e,oa.descending=function(n,t){return n>t?-1:t>n?1:t>=n?0:NaN},oa.min=function(n,t){var e,r,u=-1,i=n.length;if(1===arguments.length){for(;++u<i;)if(null!=(r=n[u])&&r>=r){e=r;break}for(;++u<i;)null!=(r=n[u])&&e>r&&(e=r)}else{for(;++u<i;)if(null!=(r=t.call(n,n[u],u))&&r>=r){e=r;break}for(;++u<i;)null!=(r=t.call(n,n[u],u))&&e>r&&(e=r)}return e},oa.max=function(n,t){var e,r,u=-1,i=n.length;if(1===arguments.length){for(;++u<i;)if(null!=(r=n[u])&&r>=r){e=r;break}for(;++u<i;)null!=(r=n[u])&&r>e&&(e=r)}else{for(;++u<i;)if(null!=(r=t.call(n,n[u],u))&&r>=r){e=r;break}for(;++u<i;)null!=(r=t.call(n,n[u],u))&&r>e&&(e=r)}return e},oa.extent=function(n,t){var e,r,u,i=-1,a=n.length;if(1===arguments.length){for(;++i<a;)if(null!=(r=n[i])&&r>=r){e=u=r;break}for(;++i<a;)null!=(r=n[i])&&(e>r&&(e=r),r>u&&(u=r))}else{for(;++i<a;)if(null!=(r=t.call(n,n[i],i))&&r>=r){e=u=r;break}for(;++i<a;)null!=(r=t.call(n,n[i],i))&&(e>r&&(e=r),r>u&&(u=r))}return[e,u]},oa.sum=function(n,t){var e,r=0,i=n.length,a=-1;if(1===arguments.length)for(;++a<i;)u(e=+n[a])&&(r+=e);else for(;++a<i;)u(e=+t.call(n,n[a],a))&&(r+=e);return r},oa.mean=function(n,t){var e,i=0,a=n.length,o=-1,l=a;if(1===arguments.length)for(;++o<a;)u(e=r(n[o]))?i+=e:--l;else for(;++o<a;)u(e=r(t.call(n,n[o],o)))?i+=e:--l;return l?i/l:void 0},oa.quantile=function(n,t){var e=(n.length-1)*t+1,r=Math.floor(e),u=+n[r-1],i=e-r;return i?u+i*(n[r]-u):u},oa.median=function(n,t){var i,a=[],o=n.length,l=-1;if(1===arguments.length)for(;++l<o;)u(i=r(n[l]))&&a.push(i);else for(;++l<o;)u(i=r(t.call(n,n[l],l)))&&a.push(i);return a.length?oa.quantile(a.sort(e),.5):void 0},oa.variance=function(n,t){var e,i,a=n.length,o=0,l=0,c=-1,s=0;if(1===arguments.length)for(;++c<a;)u(e=r(n[c]))&&(i=e-o,o+=i/++s,l+=i*(e-o));else for(;++c<a;)u(e=r(t.call(n,n[c],c)))&&(i=e-o,o+=i/++s,l+=i*(e-o));return s>1?l/(s-1):void 0},oa.deviation=function(){var n=oa.variance.apply(this,arguments);return n?Math.sqrt(n):n};var ya=i(e);oa.bisectLeft=ya.left,oa.bisect=oa.bisectRight=ya.right,oa.bisector=function(n){return i(1===n.length?function(t,r){return e(n(t),r)}:n)},oa.shuffle=function(n,t,e){(i=arguments.length)<3&&(e=n.length,2>i&&(t=0));for(var r,u,i=e-t;i;)u=Math.random()*i--|0,r=n[i+t],n[i+t]=n[u+t],n[u+t]=r;return n},oa.permute=function(n,t){for(var e=t.length,r=new Array(e);e--;)r[e]=n[t[e]];return r},oa.pairs=function(n){for(var t,e=0,r=n.length-1,u=n[0],i=new Array(0>r?0:r);r>e;)i[e]=[t=u,u=n[++e]];return i},oa.zip=function(){if(!(r=arguments.length))return[];for(var n=-1,t=oa.min(arguments,a),e=new Array(t);++n<t;)for(var r,u=-1,i=e[n]=new Array(r);++u<r;)i[u]=arguments[u][n];return e},oa.transpose=function(n){return oa.zip.apply(oa,n)},oa.keys=function(n){var t=[];for(var e in n)t.push(e);return t},oa.values=function(n){var t=[];for(var e in n)t.push(n[e]);return t},oa.entries=function(n){var t=[];for(var e in n)t.push({key:e,value:n[e]});return t},oa.merge=function(n){for(var t,e,r,u=n.length,i=-1,a=0;++i<u;)a+=n[i].length;for(e=new Array(a);--u>=0;)for(r=n[u],t=r.length;--t>=0;)e[--a]=r[t];return e};var Ma=Math.abs;oa.range=function(n,t,e){if(arguments.length<3&&(e=1,arguments.length<2&&(t=n,n=0)),(t-n)/e===1/0)throw new Error(\\\"infinite range\\\");var r,u=[],i=o(Ma(e)),a=-1;if(n*=i,t*=i,e*=i,0>e)for(;(r=n+e*++a)>t;)u.push(r/i);else for(;(r=n+e*++a)<t;)u.push(r/i);return u},oa.map=function(n,t){var e=new c;if(n instanceof c)n.forEach(function(n,t){e.set(n,t)});else if(Array.isArray(n)){var r,u=-1,i=n.length;if(1===arguments.length)for(;++u<i;)e.set(u,n[u]);else for(;++u<i;)e.set(t.call(n,r=n[u],u),r)}else for(var a in n)e.set(a,n[a]);return e};var xa=\\\"__proto__\\\",ba=\\\"\\\\x00\\\";l(c,{has:h,get:function(n){return this._[s(n)]},set:function(n,t){return this._[s(n)]=t},remove:g,keys:p,values:function(){var n=[];for(var t in this._)n.push(this._[t]);return n},entries:function(){var n=[];for(var t in this._)n.push({key:f(t),value:this._[t]});return n},size:v,empty:d,forEach:function(n){for(var t in this._)n.call(this,f(t),this._[t])}}),oa.nest=function(){function n(t,a,o){if(o>=i.length)return r?r.call(u,a):e?a.sort(e):a;for(var l,s,f,h,g=-1,p=a.length,v=i[o++],d=new c;++g<p;)(h=d.get(l=v(s=a[g])))?h.push(s):d.set(l,[s]);return t?(s=t(),f=function(e,r){s.set(e,n(t,r,o))}):(s={},f=function(e,r){s[e]=n(t,r,o)}),d.forEach(f),s}function t(n,e){if(e>=i.length)return n;var r=[],u=a[e++];return n.forEach(function(n,u){r.push({key:n,values:t(u,e)})}),u?r.sort(function(n,t){return u(n.key,t.key)}):r}var e,r,u={},i=[],a=[];return u.map=function(t,e){return n(e,t,0)},u.entries=function(e){return t(n(oa.map,e,0),0)},u.key=function(n){return i.push(n),u},u.sortKeys=function(n){return a[i.length-1]=n,u},u.sortValues=function(n){return e=n,u},u.rollup=function(n){return r=n,u},u},oa.set=function(n){var t=new m;if(n)for(var e=0,r=n.length;r>e;++e)t.add(n[e]);return t},l(m,{has:h,add:function(n){return this._[s(n+=\\\"\\\")]=!0,n},remove:g,values:p,size:v,empty:d,forEach:function(n){for(var t in this._)n.call(this,f(t))}}),oa.behavior={},oa.rebind=function(n,t){for(var e,r=1,u=arguments.length;++r<u;)n[e=arguments[r]]=M(n,t,t[e]);return n};var _a=[\\\"webkit\\\",\\\"ms\\\",\\\"moz\\\",\\\"Moz\\\",\\\"o\\\",\\\"O\\\"];oa.dispatch=function(){for(var n=new _,t=-1,e=arguments.length;++t<e;)n[arguments[t]]=w(n);return n},_.prototype.on=function(n,t){var e=n.indexOf(\\\".\\\"),r=\\\"\\\";if(e>=0&&(r=n.slice(e+1),n=n.slice(0,e)),n)return arguments.length<2?this[n].on(r):this[n].on(r,t);if(2===arguments.length){if(null==t)for(n in this)this.hasOwnProperty(n)&&this[n].on(r,null);return this}},oa.event=null,oa.requote=function(n){return n.replace(wa,\\\"\\\\\\\\$&\\\")};var wa=/[\\\\\\\\\\\\^\\\\$\\\\*\\\\+\\\\?\\\\|\\\\[\\\\]\\\\(\\\\)\\\\.\\\\{\\\\}]/g,Sa={}.__proto__?function(n,t){n.__proto__=t}:function(n,t){for(var e in t)n[e]=t[e]},ka=function(n,t){return t.querySelector(n)},Na=function(n,t){return t.querySelectorAll(n)},Ea=function(n,t){var e=n.matches||n[x(n,\\\"matchesSelector\\\")];return(Ea=function(n,t){return e.call(n,t)})(n,t)};\\\"function\\\"==typeof Sizzle&&(ka=function(n,t){return Sizzle(n,t)[0]||null},Na=Sizzle,Ea=Sizzle.matchesSelector),oa.selection=function(){return oa.select(sa.documentElement)};var Aa=oa.selection.prototype=[];Aa.select=function(n){var t,e,r,u,i=[];n=A(n);for(var a=-1,o=this.length;++a<o;){i.push(t=[]),t.parentNode=(r=this[a]).parentNode;for(var l=-1,c=r.length;++l<c;)(u=r[l])?(t.push(e=n.call(u,u.__data__,l,a)),e&&\\\"__data__\\\"in u&&(e.__data__=u.__data__)):t.push(null)}return E(i)},Aa.selectAll=function(n){var t,e,r=[];n=C(n);for(var u=-1,i=this.length;++u<i;)for(var a=this[u],o=-1,l=a.length;++o<l;)(e=a[o])&&(r.push(t=ca(n.call(e,e.__data__,o,u))),t.parentNode=e);return E(r)};var Ca={svg:\\\"http://www.w3.org/2000/svg\\\",xhtml:\\\"http://www.w3.org/1999/xhtml\\\",xlink:\\\"http://www.w3.org/1999/xlink\\\",xml:\\\"http://www.w3.org/XML/1998/namespace\\\",xmlns:\\\"http://www.w3.org/2000/xmlns/\\\"};oa.ns={prefix:Ca,qualify:function(n){var t=n.indexOf(\\\":\\\"),e=n;return t>=0&&\\\"xmlns\\\"!==(e=n.slice(0,t))&&(n=n.slice(t+1)),Ca.hasOwnProperty(e)?{space:Ca[e],local:n}:n}},Aa.attr=function(n,t){if(arguments.length<2){if(\\\"string\\\"==typeof n){var e=this.node();return n=oa.ns.qualify(n),n.local?e.getAttributeNS(n.space,n.local):e.getAttribute(n)}for(t in n)this.each(z(t,n[t]));return this}return this.each(z(n,t))},Aa.classed=function(n,t){if(arguments.length<2){if(\\\"string\\\"==typeof n){var e=this.node(),r=(n=T(n)).length,u=-1;if(t=e.classList){for(;++u<r;)if(!t.contains(n[u]))return!1}else for(t=e.getAttribute(\\\"class\\\");++u<r;)if(!q(n[u]).test(t))return!1;return!0}for(t in n)this.each(R(t,n[t]));return this}return this.each(R(n,t))},Aa.style=function(n,e,r){var u=arguments.length;if(3>u){if(\\\"string\\\"!=typeof n){2>u&&(e=\\\"\\\");for(r in n)this.each(P(r,n[r],e));return this}if(2>u){var i=this.node();return t(i).getComputedStyle(i,null).getPropertyValue(n)}r=\\\"\\\"}return this.each(P(n,e,r))},Aa.property=function(n,t){if(arguments.length<2){if(\\\"string\\\"==typeof n)return this.node()[n];for(t in n)this.each(j(t,n[t]));return this}return this.each(j(n,t))},Aa.text=function(n){return arguments.length?this.each(\\\"function\\\"==typeof n?function(){var t=n.apply(this,arguments);this.textContent=null==t?\\\"\\\":t}:null==n?function(){this.textContent=\\\"\\\"}:function(){this.textContent=n}):this.node().textContent},Aa.html=function(n){return arguments.length?this.each(\\\"function\\\"==typeof n?function(){var t=n.apply(this,arguments);this.innerHTML=null==t?\\\"\\\":t}:null==n?function(){this.innerHTML=\\\"\\\"}:function(){this.innerHTML=n}):this.node().innerHTML},Aa.append=function(n){return n=U(n),this.select(function(){return this.appendChild(n.apply(this,arguments))})},Aa.insert=function(n,t){return n=U(n),t=A(t),this.select(function(){return this.insertBefore(n.apply(this,arguments),t.apply(this,arguments)||null)})},Aa.remove=function(){return this.each(F)},Aa.data=function(n,t){function e(n,e){var r,u,i,a=n.length,f=e.length,h=Math.min(a,f),g=new Array(f),p=new Array(f),v=new Array(a);if(t){var d,m=new c,y=new Array(a);for(r=-1;++r<a;)(u=n[r])&&(m.has(d=t.call(u,u.__data__,r))?v[r]=u:m.set(d,u),y[r]=d);for(r=-1;++r<f;)(u=m.get(d=t.call(e,i=e[r],r)))?u!==!0&&(g[r]=u,u.__data__=i):p[r]=H(i),m.set(d,!0);for(r=-1;++r<a;)r in y&&m.get(y[r])!==!0&&(v[r]=n[r])}else{for(r=-1;++r<h;)u=n[r],i=e[r],u?(u.__data__=i,g[r]=u):p[r]=H(i);for(;f>r;++r)p[r]=H(e[r]);for(;a>r;++r)v[r]=n[r]}p.update=g,p.parentNode=g.parentNode=v.parentNode=n.parentNode,o.push(p),l.push(g),s.push(v)}var r,u,i=-1,a=this.length;if(!arguments.length){for(n=new Array(a=(r=this[0]).length);++i<a;)(u=r[i])&&(n[i]=u.__data__);return n}var o=Z([]),l=E([]),s=E([]);if(\\\"function\\\"==typeof n)for(;++i<a;)e(r=this[i],n.call(r,r.parentNode.__data__,i));else for(;++i<a;)e(r=this[i],n);return l.enter=function(){return o},l.exit=function(){return s},l},Aa.datum=function(n){return arguments.length?this.property(\\\"__data__\\\",n):this.property(\\\"__data__\\\")},Aa.filter=function(n){var t,e,r,u=[];\\\"function\\\"!=typeof n&&(n=O(n));for(var i=0,a=this.length;a>i;i++){u.push(t=[]),t.parentNode=(e=this[i]).parentNode;for(var o=0,l=e.length;l>o;o++)(r=e[o])&&n.call(r,r.__data__,o,i)&&t.push(r)}return E(u)},Aa.order=function(){for(var n=-1,t=this.length;++n<t;)for(var e,r=this[n],u=r.length-1,i=r[u];--u>=0;)(e=r[u])&&(i&&i!==e.nextSibling&&i.parentNode.insertBefore(e,i),i=e);return this},Aa.sort=function(n){n=I.apply(this,arguments);for(var t=-1,e=this.length;++t<e;)this[t].sort(n);return this.order()},Aa.each=function(n){return Y(this,function(t,e,r){n.call(t,t.__data__,e,r)})},Aa.call=function(n){var t=ca(arguments);return n.apply(t[0]=this,t),this},Aa.empty=function(){return!this.node()},Aa.node=function(){for(var n=0,t=this.length;t>n;n++)for(var e=this[n],r=0,u=e.length;u>r;r++){var i=e[r];if(i)return i}return null},Aa.size=function(){var n=0;return Y(this,function(){++n}),n};var za=[];oa.selection.enter=Z,oa.selection.enter.prototype=za,za.append=Aa.append,za.empty=Aa.empty,za.node=Aa.node,za.call=Aa.call,za.size=Aa.size,za.select=function(n){for(var t,e,r,u,i,a=[],o=-1,l=this.length;++o<l;){r=(u=this[o]).update,a.push(t=[]),t.parentNode=u.parentNode;for(var c=-1,s=u.length;++c<s;)(i=u[c])?(t.push(r[c]=e=n.call(u.parentNode,i.__data__,c,o)),e.__data__=i.__data__):t.push(null)}return E(a)},za.insert=function(n,t){return arguments.length<2&&(t=V(this)),Aa.insert.call(this,n,t)},oa.select=function(t){var e;return\\\"string\\\"==typeof t?(e=[ka(t,sa)],e.parentNode=sa.documentElement):(e=[t],e.parentNode=n(t)),E([e])},oa.selectAll=function(n){var t;return\\\"string\\\"==typeof n?(t=ca(Na(n,sa)),t.parentNode=sa.documentElement):(t=ca(n),t.parentNode=null),E([t])},Aa.on=function(n,t,e){var r=arguments.length;if(3>r){if(\\\"string\\\"!=typeof n){2>r&&(t=!1);for(e in n)this.each(X(e,n[e],t));return this}if(2>r)return(r=this.node()[\\\"__on\\\"+n])&&r._;e=!1}return this.each(X(n,t,e))};var La=oa.map({mouseenter:\\\"mouseover\\\",mouseleave:\\\"mouseout\\\"});sa&&La.forEach(function(n){\\\"on\\\"+n in sa&&La.remove(n)});var qa,Ta=0;oa.mouse=function(n){return J(n,k())};var Ra=this.navigator&&/WebKit/.test(this.navigator.userAgent)?-1:0;oa.touch=function(n,t,e){if(arguments.length<3&&(e=t,t=k().changedTouches),t)for(var r,u=0,i=t.length;i>u;++u)if((r=t[u]).identifier===e)return J(n,r)},oa.behavior.drag=function(){function n(){this.on(\\\"mousedown.drag\\\",i).on(\\\"touchstart.drag\\\",a)}function e(n,t,e,i,a){return function(){function o(){var n,e,r=t(h,v);r&&(n=r[0]-M[0],e=r[1]-M[1],p|=n|e,M=r,g({type:\\\"drag\\\",x:r[0]+c[0],y:r[1]+c[1],dx:n,dy:e}))}function l(){t(h,v)&&(m.on(i+d,null).on(a+d,null),y(p),g({type:\\\"dragend\\\"}))}var c,s=this,f=oa.event.target,h=s.parentNode,g=r.of(s,arguments),p=0,v=n(),d=\\\".drag\\\"+(null==v?\\\"\\\":\\\"-\\\"+v),m=oa.select(e(f)).on(i+d,o).on(a+d,l),y=W(f),M=t(h,v);u?(c=u.apply(s,arguments),c=[c.x-M[0],c.y-M[1]]):c=[0,0],g({type:\\\"dragstart\\\"})}}var r=N(n,\\\"drag\\\",\\\"dragstart\\\",\\\"dragend\\\"),u=null,i=e(b,oa.mouse,t,\\\"mousemove\\\",\\\"mouseup\\\"),a=e(G,oa.touch,y,\\\"touchmove\\\",\\\"touchend\\\");return n.origin=function(t){return arguments.length?(u=t,n):u},oa.rebind(n,r,\\\"on\\\")},oa.touches=function(n,t){return arguments.length<2&&(t=k().touches),t?ca(t).map(function(t){var e=J(n,t);return e.identifier=t.identifier,e}):[]};var Da=1e-6,Pa=Da*Da,ja=Math.PI,Ua=2*ja,Fa=Ua-Da,Ha=ja/2,Oa=ja/180,Ia=180/ja,Ya=Math.SQRT2,Za=2,Va=4;oa.interpolateZoom=function(n,t){var e,r,u=n[0],i=n[1],a=n[2],o=t[0],l=t[1],c=t[2],s=o-u,f=l-i,h=s*s+f*f;if(Pa>h)r=Math.log(c/a)/Ya,e=function(n){return[u+n*s,i+n*f,a*Math.exp(Ya*n*r)]};else{var g=Math.sqrt(h),p=(c*c-a*a+Va*h)/(2*a*Za*g),v=(c*c-a*a-Va*h)/(2*c*Za*g),d=Math.log(Math.sqrt(p*p+1)-p),m=Math.log(Math.sqrt(v*v+1)-v);r=(m-d)/Ya,e=function(n){var t=n*r,e=rn(d),o=a/(Za*g)*(e*un(Ya*t+d)-en(d));return[u+o*s,i+o*f,a*e/rn(Ya*t+d)]}}return e.duration=1e3*r,e},oa.behavior.zoom=function(){function n(n){n.on(L,f).on($a+\\\".zoom\\\",g).on(\\\"dblclick.zoom\\\",p).on(R,h)}function e(n){return[(n[0]-k.x)/k.k,(n[1]-k.y)/k.k]}function r(n){return[n[0]*k.k+k.x,n[1]*k.k+k.y]}function u(n){k.k=Math.max(A[0],Math.min(A[1],n))}function i(n,t){t=r(t),k.x+=n[0]-t[0],k.y+=n[1]-t[1]}function a(t,e,r,a){t.__chart__={x:k.x,y:k.y,k:k.k},u(Math.pow(2,a)),i(d=e,r),t=oa.select(t),C>0&&(t=t.transition().duration(C)),t.call(n.event)}function o(){b&&b.domain(x.range().map(function(n){return(n-k.x)/k.k}).map(x.invert)),w&&w.domain(_.range().map(function(n){return(n-k.y)/k.k}).map(_.invert))}function l(n){z++||n({type:\\\"zoomstart\\\"})}function c(n){o(),n({type:\\\"zoom\\\",scale:k.k,translate:[k.x,k.y]})}function s(n){--z||(n({type:\\\"zoomend\\\"}),d=null)}function f(){function n(){o=1,i(oa.mouse(u),h),c(a)}function r(){f.on(q,null).on(T,null),g(o),s(a)}var u=this,a=D.of(u,arguments),o=0,f=oa.select(t(u)).on(q,n).on(T,r),h=e(oa.mouse(u)),g=W(u);Ol.call(u),l(a)}function h(){function n(){var n=oa.touches(p);return g=k.k,n.forEach(function(n){n.identifier in d&&(d[n.identifier]=e(n))}),n}function t(){var t=oa.event.target;oa.select(t).on(x,r).on(b,o),_.push(t);for(var e=oa.event.changedTouches,u=0,i=e.length;i>u;++u)d[e[u].identifier]=null;var l=n(),c=Date.now();if(1===l.length){if(500>c-M){var s=l[0];a(p,s,d[s.identifier],Math.floor(Math.log(k.k)/Math.LN2)+1),S()}M=c}else if(l.length>1){var s=l[0],f=l[1],h=s[0]-f[0],g=s[1]-f[1];m=h*h+g*g}}function r(){var n,t,e,r,a=oa.touches(p);Ol.call(p);for(var o=0,l=a.length;l>o;++o,r=null)if(e=a[o],r=d[e.identifier]){if(t)break;n=e,t=r}if(r){var s=(s=e[0]-n[0])*s+(s=e[1]-n[1])*s,f=m&&Math.sqrt(s/m);n=[(n[0]+e[0])/2,(n[1]+e[1])/2],t=[(t[0]+r[0])/2,(t[1]+r[1])/2],u(f*g)}M=null,i(n,t),c(v)}function o(){if(oa.event.touches.length){for(var t=oa.event.changedTouches,e=0,r=t.length;r>e;++e)delete d[t[e].identifier];for(var u in d)return void n()}oa.selectAll(_).on(y,null),w.on(L,f).on(R,h),N(),s(v)}var g,p=this,v=D.of(p,arguments),d={},m=0,y=\\\".zoom-\\\"+oa.event.changedTouches[0].identifier,x=\\\"touchmove\\\"+y,b=\\\"touchend\\\"+y,_=[],w=oa.select(p),N=W(p);t(),l(v),w.on(L,null).on(R,t)}function g(){var n=D.of(this,arguments);y?clearTimeout(y):(Ol.call(this),v=e(d=m||oa.mouse(this)),l(n)),y=setTimeout(function(){y=null,s(n)},50),S(),u(Math.pow(2,.002*Xa())*k.k),i(d,v),c(n)}function p(){var n=oa.mouse(this),t=Math.log(k.k)/Math.LN2;a(this,n,e(n),oa.event.shiftKey?Math.ceil(t)-1:Math.floor(t)+1)}var v,d,m,y,M,x,b,_,w,k={x:0,y:0,k:1},E=[960,500],A=Ba,C=250,z=0,L=\\\"mousedown.zoom\\\",q=\\\"mousemove.zoom\\\",T=\\\"mouseup.zoom\\\",R=\\\"touchstart.zoom\\\",D=N(n,\\\"zoomstart\\\",\\\"zoom\\\",\\\"zoomend\\\");return $a||($a=\\\"onwheel\\\"in sa?(Xa=function(){return-oa.event.deltaY*(oa.event.deltaMode?120:1)},\\\"wheel\\\"):\\\"onmousewheel\\\"in sa?(Xa=function(){return oa.event.wheelDelta},\\\"mousewheel\\\"):(Xa=function(){return-oa.event.detail},\\\"MozMousePixelScroll\\\")),n.event=function(n){n.each(function(){var n=D.of(this,arguments),t=k;Fl?oa.select(this).transition().each(\\\"start.zoom\\\",function(){k=this.__chart__||{x:0,y:0,k:1},l(n)}).tween(\\\"zoom:zoom\\\",function(){var e=E[0],r=E[1],u=d?d[0]:e/2,i=d?d[1]:r/2,a=oa.interpolateZoom([(u-k.x)/k.k,(i-k.y)/k.k,e/k.k],[(u-t.x)/t.k,(i-t.y)/t.k,e/t.k]);return function(t){var r=a(t),o=e/r[2];this.__chart__=k={x:u-r[0]*o,y:i-r[1]*o,k:o},c(n)}}).each(\\\"interrupt.zoom\\\",function(){s(n)}).each(\\\"end.zoom\\\",function(){s(n)}):(this.__chart__=k,l(n),c(n),s(n))})},n.translate=function(t){return arguments.length?(k={x:+t[0],y:+t[1],k:k.k},o(),n):[k.x,k.y]},n.scale=function(t){return arguments.length?(k={x:k.x,y:k.y,k:null},u(+t),o(),n):k.k},n.scaleExtent=function(t){return arguments.length?(A=null==t?Ba:[+t[0],+t[1]],n):A},n.center=function(t){return arguments.length?(m=t&&[+t[0],+t[1]],n):m},n.size=function(t){return arguments.length?(E=t&&[+t[0],+t[1]],n):E},n.duration=function(t){return arguments.length?(C=+t,n):C},n.x=function(t){return arguments.length?(b=t,x=t.copy(),k={x:0,y:0,k:1},n):b},n.y=function(t){return arguments.length?(w=t,_=t.copy(),k={x:0,y:0,k:1},n):w},oa.rebind(n,D,\\\"on\\\")};var Xa,$a,Ba=[0,1/0];oa.color=on,on.prototype.toString=function(){return this.rgb()+\\\"\\\"},oa.hsl=ln;var Wa=ln.prototype=new on;Wa.brighter=function(n){return n=Math.pow(.7,arguments.length?n:1),new ln(this.h,this.s,this.l/n)},Wa.darker=function(n){return n=Math.pow(.7,arguments.length?n:1),new ln(this.h,this.s,n*this.l)},Wa.rgb=function(){return cn(this.h,this.s,this.l)},oa.hcl=sn;var Ja=sn.prototype=new on;Ja.brighter=function(n){return new sn(this.h,this.c,Math.min(100,this.l+Ga*(arguments.length?n:1)))},Ja.darker=function(n){return new sn(this.h,this.c,Math.max(0,this.l-Ga*(arguments.length?n:1)))},Ja.rgb=function(){return fn(this.h,this.c,this.l).rgb()},oa.lab=hn;var Ga=18,Ka=.95047,Qa=1,no=1.08883,to=hn.prototype=new on;to.brighter=function(n){return new hn(Math.min(100,this.l+Ga*(arguments.length?n:1)),this.a,this.b)},to.darker=function(n){return new hn(Math.max(0,this.l-Ga*(arguments.length?n:1)),this.a,this.b)},to.rgb=function(){return gn(this.l,this.a,this.b)},oa.rgb=yn;var eo=yn.prototype=new on;eo.brighter=function(n){n=Math.pow(.7,arguments.length?n:1);var t=this.r,e=this.g,r=this.b,u=30;return t||e||r?(t&&u>t&&(t=u),e&&u>e&&(e=u),r&&u>r&&(r=u),new yn(Math.min(255,t/n),Math.min(255,e/n),Math.min(255,r/n))):new yn(u,u,u)},eo.darker=function(n){return n=Math.pow(.7,arguments.length?n:1),new yn(n*this.r,n*this.g,n*this.b)},eo.hsl=function(){return wn(this.r,this.g,this.b)},eo.toString=function(){return\\\"#\\\"+bn(this.r)+bn(this.g)+bn(this.b)};var ro=oa.map({aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074});ro.forEach(function(n,t){ro.set(n,Mn(t))}),oa.functor=En,oa.xhr=An(y),oa.dsv=function(n,t){function e(n,e,i){arguments.length<3&&(i=e,e=null);var a=Cn(n,t,null==e?r:u(e),i);return a.row=function(n){return arguments.length?a.response(null==(e=n)?r:u(n)):e},a}function r(n){return e.parse(n.responseText)}function u(n){return function(t){return e.parse(t.responseText,n)}}function i(t){return t.map(a).join(n)}function a(n){return o.test(n)?'\\\"'+n.replace(/\\\\\\\"/g,'\\\"\\\"')+'\\\"':n}var o=new RegExp('[\\\"'+n+\\\"\\\\n]\\\"),l=n.charCodeAt(0);return e.parse=function(n,t){var r;return e.parseRows(n,function(n,e){if(r)return r(n,e-1);var u=new Function(\\\"d\\\",\\\"return {\\\"+n.map(function(n,t){return JSON.stringify(n)+\\\": d[\\\"+t+\\\"]\\\"}).join(\\\",\\\")+\\\"}\\\");r=t?function(n,e){return t(u(n),e)}:u})},e.parseRows=function(n,t){function e(){if(s>=c)return a;if(u)return u=!1,i;var t=s;if(34===n.charCodeAt(t)){for(var e=t;e++<c;)if(34===n.charCodeAt(e)){if(34!==n.charCodeAt(e+1))break;++e}s=e+2;var r=n.charCodeAt(e+1);return 13===r?(u=!0,10===n.charCodeAt(e+2)&&++s):10===r&&(u=!0),n.slice(t+1,e).replace(/\\\"\\\"/g,'\\\"')}for(;c>s;){var r=n.charCodeAt(s++),o=1;if(10===r)u=!0;else if(13===r)u=!0,10===n.charCodeAt(s)&&(++s,++o);else if(r!==l)continue;return n.slice(t,s-o)}return n.slice(t)}for(var r,u,i={},a={},o=[],c=n.length,s=0,f=0;(r=e())!==a;){for(var h=[];r!==i&&r!==a;)h.push(r),r=e();t&&null==(h=t(h,f++))||o.push(h)}return o},e.format=function(t){if(Array.isArray(t[0]))return e.formatRows(t);var r=new m,u=[];return t.forEach(function(n){for(var t in n)r.has(t)||u.push(r.add(t))}),[u.map(a).join(n)].concat(t.map(function(t){return u.map(function(n){return a(t[n])}).join(n)})).join(\\\"\\\\n\\\")},e.formatRows=function(n){return n.map(i).join(\\\"\\\\n\\\")},e},oa.csv=oa.dsv(\\\",\\\",\\\"text/csv\\\"),oa.tsv=oa.dsv(\\\"\\t\\\",\\\"text/tab-separated-values\\\");var uo,io,ao,oo,lo=this[x(this,\\\"requestAnimationFrame\\\")]||function(n){setTimeout(n,17)};oa.timer=function(){qn.apply(this,arguments)},oa.timer.flush=function(){Rn(),Dn()},oa.round=function(n,t){return t?Math.round(n*(t=Math.pow(10,t)))/t:Math.round(n)};var co=[\\\"y\\\",\\\"z\\\",\\\"a\\\",\\\"f\\\",\\\"p\\\",\\\"n\\\",\\\"\\\\xb5\\\",\\\"m\\\",\\\"\\\",\\\"k\\\",\\\"M\\\",\\\"G\\\",\\\"T\\\",\\\"P\\\",\\\"E\\\",\\\"Z\\\",\\\"Y\\\"].map(jn);oa.formatPrefix=function(n,t){var e=0;return(n=+n)&&(0>n&&(n*=-1),t&&(n=oa.round(n,Pn(n,t))),e=1+Math.floor(1e-12+Math.log(n)/Math.LN10),e=Math.max(-24,Math.min(24,3*Math.floor((e-1)/3)))),co[8+e/3]};var so=/(?:([^{])?([<>=^]))?([+\\\\- ])?([$#])?(0)?(\\\\d+)?(,)?(\\\\.-?\\\\d+)?([a-z%])?/i,fo=oa.map({b:function(n){return n.toString(2)},c:function(n){return String.fromCharCode(n)},o:function(n){return n.toString(8)},x:function(n){return n.toString(16)},X:function(n){return n.toString(16).toUpperCase()},g:function(n,t){return n.toPrecision(t)},e:function(n,t){return n.toExponential(t)},f:function(n,t){return n.toFixed(t)},r:function(n,t){return(n=oa.round(n,Pn(n,t))).toFixed(Math.max(0,Math.min(20,Pn(n*(1+1e-15),t))))}}),ho=oa.time={},go=Date;Hn.prototype={getDate:function(){return this._.getUTCDate()},getDay:function(){return this._.getUTCDay()},getFullYear:function(){return this._.getUTCFullYear()},getHours:function(){return this._.getUTCHours()},getMilliseconds:function(){return this._.getUTCMilliseconds()},getMinutes:function(){return this._.getUTCMinutes()},getMonth:function(){return this._.getUTCMonth()},getSeconds:function(){return this._.getUTCSeconds()},getTime:function(){return this._.getTime()},getTimezoneOffset:function(){return 0},valueOf:function(){return this._.valueOf()},setDate:function(){po.setUTCDate.apply(this._,arguments)},setDay:function(){po.setUTCDay.apply(this._,arguments)},setFullYear:function(){po.setUTCFullYear.apply(this._,arguments)},setHours:function(){po.setUTCHours.apply(this._,arguments)},setMilliseconds:function(){po.setUTCMilliseconds.apply(this._,arguments)},setMinutes:function(){po.setUTCMinutes.apply(this._,arguments)},setMonth:function(){po.setUTCMonth.apply(this._,arguments)},setSeconds:function(){po.setUTCSeconds.apply(this._,arguments)},setTime:function(){po.setTime.apply(this._,arguments)}};var po=Date.prototype;ho.year=On(function(n){return n=ho.day(n),n.setMonth(0,1),n},function(n,t){n.setFullYear(n.getFullYear()+t)},function(n){return n.getFullYear()}),ho.years=ho.year.range,ho.years.utc=ho.year.utc.range,ho.day=On(function(n){var t=new go(2e3,0);return t.setFullYear(n.getFullYear(),n.getMonth(),n.getDate()),t},function(n,t){n.setDate(n.getDate()+t)},function(n){return n.getDate()-1}),ho.days=ho.day.range,ho.days.utc=ho.day.utc.range,ho.dayOfYear=function(n){var t=ho.year(n);return Math.floor((n-t-6e4*(n.getTimezoneOffset()-t.getTimezoneOffset()))/864e5)},[\\\"sunday\\\",\\\"monday\\\",\\\"tuesday\\\",\\\"wednesday\\\",\\\"thursday\\\",\\\"friday\\\",\\\"saturday\\\"].forEach(function(n,t){t=7-t;var e=ho[n]=On(function(n){return(n=ho.day(n)).setDate(n.getDate()-(n.getDay()+t)%7),n},function(n,t){n.setDate(n.getDate()+7*Math.floor(t))},function(n){var e=ho.year(n).getDay();return Math.floor((ho.dayOfYear(n)+(e+t)%7)/7)-(e!==t)});ho[n+\\\"s\\\"]=e.range,ho[n+\\\"s\\\"].utc=e.utc.range,ho[n+\\\"OfYear\\\"]=function(n){var e=ho.year(n).getDay();return Math.floor((ho.dayOfYear(n)+(e+t)%7)/7)}}),ho.week=ho.sunday,ho.weeks=ho.sunday.range,ho.weeks.utc=ho.sunday.utc.range,ho.weekOfYear=ho.sundayOfYear;var vo={\\\"-\\\":\\\"\\\",_:\\\" \\\",0:\\\"0\\\"},mo=/^\\\\s*\\\\d+/,yo=/^%/;oa.locale=function(n){return{numberFormat:Un(n),timeFormat:Yn(n)}};var Mo=oa.locale({decimal:\\\".\\\",thousands:\\\",\\\",grouping:[3],currency:[\\\"$\\\",\\\"\\\"],dateTime:\\\"%a %b %e %X %Y\\\",date:\\\"%m/%d/%Y\\\",time:\\\"%H:%M:%S\\\",periods:[\\\"AM\\\",\\\"PM\\\"],days:[\\\"Sunday\\\",\\\"Monday\\\",\\\"Tuesday\\\",\\\"Wednesday\\\",\\\"Thursday\\\",\\\"Friday\\\",\\\"Saturday\\\"],\\n shortDays:[\\\"Sun\\\",\\\"Mon\\\",\\\"Tue\\\",\\\"Wed\\\",\\\"Thu\\\",\\\"Fri\\\",\\\"Sat\\\"],months:[\\\"January\\\",\\\"February\\\",\\\"March\\\",\\\"April\\\",\\\"May\\\",\\\"June\\\",\\\"July\\\",\\\"August\\\",\\\"September\\\",\\\"October\\\",\\\"November\\\",\\\"December\\\"],shortMonths:[\\\"Jan\\\",\\\"Feb\\\",\\\"Mar\\\",\\\"Apr\\\",\\\"May\\\",\\\"Jun\\\",\\\"Jul\\\",\\\"Aug\\\",\\\"Sep\\\",\\\"Oct\\\",\\\"Nov\\\",\\\"Dec\\\"]});oa.format=Mo.numberFormat,oa.geo={},st.prototype={s:0,t:0,add:function(n){ft(n,this.t,xo),ft(xo.s,this.s,this),this.s?this.t+=xo.t:this.s=xo.t},reset:function(){this.s=this.t=0},valueOf:function(){return this.s}};var xo=new st;oa.geo.stream=function(n,t){n&&bo.hasOwnProperty(n.type)?bo[n.type](n,t):ht(n,t)};var bo={Feature:function(n,t){ht(n.geometry,t)},FeatureCollection:function(n,t){for(var e=n.features,r=-1,u=e.length;++r<u;)ht(e[r].geometry,t)}},_o={Sphere:function(n,t){t.sphere()},Point:function(n,t){n=n.coordinates,t.point(n[0],n[1],n[2])},MultiPoint:function(n,t){for(var e=n.coordinates,r=-1,u=e.length;++r<u;)n=e[r],t.point(n[0],n[1],n[2])},LineString:function(n,t){gt(n.coordinates,t,0)},MultiLineString:function(n,t){for(var e=n.coordinates,r=-1,u=e.length;++r<u;)gt(e[r],t,0)},Polygon:function(n,t){pt(n.coordinates,t)},MultiPolygon:function(n,t){for(var e=n.coordinates,r=-1,u=e.length;++r<u;)pt(e[r],t)},GeometryCollection:function(n,t){for(var e=n.geometries,r=-1,u=e.length;++r<u;)ht(e[r],t)}};oa.geo.area=function(n){return wo=0,oa.geo.stream(n,ko),wo};var wo,So=new st,ko={sphere:function(){wo+=4*ja},point:b,lineStart:b,lineEnd:b,polygonStart:function(){So.reset(),ko.lineStart=vt},polygonEnd:function(){var n=2*So;wo+=0>n?4*ja+n:n,ko.lineStart=ko.lineEnd=ko.point=b}};oa.geo.bounds=function(){function n(n,t){M.push(x=[s=n,h=n]),f>t&&(f=t),t>g&&(g=t)}function t(t,e){var r=dt([t*Oa,e*Oa]);if(m){var u=yt(m,r),i=[u[1],-u[0],0],a=yt(i,u);bt(a),a=_t(a);var l=t-p,c=l>0?1:-1,v=a[0]*Ia*c,d=Ma(l)>180;if(d^(v>c*p&&c*t>v)){var y=a[1]*Ia;y>g&&(g=y)}else if(v=(v+360)%360-180,d^(v>c*p&&c*t>v)){var y=-a[1]*Ia;f>y&&(f=y)}else f>e&&(f=e),e>g&&(g=e);d?p>t?o(s,t)>o(s,h)&&(h=t):o(t,h)>o(s,h)&&(s=t):h>=s?(s>t&&(s=t),t>h&&(h=t)):t>p?o(s,t)>o(s,h)&&(h=t):o(t,h)>o(s,h)&&(s=t)}else n(t,e);m=r,p=t}function e(){b.point=t}function r(){x[0]=s,x[1]=h,b.point=n,m=null}function u(n,e){if(m){var r=n-p;y+=Ma(r)>180?r+(r>0?360:-360):r}else v=n,d=e;ko.point(n,e),t(n,e)}function i(){ko.lineStart()}function a(){u(v,d),ko.lineEnd(),Ma(y)>Da&&(s=-(h=180)),x[0]=s,x[1]=h,m=null}function o(n,t){return(t-=n)<0?t+360:t}function l(n,t){return n[0]-t[0]}function c(n,t){return t[0]<=t[1]?t[0]<=n&&n<=t[1]:n<t[0]||t[1]<n}var s,f,h,g,p,v,d,m,y,M,x,b={point:n,lineStart:e,lineEnd:r,polygonStart:function(){b.point=u,b.lineStart=i,b.lineEnd=a,y=0,ko.polygonStart()},polygonEnd:function(){ko.polygonEnd(),b.point=n,b.lineStart=e,b.lineEnd=r,0>So?(s=-(h=180),f=-(g=90)):y>Da?g=90:-Da>y&&(f=-90),x[0]=s,x[1]=h}};return function(n){g=h=-(s=f=1/0),M=[],oa.geo.stream(n,b);var t=M.length;if(t){M.sort(l);for(var e,r=1,u=M[0],i=[u];t>r;++r)e=M[r],c(e[0],u)||c(e[1],u)?(o(u[0],e[1])>o(u[0],u[1])&&(u[1]=e[1]),o(e[0],u[1])>o(u[0],u[1])&&(u[0]=e[0])):i.push(u=e);for(var a,e,p=-(1/0),t=i.length-1,r=0,u=i[t];t>=r;u=e,++r)e=i[r],(a=o(u[1],e[0]))>p&&(p=a,s=e[0],h=u[1])}return M=x=null,s===1/0||f===1/0?[[NaN,NaN],[NaN,NaN]]:[[s,f],[h,g]]}}(),oa.geo.centroid=function(n){No=Eo=Ao=Co=zo=Lo=qo=To=Ro=Do=Po=0,oa.geo.stream(n,jo);var t=Ro,e=Do,r=Po,u=t*t+e*e+r*r;return Pa>u&&(t=Lo,e=qo,r=To,Da>Eo&&(t=Ao,e=Co,r=zo),u=t*t+e*e+r*r,Pa>u)?[NaN,NaN]:[Math.atan2(e,t)*Ia,tn(r/Math.sqrt(u))*Ia]};var No,Eo,Ao,Co,zo,Lo,qo,To,Ro,Do,Po,jo={sphere:b,point:St,lineStart:Nt,lineEnd:Et,polygonStart:function(){jo.lineStart=At},polygonEnd:function(){jo.lineStart=Nt}},Uo=Rt(zt,Ut,Ht,[-ja,-ja/2]),Fo=1e9;oa.geo.clipExtent=function(){var n,t,e,r,u,i,a={stream:function(n){return u&&(u.valid=!1),u=i(n),u.valid=!0,u},extent:function(o){return arguments.length?(i=Zt(n=+o[0][0],t=+o[0][1],e=+o[1][0],r=+o[1][1]),u&&(u.valid=!1,u=null),a):[[n,t],[e,r]]}};return a.extent([[0,0],[960,500]])},(oa.geo.conicEqualArea=function(){return Vt(Xt)}).raw=Xt,oa.geo.albers=function(){return oa.geo.conicEqualArea().rotate([96,0]).center([-.6,38.7]).parallels([29.5,45.5]).scale(1070)},oa.geo.albersUsa=function(){function n(n){var i=n[0],a=n[1];return t=null,e(i,a),t||(r(i,a),t)||u(i,a),t}var t,e,r,u,i=oa.geo.albers(),a=oa.geo.conicEqualArea().rotate([154,0]).center([-2,58.5]).parallels([55,65]),o=oa.geo.conicEqualArea().rotate([157,0]).center([-3,19.9]).parallels([8,18]),l={point:function(n,e){t=[n,e]}};return n.invert=function(n){var t=i.scale(),e=i.translate(),r=(n[0]-e[0])/t,u=(n[1]-e[1])/t;return(u>=.12&&.234>u&&r>=-.425&&-.214>r?a:u>=.166&&.234>u&&r>=-.214&&-.115>r?o:i).invert(n)},n.stream=function(n){var t=i.stream(n),e=a.stream(n),r=o.stream(n);return{point:function(n,u){t.point(n,u),e.point(n,u),r.point(n,u)},sphere:function(){t.sphere(),e.sphere(),r.sphere()},lineStart:function(){t.lineStart(),e.lineStart(),r.lineStart()},lineEnd:function(){t.lineEnd(),e.lineEnd(),r.lineEnd()},polygonStart:function(){t.polygonStart(),e.polygonStart(),r.polygonStart()},polygonEnd:function(){t.polygonEnd(),e.polygonEnd(),r.polygonEnd()}}},n.precision=function(t){return arguments.length?(i.precision(t),a.precision(t),o.precision(t),n):i.precision()},n.scale=function(t){return arguments.length?(i.scale(t),a.scale(.35*t),o.scale(t),n.translate(i.translate())):i.scale()},n.translate=function(t){if(!arguments.length)return i.translate();var c=i.scale(),s=+t[0],f=+t[1];return e=i.translate(t).clipExtent([[s-.455*c,f-.238*c],[s+.455*c,f+.238*c]]).stream(l).point,r=a.translate([s-.307*c,f+.201*c]).clipExtent([[s-.425*c+Da,f+.12*c+Da],[s-.214*c-Da,f+.234*c-Da]]).stream(l).point,u=o.translate([s-.205*c,f+.212*c]).clipExtent([[s-.214*c+Da,f+.166*c+Da],[s-.115*c-Da,f+.234*c-Da]]).stream(l).point,n},n.scale(1070)};var Ho,Oo,Io,Yo,Zo,Vo,Xo={point:b,lineStart:b,lineEnd:b,polygonStart:function(){Oo=0,Xo.lineStart=$t},polygonEnd:function(){Xo.lineStart=Xo.lineEnd=Xo.point=b,Ho+=Ma(Oo/2)}},$o={point:Bt,lineStart:b,lineEnd:b,polygonStart:b,polygonEnd:b},Bo={point:Gt,lineStart:Kt,lineEnd:Qt,polygonStart:function(){Bo.lineStart=ne},polygonEnd:function(){Bo.point=Gt,Bo.lineStart=Kt,Bo.lineEnd=Qt}};oa.geo.path=function(){function n(n){return n&&(\\\"function\\\"==typeof o&&i.pointRadius(+o.apply(this,arguments)),a&&a.valid||(a=u(i)),oa.geo.stream(n,a)),i.result()}function t(){return a=null,n}var e,r,u,i,a,o=4.5;return n.area=function(n){return Ho=0,oa.geo.stream(n,u(Xo)),Ho},n.centroid=function(n){return Ao=Co=zo=Lo=qo=To=Ro=Do=Po=0,oa.geo.stream(n,u(Bo)),Po?[Ro/Po,Do/Po]:To?[Lo/To,qo/To]:zo?[Ao/zo,Co/zo]:[NaN,NaN]},n.bounds=function(n){return Zo=Vo=-(Io=Yo=1/0),oa.geo.stream(n,u($o)),[[Io,Yo],[Zo,Vo]]},n.projection=function(n){return arguments.length?(u=(e=n)?n.stream||re(n):y,t()):e},n.context=function(n){return arguments.length?(i=null==(r=n)?new Wt:new te(n),\\\"function\\\"!=typeof o&&i.pointRadius(o),t()):r},n.pointRadius=function(t){return arguments.length?(o=\\\"function\\\"==typeof t?t:(i.pointRadius(+t),+t),n):o},n.projection(oa.geo.albersUsa()).context(null)},oa.geo.transform=function(n){return{stream:function(t){var e=new ue(t);for(var r in n)e[r]=n[r];return e}}},ue.prototype={point:function(n,t){this.stream.point(n,t)},sphere:function(){this.stream.sphere()},lineStart:function(){this.stream.lineStart()},lineEnd:function(){this.stream.lineEnd()},polygonStart:function(){this.stream.polygonStart()},polygonEnd:function(){this.stream.polygonEnd()}},oa.geo.projection=ae,oa.geo.projectionMutator=oe,(oa.geo.equirectangular=function(){return ae(ce)}).raw=ce.invert=ce,oa.geo.rotation=function(n){function t(t){return t=n(t[0]*Oa,t[1]*Oa),t[0]*=Ia,t[1]*=Ia,t}return n=fe(n[0]%360*Oa,n[1]*Oa,n.length>2?n[2]*Oa:0),t.invert=function(t){return t=n.invert(t[0]*Oa,t[1]*Oa),t[0]*=Ia,t[1]*=Ia,t},t},se.invert=ce,oa.geo.circle=function(){function n(){var n=\\\"function\\\"==typeof r?r.apply(this,arguments):r,t=fe(-n[0]*Oa,-n[1]*Oa,0).invert,u=[];return e(null,null,1,{point:function(n,e){u.push(n=t(n,e)),n[0]*=Ia,n[1]*=Ia}}),{type:\\\"Polygon\\\",coordinates:[u]}}var t,e,r=[0,0],u=6;return n.origin=function(t){return arguments.length?(r=t,n):r},n.angle=function(r){return arguments.length?(e=ve((t=+r)*Oa,u*Oa),n):t},n.precision=function(r){return arguments.length?(e=ve(t*Oa,(u=+r)*Oa),n):u},n.angle(90)},oa.geo.distance=function(n,t){var e,r=(t[0]-n[0])*Oa,u=n[1]*Oa,i=t[1]*Oa,a=Math.sin(r),o=Math.cos(r),l=Math.sin(u),c=Math.cos(u),s=Math.sin(i),f=Math.cos(i);return Math.atan2(Math.sqrt((e=f*a)*e+(e=c*s-l*f*o)*e),l*s+c*f*o)},oa.geo.graticule=function(){function n(){return{type:\\\"MultiLineString\\\",coordinates:t()}}function t(){return oa.range(Math.ceil(i/d)*d,u,d).map(h).concat(oa.range(Math.ceil(c/m)*m,l,m).map(g)).concat(oa.range(Math.ceil(r/p)*p,e,p).filter(function(n){return Ma(n%d)>Da}).map(s)).concat(oa.range(Math.ceil(o/v)*v,a,v).filter(function(n){return Ma(n%m)>Da}).map(f))}var e,r,u,i,a,o,l,c,s,f,h,g,p=10,v=p,d=90,m=360,y=2.5;return n.lines=function(){return t().map(function(n){return{type:\\\"LineString\\\",coordinates:n}})},n.outline=function(){return{type:\\\"Polygon\\\",coordinates:[h(i).concat(g(l).slice(1),h(u).reverse().slice(1),g(c).reverse().slice(1))]}},n.extent=function(t){return arguments.length?n.majorExtent(t).minorExtent(t):n.minorExtent()},n.majorExtent=function(t){return arguments.length?(i=+t[0][0],u=+t[1][0],c=+t[0][1],l=+t[1][1],i>u&&(t=i,i=u,u=t),c>l&&(t=c,c=l,l=t),n.precision(y)):[[i,c],[u,l]]},n.minorExtent=function(t){return arguments.length?(r=+t[0][0],e=+t[1][0],o=+t[0][1],a=+t[1][1],r>e&&(t=r,r=e,e=t),o>a&&(t=o,o=a,a=t),n.precision(y)):[[r,o],[e,a]]},n.step=function(t){return arguments.length?n.majorStep(t).minorStep(t):n.minorStep()},n.majorStep=function(t){return arguments.length?(d=+t[0],m=+t[1],n):[d,m]},n.minorStep=function(t){return arguments.length?(p=+t[0],v=+t[1],n):[p,v]},n.precision=function(t){return arguments.length?(y=+t,s=me(o,a,90),f=ye(r,e,y),h=me(c,l,90),g=ye(i,u,y),n):y},n.majorExtent([[-180,-90+Da],[180,90-Da]]).minorExtent([[-180,-80-Da],[180,80+Da]])},oa.geo.greatArc=function(){function n(){return{type:\\\"LineString\\\",coordinates:[t||r.apply(this,arguments),e||u.apply(this,arguments)]}}var t,e,r=Me,u=xe;return n.distance=function(){return oa.geo.distance(t||r.apply(this,arguments),e||u.apply(this,arguments))},n.source=function(e){return arguments.length?(r=e,t=\\\"function\\\"==typeof e?null:e,n):r},n.target=function(t){return arguments.length?(u=t,e=\\\"function\\\"==typeof t?null:t,n):u},n.precision=function(){return arguments.length?n:0},n},oa.geo.interpolate=function(n,t){return be(n[0]*Oa,n[1]*Oa,t[0]*Oa,t[1]*Oa)},oa.geo.length=function(n){return Wo=0,oa.geo.stream(n,Jo),Wo};var Wo,Jo={sphere:b,point:b,lineStart:_e,lineEnd:b,polygonStart:b,polygonEnd:b},Go=we(function(n){return Math.sqrt(2/(1+n))},function(n){return 2*Math.asin(n/2)});(oa.geo.azimuthalEqualArea=function(){return ae(Go)}).raw=Go;var Ko=we(function(n){var t=Math.acos(n);return t&&t/Math.sin(t)},y);(oa.geo.azimuthalEquidistant=function(){return ae(Ko)}).raw=Ko,(oa.geo.conicConformal=function(){return Vt(Se)}).raw=Se,(oa.geo.conicEquidistant=function(){return Vt(ke)}).raw=ke;var Qo=we(function(n){return 1/n},Math.atan);(oa.geo.gnomonic=function(){return ae(Qo)}).raw=Qo,Ne.invert=function(n,t){return[n,2*Math.atan(Math.exp(t))-Ha]},(oa.geo.mercator=function(){return Ee(Ne)}).raw=Ne;var nl=we(function(){return 1},Math.asin);(oa.geo.orthographic=function(){return ae(nl)}).raw=nl;var tl=we(function(n){return 1/(1+n)},function(n){return 2*Math.atan(n)});(oa.geo.stereographic=function(){return ae(tl)}).raw=tl,Ae.invert=function(n,t){return[-t,2*Math.atan(Math.exp(n))-Ha]},(oa.geo.transverseMercator=function(){var n=Ee(Ae),t=n.center,e=n.rotate;return n.center=function(n){return n?t([-n[1],n[0]]):(n=t(),[n[1],-n[0]])},n.rotate=function(n){return n?e([n[0],n[1],n.length>2?n[2]+90:90]):(n=e(),[n[0],n[1],n[2]-90])},e([0,0,90])}).raw=Ae,oa.geom={},oa.geom.hull=function(n){function t(n){if(n.length<3)return[];var t,u=En(e),i=En(r),a=n.length,o=[],l=[];for(t=0;a>t;t++)o.push([+u.call(this,n[t],t),+i.call(this,n[t],t),t]);for(o.sort(qe),t=0;a>t;t++)l.push([o[t][0],-o[t][1]]);var c=Le(o),s=Le(l),f=s[0]===c[0],h=s[s.length-1]===c[c.length-1],g=[];for(t=c.length-1;t>=0;--t)g.push(n[o[c[t]][2]]);for(t=+f;t<s.length-h;++t)g.push(n[o[s[t]][2]]);return g}var e=Ce,r=ze;return arguments.length?t(n):(t.x=function(n){return arguments.length?(e=n,t):e},t.y=function(n){return arguments.length?(r=n,t):r},t)},oa.geom.polygon=function(n){return Sa(n,el),n};var el=oa.geom.polygon.prototype=[];el.area=function(){for(var n,t=-1,e=this.length,r=this[e-1],u=0;++t<e;)n=r,r=this[t],u+=n[1]*r[0]-n[0]*r[1];return.5*u},el.centroid=function(n){var t,e,r=-1,u=this.length,i=0,a=0,o=this[u-1];for(arguments.length||(n=-1/(6*this.area()));++r<u;)t=o,o=this[r],e=t[0]*o[1]-o[0]*t[1],i+=(t[0]+o[0])*e,a+=(t[1]+o[1])*e;return[i*n,a*n]},el.clip=function(n){for(var t,e,r,u,i,a,o=De(n),l=-1,c=this.length-De(this),s=this[c-1];++l<c;){for(t=n.slice(),n.length=0,u=this[l],i=t[(r=t.length-o)-1],e=-1;++e<r;)a=t[e],Te(a,s,u)?(Te(i,s,u)||n.push(Re(i,a,s,u)),n.push(a)):Te(i,s,u)&&n.push(Re(i,a,s,u)),i=a;o&&n.push(n[0]),s=u}return n};var rl,ul,il,al,ol,ll=[],cl=[];Ye.prototype.prepare=function(){for(var n,t=this.edges,e=t.length;e--;)n=t[e].edge,n.b&&n.a||t.splice(e,1);return t.sort(Ve),t.length},tr.prototype={start:function(){return this.edge.l===this.site?this.edge.a:this.edge.b},end:function(){return this.edge.l===this.site?this.edge.b:this.edge.a}},er.prototype={insert:function(n,t){var e,r,u;if(n){if(t.P=n,t.N=n.N,n.N&&(n.N.P=t),n.N=t,n.R){for(n=n.R;n.L;)n=n.L;n.L=t}else n.R=t;e=n}else this._?(n=ar(this._),t.P=null,t.N=n,n.P=n.L=t,e=n):(t.P=t.N=null,this._=t,e=null);for(t.L=t.R=null,t.U=e,t.C=!0,n=t;e&&e.C;)r=e.U,e===r.L?(u=r.R,u&&u.C?(e.C=u.C=!1,r.C=!0,n=r):(n===e.R&&(ur(this,e),n=e,e=n.U),e.C=!1,r.C=!0,ir(this,r))):(u=r.L,u&&u.C?(e.C=u.C=!1,r.C=!0,n=r):(n===e.L&&(ir(this,e),n=e,e=n.U),e.C=!1,r.C=!0,ur(this,r))),e=n.U;this._.C=!1},remove:function(n){n.N&&(n.N.P=n.P),n.P&&(n.P.N=n.N),n.N=n.P=null;var t,e,r,u=n.U,i=n.L,a=n.R;if(e=i?a?ar(a):i:a,u?u.L===n?u.L=e:u.R=e:this._=e,i&&a?(r=e.C,e.C=n.C,e.L=i,i.U=e,e!==a?(u=e.U,e.U=n.U,n=e.R,u.L=n,e.R=a,a.U=e):(e.U=u,u=e,n=e.R)):(r=n.C,n=e),n&&(n.U=u),!r){if(n&&n.C)return void(n.C=!1);do{if(n===this._)break;if(n===u.L){if(t=u.R,t.C&&(t.C=!1,u.C=!0,ur(this,u),t=u.R),t.L&&t.L.C||t.R&&t.R.C){t.R&&t.R.C||(t.L.C=!1,t.C=!0,ir(this,t),t=u.R),t.C=u.C,u.C=t.R.C=!1,ur(this,u),n=this._;break}}else if(t=u.L,t.C&&(t.C=!1,u.C=!0,ir(this,u),t=u.L),t.L&&t.L.C||t.R&&t.R.C){t.L&&t.L.C||(t.R.C=!1,t.C=!0,ur(this,t),t=u.L),t.C=u.C,u.C=t.L.C=!1,ir(this,u),n=this._;break}t.C=!0,n=u,u=u.U}while(!n.C);n&&(n.C=!1)}}},oa.geom.voronoi=function(n){function t(n){var t=new Array(n.length),r=o[0][0],u=o[0][1],i=o[1][0],a=o[1][1];return or(e(n),o).cells.forEach(function(e,o){var l=e.edges,c=e.site,s=t[o]=l.length?l.map(function(n){var t=n.start();return[t.x,t.y]}):c.x>=r&&c.x<=i&&c.y>=u&&c.y<=a?[[r,a],[i,a],[i,u],[r,u]]:[];s.point=n[o]}),t}function e(n){return n.map(function(n,t){return{x:Math.round(i(n,t)/Da)*Da,y:Math.round(a(n,t)/Da)*Da,i:t}})}var r=Ce,u=ze,i=r,a=u,o=sl;return n?t(n):(t.links=function(n){return or(e(n)).edges.filter(function(n){return n.l&&n.r}).map(function(t){return{source:n[t.l.i],target:n[t.r.i]}})},t.triangles=function(n){var t=[];return or(e(n)).cells.forEach(function(e,r){for(var u,i,a=e.site,o=e.edges.sort(Ve),l=-1,c=o.length,s=o[c-1].edge,f=s.l===a?s.r:s.l;++l<c;)u=s,i=f,s=o[l].edge,f=s.l===a?s.r:s.l,r<i.i&&r<f.i&&cr(a,i,f)<0&&t.push([n[r],n[i.i],n[f.i]])}),t},t.x=function(n){return arguments.length?(i=En(r=n),t):r},t.y=function(n){return arguments.length?(a=En(u=n),t):u},t.clipExtent=function(n){return arguments.length?(o=null==n?sl:n,t):o===sl?null:o},t.size=function(n){return arguments.length?t.clipExtent(n&&[[0,0],n]):o===sl?null:o&&o[1]},t)};var sl=[[-1e6,-1e6],[1e6,1e6]];oa.geom.delaunay=function(n){return oa.geom.voronoi().triangles(n)},oa.geom.quadtree=function(n,t,e,r,u){function i(n){function i(n,t,e,r,u,i,a,o){if(!isNaN(e)&&!isNaN(r))if(n.leaf){var l=n.x,s=n.y;if(null!=l)if(Ma(l-e)+Ma(s-r)<.01)c(n,t,e,r,u,i,a,o);else{var f=n.point;n.x=n.y=n.point=null,c(n,f,l,s,u,i,a,o),c(n,t,e,r,u,i,a,o)}else n.x=e,n.y=r,n.point=t}else c(n,t,e,r,u,i,a,o)}function c(n,t,e,r,u,a,o,l){var c=.5*(u+o),s=.5*(a+l),f=e>=c,h=r>=s,g=h<<1|f;n.leaf=!1,n=n.nodes[g]||(n.nodes[g]=hr()),f?u=c:o=c,h?a=s:l=s,i(n,t,e,r,u,a,o,l)}var s,f,h,g,p,v,d,m,y,M=En(o),x=En(l);if(null!=t)v=t,d=e,m=r,y=u;else if(m=y=-(v=d=1/0),f=[],h=[],p=n.length,a)for(g=0;p>g;++g)s=n[g],s.x<v&&(v=s.x),s.y<d&&(d=s.y),s.x>m&&(m=s.x),s.y>y&&(y=s.y),f.push(s.x),h.push(s.y);else for(g=0;p>g;++g){var b=+M(s=n[g],g),_=+x(s,g);v>b&&(v=b),d>_&&(d=_),b>m&&(m=b),_>y&&(y=_),f.push(b),h.push(_)}var w=m-v,S=y-d;w>S?y=d+w:m=v+S;var k=hr();if(k.add=function(n){i(k,n,+M(n,++g),+x(n,g),v,d,m,y)},k.visit=function(n){gr(n,k,v,d,m,y)},k.find=function(n){return pr(k,n[0],n[1],v,d,m,y)},g=-1,null==t){for(;++g<p;)i(k,n[g],f[g],h[g],v,d,m,y);--g}else n.forEach(k.add);return f=h=n=s=null,k}var a,o=Ce,l=ze;return(a=arguments.length)?(o=sr,l=fr,3===a&&(u=e,r=t,e=t=0),i(n)):(i.x=function(n){return arguments.length?(o=n,i):o},i.y=function(n){return arguments.length?(l=n,i):l},i.extent=function(n){return arguments.length?(null==n?t=e=r=u=null:(t=+n[0][0],e=+n[0][1],r=+n[1][0],u=+n[1][1]),i):null==t?null:[[t,e],[r,u]]},i.size=function(n){return arguments.length?(null==n?t=e=r=u=null:(t=e=0,r=+n[0],u=+n[1]),i):null==t?null:[r-t,u-e]},i)},oa.interpolateRgb=vr,oa.interpolateObject=dr,oa.interpolateNumber=mr,oa.interpolateString=yr;var fl=/[-+]?(?:\\\\d+\\\\.?\\\\d*|\\\\.?\\\\d+)(?:[eE][-+]?\\\\d+)?/g,hl=new RegExp(fl.source,\\\"g\\\");oa.interpolate=Mr,oa.interpolators=[function(n,t){var e=typeof t;return(\\\"string\\\"===e?ro.has(t.toLowerCase())||/^(#|rgb\\\\(|hsl\\\\()/i.test(t)?vr:yr:t instanceof on?vr:Array.isArray(t)?xr:\\\"object\\\"===e&&isNaN(t)?dr:mr)(n,t)}],oa.interpolateArray=xr;var gl=function(){return y},pl=oa.map({linear:gl,poly:Er,quad:function(){return Sr},cubic:function(){return kr},sin:function(){return Ar},exp:function(){return Cr},circle:function(){return zr},elastic:Lr,back:qr,bounce:function(){return Tr}}),vl=oa.map({\\\"in\\\":y,out:_r,\\\"in-out\\\":wr,\\\"out-in\\\":function(n){return wr(_r(n))}});oa.ease=function(n){var t=n.indexOf(\\\"-\\\"),e=t>=0?n.slice(0,t):n,r=t>=0?n.slice(t+1):\\\"in\\\";return e=pl.get(e)||gl,r=vl.get(r)||y,br(r(e.apply(null,la.call(arguments,1))))},oa.interpolateHcl=Rr,oa.interpolateHsl=Dr,oa.interpolateLab=Pr,oa.interpolateRound=jr,oa.transform=function(n){var t=sa.createElementNS(oa.ns.prefix.svg,\\\"g\\\");return(oa.transform=function(n){if(null!=n){t.setAttribute(\\\"transform\\\",n);var e=t.transform.baseVal.consolidate()}return new Ur(e?e.matrix:dl)})(n)},Ur.prototype.toString=function(){return\\\"translate(\\\"+this.translate+\\\")rotate(\\\"+this.rotate+\\\")skewX(\\\"+this.skew+\\\")scale(\\\"+this.scale+\\\")\\\"};var dl={a:1,b:0,c:0,d:1,e:0,f:0};oa.interpolateTransform=$r,oa.layout={},oa.layout.bundle=function(){return function(n){for(var t=[],e=-1,r=n.length;++e<r;)t.push(Jr(n[e]));return t}},oa.layout.chord=function(){function n(){var n,c,f,h,g,p={},v=[],d=oa.range(i),m=[];for(e=[],r=[],n=0,h=-1;++h<i;){for(c=0,g=-1;++g<i;)c+=u[h][g];v.push(c),m.push(oa.range(i)),n+=c}for(a&&d.sort(function(n,t){return a(v[n],v[t])}),o&&m.forEach(function(n,t){n.sort(function(n,e){return o(u[t][n],u[t][e])})}),n=(Ua-s*i)/n,c=0,h=-1;++h<i;){for(f=c,g=-1;++g<i;){var y=d[h],M=m[y][g],x=u[y][M],b=c,_=c+=x*n;p[y+\\\"-\\\"+M]={index:y,subindex:M,startAngle:b,endAngle:_,value:x}}r[y]={index:y,startAngle:f,endAngle:c,value:v[y]},c+=s}for(h=-1;++h<i;)for(g=h-1;++g<i;){var w=p[h+\\\"-\\\"+g],S=p[g+\\\"-\\\"+h];(w.value||S.value)&&e.push(w.value<S.value?{source:S,target:w}:{source:w,target:S})}l&&t()}function t(){e.sort(function(n,t){return l((n.source.value+n.target.value)/2,(t.source.value+t.target.value)/2)})}var e,r,u,i,a,o,l,c={},s=0;return c.matrix=function(n){return arguments.length?(i=(u=n)&&u.length,e=r=null,c):u},c.padding=function(n){return arguments.length?(s=n,e=r=null,c):s},c.sortGroups=function(n){return arguments.length?(a=n,e=r=null,c):a},c.sortSubgroups=function(n){return arguments.length?(o=n,e=null,c):o},c.sortChords=function(n){return arguments.length?(l=n,e&&t(),c):l},c.chords=function(){return e||n(),e},c.groups=function(){return r||n(),r},c},oa.layout.force=function(){function n(n){return function(t,e,r,u){if(t.point!==n){var i=t.cx-n.x,a=t.cy-n.y,o=u-e,l=i*i+a*a;if(l>o*o/m){if(v>l){var c=t.charge/l;n.px-=i*c,n.py-=a*c}return!0}if(t.point&&l&&v>l){var c=t.pointCharge/l;n.px-=i*c,n.py-=a*c}}return!t.charge}}function t(n){n.px=oa.event.x,n.py=oa.event.y,l.resume()}var e,r,u,i,a,o,l={},c=oa.dispatch(\\\"start\\\",\\\"tick\\\",\\\"end\\\"),s=[1,1],f=.9,h=ml,g=yl,p=-30,v=Ml,d=.1,m=.64,M=[],x=[];return l.tick=function(){if((u*=.99)<.005)return e=null,c.end({type:\\\"end\\\",alpha:u=0}),!0;var t,r,l,h,g,v,m,y,b,_=M.length,w=x.length;for(r=0;w>r;++r)l=x[r],h=l.source,g=l.target,y=g.x-h.x,b=g.y-h.y,(v=y*y+b*b)&&(v=u*a[r]*((v=Math.sqrt(v))-i[r])/v,y*=v,b*=v,g.x-=y*(m=h.weight+g.weight?h.weight/(h.weight+g.weight):.5),g.y-=b*m,h.x+=y*(m=1-m),h.y+=b*m);if((m=u*d)&&(y=s[0]/2,b=s[1]/2,r=-1,m))for(;++r<_;)l=M[r],l.x+=(y-l.x)*m,l.y+=(b-l.y)*m;if(p)for(ru(t=oa.geom.quadtree(M),u,o),r=-1;++r<_;)(l=M[r]).fixed||t.visit(n(l));for(r=-1;++r<_;)l=M[r],l.fixed?(l.x=l.px,l.y=l.py):(l.x-=(l.px-(l.px=l.x))*f,l.y-=(l.py-(l.py=l.y))*f);c.tick({type:\\\"tick\\\",alpha:u})},l.nodes=function(n){return arguments.length?(M=n,l):M},l.links=function(n){return arguments.length?(x=n,l):x},l.size=function(n){return arguments.length?(s=n,l):s},l.linkDistance=function(n){return arguments.length?(h=\\\"function\\\"==typeof n?n:+n,l):h},l.distance=l.linkDistance,l.linkStrength=function(n){return arguments.length?(g=\\\"function\\\"==typeof n?n:+n,l):g},l.friction=function(n){return arguments.length?(f=+n,l):f},l.charge=function(n){return arguments.length?(p=\\\"function\\\"==typeof n?n:+n,l):p},l.chargeDistance=function(n){return arguments.length?(v=n*n,l):Math.sqrt(v)},l.gravity=function(n){return arguments.length?(d=+n,l):d},l.theta=function(n){return arguments.length?(m=n*n,l):Math.sqrt(m)},l.alpha=function(n){return arguments.length?(n=+n,u?n>0?u=n:(e.c=null,e.t=NaN,e=null,c.end({type:\\\"end\\\",alpha:u=0})):n>0&&(c.start({type:\\\"start\\\",alpha:u=n}),e=qn(l.tick)),l):u},l.start=function(){function n(n,r){if(!e){for(e=new Array(u),l=0;u>l;++l)e[l]=[];for(l=0;c>l;++l){var i=x[l];e[i.source.index].push(i.target),e[i.target.index].push(i.source)}}for(var a,o=e[t],l=-1,s=o.length;++l<s;)if(!isNaN(a=o[l][n]))return a;return Math.random()*r}var t,e,r,u=M.length,c=x.length,f=s[0],v=s[1];for(t=0;u>t;++t)(r=M[t]).index=t,r.weight=0;for(t=0;c>t;++t)r=x[t],\\\"number\\\"==typeof r.source&&(r.source=M[r.source]),\\\"number\\\"==typeof r.target&&(r.target=M[r.target]),++r.source.weight,++r.target.weight;for(t=0;u>t;++t)r=M[t],isNaN(r.x)&&(r.x=n(\\\"x\\\",f)),isNaN(r.y)&&(r.y=n(\\\"y\\\",v)),isNaN(r.px)&&(r.px=r.x),isNaN(r.py)&&(r.py=r.y);if(i=[],\\\"function\\\"==typeof h)for(t=0;c>t;++t)i[t]=+h.call(this,x[t],t);else for(t=0;c>t;++t)i[t]=h;if(a=[],\\\"function\\\"==typeof g)for(t=0;c>t;++t)a[t]=+g.call(this,x[t],t);else for(t=0;c>t;++t)a[t]=g;if(o=[],\\\"function\\\"==typeof p)for(t=0;u>t;++t)o[t]=+p.call(this,M[t],t);else for(t=0;u>t;++t)o[t]=p;return l.resume()},l.resume=function(){return l.alpha(.1)},l.stop=function(){return l.alpha(0)},l.drag=function(){return r||(r=oa.behavior.drag().origin(y).on(\\\"dragstart.force\\\",Qr).on(\\\"drag.force\\\",t).on(\\\"dragend.force\\\",nu)),arguments.length?void this.on(\\\"mouseover.force\\\",tu).on(\\\"mouseout.force\\\",eu).call(r):r},oa.rebind(l,c,\\\"on\\\")};var ml=20,yl=1,Ml=1/0;oa.layout.hierarchy=function(){function n(u){var i,a=[u],o=[];for(u.depth=0;null!=(i=a.pop());)if(o.push(i),(c=e.call(n,i,i.depth))&&(l=c.length)){for(var l,c,s;--l>=0;)a.push(s=c[l]),s.parent=i,s.depth=i.depth+1;r&&(i.value=0),i.children=c}else r&&(i.value=+r.call(n,i,i.depth)||0),delete i.children;return au(u,function(n){var e,u;t&&(e=n.children)&&e.sort(t),r&&(u=n.parent)&&(u.value+=n.value)}),o}var t=cu,e=ou,r=lu;return n.sort=function(e){return arguments.length?(t=e,n):t},n.children=function(t){return arguments.length?(e=t,n):e},n.value=function(t){return arguments.length?(r=t,n):r},n.revalue=function(t){return r&&(iu(t,function(n){n.children&&(n.value=0)}),au(t,function(t){var e;t.children||(t.value=+r.call(n,t,t.depth)||0),(e=t.parent)&&(e.value+=t.value)})),t},n},oa.layout.partition=function(){function n(t,e,r,u){var i=t.children;if(t.x=e,t.y=t.depth*u,t.dx=r,t.dy=u,i&&(a=i.length)){var a,o,l,c=-1;for(r=t.value?r/t.value:0;++c<a;)n(o=i[c],e,l=o.value*r,u),e+=l}}function t(n){var e=n.children,r=0;if(e&&(u=e.length))for(var u,i=-1;++i<u;)r=Math.max(r,t(e[i]));return 1+r}function e(e,i){var a=r.call(this,e,i);return n(a[0],0,u[0],u[1]/t(a[0])),a}var r=oa.layout.hierarchy(),u=[1,1];return e.size=function(n){return arguments.length?(u=n,e):u},uu(e,r)},oa.layout.pie=function(){function n(a){var o,l=a.length,c=a.map(function(e,r){return+t.call(n,e,r)}),s=+(\\\"function\\\"==typeof r?r.apply(this,arguments):r),f=(\\\"function\\\"==typeof u?u.apply(this,arguments):u)-s,h=Math.min(Math.abs(f)/l,+(\\\"function\\\"==typeof i?i.apply(this,arguments):i)),g=h*(0>f?-1:1),p=oa.sum(c),v=p?(f-l*g)/p:0,d=oa.range(l),m=[];return null!=e&&d.sort(e===xl?function(n,t){return c[t]-c[n]}:function(n,t){return e(a[n],a[t])}),d.forEach(function(n){m[n]={data:a[n],value:o=c[n],startAngle:s,endAngle:s+=o*v+g,padAngle:h}}),m}var t=Number,e=xl,r=0,u=Ua,i=0;return n.value=function(e){return arguments.length?(t=e,n):t},n.sort=function(t){return arguments.length?(e=t,n):e},n.startAngle=function(t){return arguments.length?(r=t,n):r},n.endAngle=function(t){return arguments.length?(u=t,n):u},n.padAngle=function(t){return arguments.length?(i=t,n):i},n};var xl={};oa.layout.stack=function(){function n(o,l){if(!(h=o.length))return o;var c=o.map(function(e,r){return t.call(n,e,r)}),s=c.map(function(t){return t.map(function(t,e){return[i.call(n,t,e),a.call(n,t,e)]})}),f=e.call(n,s,l);c=oa.permute(c,f),s=oa.permute(s,f);var h,g,p,v,d=r.call(n,s,l),m=c[0].length;for(p=0;m>p;++p)for(u.call(n,c[0][p],v=d[p],s[0][p][1]),g=1;h>g;++g)u.call(n,c[g][p],v+=s[g-1][p][1],s[g][p][1]);return o}var t=y,e=pu,r=vu,u=gu,i=fu,a=hu;return n.values=function(e){return arguments.length?(t=e,n):t},n.order=function(t){return arguments.length?(e=\\\"function\\\"==typeof t?t:bl.get(t)||pu,n):e},n.offset=function(t){return arguments.length?(r=\\\"function\\\"==typeof t?t:_l.get(t)||vu,n):r},n.x=function(t){return arguments.length?(i=t,n):i},n.y=function(t){return arguments.length?(a=t,n):a},n.out=function(t){return arguments.length?(u=t,n):u},n};var bl=oa.map({\\\"inside-out\\\":function(n){var t,e,r=n.length,u=n.map(du),i=n.map(mu),a=oa.range(r).sort(function(n,t){return u[n]-u[t]}),o=0,l=0,c=[],s=[];for(t=0;r>t;++t)e=a[t],l>o?(o+=i[e],c.push(e)):(l+=i[e],s.push(e));return s.reverse().concat(c)},reverse:function(n){return oa.range(n.length).reverse()},\\\"default\\\":pu}),_l=oa.map({silhouette:function(n){var t,e,r,u=n.length,i=n[0].length,a=[],o=0,l=[];for(e=0;i>e;++e){for(t=0,r=0;u>t;t++)r+=n[t][e][1];r>o&&(o=r),a.push(r)}for(e=0;i>e;++e)l[e]=(o-a[e])/2;return l},wiggle:function(n){var t,e,r,u,i,a,o,l,c,s=n.length,f=n[0],h=f.length,g=[];for(g[0]=l=c=0,e=1;h>e;++e){for(t=0,u=0;s>t;++t)u+=n[t][e][1];for(t=0,i=0,o=f[e][0]-f[e-1][0];s>t;++t){for(r=0,a=(n[t][e][1]-n[t][e-1][1])/(2*o);t>r;++r)a+=(n[r][e][1]-n[r][e-1][1])/o;i+=a*n[t][e][1]}g[e]=l-=u?i/u*o:0,c>l&&(c=l)}for(e=0;h>e;++e)g[e]-=c;return g},expand:function(n){var t,e,r,u=n.length,i=n[0].length,a=1/u,o=[];for(e=0;i>e;++e){for(t=0,r=0;u>t;t++)r+=n[t][e][1];if(r)for(t=0;u>t;t++)n[t][e][1]/=r;else for(t=0;u>t;t++)n[t][e][1]=a}for(e=0;i>e;++e)o[e]=0;return o},zero:vu});oa.layout.histogram=function(){function n(n,i){for(var a,o,l=[],c=n.map(e,this),s=r.call(this,c,i),f=u.call(this,s,c,i),i=-1,h=c.length,g=f.length-1,p=t?1:1/h;++i<g;)a=l[i]=[],a.dx=f[i+1]-(a.x=f[i]),a.y=0;if(g>0)for(i=-1;++i<h;)o=c[i],o>=s[0]&&o<=s[1]&&(a=l[oa.bisect(f,o,1,g)-1],a.y+=p,a.push(n[i]));return l}var t=!0,e=Number,r=bu,u=Mu;return n.value=function(t){return arguments.length?(e=t,n):e},n.range=function(t){return arguments.length?(r=En(t),n):r},n.bins=function(t){return arguments.length?(u=\\\"number\\\"==typeof t?function(n){return xu(n,t)}:En(t),n):u},n.frequency=function(e){return arguments.length?(t=!!e,n):t},n},oa.layout.pack=function(){function n(n,i){var a=e.call(this,n,i),o=a[0],l=u[0],c=u[1],s=null==t?Math.sqrt:\\\"function\\\"==typeof t?t:function(){return t};if(o.x=o.y=0,au(o,function(n){n.r=+s(n.value)}),au(o,Nu),r){var f=r*(t?1:Math.max(2*o.r/l,2*o.r/c))/2;au(o,function(n){n.r+=f}),au(o,Nu),au(o,function(n){n.r-=f})}return Cu(o,l/2,c/2,t?1:1/Math.max(2*o.r/l,2*o.r/c)),a}var t,e=oa.layout.hierarchy().sort(_u),r=0,u=[1,1];return n.size=function(t){return arguments.length?(u=t,n):u},n.radius=function(e){return arguments.length?(t=null==e||\\\"function\\\"==typeof e?e:+e,n):t},n.padding=function(t){return arguments.length?(r=+t,n):r},uu(n,e)},oa.layout.tree=function(){function n(n,u){var s=a.call(this,n,u),f=s[0],h=t(f);if(au(h,e),h.parent.m=-h.z,iu(h,r),c)iu(f,i);else{var g=f,p=f,v=f;iu(f,function(n){n.x<g.x&&(g=n),n.x>p.x&&(p=n),n.depth>v.depth&&(v=n)});var d=o(g,p)/2-g.x,m=l[0]/(p.x+o(p,g)/2+d),y=l[1]/(v.depth||1);iu(f,function(n){n.x=(n.x+d)*m,n.y=n.depth*y})}return s}function t(n){for(var t,e={A:null,children:[n]},r=[e];null!=(t=r.pop());)for(var u,i=t.children,a=0,o=i.length;o>a;++a)r.push((i[a]=u={_:i[a],parent:t,children:(u=i[a].children)&&u.slice()||[],A:null,a:null,z:0,m:0,c:0,s:0,t:null,i:a}).a=u);return e.children[0]}function e(n){var t=n.children,e=n.parent.children,r=n.i?e[n.i-1]:null;if(t.length){Du(n);var i=(t[0].z+t[t.length-1].z)/2;r?(n.z=r.z+o(n._,r._),n.m=n.z-i):n.z=i}else r&&(n.z=r.z+o(n._,r._));n.parent.A=u(n,r,n.parent.A||e[0])}function r(n){n._.x=n.z+n.parent.m,n.m+=n.parent.m}function u(n,t,e){if(t){for(var r,u=n,i=n,a=t,l=u.parent.children[0],c=u.m,s=i.m,f=a.m,h=l.m;a=Tu(a),u=qu(u),a&&u;)l=qu(l),i=Tu(i),i.a=n,r=a.z+f-u.z-c+o(a._,u._),r>0&&(Ru(Pu(a,n,e),n,r),c+=r,s+=r),f+=a.m,c+=u.m,h+=l.m,s+=i.m;a&&!Tu(i)&&(i.t=a,i.m+=f-s),u&&!qu(l)&&(l.t=u,l.m+=c-h,e=n)}return e}function i(n){n.x*=l[0],n.y=n.depth*l[1]}var a=oa.layout.hierarchy().sort(null).value(null),o=Lu,l=[1,1],c=null;return n.separation=function(t){return arguments.length?(o=t,n):o},n.size=function(t){return arguments.length?(c=null==(l=t)?i:null,n):c?null:l},n.nodeSize=function(t){return arguments.length?(c=null==(l=t)?null:i,n):c?l:null},uu(n,a)},oa.layout.cluster=function(){function n(n,i){var a,o=t.call(this,n,i),l=o[0],c=0;au(l,function(n){var t=n.children;t&&t.length?(n.x=Uu(t),n.y=ju(t)):(n.x=a?c+=e(n,a):0,n.y=0,a=n)});var s=Fu(l),f=Hu(l),h=s.x-e(s,f)/2,g=f.x+e(f,s)/2;return au(l,u?function(n){n.x=(n.x-l.x)*r[0],n.y=(l.y-n.y)*r[1]}:function(n){n.x=(n.x-h)/(g-h)*r[0],n.y=(1-(l.y?n.y/l.y:1))*r[1]}),o}var t=oa.layout.hierarchy().sort(null).value(null),e=Lu,r=[1,1],u=!1;return n.separation=function(t){return arguments.length?(e=t,n):e},n.size=function(t){return arguments.length?(u=null==(r=t),n):u?null:r},n.nodeSize=function(t){return arguments.length?(u=null!=(r=t),n):u?r:null},uu(n,t)},oa.layout.treemap=function(){function n(n,t){for(var e,r,u=-1,i=n.length;++u<i;)r=(e=n[u]).value*(0>t?0:t),e.area=isNaN(r)||0>=r?0:r}function t(e){var i=e.children;if(i&&i.length){var a,o,l,c=f(e),s=[],h=i.slice(),p=1/0,v=\\\"slice\\\"===g?c.dx:\\\"dice\\\"===g?c.dy:\\\"slice-dice\\\"===g?1&e.depth?c.dy:c.dx:Math.min(c.dx,c.dy);for(n(h,c.dx*c.dy/e.value),s.area=0;(l=h.length)>0;)s.push(a=h[l-1]),s.area+=a.area,\\\"squarify\\\"!==g||(o=r(s,v))<=p?(h.pop(),p=o):(s.area-=s.pop().area,u(s,v,c,!1),v=Math.min(c.dx,c.dy),s.length=s.area=0,p=1/0);s.length&&(u(s,v,c,!0),s.length=s.area=0),i.forEach(t)}}function e(t){var r=t.children;if(r&&r.length){var i,a=f(t),o=r.slice(),l=[];for(n(o,a.dx*a.dy/t.value),l.area=0;i=o.pop();)l.push(i),l.area+=i.area,null!=i.z&&(u(l,i.z?a.dx:a.dy,a,!o.length),l.length=l.area=0);r.forEach(e)}}function r(n,t){for(var e,r=n.area,u=0,i=1/0,a=-1,o=n.length;++a<o;)(e=n[a].area)&&(i>e&&(i=e),e>u&&(u=e));return r*=r,t*=t,r?Math.max(t*u*p/r,r/(t*i*p)):1/0}function u(n,t,e,r){var u,i=-1,a=n.length,o=e.x,c=e.y,s=t?l(n.area/t):0;\\n if(t==e.dx){for((r||s>e.dy)&&(s=e.dy);++i<a;)u=n[i],u.x=o,u.y=c,u.dy=s,o+=u.dx=Math.min(e.x+e.dx-o,s?l(u.area/s):0);u.z=!0,u.dx+=e.x+e.dx-o,e.y+=s,e.dy-=s}else{for((r||s>e.dx)&&(s=e.dx);++i<a;)u=n[i],u.x=o,u.y=c,u.dx=s,c+=u.dy=Math.min(e.y+e.dy-c,s?l(u.area/s):0);u.z=!1,u.dy+=e.y+e.dy-c,e.x+=s,e.dx-=s}}function i(r){var u=a||o(r),i=u[0];return i.x=i.y=0,i.value?(i.dx=c[0],i.dy=c[1]):i.dx=i.dy=0,a&&o.revalue(i),n([i],i.dx*i.dy/i.value),(a?e:t)(i),h&&(a=u),u}var a,o=oa.layout.hierarchy(),l=Math.round,c=[1,1],s=null,f=Ou,h=!1,g=\\\"squarify\\\",p=.5*(1+Math.sqrt(5));return i.size=function(n){return arguments.length?(c=n,i):c},i.padding=function(n){function t(t){var e=n.call(i,t,t.depth);return null==e?Ou(t):Iu(t,\\\"number\\\"==typeof e?[e,e,e,e]:e)}function e(t){return Iu(t,n)}if(!arguments.length)return s;var r;return f=null==(s=n)?Ou:\\\"function\\\"==(r=typeof n)?t:\\\"number\\\"===r?(n=[n,n,n,n],e):e,i},i.round=function(n){return arguments.length?(l=n?Math.round:Number,i):l!=Number},i.sticky=function(n){return arguments.length?(h=n,a=null,i):h},i.ratio=function(n){return arguments.length?(p=n,i):p},i.mode=function(n){return arguments.length?(g=n+\\\"\\\",i):g},uu(i,o)},oa.random={normal:function(n,t){var e=arguments.length;return 2>e&&(t=1),1>e&&(n=0),function(){var e,r,u;do e=2*Math.random()-1,r=2*Math.random()-1,u=e*e+r*r;while(!u||u>1);return n+t*e*Math.sqrt(-2*Math.log(u)/u)}},logNormal:function(){var n=oa.random.normal.apply(oa,arguments);return function(){return Math.exp(n())}},bates:function(n){var t=oa.random.irwinHall(n);return function(){return t()/n}},irwinHall:function(n){return function(){for(var t=0,e=0;n>e;e++)t+=Math.random();return t}}},oa.scale={};var wl={floor:y,ceil:y};oa.scale.linear=function(){return Wu([0,1],[0,1],Mr,!1)};var Sl={s:1,g:1,p:1,r:1,e:1};oa.scale.log=function(){return ri(oa.scale.linear().domain([0,1]),10,!0,[1,10])};var kl=oa.format(\\\".0e\\\"),Nl={floor:function(n){return-Math.ceil(-n)},ceil:function(n){return-Math.floor(-n)}};oa.scale.pow=function(){return ui(oa.scale.linear(),1,[0,1])},oa.scale.sqrt=function(){return oa.scale.pow().exponent(.5)},oa.scale.ordinal=function(){return ai([],{t:\\\"range\\\",a:[[]]})},oa.scale.category10=function(){return oa.scale.ordinal().range(El)},oa.scale.category20=function(){return oa.scale.ordinal().range(Al)},oa.scale.category20b=function(){return oa.scale.ordinal().range(Cl)},oa.scale.category20c=function(){return oa.scale.ordinal().range(zl)};var El=[2062260,16744206,2924588,14034728,9725885,9197131,14907330,8355711,12369186,1556175].map(xn),Al=[2062260,11454440,16744206,16759672,2924588,10018698,14034728,16750742,9725885,12955861,9197131,12885140,14907330,16234194,8355711,13092807,12369186,14408589,1556175,10410725].map(xn),Cl=[3750777,5395619,7040719,10264286,6519097,9216594,11915115,13556636,9202993,12426809,15186514,15190932,8666169,11356490,14049643,15177372,8077683,10834324,13528509,14589654].map(xn),zl=[3244733,7057110,10406625,13032431,15095053,16616764,16625259,16634018,3253076,7652470,10607003,13101504,7695281,10394312,12369372,14342891,6513507,9868950,12434877,14277081].map(xn);oa.scale.quantile=function(){return oi([],[])},oa.scale.quantize=function(){return li(0,1,[0,1])},oa.scale.threshold=function(){return ci([.5],[0,1])},oa.scale.identity=function(){return si([0,1])},oa.svg={},oa.svg.arc=function(){function n(){var n=Math.max(0,+e.apply(this,arguments)),c=Math.max(0,+r.apply(this,arguments)),s=a.apply(this,arguments)-Ha,f=o.apply(this,arguments)-Ha,h=Math.abs(f-s),g=s>f?0:1;if(n>c&&(p=c,c=n,n=p),h>=Fa)return t(c,g)+(n?t(n,1-g):\\\"\\\")+\\\"Z\\\";var p,v,d,m,y,M,x,b,_,w,S,k,N=0,E=0,A=[];if((m=(+l.apply(this,arguments)||0)/2)&&(d=i===Ll?Math.sqrt(n*n+c*c):+i.apply(this,arguments),g||(E*=-1),c&&(E=tn(d/c*Math.sin(m))),n&&(N=tn(d/n*Math.sin(m)))),c){y=c*Math.cos(s+E),M=c*Math.sin(s+E),x=c*Math.cos(f-E),b=c*Math.sin(f-E);var C=Math.abs(f-s-2*E)<=ja?0:1;if(E&&mi(y,M,x,b)===g^C){var z=(s+f)/2;y=c*Math.cos(z),M=c*Math.sin(z),x=b=null}}else y=M=0;if(n){_=n*Math.cos(f-N),w=n*Math.sin(f-N),S=n*Math.cos(s+N),k=n*Math.sin(s+N);var L=Math.abs(s-f+2*N)<=ja?0:1;if(N&&mi(_,w,S,k)===1-g^L){var q=(s+f)/2;_=n*Math.cos(q),w=n*Math.sin(q),S=k=null}}else _=w=0;if(h>Da&&(p=Math.min(Math.abs(c-n)/2,+u.apply(this,arguments)))>.001){v=c>n^g?0:1;var T=p,R=p;if(ja>h){var D=null==S?[_,w]:null==x?[y,M]:Re([y,M],[S,k],[x,b],[_,w]),P=y-D[0],j=M-D[1],U=x-D[0],F=b-D[1],H=1/Math.sin(Math.acos((P*U+j*F)/(Math.sqrt(P*P+j*j)*Math.sqrt(U*U+F*F)))/2),O=Math.sqrt(D[0]*D[0]+D[1]*D[1]);R=Math.min(p,(n-O)/(H-1)),T=Math.min(p,(c-O)/(H+1))}if(null!=x){var I=yi(null==S?[_,w]:[S,k],[y,M],c,T,g),Y=yi([x,b],[_,w],c,T,g);p===T?A.push(\\\"M\\\",I[0],\\\"A\\\",T,\\\",\\\",T,\\\" 0 0,\\\",v,\\\" \\\",I[1],\\\"A\\\",c,\\\",\\\",c,\\\" 0 \\\",1-g^mi(I[1][0],I[1][1],Y[1][0],Y[1][1]),\\\",\\\",g,\\\" \\\",Y[1],\\\"A\\\",T,\\\",\\\",T,\\\" 0 0,\\\",v,\\\" \\\",Y[0]):A.push(\\\"M\\\",I[0],\\\"A\\\",T,\\\",\\\",T,\\\" 0 1,\\\",v,\\\" \\\",Y[0])}else A.push(\\\"M\\\",y,\\\",\\\",M);if(null!=S){var Z=yi([y,M],[S,k],n,-R,g),V=yi([_,w],null==x?[y,M]:[x,b],n,-R,g);p===R?A.push(\\\"L\\\",V[0],\\\"A\\\",R,\\\",\\\",R,\\\" 0 0,\\\",v,\\\" \\\",V[1],\\\"A\\\",n,\\\",\\\",n,\\\" 0 \\\",g^mi(V[1][0],V[1][1],Z[1][0],Z[1][1]),\\\",\\\",1-g,\\\" \\\",Z[1],\\\"A\\\",R,\\\",\\\",R,\\\" 0 0,\\\",v,\\\" \\\",Z[0]):A.push(\\\"L\\\",V[0],\\\"A\\\",R,\\\",\\\",R,\\\" 0 0,\\\",v,\\\" \\\",Z[0])}else A.push(\\\"L\\\",_,\\\",\\\",w)}else A.push(\\\"M\\\",y,\\\",\\\",M),null!=x&&A.push(\\\"A\\\",c,\\\",\\\",c,\\\" 0 \\\",C,\\\",\\\",g,\\\" \\\",x,\\\",\\\",b),A.push(\\\"L\\\",_,\\\",\\\",w),null!=S&&A.push(\\\"A\\\",n,\\\",\\\",n,\\\" 0 \\\",L,\\\",\\\",1-g,\\\" \\\",S,\\\",\\\",k);return A.push(\\\"Z\\\"),A.join(\\\"\\\")}function t(n,t){return\\\"M0,\\\"+n+\\\"A\\\"+n+\\\",\\\"+n+\\\" 0 1,\\\"+t+\\\" 0,\\\"+-n+\\\"A\\\"+n+\\\",\\\"+n+\\\" 0 1,\\\"+t+\\\" 0,\\\"+n}var e=hi,r=gi,u=fi,i=Ll,a=pi,o=vi,l=di;return n.innerRadius=function(t){return arguments.length?(e=En(t),n):e},n.outerRadius=function(t){return arguments.length?(r=En(t),n):r},n.cornerRadius=function(t){return arguments.length?(u=En(t),n):u},n.padRadius=function(t){return arguments.length?(i=t==Ll?Ll:En(t),n):i},n.startAngle=function(t){return arguments.length?(a=En(t),n):a},n.endAngle=function(t){return arguments.length?(o=En(t),n):o},n.padAngle=function(t){return arguments.length?(l=En(t),n):l},n.centroid=function(){var n=(+e.apply(this,arguments)+ +r.apply(this,arguments))/2,t=(+a.apply(this,arguments)+ +o.apply(this,arguments))/2-Ha;return[Math.cos(t)*n,Math.sin(t)*n]},n};var Ll=\\\"auto\\\";oa.svg.line=function(){return Mi(y)};var ql=oa.map({linear:xi,\\\"linear-closed\\\":bi,step:_i,\\\"step-before\\\":wi,\\\"step-after\\\":Si,basis:zi,\\\"basis-open\\\":Li,\\\"basis-closed\\\":qi,bundle:Ti,cardinal:Ei,\\\"cardinal-open\\\":ki,\\\"cardinal-closed\\\":Ni,monotone:Fi});ql.forEach(function(n,t){t.key=n,t.closed=/-closed$/.test(n)});var Tl=[0,2/3,1/3,0],Rl=[0,1/3,2/3,0],Dl=[0,1/6,2/3,1/6];oa.svg.line.radial=function(){var n=Mi(Hi);return n.radius=n.x,delete n.x,n.angle=n.y,delete n.y,n},wi.reverse=Si,Si.reverse=wi,oa.svg.area=function(){return Oi(y)},oa.svg.area.radial=function(){var n=Oi(Hi);return n.radius=n.x,delete n.x,n.innerRadius=n.x0,delete n.x0,n.outerRadius=n.x1,delete n.x1,n.angle=n.y,delete n.y,n.startAngle=n.y0,delete n.y0,n.endAngle=n.y1,delete n.y1,n},oa.svg.chord=function(){function n(n,o){var l=t(this,i,n,o),c=t(this,a,n,o);return\\\"M\\\"+l.p0+r(l.r,l.p1,l.a1-l.a0)+(e(l,c)?u(l.r,l.p1,l.r,l.p0):u(l.r,l.p1,c.r,c.p0)+r(c.r,c.p1,c.a1-c.a0)+u(c.r,c.p1,l.r,l.p0))+\\\"Z\\\"}function t(n,t,e,r){var u=t.call(n,e,r),i=o.call(n,u,r),a=l.call(n,u,r)-Ha,s=c.call(n,u,r)-Ha;return{r:i,a0:a,a1:s,p0:[i*Math.cos(a),i*Math.sin(a)],p1:[i*Math.cos(s),i*Math.sin(s)]}}function e(n,t){return n.a0==t.a0&&n.a1==t.a1}function r(n,t,e){return\\\"A\\\"+n+\\\",\\\"+n+\\\" 0 \\\"+ +(e>ja)+\\\",1 \\\"+t}function u(n,t,e,r){return\\\"Q 0,0 \\\"+r}var i=Me,a=xe,o=Ii,l=pi,c=vi;return n.radius=function(t){return arguments.length?(o=En(t),n):o},n.source=function(t){return arguments.length?(i=En(t),n):i},n.target=function(t){return arguments.length?(a=En(t),n):a},n.startAngle=function(t){return arguments.length?(l=En(t),n):l},n.endAngle=function(t){return arguments.length?(c=En(t),n):c},n},oa.svg.diagonal=function(){function n(n,u){var i=t.call(this,n,u),a=e.call(this,n,u),o=(i.y+a.y)/2,l=[i,{x:i.x,y:o},{x:a.x,y:o},a];return l=l.map(r),\\\"M\\\"+l[0]+\\\"C\\\"+l[1]+\\\" \\\"+l[2]+\\\" \\\"+l[3]}var t=Me,e=xe,r=Yi;return n.source=function(e){return arguments.length?(t=En(e),n):t},n.target=function(t){return arguments.length?(e=En(t),n):e},n.projection=function(t){return arguments.length?(r=t,n):r},n},oa.svg.diagonal.radial=function(){var n=oa.svg.diagonal(),t=Yi,e=n.projection;return n.projection=function(n){return arguments.length?e(Zi(t=n)):t},n},oa.svg.symbol=function(){function n(n,r){return(Pl.get(t.call(this,n,r))||$i)(e.call(this,n,r))}var t=Xi,e=Vi;return n.type=function(e){return arguments.length?(t=En(e),n):t},n.size=function(t){return arguments.length?(e=En(t),n):e},n};var Pl=oa.map({circle:$i,cross:function(n){var t=Math.sqrt(n/5)/2;return\\\"M\\\"+-3*t+\\\",\\\"+-t+\\\"H\\\"+-t+\\\"V\\\"+-3*t+\\\"H\\\"+t+\\\"V\\\"+-t+\\\"H\\\"+3*t+\\\"V\\\"+t+\\\"H\\\"+t+\\\"V\\\"+3*t+\\\"H\\\"+-t+\\\"V\\\"+t+\\\"H\\\"+-3*t+\\\"Z\\\"},diamond:function(n){var t=Math.sqrt(n/(2*Ul)),e=t*Ul;return\\\"M0,\\\"+-t+\\\"L\\\"+e+\\\",0 0,\\\"+t+\\\" \\\"+-e+\\\",0Z\\\"},square:function(n){var t=Math.sqrt(n)/2;return\\\"M\\\"+-t+\\\",\\\"+-t+\\\"L\\\"+t+\\\",\\\"+-t+\\\" \\\"+t+\\\",\\\"+t+\\\" \\\"+-t+\\\",\\\"+t+\\\"Z\\\"},\\\"triangle-down\\\":function(n){var t=Math.sqrt(n/jl),e=t*jl/2;return\\\"M0,\\\"+e+\\\"L\\\"+t+\\\",\\\"+-e+\\\" \\\"+-t+\\\",\\\"+-e+\\\"Z\\\"},\\\"triangle-up\\\":function(n){var t=Math.sqrt(n/jl),e=t*jl/2;return\\\"M0,\\\"+-e+\\\"L\\\"+t+\\\",\\\"+e+\\\" \\\"+-t+\\\",\\\"+e+\\\"Z\\\"}});oa.svg.symbolTypes=Pl.keys();var jl=Math.sqrt(3),Ul=Math.tan(30*Oa);Aa.transition=function(n){for(var t,e,r=Fl||++Yl,u=Ki(n),i=[],a=Hl||{time:Date.now(),ease:Nr,delay:0,duration:250},o=-1,l=this.length;++o<l;){i.push(t=[]);for(var c=this[o],s=-1,f=c.length;++s<f;)(e=c[s])&&Qi(e,s,u,r,a),t.push(e)}return Wi(i,u,r)},Aa.interrupt=function(n){return this.each(null==n?Ol:Bi(Ki(n)))};var Fl,Hl,Ol=Bi(Ki()),Il=[],Yl=0;Il.call=Aa.call,Il.empty=Aa.empty,Il.node=Aa.node,Il.size=Aa.size,oa.transition=function(n,t){return n&&n.transition?Fl?n.transition(t):n:oa.selection().transition(n)},oa.transition.prototype=Il,Il.select=function(n){var t,e,r,u=this.id,i=this.namespace,a=[];n=A(n);for(var o=-1,l=this.length;++o<l;){a.push(t=[]);for(var c=this[o],s=-1,f=c.length;++s<f;)(r=c[s])&&(e=n.call(r,r.__data__,s,o))?(\\\"__data__\\\"in r&&(e.__data__=r.__data__),Qi(e,s,i,u,r[i][u]),t.push(e)):t.push(null)}return Wi(a,i,u)},Il.selectAll=function(n){var t,e,r,u,i,a=this.id,o=this.namespace,l=[];n=C(n);for(var c=-1,s=this.length;++c<s;)for(var f=this[c],h=-1,g=f.length;++h<g;)if(r=f[h]){i=r[o][a],e=n.call(r,r.__data__,h,c),l.push(t=[]);for(var p=-1,v=e.length;++p<v;)(u=e[p])&&Qi(u,p,o,a,i),t.push(u)}return Wi(l,o,a)},Il.filter=function(n){var t,e,r,u=[];\\\"function\\\"!=typeof n&&(n=O(n));for(var i=0,a=this.length;a>i;i++){u.push(t=[]);for(var e=this[i],o=0,l=e.length;l>o;o++)(r=e[o])&&n.call(r,r.__data__,o,i)&&t.push(r)}return Wi(u,this.namespace,this.id)},Il.tween=function(n,t){var e=this.id,r=this.namespace;return arguments.length<2?this.node()[r][e].tween.get(n):Y(this,null==t?function(t){t[r][e].tween.remove(n)}:function(u){u[r][e].tween.set(n,t)})},Il.attr=function(n,t){function e(){this.removeAttribute(o)}function r(){this.removeAttributeNS(o.space,o.local)}function u(n){return null==n?e:(n+=\\\"\\\",function(){var t,e=this.getAttribute(o);return e!==n&&(t=a(e,n),function(n){this.setAttribute(o,t(n))})})}function i(n){return null==n?r:(n+=\\\"\\\",function(){var t,e=this.getAttributeNS(o.space,o.local);return e!==n&&(t=a(e,n),function(n){this.setAttributeNS(o.space,o.local,t(n))})})}if(arguments.length<2){for(t in n)this.attr(t,n[t]);return this}var a=\\\"transform\\\"==n?$r:Mr,o=oa.ns.qualify(n);return Ji(this,\\\"attr.\\\"+n,t,o.local?i:u)},Il.attrTween=function(n,t){function e(n,e){var r=t.call(this,n,e,this.getAttribute(u));return r&&function(n){this.setAttribute(u,r(n))}}function r(n,e){var r=t.call(this,n,e,this.getAttributeNS(u.space,u.local));return r&&function(n){this.setAttributeNS(u.space,u.local,r(n))}}var u=oa.ns.qualify(n);return this.tween(\\\"attr.\\\"+n,u.local?r:e)},Il.style=function(n,e,r){function u(){this.style.removeProperty(n)}function i(e){return null==e?u:(e+=\\\"\\\",function(){var u,i=t(this).getComputedStyle(this,null).getPropertyValue(n);return i!==e&&(u=Mr(i,e),function(t){this.style.setProperty(n,u(t),r)})})}var a=arguments.length;if(3>a){if(\\\"string\\\"!=typeof n){2>a&&(e=\\\"\\\");for(r in n)this.style(r,n[r],e);return this}r=\\\"\\\"}return Ji(this,\\\"style.\\\"+n,e,i)},Il.styleTween=function(n,e,r){function u(u,i){var a=e.call(this,u,i,t(this).getComputedStyle(this,null).getPropertyValue(n));return a&&function(t){this.style.setProperty(n,a(t),r)}}return arguments.length<3&&(r=\\\"\\\"),this.tween(\\\"style.\\\"+n,u)},Il.text=function(n){return Ji(this,\\\"text\\\",n,Gi)},Il.remove=function(){var n=this.namespace;return this.each(\\\"end.transition\\\",function(){var t;this[n].count<2&&(t=this.parentNode)&&t.removeChild(this)})},Il.ease=function(n){var t=this.id,e=this.namespace;return arguments.length<1?this.node()[e][t].ease:(\\\"function\\\"!=typeof n&&(n=oa.ease.apply(oa,arguments)),Y(this,function(r){r[e][t].ease=n}))},Il.delay=function(n){var t=this.id,e=this.namespace;return arguments.length<1?this.node()[e][t].delay:Y(this,\\\"function\\\"==typeof n?function(r,u,i){r[e][t].delay=+n.call(r,r.__data__,u,i)}:(n=+n,function(r){r[e][t].delay=n}))},Il.duration=function(n){var t=this.id,e=this.namespace;return arguments.length<1?this.node()[e][t].duration:Y(this,\\\"function\\\"==typeof n?function(r,u,i){r[e][t].duration=Math.max(1,n.call(r,r.__data__,u,i))}:(n=Math.max(1,n),function(r){r[e][t].duration=n}))},Il.each=function(n,t){var e=this.id,r=this.namespace;if(arguments.length<2){var u=Hl,i=Fl;try{Fl=e,Y(this,function(t,u,i){Hl=t[r][e],n.call(t,t.__data__,u,i)})}finally{Hl=u,Fl=i}}else Y(this,function(u){var i=u[r][e];(i.event||(i.event=oa.dispatch(\\\"start\\\",\\\"end\\\",\\\"interrupt\\\"))).on(n,t)});return this},Il.transition=function(){for(var n,t,e,r,u=this.id,i=++Yl,a=this.namespace,o=[],l=0,c=this.length;c>l;l++){o.push(n=[]);for(var t=this[l],s=0,f=t.length;f>s;s++)(e=t[s])&&(r=e[a][u],Qi(e,s,a,i,{time:r.time,ease:r.ease,delay:r.delay+r.duration,duration:r.duration})),n.push(e)}return Wi(o,a,i)},oa.svg.axis=function(){function n(n){n.each(function(){var n,c=oa.select(this),s=this.__chart__||e,f=this.__chart__=e.copy(),h=null==l?f.ticks?f.ticks.apply(f,o):f.domain():l,g=null==t?f.tickFormat?f.tickFormat.apply(f,o):y:t,p=c.selectAll(\\\".tick\\\").data(h,f),v=p.enter().insert(\\\"g\\\",\\\".domain\\\").attr(\\\"class\\\",\\\"tick\\\").style(\\\"opacity\\\",Da),d=oa.transition(p.exit()).style(\\\"opacity\\\",Da).remove(),m=oa.transition(p.order()).style(\\\"opacity\\\",1),M=Math.max(u,0)+a,x=Zu(f),b=c.selectAll(\\\".domain\\\").data([0]),_=(b.enter().append(\\\"path\\\").attr(\\\"class\\\",\\\"domain\\\"),oa.transition(b));v.append(\\\"line\\\"),v.append(\\\"text\\\");var w,S,k,N,E=v.select(\\\"line\\\"),A=m.select(\\\"line\\\"),C=p.select(\\\"text\\\").text(g),z=v.select(\\\"text\\\"),L=m.select(\\\"text\\\"),q=\\\"top\\\"===r||\\\"left\\\"===r?-1:1;if(\\\"bottom\\\"===r||\\\"top\\\"===r?(n=na,w=\\\"x\\\",k=\\\"y\\\",S=\\\"x2\\\",N=\\\"y2\\\",C.attr(\\\"dy\\\",0>q?\\\"0em\\\":\\\".71em\\\").style(\\\"text-anchor\\\",\\\"middle\\\"),_.attr(\\\"d\\\",\\\"M\\\"+x[0]+\\\",\\\"+q*i+\\\"V0H\\\"+x[1]+\\\"V\\\"+q*i)):(n=ta,w=\\\"y\\\",k=\\\"x\\\",S=\\\"y2\\\",N=\\\"x2\\\",C.attr(\\\"dy\\\",\\\".32em\\\").style(\\\"text-anchor\\\",0>q?\\\"end\\\":\\\"start\\\"),_.attr(\\\"d\\\",\\\"M\\\"+q*i+\\\",\\\"+x[0]+\\\"H0V\\\"+x[1]+\\\"H\\\"+q*i)),E.attr(N,q*u),z.attr(k,q*M),A.attr(S,0).attr(N,q*u),L.attr(w,0).attr(k,q*M),f.rangeBand){var T=f,R=T.rangeBand()/2;s=f=function(n){return T(n)+R}}else s.rangeBand?s=f:d.call(n,f,s);v.call(n,s,f),m.call(n,f,f)})}var t,e=oa.scale.linear(),r=Zl,u=6,i=6,a=3,o=[10],l=null;return n.scale=function(t){return arguments.length?(e=t,n):e},n.orient=function(t){return arguments.length?(r=t in Vl?t+\\\"\\\":Zl,n):r},n.ticks=function(){return arguments.length?(o=ca(arguments),n):o},n.tickValues=function(t){return arguments.length?(l=t,n):l},n.tickFormat=function(e){return arguments.length?(t=e,n):t},n.tickSize=function(t){var e=arguments.length;return e?(u=+t,i=+arguments[e-1],n):u},n.innerTickSize=function(t){return arguments.length?(u=+t,n):u},n.outerTickSize=function(t){return arguments.length?(i=+t,n):i},n.tickPadding=function(t){return arguments.length?(a=+t,n):a},n.tickSubdivide=function(){return arguments.length&&n},n};var Zl=\\\"bottom\\\",Vl={top:1,right:1,bottom:1,left:1};oa.svg.brush=function(){function n(t){t.each(function(){var t=oa.select(this).style(\\\"pointer-events\\\",\\\"all\\\").style(\\\"-webkit-tap-highlight-color\\\",\\\"rgba(0,0,0,0)\\\").on(\\\"mousedown.brush\\\",i).on(\\\"touchstart.brush\\\",i),a=t.selectAll(\\\".background\\\").data([0]);a.enter().append(\\\"rect\\\").attr(\\\"class\\\",\\\"background\\\").style(\\\"visibility\\\",\\\"hidden\\\").style(\\\"cursor\\\",\\\"crosshair\\\"),t.selectAll(\\\".extent\\\").data([0]).enter().append(\\\"rect\\\").attr(\\\"class\\\",\\\"extent\\\").style(\\\"cursor\\\",\\\"move\\\");var o=t.selectAll(\\\".resize\\\").data(v,y);o.exit().remove(),o.enter().append(\\\"g\\\").attr(\\\"class\\\",function(n){return\\\"resize \\\"+n}).style(\\\"cursor\\\",function(n){return Xl[n]}).append(\\\"rect\\\").attr(\\\"x\\\",function(n){return/[ew]$/.test(n)?-3:null}).attr(\\\"y\\\",function(n){return/^[ns]/.test(n)?-3:null}).attr(\\\"width\\\",6).attr(\\\"height\\\",6).style(\\\"visibility\\\",\\\"hidden\\\"),o.style(\\\"display\\\",n.empty()?\\\"none\\\":null);var l,f=oa.transition(t),h=oa.transition(a);c&&(l=Zu(c),h.attr(\\\"x\\\",l[0]).attr(\\\"width\\\",l[1]-l[0]),r(f)),s&&(l=Zu(s),h.attr(\\\"y\\\",l[0]).attr(\\\"height\\\",l[1]-l[0]),u(f)),e(f)})}function e(n){n.selectAll(\\\".resize\\\").attr(\\\"transform\\\",function(n){return\\\"translate(\\\"+f[+/e$/.test(n)]+\\\",\\\"+h[+/^s/.test(n)]+\\\")\\\"})}function r(n){n.select(\\\".extent\\\").attr(\\\"x\\\",f[0]),n.selectAll(\\\".extent,.n>rect,.s>rect\\\").attr(\\\"width\\\",f[1]-f[0])}function u(n){n.select(\\\".extent\\\").attr(\\\"y\\\",h[0]),n.selectAll(\\\".extent,.e>rect,.w>rect\\\").attr(\\\"height\\\",h[1]-h[0])}function i(){function i(){32==oa.event.keyCode&&(C||(M=null,L[0]-=f[1],L[1]-=h[1],C=2),S())}function v(){32==oa.event.keyCode&&2==C&&(L[0]+=f[1],L[1]+=h[1],C=0,S())}function d(){var n=oa.mouse(b),t=!1;x&&(n[0]+=x[0],n[1]+=x[1]),C||(oa.event.altKey?(M||(M=[(f[0]+f[1])/2,(h[0]+h[1])/2]),L[0]=f[+(n[0]<M[0])],L[1]=h[+(n[1]<M[1])]):M=null),E&&m(n,c,0)&&(r(k),t=!0),A&&m(n,s,1)&&(u(k),t=!0),t&&(e(k),w({type:\\\"brush\\\",mode:C?\\\"move\\\":\\\"resize\\\"}))}function m(n,t,e){var r,u,i=Zu(t),l=i[0],c=i[1],s=L[e],v=e?h:f,d=v[1]-v[0];return C&&(l-=s,c-=d+s),r=(e?p:g)?Math.max(l,Math.min(c,n[e])):n[e],C?u=(r+=s)+d:(M&&(s=Math.max(l,Math.min(c,2*M[e]-r))),r>s?(u=r,r=s):u=s),v[0]!=r||v[1]!=u?(e?o=null:a=null,v[0]=r,v[1]=u,!0):void 0}function y(){d(),k.style(\\\"pointer-events\\\",\\\"all\\\").selectAll(\\\".resize\\\").style(\\\"display\\\",n.empty()?\\\"none\\\":null),oa.select(\\\"body\\\").style(\\\"cursor\\\",null),q.on(\\\"mousemove.brush\\\",null).on(\\\"mouseup.brush\\\",null).on(\\\"touchmove.brush\\\",null).on(\\\"touchend.brush\\\",null).on(\\\"keydown.brush\\\",null).on(\\\"keyup.brush\\\",null),z(),w({type:\\\"brushend\\\"})}var M,x,b=this,_=oa.select(oa.event.target),w=l.of(b,arguments),k=oa.select(b),N=_.datum(),E=!/^(n|s)$/.test(N)&&c,A=!/^(e|w)$/.test(N)&&s,C=_.classed(\\\"extent\\\"),z=W(b),L=oa.mouse(b),q=oa.select(t(b)).on(\\\"keydown.brush\\\",i).on(\\\"keyup.brush\\\",v);if(oa.event.changedTouches?q.on(\\\"touchmove.brush\\\",d).on(\\\"touchend.brush\\\",y):q.on(\\\"mousemove.brush\\\",d).on(\\\"mouseup.brush\\\",y),k.interrupt().selectAll(\\\"*\\\").interrupt(),C)L[0]=f[0]-L[0],L[1]=h[0]-L[1];else if(N){var T=+/w$/.test(N),R=+/^n/.test(N);x=[f[1-T]-L[0],h[1-R]-L[1]],L[0]=f[T],L[1]=h[R]}else oa.event.altKey&&(M=L.slice());k.style(\\\"pointer-events\\\",\\\"none\\\").selectAll(\\\".resize\\\").style(\\\"display\\\",null),oa.select(\\\"body\\\").style(\\\"cursor\\\",_.style(\\\"cursor\\\")),w({type:\\\"brushstart\\\"}),d()}var a,o,l=N(n,\\\"brushstart\\\",\\\"brush\\\",\\\"brushend\\\"),c=null,s=null,f=[0,0],h=[0,0],g=!0,p=!0,v=$l[0];return n.event=function(n){n.each(function(){var n=l.of(this,arguments),t={x:f,y:h,i:a,j:o},e=this.__chart__||t;this.__chart__=t,Fl?oa.select(this).transition().each(\\\"start.brush\\\",function(){a=e.i,o=e.j,f=e.x,h=e.y,n({type:\\\"brushstart\\\"})}).tween(\\\"brush:brush\\\",function(){var e=xr(f,t.x),r=xr(h,t.y);return a=o=null,function(u){f=t.x=e(u),h=t.y=r(u),n({type:\\\"brush\\\",mode:\\\"resize\\\"})}}).each(\\\"end.brush\\\",function(){a=t.i,o=t.j,n({type:\\\"brush\\\",mode:\\\"resize\\\"}),n({type:\\\"brushend\\\"})}):(n({type:\\\"brushstart\\\"}),n({type:\\\"brush\\\",mode:\\\"resize\\\"}),n({type:\\\"brushend\\\"}))})},n.x=function(t){return arguments.length?(c=t,v=$l[!c<<1|!s],n):c},n.y=function(t){return arguments.length?(s=t,v=$l[!c<<1|!s],n):s},n.clamp=function(t){return arguments.length?(c&&s?(g=!!t[0],p=!!t[1]):c?g=!!t:s&&(p=!!t),n):c&&s?[g,p]:c?g:s?p:null},n.extent=function(t){var e,r,u,i,l;return arguments.length?(c&&(e=t[0],r=t[1],s&&(e=e[0],r=r[0]),a=[e,r],c.invert&&(e=c(e),r=c(r)),e>r&&(l=e,e=r,r=l),(e!=f[0]||r!=f[1])&&(f=[e,r])),s&&(u=t[0],i=t[1],c&&(u=u[1],i=i[1]),o=[u,i],s.invert&&(u=s(u),i=s(i)),u>i&&(l=u,u=i,i=l),(u!=h[0]||i!=h[1])&&(h=[u,i])),n):(c&&(a?(e=a[0],r=a[1]):(e=f[0],r=f[1],c.invert&&(e=c.invert(e),r=c.invert(r)),e>r&&(l=e,e=r,r=l))),s&&(o?(u=o[0],i=o[1]):(u=h[0],i=h[1],s.invert&&(u=s.invert(u),i=s.invert(i)),u>i&&(l=u,u=i,i=l))),c&&s?[[e,u],[r,i]]:c?[e,r]:s&&[u,i])},n.clear=function(){return n.empty()||(f=[0,0],h=[0,0],a=o=null),n},n.empty=function(){return!!c&&f[0]==f[1]||!!s&&h[0]==h[1]},oa.rebind(n,l,\\\"on\\\")};var Xl={n:\\\"ns-resize\\\",e:\\\"ew-resize\\\",s:\\\"ns-resize\\\",w:\\\"ew-resize\\\",nw:\\\"nwse-resize\\\",ne:\\\"nesw-resize\\\",se:\\\"nwse-resize\\\",sw:\\\"nesw-resize\\\"},$l=[[\\\"n\\\",\\\"e\\\",\\\"s\\\",\\\"w\\\",\\\"nw\\\",\\\"ne\\\",\\\"se\\\",\\\"sw\\\"],[\\\"e\\\",\\\"w\\\"],[\\\"n\\\",\\\"s\\\"],[]],Bl=ho.format=Mo.timeFormat,Wl=Bl.utc,Jl=Wl(\\\"%Y-%m-%dT%H:%M:%S.%LZ\\\");Bl.iso=Date.prototype.toISOString&&+new Date(\\\"2000-01-01T00:00:00.000Z\\\")?ea:Jl,ea.parse=function(n){var t=new Date(n);return isNaN(t)?null:t},ea.toString=Jl.toString,ho.second=On(function(n){return new go(1e3*Math.floor(n/1e3))},function(n,t){n.setTime(n.getTime()+1e3*Math.floor(t))},function(n){return n.getSeconds()}),ho.seconds=ho.second.range,ho.seconds.utc=ho.second.utc.range,ho.minute=On(function(n){return new go(6e4*Math.floor(n/6e4))},function(n,t){n.setTime(n.getTime()+6e4*Math.floor(t))},function(n){return n.getMinutes()}),ho.minutes=ho.minute.range,ho.minutes.utc=ho.minute.utc.range,ho.hour=On(function(n){var t=n.getTimezoneOffset()/60;return new go(36e5*(Math.floor(n/36e5-t)+t))},function(n,t){n.setTime(n.getTime()+36e5*Math.floor(t))},function(n){return n.getHours()}),ho.hours=ho.hour.range,ho.hours.utc=ho.hour.utc.range,ho.month=On(function(n){return n=ho.day(n),n.setDate(1),n},function(n,t){n.setMonth(n.getMonth()+t)},function(n){return n.getMonth()}),ho.months=ho.month.range,ho.months.utc=ho.month.utc.range;var Gl=[1e3,5e3,15e3,3e4,6e4,3e5,9e5,18e5,36e5,108e5,216e5,432e5,864e5,1728e5,6048e5,2592e6,7776e6,31536e6],Kl=[[ho.second,1],[ho.second,5],[ho.second,15],[ho.second,30],[ho.minute,1],[ho.minute,5],[ho.minute,15],[ho.minute,30],[ho.hour,1],[ho.hour,3],[ho.hour,6],[ho.hour,12],[ho.day,1],[ho.day,2],[ho.week,1],[ho.month,1],[ho.month,3],[ho.year,1]],Ql=Bl.multi([[\\\".%L\\\",function(n){return n.getMilliseconds()}],[\\\":%S\\\",function(n){return n.getSeconds()}],[\\\"%I:%M\\\",function(n){return n.getMinutes()}],[\\\"%I %p\\\",function(n){return n.getHours()}],[\\\"%a %d\\\",function(n){return n.getDay()&&1!=n.getDate()}],[\\\"%b %d\\\",function(n){return 1!=n.getDate()}],[\\\"%B\\\",function(n){return n.getMonth()}],[\\\"%Y\\\",zt]]),nc={range:function(n,t,e){return oa.range(Math.ceil(n/e)*e,+t,e).map(ua)},floor:y,ceil:y};Kl.year=ho.year,ho.scale=function(){return ra(oa.scale.linear(),Kl,Ql)};var tc=Kl.map(function(n){return[n[0].utc,n[1]]}),ec=Wl.multi([[\\\".%L\\\",function(n){return n.getUTCMilliseconds()}],[\\\":%S\\\",function(n){return n.getUTCSeconds()}],[\\\"%I:%M\\\",function(n){return n.getUTCMinutes()}],[\\\"%I %p\\\",function(n){return n.getUTCHours()}],[\\\"%a %d\\\",function(n){return n.getUTCDay()&&1!=n.getUTCDate()}],[\\\"%b %d\\\",function(n){return 1!=n.getUTCDate()}],[\\\"%B\\\",function(n){return n.getUTCMonth()}],[\\\"%Y\\\",zt]]);tc.year=ho.year.utc,ho.scale.utc=function(){return ra(oa.scale.linear(),tc,ec)},oa.text=An(function(n){return n.responseText}),oa.json=function(n,t){return Cn(n,\\\"application/json\\\",ia,t)},oa.html=function(n,t){return Cn(n,\\\"text/html\\\",aa,t)},oa.xml=An(function(n){return n.responseXML}),\\\"function\\\"==typeof define&&define.amd?(this.d3=oa,define(oa)):\\\"object\\\"==typeof module&&module.exports?module.exports=oa:this.d3=oa}();\"\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/raw-loader!./src/assets/inspinia/plugins/d3/d3.min.js\n// module id = 2180\n// module chunks = 1","require(\"!!/opt/atlassian/pipelines/agent/build/node_modules/script-loader/addScript.js\")(require(\"!!/opt/atlassian/pipelines/agent/build/node_modules/raw-loader/index.js!/opt/atlassian/pipelines/agent/build/src/assets/inspinia/plugins/c3/c3.js\"))\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/script-loader!./src/assets/inspinia/plugins/c3/c3.js\n// module id = 2181\n// module chunks = 1","module.exports = \"(function(window) {\\n 'use strict';\\n\\n /*global define, module, exports, require */\\n\\n var c3 = { version: '0.4.11' };\\n\\n var c3_chart_fn, c3_chart_internal_fn, c3_chart_internal_axis_fn;\\n\\n function API(owner) {\\n this.owner = owner;\\n }\\n\\n function inherit(base, derived) {\\n if (Object.create) {\\n derived.prototype = Object.create(base.prototype);\\n } else {\\n var f = function f() {};\\n f.prototype = base.prototype;\\n derived.prototype = new f();\\n }\\n\\n derived.prototype.constructor = derived;\\n\\n return derived;\\n }\\n\\n function Chart(config) {\\n var $$ = (this.internal = new ChartInternal(this));\\n $$.loadConfig(config);\\n\\n $$.beforeInit(config);\\n $$.init();\\n $$.afterInit(config);\\n\\n // bind \\\"this\\\" to nested API\\n (function bindThis(fn, target, argThis) {\\n Object.keys(fn).forEach(function(key) {\\n target[key] = fn[key].bind(argThis);\\n if (Object.keys(fn[key]).length > 0) {\\n bindThis(fn[key], target[key], argThis);\\n }\\n });\\n })(c3_chart_fn, this, this);\\n }\\n\\n function ChartInternal(api) {\\n var $$ = this;\\n $$.d3 = window.d3 ? window.d3 : typeof require !== 'undefined' ? require('d3') : undefined;\\n $$.api = api;\\n $$.config = $$.getDefaultConfig();\\n $$.data = {};\\n $$.cache = {};\\n $$.axes = {};\\n }\\n\\n c3.generate = function(config) {\\n return new Chart(config);\\n };\\n\\n c3.chart = {\\n fn: Chart.prototype,\\n internal: {\\n fn: ChartInternal.prototype,\\n axis: {\\n fn: Axis.prototype\\n }\\n }\\n };\\n c3_chart_fn = c3.chart.fn;\\n c3_chart_internal_fn = c3.chart.internal.fn;\\n c3_chart_internal_axis_fn = c3.chart.internal.axis.fn;\\n\\n c3_chart_internal_fn.beforeInit = function() {\\n // can do something\\n };\\n c3_chart_internal_fn.afterInit = function() {\\n // can do something\\n };\\n c3_chart_internal_fn.init = function() {\\n var $$ = this,\\n config = $$.config;\\n\\n $$.initParams();\\n\\n if (config.data_url) {\\n $$.convertUrlToData(\\n config.data_url,\\n config.data_mimeType,\\n config.data_headers,\\n config.data_keys,\\n $$.initWithData\\n );\\n } else if (config.data_json) {\\n $$.initWithData($$.convertJsonToData(config.data_json, config.data_keys));\\n } else if (config.data_rows) {\\n $$.initWithData($$.convertRowsToData(config.data_rows));\\n } else if (config.data_columns) {\\n $$.initWithData($$.convertColumnsToData(config.data_columns));\\n } else {\\n throw Error('url or json or rows or columns is required.');\\n }\\n };\\n\\n c3_chart_internal_fn.initParams = function() {\\n var $$ = this,\\n d3 = $$.d3,\\n config = $$.config;\\n\\n // MEMO: clipId needs to be unique because it conflicts when multiple charts exist\\n ($$.clipId = 'c3-' + +new Date() + '-clip'),\\n ($$.clipIdForXAxis = $$.clipId + '-xaxis'),\\n ($$.clipIdForYAxis = $$.clipId + '-yaxis'),\\n ($$.clipIdForGrid = $$.clipId + '-grid'),\\n ($$.clipIdForSubchart = $$.clipId + '-subchart'),\\n ($$.clipPath = $$.getClipPath($$.clipId)),\\n ($$.clipPathForXAxis = $$.getClipPath($$.clipIdForXAxis)),\\n ($$.clipPathForYAxis = $$.getClipPath($$.clipIdForYAxis));\\n ($$.clipPathForGrid = $$.getClipPath($$.clipIdForGrid)),\\n ($$.clipPathForSubchart = $$.getClipPath($$.clipIdForSubchart)),\\n ($$.dragStart = null);\\n $$.dragging = false;\\n $$.flowing = false;\\n $$.cancelClick = false;\\n $$.mouseover = false;\\n $$.transiting = false;\\n\\n $$.color = $$.generateColor();\\n $$.levelColor = $$.generateLevelColor();\\n\\n $$.dataTimeFormat = config.data_xLocaltime ? d3.time.format : d3.time.format.utc;\\n $$.axisTimeFormat = config.axis_x_localtime ? d3.time.format : d3.time.format.utc;\\n $$.defaultAxisTimeFormat = $$.axisTimeFormat.multi([\\n [\\n '.%L',\\n function(d) {\\n return d.getMilliseconds();\\n }\\n ],\\n [\\n ':%S',\\n function(d) {\\n return d.getSeconds();\\n }\\n ],\\n [\\n '%I:%M',\\n function(d) {\\n return d.getMinutes();\\n }\\n ],\\n [\\n '%I %p',\\n function(d) {\\n return d.getHours();\\n }\\n ],\\n [\\n '%-m/%-d',\\n function(d) {\\n return d.getDay() && d.getDate() !== 1;\\n }\\n ],\\n [\\n '%-m/%-d',\\n function(d) {\\n return d.getDate() !== 1;\\n }\\n ],\\n [\\n '%-m/%-d',\\n function(d) {\\n return d.getMonth();\\n }\\n ],\\n [\\n '%Y/%-m/%-d',\\n function() {\\n return true;\\n }\\n ]\\n ]);\\n\\n $$.hiddenTargetIds = [];\\n $$.hiddenLegendIds = [];\\n $$.focusedTargetIds = [];\\n $$.defocusedTargetIds = [];\\n\\n $$.xOrient = config.axis_rotated ? 'left' : 'bottom';\\n $$.yOrient = config.axis_rotated\\n ? config.axis_y_inner\\n ? 'top'\\n : 'bottom'\\n : config.axis_y_inner\\n ? 'right'\\n : 'left';\\n $$.y2Orient = config.axis_rotated\\n ? config.axis_y2_inner\\n ? 'bottom'\\n : 'top'\\n : config.axis_y2_inner\\n ? 'left'\\n : 'right';\\n $$.subXOrient = config.axis_rotated ? 'left' : 'bottom';\\n\\n $$.isLegendRight = config.legend_position === 'right';\\n $$.isLegendInset = config.legend_position === 'inset';\\n $$.isLegendTop = config.legend_inset_anchor === 'top-left' || config.legend_inset_anchor === 'top-right';\\n $$.isLegendLeft = config.legend_inset_anchor === 'top-left' || config.legend_inset_anchor === 'bottom-left';\\n $$.legendStep = 0;\\n $$.legendItemWidth = 0;\\n $$.legendItemHeight = 0;\\n\\n $$.currentMaxTickWidths = {\\n x: 0,\\n y: 0,\\n y2: 0\\n };\\n\\n $$.rotated_padding_left = 30;\\n $$.rotated_padding_right = config.axis_rotated && !config.axis_x_show ? 0 : 30;\\n $$.rotated_padding_top = 5;\\n\\n $$.withoutFadeIn = {};\\n\\n $$.intervalForObserveInserted = undefined;\\n\\n $$.axes.subx = d3.selectAll([]); // needs when excluding subchart.js\\n };\\n\\n c3_chart_internal_fn.initChartElements = function() {\\n if (this.initBar) {\\n this.initBar();\\n }\\n if (this.initLine) {\\n this.initLine();\\n }\\n if (this.initArc) {\\n this.initArc();\\n }\\n if (this.initGauge) {\\n this.initGauge();\\n }\\n if (this.initText) {\\n this.initText();\\n }\\n };\\n\\n c3_chart_internal_fn.initWithData = function(data) {\\n var $$ = this,\\n d3 = $$.d3,\\n config = $$.config;\\n var defs,\\n main,\\n binding = true;\\n\\n $$.axis = new Axis($$);\\n\\n if ($$.initPie) {\\n $$.initPie();\\n }\\n if ($$.initBrush) {\\n $$.initBrush();\\n }\\n if ($$.initZoom) {\\n $$.initZoom();\\n }\\n\\n if (!config.bindto) {\\n $$.selectChart = d3.selectAll([]);\\n } else if (typeof config.bindto.node === 'function') {\\n $$.selectChart = config.bindto;\\n } else {\\n $$.selectChart = d3.select(config.bindto);\\n }\\n if ($$.selectChart.empty()) {\\n $$.selectChart = d3.select(document.createElement('div')).style('opacity', 0);\\n $$.observeInserted($$.selectChart);\\n binding = false;\\n }\\n $$.selectChart.html('').classed('c3', true);\\n\\n // Init data as targets\\n $$.data.xs = {};\\n $$.data.targets = $$.convertDataToTargets(data);\\n\\n if (config.data_filter) {\\n $$.data.targets = $$.data.targets.filter(config.data_filter);\\n }\\n\\n // Set targets to hide if needed\\n if (config.data_hide) {\\n $$.addHiddenTargetIds(config.data_hide === true ? $$.mapToIds($$.data.targets) : config.data_hide);\\n }\\n if (config.legend_hide) {\\n $$.addHiddenLegendIds(config.legend_hide === true ? $$.mapToIds($$.data.targets) : config.legend_hide);\\n }\\n\\n // when gauge, hide legend // TODO: fix\\n if ($$.hasType('gauge')) {\\n config.legend_show = false;\\n }\\n\\n // Init sizes and scales\\n $$.updateSizes();\\n $$.updateScales();\\n\\n // Set domains for each scale\\n $$.x.domain(d3.extent($$.getXDomain($$.data.targets)));\\n $$.y.domain($$.getYDomain($$.data.targets, 'y'));\\n $$.y2.domain($$.getYDomain($$.data.targets, 'y2'));\\n $$.subX.domain($$.x.domain());\\n $$.subY.domain($$.y.domain());\\n $$.subY2.domain($$.y2.domain());\\n\\n // Save original x domain for zoom update\\n $$.orgXDomain = $$.x.domain();\\n\\n // Set initialized scales to brush and zoom\\n if ($$.brush) {\\n $$.brush.scale($$.subX);\\n }\\n if (config.zoom_enabled) {\\n $$.zoom.scale($$.x);\\n }\\n\\n /*-- Basic Elements --*/\\n\\n // Define svgs\\n $$.svg = $$.selectChart\\n .append('svg')\\n .style('overflow', 'hidden')\\n .on('mouseenter', function() {\\n return config.onmouseover.call($$);\\n })\\n .on('mouseleave', function() {\\n return config.onmouseout.call($$);\\n });\\n\\n if ($$.config.svg_classname) {\\n $$.svg.attr('class', $$.config.svg_classname);\\n }\\n\\n // Define defs\\n defs = $$.svg.append('defs');\\n $$.clipChart = $$.appendClip(defs, $$.clipId);\\n $$.clipXAxis = $$.appendClip(defs, $$.clipIdForXAxis);\\n $$.clipYAxis = $$.appendClip(defs, $$.clipIdForYAxis);\\n $$.clipGrid = $$.appendClip(defs, $$.clipIdForGrid);\\n $$.clipSubchart = $$.appendClip(defs, $$.clipIdForSubchart);\\n $$.updateSvgSize();\\n\\n // Define regions\\n main = $$.main = $$.svg.append('g').attr('transform', $$.getTranslate('main'));\\n\\n if ($$.initSubchart) {\\n $$.initSubchart();\\n }\\n if ($$.initTooltip) {\\n $$.initTooltip();\\n }\\n if ($$.initLegend) {\\n $$.initLegend();\\n }\\n if ($$.initTitle) {\\n $$.initTitle();\\n }\\n\\n /*-- Main Region --*/\\n\\n // text when empty\\n main\\n .append('text')\\n .attr('class', CLASS.text + ' ' + CLASS.empty)\\n .attr('text-anchor', 'middle') // horizontal centering of text at x position in all browsers.\\n .attr('dominant-baseline', 'middle'); // vertical centering of text at y position in all browsers, except IE.\\n\\n // Regions\\n $$.initRegion();\\n\\n // Grids\\n $$.initGrid();\\n\\n // Define g for chart area\\n main\\n .append('g')\\n .attr('clip-path', $$.clipPath)\\n .attr('class', CLASS.chart);\\n\\n // Grid lines\\n if (config.grid_lines_front) {\\n $$.initGridLines();\\n }\\n\\n // Cover whole with rects for events\\n $$.initEventRect();\\n\\n // Define g for chart\\n $$.initChartElements();\\n\\n // if zoom privileged, insert rect to forefront\\n // TODO: is this needed?\\n main\\n .insert('rect', config.zoom_privileged ? null : 'g.' + CLASS.regions)\\n .attr('class', CLASS.zoomRect)\\n .attr('width', $$.width)\\n .attr('height', $$.height)\\n .style('opacity', 0)\\n .on('dblclick.zoom', null);\\n\\n // Set default extent if defined\\n if (config.axis_x_extent) {\\n $$.brush.extent($$.getDefaultExtent());\\n }\\n\\n // Add Axis\\n $$.axis.init();\\n\\n // Set targets\\n $$.updateTargets($$.data.targets);\\n\\n // Draw with targets\\n if (binding) {\\n $$.updateDimension();\\n $$.config.oninit.call($$);\\n $$.redraw({\\n withTransition: false,\\n withTransform: true,\\n withUpdateXDomain: true,\\n withUpdateOrgXDomain: true,\\n withTransitionForAxis: false\\n });\\n }\\n\\n // Bind resize event\\n $$.bindResize();\\n\\n // export element of the chart\\n $$.api.element = $$.selectChart.node();\\n };\\n\\n c3_chart_internal_fn.smoothLines = function(el, type) {\\n var $$ = this;\\n if (type === 'grid') {\\n el.each(function() {\\n var g = $$.d3.select(this),\\n x1 = g.attr('x1'),\\n x2 = g.attr('x2'),\\n y1 = g.attr('y1'),\\n y2 = g.attr('y2');\\n g.attr({\\n x1: Math.ceil(x1),\\n x2: Math.ceil(x2),\\n y1: Math.ceil(y1),\\n y2: Math.ceil(y2)\\n });\\n });\\n }\\n };\\n\\n c3_chart_internal_fn.updateSizes = function() {\\n var $$ = this,\\n config = $$.config;\\n var legendHeight = $$.legend ? $$.getLegendHeight() : 0,\\n legendWidth = $$.legend ? $$.getLegendWidth() : 0,\\n legendHeightForBottom = $$.isLegendRight || $$.isLegendInset ? 0 : legendHeight,\\n hasArc = $$.hasArcType(),\\n xAxisHeight = config.axis_rotated || hasArc ? 0 : $$.getHorizontalAxisHeight('x'),\\n subchartHeight = config.subchart_show && !hasArc ? config.subchart_size_height + xAxisHeight : 0;\\n\\n $$.currentWidth = $$.getCurrentWidth();\\n $$.currentHeight = $$.getCurrentHeight();\\n\\n // for main\\n $$.margin = config.axis_rotated\\n ? {\\n top: $$.getHorizontalAxisHeight('y2') + $$.getCurrentPaddingTop(),\\n right: hasArc ? 0 : $$.getCurrentPaddingRight(),\\n bottom: $$.getHorizontalAxisHeight('y') + legendHeightForBottom + $$.getCurrentPaddingBottom(),\\n left: subchartHeight + (hasArc ? 0 : $$.getCurrentPaddingLeft())\\n }\\n : {\\n top: 4 + $$.getCurrentPaddingTop(), // for top tick text\\n right: hasArc ? 0 : $$.getCurrentPaddingRight(),\\n bottom: xAxisHeight + subchartHeight + legendHeightForBottom + $$.getCurrentPaddingBottom(),\\n left: hasArc ? 0 : $$.getCurrentPaddingLeft()\\n };\\n\\n // for subchart\\n $$.margin2 = config.axis_rotated\\n ? {\\n top: $$.margin.top,\\n right: NaN,\\n bottom: 20 + legendHeightForBottom,\\n left: $$.rotated_padding_left\\n }\\n : {\\n top: $$.currentHeight - subchartHeight - legendHeightForBottom,\\n right: NaN,\\n bottom: xAxisHeight + legendHeightForBottom,\\n left: $$.margin.left\\n };\\n\\n // for legend\\n $$.margin3 = {\\n top: 0,\\n right: NaN,\\n bottom: 0,\\n left: 0\\n };\\n if ($$.updateSizeForLegend) {\\n $$.updateSizeForLegend(legendHeight, legendWidth);\\n }\\n\\n $$.width = $$.currentWidth - $$.margin.left - $$.margin.right;\\n $$.height = $$.currentHeight - $$.margin.top - $$.margin.bottom;\\n if ($$.width < 0) {\\n $$.width = 0;\\n }\\n if ($$.height < 0) {\\n $$.height = 0;\\n }\\n\\n $$.width2 = config.axis_rotated ? $$.margin.left - $$.rotated_padding_left - $$.rotated_padding_right : $$.width;\\n $$.height2 = config.axis_rotated ? $$.height : $$.currentHeight - $$.margin2.top - $$.margin2.bottom;\\n if ($$.width2 < 0) {\\n $$.width2 = 0;\\n }\\n if ($$.height2 < 0) {\\n $$.height2 = 0;\\n }\\n\\n // for arc\\n $$.arcWidth = $$.width - ($$.isLegendRight ? legendWidth + 10 : 0);\\n $$.arcHeight = $$.height - ($$.isLegendRight ? 0 : 10);\\n if ($$.hasType('gauge') && !config.gauge_fullCircle) {\\n $$.arcHeight += $$.height - $$.getGaugeLabelHeight();\\n }\\n if ($$.updateRadius) {\\n $$.updateRadius();\\n }\\n\\n if ($$.isLegendRight && hasArc) {\\n $$.margin3.left = $$.arcWidth / 2 + $$.radiusExpanded * 1.1;\\n }\\n };\\n\\n c3_chart_internal_fn.updateTargets = function(targets) {\\n var $$ = this;\\n\\n /*-- Main --*/\\n\\n //-- Text --//\\n $$.updateTargetsForText(targets);\\n\\n //-- Bar --//\\n $$.updateTargetsForBar(targets);\\n\\n //-- Line --//\\n $$.updateTargetsForLine(targets);\\n\\n //-- Arc --//\\n if ($$.hasArcType() && $$.updateTargetsForArc) {\\n $$.updateTargetsForArc(targets);\\n }\\n\\n /*-- Sub --*/\\n\\n if ($$.updateTargetsForSubchart) {\\n $$.updateTargetsForSubchart(targets);\\n }\\n\\n // Fade-in each chart\\n $$.showTargets();\\n };\\n c3_chart_internal_fn.showTargets = function() {\\n var $$ = this;\\n $$.svg\\n .selectAll('.' + CLASS.target)\\n .filter(function(d) {\\n return $$.isTargetToShow(d.id);\\n })\\n .transition()\\n .duration($$.config.transition_duration)\\n .style('opacity', 1);\\n };\\n\\n c3_chart_internal_fn.redraw = function(options, transitions) {\\n var $$ = this,\\n main = $$.main,\\n d3 = $$.d3,\\n config = $$.config;\\n var areaIndices = $$.getShapeIndices($$.isAreaType),\\n barIndices = $$.getShapeIndices($$.isBarType),\\n lineIndices = $$.getShapeIndices($$.isLineType);\\n var withY,\\n withSubchart,\\n withTransition,\\n withTransitionForExit,\\n withTransitionForAxis,\\n withTransform,\\n withUpdateXDomain,\\n withUpdateOrgXDomain,\\n withTrimXDomain,\\n withLegend,\\n withEventRect,\\n withDimension,\\n withUpdateXAxis;\\n var hideAxis = $$.hasArcType();\\n var drawArea, drawBar, drawLine, xForText, yForText;\\n var duration, durationForExit, durationForAxis;\\n var waitForDraw, flow;\\n var targetsToShow = $$.filterTargetsToShow($$.data.targets),\\n tickValues,\\n i,\\n intervalForCulling,\\n xDomainForZoom;\\n var xv = $$.xv.bind($$),\\n cx,\\n cy;\\n\\n options = options || {};\\n withY = getOption(options, 'withY', true);\\n withSubchart = getOption(options, 'withSubchart', true);\\n withTransition = getOption(options, 'withTransition', true);\\n withTransform = getOption(options, 'withTransform', false);\\n withUpdateXDomain = getOption(options, 'withUpdateXDomain', false);\\n withUpdateOrgXDomain = getOption(options, 'withUpdateOrgXDomain', false);\\n withTrimXDomain = getOption(options, 'withTrimXDomain', true);\\n withUpdateXAxis = getOption(options, 'withUpdateXAxis', withUpdateXDomain);\\n withLegend = getOption(options, 'withLegend', false);\\n withEventRect = getOption(options, 'withEventRect', true);\\n withDimension = getOption(options, 'withDimension', true);\\n withTransitionForExit = getOption(options, 'withTransitionForExit', withTransition);\\n withTransitionForAxis = getOption(options, 'withTransitionForAxis', withTransition);\\n\\n duration = withTransition ? config.transition_duration : 0;\\n durationForExit = withTransitionForExit ? duration : 0;\\n durationForAxis = withTransitionForAxis ? duration : 0;\\n\\n transitions = transitions || $$.axis.generateTransitions(durationForAxis);\\n\\n // update legend and transform each g\\n if (withLegend && config.legend_show) {\\n $$.updateLegend($$.mapToIds($$.data.targets), options, transitions);\\n } else if (withDimension) {\\n // need to update dimension (e.g. axis.y.tick.values) because y tick values should change\\n // no need to update axis in it because they will be updated in redraw()\\n $$.updateDimension(true);\\n }\\n\\n // MEMO: needed for grids calculation\\n if ($$.isCategorized() && targetsToShow.length === 0) {\\n $$.x.domain([0, $$.axes.x.selectAll('.tick').size()]);\\n }\\n\\n if (targetsToShow.length) {\\n $$.updateXDomain(targetsToShow, withUpdateXDomain, withUpdateOrgXDomain, withTrimXDomain);\\n if (!config.axis_x_tick_values) {\\n tickValues = $$.axis.updateXAxisTickValues(targetsToShow);\\n }\\n } else {\\n $$.xAxis.tickValues([]);\\n $$.subXAxis.tickValues([]);\\n }\\n\\n if (config.zoom_rescale && !options.flow) {\\n xDomainForZoom = $$.x.orgDomain();\\n }\\n\\n $$.y.domain($$.getYDomain(targetsToShow, 'y', xDomainForZoom));\\n $$.y2.domain($$.getYDomain(targetsToShow, 'y2', xDomainForZoom));\\n\\n if (!config.axis_y_tick_values && config.axis_y_tick_count) {\\n $$.yAxis.tickValues($$.axis.generateTickValues($$.y.domain(), config.axis_y_tick_count));\\n }\\n if (!config.axis_y2_tick_values && config.axis_y2_tick_count) {\\n $$.y2Axis.tickValues($$.axis.generateTickValues($$.y2.domain(), config.axis_y2_tick_count));\\n }\\n\\n // axes\\n $$.axis.redraw(transitions, hideAxis);\\n\\n // Update axis label\\n $$.axis.updateLabels(withTransition);\\n\\n // show/hide if manual culling needed\\n if ((withUpdateXDomain || withUpdateXAxis) && targetsToShow.length) {\\n if (config.axis_x_tick_culling && tickValues) {\\n for (i = 1; i < tickValues.length; i++) {\\n if (tickValues.length / i < config.axis_x_tick_culling_max) {\\n intervalForCulling = i;\\n break;\\n }\\n }\\n $$.svg.selectAll('.' + CLASS.axisX + ' .tick text').each(function(e) {\\n var index = tickValues.indexOf(e);\\n if (index >= 0) {\\n d3.select(this).style('display', index % intervalForCulling ? 'none' : 'block');\\n }\\n });\\n } else {\\n $$.svg.selectAll('.' + CLASS.axisX + ' .tick text').style('display', 'block');\\n }\\n }\\n\\n // setup drawer - MEMO: these must be called after axis updated\\n drawArea = $$.generateDrawArea ? $$.generateDrawArea(areaIndices, false) : undefined;\\n drawBar = $$.generateDrawBar ? $$.generateDrawBar(barIndices) : undefined;\\n drawLine = $$.generateDrawLine ? $$.generateDrawLine(lineIndices, false) : undefined;\\n xForText = $$.generateXYForText(areaIndices, barIndices, lineIndices, true);\\n yForText = $$.generateXYForText(areaIndices, barIndices, lineIndices, false);\\n\\n // Update sub domain\\n if (withY) {\\n $$.subY.domain($$.getYDomain(targetsToShow, 'y'));\\n $$.subY2.domain($$.getYDomain(targetsToShow, 'y2'));\\n }\\n\\n // xgrid focus\\n $$.updateXgridFocus();\\n\\n // Data empty label positioning and text.\\n main\\n .select('text.' + CLASS.text + '.' + CLASS.empty)\\n .attr('x', $$.width / 2)\\n .attr('y', $$.height / 2)\\n .text(config.data_empty_label_text)\\n .transition()\\n .style('opacity', targetsToShow.length ? 0 : 1);\\n\\n // grid\\n $$.updateGrid(duration);\\n\\n // rect for regions\\n $$.updateRegion(duration);\\n\\n // bars\\n $$.updateBar(durationForExit);\\n\\n // lines, areas and cricles\\n $$.updateLine(durationForExit);\\n $$.updateArea(durationForExit);\\n $$.updateCircle();\\n\\n // text\\n if ($$.hasDataLabel()) {\\n $$.updateText(durationForExit);\\n }\\n\\n // title\\n if ($$.redrawTitle) {\\n $$.redrawTitle();\\n }\\n\\n // arc\\n if ($$.redrawArc) {\\n $$.redrawArc(duration, durationForExit, withTransform);\\n }\\n\\n // subchart\\n if ($$.redrawSubchart) {\\n $$.redrawSubchart(withSubchart, transitions, duration, durationForExit, areaIndices, barIndices, lineIndices);\\n }\\n\\n // circles for select\\n main\\n .selectAll('.' + CLASS.selectedCircles)\\n .filter($$.isBarType.bind($$))\\n .selectAll('circle')\\n .remove();\\n\\n // event rects will redrawn when flow called\\n if (config.interaction_enabled && !options.flow && withEventRect) {\\n $$.redrawEventRect();\\n if ($$.updateZoom) {\\n $$.updateZoom();\\n }\\n }\\n\\n // update circleY based on updated parameters\\n $$.updateCircleY();\\n\\n // generate circle x/y functions depending on updated params\\n cx = ($$.config.axis_rotated ? $$.circleY : $$.circleX).bind($$);\\n cy = ($$.config.axis_rotated ? $$.circleX : $$.circleY).bind($$);\\n\\n if (options.flow) {\\n flow = $$.generateFlow({\\n targets: targetsToShow,\\n flow: options.flow,\\n duration: options.flow.duration,\\n drawBar: drawBar,\\n drawLine: drawLine,\\n drawArea: drawArea,\\n cx: cx,\\n cy: cy,\\n xv: xv,\\n xForText: xForText,\\n yForText: yForText\\n });\\n }\\n\\n if ((duration || flow) && $$.isTabVisible()) {\\n // Only use transition if tab visible. See #938.\\n // transition should be derived from one transition\\n d3.transition()\\n .duration(duration)\\n .each(function() {\\n var transitionsToWait = [];\\n\\n // redraw and gather transitions\\n [\\n $$.redrawBar(drawBar, true),\\n $$.redrawLine(drawLine, true),\\n $$.redrawArea(drawArea, true),\\n $$.redrawCircle(cx, cy, true),\\n $$.redrawText(xForText, yForText, options.flow, true),\\n $$.redrawRegion(true),\\n $$.redrawGrid(true)\\n ].forEach(function(transitions) {\\n transitions.forEach(function(transition) {\\n transitionsToWait.push(transition);\\n });\\n });\\n\\n // Wait for end of transitions to call flow and onrendered callback\\n waitForDraw = $$.generateWait();\\n transitionsToWait.forEach(function(t) {\\n waitForDraw.add(t);\\n });\\n })\\n .call(waitForDraw, function() {\\n if (flow) {\\n flow();\\n }\\n if (config.onrendered) {\\n config.onrendered.call($$);\\n }\\n });\\n } else {\\n $$.redrawBar(drawBar);\\n $$.redrawLine(drawLine);\\n $$.redrawArea(drawArea);\\n $$.redrawCircle(cx, cy);\\n $$.redrawText(xForText, yForText, options.flow);\\n $$.redrawRegion();\\n $$.redrawGrid();\\n if (config.onrendered) {\\n config.onrendered.call($$);\\n }\\n }\\n\\n // update fadein condition\\n $$.mapToIds($$.data.targets).forEach(function(id) {\\n $$.withoutFadeIn[id] = true;\\n });\\n };\\n\\n c3_chart_internal_fn.updateAndRedraw = function(options) {\\n var $$ = this,\\n config = $$.config,\\n transitions;\\n options = options || {};\\n // same with redraw\\n options.withTransition = getOption(options, 'withTransition', true);\\n options.withTransform = getOption(options, 'withTransform', false);\\n options.withLegend = getOption(options, 'withLegend', false);\\n // NOT same with redraw\\n options.withUpdateXDomain = true;\\n options.withUpdateOrgXDomain = true;\\n options.withTransitionForExit = false;\\n options.withTransitionForTransform = getOption(options, 'withTransitionForTransform', options.withTransition);\\n // MEMO: this needs to be called before updateLegend and it means this ALWAYS needs to be called)\\n $$.updateSizes();\\n // MEMO: called in updateLegend in redraw if withLegend\\n if (!(options.withLegend && config.legend_show)) {\\n transitions = $$.axis.generateTransitions(options.withTransitionForAxis ? config.transition_duration : 0);\\n // Update scales\\n $$.updateScales();\\n $$.updateSvgSize();\\n // Update g positions\\n $$.transformAll(options.withTransitionForTransform, transitions);\\n }\\n // Draw with new sizes & scales\\n $$.redraw(options, transitions);\\n };\\n c3_chart_internal_fn.redrawWithoutRescale = function() {\\n this.redraw({\\n withY: false,\\n withSubchart: false,\\n withEventRect: false,\\n withTransitionForAxis: false\\n });\\n };\\n\\n c3_chart_internal_fn.isTimeSeries = function() {\\n return this.config.axis_x_type === 'timeseries';\\n };\\n c3_chart_internal_fn.isCategorized = function() {\\n return this.config.axis_x_type.indexOf('categor') >= 0;\\n };\\n c3_chart_internal_fn.isCustomX = function() {\\n var $$ = this,\\n config = $$.config;\\n return !$$.isTimeSeries() && (config.data_x || notEmpty(config.data_xs));\\n };\\n\\n c3_chart_internal_fn.isTimeSeriesY = function() {\\n return this.config.axis_y_type === 'timeseries';\\n };\\n\\n c3_chart_internal_fn.getTranslate = function(target) {\\n var $$ = this,\\n config = $$.config,\\n x,\\n y;\\n if (target === 'main') {\\n x = asHalfPixel($$.margin.left);\\n y = asHalfPixel($$.margin.top);\\n } else if (target === 'context') {\\n x = asHalfPixel($$.margin2.left);\\n y = asHalfPixel($$.margin2.top);\\n } else if (target === 'legend') {\\n x = $$.margin3.left;\\n y = $$.margin3.top;\\n } else if (target === 'x') {\\n x = 0;\\n y = config.axis_rotated ? 0 : $$.height;\\n } else if (target === 'y') {\\n x = 0;\\n y = config.axis_rotated ? $$.height : 0;\\n } else if (target === 'y2') {\\n x = config.axis_rotated ? 0 : $$.width;\\n y = config.axis_rotated ? 1 : 0;\\n } else if (target === 'subx') {\\n x = 0;\\n y = config.axis_rotated ? 0 : $$.height2;\\n } else if (target === 'arc') {\\n x = $$.arcWidth / 2;\\n y = $$.arcHeight / 2;\\n }\\n return 'translate(' + x + ',' + y + ')';\\n };\\n c3_chart_internal_fn.initialOpacity = function(d) {\\n return d.value !== null && this.withoutFadeIn[d.id] ? 1 : 0;\\n };\\n c3_chart_internal_fn.initialOpacityForCircle = function(d) {\\n return d.value !== null && this.withoutFadeIn[d.id] ? this.opacityForCircle(d) : 0;\\n };\\n c3_chart_internal_fn.opacityForCircle = function(d) {\\n var opacity = this.config.point_show ? 1 : 0;\\n return isValue(d.value) ? (this.isScatterType(d) ? 0.5 : opacity) : 0;\\n };\\n c3_chart_internal_fn.opacityForText = function() {\\n return this.hasDataLabel() ? 1 : 0;\\n };\\n c3_chart_internal_fn.xx = function(d) {\\n return d ? this.x(d.x) : null;\\n };\\n c3_chart_internal_fn.xv = function(d) {\\n var $$ = this,\\n value = d.value;\\n if ($$.isTimeSeries()) {\\n value = $$.parseDate(d.value);\\n } else if ($$.isCategorized() && typeof d.value === 'string') {\\n value = $$.config.axis_x_categories.indexOf(d.value);\\n }\\n return Math.ceil($$.x(value));\\n };\\n c3_chart_internal_fn.yv = function(d) {\\n var $$ = this,\\n yScale = d.axis && d.axis === 'y2' ? $$.y2 : $$.y;\\n return Math.ceil(yScale(d.value));\\n };\\n c3_chart_internal_fn.subxx = function(d) {\\n return d ? this.subX(d.x) : null;\\n };\\n\\n c3_chart_internal_fn.transformMain = function(withTransition, transitions) {\\n var $$ = this,\\n xAxis,\\n yAxis,\\n y2Axis;\\n if (transitions && transitions.axisX) {\\n xAxis = transitions.axisX;\\n } else {\\n xAxis = $$.main.select('.' + CLASS.axisX);\\n if (withTransition) {\\n xAxis = xAxis.transition();\\n }\\n }\\n if (transitions && transitions.axisY) {\\n yAxis = transitions.axisY;\\n } else {\\n yAxis = $$.main.select('.' + CLASS.axisY);\\n if (withTransition) {\\n yAxis = yAxis.transition();\\n }\\n }\\n if (transitions && transitions.axisY2) {\\n y2Axis = transitions.axisY2;\\n } else {\\n y2Axis = $$.main.select('.' + CLASS.axisY2);\\n if (withTransition) {\\n y2Axis = y2Axis.transition();\\n }\\n }\\n (withTransition ? $$.main.transition() : $$.main).attr('transform', $$.getTranslate('main'));\\n xAxis.attr('transform', $$.getTranslate('x'));\\n yAxis.attr('transform', $$.getTranslate('y'));\\n y2Axis.attr('transform', $$.getTranslate('y2'));\\n $$.main.select('.' + CLASS.chartArcs).attr('transform', $$.getTranslate('arc'));\\n };\\n c3_chart_internal_fn.transformAll = function(withTransition, transitions) {\\n var $$ = this;\\n $$.transformMain(withTransition, transitions);\\n if ($$.config.subchart_show) {\\n $$.transformContext(withTransition, transitions);\\n }\\n if ($$.legend) {\\n $$.transformLegend(withTransition);\\n }\\n };\\n\\n c3_chart_internal_fn.updateSvgSize = function() {\\n var $$ = this,\\n brush = $$.svg.select('.c3-brush .background');\\n $$.svg.attr('width', $$.currentWidth).attr('height', $$.currentHeight);\\n $$.svg\\n .selectAll(['#' + $$.clipId, '#' + $$.clipIdForGrid])\\n .select('rect')\\n .attr('width', $$.width)\\n .attr('height', $$.height);\\n $$.svg\\n .select('#' + $$.clipIdForXAxis)\\n .select('rect')\\n .attr('x', $$.getXAxisClipX.bind($$))\\n .attr('y', $$.getXAxisClipY.bind($$))\\n .attr('width', $$.getXAxisClipWidth.bind($$))\\n .attr('height', $$.getXAxisClipHeight.bind($$));\\n $$.svg\\n .select('#' + $$.clipIdForYAxis)\\n .select('rect')\\n .attr('x', $$.getYAxisClipX.bind($$))\\n .attr('y', $$.getYAxisClipY.bind($$))\\n .attr('width', $$.getYAxisClipWidth.bind($$))\\n .attr('height', $$.getYAxisClipHeight.bind($$));\\n $$.svg\\n .select('#' + $$.clipIdForSubchart)\\n .select('rect')\\n .attr('width', $$.width)\\n .attr('height', brush.size() ? brush.attr('height') : 0);\\n $$.svg\\n .select('.' + CLASS.zoomRect)\\n .attr('width', $$.width)\\n .attr('height', $$.height);\\n // MEMO: parent div's height will be bigger than svg when <!DOCTYPE html>\\n $$.selectChart.style('max-height', $$.currentHeight + 'px');\\n };\\n\\n c3_chart_internal_fn.updateDimension = function(withoutAxis) {\\n var $$ = this;\\n if (!withoutAxis) {\\n if ($$.config.axis_rotated) {\\n $$.axes.x.call($$.xAxis);\\n $$.axes.subx.call($$.subXAxis);\\n } else {\\n $$.axes.y.call($$.yAxis);\\n $$.axes.y2.call($$.y2Axis);\\n }\\n }\\n $$.updateSizes();\\n $$.updateScales();\\n $$.updateSvgSize();\\n $$.transformAll(false);\\n };\\n\\n c3_chart_internal_fn.observeInserted = function(selection) {\\n var $$ = this,\\n observer;\\n if (typeof MutationObserver === 'undefined') {\\n window.console.error('MutationObserver not defined.');\\n return;\\n }\\n observer = new MutationObserver(function(mutations) {\\n mutations.forEach(function(mutation) {\\n if (mutation.type === 'childList' && mutation.previousSibling) {\\n observer.disconnect();\\n // need to wait for completion of load because size calculation requires the actual sizes determined after that completion\\n $$.intervalForObserveInserted = window.setInterval(function() {\\n // parentNode will NOT be null when completed\\n if (selection.node().parentNode) {\\n window.clearInterval($$.intervalForObserveInserted);\\n $$.updateDimension();\\n if ($$.brush) {\\n $$.brush.update();\\n }\\n $$.config.oninit.call($$);\\n $$.redraw({\\n withTransform: true,\\n withUpdateXDomain: true,\\n withUpdateOrgXDomain: true,\\n withTransition: false,\\n withTransitionForTransform: false,\\n withLegend: true\\n });\\n selection.transition().style('opacity', 1);\\n }\\n }, 10);\\n }\\n });\\n });\\n observer.observe(selection.node(), { attributes: true, childList: true, characterData: true });\\n };\\n\\n c3_chart_internal_fn.bindResize = function() {\\n var $$ = this,\\n config = $$.config;\\n\\n $$.resizeFunction = $$.generateResize();\\n\\n $$.resizeFunction.add(function() {\\n config.onresize.call($$);\\n });\\n if (config.resize_auto) {\\n $$.resizeFunction.add(function() {\\n if ($$.resizeTimeout !== undefined) {\\n window.clearTimeout($$.resizeTimeout);\\n }\\n $$.resizeTimeout = window.setTimeout(function() {\\n delete $$.resizeTimeout;\\n $$.api.flush();\\n }, 100);\\n });\\n }\\n $$.resizeFunction.add(function() {\\n config.onresized.call($$);\\n });\\n\\n if (window.attachEvent) {\\n window.attachEvent('onresize', $$.resizeFunction);\\n } else if (window.addEventListener) {\\n window.addEventListener('resize', $$.resizeFunction, false);\\n } else {\\n // fallback to this, if this is a very old browser\\n var wrapper = window.onresize;\\n if (!wrapper) {\\n // create a wrapper that will call all charts\\n wrapper = $$.generateResize();\\n } else if (!wrapper.add || !wrapper.remove) {\\n // there is already a handler registered, make sure we call it too\\n wrapper = $$.generateResize();\\n wrapper.add(window.onresize);\\n }\\n // add this graph to the wrapper, we will be removed if the user calls destroy\\n wrapper.add($$.resizeFunction);\\n window.onresize = wrapper;\\n }\\n };\\n\\n c3_chart_internal_fn.generateResize = function() {\\n var resizeFunctions = [];\\n\\n function callResizeFunctions() {\\n resizeFunctions.forEach(function(f) {\\n f();\\n });\\n }\\n\\n callResizeFunctions.add = function(f) {\\n resizeFunctions.push(f);\\n };\\n callResizeFunctions.remove = function(f) {\\n for (var i = 0; i < resizeFunctions.length; i++) {\\n if (resizeFunctions[i] === f) {\\n resizeFunctions.splice(i, 1);\\n break;\\n }\\n }\\n };\\n return callResizeFunctions;\\n };\\n\\n c3_chart_internal_fn.endall = function(transition, callback) {\\n var n = 0;\\n transition\\n .each(function() {\\n ++n;\\n })\\n .each('end', function() {\\n if (!--n) {\\n callback.apply(this, arguments);\\n }\\n });\\n };\\n c3_chart_internal_fn.generateWait = function() {\\n var transitionsToWait = [],\\n f = function(transition, callback) {\\n var timer = setInterval(function() {\\n var done = 0;\\n transitionsToWait.forEach(function(t) {\\n if (t.empty()) {\\n done += 1;\\n return;\\n }\\n try {\\n t.transition();\\n } catch (e) {\\n done += 1;\\n }\\n });\\n if (done === transitionsToWait.length) {\\n clearInterval(timer);\\n if (callback) {\\n callback();\\n }\\n }\\n }, 10);\\n };\\n f.add = function(transition) {\\n transitionsToWait.push(transition);\\n };\\n return f;\\n };\\n\\n c3_chart_internal_fn.parseDate = function(date) {\\n var $$ = this,\\n parsedDate;\\n if (date instanceof Date) {\\n parsedDate = date;\\n } else if (typeof date === 'string') {\\n parsedDate = $$.dataTimeFormat($$.config.data_xFormat).parse(date);\\n } else if (typeof date === 'number' && !isNaN(date)) {\\n parsedDate = new Date(+date);\\n }\\n if (!parsedDate || isNaN(+parsedDate)) {\\n window.console.error(\\\"Failed to parse x '\\\" + date + \\\"' to Date object\\\");\\n }\\n return parsedDate;\\n };\\n\\n c3_chart_internal_fn.isTabVisible = function() {\\n var hidden;\\n if (typeof document.hidden !== 'undefined') {\\n // Opera 12.10 and Firefox 18 and later support\\n hidden = 'hidden';\\n } else if (typeof document.mozHidden !== 'undefined') {\\n hidden = 'mozHidden';\\n } else if (typeof document.msHidden !== 'undefined') {\\n hidden = 'msHidden';\\n } else if (typeof document.webkitHidden !== 'undefined') {\\n hidden = 'webkitHidden';\\n }\\n\\n return document[hidden] ? false : true;\\n };\\n\\n c3_chart_internal_fn.getDefaultConfig = function() {\\n var config = {\\n bindto: '#chart',\\n svg_classname: undefined,\\n size_width: undefined,\\n size_height: undefined,\\n padding_left: undefined,\\n padding_right: undefined,\\n padding_top: undefined,\\n padding_bottom: undefined,\\n resize_auto: true,\\n zoom_enabled: false,\\n zoom_extent: undefined,\\n zoom_privileged: false,\\n zoom_rescale: false,\\n zoom_onzoom: function() {},\\n zoom_onzoomstart: function() {},\\n zoom_onzoomend: function() {},\\n zoom_x_min: undefined,\\n zoom_x_max: undefined,\\n interaction_brighten: true,\\n interaction_enabled: true,\\n onmouseover: function() {},\\n onmouseout: function() {},\\n onresize: function() {},\\n onresized: function() {},\\n oninit: function() {},\\n onrendered: function() {},\\n transition_duration: 350,\\n data_x: undefined,\\n data_xs: {},\\n data_xFormat: '%Y-%m-%d',\\n data_xLocaltime: true,\\n data_xSort: true,\\n data_idConverter: function(id) {\\n return id;\\n },\\n data_names: {},\\n data_classes: {},\\n data_groups: [],\\n data_axes: {},\\n data_type: undefined,\\n data_types: {},\\n data_labels: {},\\n data_order: 'desc',\\n data_regions: {},\\n data_color: undefined,\\n data_colors: {},\\n data_hide: false,\\n data_filter: undefined,\\n data_selection_enabled: false,\\n data_selection_grouped: false,\\n data_selection_isselectable: function() {\\n return true;\\n },\\n data_selection_multiple: true,\\n data_selection_draggable: false,\\n data_onclick: function() {},\\n data_onmouseover: function() {},\\n data_onmouseout: function() {},\\n data_onselected: function() {},\\n data_onunselected: function() {},\\n data_url: undefined,\\n data_headers: undefined,\\n data_json: undefined,\\n data_rows: undefined,\\n data_columns: undefined,\\n data_mimeType: undefined,\\n data_keys: undefined,\\n // configuration for no plot-able data supplied.\\n data_empty_label_text: '',\\n // subchart\\n subchart_show: false,\\n subchart_size_height: 60,\\n subchart_axis_x_show: true,\\n subchart_onbrush: function() {},\\n // color\\n color_pattern: [],\\n color_threshold: {},\\n // legend\\n legend_show: true,\\n legend_hide: false,\\n legend_position: 'bottom',\\n legend_inset_anchor: 'top-left',\\n legend_inset_x: 10,\\n legend_inset_y: 0,\\n legend_inset_step: undefined,\\n legend_item_onclick: undefined,\\n legend_item_onmouseover: undefined,\\n legend_item_onmouseout: undefined,\\n legend_equally: false,\\n legend_padding: 0,\\n legend_item_tile_width: 10,\\n legend_item_tile_height: 10,\\n // axis\\n axis_rotated: false,\\n axis_x_show: true,\\n axis_x_type: 'indexed',\\n axis_x_localtime: true,\\n axis_x_categories: [],\\n axis_x_tick_centered: false,\\n axis_x_tick_format: undefined,\\n axis_x_tick_culling: {},\\n axis_x_tick_culling_max: 10,\\n axis_x_tick_count: undefined,\\n axis_x_tick_fit: true,\\n axis_x_tick_values: null,\\n axis_x_tick_rotate: 0,\\n axis_x_tick_outer: true,\\n axis_x_tick_multiline: true,\\n axis_x_tick_width: null,\\n axis_x_max: undefined,\\n axis_x_min: undefined,\\n axis_x_padding: {},\\n axis_x_height: undefined,\\n axis_x_extent: undefined,\\n axis_x_label: {},\\n axis_y_show: true,\\n axis_y_type: undefined,\\n axis_y_max: undefined,\\n axis_y_min: undefined,\\n axis_y_inverted: false,\\n axis_y_center: undefined,\\n axis_y_inner: undefined,\\n axis_y_label: {},\\n axis_y_tick_format: undefined,\\n axis_y_tick_outer: true,\\n axis_y_tick_values: null,\\n axis_y_tick_rotate: 0,\\n axis_y_tick_count: undefined,\\n axis_y_tick_time_value: undefined,\\n axis_y_tick_time_interval: undefined,\\n axis_y_padding: {},\\n axis_y_default: undefined,\\n axis_y2_show: false,\\n axis_y2_max: undefined,\\n axis_y2_min: undefined,\\n axis_y2_inverted: false,\\n axis_y2_center: undefined,\\n axis_y2_inner: undefined,\\n axis_y2_label: {},\\n axis_y2_tick_format: undefined,\\n axis_y2_tick_outer: true,\\n axis_y2_tick_values: null,\\n axis_y2_tick_count: undefined,\\n axis_y2_padding: {},\\n axis_y2_default: undefined,\\n // grid\\n grid_x_show: false,\\n grid_x_type: 'tick',\\n grid_x_lines: [],\\n grid_y_show: false,\\n // not used\\n // grid_y_type: 'tick',\\n grid_y_lines: [],\\n grid_y_ticks: 10,\\n grid_focus_show: true,\\n grid_lines_front: true,\\n // point - point of each data\\n point_show: true,\\n point_r: 2.5,\\n point_sensitivity: 10,\\n point_focus_expand_enabled: true,\\n point_focus_expand_r: undefined,\\n point_select_r: undefined,\\n // line\\n line_connectNull: false,\\n line_step_type: 'step',\\n // bar\\n bar_width: undefined,\\n bar_width_ratio: 0.6,\\n bar_width_max: undefined,\\n bar_zerobased: true,\\n // area\\n area_zerobased: true,\\n area_above: false,\\n // pie\\n pie_label_show: true,\\n pie_label_format: undefined,\\n pie_label_threshold: 0.05,\\n pie_label_ratio: undefined,\\n pie_expand: {},\\n pie_expand_duration: 50,\\n // gauge\\n gauge_fullCircle: false,\\n gauge_label_show: true,\\n gauge_label_format: undefined,\\n gauge_min: 0,\\n gauge_max: 100,\\n gauge_startingAngle: (-1 * Math.PI) / 2,\\n gauge_units: undefined,\\n gauge_width: undefined,\\n gauge_expand: {},\\n gauge_expand_duration: 50,\\n // donut\\n donut_label_show: true,\\n donut_label_format: undefined,\\n donut_label_threshold: 0.05,\\n donut_label_ratio: undefined,\\n donut_width: undefined,\\n donut_title: '',\\n donut_expand: {},\\n donut_expand_duration: 50,\\n // spline\\n spline_interpolation_type: 'cardinal',\\n // region - region to change style\\n regions: [],\\n // tooltip - show when mouseover on each data\\n tooltip_show: true,\\n tooltip_grouped: true,\\n tooltip_format_title: undefined,\\n tooltip_format_name: undefined,\\n tooltip_format_value: undefined,\\n tooltip_position: undefined,\\n tooltip_contents: function(d, defaultTitleFormat, defaultValueFormat, color) {\\n return this.getTooltipContent ? this.getTooltipContent(d, defaultTitleFormat, defaultValueFormat, color) : '';\\n },\\n tooltip_init_show: false,\\n tooltip_init_x: 0,\\n tooltip_init_position: { top: '0px', left: '50px' },\\n tooltip_onshow: function() {},\\n tooltip_onhide: function() {},\\n // title\\n title_text: undefined,\\n title_padding: {\\n top: 0,\\n right: 0,\\n bottom: 0,\\n left: 0\\n },\\n title_position: 'top-center'\\n };\\n\\n Object.keys(this.additionalConfig).forEach(function(key) {\\n config[key] = this.additionalConfig[key];\\n }, this);\\n\\n return config;\\n };\\n c3_chart_internal_fn.additionalConfig = {};\\n\\n c3_chart_internal_fn.loadConfig = function(config) {\\n var this_config = this.config,\\n target,\\n keys,\\n read;\\n\\n function find() {\\n var key = keys.shift();\\n // console.log(\\\"key =>\\\", key, \\\", target =>\\\", target);\\n if (key && target && typeof target === 'object' && key in target) {\\n target = target[key];\\n return find();\\n } else if (!key) {\\n return target;\\n } else {\\n return undefined;\\n }\\n }\\n\\n Object.keys(this_config).forEach(function(key) {\\n target = config;\\n keys = key.split('_');\\n read = find();\\n // console.log(\\\"CONFIG : \\\", key, read);\\n if (isDefined(read)) {\\n this_config[key] = read;\\n }\\n });\\n };\\n\\n c3_chart_internal_fn.getScale = function(min, max, forTimeseries) {\\n return (forTimeseries ? this.d3.time.scale() : this.d3.scale.linear()).range([min, max]);\\n };\\n c3_chart_internal_fn.getX = function(min, max, domain, offset) {\\n var $$ = this,\\n scale = $$.getScale(min, max, $$.isTimeSeries()),\\n _scale = domain ? scale.domain(domain) : scale,\\n key;\\n // Define customized scale if categorized axis\\n if ($$.isCategorized()) {\\n offset =\\n offset ||\\n function() {\\n return 0;\\n };\\n scale = function(d, raw) {\\n var v = _scale(d) + offset(d);\\n return raw ? v : Math.ceil(v);\\n };\\n } else {\\n scale = function(d, raw) {\\n var v = _scale(d);\\n return raw ? v : Math.ceil(v);\\n };\\n }\\n // define functions\\n for (key in _scale) {\\n scale[key] = _scale[key];\\n }\\n scale.orgDomain = function() {\\n return _scale.domain();\\n };\\n // define custom domain() for categorized axis\\n if ($$.isCategorized()) {\\n scale.domain = function(domain) {\\n if (!arguments.length) {\\n domain = this.orgDomain();\\n return [domain[0], domain[1] + 1];\\n }\\n _scale.domain(domain);\\n return scale;\\n };\\n }\\n return scale;\\n };\\n c3_chart_internal_fn.getY = function(min, max, domain) {\\n var scale = this.getScale(min, max, this.isTimeSeriesY());\\n if (domain) {\\n scale.domain(domain);\\n }\\n return scale;\\n };\\n c3_chart_internal_fn.getYScale = function(id) {\\n return this.axis.getId(id) === 'y2' ? this.y2 : this.y;\\n };\\n c3_chart_internal_fn.getSubYScale = function(id) {\\n return this.axis.getId(id) === 'y2' ? this.subY2 : this.subY;\\n };\\n c3_chart_internal_fn.updateScales = function() {\\n var $$ = this,\\n config = $$.config,\\n forInit = !$$.x;\\n // update edges\\n $$.xMin = config.axis_rotated ? 1 : 0;\\n $$.xMax = config.axis_rotated ? $$.height : $$.width;\\n $$.yMin = config.axis_rotated ? 0 : $$.height;\\n $$.yMax = config.axis_rotated ? $$.width : 1;\\n $$.subXMin = $$.xMin;\\n $$.subXMax = $$.xMax;\\n $$.subYMin = config.axis_rotated ? 0 : $$.height2;\\n $$.subYMax = config.axis_rotated ? $$.width2 : 1;\\n // update scales\\n $$.x = $$.getX($$.xMin, $$.xMax, forInit ? undefined : $$.x.orgDomain(), function() {\\n return $$.xAxis.tickOffset();\\n });\\n $$.y = $$.getY($$.yMin, $$.yMax, forInit ? config.axis_y_default : $$.y.domain());\\n $$.y2 = $$.getY($$.yMin, $$.yMax, forInit ? config.axis_y2_default : $$.y2.domain());\\n $$.subX = $$.getX($$.xMin, $$.xMax, $$.orgXDomain, function(d) {\\n return d % 1 ? 0 : $$.subXAxis.tickOffset();\\n });\\n $$.subY = $$.getY($$.subYMin, $$.subYMax, forInit ? config.axis_y_default : $$.subY.domain());\\n $$.subY2 = $$.getY($$.subYMin, $$.subYMax, forInit ? config.axis_y2_default : $$.subY2.domain());\\n // update axes\\n $$.xAxisTickFormat = $$.axis.getXAxisTickFormat();\\n $$.xAxisTickValues = $$.axis.getXAxisTickValues();\\n $$.yAxisTickValues = $$.axis.getYAxisTickValues();\\n $$.y2AxisTickValues = $$.axis.getY2AxisTickValues();\\n\\n $$.xAxis = $$.axis.getXAxis($$.x, $$.xOrient, $$.xAxisTickFormat, $$.xAxisTickValues, config.axis_x_tick_outer);\\n $$.subXAxis = $$.axis.getXAxis(\\n $$.subX,\\n $$.subXOrient,\\n $$.xAxisTickFormat,\\n $$.xAxisTickValues,\\n config.axis_x_tick_outer\\n );\\n $$.yAxis = $$.axis.getYAxis(\\n $$.y,\\n $$.yOrient,\\n config.axis_y_tick_format,\\n $$.yAxisTickValues,\\n config.axis_y_tick_outer\\n );\\n $$.y2Axis = $$.axis.getYAxis(\\n $$.y2,\\n $$.y2Orient,\\n config.axis_y2_tick_format,\\n $$.y2AxisTickValues,\\n config.axis_y2_tick_outer\\n );\\n\\n // Set initialized scales to brush and zoom\\n if (!forInit) {\\n if ($$.brush) {\\n $$.brush.scale($$.subX);\\n }\\n if (config.zoom_enabled) {\\n $$.zoom.scale($$.x);\\n }\\n }\\n // update for arc\\n if ($$.updateArc) {\\n $$.updateArc();\\n }\\n };\\n\\n c3_chart_internal_fn.getYDomainMin = function(targets) {\\n var $$ = this,\\n config = $$.config,\\n ids = $$.mapToIds(targets),\\n ys = $$.getValuesAsIdKeyed(targets),\\n j,\\n k,\\n baseId,\\n idsInGroup,\\n id,\\n hasNegativeValue;\\n if (config.data_groups.length > 0) {\\n hasNegativeValue = $$.hasNegativeValueInTargets(targets);\\n for (j = 0; j < config.data_groups.length; j++) {\\n // Determine baseId\\n idsInGroup = config.data_groups[j].filter(function(id) {\\n return ids.indexOf(id) >= 0;\\n });\\n if (idsInGroup.length === 0) {\\n continue;\\n }\\n baseId = idsInGroup[0];\\n // Consider negative values\\n if (hasNegativeValue && ys[baseId]) {\\n ys[baseId].forEach(function(v, i) {\\n ys[baseId][i] = v < 0 ? v : 0;\\n });\\n }\\n // Compute min\\n for (k = 1; k < idsInGroup.length; k++) {\\n id = idsInGroup[k];\\n if (!ys[id]) {\\n continue;\\n }\\n ys[id].forEach(function(v, i) {\\n if ($$.axis.getId(id) === $$.axis.getId(baseId) && ys[baseId] && !(hasNegativeValue && +v > 0)) {\\n ys[baseId][i] += +v;\\n }\\n });\\n }\\n }\\n }\\n return $$.d3.min(\\n Object.keys(ys).map(function(key) {\\n return $$.d3.min(ys[key]);\\n })\\n );\\n };\\n c3_chart_internal_fn.getYDomainMax = function(targets) {\\n var $$ = this,\\n config = $$.config,\\n ids = $$.mapToIds(targets),\\n ys = $$.getValuesAsIdKeyed(targets),\\n j,\\n k,\\n baseId,\\n idsInGroup,\\n id,\\n hasPositiveValue;\\n if (config.data_groups.length > 0) {\\n hasPositiveValue = $$.hasPositiveValueInTargets(targets);\\n for (j = 0; j < config.data_groups.length; j++) {\\n // Determine baseId\\n idsInGroup = config.data_groups[j].filter(function(id) {\\n return ids.indexOf(id) >= 0;\\n });\\n if (idsInGroup.length === 0) {\\n continue;\\n }\\n baseId = idsInGroup[0];\\n // Consider positive values\\n if (hasPositiveValue && ys[baseId]) {\\n ys[baseId].forEach(function(v, i) {\\n ys[baseId][i] = v > 0 ? v : 0;\\n });\\n }\\n // Compute max\\n for (k = 1; k < idsInGroup.length; k++) {\\n id = idsInGroup[k];\\n if (!ys[id]) {\\n continue;\\n }\\n ys[id].forEach(function(v, i) {\\n if ($$.axis.getId(id) === $$.axis.getId(baseId) && ys[baseId] && !(hasPositiveValue && +v < 0)) {\\n ys[baseId][i] += +v;\\n }\\n });\\n }\\n }\\n }\\n return $$.d3.max(\\n Object.keys(ys).map(function(key) {\\n return $$.d3.max(ys[key]);\\n })\\n );\\n };\\n c3_chart_internal_fn.getYDomain = function(targets, axisId, xDomain) {\\n var $$ = this,\\n config = $$.config,\\n targetsByAxisId = targets.filter(function(t) {\\n return $$.axis.getId(t.id) === axisId;\\n }),\\n yTargets = xDomain ? $$.filterByXDomain(targetsByAxisId, xDomain) : targetsByAxisId,\\n yMin = axisId === 'y2' ? config.axis_y2_min : config.axis_y_min,\\n yMax = axisId === 'y2' ? config.axis_y2_max : config.axis_y_max,\\n yDomainMin = $$.getYDomainMin(yTargets),\\n yDomainMax = $$.getYDomainMax(yTargets),\\n domain,\\n domainLength,\\n padding,\\n padding_top,\\n padding_bottom,\\n center = axisId === 'y2' ? config.axis_y2_center : config.axis_y_center,\\n yDomainAbs,\\n lengths,\\n diff,\\n ratio,\\n isAllPositive,\\n isAllNegative,\\n isZeroBased =\\n ($$.hasType('bar', yTargets) && config.bar_zerobased) ||\\n ($$.hasType('area', yTargets) && config.area_zerobased),\\n isInverted = axisId === 'y2' ? config.axis_y2_inverted : config.axis_y_inverted,\\n showHorizontalDataLabel = $$.hasDataLabel() && config.axis_rotated,\\n showVerticalDataLabel = $$.hasDataLabel() && !config.axis_rotated;\\n\\n // MEMO: avoid inverting domain unexpectedly\\n yDomainMin = isValue(yMin) ? yMin : isValue(yMax) ? (yDomainMin < yMax ? yDomainMin : yMax - 10) : yDomainMin;\\n yDomainMax = isValue(yMax) ? yMax : isValue(yMin) ? (yMin < yDomainMax ? yDomainMax : yMin + 10) : yDomainMax;\\n\\n if (yTargets.length === 0) {\\n // use current domain if target of axisId is none\\n return axisId === 'y2' ? $$.y2.domain() : $$.y.domain();\\n }\\n if (isNaN(yDomainMin)) {\\n // set minimum to zero when not number\\n yDomainMin = 0;\\n }\\n if (isNaN(yDomainMax)) {\\n // set maximum to have same value as yDomainMin\\n yDomainMax = yDomainMin;\\n }\\n if (yDomainMin === yDomainMax) {\\n yDomainMin < 0 ? (yDomainMax = 0) : (yDomainMin = 0);\\n }\\n isAllPositive = yDomainMin >= 0 && yDomainMax >= 0;\\n isAllNegative = yDomainMin <= 0 && yDomainMax <= 0;\\n\\n // Cancel zerobased if axis_*_min / axis_*_max specified\\n if ((isValue(yMin) && isAllPositive) || (isValue(yMax) && isAllNegative)) {\\n isZeroBased = false;\\n }\\n\\n // Bar/Area chart should be 0-based if all positive|negative\\n if (isZeroBased) {\\n if (isAllPositive) {\\n yDomainMin = 0;\\n }\\n if (isAllNegative) {\\n yDomainMax = 0;\\n }\\n }\\n\\n domainLength = Math.abs(yDomainMax - yDomainMin);\\n padding = padding_top = padding_bottom = domainLength * 0.1;\\n\\n if (typeof center !== 'undefined') {\\n yDomainAbs = Math.max(Math.abs(yDomainMin), Math.abs(yDomainMax));\\n yDomainMax = center + yDomainAbs;\\n yDomainMin = center - yDomainAbs;\\n }\\n // add padding for data label\\n if (showHorizontalDataLabel) {\\n lengths = $$.getDataLabelLength(yDomainMin, yDomainMax, 'width');\\n diff = diffDomain($$.y.range());\\n ratio = [lengths[0] / diff, lengths[1] / diff];\\n padding_top += domainLength * (ratio[1] / (1 - ratio[0] - ratio[1]));\\n padding_bottom += domainLength * (ratio[0] / (1 - ratio[0] - ratio[1]));\\n } else if (showVerticalDataLabel) {\\n lengths = $$.getDataLabelLength(yDomainMin, yDomainMax, 'height');\\n padding_top += $$.axis.convertPixelsToAxisPadding(lengths[1], domainLength);\\n padding_bottom += $$.axis.convertPixelsToAxisPadding(lengths[0], domainLength);\\n }\\n if (axisId === 'y' && notEmpty(config.axis_y_padding)) {\\n padding_top = $$.axis.getPadding(config.axis_y_padding, 'top', padding_top, domainLength);\\n padding_bottom = $$.axis.getPadding(config.axis_y_padding, 'bottom', padding_bottom, domainLength);\\n }\\n if (axisId === 'y2' && notEmpty(config.axis_y2_padding)) {\\n padding_top = $$.axis.getPadding(config.axis_y2_padding, 'top', padding_top, domainLength);\\n padding_bottom = $$.axis.getPadding(config.axis_y2_padding, 'bottom', padding_bottom, domainLength);\\n }\\n // Bar/Area chart should be 0-based if all positive|negative\\n if (isZeroBased) {\\n if (isAllPositive) {\\n padding_bottom = yDomainMin;\\n }\\n if (isAllNegative) {\\n padding_top = -yDomainMax;\\n }\\n }\\n domain = [yDomainMin - padding_bottom, yDomainMax + padding_top];\\n return isInverted ? domain.reverse() : domain;\\n };\\n c3_chart_internal_fn.getXDomainMin = function(targets) {\\n var $$ = this,\\n config = $$.config;\\n return isDefined(config.axis_x_min)\\n ? $$.isTimeSeries()\\n ? this.parseDate(config.axis_x_min)\\n : config.axis_x_min\\n : $$.d3.min(targets, function(t) {\\n return $$.d3.min(t.values, function(v) {\\n return v.x;\\n });\\n });\\n };\\n c3_chart_internal_fn.getXDomainMax = function(targets) {\\n var $$ = this,\\n config = $$.config;\\n return isDefined(config.axis_x_max)\\n ? $$.isTimeSeries()\\n ? this.parseDate(config.axis_x_max)\\n : config.axis_x_max\\n : $$.d3.max(targets, function(t) {\\n return $$.d3.max(t.values, function(v) {\\n return v.x;\\n });\\n });\\n };\\n c3_chart_internal_fn.getXDomainPadding = function(domain) {\\n var $$ = this,\\n config = $$.config,\\n diff = domain[1] - domain[0],\\n maxDataCount,\\n padding,\\n paddingLeft,\\n paddingRight;\\n if ($$.isCategorized()) {\\n padding = 0;\\n } else if ($$.hasType('bar')) {\\n maxDataCount = $$.getMaxDataCount();\\n padding = maxDataCount > 1 ? diff / (maxDataCount - 1) / 2 : 0.5;\\n } else {\\n padding = diff * 0.01;\\n }\\n if (typeof config.axis_x_padding === 'object' && notEmpty(config.axis_x_padding)) {\\n paddingLeft = isValue(config.axis_x_padding.left) ? config.axis_x_padding.left : padding;\\n paddingRight = isValue(config.axis_x_padding.right) ? config.axis_x_padding.right : padding;\\n } else if (typeof config.axis_x_padding === 'number') {\\n paddingLeft = paddingRight = config.axis_x_padding;\\n } else {\\n paddingLeft = paddingRight = padding;\\n }\\n return { left: paddingLeft, right: paddingRight };\\n };\\n c3_chart_internal_fn.getXDomain = function(targets) {\\n var $$ = this,\\n xDomain = [$$.getXDomainMin(targets), $$.getXDomainMax(targets)],\\n firstX = xDomain[0],\\n lastX = xDomain[1],\\n padding = $$.getXDomainPadding(xDomain),\\n min = 0,\\n max = 0;\\n // show center of x domain if min and max are the same\\n if (firstX - lastX === 0 && !$$.isCategorized()) {\\n if ($$.isTimeSeries()) {\\n firstX = new Date(firstX.getTime() * 0.5);\\n lastX = new Date(lastX.getTime() * 1.5);\\n } else {\\n firstX = firstX === 0 ? 1 : firstX * 0.5;\\n lastX = lastX === 0 ? -1 : lastX * 1.5;\\n }\\n }\\n if (firstX || firstX === 0) {\\n min = $$.isTimeSeries() ? new Date(firstX.getTime() - padding.left) : firstX - padding.left;\\n }\\n if (lastX || lastX === 0) {\\n max = $$.isTimeSeries() ? new Date(lastX.getTime() + padding.right) : lastX + padding.right;\\n }\\n return [min, max];\\n };\\n c3_chart_internal_fn.updateXDomain = function(targets, withUpdateXDomain, withUpdateOrgXDomain, withTrim, domain) {\\n var $$ = this,\\n config = $$.config;\\n\\n if (withUpdateOrgXDomain) {\\n $$.x.domain(domain ? domain : $$.d3.extent($$.getXDomain(targets)));\\n $$.orgXDomain = $$.x.domain();\\n if (config.zoom_enabled) {\\n $$.zoom.scale($$.x).updateScaleExtent();\\n }\\n $$.subX.domain($$.x.domain());\\n if ($$.brush) {\\n $$.brush.scale($$.subX);\\n }\\n }\\n if (withUpdateXDomain) {\\n $$.x.domain(domain ? domain : !$$.brush || $$.brush.empty() ? $$.orgXDomain : $$.brush.extent());\\n if (config.zoom_enabled) {\\n $$.zoom.scale($$.x).updateScaleExtent();\\n }\\n }\\n\\n // Trim domain when too big by zoom mousemove event\\n if (withTrim) {\\n $$.x.domain($$.trimXDomain($$.x.orgDomain()));\\n }\\n\\n return $$.x.domain();\\n };\\n c3_chart_internal_fn.trimXDomain = function(domain) {\\n var zoomDomain = this.getZoomDomain(),\\n min = zoomDomain[0],\\n max = zoomDomain[1];\\n if (domain[0] <= min) {\\n domain[1] = +domain[1] + (min - domain[0]);\\n domain[0] = min;\\n }\\n if (max <= domain[1]) {\\n domain[0] = +domain[0] - (domain[1] - max);\\n domain[1] = max;\\n }\\n return domain;\\n };\\n\\n c3_chart_internal_fn.isX = function(key) {\\n var $$ = this,\\n config = $$.config;\\n return (config.data_x && key === config.data_x) || (notEmpty(config.data_xs) && hasValue(config.data_xs, key));\\n };\\n c3_chart_internal_fn.isNotX = function(key) {\\n return !this.isX(key);\\n };\\n c3_chart_internal_fn.getXKey = function(id) {\\n var $$ = this,\\n config = $$.config;\\n return config.data_x ? config.data_x : notEmpty(config.data_xs) ? config.data_xs[id] : null;\\n };\\n c3_chart_internal_fn.getXValuesOfXKey = function(key, targets) {\\n var $$ = this,\\n xValues,\\n ids = targets && notEmpty(targets) ? $$.mapToIds(targets) : [];\\n ids.forEach(function(id) {\\n if ($$.getXKey(id) === key) {\\n xValues = $$.data.xs[id];\\n }\\n });\\n return xValues;\\n };\\n c3_chart_internal_fn.getIndexByX = function(x) {\\n var $$ = this,\\n data = $$.filterByX($$.data.targets, x);\\n return data.length ? data[0].index : null;\\n };\\n c3_chart_internal_fn.getXValue = function(id, i) {\\n var $$ = this;\\n return id in $$.data.xs && $$.data.xs[id] && isValue($$.data.xs[id][i]) ? $$.data.xs[id][i] : i;\\n };\\n c3_chart_internal_fn.getOtherTargetXs = function() {\\n var $$ = this,\\n idsForX = Object.keys($$.data.xs);\\n return idsForX.length ? $$.data.xs[idsForX[0]] : null;\\n };\\n c3_chart_internal_fn.getOtherTargetX = function(index) {\\n var xs = this.getOtherTargetXs();\\n return xs && index < xs.length ? xs[index] : null;\\n };\\n c3_chart_internal_fn.addXs = function(xs) {\\n var $$ = this;\\n Object.keys(xs).forEach(function(id) {\\n $$.config.data_xs[id] = xs[id];\\n });\\n };\\n c3_chart_internal_fn.hasMultipleX = function(xs) {\\n return (\\n this.d3\\n .set(\\n Object.keys(xs).map(function(id) {\\n return xs[id];\\n })\\n )\\n .size() > 1\\n );\\n };\\n c3_chart_internal_fn.isMultipleX = function() {\\n return notEmpty(this.config.data_xs) || !this.config.data_xSort || this.hasType('scatter');\\n };\\n c3_chart_internal_fn.addName = function(data) {\\n var $$ = this,\\n name;\\n if (data) {\\n name = $$.config.data_names[data.id];\\n data.name = name !== undefined ? name : data.id;\\n }\\n return data;\\n };\\n c3_chart_internal_fn.getValueOnIndex = function(values, index) {\\n var valueOnIndex = values.filter(function(v) {\\n return v.index === index;\\n });\\n return valueOnIndex.length ? valueOnIndex[0] : null;\\n };\\n c3_chart_internal_fn.updateTargetX = function(targets, x) {\\n var $$ = this;\\n targets.forEach(function(t) {\\n t.values.forEach(function(v, i) {\\n v.x = $$.generateTargetX(x[i], t.id, i);\\n });\\n $$.data.xs[t.id] = x;\\n });\\n };\\n c3_chart_internal_fn.updateTargetXs = function(targets, xs) {\\n var $$ = this;\\n targets.forEach(function(t) {\\n if (xs[t.id]) {\\n $$.updateTargetX([t], xs[t.id]);\\n }\\n });\\n };\\n c3_chart_internal_fn.generateTargetX = function(rawX, id, index) {\\n var $$ = this,\\n x;\\n if ($$.isTimeSeries()) {\\n x = rawX ? $$.parseDate(rawX) : $$.parseDate($$.getXValue(id, index));\\n } else if ($$.isCustomX() && !$$.isCategorized()) {\\n x = isValue(rawX) ? +rawX : $$.getXValue(id, index);\\n } else {\\n x = index;\\n }\\n return x;\\n };\\n c3_chart_internal_fn.cloneTarget = function(target) {\\n return {\\n id: target.id,\\n id_org: target.id_org,\\n values: target.values.map(function(d) {\\n return { x: d.x, value: d.value, id: d.id };\\n })\\n };\\n };\\n c3_chart_internal_fn.updateXs = function() {\\n var $$ = this;\\n if ($$.data.targets.length) {\\n $$.xs = [];\\n $$.data.targets[0].values.forEach(function(v) {\\n $$.xs[v.index] = v.x;\\n });\\n }\\n };\\n c3_chart_internal_fn.getPrevX = function(i) {\\n var x = this.xs[i - 1];\\n return typeof x !== 'undefined' ? x : null;\\n };\\n c3_chart_internal_fn.getNextX = function(i) {\\n var x = this.xs[i + 1];\\n return typeof x !== 'undefined' ? x : null;\\n };\\n c3_chart_internal_fn.getMaxDataCount = function() {\\n var $$ = this;\\n return $$.d3.max($$.data.targets, function(t) {\\n return t.values.length;\\n });\\n };\\n c3_chart_internal_fn.getMaxDataCountTarget = function(targets) {\\n var length = targets.length,\\n max = 0,\\n maxTarget;\\n if (length > 1) {\\n targets.forEach(function(t) {\\n if (t.values.length > max) {\\n maxTarget = t;\\n max = t.values.length;\\n }\\n });\\n } else {\\n maxTarget = length ? targets[0] : null;\\n }\\n return maxTarget;\\n };\\n c3_chart_internal_fn.getEdgeX = function(targets) {\\n var $$ = this;\\n return !targets.length\\n ? [0, 0]\\n : [\\n $$.d3.min(targets, function(t) {\\n return t.values[0].x;\\n }),\\n $$.d3.max(targets, function(t) {\\n return t.values[t.values.length - 1].x;\\n })\\n ];\\n };\\n c3_chart_internal_fn.mapToIds = function(targets) {\\n return targets.map(function(d) {\\n return d.id;\\n });\\n };\\n c3_chart_internal_fn.mapToTargetIds = function(ids) {\\n var $$ = this;\\n return ids ? [].concat(ids) : $$.mapToIds($$.data.targets);\\n };\\n c3_chart_internal_fn.hasTarget = function(targets, id) {\\n var ids = this.mapToIds(targets),\\n i;\\n for (i = 0; i < ids.length; i++) {\\n if (ids[i] === id) {\\n return true;\\n }\\n }\\n return false;\\n };\\n c3_chart_internal_fn.isTargetToShow = function(targetId) {\\n return this.hiddenTargetIds.indexOf(targetId) < 0;\\n };\\n c3_chart_internal_fn.isLegendToShow = function(targetId) {\\n return this.hiddenLegendIds.indexOf(targetId) < 0;\\n };\\n c3_chart_internal_fn.filterTargetsToShow = function(targets) {\\n var $$ = this;\\n return targets.filter(function(t) {\\n return $$.isTargetToShow(t.id);\\n });\\n };\\n c3_chart_internal_fn.mapTargetsToUniqueXs = function(targets) {\\n var $$ = this;\\n var xs = $$.d3\\n .set(\\n $$.d3.merge(\\n targets.map(function(t) {\\n return t.values.map(function(v) {\\n return +v.x;\\n });\\n })\\n )\\n )\\n .values();\\n xs = $$.isTimeSeries()\\n ? xs.map(function(x) {\\n return new Date(+x);\\n })\\n : xs.map(function(x) {\\n return +x;\\n });\\n return xs.sort(function(a, b) {\\n return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;\\n });\\n };\\n c3_chart_internal_fn.addHiddenTargetIds = function(targetIds) {\\n this.hiddenTargetIds = this.hiddenTargetIds.concat(targetIds);\\n };\\n c3_chart_internal_fn.removeHiddenTargetIds = function(targetIds) {\\n this.hiddenTargetIds = this.hiddenTargetIds.filter(function(id) {\\n return targetIds.indexOf(id) < 0;\\n });\\n };\\n c3_chart_internal_fn.addHiddenLegendIds = function(targetIds) {\\n this.hiddenLegendIds = this.hiddenLegendIds.concat(targetIds);\\n };\\n c3_chart_internal_fn.removeHiddenLegendIds = function(targetIds) {\\n this.hiddenLegendIds = this.hiddenLegendIds.filter(function(id) {\\n return targetIds.indexOf(id) < 0;\\n });\\n };\\n c3_chart_internal_fn.getValuesAsIdKeyed = function(targets) {\\n var ys = {};\\n targets.forEach(function(t) {\\n ys[t.id] = [];\\n t.values.forEach(function(v) {\\n ys[t.id].push(v.value);\\n });\\n });\\n return ys;\\n };\\n c3_chart_internal_fn.checkValueInTargets = function(targets, checker) {\\n var ids = Object.keys(targets),\\n i,\\n j,\\n values;\\n for (i = 0; i < ids.length; i++) {\\n values = targets[ids[i]].values;\\n for (j = 0; j < values.length; j++) {\\n if (checker(values[j].value)) {\\n return true;\\n }\\n }\\n }\\n return false;\\n };\\n c3_chart_internal_fn.hasNegativeValueInTargets = function(targets) {\\n return this.checkValueInTargets(targets, function(v) {\\n return v < 0;\\n });\\n };\\n c3_chart_internal_fn.hasPositiveValueInTargets = function(targets) {\\n return this.checkValueInTargets(targets, function(v) {\\n return v > 0;\\n });\\n };\\n c3_chart_internal_fn.isOrderDesc = function() {\\n var config = this.config;\\n return typeof config.data_order === 'string' && config.data_order.toLowerCase() === 'desc';\\n };\\n c3_chart_internal_fn.isOrderAsc = function() {\\n var config = this.config;\\n return typeof config.data_order === 'string' && config.data_order.toLowerCase() === 'asc';\\n };\\n c3_chart_internal_fn.orderTargets = function(targets) {\\n var $$ = this,\\n config = $$.config,\\n orderAsc = $$.isOrderAsc(),\\n orderDesc = $$.isOrderDesc();\\n if (orderAsc || orderDesc) {\\n targets.sort(function(t1, t2) {\\n var reducer = function(p, c) {\\n return p + Math.abs(c.value);\\n };\\n var t1Sum = t1.values.reduce(reducer, 0),\\n t2Sum = t2.values.reduce(reducer, 0);\\n return orderAsc ? t2Sum - t1Sum : t1Sum - t2Sum;\\n });\\n } else if (isFunction(config.data_order)) {\\n targets.sort(config.data_order);\\n } // TODO: accept name array for order\\n return targets;\\n };\\n c3_chart_internal_fn.filterByX = function(targets, x) {\\n return this.d3\\n .merge(\\n targets.map(function(t) {\\n return t.values;\\n })\\n )\\n .filter(function(v) {\\n return v.x - x === 0;\\n });\\n };\\n c3_chart_internal_fn.filterRemoveNull = function(data) {\\n return data.filter(function(d) {\\n return isValue(d.value);\\n });\\n };\\n c3_chart_internal_fn.filterByXDomain = function(targets, xDomain) {\\n return targets.map(function(t) {\\n return {\\n id: t.id,\\n id_org: t.id_org,\\n values: t.values.filter(function(v) {\\n return xDomain[0] <= v.x && v.x <= xDomain[1];\\n })\\n };\\n });\\n };\\n c3_chart_internal_fn.hasDataLabel = function() {\\n var config = this.config;\\n if (typeof config.data_labels === 'boolean' && config.data_labels) {\\n return true;\\n } else if (typeof config.data_labels === 'object' && notEmpty(config.data_labels)) {\\n return true;\\n }\\n return false;\\n };\\n c3_chart_internal_fn.getDataLabelLength = function(min, max, key) {\\n var $$ = this,\\n lengths = [0, 0],\\n paddingCoef = 1.3;\\n $$.selectChart\\n .select('svg')\\n .selectAll('.dummy')\\n .data([min, max])\\n .enter()\\n .append('text')\\n .text(function(d) {\\n return $$.dataLabelFormat(d.id)(d);\\n })\\n .each(function(d, i) {\\n lengths[i] = this.getBoundingClientRect()[key] * paddingCoef;\\n })\\n .remove();\\n return lengths;\\n };\\n (c3_chart_internal_fn.isNoneArc = function(d) {\\n return this.hasTarget(this.data.targets, d.id);\\n }),\\n (c3_chart_internal_fn.isArc = function(d) {\\n return 'data' in d && this.hasTarget(this.data.targets, d.data.id);\\n });\\n c3_chart_internal_fn.findSameXOfValues = function(values, index) {\\n var i,\\n targetX = values[index].x,\\n sames = [];\\n for (i = index - 1; i >= 0; i--) {\\n if (targetX !== values[i].x) {\\n break;\\n }\\n sames.push(values[i]);\\n }\\n for (i = index; i < values.length; i++) {\\n if (targetX !== values[i].x) {\\n break;\\n }\\n sames.push(values[i]);\\n }\\n return sames;\\n };\\n\\n c3_chart_internal_fn.findClosestFromTargets = function(targets, pos) {\\n var $$ = this,\\n candidates;\\n\\n // map to array of closest points of each target\\n candidates = targets.map(function(target) {\\n return $$.findClosest(target.values, pos);\\n });\\n\\n // decide closest point and return\\n return $$.findClosest(candidates, pos);\\n };\\n c3_chart_internal_fn.findClosest = function(values, pos) {\\n var $$ = this,\\n minDist = $$.config.point_sensitivity,\\n closest;\\n\\n // find mouseovering bar\\n values\\n .filter(function(v) {\\n return v && $$.isBarType(v.id);\\n })\\n .forEach(function(v) {\\n var shape = $$.main\\n .select('.' + CLASS.bars + $$.getTargetSelectorSuffix(v.id) + ' .' + CLASS.bar + '-' + v.index)\\n .node();\\n if (!closest && $$.isWithinBar(shape)) {\\n closest = v;\\n }\\n });\\n\\n // find closest point from non-bar\\n values\\n .filter(function(v) {\\n return v && !$$.isBarType(v.id);\\n })\\n .forEach(function(v) {\\n var d = $$.dist(v, pos);\\n if (d < minDist) {\\n minDist = d;\\n closest = v;\\n }\\n });\\n\\n return closest;\\n };\\n c3_chart_internal_fn.dist = function(data, pos) {\\n var $$ = this,\\n config = $$.config,\\n xIndex = config.axis_rotated ? 1 : 0,\\n yIndex = config.axis_rotated ? 0 : 1,\\n y = $$.circleY(data, data.index),\\n x = $$.x(data.x);\\n return Math.sqrt(Math.pow(x - pos[xIndex], 2) + Math.pow(y - pos[yIndex], 2));\\n };\\n c3_chart_internal_fn.convertValuesToStep = function(values) {\\n var converted = [].concat(values),\\n i;\\n\\n if (!this.isCategorized()) {\\n return values;\\n }\\n\\n for (i = values.length + 1; 0 < i; i--) {\\n converted[i] = converted[i - 1];\\n }\\n\\n converted[0] = {\\n x: converted[0].x - 1,\\n value: converted[0].value,\\n id: converted[0].id\\n };\\n converted[values.length + 1] = {\\n x: converted[values.length].x + 1,\\n value: converted[values.length].value,\\n id: converted[values.length].id\\n };\\n\\n return converted;\\n };\\n c3_chart_internal_fn.updateDataAttributes = function(name, attrs) {\\n var $$ = this,\\n config = $$.config,\\n current = config['data_' + name];\\n if (typeof attrs === 'undefined') {\\n return current;\\n }\\n Object.keys(attrs).forEach(function(id) {\\n current[id] = attrs[id];\\n });\\n $$.redraw({ withLegend: true });\\n return current;\\n };\\n\\n c3_chart_internal_fn.convertUrlToData = function(url, mimeType, headers, keys, done) {\\n var $$ = this,\\n type = mimeType ? mimeType : 'csv';\\n var req = $$.d3.xhr(url);\\n if (headers) {\\n Object.keys(headers).forEach(function(header) {\\n req.header(header, headers[header]);\\n });\\n }\\n req.get(function(error, data) {\\n var d;\\n if (!data) {\\n throw new Error(error.responseURL + ' ' + error.status + ' (' + error.statusText + ')');\\n }\\n if (type === 'json') {\\n d = $$.convertJsonToData(JSON.parse(data.response), keys);\\n } else if (type === 'tsv') {\\n d = $$.convertTsvToData(data.response);\\n } else {\\n d = $$.convertCsvToData(data.response);\\n }\\n done.call($$, d);\\n });\\n };\\n c3_chart_internal_fn.convertXsvToData = function(xsv, parser) {\\n var rows = parser.parseRows(xsv),\\n d;\\n if (rows.length === 1) {\\n d = [{}];\\n rows[0].forEach(function(id) {\\n d[0][id] = null;\\n });\\n } else {\\n d = parser.parse(xsv);\\n }\\n return d;\\n };\\n c3_chart_internal_fn.convertCsvToData = function(csv) {\\n return this.convertXsvToData(csv, this.d3.csv);\\n };\\n c3_chart_internal_fn.convertTsvToData = function(tsv) {\\n return this.convertXsvToData(tsv, this.d3.tsv);\\n };\\n c3_chart_internal_fn.convertJsonToData = function(json, keys) {\\n var $$ = this,\\n new_rows = [],\\n targetKeys,\\n data;\\n if (keys) {\\n // when keys specified, json would be an array that includes objects\\n if (keys.x) {\\n targetKeys = keys.value.concat(keys.x);\\n $$.config.data_x = keys.x;\\n } else {\\n targetKeys = keys.value;\\n }\\n new_rows.push(targetKeys);\\n json.forEach(function(o) {\\n var new_row = [];\\n targetKeys.forEach(function(key) {\\n // convert undefined to null because undefined data will be removed in convertDataToTargets()\\n var v = $$.findValueInJson(o, key);\\n if (isUndefined(v)) {\\n v = null;\\n }\\n new_row.push(v);\\n });\\n new_rows.push(new_row);\\n });\\n data = $$.convertRowsToData(new_rows);\\n } else {\\n Object.keys(json).forEach(function(key) {\\n new_rows.push([key].concat(json[key]));\\n });\\n data = $$.convertColumnsToData(new_rows);\\n }\\n return data;\\n };\\n c3_chart_internal_fn.findValueInJson = function(object, path) {\\n path = path.replace(/\\\\[(\\\\w+)\\\\]/g, '.$1'); // convert indexes to properties (replace [] with .)\\n path = path.replace(/^\\\\./, ''); // strip a leading dot\\n var pathArray = path.split('.');\\n for (var i = 0; i < pathArray.length; ++i) {\\n var k = pathArray[i];\\n if (k in object) {\\n object = object[k];\\n } else {\\n return;\\n }\\n }\\n return object;\\n };\\n c3_chart_internal_fn.convertRowsToData = function(rows) {\\n var keys = rows[0],\\n new_row = {},\\n new_rows = [],\\n i,\\n j;\\n for (i = 1; i < rows.length; i++) {\\n new_row = {};\\n for (j = 0; j < rows[i].length; j++) {\\n if (isUndefined(rows[i][j])) {\\n throw new Error('Source data is missing a component at (' + i + ',' + j + ')!');\\n }\\n new_row[keys[j]] = rows[i][j];\\n }\\n new_rows.push(new_row);\\n }\\n return new_rows;\\n };\\n c3_chart_internal_fn.convertColumnsToData = function(columns) {\\n var new_rows = [],\\n i,\\n j,\\n key;\\n for (i = 0; i < columns.length; i++) {\\n key = columns[i][0];\\n for (j = 1; j < columns[i].length; j++) {\\n if (isUndefined(new_rows[j - 1])) {\\n new_rows[j - 1] = {};\\n }\\n if (isUndefined(columns[i][j])) {\\n throw new Error('Source data is missing a component at (' + i + ',' + j + ')!');\\n }\\n new_rows[j - 1][key] = columns[i][j];\\n }\\n }\\n return new_rows;\\n };\\n c3_chart_internal_fn.convertDataToTargets = function(data, appendXs) {\\n var $$ = this,\\n config = $$.config,\\n ids = $$.d3.keys(data[0]).filter($$.isNotX, $$),\\n xs = $$.d3.keys(data[0]).filter($$.isX, $$),\\n targets;\\n\\n // save x for update data by load when custom x and c3.x API\\n ids.forEach(function(id) {\\n var xKey = $$.getXKey(id);\\n\\n if ($$.isCustomX() || $$.isTimeSeries()) {\\n // if included in input data\\n if (xs.indexOf(xKey) >= 0) {\\n $$.data.xs[id] = (appendXs && $$.data.xs[id] ? $$.data.xs[id] : []).concat(\\n data\\n .map(function(d) {\\n return d[xKey];\\n })\\n .filter(isValue)\\n .map(function(rawX, i) {\\n return $$.generateTargetX(rawX, id, i);\\n })\\n );\\n }\\n // if not included in input data, find from preloaded data of other id's x\\n else if (config.data_x) {\\n $$.data.xs[id] = $$.getOtherTargetXs();\\n }\\n // if not included in input data, find from preloaded data\\n else if (notEmpty(config.data_xs)) {\\n $$.data.xs[id] = $$.getXValuesOfXKey(xKey, $$.data.targets);\\n }\\n // MEMO: if no x included, use same x of current will be used\\n } else {\\n $$.data.xs[id] = data.map(function(d, i) {\\n return i;\\n });\\n }\\n });\\n\\n // check x is defined\\n ids.forEach(function(id) {\\n if (!$$.data.xs[id]) {\\n throw new Error('x is not defined for id = \\\"' + id + '\\\".');\\n }\\n });\\n\\n // convert to target\\n targets = ids.map(function(id, index) {\\n var convertedId = config.data_idConverter(id);\\n return {\\n id: convertedId,\\n id_org: id,\\n values: data\\n .map(function(d, i) {\\n var xKey = $$.getXKey(id),\\n rawX = d[xKey],\\n value = d[id] !== null && !isNaN(d[id]) ? +d[id] : null,\\n x;\\n // use x as categories if custom x and categorized\\n if ($$.isCustomX() && $$.isCategorized() && index === 0 && !isUndefined(rawX)) {\\n if (index === 0 && i === 0) {\\n config.axis_x_categories = [];\\n }\\n x = config.axis_x_categories.indexOf(rawX);\\n if (x === -1) {\\n x = config.axis_x_categories.length;\\n config.axis_x_categories.push(rawX);\\n }\\n } else {\\n x = $$.generateTargetX(rawX, id, i);\\n }\\n // mark as x = undefined if value is undefined and filter to remove after mapped\\n if (isUndefined(d[id]) || $$.data.xs[id].length <= i) {\\n x = undefined;\\n }\\n return { x: x, value: value, id: convertedId };\\n })\\n .filter(function(v) {\\n return isDefined(v.x);\\n })\\n };\\n });\\n\\n // finish targets\\n targets.forEach(function(t) {\\n var i;\\n // sort values by its x\\n if (config.data_xSort) {\\n t.values = t.values.sort(function(v1, v2) {\\n var x1 = v1.x || v1.x === 0 ? v1.x : Infinity,\\n x2 = v2.x || v2.x === 0 ? v2.x : Infinity;\\n return x1 - x2;\\n });\\n }\\n // indexing each value\\n i = 0;\\n t.values.forEach(function(v) {\\n v.index = i++;\\n });\\n // this needs to be sorted because its index and value.index is identical\\n $$.data.xs[t.id].sort(function(v1, v2) {\\n return v1 - v2;\\n });\\n });\\n\\n // cache information about values\\n $$.hasNegativeValue = $$.hasNegativeValueInTargets(targets);\\n $$.hasPositiveValue = $$.hasPositiveValueInTargets(targets);\\n\\n // set target types\\n if (config.data_type) {\\n $$.setTargetType(\\n $$.mapToIds(targets).filter(function(id) {\\n return !(id in config.data_types);\\n }),\\n config.data_type\\n );\\n }\\n\\n // cache as original id keyed\\n targets.forEach(function(d) {\\n $$.addCache(d.id_org, d);\\n });\\n\\n return targets;\\n };\\n\\n c3_chart_internal_fn.load = function(targets, args) {\\n var $$ = this;\\n if (targets) {\\n // filter loading targets if needed\\n if (args.filter) {\\n targets = targets.filter(args.filter);\\n }\\n // set type if args.types || args.type specified\\n if (args.type || args.types) {\\n targets.forEach(function(t) {\\n var type = args.types && args.types[t.id] ? args.types[t.id] : args.type;\\n $$.setTargetType(t.id, type);\\n });\\n }\\n // Update/Add data\\n $$.data.targets.forEach(function(d) {\\n for (var i = 0; i < targets.length; i++) {\\n if (d.id === targets[i].id) {\\n d.values = targets[i].values;\\n targets.splice(i, 1);\\n break;\\n }\\n }\\n });\\n $$.data.targets = $$.data.targets.concat(targets); // add remained\\n }\\n\\n // Set targets\\n $$.updateTargets($$.data.targets);\\n\\n // Redraw with new targets\\n $$.redraw({ withUpdateOrgXDomain: true, withUpdateXDomain: true, withLegend: true });\\n\\n if (args.done) {\\n args.done();\\n }\\n };\\n c3_chart_internal_fn.loadFromArgs = function(args) {\\n var $$ = this;\\n if (args.data) {\\n $$.load($$.convertDataToTargets(args.data), args);\\n } else if (args.url) {\\n $$.convertUrlToData(args.url, args.mimeType, args.headers, args.keys, function(data) {\\n $$.load($$.convertDataToTargets(data), args);\\n });\\n } else if (args.json) {\\n $$.load($$.convertDataToTargets($$.convertJsonToData(args.json, args.keys)), args);\\n } else if (args.rows) {\\n $$.load($$.convertDataToTargets($$.convertRowsToData(args.rows)), args);\\n } else if (args.columns) {\\n $$.load($$.convertDataToTargets($$.convertColumnsToData(args.columns)), args);\\n } else {\\n $$.load(null, args);\\n }\\n };\\n c3_chart_internal_fn.unload = function(targetIds, done) {\\n var $$ = this;\\n if (!done) {\\n done = function() {};\\n }\\n // filter existing target\\n targetIds = targetIds.filter(function(id) {\\n return $$.hasTarget($$.data.targets, id);\\n });\\n // If no target, call done and return\\n if (!targetIds || targetIds.length === 0) {\\n done();\\n return;\\n }\\n $$.svg\\n .selectAll(\\n targetIds.map(function(id) {\\n return $$.selectorTarget(id);\\n })\\n )\\n .transition()\\n .style('opacity', 0)\\n .remove()\\n .call($$.endall, done);\\n targetIds.forEach(function(id) {\\n // Reset fadein for future load\\n $$.withoutFadeIn[id] = false;\\n // Remove target's elements\\n if ($$.legend) {\\n $$.legend.selectAll('.' + CLASS.legendItem + $$.getTargetSelectorSuffix(id)).remove();\\n }\\n // Remove target\\n $$.data.targets = $$.data.targets.filter(function(t) {\\n return t.id !== id;\\n });\\n });\\n };\\n\\n c3_chart_internal_fn.categoryName = function(i) {\\n var config = this.config;\\n return i < config.axis_x_categories.length ? config.axis_x_categories[i] : i;\\n };\\n\\n c3_chart_internal_fn.initEventRect = function() {\\n var $$ = this;\\n $$.main\\n .select('.' + CLASS.chart)\\n .append('g')\\n .attr('class', CLASS.eventRects)\\n .style('fill-opacity', 0);\\n };\\n c3_chart_internal_fn.redrawEventRect = function() {\\n var $$ = this,\\n config = $$.config,\\n eventRectUpdate,\\n maxDataCountTarget,\\n isMultipleX = $$.isMultipleX();\\n\\n // rects for mouseover\\n var eventRects = $$.main\\n .select('.' + CLASS.eventRects)\\n .style('cursor', config.zoom_enabled ? (config.axis_rotated ? 'ns-resize' : 'ew-resize') : null)\\n .classed(CLASS.eventRectsMultiple, isMultipleX)\\n .classed(CLASS.eventRectsSingle, !isMultipleX);\\n\\n // clear old rects\\n eventRects.selectAll('.' + CLASS.eventRect).remove();\\n\\n // open as public variable\\n $$.eventRect = eventRects.selectAll('.' + CLASS.eventRect);\\n\\n if (isMultipleX) {\\n eventRectUpdate = $$.eventRect.data([0]);\\n // enter : only one rect will be added\\n $$.generateEventRectsForMultipleXs(eventRectUpdate.enter());\\n // update\\n $$.updateEventRect(eventRectUpdate);\\n // exit : not needed because always only one rect exists\\n } else {\\n // Set data and update $$.eventRect\\n maxDataCountTarget = $$.getMaxDataCountTarget($$.data.targets);\\n eventRects.datum(maxDataCountTarget ? maxDataCountTarget.values : []);\\n $$.eventRect = eventRects.selectAll('.' + CLASS.eventRect);\\n eventRectUpdate = $$.eventRect.data(function(d) {\\n return d;\\n });\\n // enter\\n $$.generateEventRectsForSingleX(eventRectUpdate.enter());\\n // update\\n $$.updateEventRect(eventRectUpdate);\\n // exit\\n eventRectUpdate.exit().remove();\\n }\\n };\\n c3_chart_internal_fn.updateEventRect = function(eventRectUpdate) {\\n var $$ = this,\\n config = $$.config,\\n x,\\n y,\\n w,\\n h,\\n rectW,\\n rectX;\\n\\n // set update selection if null\\n eventRectUpdate =\\n eventRectUpdate ||\\n $$.eventRect.data(function(d) {\\n return d;\\n });\\n\\n if ($$.isMultipleX()) {\\n // TODO: rotated not supported yet\\n x = 0;\\n y = 0;\\n w = $$.width;\\n h = $$.height;\\n } else {\\n if (($$.isCustomX() || $$.isTimeSeries()) && !$$.isCategorized()) {\\n // update index for x that is used by prevX and nextX\\n $$.updateXs();\\n\\n rectW = function(d) {\\n var prevX = $$.getPrevX(d.index),\\n nextX = $$.getNextX(d.index);\\n\\n // if there this is a single data point make the eventRect full width (or height)\\n if (prevX === null && nextX === null) {\\n return config.axis_rotated ? $$.height : $$.width;\\n }\\n\\n if (prevX === null) {\\n prevX = $$.x.domain()[0];\\n }\\n if (nextX === null) {\\n nextX = $$.x.domain()[1];\\n }\\n\\n return Math.max(0, ($$.x(nextX) - $$.x(prevX)) / 2);\\n };\\n rectX = function(d) {\\n var prevX = $$.getPrevX(d.index),\\n nextX = $$.getNextX(d.index),\\n thisX = $$.data.xs[d.id][d.index];\\n\\n // if there this is a single data point position the eventRect at 0\\n if (prevX === null && nextX === null) {\\n return 0;\\n }\\n\\n if (prevX === null) {\\n prevX = $$.x.domain()[0];\\n }\\n\\n return ($$.x(thisX) + $$.x(prevX)) / 2;\\n };\\n } else {\\n rectW = $$.getEventRectWidth();\\n rectX = function(d) {\\n return $$.x(d.x) - rectW / 2;\\n };\\n }\\n x = config.axis_rotated ? 0 : rectX;\\n y = config.axis_rotated ? rectX : 0;\\n w = config.axis_rotated ? $$.width : rectW;\\n h = config.axis_rotated ? rectW : $$.height;\\n }\\n\\n eventRectUpdate\\n .attr('class', $$.classEvent.bind($$))\\n .attr('x', x)\\n .attr('y', y)\\n .attr('width', w)\\n .attr('height', h);\\n };\\n c3_chart_internal_fn.generateEventRectsForSingleX = function(eventRectEnter) {\\n var $$ = this,\\n d3 = $$.d3,\\n config = $$.config;\\n eventRectEnter\\n .append('rect')\\n .attr('class', $$.classEvent.bind($$))\\n .style('cursor', config.data_selection_enabled && config.data_selection_grouped ? 'pointer' : null)\\n .on('mouseover', function(d) {\\n var index = d.index;\\n\\n if ($$.dragging || $$.flowing) {\\n return;\\n } // do nothing while dragging/flowing\\n if ($$.hasArcType()) {\\n return;\\n }\\n\\n // Expand shapes for selection\\n if (config.point_focus_expand_enabled) {\\n $$.expandCircles(index, null, true);\\n }\\n $$.expandBars(index, null, true);\\n\\n // Call event handler\\n $$.main.selectAll('.' + CLASS.shape + '-' + index).each(function(d) {\\n config.data_onmouseover.call($$.api, d);\\n });\\n })\\n .on('mouseout', function(d) {\\n var index = d.index;\\n if (!$$.config) {\\n return;\\n } // chart is destroyed\\n if ($$.hasArcType()) {\\n return;\\n }\\n $$.hideXGridFocus();\\n $$.hideTooltip();\\n // Undo expanded shapes\\n $$.unexpandCircles();\\n $$.unexpandBars();\\n // Call event handler\\n $$.main.selectAll('.' + CLASS.shape + '-' + index).each(function(d) {\\n config.data_onmouseout.call($$.api, d);\\n });\\n })\\n .on('mousemove', function(d) {\\n var selectedData,\\n index = d.index,\\n eventRect = $$.svg.select('.' + CLASS.eventRect + '-' + index);\\n\\n if ($$.dragging || $$.flowing) {\\n return;\\n } // do nothing while dragging/flowing\\n if ($$.hasArcType()) {\\n return;\\n }\\n\\n if (\\n $$.isStepType(d) &&\\n $$.config.line_step_type === 'step-after' &&\\n d3.mouse(this)[0] < $$.x($$.getXValue(d.id, index))\\n ) {\\n index -= 1;\\n }\\n\\n // Show tooltip\\n selectedData = $$.filterTargetsToShow($$.data.targets).map(function(t) {\\n return $$.addName($$.getValueOnIndex(t.values, index));\\n });\\n\\n if (config.tooltip_grouped) {\\n $$.showTooltip(selectedData, this);\\n $$.showXGridFocus(selectedData);\\n }\\n\\n if (config.tooltip_grouped && (!config.data_selection_enabled || config.data_selection_grouped)) {\\n return;\\n }\\n\\n $$.main\\n .selectAll('.' + CLASS.shape + '-' + index)\\n .each(function() {\\n d3.select(this).classed(CLASS.EXPANDED, true);\\n if (config.data_selection_enabled) {\\n eventRect.style('cursor', config.data_selection_grouped ? 'pointer' : null);\\n }\\n if (!config.tooltip_grouped) {\\n $$.hideXGridFocus();\\n $$.hideTooltip();\\n if (!config.data_selection_grouped) {\\n $$.unexpandCircles(index);\\n $$.unexpandBars(index);\\n }\\n }\\n })\\n .filter(function(d) {\\n return $$.isWithinShape(this, d);\\n })\\n .each(function(d) {\\n if (\\n config.data_selection_enabled &&\\n (config.data_selection_grouped || config.data_selection_isselectable(d))\\n ) {\\n eventRect.style('cursor', 'pointer');\\n }\\n if (!config.tooltip_grouped) {\\n $$.showTooltip([d], this);\\n $$.showXGridFocus([d]);\\n if (config.point_focus_expand_enabled) {\\n $$.expandCircles(index, d.id, true);\\n }\\n $$.expandBars(index, d.id, true);\\n }\\n });\\n })\\n .on('click', function(d) {\\n var index = d.index;\\n if ($$.hasArcType() || !$$.toggleShape) {\\n return;\\n }\\n if ($$.cancelClick) {\\n $$.cancelClick = false;\\n return;\\n }\\n if (\\n $$.isStepType(d) &&\\n config.line_step_type === 'step-after' &&\\n d3.mouse(this)[0] < $$.x($$.getXValue(d.id, index))\\n ) {\\n index -= 1;\\n }\\n $$.main.selectAll('.' + CLASS.shape + '-' + index).each(function(d) {\\n if (config.data_selection_grouped || $$.isWithinShape(this, d)) {\\n $$.toggleShape(this, d, index);\\n $$.config.data_onclick.call($$.api, d, this);\\n }\\n });\\n })\\n .call(\\n config.data_selection_draggable && $$.drag\\n ? d3.behavior\\n .drag()\\n .origin(Object)\\n .on('drag', function() {\\n $$.drag(d3.mouse(this));\\n })\\n .on('dragstart', function() {\\n $$.dragstart(d3.mouse(this));\\n })\\n .on('dragend', function() {\\n $$.dragend();\\n })\\n : function() {}\\n );\\n };\\n\\n c3_chart_internal_fn.generateEventRectsForMultipleXs = function(eventRectEnter) {\\n var $$ = this,\\n d3 = $$.d3,\\n config = $$.config;\\n\\n function mouseout() {\\n $$.svg.select('.' + CLASS.eventRect).style('cursor', null);\\n $$.hideXGridFocus();\\n $$.hideTooltip();\\n $$.unexpandCircles();\\n $$.unexpandBars();\\n }\\n\\n eventRectEnter\\n .append('rect')\\n .attr('x', 0)\\n .attr('y', 0)\\n .attr('width', $$.width)\\n .attr('height', $$.height)\\n .attr('class', CLASS.eventRect)\\n .on('mouseout', function() {\\n if (!$$.config) {\\n return;\\n } // chart is destroyed\\n if ($$.hasArcType()) {\\n return;\\n }\\n mouseout();\\n })\\n .on('mousemove', function() {\\n var targetsToShow = $$.filterTargetsToShow($$.data.targets);\\n var mouse, closest, sameXData, selectedData;\\n\\n if ($$.dragging) {\\n return;\\n } // do nothing when dragging\\n if ($$.hasArcType(targetsToShow)) {\\n return;\\n }\\n\\n mouse = d3.mouse(this);\\n closest = $$.findClosestFromTargets(targetsToShow, mouse);\\n\\n if ($$.mouseover && (!closest || closest.id !== $$.mouseover.id)) {\\n config.data_onmouseout.call($$.api, $$.mouseover);\\n $$.mouseover = undefined;\\n }\\n\\n if (!closest) {\\n mouseout();\\n return;\\n }\\n\\n if ($$.isScatterType(closest) || !config.tooltip_grouped) {\\n sameXData = [closest];\\n } else {\\n sameXData = $$.filterByX(targetsToShow, closest.x);\\n }\\n\\n // show tooltip when cursor is close to some point\\n selectedData = sameXData.map(function(d) {\\n return $$.addName(d);\\n });\\n $$.showTooltip(selectedData, this);\\n\\n // expand points\\n if (config.point_focus_expand_enabled) {\\n $$.expandCircles(closest.index, closest.id, true);\\n }\\n $$.expandBars(closest.index, closest.id, true);\\n\\n // Show xgrid focus line\\n $$.showXGridFocus(selectedData);\\n\\n // Show cursor as pointer if point is close to mouse position\\n if ($$.isBarType(closest.id) || $$.dist(closest, mouse) < config.point_sensitivity) {\\n $$.svg.select('.' + CLASS.eventRect).style('cursor', 'pointer');\\n if (!$$.mouseover) {\\n config.data_onmouseover.call($$.api, closest);\\n $$.mouseover = closest;\\n }\\n }\\n })\\n .on('click', function() {\\n var targetsToShow = $$.filterTargetsToShow($$.data.targets);\\n var mouse, closest;\\n if ($$.hasArcType(targetsToShow)) {\\n return;\\n }\\n\\n mouse = d3.mouse(this);\\n closest = $$.findClosestFromTargets(targetsToShow, mouse);\\n if (!closest) {\\n return;\\n }\\n // select if selection enabled\\n if ($$.isBarType(closest.id) || $$.dist(closest, mouse) < config.point_sensitivity) {\\n $$.main\\n .selectAll('.' + CLASS.shapes + $$.getTargetSelectorSuffix(closest.id))\\n .selectAll('.' + CLASS.shape + '-' + closest.index)\\n .each(function() {\\n if (config.data_selection_grouped || $$.isWithinShape(this, closest)) {\\n $$.toggleShape(this, closest, closest.index);\\n $$.config.data_onclick.call($$.api, closest, this);\\n }\\n });\\n }\\n })\\n .call(\\n config.data_selection_draggable && $$.drag\\n ? d3.behavior\\n .drag()\\n .origin(Object)\\n .on('drag', function() {\\n $$.drag(d3.mouse(this));\\n })\\n .on('dragstart', function() {\\n $$.dragstart(d3.mouse(this));\\n })\\n .on('dragend', function() {\\n $$.dragend();\\n })\\n : function() {}\\n );\\n };\\n c3_chart_internal_fn.dispatchEvent = function(type, index, mouse) {\\n var $$ = this,\\n selector = '.' + CLASS.eventRect + (!$$.isMultipleX() ? '-' + index : ''),\\n eventRect = $$.main.select(selector).node(),\\n box = eventRect.getBoundingClientRect(),\\n x = box.left + (mouse ? mouse[0] : 0),\\n y = box.top + (mouse ? mouse[1] : 0),\\n event = document.createEvent('MouseEvents');\\n\\n event.initMouseEvent(type, true, true, window, 0, x, y, x, y, false, false, false, false, 0, null);\\n eventRect.dispatchEvent(event);\\n };\\n\\n c3_chart_internal_fn.getCurrentWidth = function() {\\n var $$ = this,\\n config = $$.config;\\n return config.size_width ? config.size_width : $$.getParentWidth();\\n };\\n c3_chart_internal_fn.getCurrentHeight = function() {\\n var $$ = this,\\n config = $$.config,\\n h = config.size_height ? config.size_height : $$.getParentHeight();\\n return h > 0 ? h : 320 / ($$.hasType('gauge') && !config.gauge_fullCircle ? 2 : 1);\\n };\\n c3_chart_internal_fn.getCurrentPaddingTop = function() {\\n var $$ = this,\\n config = $$.config,\\n padding = isValue(config.padding_top) ? config.padding_top : 0;\\n if ($$.title && $$.title.node()) {\\n padding += $$.getTitlePadding();\\n }\\n return padding;\\n };\\n c3_chart_internal_fn.getCurrentPaddingBottom = function() {\\n var config = this.config;\\n return isValue(config.padding_bottom) ? config.padding_bottom : 0;\\n };\\n c3_chart_internal_fn.getCurrentPaddingLeft = function(withoutRecompute) {\\n var $$ = this,\\n config = $$.config;\\n if (isValue(config.padding_left)) {\\n return config.padding_left;\\n } else if (config.axis_rotated) {\\n return !config.axis_x_show ? 1 : Math.max(ceil10($$.getAxisWidthByAxisId('x', withoutRecompute)), 40);\\n } else if (!config.axis_y_show || config.axis_y_inner) {\\n // && !config.axis_rotated\\n return $$.axis.getYAxisLabelPosition().isOuter ? 30 : 1;\\n } else {\\n return ceil10($$.getAxisWidthByAxisId('y', withoutRecompute));\\n }\\n };\\n c3_chart_internal_fn.getCurrentPaddingRight = function() {\\n var $$ = this,\\n config = $$.config,\\n defaultPadding = 10,\\n legendWidthOnRight = $$.isLegendRight ? $$.getLegendWidth() + 20 : 0;\\n if (isValue(config.padding_right)) {\\n return config.padding_right + 1; // 1 is needed not to hide tick line\\n } else if (config.axis_rotated) {\\n return defaultPadding + legendWidthOnRight;\\n } else if (!config.axis_y2_show || config.axis_y2_inner) {\\n // && !config.axis_rotated\\n return 2 + legendWidthOnRight + ($$.axis.getY2AxisLabelPosition().isOuter ? 20 : 0);\\n } else {\\n return ceil10($$.getAxisWidthByAxisId('y2')) + legendWidthOnRight;\\n }\\n };\\n\\n c3_chart_internal_fn.getParentRectValue = function(key) {\\n var parent = this.selectChart.node(),\\n v;\\n var vReturn;\\n while (parent && parent.tagName !== 'BODY') {\\n var activeElements;\\n try {\\n if (key == 'width') {\\n activeElements = $('div.tab-pane.ng-scope.active').find('div.c3');\\n if (activeElements.length > 0) {\\n window.globalWidthVar = activeElements[0].getBoundingClientRect()[key];\\n v = activeElements[0].getBoundingClientRect()[key];\\n } else {\\n v = parent.getBoundingClientRect()[key];\\n }\\n } else {\\n v = parent.getBoundingClientRect()[key];\\n }\\n } catch (e) {\\n if (key === 'width') {\\n // In IE in certain cases getBoundingClientRect\\n // will cause an \\\"unspecified $('#ParentDiv').find('input');error\\\"\\n v = parent.offsetWidth;\\n }\\n }\\n if (v) {\\n break;\\n }\\n parent = parent.parentNode;\\n }\\n\\n vReturn = window.globalWidthVar || v;\\n return vReturn;\\n };\\n\\n c3_chart_internal_fn.getParentWidth = function() {\\n return this.getParentRectValue('width');\\n };\\n c3_chart_internal_fn.getParentHeight = function() {\\n var h = this.selectChart.style('height');\\n return h.indexOf('px') > 0 ? +h.replace('px', '') : 0;\\n };\\n\\n c3_chart_internal_fn.getSvgLeft = function(withoutRecompute) {\\n var $$ = this,\\n config = $$.config,\\n hasLeftAxisRect = config.axis_rotated || (!config.axis_rotated && !config.axis_y_inner),\\n leftAxisClass = config.axis_rotated ? CLASS.axisX : CLASS.axisY,\\n leftAxis = $$.main.select('.' + leftAxisClass).node(),\\n svgRect = leftAxis && hasLeftAxisRect ? leftAxis.getBoundingClientRect() : { right: 0 },\\n chartRect = $$.selectChart.node().getBoundingClientRect(),\\n hasArc = $$.hasArcType(),\\n svgLeft = svgRect.right - chartRect.left - (hasArc ? 0 : $$.getCurrentPaddingLeft(withoutRecompute));\\n return svgLeft > 0 ? svgLeft : 0;\\n };\\n\\n c3_chart_internal_fn.getAxisWidthByAxisId = function(id, withoutRecompute) {\\n var $$ = this,\\n position = $$.axis.getLabelPositionById(id);\\n return $$.axis.getMaxTickWidth(id, withoutRecompute) + (position.isInner ? 20 : 40);\\n };\\n c3_chart_internal_fn.getHorizontalAxisHeight = function(axisId) {\\n var $$ = this,\\n config = $$.config,\\n h = 30;\\n if (axisId === 'x' && !config.axis_x_show) {\\n return 8;\\n }\\n if (axisId === 'x' && config.axis_x_height) {\\n return config.axis_x_height;\\n }\\n if (axisId === 'y' && !config.axis_y_show) {\\n return config.legend_show && !$$.isLegendRight && !$$.isLegendInset ? 10 : 1;\\n }\\n if (axisId === 'y2' && !config.axis_y2_show) {\\n return $$.rotated_padding_top;\\n }\\n // Calculate x axis height when tick rotated\\n if (axisId === 'x' && !config.axis_rotated && config.axis_x_tick_rotate) {\\n h = 30 + $$.axis.getMaxTickWidth(axisId) * Math.cos((Math.PI * (90 - config.axis_x_tick_rotate)) / 180);\\n }\\n // Calculate y axis height when tick rotated\\n if (axisId === 'y' && config.axis_rotated && config.axis_y_tick_rotate) {\\n h = 30 + $$.axis.getMaxTickWidth(axisId) * Math.cos((Math.PI * (90 - config.axis_y_tick_rotate)) / 180);\\n }\\n return h + ($$.axis.getLabelPositionById(axisId).isInner ? 0 : 10) + (axisId === 'y2' ? -10 : 0);\\n };\\n\\n c3_chart_internal_fn.getEventRectWidth = function() {\\n return Math.max(0, this.xAxis.tickInterval());\\n };\\n\\n c3_chart_internal_fn.getShapeIndices = function(typeFilter) {\\n var $$ = this,\\n config = $$.config,\\n indices = {},\\n i = 0,\\n j,\\n k;\\n $$.filterTargetsToShow($$.data.targets.filter(typeFilter, $$)).forEach(function(d) {\\n for (j = 0; j < config.data_groups.length; j++) {\\n if (config.data_groups[j].indexOf(d.id) < 0) {\\n continue;\\n }\\n for (k = 0; k < config.data_groups[j].length; k++) {\\n if (config.data_groups[j][k] in indices) {\\n indices[d.id] = indices[config.data_groups[j][k]];\\n break;\\n }\\n }\\n }\\n if (isUndefined(indices[d.id])) {\\n indices[d.id] = i++;\\n }\\n });\\n indices.__max__ = i - 1;\\n return indices;\\n };\\n c3_chart_internal_fn.getShapeX = function(offset, targetsNum, indices, isSub) {\\n var $$ = this,\\n scale = isSub ? $$.subX : $$.x;\\n return function(d) {\\n var index = d.id in indices ? indices[d.id] : 0;\\n return d.x || d.x === 0 ? scale(d.x) - offset * (targetsNum / 2 - index) : 0;\\n };\\n };\\n c3_chart_internal_fn.getShapeY = function(isSub) {\\n var $$ = this;\\n return function(d) {\\n var scale = isSub ? $$.getSubYScale(d.id) : $$.getYScale(d.id);\\n return scale(d.value);\\n };\\n };\\n c3_chart_internal_fn.getShapeOffset = function(typeFilter, indices, isSub) {\\n var $$ = this,\\n targets = $$.orderTargets($$.filterTargetsToShow($$.data.targets.filter(typeFilter, $$))),\\n targetIds = targets.map(function(t) {\\n return t.id;\\n });\\n return function(d, i) {\\n var scale = isSub ? $$.getSubYScale(d.id) : $$.getYScale(d.id),\\n y0 = scale(0),\\n offset = y0;\\n targets.forEach(function(t) {\\n var values = $$.isStepType(d) ? $$.convertValuesToStep(t.values) : t.values;\\n if (t.id === d.id || indices[t.id] !== indices[d.id]) {\\n return;\\n }\\n if (targetIds.indexOf(t.id) < targetIds.indexOf(d.id)) {\\n // check if the x values line up\\n if (typeof values[i] === 'undefined' || +values[i].x !== +d.x) {\\n // \\\"+\\\" for timeseries\\n // if not, try to find the value that does line up\\n i = -1;\\n values.forEach(function(v, j) {\\n if (v.x === d.x) {\\n i = j;\\n }\\n });\\n }\\n if (i in values && values[i].value * d.value >= 0) {\\n offset += scale(values[i].value) - y0;\\n }\\n }\\n });\\n return offset;\\n };\\n };\\n c3_chart_internal_fn.isWithinShape = function(that, d) {\\n var $$ = this,\\n shape = $$.d3.select(that),\\n isWithin;\\n if (!$$.isTargetToShow(d.id)) {\\n isWithin = false;\\n } else if (that.nodeName === 'circle') {\\n isWithin = $$.isStepType(d)\\n ? $$.isWithinStep(that, $$.getYScale(d.id)(d.value))\\n : $$.isWithinCircle(that, $$.pointSelectR(d) * 1.5);\\n } else if (that.nodeName === 'path') {\\n isWithin = shape.classed(CLASS.bar) ? $$.isWithinBar(that) : true;\\n }\\n return isWithin;\\n };\\n\\n c3_chart_internal_fn.getInterpolate = function(d) {\\n var $$ = this,\\n interpolation = $$.isInterpolationType($$.config.spline_interpolation_type)\\n ? $$.config.spline_interpolation_type\\n : 'cardinal';\\n return $$.isSplineType(d) ? interpolation : $$.isStepType(d) ? $$.config.line_step_type : 'linear';\\n };\\n\\n c3_chart_internal_fn.initLine = function() {\\n var $$ = this;\\n $$.main\\n .select('.' + CLASS.chart)\\n .append('g')\\n .attr('class', CLASS.chartLines);\\n };\\n c3_chart_internal_fn.updateTargetsForLine = function(targets) {\\n var $$ = this,\\n config = $$.config,\\n mainLineUpdate,\\n mainLineEnter,\\n classChartLine = $$.classChartLine.bind($$),\\n classLines = $$.classLines.bind($$),\\n classAreas = $$.classAreas.bind($$),\\n classCircles = $$.classCircles.bind($$),\\n classFocus = $$.classFocus.bind($$);\\n mainLineUpdate = $$.main\\n .select('.' + CLASS.chartLines)\\n .selectAll('.' + CLASS.chartLine)\\n .data(targets)\\n .attr('class', function(d) {\\n return classChartLine(d) + classFocus(d);\\n });\\n mainLineEnter = mainLineUpdate\\n .enter()\\n .append('g')\\n .attr('class', classChartLine)\\n .style('opacity', 0)\\n .style('pointer-events', 'none');\\n // Lines for each data\\n mainLineEnter.append('g').attr('class', classLines);\\n // Areas\\n mainLineEnter.append('g').attr('class', classAreas);\\n // Circles for each data point on lines\\n mainLineEnter.append('g').attr('class', function(d) {\\n return $$.generateClass(CLASS.selectedCircles, d.id);\\n });\\n mainLineEnter\\n .append('g')\\n .attr('class', classCircles)\\n .style('cursor', function(d) {\\n return config.data_selection_isselectable(d) ? 'pointer' : null;\\n });\\n // Update date for selected circles\\n targets.forEach(function(t) {\\n $$.main\\n .selectAll('.' + CLASS.selectedCircles + $$.getTargetSelectorSuffix(t.id))\\n .selectAll('.' + CLASS.selectedCircle)\\n .each(function(d) {\\n d.value = t.values[d.index].value;\\n });\\n });\\n // MEMO: can not keep same color...\\n //mainLineUpdate.exit().remove();\\n };\\n c3_chart_internal_fn.updateLine = function(durationForExit) {\\n var $$ = this;\\n $$.mainLine = $$.main\\n .selectAll('.' + CLASS.lines)\\n .selectAll('.' + CLASS.line)\\n .data($$.lineData.bind($$));\\n $$.mainLine\\n .enter()\\n .append('path')\\n .attr('class', $$.classLine.bind($$))\\n .style('stroke', $$.color);\\n $$.mainLine\\n .style('opacity', $$.initialOpacity.bind($$))\\n .style('shape-rendering', function(d) {\\n return $$.isStepType(d) ? 'crispEdges' : '';\\n })\\n .attr('transform', null);\\n $$.mainLine\\n .exit()\\n .transition()\\n .duration(durationForExit)\\n .style('opacity', 0)\\n .remove();\\n };\\n c3_chart_internal_fn.redrawLine = function(drawLine, withTransition) {\\n return [\\n (withTransition ? this.mainLine.transition(Math.random().toString()) : this.mainLine)\\n .attr('d', drawLine)\\n .style('stroke', this.color)\\n .style('opacity', 1)\\n ];\\n };\\n c3_chart_internal_fn.generateDrawLine = function(lineIndices, isSub) {\\n var $$ = this,\\n config = $$.config,\\n line = $$.d3.svg.line(),\\n getPoints = $$.generateGetLinePoints(lineIndices, isSub),\\n yScaleGetter = isSub ? $$.getSubYScale : $$.getYScale,\\n xValue = function(d) {\\n return (isSub ? $$.subxx : $$.xx).call($$, d);\\n },\\n yValue = function(d, i) {\\n return config.data_groups.length > 0 ? getPoints(d, i)[0][1] : yScaleGetter.call($$, d.id)(d.value);\\n };\\n\\n line = config.axis_rotated ? line.x(yValue).y(xValue) : line.x(xValue).y(yValue);\\n if (!config.line_connectNull) {\\n line = line.defined(function(d) {\\n return d.value != null;\\n });\\n }\\n return function(d) {\\n var values = config.line_connectNull ? $$.filterRemoveNull(d.values) : d.values,\\n x = isSub ? $$.x : $$.subX,\\n y = yScaleGetter.call($$, d.id),\\n x0 = 0,\\n y0 = 0,\\n path;\\n if ($$.isLineType(d)) {\\n if (config.data_regions[d.id]) {\\n path = $$.lineWithRegions(values, x, y, config.data_regions[d.id]);\\n } else {\\n if ($$.isStepType(d)) {\\n values = $$.convertValuesToStep(values);\\n }\\n path = line.interpolate($$.getInterpolate(d))(values);\\n }\\n } else {\\n if (values[0]) {\\n x0 = x(values[0].x);\\n y0 = y(values[0].value);\\n }\\n path = config.axis_rotated ? 'M ' + y0 + ' ' + x0 : 'M ' + x0 + ' ' + y0;\\n }\\n return path ? path : 'M 0 0';\\n };\\n };\\n c3_chart_internal_fn.generateGetLinePoints = function(lineIndices, isSub) {\\n // partial duplication of generateGetBarPoints\\n var $$ = this,\\n config = $$.config,\\n lineTargetsNum = lineIndices.__max__ + 1,\\n x = $$.getShapeX(0, lineTargetsNum, lineIndices, !!isSub),\\n y = $$.getShapeY(!!isSub),\\n lineOffset = $$.getShapeOffset($$.isLineType, lineIndices, !!isSub),\\n yScale = isSub ? $$.getSubYScale : $$.getYScale;\\n return function(d, i) {\\n var y0 = yScale.call($$, d.id)(0),\\n offset = lineOffset(d, i) || y0, // offset is for stacked area chart\\n posX = x(d),\\n posY = y(d);\\n // fix posY not to overflow opposite quadrant\\n if (config.axis_rotated) {\\n if ((0 < d.value && posY < y0) || (d.value < 0 && y0 < posY)) {\\n posY = y0;\\n }\\n }\\n // 1 point that marks the line position\\n return [\\n [posX, posY - (y0 - offset)],\\n [posX, posY - (y0 - offset)], // needed for compatibility\\n [posX, posY - (y0 - offset)], // needed for compatibility\\n [posX, posY - (y0 - offset)] // needed for compatibility\\n ];\\n };\\n };\\n\\n c3_chart_internal_fn.lineWithRegions = function(d, x, y, _regions) {\\n var $$ = this,\\n config = $$.config,\\n prev = -1,\\n i,\\n j,\\n s = 'M',\\n sWithRegion,\\n xp,\\n yp,\\n dx,\\n dy,\\n dd,\\n diff,\\n diffx2,\\n xOffset = $$.isCategorized() ? 0.5 : 0,\\n xValue,\\n yValue,\\n regions = [];\\n\\n function isWithinRegions(x, regions) {\\n var i;\\n for (i = 0; i < regions.length; i++) {\\n if (regions[i].start < x && x <= regions[i].end) {\\n return true;\\n }\\n }\\n return false;\\n }\\n\\n // Check start/end of regions\\n if (isDefined(_regions)) {\\n for (i = 0; i < _regions.length; i++) {\\n regions[i] = {};\\n if (isUndefined(_regions[i].start)) {\\n regions[i].start = d[0].x;\\n } else {\\n regions[i].start = $$.isTimeSeries() ? $$.parseDate(_regions[i].start) : _regions[i].start;\\n }\\n if (isUndefined(_regions[i].end)) {\\n regions[i].end = d[d.length - 1].x;\\n } else {\\n regions[i].end = $$.isTimeSeries() ? $$.parseDate(_regions[i].end) : _regions[i].end;\\n }\\n }\\n }\\n\\n // Set scales\\n xValue = config.axis_rotated\\n ? function(d) {\\n return y(d.value);\\n }\\n : function(d) {\\n return x(d.x);\\n };\\n yValue = config.axis_rotated\\n ? function(d) {\\n return x(d.x);\\n }\\n : function(d) {\\n return y(d.value);\\n };\\n\\n // Define svg generator function for region\\n function generateM(points) {\\n return 'M' + points[0][0] + ' ' + points[0][1] + ' ' + points[1][0] + ' ' + points[1][1];\\n }\\n\\n if ($$.isTimeSeries()) {\\n sWithRegion = function(d0, d1, j, diff) {\\n var x0 = d0.x.getTime(),\\n x_diff = d1.x - d0.x,\\n xv0 = new Date(x0 + x_diff * j),\\n xv1 = new Date(x0 + x_diff * (j + diff)),\\n points;\\n if (config.axis_rotated) {\\n points = [[y(yp(j)), x(xv0)], [y(yp(j + diff)), x(xv1)]];\\n } else {\\n points = [[x(xv0), y(yp(j))], [x(xv1), y(yp(j + diff))]];\\n }\\n return generateM(points);\\n };\\n } else {\\n sWithRegion = function(d0, d1, j, diff) {\\n var points;\\n if (config.axis_rotated) {\\n points = [[y(yp(j), true), x(xp(j))], [y(yp(j + diff), true), x(xp(j + diff))]];\\n } else {\\n points = [[x(xp(j), true), y(yp(j))], [x(xp(j + diff), true), y(yp(j + diff))]];\\n }\\n return generateM(points);\\n };\\n }\\n\\n // Generate\\n for (i = 0; i < d.length; i++) {\\n // Draw as normal\\n if (isUndefined(regions) || !isWithinRegions(d[i].x, regions)) {\\n s += ' ' + xValue(d[i]) + ' ' + yValue(d[i]);\\n }\\n // Draw with region // TODO: Fix for horizotal charts\\n else {\\n xp = $$.getScale(d[i - 1].x + xOffset, d[i].x + xOffset, $$.isTimeSeries());\\n yp = $$.getScale(d[i - 1].value, d[i].value);\\n\\n dx = x(d[i].x) - x(d[i - 1].x);\\n dy = y(d[i].value) - y(d[i - 1].value);\\n dd = Math.sqrt(Math.pow(dx, 2) + Math.pow(dy, 2));\\n diff = 2 / dd;\\n diffx2 = diff * 2;\\n\\n for (j = diff; j <= 1; j += diffx2) {\\n s += sWithRegion(d[i - 1], d[i], j, diff);\\n }\\n }\\n prev = d[i].x;\\n }\\n\\n return s;\\n };\\n\\n c3_chart_internal_fn.updateArea = function(durationForExit) {\\n var $$ = this,\\n d3 = $$.d3;\\n $$.mainArea = $$.main\\n .selectAll('.' + CLASS.areas)\\n .selectAll('.' + CLASS.area)\\n .data($$.lineData.bind($$));\\n $$.mainArea\\n .enter()\\n .append('path')\\n .attr('class', $$.classArea.bind($$))\\n .style('fill', $$.color)\\n .style('opacity', function() {\\n $$.orgAreaOpacity = +d3.select(this).style('opacity');\\n return 0;\\n });\\n $$.mainArea.style('opacity', $$.orgAreaOpacity);\\n $$.mainArea\\n .exit()\\n .transition()\\n .duration(durationForExit)\\n .style('opacity', 0)\\n .remove();\\n };\\n c3_chart_internal_fn.redrawArea = function(drawArea, withTransition) {\\n return [\\n (withTransition ? this.mainArea.transition(Math.random().toString()) : this.mainArea)\\n .attr('d', drawArea)\\n .style('fill', this.color)\\n .style('opacity', this.orgAreaOpacity)\\n ];\\n };\\n c3_chart_internal_fn.generateDrawArea = function(areaIndices, isSub) {\\n var $$ = this,\\n config = $$.config,\\n area = $$.d3.svg.area(),\\n getPoints = $$.generateGetAreaPoints(areaIndices, isSub),\\n yScaleGetter = isSub ? $$.getSubYScale : $$.getYScale,\\n xValue = function(d) {\\n return (isSub ? $$.subxx : $$.xx).call($$, d);\\n },\\n value0 = function(d, i) {\\n return config.data_groups.length > 0\\n ? getPoints(d, i)[0][1]\\n : yScaleGetter.call($$, d.id)($$.getAreaBaseValue(d.id));\\n },\\n value1 = function(d, i) {\\n return config.data_groups.length > 0 ? getPoints(d, i)[1][1] : yScaleGetter.call($$, d.id)(d.value);\\n };\\n\\n area = config.axis_rotated\\n ? area\\n .x0(value0)\\n .x1(value1)\\n .y(xValue)\\n : area\\n .x(xValue)\\n .y0(config.area_above ? 0 : value0)\\n .y1(value1);\\n if (!config.line_connectNull) {\\n area = area.defined(function(d) {\\n return d.value !== null;\\n });\\n }\\n\\n return function(d) {\\n var values = config.line_connectNull ? $$.filterRemoveNull(d.values) : d.values,\\n x0 = 0,\\n y0 = 0,\\n path;\\n if ($$.isAreaType(d)) {\\n if ($$.isStepType(d)) {\\n values = $$.convertValuesToStep(values);\\n }\\n path = area.interpolate($$.getInterpolate(d))(values);\\n } else {\\n if (values[0]) {\\n x0 = $$.x(values[0].x);\\n y0 = $$.getYScale(d.id)(values[0].value);\\n }\\n path = config.axis_rotated ? 'M ' + y0 + ' ' + x0 : 'M ' + x0 + ' ' + y0;\\n }\\n return path ? path : 'M 0 0';\\n };\\n };\\n c3_chart_internal_fn.getAreaBaseValue = function() {\\n return 0;\\n };\\n c3_chart_internal_fn.generateGetAreaPoints = function(areaIndices, isSub) {\\n // partial duplication of generateGetBarPoints\\n var $$ = this,\\n config = $$.config,\\n areaTargetsNum = areaIndices.__max__ + 1,\\n x = $$.getShapeX(0, areaTargetsNum, areaIndices, !!isSub),\\n y = $$.getShapeY(!!isSub),\\n areaOffset = $$.getShapeOffset($$.isAreaType, areaIndices, !!isSub),\\n yScale = isSub ? $$.getSubYScale : $$.getYScale;\\n return function(d, i) {\\n var y0 = yScale.call($$, d.id)(0),\\n offset = areaOffset(d, i) || y0, // offset is for stacked area chart\\n posX = x(d),\\n posY = y(d);\\n // fix posY not to overflow opposite quadrant\\n if (config.axis_rotated) {\\n if ((0 < d.value && posY < y0) || (d.value < 0 && y0 < posY)) {\\n posY = y0;\\n }\\n }\\n // 1 point that marks the area position\\n return [\\n [posX, offset],\\n [posX, posY - (y0 - offset)],\\n [posX, posY - (y0 - offset)], // needed for compatibility\\n [posX, offset] // needed for compatibility\\n ];\\n };\\n };\\n\\n c3_chart_internal_fn.updateCircle = function() {\\n var $$ = this;\\n $$.mainCircle = $$.main\\n .selectAll('.' + CLASS.circles)\\n .selectAll('.' + CLASS.circle)\\n .data($$.lineOrScatterData.bind($$));\\n $$.mainCircle\\n .enter()\\n .append('circle')\\n .attr('class', $$.classCircle.bind($$))\\n .attr('r', $$.pointR.bind($$))\\n .style('fill', $$.color);\\n $$.mainCircle.style('opacity', $$.initialOpacityForCircle.bind($$));\\n $$.mainCircle.exit().remove();\\n };\\n c3_chart_internal_fn.redrawCircle = function(cx, cy, withTransition) {\\n var selectedCircles = this.main.selectAll('.' + CLASS.selectedCircle);\\n return [\\n (withTransition ? this.mainCircle.transition(Math.random().toString()) : this.mainCircle)\\n .style('opacity', this.opacityForCircle.bind(this))\\n .style('fill', this.color)\\n .attr('cx', cx)\\n .attr('cy', cy),\\n (withTransition ? selectedCircles.transition(Math.random().toString()) : selectedCircles)\\n .attr('cx', cx)\\n .attr('cy', cy)\\n ];\\n };\\n c3_chart_internal_fn.circleX = function(d) {\\n return d.x || d.x === 0 ? this.x(d.x) : null;\\n };\\n c3_chart_internal_fn.updateCircleY = function() {\\n var $$ = this,\\n lineIndices,\\n getPoints;\\n if ($$.config.data_groups.length > 0) {\\n (lineIndices = $$.getShapeIndices($$.isLineType)), (getPoints = $$.generateGetLinePoints(lineIndices));\\n $$.circleY = function(d, i) {\\n return getPoints(d, i)[0][1];\\n };\\n } else {\\n $$.circleY = function(d) {\\n return $$.getYScale(d.id)(d.value);\\n };\\n }\\n };\\n c3_chart_internal_fn.getCircles = function(i, id) {\\n var $$ = this;\\n return (id ? $$.main.selectAll('.' + CLASS.circles + $$.getTargetSelectorSuffix(id)) : $$.main).selectAll(\\n '.' + CLASS.circle + (isValue(i) ? '-' + i : '')\\n );\\n };\\n c3_chart_internal_fn.expandCircles = function(i, id, reset) {\\n var $$ = this,\\n r = $$.pointExpandedR.bind($$);\\n if (reset) {\\n $$.unexpandCircles();\\n }\\n $$.getCircles(i, id)\\n .classed(CLASS.EXPANDED, true)\\n .attr('r', r);\\n };\\n c3_chart_internal_fn.unexpandCircles = function(i) {\\n var $$ = this,\\n r = $$.pointR.bind($$);\\n $$.getCircles(i)\\n .filter(function() {\\n return $$.d3.select(this).classed(CLASS.EXPANDED);\\n })\\n .classed(CLASS.EXPANDED, false)\\n .attr('r', r);\\n };\\n c3_chart_internal_fn.pointR = function(d) {\\n var $$ = this,\\n config = $$.config;\\n return $$.isStepType(d) ? 0 : isFunction(config.point_r) ? config.point_r(d) : config.point_r;\\n };\\n c3_chart_internal_fn.pointExpandedR = function(d) {\\n var $$ = this,\\n config = $$.config;\\n return config.point_focus_expand_enabled\\n ? config.point_focus_expand_r\\n ? config.point_focus_expand_r\\n : $$.pointR(d) * 1.75\\n : $$.pointR(d);\\n };\\n c3_chart_internal_fn.pointSelectR = function(d) {\\n var $$ = this,\\n config = $$.config;\\n return isFunction(config.point_select_r)\\n ? config.point_select_r(d)\\n : config.point_select_r\\n ? config.point_select_r\\n : $$.pointR(d) * 4;\\n };\\n c3_chart_internal_fn.isWithinCircle = function(that, r) {\\n var d3 = this.d3,\\n mouse = d3.mouse(that),\\n d3_this = d3.select(that),\\n cx = +d3_this.attr('cx'),\\n cy = +d3_this.attr('cy');\\n return Math.sqrt(Math.pow(cx - mouse[0], 2) + Math.pow(cy - mouse[1], 2)) < r;\\n };\\n c3_chart_internal_fn.isWithinStep = function(that, y) {\\n return Math.abs(y - this.d3.mouse(that)[1]) < 30;\\n };\\n\\n c3_chart_internal_fn.initBar = function() {\\n var $$ = this;\\n $$.main\\n .select('.' + CLASS.chart)\\n .append('g')\\n .attr('class', CLASS.chartBars);\\n };\\n c3_chart_internal_fn.updateTargetsForBar = function(targets) {\\n var $$ = this,\\n config = $$.config,\\n mainBarUpdate,\\n mainBarEnter,\\n classChartBar = $$.classChartBar.bind($$),\\n classBars = $$.classBars.bind($$),\\n classFocus = $$.classFocus.bind($$);\\n mainBarUpdate = $$.main\\n .select('.' + CLASS.chartBars)\\n .selectAll('.' + CLASS.chartBar)\\n .data(targets)\\n .attr('class', function(d) {\\n return classChartBar(d) + classFocus(d);\\n });\\n mainBarEnter = mainBarUpdate\\n .enter()\\n .append('g')\\n .attr('class', classChartBar)\\n .style('opacity', 0)\\n .style('pointer-events', 'none');\\n // Bars for each data\\n mainBarEnter\\n .append('g')\\n .attr('class', classBars)\\n .style('cursor', function(d) {\\n return config.data_selection_isselectable(d) ? 'pointer' : null;\\n });\\n };\\n c3_chart_internal_fn.updateBar = function(durationForExit) {\\n var $$ = this,\\n barData = $$.barData.bind($$),\\n classBar = $$.classBar.bind($$),\\n initialOpacity = $$.initialOpacity.bind($$),\\n color = function(d) {\\n return $$.color(d.id);\\n };\\n $$.mainBar = $$.main\\n .selectAll('.' + CLASS.bars)\\n .selectAll('.' + CLASS.bar)\\n .data(barData);\\n $$.mainBar\\n .enter()\\n .append('path')\\n .attr('class', classBar)\\n .style('stroke', color)\\n .style('fill', color);\\n $$.mainBar.style('opacity', initialOpacity);\\n $$.mainBar\\n .exit()\\n .transition()\\n .duration(durationForExit)\\n .style('opacity', 0)\\n .remove();\\n };\\n c3_chart_internal_fn.redrawBar = function(drawBar, withTransition) {\\n return [\\n (withTransition ? this.mainBar.transition(Math.random().toString()) : this.mainBar)\\n .attr('d', drawBar)\\n .style('fill', this.color)\\n .style('opacity', 1)\\n ];\\n };\\n c3_chart_internal_fn.getBarW = function(axis, barTargetsNum) {\\n var $$ = this,\\n config = $$.config,\\n w =\\n typeof config.bar_width === 'number'\\n ? config.bar_width\\n : barTargetsNum\\n ? (axis.tickInterval() * config.bar_width_ratio) / barTargetsNum\\n : 0;\\n return config.bar_width_max && w > config.bar_width_max ? config.bar_width_max : w;\\n };\\n c3_chart_internal_fn.getBars = function(i, id) {\\n var $$ = this;\\n return (id ? $$.main.selectAll('.' + CLASS.bars + $$.getTargetSelectorSuffix(id)) : $$.main).selectAll(\\n '.' + CLASS.bar + (isValue(i) ? '-' + i : '')\\n );\\n };\\n c3_chart_internal_fn.expandBars = function(i, id, reset) {\\n var $$ = this;\\n if (reset) {\\n $$.unexpandBars();\\n }\\n $$.getBars(i, id).classed(CLASS.EXPANDED, true);\\n };\\n c3_chart_internal_fn.unexpandBars = function(i) {\\n var $$ = this;\\n $$.getBars(i).classed(CLASS.EXPANDED, false);\\n };\\n c3_chart_internal_fn.generateDrawBar = function(barIndices, isSub) {\\n var $$ = this,\\n config = $$.config,\\n getPoints = $$.generateGetBarPoints(barIndices, isSub);\\n return function(d, i) {\\n // 4 points that make a bar\\n var points = getPoints(d, i);\\n\\n // switch points if axis is rotated, not applicable for sub chart\\n var indexX = config.axis_rotated ? 1 : 0;\\n var indexY = config.axis_rotated ? 0 : 1;\\n\\n var path =\\n 'M ' +\\n points[0][indexX] +\\n ',' +\\n points[0][indexY] +\\n ' ' +\\n 'L' +\\n points[1][indexX] +\\n ',' +\\n points[1][indexY] +\\n ' ' +\\n 'L' +\\n points[2][indexX] +\\n ',' +\\n points[2][indexY] +\\n ' ' +\\n 'L' +\\n points[3][indexX] +\\n ',' +\\n points[3][indexY] +\\n ' ' +\\n 'z';\\n\\n return path;\\n };\\n };\\n c3_chart_internal_fn.generateGetBarPoints = function(barIndices, isSub) {\\n var $$ = this,\\n axis = isSub ? $$.subXAxis : $$.xAxis,\\n barTargetsNum = barIndices.__max__ + 1,\\n barW = $$.getBarW(axis, barTargetsNum),\\n barX = $$.getShapeX(barW, barTargetsNum, barIndices, !!isSub),\\n barY = $$.getShapeY(!!isSub),\\n barOffset = $$.getShapeOffset($$.isBarType, barIndices, !!isSub),\\n yScale = isSub ? $$.getSubYScale : $$.getYScale;\\n return function(d, i) {\\n var y0 = yScale.call($$, d.id)(0),\\n offset = barOffset(d, i) || y0, // offset is for stacked bar chart\\n posX = barX(d),\\n posY = barY(d);\\n // fix posY not to overflow opposite quadrant\\n if ($$.config.axis_rotated) {\\n if ((0 < d.value && posY < y0) || (d.value < 0 && y0 < posY)) {\\n posY = y0;\\n }\\n }\\n // 4 points that make a bar\\n return [[posX, offset], [posX, posY - (y0 - offset)], [posX + barW, posY - (y0 - offset)], [posX + barW, offset]];\\n };\\n };\\n c3_chart_internal_fn.isWithinBar = function(that) {\\n var mouse = this.d3.mouse(that),\\n box = that.getBoundingClientRect(),\\n seg0 = that.pathSegList.getItem(0),\\n seg1 = that.pathSegList.getItem(1),\\n x = Math.min(seg0.x, seg1.x),\\n y = Math.min(seg0.y, seg1.y),\\n w = box.width,\\n h = box.height,\\n offset = 2,\\n sx = x - offset,\\n ex = x + w + offset,\\n sy = y + h + offset,\\n ey = y - offset;\\n return sx < mouse[0] && mouse[0] < ex && ey < mouse[1] && mouse[1] < sy;\\n };\\n\\n c3_chart_internal_fn.initText = function() {\\n var $$ = this;\\n $$.main\\n .select('.' + CLASS.chart)\\n .append('g')\\n .attr('class', CLASS.chartTexts);\\n $$.mainText = $$.d3.selectAll([]);\\n };\\n c3_chart_internal_fn.updateTargetsForText = function(targets) {\\n var $$ = this,\\n mainTextUpdate,\\n mainTextEnter,\\n classChartText = $$.classChartText.bind($$),\\n classTexts = $$.classTexts.bind($$),\\n classFocus = $$.classFocus.bind($$);\\n mainTextUpdate = $$.main\\n .select('.' + CLASS.chartTexts)\\n .selectAll('.' + CLASS.chartText)\\n .data(targets)\\n .attr('class', function(d) {\\n return classChartText(d) + classFocus(d);\\n });\\n mainTextEnter = mainTextUpdate\\n .enter()\\n .append('g')\\n .attr('class', classChartText)\\n .style('opacity', 0)\\n .style('pointer-events', 'none');\\n mainTextEnter.append('g').attr('class', classTexts);\\n };\\n c3_chart_internal_fn.updateText = function(durationForExit) {\\n var $$ = this,\\n config = $$.config,\\n barOrLineData = $$.barOrLineData.bind($$),\\n classText = $$.classText.bind($$);\\n $$.mainText = $$.main\\n .selectAll('.' + CLASS.texts)\\n .selectAll('.' + CLASS.text)\\n .data(barOrLineData);\\n $$.mainText\\n .enter()\\n .append('text')\\n .attr('class', classText)\\n .attr('text-anchor', function(d) {\\n return config.axis_rotated ? (d.value < 0 ? 'end' : 'start') : 'middle';\\n })\\n .style('stroke', 'none')\\n .style('fill', function(d) {\\n return $$.color(d);\\n })\\n .style('fill-opacity', 0);\\n $$.mainText.text(function(d, i, j) {\\n return $$.dataLabelFormat(d.id)(d.value, d.id, i, j);\\n });\\n $$.mainText\\n .exit()\\n .transition()\\n .duration(durationForExit)\\n .style('fill-opacity', 0)\\n .remove();\\n };\\n c3_chart_internal_fn.redrawText = function(xForText, yForText, forFlow, withTransition) {\\n return [\\n (withTransition ? this.mainText.transition() : this.mainText)\\n .attr('x', xForText)\\n .attr('y', yForText)\\n .style('fill', this.color)\\n .style('fill-opacity', forFlow ? 0 : this.opacityForText.bind(this))\\n ];\\n };\\n c3_chart_internal_fn.getTextRect = function(text, cls, element) {\\n var dummy = this.d3\\n .select('body')\\n .append('div')\\n .classed('c3', true),\\n svg = dummy\\n .append('svg')\\n .style('visibility', 'hidden')\\n .style('position', 'fixed')\\n .style('top', 0)\\n .style('left', 0),\\n font = this.d3.select(element).style('font'),\\n rect;\\n svg\\n .selectAll('.dummy')\\n .data([text])\\n .enter()\\n .append('text')\\n .classed(cls ? cls : '', true)\\n .style('font', font)\\n .text(text)\\n .each(function() {\\n rect = this.getBoundingClientRect();\\n });\\n dummy.remove();\\n return rect;\\n };\\n c3_chart_internal_fn.generateXYForText = function(areaIndices, barIndices, lineIndices, forX) {\\n var $$ = this,\\n getAreaPoints = $$.generateGetAreaPoints(areaIndices, false),\\n getBarPoints = $$.generateGetBarPoints(barIndices, false),\\n getLinePoints = $$.generateGetLinePoints(lineIndices, false),\\n getter = forX ? $$.getXForText : $$.getYForText;\\n return function(d, i) {\\n var getPoints = $$.isAreaType(d) ? getAreaPoints : $$.isBarType(d) ? getBarPoints : getLinePoints;\\n return getter.call($$, getPoints(d, i), d, this);\\n };\\n };\\n c3_chart_internal_fn.getXForText = function(points, d, textElement) {\\n var $$ = this,\\n box = textElement.getBoundingClientRect(),\\n xPos,\\n padding;\\n if ($$.config.axis_rotated) {\\n padding = $$.isBarType(d) ? 4 : 6;\\n xPos = points[2][1] + padding * (d.value < 0 ? -1 : 1);\\n } else {\\n xPos = $$.hasType('bar') ? (points[2][0] + points[0][0]) / 2 : points[0][0];\\n }\\n // show labels regardless of the domain if value is null\\n if (d.value === null) {\\n if (xPos > $$.width) {\\n xPos = $$.width - box.width;\\n } else if (xPos < 0) {\\n xPos = 4;\\n }\\n }\\n return xPos;\\n };\\n c3_chart_internal_fn.getYForText = function(points, d, textElement) {\\n var $$ = this,\\n box = textElement.getBoundingClientRect(),\\n yPos;\\n if ($$.config.axis_rotated) {\\n yPos = (points[0][0] + points[2][0] + box.height * 0.6) / 2;\\n } else {\\n yPos = points[2][1];\\n if (d.value < 0 || (d.value === 0 && !$$.hasPositiveValue)) {\\n yPos += box.height;\\n if ($$.isBarType(d) && $$.isSafari()) {\\n yPos -= 3;\\n } else if (!$$.isBarType(d) && $$.isChrome()) {\\n yPos += 3;\\n }\\n } else {\\n yPos += $$.isBarType(d) ? -3 : -6;\\n }\\n }\\n // show labels regardless of the domain if value is null\\n if (d.value === null && !$$.config.axis_rotated) {\\n if (yPos < box.height) {\\n yPos = box.height;\\n } else if (yPos > this.height) {\\n yPos = this.height - 4;\\n }\\n }\\n return yPos;\\n };\\n\\n c3_chart_internal_fn.setTargetType = function(targetIds, type) {\\n var $$ = this,\\n config = $$.config;\\n $$.mapToTargetIds(targetIds).forEach(function(id) {\\n $$.withoutFadeIn[id] = type === config.data_types[id];\\n config.data_types[id] = type;\\n });\\n if (!targetIds) {\\n config.data_type = type;\\n }\\n };\\n c3_chart_internal_fn.hasType = function(type, targets) {\\n var $$ = this,\\n types = $$.config.data_types,\\n has = false;\\n targets = targets || $$.data.targets;\\n if (targets && targets.length) {\\n targets.forEach(function(target) {\\n var t = types[target.id];\\n if ((t && t.indexOf(type) >= 0) || (!t && type === 'line')) {\\n has = true;\\n }\\n });\\n } else if (Object.keys(types).length) {\\n Object.keys(types).forEach(function(id) {\\n if (types[id] === type) {\\n has = true;\\n }\\n });\\n } else {\\n has = $$.config.data_type === type;\\n }\\n return has;\\n };\\n c3_chart_internal_fn.hasArcType = function(targets) {\\n return this.hasType('pie', targets) || this.hasType('donut', targets) || this.hasType('gauge', targets);\\n };\\n c3_chart_internal_fn.isLineType = function(d) {\\n var config = this.config,\\n id = isString(d) ? d : d.id;\\n return (\\n !config.data_types[id] ||\\n ['line', 'spline', 'area', 'area-spline', 'step', 'area-step'].indexOf(config.data_types[id]) >= 0\\n );\\n };\\n c3_chart_internal_fn.isStepType = function(d) {\\n var id = isString(d) ? d : d.id;\\n return ['step', 'area-step'].indexOf(this.config.data_types[id]) >= 0;\\n };\\n c3_chart_internal_fn.isSplineType = function(d) {\\n var id = isString(d) ? d : d.id;\\n return ['spline', 'area-spline'].indexOf(this.config.data_types[id]) >= 0;\\n };\\n c3_chart_internal_fn.isAreaType = function(d) {\\n var id = isString(d) ? d : d.id;\\n return ['area', 'area-spline', 'area-step'].indexOf(this.config.data_types[id]) >= 0;\\n };\\n c3_chart_internal_fn.isBarType = function(d) {\\n var id = isString(d) ? d : d.id;\\n return this.config.data_types[id] === 'bar';\\n };\\n c3_chart_internal_fn.isScatterType = function(d) {\\n var id = isString(d) ? d : d.id;\\n return this.config.data_types[id] === 'scatter';\\n };\\n c3_chart_internal_fn.isPieType = function(d) {\\n var id = isString(d) ? d : d.id;\\n return this.config.data_types[id] === 'pie';\\n };\\n c3_chart_internal_fn.isGaugeType = function(d) {\\n var id = isString(d) ? d : d.id;\\n return this.config.data_types[id] === 'gauge';\\n };\\n c3_chart_internal_fn.isDonutType = function(d) {\\n var id = isString(d) ? d : d.id;\\n return this.config.data_types[id] === 'donut';\\n };\\n c3_chart_internal_fn.isArcType = function(d) {\\n return this.isPieType(d) || this.isDonutType(d) || this.isGaugeType(d);\\n };\\n c3_chart_internal_fn.lineData = function(d) {\\n return this.isLineType(d) ? [d] : [];\\n };\\n c3_chart_internal_fn.arcData = function(d) {\\n return this.isArcType(d.data) ? [d] : [];\\n };\\n /* not used\\n function scatterData(d) {\\n return isScatterType(d) ? d.values : [];\\n }\\n */\\n c3_chart_internal_fn.barData = function(d) {\\n return this.isBarType(d) ? d.values : [];\\n };\\n c3_chart_internal_fn.lineOrScatterData = function(d) {\\n return this.isLineType(d) || this.isScatterType(d) ? d.values : [];\\n };\\n c3_chart_internal_fn.barOrLineData = function(d) {\\n return this.isBarType(d) || this.isLineType(d) ? d.values : [];\\n };\\n c3_chart_internal_fn.isInterpolationType = function(type) {\\n return (\\n [\\n 'linear',\\n 'linear-closed',\\n 'basis',\\n 'basis-open',\\n 'basis-closed',\\n 'bundle',\\n 'cardinal',\\n 'cardinal-open',\\n 'cardinal-closed',\\n 'monotone'\\n ].indexOf(type) >= 0\\n );\\n };\\n\\n c3_chart_internal_fn.initGrid = function() {\\n var $$ = this,\\n config = $$.config,\\n d3 = $$.d3;\\n $$.grid = $$.main\\n .append('g')\\n .attr('clip-path', $$.clipPathForGrid)\\n .attr('class', CLASS.grid);\\n if (config.grid_x_show) {\\n $$.grid.append('g').attr('class', CLASS.xgrids);\\n }\\n if (config.grid_y_show) {\\n $$.grid.append('g').attr('class', CLASS.ygrids);\\n }\\n if (config.grid_focus_show) {\\n $$.grid\\n .append('g')\\n .attr('class', CLASS.xgridFocus)\\n .append('line')\\n .attr('class', CLASS.xgridFocus);\\n }\\n $$.xgrid = d3.selectAll([]);\\n if (!config.grid_lines_front) {\\n $$.initGridLines();\\n }\\n };\\n c3_chart_internal_fn.initGridLines = function() {\\n var $$ = this,\\n d3 = $$.d3;\\n $$.gridLines = $$.main\\n .append('g')\\n .attr('clip-path', $$.clipPathForGrid)\\n .attr('class', CLASS.grid + ' ' + CLASS.gridLines);\\n $$.gridLines.append('g').attr('class', CLASS.xgridLines);\\n $$.gridLines.append('g').attr('class', CLASS.ygridLines);\\n $$.xgridLines = d3.selectAll([]);\\n };\\n c3_chart_internal_fn.updateXGrid = function(withoutUpdate) {\\n var $$ = this,\\n config = $$.config,\\n d3 = $$.d3,\\n xgridData = $$.generateGridData(config.grid_x_type, $$.x),\\n tickOffset = $$.isCategorized() ? $$.xAxis.tickOffset() : 0;\\n\\n $$.xgridAttr = config.axis_rotated\\n ? {\\n x1: 0,\\n x2: $$.width,\\n y1: function(d) {\\n return $$.x(d) - tickOffset;\\n },\\n y2: function(d) {\\n return $$.x(d) - tickOffset;\\n }\\n }\\n : {\\n x1: function(d) {\\n return $$.x(d) + tickOffset;\\n },\\n x2: function(d) {\\n return $$.x(d) + tickOffset;\\n },\\n y1: 0,\\n y2: $$.height\\n };\\n\\n $$.xgrid = $$.main\\n .select('.' + CLASS.xgrids)\\n .selectAll('.' + CLASS.xgrid)\\n .data(xgridData);\\n $$.xgrid\\n .enter()\\n .append('line')\\n .attr('class', CLASS.xgrid);\\n if (!withoutUpdate) {\\n $$.xgrid.attr($$.xgridAttr).style('opacity', function() {\\n return +d3.select(this).attr(config.axis_rotated ? 'y1' : 'x1') === (config.axis_rotated ? $$.height : 0)\\n ? 0\\n : 1;\\n });\\n }\\n $$.xgrid.exit().remove();\\n };\\n\\n c3_chart_internal_fn.updateYGrid = function() {\\n var $$ = this,\\n config = $$.config,\\n gridValues = $$.yAxis.tickValues() || $$.y.ticks(config.grid_y_ticks);\\n $$.ygrid = $$.main\\n .select('.' + CLASS.ygrids)\\n .selectAll('.' + CLASS.ygrid)\\n .data(gridValues);\\n $$.ygrid\\n .enter()\\n .append('line')\\n .attr('class', CLASS.ygrid);\\n $$.ygrid\\n .attr('x1', config.axis_rotated ? $$.y : 0)\\n .attr('x2', config.axis_rotated ? $$.y : $$.width)\\n .attr('y1', config.axis_rotated ? 0 : $$.y)\\n .attr('y2', config.axis_rotated ? $$.height : $$.y);\\n $$.ygrid.exit().remove();\\n $$.smoothLines($$.ygrid, 'grid');\\n };\\n\\n c3_chart_internal_fn.gridTextAnchor = function(d) {\\n return d.position ? d.position : 'end';\\n };\\n c3_chart_internal_fn.gridTextDx = function(d) {\\n return d.position === 'start' ? 4 : d.position === 'middle' ? 0 : -4;\\n };\\n c3_chart_internal_fn.xGridTextX = function(d) {\\n return d.position === 'start' ? -this.height : d.position === 'middle' ? -this.height / 2 : 0;\\n };\\n c3_chart_internal_fn.yGridTextX = function(d) {\\n return d.position === 'start' ? 0 : d.position === 'middle' ? this.width / 2 : this.width;\\n };\\n c3_chart_internal_fn.updateGrid = function(duration) {\\n var $$ = this,\\n main = $$.main,\\n config = $$.config,\\n xgridLine,\\n ygridLine,\\n yv;\\n\\n // hide if arc type\\n $$.grid.style('visibility', $$.hasArcType() ? 'hidden' : 'visible');\\n\\n main.select('line.' + CLASS.xgridFocus).style('visibility', 'hidden');\\n if (config.grid_x_show) {\\n $$.updateXGrid();\\n }\\n $$.xgridLines = main\\n .select('.' + CLASS.xgridLines)\\n .selectAll('.' + CLASS.xgridLine)\\n .data(config.grid_x_lines);\\n // enter\\n xgridLine = $$.xgridLines\\n .enter()\\n .append('g')\\n .attr('class', function(d) {\\n return CLASS.xgridLine + (d['class'] ? ' ' + d['class'] : '');\\n });\\n xgridLine.append('line').style('opacity', 0);\\n xgridLine\\n .append('text')\\n .attr('text-anchor', $$.gridTextAnchor)\\n .attr('transform', config.axis_rotated ? '' : 'rotate(-90)')\\n .attr('dx', $$.gridTextDx)\\n .attr('dy', -5)\\n .style('opacity', 0);\\n // udpate\\n // done in d3.transition() of the end of this function\\n // exit\\n $$.xgridLines\\n .exit()\\n .transition()\\n .duration(duration)\\n .style('opacity', 0)\\n .remove();\\n\\n // Y-Grid\\n if (config.grid_y_show) {\\n $$.updateYGrid();\\n }\\n $$.ygridLines = main\\n .select('.' + CLASS.ygridLines)\\n .selectAll('.' + CLASS.ygridLine)\\n .data(config.grid_y_lines);\\n // enter\\n ygridLine = $$.ygridLines\\n .enter()\\n .append('g')\\n .attr('class', function(d) {\\n return CLASS.ygridLine + (d['class'] ? ' ' + d['class'] : '');\\n });\\n ygridLine.append('line').style('opacity', 0);\\n ygridLine\\n .append('text')\\n .attr('text-anchor', $$.gridTextAnchor)\\n .attr('transform', config.axis_rotated ? 'rotate(-90)' : '')\\n .attr('dx', $$.gridTextDx)\\n .attr('dy', -5)\\n .style('opacity', 0);\\n // update\\n yv = $$.yv.bind($$);\\n $$.ygridLines\\n .select('line')\\n .transition()\\n .duration(duration)\\n .attr('x1', config.axis_rotated ? yv : 0)\\n .attr('x2', config.axis_rotated ? yv : $$.width)\\n .attr('y1', config.axis_rotated ? 0 : yv)\\n .attr('y2', config.axis_rotated ? $$.height : yv)\\n .style('opacity', 1);\\n $$.ygridLines\\n .select('text')\\n .transition()\\n .duration(duration)\\n .attr('x', config.axis_rotated ? $$.xGridTextX.bind($$) : $$.yGridTextX.bind($$))\\n .attr('y', yv)\\n .text(function(d) {\\n return d.text;\\n })\\n .style('opacity', 1);\\n // exit\\n $$.ygridLines\\n .exit()\\n .transition()\\n .duration(duration)\\n .style('opacity', 0)\\n .remove();\\n };\\n c3_chart_internal_fn.redrawGrid = function(withTransition) {\\n var $$ = this,\\n config = $$.config,\\n xv = $$.xv.bind($$),\\n lines = $$.xgridLines.select('line'),\\n texts = $$.xgridLines.select('text');\\n return [\\n (withTransition ? lines.transition() : lines)\\n .attr('x1', config.axis_rotated ? 0 : xv)\\n .attr('x2', config.axis_rotated ? $$.width : xv)\\n .attr('y1', config.axis_rotated ? xv : 0)\\n .attr('y2', config.axis_rotated ? xv : $$.height)\\n .style('opacity', 1),\\n (withTransition ? texts.transition() : texts)\\n .attr('x', config.axis_rotated ? $$.yGridTextX.bind($$) : $$.xGridTextX.bind($$))\\n .attr('y', xv)\\n .text(function(d) {\\n return d.text;\\n })\\n .style('opacity', 1)\\n ];\\n };\\n c3_chart_internal_fn.showXGridFocus = function(selectedData) {\\n var $$ = this,\\n config = $$.config,\\n dataToShow = selectedData.filter(function(d) {\\n return d && isValue(d.value);\\n }),\\n focusEl = $$.main.selectAll('line.' + CLASS.xgridFocus),\\n xx = $$.xx.bind($$);\\n if (!config.tooltip_show) {\\n return;\\n }\\n // Hide when scatter plot exists\\n if ($$.hasType('scatter') || $$.hasArcType()) {\\n return;\\n }\\n focusEl\\n .style('visibility', 'visible')\\n .data([dataToShow[0]])\\n .attr(config.axis_rotated ? 'y1' : 'x1', xx)\\n .attr(config.axis_rotated ? 'y2' : 'x2', xx);\\n $$.smoothLines(focusEl, 'grid');\\n };\\n c3_chart_internal_fn.hideXGridFocus = function() {\\n this.main.select('line.' + CLASS.xgridFocus).style('visibility', 'hidden');\\n };\\n c3_chart_internal_fn.updateXgridFocus = function() {\\n var $$ = this,\\n config = $$.config;\\n $$.main\\n .select('line.' + CLASS.xgridFocus)\\n .attr('x1', config.axis_rotated ? 0 : -10)\\n .attr('x2', config.axis_rotated ? $$.width : -10)\\n .attr('y1', config.axis_rotated ? -10 : 0)\\n .attr('y2', config.axis_rotated ? -10 : $$.height);\\n };\\n c3_chart_internal_fn.generateGridData = function(type, scale) {\\n var $$ = this,\\n gridData = [],\\n xDomain,\\n firstYear,\\n lastYear,\\n i,\\n tickNum = $$.main\\n .select('.' + CLASS.axisX)\\n .selectAll('.tick')\\n .size();\\n if (type === 'year') {\\n xDomain = $$.getXDomain();\\n firstYear = xDomain[0].getFullYear();\\n lastYear = xDomain[1].getFullYear();\\n for (i = firstYear; i <= lastYear; i++) {\\n gridData.push(new Date(i + '-01-01 00:00:00'));\\n }\\n } else {\\n gridData = scale.ticks(10);\\n if (gridData.length > tickNum) {\\n // use only int\\n gridData = gridData.filter(function(d) {\\n return ('' + d).indexOf('.') < 0;\\n });\\n }\\n }\\n return gridData;\\n };\\n c3_chart_internal_fn.getGridFilterToRemove = function(params) {\\n return params\\n ? function(line) {\\n var found = false;\\n [].concat(params).forEach(function(param) {\\n if (\\n ('value' in param && line.value === param.value) ||\\n ('class' in param && line['class'] === param['class'])\\n ) {\\n found = true;\\n }\\n });\\n return found;\\n }\\n : function() {\\n return true;\\n };\\n };\\n c3_chart_internal_fn.removeGridLines = function(params, forX) {\\n var $$ = this,\\n config = $$.config,\\n toRemove = $$.getGridFilterToRemove(params),\\n toShow = function(line) {\\n return !toRemove(line);\\n },\\n classLines = forX ? CLASS.xgridLines : CLASS.ygridLines,\\n classLine = forX ? CLASS.xgridLine : CLASS.ygridLine;\\n $$.main\\n .select('.' + classLines)\\n .selectAll('.' + classLine)\\n .filter(toRemove)\\n .transition()\\n .duration(config.transition_duration)\\n .style('opacity', 0)\\n .remove();\\n if (forX) {\\n config.grid_x_lines = config.grid_x_lines.filter(toShow);\\n } else {\\n config.grid_y_lines = config.grid_y_lines.filter(toShow);\\n }\\n };\\n\\n c3_chart_internal_fn.initTooltip = function() {\\n var $$ = this,\\n config = $$.config,\\n i;\\n $$.tooltip = $$.selectChart\\n .style('position', 'relative')\\n .append('div')\\n .attr('class', CLASS.tooltipContainer)\\n .style('position', 'absolute')\\n .style('pointer-events', 'none')\\n .style('display', 'none');\\n // Show tooltip if needed\\n if (config.tooltip_init_show) {\\n if ($$.isTimeSeries() && isString(config.tooltip_init_x)) {\\n config.tooltip_init_x = $$.parseDate(config.tooltip_init_x);\\n for (i = 0; i < $$.data.targets[0].values.length; i++) {\\n if ($$.data.targets[0].values[i].x - config.tooltip_init_x === 0) {\\n break;\\n }\\n }\\n config.tooltip_init_x = i;\\n }\\n $$.tooltip.html(\\n config.tooltip_contents.call(\\n $$,\\n $$.data.targets.map(function(d) {\\n return $$.addName(d.values[config.tooltip_init_x]);\\n }),\\n $$.axis.getXAxisTickFormat(),\\n $$.getYFormat($$.hasArcType()),\\n $$.color\\n )\\n );\\n $$.tooltip\\n .style('top', config.tooltip_init_position.top)\\n .style('left', config.tooltip_init_position.left)\\n .style('display', 'block');\\n }\\n };\\n c3_chart_internal_fn.getTooltipContent = function(d, defaultTitleFormat, defaultValueFormat, color) {\\n var $$ = this,\\n config = $$.config,\\n titleFormat = config.tooltip_format_title || defaultTitleFormat,\\n nameFormat =\\n config.tooltip_format_name ||\\n function(name) {\\n return name;\\n },\\n valueFormat = config.tooltip_format_value || defaultValueFormat,\\n text,\\n i,\\n title,\\n value,\\n name,\\n bgcolor,\\n orderAsc = $$.isOrderAsc();\\n\\n if (config.data_groups.length === 0) {\\n d.sort(function(a, b) {\\n var v1 = a ? a.value : null,\\n v2 = b ? b.value : null;\\n return orderAsc ? v1 - v2 : v2 - v1;\\n });\\n } else {\\n var ids = $$.orderTargets($$.data.targets).map(function(i) {\\n return i.id;\\n });\\n d.sort(function(a, b) {\\n var v1 = a ? a.value : null,\\n v2 = b ? b.value : null;\\n if (v1 > 0 && v2 > 0) {\\n v1 = a ? ids.indexOf(a.id) : null;\\n v2 = b ? ids.indexOf(b.id) : null;\\n }\\n return orderAsc ? v1 - v2 : v2 - v1;\\n });\\n }\\n\\n for (i = 0; i < d.length; i++) {\\n if (!(d[i] && (d[i].value || d[i].value === 0))) {\\n continue;\\n }\\n\\n if (!text) {\\n title = sanitise(titleFormat ? titleFormat(d[i].x) : d[i].x);\\n text =\\n \\\"<table class='\\\" +\\n $$.CLASS.tooltip +\\n \\\"'>\\\" +\\n (title || title === 0 ? \\\"<tr><th colspan='2'>\\\" + title + '</th></tr>' : '');\\n }\\n\\n value = sanitise(valueFormat(d[i].value, d[i].ratio, d[i].id, d[i].index, d));\\n if (value !== undefined) {\\n // Skip elements when their name is set to null\\n if (d[i].name === null) {\\n continue;\\n }\\n name = sanitise(nameFormat(d[i].name, d[i].ratio, d[i].id, d[i].index));\\n bgcolor = $$.levelColor ? $$.levelColor(d[i].value) : color(d[i].id);\\n\\n text += \\\"<tr class='\\\" + $$.CLASS.tooltipName + '-' + $$.getTargetSelectorSuffix(d[i].id) + \\\"'>\\\";\\n text += \\\"<td class='name'><span style='background-color:\\\" + bgcolor + \\\"'></span>\\\" + name + '</td>';\\n text += \\\"<td class='value'>\\\" + (value / 100).toFixed(1) + '</td>'; //Prolaera toFixed(1)\\n text += '</tr>';\\n }\\n }\\n return text + '</table>';\\n };\\n c3_chart_internal_fn.tooltipPosition = function(dataToShow, tWidth, tHeight, element) {\\n var $$ = this,\\n config = $$.config,\\n d3 = $$.d3;\\n var svgLeft, tooltipLeft, tooltipRight, tooltipTop, chartRight;\\n var forArc = $$.hasArcType(),\\n mouse = d3.mouse(element);\\n // Determin tooltip position\\n if (forArc) {\\n tooltipLeft = ($$.width - ($$.isLegendRight ? $$.getLegendWidth() : 0)) / 2 + mouse[0];\\n tooltipTop = $$.height / 2 + mouse[1] + 20;\\n } else {\\n svgLeft = $$.getSvgLeft(true);\\n if (config.axis_rotated) {\\n tooltipLeft = svgLeft + mouse[0] + 100;\\n tooltipRight = tooltipLeft + tWidth;\\n chartRight = $$.currentWidth - $$.getCurrentPaddingRight();\\n tooltipTop = $$.x(dataToShow[0].x) + 20;\\n } else {\\n tooltipLeft = svgLeft + $$.getCurrentPaddingLeft(true) + $$.x(dataToShow[0].x) + 20;\\n tooltipRight = tooltipLeft + tWidth;\\n chartRight = svgLeft + $$.currentWidth - $$.getCurrentPaddingRight();\\n tooltipTop = mouse[1] + 15;\\n }\\n\\n if (tooltipRight > chartRight) {\\n // 20 is needed for Firefox to keep tooltip width\\n tooltipLeft -= tooltipRight - chartRight + 20;\\n }\\n if (tooltipTop + tHeight > $$.currentHeight) {\\n tooltipTop -= tHeight + 30;\\n }\\n }\\n if (tooltipTop < 0) {\\n tooltipTop = 0;\\n }\\n return { top: tooltipTop, left: tooltipLeft };\\n };\\n c3_chart_internal_fn.showTooltip = function(selectedData, element) {\\n var $$ = this,\\n config = $$.config;\\n var tWidth, tHeight, position;\\n var forArc = $$.hasArcType(),\\n dataToShow = selectedData.filter(function(d) {\\n return d && isValue(d.value);\\n }),\\n positionFunction = config.tooltip_position || c3_chart_internal_fn.tooltipPosition;\\n if (dataToShow.length === 0 || !config.tooltip_show) {\\n return;\\n }\\n $$.tooltip\\n .html(\\n config.tooltip_contents.call($$, selectedData, $$.axis.getXAxisTickFormat(), $$.getYFormat(forArc), $$.color)\\n )\\n .style('display', 'block');\\n\\n // Get tooltip dimensions\\n tWidth = $$.tooltip.property('offsetWidth');\\n tHeight = $$.tooltip.property('offsetHeight');\\n\\n position = positionFunction.call(this, dataToShow, tWidth, tHeight, element);\\n // Set tooltip\\n $$.tooltip.style('top', position.top + 'px').style('left', position.left + 'px');\\n };\\n c3_chart_internal_fn.hideTooltip = function() {\\n this.tooltip.style('display', 'none');\\n };\\n\\n c3_chart_internal_fn.initLegend = function() {\\n var $$ = this;\\n $$.legendItemTextBox = {};\\n $$.legendHasRendered = false;\\n $$.legend = $$.svg.append('g').attr('transform', $$.getTranslate('legend'));\\n if (!$$.config.legend_show) {\\n $$.legend.style('visibility', 'hidden');\\n $$.hiddenLegendIds = $$.mapToIds($$.data.targets);\\n return;\\n }\\n // MEMO: call here to update legend box and tranlate for all\\n // MEMO: translate will be upated by this, so transform not needed in updateLegend()\\n $$.updateLegendWithDefaults();\\n };\\n c3_chart_internal_fn.updateLegendWithDefaults = function() {\\n var $$ = this;\\n $$.updateLegend($$.mapToIds($$.data.targets), {\\n withTransform: false,\\n withTransitionForTransform: false,\\n withTransition: false\\n });\\n };\\n c3_chart_internal_fn.updateSizeForLegend = function(legendHeight, legendWidth) {\\n var $$ = this,\\n config = $$.config,\\n insetLegendPosition = {\\n top: $$.isLegendTop\\n ? $$.getCurrentPaddingTop() + config.legend_inset_y + 5.5\\n : $$.currentHeight - legendHeight - $$.getCurrentPaddingBottom() - config.legend_inset_y,\\n left: $$.isLegendLeft\\n ? $$.getCurrentPaddingLeft() + config.legend_inset_x + 0.5\\n : $$.currentWidth - legendWidth - $$.getCurrentPaddingRight() - config.legend_inset_x + 0.5\\n };\\n\\n $$.margin3 = {\\n top: $$.isLegendRight ? 0 : $$.isLegendInset ? insetLegendPosition.top : $$.currentHeight - legendHeight,\\n right: NaN,\\n bottom: 0,\\n left: $$.isLegendRight ? $$.currentWidth - legendWidth : $$.isLegendInset ? insetLegendPosition.left : 0\\n };\\n };\\n c3_chart_internal_fn.transformLegend = function(withTransition) {\\n var $$ = this;\\n (withTransition ? $$.legend.transition() : $$.legend).attr('transform', $$.getTranslate('legend'));\\n };\\n c3_chart_internal_fn.updateLegendStep = function(step) {\\n this.legendStep = step;\\n };\\n c3_chart_internal_fn.updateLegendItemWidth = function(w) {\\n this.legendItemWidth = w;\\n };\\n c3_chart_internal_fn.updateLegendItemHeight = function(h) {\\n this.legendItemHeight = h;\\n };\\n c3_chart_internal_fn.getLegendWidth = function() {\\n var $$ = this;\\n return $$.config.legend_show\\n ? $$.isLegendRight || $$.isLegendInset\\n ? $$.legendItemWidth * ($$.legendStep + 1)\\n : $$.currentWidth\\n : 0;\\n };\\n c3_chart_internal_fn.getLegendHeight = function() {\\n var $$ = this,\\n h = 0;\\n if ($$.config.legend_show) {\\n if ($$.isLegendRight) {\\n h = $$.currentHeight;\\n } else {\\n h = Math.max(20, $$.legendItemHeight) * ($$.legendStep + 1);\\n }\\n }\\n return h;\\n };\\n c3_chart_internal_fn.opacityForLegend = function(legendItem) {\\n return legendItem.classed(CLASS.legendItemHidden) ? null : 1;\\n };\\n c3_chart_internal_fn.opacityForUnfocusedLegend = function(legendItem) {\\n return legendItem.classed(CLASS.legendItemHidden) ? null : 0.3;\\n };\\n c3_chart_internal_fn.toggleFocusLegend = function(targetIds, focus) {\\n var $$ = this;\\n targetIds = $$.mapToTargetIds(targetIds);\\n $$.legend\\n .selectAll('.' + CLASS.legendItem)\\n .filter(function(id) {\\n return targetIds.indexOf(id) >= 0;\\n })\\n .classed(CLASS.legendItemFocused, focus)\\n .transition()\\n .duration(100)\\n .style('opacity', function() {\\n var opacity = focus ? $$.opacityForLegend : $$.opacityForUnfocusedLegend;\\n return opacity.call($$, $$.d3.select(this));\\n });\\n };\\n c3_chart_internal_fn.revertLegend = function() {\\n var $$ = this,\\n d3 = $$.d3;\\n $$.legend\\n .selectAll('.' + CLASS.legendItem)\\n .classed(CLASS.legendItemFocused, false)\\n .transition()\\n .duration(100)\\n .style('opacity', function() {\\n return $$.opacityForLegend(d3.select(this));\\n });\\n };\\n c3_chart_internal_fn.showLegend = function(targetIds) {\\n var $$ = this,\\n config = $$.config;\\n if (!config.legend_show) {\\n config.legend_show = true;\\n $$.legend.style('visibility', 'visible');\\n if (!$$.legendHasRendered) {\\n $$.updateLegendWithDefaults();\\n }\\n }\\n $$.removeHiddenLegendIds(targetIds);\\n $$.legend\\n .selectAll($$.selectorLegends(targetIds))\\n .style('visibility', 'visible')\\n .transition()\\n .style('opacity', function() {\\n return $$.opacityForLegend($$.d3.select(this));\\n });\\n };\\n c3_chart_internal_fn.hideLegend = function(targetIds) {\\n var $$ = this,\\n config = $$.config;\\n if (config.legend_show && isEmpty(targetIds)) {\\n config.legend_show = false;\\n $$.legend.style('visibility', 'hidden');\\n }\\n $$.addHiddenLegendIds(targetIds);\\n $$.legend\\n .selectAll($$.selectorLegends(targetIds))\\n .style('opacity', 0)\\n .style('visibility', 'hidden');\\n };\\n c3_chart_internal_fn.clearLegendItemTextBoxCache = function() {\\n this.legendItemTextBox = {};\\n };\\n c3_chart_internal_fn.updateLegend = function(targetIds, options, transitions) {\\n var $$ = this,\\n config = $$.config;\\n var xForLegend,\\n xForLegendText,\\n xForLegendRect,\\n yForLegend,\\n yForLegendText,\\n yForLegendRect,\\n x1ForLegendTile,\\n x2ForLegendTile,\\n yForLegendTile;\\n var paddingTop = 4,\\n paddingRight = 10,\\n maxWidth = 0,\\n maxHeight = 0,\\n posMin = 10,\\n tileWidth = config.legend_item_tile_width + 5;\\n var l,\\n totalLength = 0,\\n offsets = {},\\n widths = {},\\n heights = {},\\n margins = [0],\\n steps = {},\\n step = 0;\\n var withTransition, withTransitionForTransform;\\n var texts, rects, tiles, background;\\n\\n // Skip elements when their name is set to null\\n targetIds = targetIds.filter(function(id) {\\n return !isDefined(config.data_names[id]) || config.data_names[id] !== null;\\n });\\n\\n options = options || {};\\n withTransition = getOption(options, 'withTransition', true);\\n withTransitionForTransform = getOption(options, 'withTransitionForTransform', true);\\n\\n function getTextBox(textElement, id) {\\n if (!$$.legendItemTextBox[id]) {\\n $$.legendItemTextBox[id] = $$.getTextRect(textElement.textContent, CLASS.legendItem, textElement);\\n }\\n return $$.legendItemTextBox[id];\\n }\\n\\n function updatePositions(textElement, id, index) {\\n var reset = index === 0,\\n isLast = index === targetIds.length - 1,\\n box = getTextBox(textElement, id),\\n itemWidth =\\n box.width +\\n tileWidth +\\n (isLast && !($$.isLegendRight || $$.isLegendInset) ? 0 : paddingRight) +\\n config.legend_padding,\\n itemHeight = box.height + paddingTop,\\n itemLength = $$.isLegendRight || $$.isLegendInset ? itemHeight : itemWidth,\\n areaLength = $$.isLegendRight || $$.isLegendInset ? $$.getLegendHeight() : $$.getLegendWidth(),\\n margin,\\n maxLength;\\n\\n // MEMO: care about condifion of step, totalLength\\n function updateValues(id, withoutStep) {\\n if (!withoutStep) {\\n margin = (areaLength - totalLength - itemLength) / 2;\\n if (margin < posMin) {\\n margin = (areaLength - itemLength) / 2;\\n totalLength = 0;\\n step++;\\n }\\n }\\n steps[id] = step;\\n margins[step] = $$.isLegendInset ? 10 : margin;\\n offsets[id] = totalLength;\\n totalLength += itemLength;\\n }\\n\\n if (reset) {\\n totalLength = 0;\\n step = 0;\\n maxWidth = 0;\\n maxHeight = 0;\\n }\\n\\n if (config.legend_show && !$$.isLegendToShow(id)) {\\n widths[id] = heights[id] = steps[id] = offsets[id] = 0;\\n return;\\n }\\n\\n widths[id] = itemWidth;\\n heights[id] = itemHeight;\\n\\n if (!maxWidth || itemWidth >= maxWidth) {\\n maxWidth = itemWidth;\\n }\\n if (!maxHeight || itemHeight >= maxHeight) {\\n maxHeight = itemHeight;\\n }\\n maxLength = $$.isLegendRight || $$.isLegendInset ? maxHeight : maxWidth;\\n\\n if (config.legend_equally) {\\n Object.keys(widths).forEach(function(id) {\\n widths[id] = maxWidth;\\n });\\n Object.keys(heights).forEach(function(id) {\\n heights[id] = maxHeight;\\n });\\n margin = (areaLength - maxLength * targetIds.length) / 2;\\n if (margin < posMin) {\\n totalLength = 0;\\n step = 0;\\n targetIds.forEach(function(id) {\\n updateValues(id);\\n });\\n } else {\\n updateValues(id, true);\\n }\\n } else {\\n updateValues(id);\\n }\\n }\\n\\n if ($$.isLegendInset) {\\n step = config.legend_inset_step ? config.legend_inset_step : targetIds.length;\\n $$.updateLegendStep(step);\\n }\\n\\n if ($$.isLegendRight) {\\n xForLegend = function(id) {\\n return maxWidth * steps[id];\\n };\\n yForLegend = function(id) {\\n return margins[steps[id]] + offsets[id];\\n };\\n } else if ($$.isLegendInset) {\\n xForLegend = function(id) {\\n return maxWidth * steps[id] + 10;\\n };\\n yForLegend = function(id) {\\n return margins[steps[id]] + offsets[id];\\n };\\n } else {\\n xForLegend = function(id) {\\n return margins[steps[id]] + offsets[id];\\n };\\n yForLegend = function(id) {\\n return maxHeight * steps[id];\\n };\\n }\\n xForLegendText = function(id, i) {\\n return xForLegend(id, i) + 4 + config.legend_item_tile_width;\\n };\\n yForLegendText = function(id, i) {\\n return yForLegend(id, i) + 9;\\n };\\n xForLegendRect = function(id, i) {\\n return xForLegend(id, i);\\n };\\n yForLegendRect = function(id, i) {\\n return yForLegend(id, i) - 5;\\n };\\n x1ForLegendTile = function(id, i) {\\n return xForLegend(id, i) - 2;\\n };\\n x2ForLegendTile = function(id, i) {\\n return xForLegend(id, i) - 2 + config.legend_item_tile_width;\\n };\\n yForLegendTile = function(id, i) {\\n return yForLegend(id, i) + 4;\\n };\\n\\n // Define g for legend area\\n l = $$.legend\\n .selectAll('.' + CLASS.legendItem)\\n .data(targetIds)\\n .enter()\\n .append('g')\\n .attr('class', function(id) {\\n return $$.generateClass(CLASS.legendItem, id);\\n })\\n .style('visibility', function(id) {\\n return $$.isLegendToShow(id) ? 'visible' : 'hidden';\\n })\\n .style('cursor', 'pointer')\\n .on('click', function(id) {\\n if (config.legend_item_onclick) {\\n config.legend_item_onclick.call($$, id);\\n } else {\\n if ($$.d3.event.altKey) {\\n $$.api.hide();\\n $$.api.show(id);\\n } else {\\n $$.api.toggle(id);\\n $$.isTargetToShow(id) ? $$.api.focus(id) : $$.api.revert();\\n }\\n }\\n })\\n .on('mouseover', function(id) {\\n if (config.legend_item_onmouseover) {\\n config.legend_item_onmouseover.call($$, id);\\n } else {\\n $$.d3.select(this).classed(CLASS.legendItemFocused, true);\\n if (!$$.transiting && $$.isTargetToShow(id)) {\\n $$.api.focus(id);\\n }\\n }\\n })\\n .on('mouseout', function(id) {\\n if (config.legend_item_onmouseout) {\\n config.legend_item_onmouseout.call($$, id);\\n } else {\\n $$.d3.select(this).classed(CLASS.legendItemFocused, false);\\n $$.api.revert();\\n }\\n });\\n l.append('text')\\n .text(function(id) {\\n return isDefined(config.data_names[id]) ? config.data_names[id] : id;\\n })\\n .each(function(id, i) {\\n updatePositions(this, id, i);\\n })\\n .style('pointer-events', 'none')\\n .attr('x', $$.isLegendRight || $$.isLegendInset ? xForLegendText : -200)\\n .attr('y', $$.isLegendRight || $$.isLegendInset ? -200 : yForLegendText);\\n l.append('rect')\\n .attr('class', CLASS.legendItemEvent)\\n .style('fill-opacity', 0)\\n .attr('x', $$.isLegendRight || $$.isLegendInset ? xForLegendRect : -200)\\n .attr('y', $$.isLegendRight || $$.isLegendInset ? -200 : yForLegendRect);\\n l.append('line')\\n .attr('class', CLASS.legendItemTile)\\n .style('stroke', $$.color)\\n .style('pointer-events', 'none')\\n .attr('x1', $$.isLegendRight || $$.isLegendInset ? x1ForLegendTile : -200)\\n .attr('y1', $$.isLegendRight || $$.isLegendInset ? -200 : yForLegendTile)\\n .attr('x2', $$.isLegendRight || $$.isLegendInset ? x2ForLegendTile : -200)\\n .attr('y2', $$.isLegendRight || $$.isLegendInset ? -200 : yForLegendTile)\\n .attr('stroke-width', config.legend_item_tile_height);\\n\\n // Set background for inset legend\\n background = $$.legend.select('.' + CLASS.legendBackground + ' rect');\\n if ($$.isLegendInset && maxWidth > 0 && background.size() === 0) {\\n background = $$.legend\\n .insert('g', '.' + CLASS.legendItem)\\n .attr('class', CLASS.legendBackground)\\n .append('rect');\\n }\\n\\n texts = $$.legend\\n .selectAll('text')\\n .data(targetIds)\\n .text(function(id) {\\n return isDefined(config.data_names[id]) ? config.data_names[id] : id;\\n }) // MEMO: needed for update\\n .each(function(id, i) {\\n updatePositions(this, id, i);\\n });\\n (withTransition ? texts.transition() : texts).attr('x', xForLegendText).attr('y', yForLegendText);\\n\\n rects = $$.legend.selectAll('rect.' + CLASS.legendItemEvent).data(targetIds);\\n (withTransition ? rects.transition() : rects)\\n .attr('width', function(id) {\\n return widths[id];\\n })\\n .attr('height', function(id) {\\n return heights[id];\\n })\\n .attr('x', xForLegendRect)\\n .attr('y', yForLegendRect);\\n\\n tiles = $$.legend.selectAll('line.' + CLASS.legendItemTile).data(targetIds);\\n (withTransition ? tiles.transition() : tiles)\\n .style('stroke', $$.color)\\n .attr('x1', x1ForLegendTile)\\n .attr('y1', yForLegendTile)\\n .attr('x2', x2ForLegendTile)\\n .attr('y2', yForLegendTile);\\n\\n if (background) {\\n (withTransition ? background.transition() : background)\\n .attr('height', $$.getLegendHeight() - 12)\\n .attr('width', maxWidth * (step + 1) + 10);\\n }\\n\\n // toggle legend state\\n $$.legend.selectAll('.' + CLASS.legendItem).classed(CLASS.legendItemHidden, function(id) {\\n return !$$.isTargetToShow(id);\\n });\\n\\n // Update all to reflect change of legend\\n $$.updateLegendItemWidth(maxWidth);\\n $$.updateLegendItemHeight(maxHeight);\\n $$.updateLegendStep(step);\\n // Update size and scale\\n $$.updateSizes();\\n $$.updateScales();\\n $$.updateSvgSize();\\n // Update g positions\\n $$.transformAll(withTransitionForTransform, transitions);\\n $$.legendHasRendered = true;\\n };\\n\\n c3_chart_internal_fn.initTitle = function() {\\n var $$ = this;\\n $$.title = $$.svg\\n .append('text')\\n .text($$.config.title_text)\\n .attr('class', $$.CLASS.title);\\n };\\n c3_chart_internal_fn.redrawTitle = function() {\\n var $$ = this;\\n $$.title.attr('x', $$.xForTitle.bind($$)).attr('y', $$.yForTitle.bind($$));\\n };\\n c3_chart_internal_fn.xForTitle = function() {\\n var $$ = this,\\n config = $$.config,\\n position = config.title_position || 'left',\\n x;\\n if (position.indexOf('right') >= 0) {\\n x =\\n $$.currentWidth -\\n $$.getTextRect($$.title.node().textContent, $$.CLASS.title, $$.title.node()).width -\\n config.title_padding.right;\\n } else if (position.indexOf('center') >= 0) {\\n x = ($$.currentWidth - $$.getTextRect($$.title.node().textContent, $$.CLASS.title, $$.title.node()).width) / 2;\\n } else {\\n // left\\n x = config.title_padding.left;\\n }\\n return x;\\n };\\n c3_chart_internal_fn.yForTitle = function() {\\n var $$ = this;\\n return (\\n $$.config.title_padding.top + $$.getTextRect($$.title.node().textContent, $$.CLASS.title, $$.title.node()).height\\n );\\n };\\n c3_chart_internal_fn.getTitlePadding = function() {\\n var $$ = this;\\n return $$.yForTitle() + $$.config.title_padding.bottom;\\n };\\n\\n function Axis(owner) {\\n API.call(this, owner);\\n }\\n\\n inherit(API, Axis);\\n\\n Axis.prototype.init = function init() {\\n var $$ = this.owner,\\n config = $$.config,\\n main = $$.main;\\n $$.axes.x = main\\n .append('g')\\n .attr('class', CLASS.axis + ' ' + CLASS.axisX)\\n .attr('clip-path', $$.clipPathForXAxis)\\n .attr('transform', $$.getTranslate('x'))\\n .style('visibility', config.axis_x_show ? 'visible' : 'hidden');\\n $$.axes.x\\n .append('text')\\n .attr('class', CLASS.axisXLabel)\\n .attr('transform', config.axis_rotated ? 'rotate(-90)' : '')\\n .style('text-anchor', this.textAnchorForXAxisLabel.bind(this));\\n $$.axes.y = main\\n .append('g')\\n .attr('class', CLASS.axis + ' ' + CLASS.axisY)\\n .attr('clip-path', config.axis_y_inner ? '' : $$.clipPathForYAxis)\\n .attr('transform', $$.getTranslate('y'))\\n .style('visibility', config.axis_y_show ? 'visible' : 'hidden');\\n $$.axes.y\\n .append('text')\\n .attr('class', CLASS.axisYLabel)\\n .attr('transform', config.axis_rotated ? '' : 'rotate(-90)')\\n .style('text-anchor', this.textAnchorForYAxisLabel.bind(this));\\n\\n $$.axes.y2 = main\\n .append('g')\\n .attr('class', CLASS.axis + ' ' + CLASS.axisY2)\\n // clip-path?\\n .attr('transform', $$.getTranslate('y2'))\\n .style('visibility', config.axis_y2_show ? 'visible' : 'hidden');\\n $$.axes.y2\\n .append('text')\\n .attr('class', CLASS.axisY2Label)\\n .attr('transform', config.axis_rotated ? '' : 'rotate(-90)')\\n .style('text-anchor', this.textAnchorForY2AxisLabel.bind(this));\\n };\\n Axis.prototype.getXAxis = function getXAxis(\\n scale,\\n orient,\\n tickFormat,\\n tickValues,\\n withOuterTick,\\n withoutTransition,\\n withoutRotateTickText\\n ) {\\n var $$ = this.owner,\\n config = $$.config,\\n axisParams = {\\n isCategory: $$.isCategorized(),\\n withOuterTick: withOuterTick,\\n tickMultiline: config.axis_x_tick_multiline,\\n tickWidth: config.axis_x_tick_width,\\n tickTextRotate: withoutRotateTickText ? 0 : config.axis_x_tick_rotate,\\n withoutTransition: withoutTransition\\n },\\n axis = c3_axis($$.d3, axisParams)\\n .scale(scale)\\n .orient(orient);\\n\\n if ($$.isTimeSeries() && tickValues && typeof tickValues !== 'function') {\\n tickValues = tickValues.map(function(v) {\\n return $$.parseDate(v);\\n });\\n }\\n\\n // Set tick\\n axis.tickFormat(tickFormat).tickValues(tickValues);\\n if ($$.isCategorized()) {\\n axis.tickCentered(config.axis_x_tick_centered);\\n if (isEmpty(config.axis_x_tick_culling)) {\\n config.axis_x_tick_culling = false;\\n }\\n }\\n\\n return axis;\\n };\\n Axis.prototype.updateXAxisTickValues = function updateXAxisTickValues(targets, axis) {\\n var $$ = this.owner,\\n config = $$.config,\\n tickValues;\\n if (config.axis_x_tick_fit || config.axis_x_tick_count) {\\n tickValues = this.generateTickValues(\\n $$.mapTargetsToUniqueXs(targets),\\n config.axis_x_tick_count,\\n $$.isTimeSeries()\\n );\\n }\\n if (axis) {\\n axis.tickValues(tickValues);\\n } else {\\n $$.xAxis.tickValues(tickValues);\\n $$.subXAxis.tickValues(tickValues);\\n }\\n return tickValues;\\n };\\n Axis.prototype.getYAxis = function getYAxis(\\n scale,\\n orient,\\n tickFormat,\\n tickValues,\\n withOuterTick,\\n withoutTransition,\\n withoutRotateTickText\\n ) {\\n var $$ = this.owner,\\n config = $$.config,\\n axisParams = {\\n withOuterTick: withOuterTick,\\n withoutTransition: withoutTransition,\\n tickTextRotate: withoutRotateTickText ? 0 : config.axis_y_tick_rotate\\n },\\n axis = c3_axis($$.d3, axisParams)\\n .scale(scale)\\n .orient(orient)\\n .tickFormat(tickFormat);\\n if ($$.isTimeSeriesY()) {\\n axis.ticks($$.d3.time[config.axis_y_tick_time_value], config.axis_y_tick_time_interval);\\n } else {\\n axis.tickValues(tickValues);\\n }\\n return axis;\\n };\\n Axis.prototype.getId = function getId(id) {\\n var config = this.owner.config;\\n return id in config.data_axes ? config.data_axes[id] : 'y';\\n };\\n Axis.prototype.getXAxisTickFormat = function getXAxisTickFormat() {\\n var $$ = this.owner,\\n config = $$.config,\\n format = $$.isTimeSeries()\\n ? $$.defaultAxisTimeFormat\\n : $$.isCategorized()\\n ? $$.categoryName\\n : function(v) {\\n return v < 0 ? v.toFixed(1) : v; // Prolaera - toFixed\\n };\\n if (config.axis_x_tick_format) {\\n if (isFunction(config.axis_x_tick_format)) {\\n format = config.axis_x_tick_format;\\n } else if ($$.isTimeSeries()) {\\n format = function(date) {\\n return date ? $$.axisTimeFormat(config.axis_x_tick_format)(date) : '';\\n };\\n }\\n }\\n return isFunction(format)\\n ? function(v) {\\n return format.call($$, v);\\n }\\n : format;\\n };\\n Axis.prototype.getTickValues = function getTickValues(tickValues, axis) {\\n return tickValues ? tickValues : axis ? axis.tickValues() : undefined;\\n };\\n Axis.prototype.getXAxisTickValues = function getXAxisTickValues() {\\n return this.getTickValues(this.owner.config.axis_x_tick_values, this.owner.xAxis);\\n };\\n Axis.prototype.getYAxisTickValues = function getYAxisTickValues() {\\n return this.getTickValues(this.owner.config.axis_y_tick_values, this.owner.yAxis);\\n };\\n Axis.prototype.getY2AxisTickValues = function getY2AxisTickValues() {\\n return this.getTickValues(this.owner.config.axis_y2_tick_values, this.owner.y2Axis);\\n };\\n Axis.prototype.getLabelOptionByAxisId = function getLabelOptionByAxisId(axisId) {\\n var $$ = this.owner,\\n config = $$.config,\\n option;\\n if (axisId === 'y') {\\n option = config.axis_y_label;\\n } else if (axisId === 'y2') {\\n option = config.axis_y2_label;\\n } else if (axisId === 'x') {\\n option = config.axis_x_label;\\n }\\n return option;\\n };\\n Axis.prototype.getLabelText = function getLabelText(axisId) {\\n var option = this.getLabelOptionByAxisId(axisId);\\n return isString(option) ? option : option ? option.text : null;\\n };\\n Axis.prototype.setLabelText = function setLabelText(axisId, text) {\\n var $$ = this.owner,\\n config = $$.config,\\n option = this.getLabelOptionByAxisId(axisId);\\n if (isString(option)) {\\n if (axisId === 'y') {\\n config.axis_y_label = text;\\n } else if (axisId === 'y2') {\\n config.axis_y2_label = text;\\n } else if (axisId === 'x') {\\n config.axis_x_label = text;\\n }\\n } else if (option) {\\n option.text = text;\\n }\\n };\\n Axis.prototype.getLabelPosition = function getLabelPosition(axisId, defaultPosition) {\\n var option = this.getLabelOptionByAxisId(axisId),\\n position = option && typeof option === 'object' && option.position ? option.position : defaultPosition;\\n return {\\n isInner: position.indexOf('inner') >= 0,\\n isOuter: position.indexOf('outer') >= 0,\\n isLeft: position.indexOf('left') >= 0,\\n isCenter: position.indexOf('center') >= 0,\\n isRight: position.indexOf('right') >= 0,\\n isTop: position.indexOf('top') >= 0,\\n isMiddle: position.indexOf('middle') >= 0,\\n isBottom: position.indexOf('bottom') >= 0\\n };\\n };\\n Axis.prototype.getXAxisLabelPosition = function getXAxisLabelPosition() {\\n return this.getLabelPosition('x', this.owner.config.axis_rotated ? 'inner-top' : 'inner-right');\\n };\\n Axis.prototype.getYAxisLabelPosition = function getYAxisLabelPosition() {\\n return this.getLabelPosition('y', this.owner.config.axis_rotated ? 'inner-right' : 'inner-top');\\n };\\n Axis.prototype.getY2AxisLabelPosition = function getY2AxisLabelPosition() {\\n return this.getLabelPosition('y2', this.owner.config.axis_rotated ? 'inner-right' : 'inner-top');\\n };\\n Axis.prototype.getLabelPositionById = function getLabelPositionById(id) {\\n return id === 'y2'\\n ? this.getY2AxisLabelPosition()\\n : id === 'y'\\n ? this.getYAxisLabelPosition()\\n : this.getXAxisLabelPosition();\\n };\\n Axis.prototype.textForXAxisLabel = function textForXAxisLabel() {\\n return this.getLabelText('x');\\n };\\n Axis.prototype.textForYAxisLabel = function textForYAxisLabel() {\\n return this.getLabelText('y');\\n };\\n Axis.prototype.textForY2AxisLabel = function textForY2AxisLabel() {\\n return this.getLabelText('y2');\\n };\\n Axis.prototype.xForAxisLabel = function xForAxisLabel(forHorizontal, position) {\\n var $$ = this.owner;\\n if (forHorizontal) {\\n return position.isLeft ? 0 : position.isCenter ? $$.width / 2 : $$.width;\\n } else {\\n return position.isBottom ? -$$.height : position.isMiddle ? -$$.height / 2 : 0;\\n }\\n };\\n Axis.prototype.dxForAxisLabel = function dxForAxisLabel(forHorizontal, position) {\\n if (forHorizontal) {\\n return position.isLeft ? '0.5em' : position.isRight ? '-0.5em' : '0';\\n } else {\\n return position.isTop ? '-0.5em' : position.isBottom ? '0.5em' : '0';\\n }\\n };\\n Axis.prototype.textAnchorForAxisLabel = function textAnchorForAxisLabel(forHorizontal, position) {\\n if (forHorizontal) {\\n return position.isLeft ? 'start' : position.isCenter ? 'middle' : 'end';\\n } else {\\n return position.isBottom ? 'start' : position.isMiddle ? 'middle' : 'end';\\n }\\n };\\n Axis.prototype.xForXAxisLabel = function xForXAxisLabel() {\\n return this.xForAxisLabel(!this.owner.config.axis_rotated, this.getXAxisLabelPosition());\\n };\\n Axis.prototype.xForYAxisLabel = function xForYAxisLabel() {\\n return this.xForAxisLabel(this.owner.config.axis_rotated, this.getYAxisLabelPosition());\\n };\\n Axis.prototype.xForY2AxisLabel = function xForY2AxisLabel() {\\n return this.xForAxisLabel(this.owner.config.axis_rotated, this.getY2AxisLabelPosition());\\n };\\n Axis.prototype.dxForXAxisLabel = function dxForXAxisLabel() {\\n return this.dxForAxisLabel(!this.owner.config.axis_rotated, this.getXAxisLabelPosition());\\n };\\n Axis.prototype.dxForYAxisLabel = function dxForYAxisLabel() {\\n return this.dxForAxisLabel(this.owner.config.axis_rotated, this.getYAxisLabelPosition());\\n };\\n Axis.prototype.dxForY2AxisLabel = function dxForY2AxisLabel() {\\n return this.dxForAxisLabel(this.owner.config.axis_rotated, this.getY2AxisLabelPosition());\\n };\\n Axis.prototype.dyForXAxisLabel = function dyForXAxisLabel() {\\n var $$ = this.owner,\\n config = $$.config,\\n position = this.getXAxisLabelPosition();\\n if (config.axis_rotated) {\\n return position.isInner ? '1.2em' : -25 - this.getMaxTickWidth('x');\\n } else {\\n return position.isInner ? '-0.5em' : config.axis_x_height ? config.axis_x_height - 10 : '3em';\\n }\\n };\\n Axis.prototype.dyForYAxisLabel = function dyForYAxisLabel() {\\n var $$ = this.owner,\\n position = this.getYAxisLabelPosition();\\n if ($$.config.axis_rotated) {\\n return position.isInner ? '-0.5em' : '3em';\\n } else {\\n return position.isInner ? '1.2em' : -10 - ($$.config.axis_y_inner ? 0 : this.getMaxTickWidth('y') + 10);\\n }\\n };\\n Axis.prototype.dyForY2AxisLabel = function dyForY2AxisLabel() {\\n var $$ = this.owner,\\n position = this.getY2AxisLabelPosition();\\n if ($$.config.axis_rotated) {\\n return position.isInner ? '1.2em' : '-2.2em';\\n } else {\\n return position.isInner ? '-0.5em' : 15 + ($$.config.axis_y2_inner ? 0 : this.getMaxTickWidth('y2') + 15);\\n }\\n };\\n Axis.prototype.textAnchorForXAxisLabel = function textAnchorForXAxisLabel() {\\n var $$ = this.owner;\\n return this.textAnchorForAxisLabel(!$$.config.axis_rotated, this.getXAxisLabelPosition());\\n };\\n Axis.prototype.textAnchorForYAxisLabel = function textAnchorForYAxisLabel() {\\n var $$ = this.owner;\\n return this.textAnchorForAxisLabel($$.config.axis_rotated, this.getYAxisLabelPosition());\\n };\\n Axis.prototype.textAnchorForY2AxisLabel = function textAnchorForY2AxisLabel() {\\n var $$ = this.owner;\\n return this.textAnchorForAxisLabel($$.config.axis_rotated, this.getY2AxisLabelPosition());\\n };\\n Axis.prototype.getMaxTickWidth = function getMaxTickWidth(id, withoutRecompute) {\\n var $$ = this.owner,\\n config = $$.config,\\n maxWidth = 0,\\n targetsToShow,\\n scale,\\n axis,\\n dummy,\\n svg;\\n if (withoutRecompute && $$.currentMaxTickWidths[id]) {\\n return $$.currentMaxTickWidths[id];\\n }\\n if ($$.svg) {\\n targetsToShow = $$.filterTargetsToShow($$.data.targets);\\n if (id === 'y') {\\n scale = $$.y.copy().domain($$.getYDomain(targetsToShow, 'y'));\\n axis = this.getYAxis(scale, $$.yOrient, config.axis_y_tick_format, $$.yAxisTickValues, false, true, true);\\n } else if (id === 'y2') {\\n scale = $$.y2.copy().domain($$.getYDomain(targetsToShow, 'y2'));\\n axis = this.getYAxis(scale, $$.y2Orient, config.axis_y2_tick_format, $$.y2AxisTickValues, false, true, true);\\n } else {\\n scale = $$.x.copy().domain($$.getXDomain(targetsToShow));\\n axis = this.getXAxis(scale, $$.xOrient, $$.xAxisTickFormat, $$.xAxisTickValues, false, true, true);\\n this.updateXAxisTickValues(targetsToShow, axis);\\n }\\n dummy = $$.d3\\n .select('body')\\n .append('div')\\n .classed('c3', true);\\n (svg = dummy\\n .append('svg')\\n .style('visibility', 'hidden')\\n .style('position', 'fixed')\\n .style('top', 0)\\n .style('left', 0)),\\n svg\\n .append('g')\\n .call(axis)\\n .each(function() {\\n $$.d3\\n .select(this)\\n .selectAll('text')\\n .each(function() {\\n var box = this.getBoundingClientRect();\\n if (maxWidth < box.width) {\\n maxWidth = box.width;\\n }\\n });\\n dummy.remove();\\n });\\n }\\n $$.currentMaxTickWidths[id] = maxWidth <= 0 ? $$.currentMaxTickWidths[id] : maxWidth;\\n return $$.currentMaxTickWidths[id];\\n };\\n\\n Axis.prototype.updateLabels = function updateLabels(withTransition) {\\n var $$ = this.owner;\\n var axisXLabel = $$.main.select('.' + CLASS.axisX + ' .' + CLASS.axisXLabel),\\n axisYLabel = $$.main.select('.' + CLASS.axisY + ' .' + CLASS.axisYLabel),\\n axisY2Label = $$.main.select('.' + CLASS.axisY2 + ' .' + CLASS.axisY2Label);\\n (withTransition ? axisXLabel.transition() : axisXLabel)\\n .attr('x', this.xForXAxisLabel.bind(this))\\n .attr('dx', this.dxForXAxisLabel.bind(this))\\n .attr('dy', this.dyForXAxisLabel.bind(this))\\n .text(this.textForXAxisLabel.bind(this));\\n (withTransition ? axisYLabel.transition() : axisYLabel)\\n .attr('x', this.xForYAxisLabel.bind(this))\\n .attr('dx', this.dxForYAxisLabel.bind(this))\\n .attr('dy', this.dyForYAxisLabel.bind(this))\\n .text(this.textForYAxisLabel.bind(this));\\n (withTransition ? axisY2Label.transition() : axisY2Label)\\n .attr('x', this.xForY2AxisLabel.bind(this))\\n .attr('dx', this.dxForY2AxisLabel.bind(this))\\n .attr('dy', this.dyForY2AxisLabel.bind(this))\\n .text(this.textForY2AxisLabel.bind(this));\\n };\\n Axis.prototype.getPadding = function getPadding(padding, key, defaultValue, domainLength) {\\n var p = typeof padding === 'number' ? padding : padding[key];\\n if (!isValue(p)) {\\n return defaultValue;\\n }\\n if (padding.unit === 'ratio') {\\n return padding[key] * domainLength;\\n }\\n // assume padding is pixels if unit is not specified\\n return this.convertPixelsToAxisPadding(p, domainLength);\\n };\\n Axis.prototype.convertPixelsToAxisPadding = function convertPixelsToAxisPadding(pixels, domainLength) {\\n var $$ = this.owner,\\n length = $$.config.axis_rotated ? $$.width : $$.height;\\n return domainLength * (pixels / length);\\n };\\n Axis.prototype.generateTickValues = function generateTickValues(values, tickCount, forTimeSeries) {\\n var tickValues = values,\\n targetCount,\\n start,\\n end,\\n count,\\n interval,\\n i,\\n tickValue;\\n if (tickCount) {\\n targetCount = isFunction(tickCount) ? tickCount() : tickCount;\\n // compute ticks according to tickCount\\n if (targetCount === 1) {\\n tickValues = [values[0]];\\n } else if (targetCount === 2) {\\n tickValues = [values[0], values[values.length - 1]];\\n } else if (targetCount > 2) {\\n count = targetCount - 2;\\n start = values[0];\\n end = values[values.length - 1];\\n interval = (end - start) / (count + 1);\\n // re-construct unique values\\n tickValues = [start];\\n for (i = 0; i < count; i++) {\\n tickValue = +start + interval * (i + 1);\\n tickValues.push(forTimeSeries ? new Date(tickValue) : tickValue);\\n }\\n tickValues.push(end);\\n }\\n }\\n if (!forTimeSeries) {\\n tickValues = tickValues.sort(function(a, b) {\\n return a - b;\\n });\\n }\\n return tickValues;\\n };\\n Axis.prototype.generateTransitions = function generateTransitions(duration) {\\n var $$ = this.owner,\\n axes = $$.axes;\\n return {\\n axisX: duration ? axes.x.transition().duration(duration) : axes.x,\\n axisY: duration ? axes.y.transition().duration(duration) : axes.y,\\n axisY2: duration ? axes.y2.transition().duration(duration) : axes.y2,\\n axisSubX: duration ? axes.subx.transition().duration(duration) : axes.subx\\n };\\n };\\n Axis.prototype.redraw = function redraw(transitions, isHidden) {\\n var $$ = this.owner;\\n $$.axes.x.style('opacity', isHidden ? 0 : 1);\\n $$.axes.y.style('opacity', isHidden ? 0 : 1);\\n $$.axes.y2.style('opacity', isHidden ? 0 : 1);\\n $$.axes.subx.style('opacity', isHidden ? 0 : 1);\\n transitions.axisX.call($$.xAxis);\\n transitions.axisY.call($$.yAxis);\\n transitions.axisY2.call($$.y2Axis);\\n transitions.axisSubX.call($$.subXAxis);\\n };\\n\\n c3_chart_internal_fn.getClipPath = function(id) {\\n var isIE9 = window.navigator.appVersion.toLowerCase().indexOf('msie 9.') >= 0;\\n return 'url(' + (isIE9 ? '' : document.URL.split('#')[0]) + '#' + id + ')';\\n };\\n c3_chart_internal_fn.appendClip = function(parent, id) {\\n return parent\\n .append('clipPath')\\n .attr('id', id)\\n .append('rect');\\n };\\n c3_chart_internal_fn.getAxisClipX = function(forHorizontal) {\\n // axis line width + padding for left\\n var left = Math.max(30, this.margin.left);\\n return forHorizontal ? -(1 + left) : -(left - 1);\\n };\\n c3_chart_internal_fn.getAxisClipY = function(forHorizontal) {\\n return forHorizontal ? -20 : -this.margin.top;\\n };\\n c3_chart_internal_fn.getXAxisClipX = function() {\\n var $$ = this;\\n return $$.getAxisClipX(!$$.config.axis_rotated);\\n };\\n c3_chart_internal_fn.getXAxisClipY = function() {\\n var $$ = this;\\n return $$.getAxisClipY(!$$.config.axis_rotated);\\n };\\n c3_chart_internal_fn.getYAxisClipX = function() {\\n var $$ = this;\\n return $$.config.axis_y_inner ? -1 : $$.getAxisClipX($$.config.axis_rotated);\\n };\\n c3_chart_internal_fn.getYAxisClipY = function() {\\n var $$ = this;\\n return $$.getAxisClipY($$.config.axis_rotated);\\n };\\n c3_chart_internal_fn.getAxisClipWidth = function(forHorizontal) {\\n var $$ = this,\\n left = Math.max(30, $$.margin.left),\\n right = Math.max(30, $$.margin.right);\\n // width + axis line width + padding for left/right\\n return forHorizontal ? $$.width + 2 + left + right : $$.margin.left + 20;\\n };\\n c3_chart_internal_fn.getAxisClipHeight = function(forHorizontal) {\\n // less than 20 is not enough to show the axis label 'outer' without legend\\n return (forHorizontal ? this.margin.bottom : this.margin.top + this.height) + 20;\\n };\\n c3_chart_internal_fn.getXAxisClipWidth = function() {\\n var $$ = this;\\n return $$.getAxisClipWidth(!$$.config.axis_rotated);\\n };\\n c3_chart_internal_fn.getXAxisClipHeight = function() {\\n var $$ = this;\\n return $$.getAxisClipHeight(!$$.config.axis_rotated);\\n };\\n c3_chart_internal_fn.getYAxisClipWidth = function() {\\n var $$ = this;\\n return $$.getAxisClipWidth($$.config.axis_rotated) + ($$.config.axis_y_inner ? 20 : 0);\\n };\\n c3_chart_internal_fn.getYAxisClipHeight = function() {\\n var $$ = this;\\n return $$.getAxisClipHeight($$.config.axis_rotated);\\n };\\n\\n c3_chart_internal_fn.initPie = function() {\\n var $$ = this,\\n d3 = $$.d3,\\n config = $$.config;\\n $$.pie = d3.layout.pie().value(function(d) {\\n return d.values.reduce(function(a, b) {\\n return a + b.value;\\n }, 0);\\n });\\n if (!config.data_order) {\\n $$.pie.sort(null);\\n }\\n };\\n\\n c3_chart_internal_fn.updateRadius = function() {\\n var $$ = this,\\n config = $$.config,\\n w = config.gauge_width || config.donut_width;\\n $$.radiusExpanded = Math.min($$.arcWidth, $$.arcHeight) / 2;\\n $$.radius = $$.radiusExpanded * 0.95;\\n $$.innerRadiusRatio = w ? ($$.radius - w) / $$.radius : 0.6;\\n $$.innerRadius = $$.hasType('donut') || $$.hasType('gauge') ? $$.radius * $$.innerRadiusRatio : 0;\\n };\\n\\n c3_chart_internal_fn.updateArc = function() {\\n var $$ = this;\\n $$.svgArc = $$.getSvgArc();\\n $$.svgArcExpanded = $$.getSvgArcExpanded();\\n $$.svgArcExpandedSub = $$.getSvgArcExpanded(0.98);\\n };\\n\\n c3_chart_internal_fn.updateAngle = function(d) {\\n var $$ = this,\\n config = $$.config,\\n found = false,\\n index = 0,\\n gMin,\\n gMax,\\n gTic,\\n gValue;\\n\\n if (!config) {\\n return null;\\n }\\n\\n $$.pie($$.filterTargetsToShow($$.data.targets)).forEach(function(t) {\\n if (!found && t.data.id === d.data.id) {\\n found = true;\\n d = t;\\n d.index = index;\\n }\\n index++;\\n });\\n if (isNaN(d.startAngle)) {\\n d.startAngle = 0;\\n }\\n if (isNaN(d.endAngle)) {\\n d.endAngle = d.startAngle;\\n }\\n if ($$.isGaugeType(d.data)) {\\n gMin = config.gauge_min;\\n gMax = config.gauge_max;\\n\\n gTic = (Math.PI * (config.gauge_fullCircle ? 2 : 1)) / (gMax - gMin);\\n gValue = d.value < gMin ? 0 : d.value < gMax ? d.value - gMin : gMax - gMin;\\n\\n //attach mina nd max to d nodes.\\n d.min = gMin;\\n d.max = gMax;\\n\\n d.startAngle = config.gauge_startingAngle;\\n\\n // MESSAGE --- PROLAERA --make 0/0 guages look full\\n if (gTic == 'Infinity') {\\n d.endAngle = d.startAngle + 0.39269908169872414 * 8;\\n } else {\\n d.endAngle = d.startAngle + gTic * gValue;\\n }\\n }\\n return found ? d : null;\\n };\\n\\n c3_chart_internal_fn.getSvgArc = function() {\\n var $$ = this,\\n arc = $$.d3.svg\\n .arc()\\n .outerRadius($$.radius)\\n .innerRadius($$.innerRadius),\\n newArc = function(d, withoutUpdate) {\\n var updated;\\n if (withoutUpdate) {\\n return arc(d);\\n } // for interpolate\\n updated = $$.updateAngle(d);\\n return updated ? arc(updated) : 'M 0 0';\\n };\\n // TODO: extends all function\\n newArc.centroid = arc.centroid;\\n return newArc;\\n };\\n\\n c3_chart_internal_fn.getSvgArcExpanded = function(rate) {\\n var $$ = this,\\n arc = $$.d3.svg\\n .arc()\\n .outerRadius($$.radiusExpanded * (rate ? rate : 1))\\n .innerRadius($$.innerRadius);\\n return function(d) {\\n var updated = $$.updateAngle(d);\\n return updated ? arc(updated) : 'M 0 0';\\n };\\n };\\n\\n c3_chart_internal_fn.getArc = function(d, withoutUpdate, force) {\\n return force || this.isArcType(d.data) ? this.svgArc(d, withoutUpdate) : 'M 0 0';\\n };\\n\\n c3_chart_internal_fn.transformForArcLabel = function(d) {\\n var $$ = this,\\n config = $$.config,\\n updated = $$.updateAngle(d),\\n c,\\n x,\\n y,\\n h,\\n ratio,\\n translate = '';\\n if (updated && !$$.hasType('gauge')) {\\n c = this.svgArc.centroid(updated);\\n x = isNaN(c[0]) ? 0 : c[0];\\n y = isNaN(c[1]) ? 0 : c[1];\\n h = Math.sqrt(x * x + y * y);\\n if ($$.hasType('donut') && config.donut_label_ratio) {\\n ratio = isFunction(config.donut_label_ratio)\\n ? config.donut_label_ratio(d, $$.radius, h)\\n : config.donut_label_ratio;\\n } else if ($$.hasType('pie') && config.pie_label_ratio) {\\n ratio = isFunction(config.pie_label_ratio) ? config.pie_label_ratio(d, $$.radius, h) : config.pie_label_ratio;\\n } else {\\n ratio = $$.radius && h ? ((36 / $$.radius > 0.375 ? 1.175 - 36 / $$.radius : 0.8) * $$.radius) / h : 0;\\n }\\n translate = 'translate(' + x * ratio + ',' + y * ratio + ')';\\n }\\n return translate;\\n };\\n\\n c3_chart_internal_fn.getArcRatio = function(d) {\\n var $$ = this,\\n config = $$.config,\\n whole = Math.PI * ($$.hasType('gauge') && !config.gauge_fullCircle ? 1 : 2);\\n return d ? (d.endAngle - d.startAngle) / whole : null;\\n };\\n\\n c3_chart_internal_fn.convertToArcData = function(d) {\\n return this.addName({\\n id: d.data.id,\\n value: d.value,\\n ratio: this.getArcRatio(d),\\n index: d.index\\n });\\n };\\n\\n c3_chart_internal_fn.textForArcLabel = function(d) {\\n var $$ = this,\\n updated,\\n value,\\n ratio,\\n id,\\n format;\\n if (!$$.shouldShowArcLabel()) {\\n return '';\\n }\\n updated = $$.updateAngle(d);\\n value = updated ? updated.value : null;\\n\\n ratio = updated.max - d.value;\\n if (ratio < 0) ratio = 0;\\n\\n id = d.data.id;\\n if (!$$.hasType('gauge') && !$$.meetsArcLabelThreshold(ratio)) {\\n return '';\\n }\\n format = $$.getArcLabelFormat();\\n return format ? format(value, ratio, id) : $$.defaultArcValueFormat(value, ratio);\\n };\\n\\n c3_chart_internal_fn.expandArc = function(targetIds) {\\n var $$ = this,\\n interval;\\n\\n // MEMO: avoid to cancel transition\\n if ($$.transiting) {\\n interval = window.setInterval(function() {\\n if (!$$.transiting) {\\n window.clearInterval(interval);\\n if ($$.legend.selectAll('.c3-legend-item-focused').size() > 0) {\\n $$.expandArc(targetIds);\\n }\\n }\\n }, 10);\\n return;\\n }\\n\\n targetIds = $$.mapToTargetIds(targetIds);\\n\\n $$.svg.selectAll($$.selectorTargets(targetIds, '.' + CLASS.chartArc)).each(function(d) {\\n if (!$$.shouldExpand(d.data.id)) {\\n return;\\n }\\n $$.d3\\n .select(this)\\n .selectAll('path')\\n .transition()\\n .duration($$.expandDuration(d.data.id))\\n .attr('d', $$.svgArcExpanded)\\n .transition()\\n .duration($$.expandDuration(d.data.id) * 2)\\n .attr('d', $$.svgArcExpandedSub)\\n .each(function(d) {\\n if ($$.isDonutType(d.data)) {\\n // callback here\\n }\\n });\\n });\\n };\\n\\n c3_chart_internal_fn.unexpandArc = function(targetIds) {\\n var $$ = this;\\n\\n if ($$.transiting) {\\n return;\\n }\\n\\n targetIds = $$.mapToTargetIds(targetIds);\\n\\n $$.svg\\n .selectAll($$.selectorTargets(targetIds, '.' + CLASS.chartArc))\\n .selectAll('path')\\n .transition()\\n .duration(function(d) {\\n return $$.expandDuration(d.data.id);\\n })\\n .attr('d', $$.svgArc);\\n $$.svg.selectAll('.' + CLASS.arc).style('opacity', 1);\\n };\\n\\n c3_chart_internal_fn.expandDuration = function(id) {\\n var $$ = this,\\n config = $$.config;\\n\\n if ($$.isDonutType(id)) {\\n return config.donut_expand_duration;\\n } else if ($$.isGaugeType(id)) {\\n return config.gauge_expand_duration;\\n } else if ($$.isPieType(id)) {\\n return config.pie_expand_duration;\\n } else {\\n return 50;\\n }\\n };\\n\\n c3_chart_internal_fn.shouldExpand = function(id) {\\n var $$ = this,\\n config = $$.config;\\n return (\\n ($$.isDonutType(id) && config.donut_expand) ||\\n ($$.isGaugeType(id) && config.gauge_expand) ||\\n ($$.isPieType(id) && config.pie_expand)\\n );\\n };\\n\\n c3_chart_internal_fn.shouldShowArcLabel = function() {\\n var $$ = this,\\n config = $$.config,\\n shouldShow = true;\\n if ($$.hasType('donut')) {\\n shouldShow = config.donut_label_show;\\n } else if ($$.hasType('pie')) {\\n shouldShow = config.pie_label_show;\\n }\\n // when gauge, always true\\n return shouldShow;\\n };\\n\\n c3_chart_internal_fn.meetsArcLabelThreshold = function(ratio) {\\n var $$ = this,\\n config = $$.config,\\n threshold = $$.hasType('donut') ? config.donut_label_threshold : config.pie_label_threshold;\\n return ratio >= threshold;\\n };\\n\\n c3_chart_internal_fn.getArcLabelFormat = function() {\\n var $$ = this,\\n config = $$.config,\\n format = config.pie_label_format;\\n if ($$.hasType('gauge')) {\\n format = config.gauge_label_format;\\n } else if ($$.hasType('donut')) {\\n format = config.donut_label_format;\\n }\\n return format;\\n };\\n\\n c3_chart_internal_fn.getArcTitle = function() {\\n var $$ = this;\\n return $$.hasType('donut') ? $$.config.donut_title : '';\\n };\\n\\n c3_chart_internal_fn.updateTargetsForArc = function(targets) {\\n var $$ = this,\\n main = $$.main,\\n mainPieUpdate,\\n mainPieEnter,\\n classChartArc = $$.classChartArc.bind($$),\\n classArcs = $$.classArcs.bind($$),\\n classFocus = $$.classFocus.bind($$);\\n mainPieUpdate = main\\n .select('.' + CLASS.chartArcs)\\n .selectAll('.' + CLASS.chartArc)\\n .data($$.pie(targets))\\n .attr('class', function(d) {\\n return classChartArc(d) + classFocus(d.data);\\n });\\n mainPieEnter = mainPieUpdate\\n .enter()\\n .append('g')\\n .attr('class', classChartArc);\\n mainPieEnter.append('g').attr('class', classArcs);\\n mainPieEnter\\n .append('text')\\n // .attr('dy', $$.hasType('gauge') ? '-.1em' : '.35em') Prolaera - Switched\\n .attr('dy', $$.hasType('gauge') ? '-1em' : '.35em')\\n .style('opacity', 0)\\n .style('text-anchor', 'middle')\\n .style('pointer-events', 'none');\\n // MEMO: can not keep same color..., but not bad to update color in redraw\\n //mainPieUpdate.exit().remove();\\n };\\n\\n c3_chart_internal_fn.initArc = function() {\\n var $$ = this;\\n $$.arcs = $$.main\\n .select('.' + CLASS.chart)\\n .append('g')\\n .attr('class', CLASS.chartArcs)\\n .attr('transform', $$.getTranslate('arc'));\\n $$.arcs\\n .append('text')\\n .attr('class', CLASS.chartArcsTitle)\\n .style('text-anchor', 'middle')\\n .text($$.getArcTitle());\\n };\\n\\n c3_chart_internal_fn.redrawArc = function(duration, durationForExit, withTransform) {\\n var $$ = this,\\n d3 = $$.d3,\\n config = $$.config,\\n main = $$.main,\\n mainArc;\\n mainArc = main\\n .selectAll('.' + CLASS.arcs)\\n .selectAll('.' + CLASS.arc)\\n .data($$.arcData.bind($$));\\n mainArc\\n .enter()\\n .append('path')\\n .attr('class', $$.classArc.bind($$))\\n .style('fill', function(d) {\\n return $$.color(d.data);\\n })\\n .style('cursor', function(d) {\\n return config.interaction_enabled && config.data_selection_isselectable(d) ? 'pointer' : null;\\n })\\n .style('opacity', 0)\\n .each(function(d) {\\n if ($$.isGaugeType(d.data)) {\\n d.startAngle = d.endAngle = config.gauge_startingAngle;\\n }\\n this._current = d;\\n });\\n mainArc\\n .attr('transform', function(d) {\\n return !$$.isGaugeType(d.data) && withTransform ? 'scale(0)' : '';\\n })\\n .style('opacity', function(d) {\\n return d === this._current ? 0 : 1;\\n })\\n .on(\\n 'mouseover',\\n config.interaction_enabled\\n ? function(d) {\\n var updated, arcData;\\n if ($$.transiting) {\\n // skip while transiting\\n return;\\n }\\n updated = $$.updateAngle(d);\\n if (updated) {\\n arcData = $$.convertToArcData(updated);\\n // transitions\\n $$.expandArc(updated.data.id);\\n $$.api.focus(updated.data.id);\\n $$.toggleFocusLegend(updated.data.id, true);\\n $$.config.data_onmouseover(arcData, this);\\n }\\n }\\n : null\\n )\\n .on(\\n 'mousemove',\\n config.interaction_enabled\\n ? function(d) {\\n var updated = $$.updateAngle(d),\\n arcData,\\n selectedData;\\n if (updated) {\\n (arcData = $$.convertToArcData(updated)), (selectedData = [arcData]);\\n $$.showTooltip(selectedData, this);\\n }\\n }\\n : null\\n )\\n .on(\\n 'mouseout',\\n config.interaction_enabled\\n ? function(d) {\\n var updated, arcData;\\n if ($$.transiting) {\\n // skip while transiting\\n return;\\n }\\n updated = $$.updateAngle(d);\\n if (updated) {\\n arcData = $$.convertToArcData(updated);\\n // transitions\\n $$.unexpandArc(updated.data.id);\\n $$.api.revert();\\n $$.revertLegend();\\n $$.hideTooltip();\\n $$.config.data_onmouseout(arcData, this);\\n }\\n }\\n : null\\n )\\n .on(\\n 'click',\\n config.interaction_enabled\\n ? function(d, i) {\\n var updated = $$.updateAngle(d),\\n arcData;\\n if (updated) {\\n arcData = $$.convertToArcData(updated);\\n if ($$.toggleShape) {\\n $$.toggleShape(this, arcData, i);\\n }\\n $$.config.data_onclick.call($$.api, arcData, this);\\n }\\n }\\n : null\\n )\\n .each(function() {\\n $$.transiting = true;\\n })\\n .transition()\\n .duration(duration)\\n .attrTween('d', function(d) {\\n var updated = $$.updateAngle(d),\\n interpolate;\\n if (!updated) {\\n return function() {\\n return 'M 0 0';\\n };\\n }\\n // if (this._current === d) {\\n // this._current = {\\n // startAngle: Math.PI*2,\\n // endAngle: Math.PI*2,\\n // };\\n // }\\n if (isNaN(this._current.startAngle)) {\\n this._current.startAngle = 0;\\n }\\n if (isNaN(this._current.endAngle)) {\\n this._current.endAngle = this._current.startAngle;\\n }\\n interpolate = d3.interpolate(this._current, updated);\\n this._current = interpolate(0);\\n return function(t) {\\n var interpolated = interpolate(t);\\n interpolated.data = d.data; // data.id will be updated by interporator\\n return $$.getArc(interpolated, true);\\n };\\n })\\n .attr('transform', withTransform ? 'scale(1)' : '')\\n .style('fill', function(d) {\\n return $$.levelColor ? $$.levelColor(d.data.values[0].value) : $$.color(d.data.id);\\n }) // Where gauge reading color would receive customization.\\n .style('opacity', 1)\\n .call($$.endall, function() {\\n $$.transiting = false;\\n });\\n mainArc\\n .exit()\\n .transition()\\n .duration(durationForExit)\\n .style('opacity', 0)\\n .remove();\\n main\\n .selectAll('.' + CLASS.chartArc)\\n .select('text')\\n .style('opacity', 0)\\n .attr('class', function(d) {\\n return $$.isGaugeType(d.data) ? CLASS.gaugeValue : '';\\n })\\n .text($$.textForArcLabel.bind($$))\\n .attr('transform', $$.transformForArcLabel.bind($$))\\n .style('font-size', function(d) {\\n return $$.isGaugeType(d.data) ? Math.round($$.radius / 5) + 'px' : '';\\n })\\n .transition()\\n .duration(duration)\\n .style('opacity', function(d) {\\n return $$.isTargetToShow(d.data.id) && $$.isArcType(d.data) ? 1 : 0;\\n });\\n main.select('.' + CLASS.chartArcsTitle).style('opacity', $$.hasType('donut') || $$.hasType('gauge') ? 1 : 0);\\n\\n if ($$.hasType('gauge')) {\\n $$.arcs.select('.' + CLASS.chartArcsBackground).attr('d', function() {\\n var d = {\\n data: [{ value: config.gauge_max }],\\n startAngle: config.gauge_startingAngle,\\n endAngle: -1 * config.gauge_startingAngle\\n };\\n return $$.getArc(d, true, true);\\n });\\n $$.arcs\\n .select('.' + CLASS.chartArcsGaugeUnit)\\n // .attr('dy', '1.2em') Prolaera - Commenting this line out moves the text in the gauge up\\n .text(config.gauge_label_show ? config.gauge_units : '');\\n $$.arcs\\n .select('.' + CLASS.chartArcsGaugeMin)\\n .attr('dx', -1 * ($$.innerRadius + ($$.radius - $$.innerRadius) / (config.gauge_fullCircle ? 1 : 2)) + 'px')\\n .attr('dy', '1.2em')\\n .text(config.gauge_label_show ? config.gauge_min : '');\\n $$.arcs\\n .select('.' + CLASS.chartArcsGaugeMax)\\n .attr('dx', $$.innerRadius + ($$.radius - $$.innerRadius) / (config.gauge_fullCircle ? 1 : 2) + 'px')\\n .attr('dy', '1.2em')\\n .text(config.gauge_label_show ? (config.gauge_max / 100).toFixed(1) : ''); // Prolaera - toFixed\\n }\\n };\\n c3_chart_internal_fn.initGauge = function() {\\n var arcs = this.arcs;\\n if (this.hasType('gauge')) {\\n arcs.append('path').attr('class', CLASS.chartArcsBackground);\\n arcs\\n .append('text')\\n .attr('class', CLASS.chartArcsGaugeUnit)\\n .style('text-anchor', 'middle')\\n .style('pointer-events', 'none');\\n arcs\\n .append('text')\\n .attr('class', CLASS.chartArcsGaugeMin)\\n .style('text-anchor', 'middle')\\n .style('pointer-events', 'none');\\n arcs\\n .append('text')\\n .attr('class', CLASS.chartArcsGaugeMax)\\n .style('text-anchor', 'middle')\\n .style('pointer-events', 'none');\\n }\\n };\\n c3_chart_internal_fn.getGaugeLabelHeight = function() {\\n return this.config.gauge_label_show ? 30 : 0;\\n };\\n\\n c3_chart_internal_fn.initRegion = function() {\\n var $$ = this;\\n $$.region = $$.main\\n .append('g')\\n .attr('clip-path', $$.clipPath)\\n .attr('class', CLASS.regions);\\n };\\n c3_chart_internal_fn.updateRegion = function(duration) {\\n var $$ = this,\\n config = $$.config;\\n\\n // hide if arc type\\n $$.region.style('visibility', $$.hasArcType() ? 'hidden' : 'visible');\\n\\n $$.mainRegion = $$.main\\n .select('.' + CLASS.regions)\\n .selectAll('.' + CLASS.region)\\n .data(config.regions);\\n $$.mainRegion\\n .enter()\\n .append('g')\\n .append('rect')\\n .style('fill-opacity', 0);\\n $$.mainRegion.attr('class', $$.classRegion.bind($$));\\n $$.mainRegion\\n .exit()\\n .transition()\\n .duration(duration)\\n .style('opacity', 0)\\n .remove();\\n };\\n c3_chart_internal_fn.redrawRegion = function(withTransition) {\\n var $$ = this,\\n regions = $$.mainRegion.selectAll('rect').each(function() {\\n // data is binded to g and it's not transferred to rect (child node) automatically,\\n // then data of each rect has to be updated manually.\\n // TODO: there should be more efficient way to solve this?\\n var parentData = $$.d3.select(this.parentNode).datum();\\n $$.d3.select(this).datum(parentData);\\n }),\\n x = $$.regionX.bind($$),\\n y = $$.regionY.bind($$),\\n w = $$.regionWidth.bind($$),\\n h = $$.regionHeight.bind($$);\\n return [\\n (withTransition ? regions.transition() : regions)\\n .attr('x', x)\\n .attr('y', y)\\n .attr('width', w)\\n .attr('height', h)\\n .style('fill-opacity', function(d) {\\n return isValue(d.opacity) ? d.opacity : 0.1;\\n })\\n ];\\n };\\n c3_chart_internal_fn.regionX = function(d) {\\n var $$ = this,\\n config = $$.config,\\n xPos,\\n yScale = d.axis === 'y' ? $$.y : $$.y2;\\n if (d.axis === 'y' || d.axis === 'y2') {\\n xPos = config.axis_rotated ? ('start' in d ? yScale(d.start) : 0) : 0;\\n } else {\\n xPos = config.axis_rotated ? 0 : 'start' in d ? $$.x($$.isTimeSeries() ? $$.parseDate(d.start) : d.start) : 0;\\n }\\n return xPos;\\n };\\n c3_chart_internal_fn.regionY = function(d) {\\n var $$ = this,\\n config = $$.config,\\n yPos,\\n yScale = d.axis === 'y' ? $$.y : $$.y2;\\n if (d.axis === 'y' || d.axis === 'y2') {\\n yPos = config.axis_rotated ? 0 : 'end' in d ? yScale(d.end) : 0;\\n } else {\\n yPos = config.axis_rotated ? ('start' in d ? $$.x($$.isTimeSeries() ? $$.parseDate(d.start) : d.start) : 0) : 0;\\n }\\n return yPos;\\n };\\n c3_chart_internal_fn.regionWidth = function(d) {\\n var $$ = this,\\n config = $$.config,\\n start = $$.regionX(d),\\n end,\\n yScale = d.axis === 'y' ? $$.y : $$.y2;\\n if (d.axis === 'y' || d.axis === 'y2') {\\n end = config.axis_rotated ? ('end' in d ? yScale(d.end) : $$.width) : $$.width;\\n } else {\\n end = config.axis_rotated\\n ? $$.width\\n : 'end' in d\\n ? $$.x($$.isTimeSeries() ? $$.parseDate(d.end) : d.end)\\n : $$.width;\\n }\\n return end < start ? 0 : end - start;\\n };\\n c3_chart_internal_fn.regionHeight = function(d) {\\n var $$ = this,\\n config = $$.config,\\n start = this.regionY(d),\\n end,\\n yScale = d.axis === 'y' ? $$.y : $$.y2;\\n if (d.axis === 'y' || d.axis === 'y2') {\\n end = config.axis_rotated ? $$.height : 'start' in d ? yScale(d.start) : $$.height;\\n } else {\\n end = config.axis_rotated\\n ? 'end' in d\\n ? $$.x($$.isTimeSeries() ? $$.parseDate(d.end) : d.end)\\n : $$.height\\n : $$.height;\\n }\\n return end < start ? 0 : end - start;\\n };\\n c3_chart_internal_fn.isRegionOnX = function(d) {\\n return !d.axis || d.axis === 'x';\\n };\\n\\n c3_chart_internal_fn.drag = function(mouse) {\\n var $$ = this,\\n config = $$.config,\\n main = $$.main,\\n d3 = $$.d3;\\n var sx, sy, mx, my, minX, maxX, minY, maxY;\\n\\n if ($$.hasArcType()) {\\n return;\\n }\\n if (!config.data_selection_enabled) {\\n return;\\n } // do nothing if not selectable\\n if (config.zoom_enabled && !$$.zoom.altDomain) {\\n return;\\n } // skip if zoomable because of conflict drag dehavior\\n if (!config.data_selection_multiple) {\\n return;\\n } // skip when single selection because drag is used for multiple selection\\n\\n sx = $$.dragStart[0];\\n sy = $$.dragStart[1];\\n mx = mouse[0];\\n my = mouse[1];\\n minX = Math.min(sx, mx);\\n maxX = Math.max(sx, mx);\\n minY = config.data_selection_grouped ? $$.margin.top : Math.min(sy, my);\\n maxY = config.data_selection_grouped ? $$.height : Math.max(sy, my);\\n\\n main\\n .select('.' + CLASS.dragarea)\\n .attr('x', minX)\\n .attr('y', minY)\\n .attr('width', maxX - minX)\\n .attr('height', maxY - minY);\\n // TODO: binary search when multiple xs\\n main\\n .selectAll('.' + CLASS.shapes)\\n .selectAll('.' + CLASS.shape)\\n .filter(function(d) {\\n return config.data_selection_isselectable(d);\\n })\\n .each(function(d, i) {\\n var shape = d3.select(this),\\n isSelected = shape.classed(CLASS.SELECTED),\\n isIncluded = shape.classed(CLASS.INCLUDED),\\n _x,\\n _y,\\n _w,\\n _h,\\n toggle,\\n isWithin = false,\\n box;\\n if (shape.classed(CLASS.circle)) {\\n _x = shape.attr('cx') * 1;\\n _y = shape.attr('cy') * 1;\\n toggle = $$.togglePoint;\\n isWithin = minX < _x && _x < maxX && minY < _y && _y < maxY;\\n } else if (shape.classed(CLASS.bar)) {\\n box = getPathBox(this);\\n _x = box.x;\\n _y = box.y;\\n _w = box.width;\\n _h = box.height;\\n toggle = $$.togglePath;\\n isWithin = !(maxX < _x || _x + _w < minX) && !(maxY < _y || _y + _h < minY);\\n } else {\\n // line/area selection not supported yet\\n return;\\n }\\n if (isWithin ^ isIncluded) {\\n shape.classed(CLASS.INCLUDED, !isIncluded);\\n // TODO: included/unincluded callback here\\n shape.classed(CLASS.SELECTED, !isSelected);\\n toggle.call($$, !isSelected, shape, d, i);\\n }\\n });\\n };\\n\\n c3_chart_internal_fn.dragstart = function(mouse) {\\n var $$ = this,\\n config = $$.config;\\n if ($$.hasArcType()) {\\n return;\\n }\\n if (!config.data_selection_enabled) {\\n return;\\n } // do nothing if not selectable\\n $$.dragStart = mouse;\\n $$.main\\n .select('.' + CLASS.chart)\\n .append('rect')\\n .attr('class', CLASS.dragarea)\\n .style('opacity', 0.1);\\n $$.dragging = true;\\n };\\n\\n c3_chart_internal_fn.dragend = function() {\\n var $$ = this,\\n config = $$.config;\\n if ($$.hasArcType()) {\\n return;\\n }\\n if (!config.data_selection_enabled) {\\n return;\\n } // do nothing if not selectable\\n $$.main\\n .select('.' + CLASS.dragarea)\\n .transition()\\n .duration(100)\\n .style('opacity', 0)\\n .remove();\\n $$.main.selectAll('.' + CLASS.shape).classed(CLASS.INCLUDED, false);\\n $$.dragging = false;\\n };\\n\\n c3_chart_internal_fn.selectPoint = function(target, d, i) {\\n var $$ = this,\\n config = $$.config,\\n cx = (config.axis_rotated ? $$.circleY : $$.circleX).bind($$),\\n cy = (config.axis_rotated ? $$.circleX : $$.circleY).bind($$),\\n r = $$.pointSelectR.bind($$);\\n config.data_onselected.call($$.api, d, target.node());\\n // add selected-circle on low layer g\\n $$.main\\n .select('.' + CLASS.selectedCircles + $$.getTargetSelectorSuffix(d.id))\\n .selectAll('.' + CLASS.selectedCircle + '-' + i)\\n .data([d])\\n .enter()\\n .append('circle')\\n .attr('class', function() {\\n return $$.generateClass(CLASS.selectedCircle, i);\\n })\\n .attr('cx', cx)\\n .attr('cy', cy)\\n .attr('stroke', function() {\\n return $$.color(d);\\n })\\n .attr('r', function(d) {\\n return $$.pointSelectR(d) * 1.4;\\n })\\n .transition()\\n .duration(100)\\n .attr('r', r);\\n };\\n c3_chart_internal_fn.unselectPoint = function(target, d, i) {\\n var $$ = this;\\n $$.config.data_onunselected.call($$.api, d, target.node());\\n // remove selected-circle from low layer g\\n $$.main\\n .select('.' + CLASS.selectedCircles + $$.getTargetSelectorSuffix(d.id))\\n .selectAll('.' + CLASS.selectedCircle + '-' + i)\\n .transition()\\n .duration(100)\\n .attr('r', 0)\\n .remove();\\n };\\n c3_chart_internal_fn.togglePoint = function(selected, target, d, i) {\\n selected ? this.selectPoint(target, d, i) : this.unselectPoint(target, d, i);\\n };\\n c3_chart_internal_fn.selectPath = function(target, d) {\\n var $$ = this;\\n $$.config.data_onselected.call($$, d, target.node());\\n if ($$.config.interaction_brighten) {\\n target\\n .transition()\\n .duration(100)\\n .style('fill', function() {\\n return $$.d3.rgb($$.color(d)).brighter(0.75);\\n });\\n }\\n };\\n c3_chart_internal_fn.unselectPath = function(target, d) {\\n var $$ = this;\\n $$.config.data_onunselected.call($$, d, target.node());\\n if ($$.config.interaction_brighten) {\\n target\\n .transition()\\n .duration(100)\\n .style('fill', function() {\\n return $$.color(d);\\n });\\n }\\n };\\n c3_chart_internal_fn.togglePath = function(selected, target, d, i) {\\n selected ? this.selectPath(target, d, i) : this.unselectPath(target, d, i);\\n };\\n c3_chart_internal_fn.getToggle = function(that, d) {\\n var $$ = this,\\n toggle;\\n if (that.nodeName === 'circle') {\\n if ($$.isStepType(d)) {\\n // circle is hidden in step chart, so treat as within the click area\\n toggle = function() {}; // TODO: how to select step chart?\\n } else {\\n toggle = $$.togglePoint;\\n }\\n } else if (that.nodeName === 'path') {\\n toggle = $$.togglePath;\\n }\\n return toggle;\\n };\\n c3_chart_internal_fn.toggleShape = function(that, d, i) {\\n var $$ = this,\\n d3 = $$.d3,\\n config = $$.config,\\n shape = d3.select(that),\\n isSelected = shape.classed(CLASS.SELECTED),\\n toggle = $$.getToggle(that, d).bind($$);\\n\\n if (config.data_selection_enabled && config.data_selection_isselectable(d)) {\\n if (!config.data_selection_multiple) {\\n $$.main\\n .selectAll('.' + CLASS.shapes + (config.data_selection_grouped ? $$.getTargetSelectorSuffix(d.id) : ''))\\n .selectAll('.' + CLASS.shape)\\n .each(function(d, i) {\\n var shape = d3.select(this);\\n if (shape.classed(CLASS.SELECTED)) {\\n toggle(false, shape.classed(CLASS.SELECTED, false), d, i);\\n }\\n });\\n }\\n shape.classed(CLASS.SELECTED, !isSelected);\\n toggle(!isSelected, shape, d, i);\\n }\\n };\\n\\n c3_chart_internal_fn.initBrush = function() {\\n var $$ = this,\\n d3 = $$.d3;\\n $$.brush = d3.svg.brush().on('brush', function() {\\n $$.redrawForBrush();\\n });\\n $$.brush.update = function() {\\n if ($$.context) {\\n $$.context.select('.' + CLASS.brush).call(this);\\n }\\n return this;\\n };\\n $$.brush.scale = function(scale) {\\n return $$.config.axis_rotated ? this.y(scale) : this.x(scale);\\n };\\n };\\n c3_chart_internal_fn.initSubchart = function() {\\n var $$ = this,\\n config = $$.config,\\n context = ($$.context = $$.svg.append('g').attr('transform', $$.getTranslate('context'))),\\n visibility = config.subchart_show ? 'visible' : 'hidden';\\n\\n context.style('visibility', visibility);\\n\\n // Define g for chart area\\n context\\n .append('g')\\n .attr('clip-path', $$.clipPathForSubchart)\\n .attr('class', CLASS.chart);\\n\\n // Define g for bar chart area\\n context\\n .select('.' + CLASS.chart)\\n .append('g')\\n .attr('class', CLASS.chartBars);\\n\\n // Define g for line chart area\\n context\\n .select('.' + CLASS.chart)\\n .append('g')\\n .attr('class', CLASS.chartLines);\\n\\n // Add extent rect for Brush\\n context\\n .append('g')\\n .attr('clip-path', $$.clipPath)\\n .attr('class', CLASS.brush)\\n .call($$.brush);\\n\\n // ATTENTION: This must be called AFTER chart added\\n // Add Axis\\n $$.axes.subx = context\\n .append('g')\\n .attr('class', CLASS.axisX)\\n .attr('transform', $$.getTranslate('subx'))\\n .attr('clip-path', config.axis_rotated ? '' : $$.clipPathForXAxis)\\n .style('visibility', config.subchart_axis_x_show ? visibility : 'hidden');\\n };\\n c3_chart_internal_fn.updateTargetsForSubchart = function(targets) {\\n var $$ = this,\\n context = $$.context,\\n config = $$.config,\\n contextLineEnter,\\n contextLineUpdate,\\n contextBarEnter,\\n contextBarUpdate,\\n classChartBar = $$.classChartBar.bind($$),\\n classBars = $$.classBars.bind($$),\\n classChartLine = $$.classChartLine.bind($$),\\n classLines = $$.classLines.bind($$),\\n classAreas = $$.classAreas.bind($$);\\n\\n if (config.subchart_show) {\\n //-- Bar --//\\n contextBarUpdate = context\\n .select('.' + CLASS.chartBars)\\n .selectAll('.' + CLASS.chartBar)\\n .data(targets)\\n .attr('class', classChartBar);\\n contextBarEnter = contextBarUpdate\\n .enter()\\n .append('g')\\n .style('opacity', 0)\\n .attr('class', classChartBar);\\n // Bars for each data\\n contextBarEnter.append('g').attr('class', classBars);\\n\\n //-- Line --//\\n contextLineUpdate = context\\n .select('.' + CLASS.chartLines)\\n .selectAll('.' + CLASS.chartLine)\\n .data(targets)\\n .attr('class', classChartLine);\\n contextLineEnter = contextLineUpdate\\n .enter()\\n .append('g')\\n .style('opacity', 0)\\n .attr('class', classChartLine);\\n // Lines for each data\\n contextLineEnter.append('g').attr('class', classLines);\\n // Area\\n contextLineEnter.append('g').attr('class', classAreas);\\n\\n //-- Brush --//\\n context\\n .selectAll('.' + CLASS.brush + ' rect')\\n .attr(config.axis_rotated ? 'width' : 'height', config.axis_rotated ? $$.width2 : $$.height2);\\n }\\n };\\n c3_chart_internal_fn.updateBarForSubchart = function(durationForExit) {\\n var $$ = this;\\n $$.contextBar = $$.context\\n .selectAll('.' + CLASS.bars)\\n .selectAll('.' + CLASS.bar)\\n .data($$.barData.bind($$));\\n $$.contextBar\\n .enter()\\n .append('path')\\n .attr('class', $$.classBar.bind($$))\\n .style('stroke', 'none')\\n .style('fill', $$.color);\\n $$.contextBar.style('opacity', $$.initialOpacity.bind($$));\\n $$.contextBar\\n .exit()\\n .transition()\\n .duration(durationForExit)\\n .style('opacity', 0)\\n .remove();\\n };\\n c3_chart_internal_fn.redrawBarForSubchart = function(drawBarOnSub, withTransition, duration) {\\n (withTransition ? this.contextBar.transition(Math.random().toString()).duration(duration) : this.contextBar)\\n .attr('d', drawBarOnSub)\\n .style('opacity', 1);\\n };\\n c3_chart_internal_fn.updateLineForSubchart = function(durationForExit) {\\n var $$ = this;\\n $$.contextLine = $$.context\\n .selectAll('.' + CLASS.lines)\\n .selectAll('.' + CLASS.line)\\n .data($$.lineData.bind($$));\\n $$.contextLine\\n .enter()\\n .append('path')\\n .attr('class', $$.classLine.bind($$))\\n .style('stroke', $$.color);\\n $$.contextLine.style('opacity', $$.initialOpacity.bind($$));\\n $$.contextLine\\n .exit()\\n .transition()\\n .duration(durationForExit)\\n .style('opacity', 0)\\n .remove();\\n };\\n c3_chart_internal_fn.redrawLineForSubchart = function(drawLineOnSub, withTransition, duration) {\\n (withTransition ? this.contextLine.transition(Math.random().toString()).duration(duration) : this.contextLine)\\n .attr('d', drawLineOnSub)\\n .style('opacity', 1);\\n };\\n c3_chart_internal_fn.updateAreaForSubchart = function(durationForExit) {\\n var $$ = this,\\n d3 = $$.d3;\\n $$.contextArea = $$.context\\n .selectAll('.' + CLASS.areas)\\n .selectAll('.' + CLASS.area)\\n .data($$.lineData.bind($$));\\n $$.contextArea\\n .enter()\\n .append('path')\\n .attr('class', $$.classArea.bind($$))\\n .style('fill', $$.color)\\n .style('opacity', function() {\\n $$.orgAreaOpacity = +d3.select(this).style('opacity');\\n return 0;\\n });\\n $$.contextArea.style('opacity', 0);\\n $$.contextArea\\n .exit()\\n .transition()\\n .duration(durationForExit)\\n .style('opacity', 0)\\n .remove();\\n };\\n c3_chart_internal_fn.redrawAreaForSubchart = function(drawAreaOnSub, withTransition, duration) {\\n (withTransition ? this.contextArea.transition(Math.random().toString()).duration(duration) : this.contextArea)\\n .attr('d', drawAreaOnSub)\\n .style('fill', this.color)\\n .style('opacity', this.orgAreaOpacity);\\n };\\n c3_chart_internal_fn.redrawSubchart = function(\\n withSubchart,\\n transitions,\\n duration,\\n durationForExit,\\n areaIndices,\\n barIndices,\\n lineIndices\\n ) {\\n var $$ = this,\\n d3 = $$.d3,\\n config = $$.config,\\n drawAreaOnSub,\\n drawBarOnSub,\\n drawLineOnSub;\\n\\n $$.context.style('visibility', config.subchart_show ? 'visible' : 'hidden');\\n\\n // subchart\\n if (config.subchart_show) {\\n // reflect main chart to extent on subchart if zoomed\\n if (d3.event && d3.event.type === 'zoom') {\\n $$.brush.extent($$.x.orgDomain()).update();\\n }\\n // update subchart elements if needed\\n if (withSubchart) {\\n // extent rect\\n if (!$$.brush.empty()) {\\n $$.brush.extent($$.x.orgDomain()).update();\\n }\\n // setup drawer - MEMO: this must be called after axis updated\\n drawAreaOnSub = $$.generateDrawArea(areaIndices, true);\\n drawBarOnSub = $$.generateDrawBar(barIndices, true);\\n drawLineOnSub = $$.generateDrawLine(lineIndices, true);\\n\\n $$.updateBarForSubchart(duration);\\n $$.updateLineForSubchart(duration);\\n $$.updateAreaForSubchart(duration);\\n\\n $$.redrawBarForSubchart(drawBarOnSub, duration, duration);\\n $$.redrawLineForSubchart(drawLineOnSub, duration, duration);\\n $$.redrawAreaForSubchart(drawAreaOnSub, duration, duration);\\n }\\n }\\n };\\n c3_chart_internal_fn.redrawForBrush = function() {\\n var $$ = this,\\n x = $$.x;\\n $$.redraw({\\n withTransition: false,\\n withY: $$.config.zoom_rescale,\\n withSubchart: false,\\n withUpdateXDomain: true,\\n withDimension: false\\n });\\n $$.config.subchart_onbrush.call($$.api, x.orgDomain());\\n };\\n c3_chart_internal_fn.transformContext = function(withTransition, transitions) {\\n var $$ = this,\\n subXAxis;\\n if (transitions && transitions.axisSubX) {\\n subXAxis = transitions.axisSubX;\\n } else {\\n subXAxis = $$.context.select('.' + CLASS.axisX);\\n if (withTransition) {\\n subXAxis = subXAxis.transition();\\n }\\n }\\n $$.context.attr('transform', $$.getTranslate('context'));\\n subXAxis.attr('transform', $$.getTranslate('subx'));\\n };\\n c3_chart_internal_fn.getDefaultExtent = function() {\\n var $$ = this,\\n config = $$.config,\\n extent = isFunction(config.axis_x_extent)\\n ? config.axis_x_extent($$.getXDomain($$.data.targets))\\n : config.axis_x_extent;\\n if ($$.isTimeSeries()) {\\n extent = [$$.parseDate(extent[0]), $$.parseDate(extent[1])];\\n }\\n return extent;\\n };\\n\\n c3_chart_internal_fn.initZoom = function() {\\n var $$ = this,\\n d3 = $$.d3,\\n config = $$.config,\\n startEvent;\\n\\n $$.zoom = d3.behavior\\n .zoom()\\n .on('zoomstart', function() {\\n startEvent = d3.event.sourceEvent;\\n $$.zoom.altDomain = d3.event.sourceEvent.altKey ? $$.x.orgDomain() : null;\\n config.zoom_onzoomstart.call($$.api, d3.event.sourceEvent);\\n })\\n .on('zoom', function() {\\n $$.redrawForZoom.call($$);\\n })\\n .on('zoomend', function() {\\n var event = d3.event.sourceEvent;\\n // if click, do nothing. otherwise, click interaction will be canceled.\\n if (event && startEvent.clientX === event.clientX && startEvent.clientY === event.clientY) {\\n return;\\n }\\n $$.redrawEventRect();\\n $$.updateZoom();\\n config.zoom_onzoomend.call($$.api, $$.x.orgDomain());\\n });\\n $$.zoom.scale = function(scale) {\\n return config.axis_rotated ? this.y(scale) : this.x(scale);\\n };\\n $$.zoom.orgScaleExtent = function() {\\n var extent = config.zoom_extent ? config.zoom_extent : [1, 10];\\n return [extent[0], Math.max($$.getMaxDataCount() / extent[1], extent[1])];\\n };\\n $$.zoom.updateScaleExtent = function() {\\n var ratio = diffDomain($$.x.orgDomain()) / diffDomain($$.getZoomDomain()),\\n extent = this.orgScaleExtent();\\n this.scaleExtent([extent[0] * ratio, extent[1] * ratio]);\\n return this;\\n };\\n };\\n c3_chart_internal_fn.getZoomDomain = function() {\\n var $$ = this,\\n config = $$.config,\\n d3 = $$.d3,\\n min = d3.min([$$.orgXDomain[0], config.zoom_x_min]),\\n max = d3.max([$$.orgXDomain[1], config.zoom_x_max]);\\n return [min, max];\\n };\\n c3_chart_internal_fn.updateZoom = function() {\\n var $$ = this,\\n z = $$.config.zoom_enabled ? $$.zoom : function() {};\\n $$.main\\n .select('.' + CLASS.zoomRect)\\n .call(z)\\n .on('dblclick.zoom', null);\\n $$.main\\n .selectAll('.' + CLASS.eventRect)\\n .call(z)\\n .on('dblclick.zoom', null);\\n };\\n c3_chart_internal_fn.redrawForZoom = function() {\\n var $$ = this,\\n d3 = $$.d3,\\n config = $$.config,\\n zoom = $$.zoom,\\n x = $$.x;\\n if (!config.zoom_enabled) {\\n return;\\n }\\n if ($$.filterTargetsToShow($$.data.targets).length === 0) {\\n return;\\n }\\n if (d3.event.sourceEvent.type === 'mousemove' && zoom.altDomain) {\\n x.domain(zoom.altDomain);\\n zoom.scale(x).updateScaleExtent();\\n return;\\n }\\n if ($$.isCategorized() && x.orgDomain()[0] === $$.orgXDomain[0]) {\\n x.domain([$$.orgXDomain[0] - 1e-10, x.orgDomain()[1]]);\\n }\\n $$.redraw({\\n withTransition: false,\\n withY: config.zoom_rescale,\\n withSubchart: false,\\n withEventRect: false,\\n withDimension: false\\n });\\n if (d3.event.sourceEvent.type === 'mousemove') {\\n $$.cancelClick = true;\\n }\\n config.zoom_onzoom.call($$.api, x.orgDomain());\\n };\\n\\n c3_chart_internal_fn.generateColor = function() {\\n var $$ = this,\\n config = $$.config,\\n d3 = $$.d3,\\n colors = config.data_colors,\\n pattern = notEmpty(config.color_pattern) ? config.color_pattern : d3.scale.category10().range(),\\n callback = config.data_color,\\n ids = [];\\n\\n return function(d) {\\n var id = d.id || (d.data && d.data.id) || d,\\n color;\\n\\n // if callback function is provided\\n if (colors[id] instanceof Function) {\\n color = colors[id](d);\\n }\\n // if specified, choose that color\\n else if (colors[id]) {\\n color = colors[id];\\n }\\n // if not specified, choose from pattern\\n else {\\n if (ids.indexOf(id) < 0) {\\n ids.push(id);\\n }\\n color = pattern[ids.indexOf(id) % pattern.length];\\n colors[id] = color;\\n }\\n return callback instanceof Function ? callback(color, d) : color;\\n };\\n };\\n c3_chart_internal_fn.generateLevelColor = function() {\\n var $$ = this,\\n config = $$.config,\\n colors = config.color_pattern,\\n threshold = config.color_threshold,\\n asValue = threshold.unit === 'value',\\n values = threshold.values && threshold.values.length ? threshold.values : [],\\n max = threshold.max || 100;\\n return notEmpty(config.color_threshold)\\n ? function(value) {\\n var i,\\n v,\\n color = colors[colors.length - 1];\\n for (i = 0; i < values.length; i++) {\\n v = asValue ? value : (value * 100) / max;\\n if (v < values[i]) {\\n color = colors[i];\\n break;\\n }\\n }\\n return color;\\n }\\n : null;\\n };\\n\\n c3_chart_internal_fn.getYFormat = function(forArc) {\\n var $$ = this,\\n formatForY = forArc && !$$.hasType('gauge') ? $$.defaultArcValueFormat : $$.yFormat,\\n formatForY2 = forArc && !$$.hasType('gauge') ? $$.defaultArcValueFormat : $$.y2Format;\\n return function(v, ratio, id) {\\n var format = $$.axis.getId(id) === 'y2' ? formatForY2 : formatForY;\\n return format.call($$, v, ratio);\\n };\\n };\\n c3_chart_internal_fn.yFormat = function(v) {\\n var $$ = this,\\n config = $$.config,\\n format = config.axis_y_tick_format ? config.axis_y_tick_format : $$.defaultValueFormat;\\n return format(v);\\n };\\n c3_chart_internal_fn.y2Format = function(v) {\\n var $$ = this,\\n config = $$.config,\\n format = config.axis_y2_tick_format ? config.axis_y2_tick_format : $$.defaultValueFormat;\\n return format(v);\\n };\\n c3_chart_internal_fn.defaultValueFormat = function(v) {\\n return isValue(v) ? +v : '';\\n };\\n c3_chart_internal_fn.defaultArcValueFormat = function(v, ratio) {\\n // v is value\\n // ratio is the diff\\n return (v / 100).toFixed(1) + ''; // Prolaera - tofixed\\n\\n // Gauge label for ratio\\n // return (ratio * 100).toFixed(1) + '';\\n };\\n c3_chart_internal_fn.dataLabelFormat = function(targetId) {\\n var $$ = this,\\n data_labels = $$.config.data_labels,\\n format,\\n defaultFormat = function(v) {\\n return isValue(v) ? +v : '';\\n };\\n // find format according to axis id\\n if (typeof data_labels.format === 'function') {\\n format = data_labels.format;\\n } else if (typeof data_labels.format === 'object') {\\n if (data_labels.format[targetId]) {\\n format = data_labels.format[targetId] === true ? defaultFormat : data_labels.format[targetId];\\n } else {\\n format = function() {\\n return '';\\n };\\n }\\n } else {\\n format = defaultFormat;\\n }\\n return format;\\n };\\n\\n c3_chart_internal_fn.hasCaches = function(ids) {\\n for (var i = 0; i < ids.length; i++) {\\n if (!(ids[i] in this.cache)) {\\n return false;\\n }\\n }\\n return true;\\n };\\n c3_chart_internal_fn.addCache = function(id, target) {\\n this.cache[id] = this.cloneTarget(target);\\n };\\n c3_chart_internal_fn.getCaches = function(ids) {\\n var targets = [],\\n i;\\n for (i = 0; i < ids.length; i++) {\\n if (ids[i] in this.cache) {\\n targets.push(this.cloneTarget(this.cache[ids[i]]));\\n }\\n }\\n return targets;\\n };\\n\\n var CLASS = (c3_chart_internal_fn.CLASS = {\\n target: 'c3-target',\\n chart: 'c3-chart',\\n chartLine: 'c3-chart-line',\\n chartLines: 'c3-chart-lines',\\n chartBar: 'c3-chart-bar',\\n chartBars: 'c3-chart-bars',\\n chartText: 'c3-chart-text',\\n chartTexts: 'c3-chart-texts',\\n chartArc: 'c3-chart-arc',\\n chartArcs: 'c3-chart-arcs',\\n chartArcsTitle: 'c3-chart-arcs-title',\\n chartArcsBackground: 'c3-chart-arcs-background',\\n chartArcsGaugeUnit: 'c3-chart-arcs-gauge-unit',\\n chartArcsGaugeMax: 'c3-chart-arcs-gauge-max',\\n chartArcsGaugeMin: 'c3-chart-arcs-gauge-min',\\n selectedCircle: 'c3-selected-circle',\\n selectedCircles: 'c3-selected-circles',\\n eventRect: 'c3-event-rect',\\n eventRects: 'c3-event-rects',\\n eventRectsSingle: 'c3-event-rects-single',\\n eventRectsMultiple: 'c3-event-rects-multiple',\\n zoomRect: 'c3-zoom-rect',\\n brush: 'c3-brush',\\n focused: 'c3-focused',\\n defocused: 'c3-defocused',\\n region: 'c3-region',\\n regions: 'c3-regions',\\n title: 'c3-title',\\n tooltipContainer: 'c3-tooltip-container',\\n tooltip: 'c3-tooltip',\\n tooltipName: 'c3-tooltip-name',\\n shape: 'c3-shape',\\n shapes: 'c3-shapes',\\n line: 'c3-line',\\n lines: 'c3-lines',\\n bar: 'c3-bar',\\n bars: 'c3-bars',\\n circle: 'c3-circle',\\n circles: 'c3-circles',\\n arc: 'c3-arc',\\n arcs: 'c3-arcs',\\n area: 'c3-area',\\n areas: 'c3-areas',\\n empty: 'c3-empty',\\n text: 'c3-text',\\n texts: 'c3-texts',\\n gaugeValue: 'c3-gauge-value',\\n grid: 'c3-grid',\\n gridLines: 'c3-grid-lines',\\n xgrid: 'c3-xgrid',\\n xgrids: 'c3-xgrids',\\n xgridLine: 'c3-xgrid-line',\\n xgridLines: 'c3-xgrid-lines',\\n xgridFocus: 'c3-xgrid-focus',\\n ygrid: 'c3-ygrid',\\n ygrids: 'c3-ygrids',\\n ygridLine: 'c3-ygrid-line',\\n ygridLines: 'c3-ygrid-lines',\\n axis: 'c3-axis',\\n axisX: 'c3-axis-x',\\n axisXLabel: 'c3-axis-x-label',\\n axisY: 'c3-axis-y',\\n axisYLabel: 'c3-axis-y-label',\\n axisY2: 'c3-axis-y2',\\n axisY2Label: 'c3-axis-y2-label',\\n legendBackground: 'c3-legend-background',\\n legendItem: 'c3-legend-item',\\n legendItemEvent: 'c3-legend-item-event',\\n legendItemTile: 'c3-legend-item-tile',\\n legendItemHidden: 'c3-legend-item-hidden',\\n legendItemFocused: 'c3-legend-item-focused',\\n dragarea: 'c3-dragarea',\\n EXPANDED: '_expanded_',\\n SELECTED: '_selected_',\\n INCLUDED: '_included_'\\n });\\n c3_chart_internal_fn.generateClass = function(prefix, targetId) {\\n return ' ' + prefix + ' ' + prefix + this.getTargetSelectorSuffix(targetId);\\n };\\n c3_chart_internal_fn.classText = function(d) {\\n return this.generateClass(CLASS.text, d.index);\\n };\\n c3_chart_internal_fn.classTexts = function(d) {\\n return this.generateClass(CLASS.texts, d.id);\\n };\\n c3_chart_internal_fn.classShape = function(d) {\\n return this.generateClass(CLASS.shape, d.index);\\n };\\n c3_chart_internal_fn.classShapes = function(d) {\\n return this.generateClass(CLASS.shapes, d.id);\\n };\\n c3_chart_internal_fn.classLine = function(d) {\\n return this.classShape(d) + this.generateClass(CLASS.line, d.id);\\n };\\n c3_chart_internal_fn.classLines = function(d) {\\n return this.classShapes(d) + this.generateClass(CLASS.lines, d.id);\\n };\\n c3_chart_internal_fn.classCircle = function(d) {\\n return this.classShape(d) + this.generateClass(CLASS.circle, d.index);\\n };\\n c3_chart_internal_fn.classCircles = function(d) {\\n return this.classShapes(d) + this.generateClass(CLASS.circles, d.id);\\n };\\n c3_chart_internal_fn.classBar = function(d) {\\n return this.classShape(d) + this.generateClass(CLASS.bar, d.index);\\n };\\n c3_chart_internal_fn.classBars = function(d) {\\n return this.classShapes(d) + this.generateClass(CLASS.bars, d.id);\\n };\\n c3_chart_internal_fn.classArc = function(d) {\\n return this.classShape(d.data) + this.generateClass(CLASS.arc, d.data.id);\\n };\\n c3_chart_internal_fn.classArcs = function(d) {\\n return this.classShapes(d.data) + this.generateClass(CLASS.arcs, d.data.id);\\n };\\n c3_chart_internal_fn.classArea = function(d) {\\n return this.classShape(d) + this.generateClass(CLASS.area, d.id);\\n };\\n c3_chart_internal_fn.classAreas = function(d) {\\n return this.classShapes(d) + this.generateClass(CLASS.areas, d.id);\\n };\\n c3_chart_internal_fn.classRegion = function(d, i) {\\n return this.generateClass(CLASS.region, i) + ' ' + ('class' in d ? d['class'] : '');\\n };\\n c3_chart_internal_fn.classEvent = function(d) {\\n return this.generateClass(CLASS.eventRect, d.index);\\n };\\n c3_chart_internal_fn.classTarget = function(id) {\\n var $$ = this;\\n var additionalClassSuffix = $$.config.data_classes[id],\\n additionalClass = '';\\n if (additionalClassSuffix) {\\n additionalClass = ' ' + CLASS.target + '-' + additionalClassSuffix;\\n }\\n return $$.generateClass(CLASS.target, id) + additionalClass;\\n };\\n c3_chart_internal_fn.classFocus = function(d) {\\n return this.classFocused(d) + this.classDefocused(d);\\n };\\n c3_chart_internal_fn.classFocused = function(d) {\\n return ' ' + (this.focusedTargetIds.indexOf(d.id) >= 0 ? CLASS.focused : '');\\n };\\n c3_chart_internal_fn.classDefocused = function(d) {\\n return ' ' + (this.defocusedTargetIds.indexOf(d.id) >= 0 ? CLASS.defocused : '');\\n };\\n c3_chart_internal_fn.classChartText = function(d) {\\n return CLASS.chartText + this.classTarget(d.id);\\n };\\n c3_chart_internal_fn.classChartLine = function(d) {\\n return CLASS.chartLine + this.classTarget(d.id);\\n };\\n c3_chart_internal_fn.classChartBar = function(d) {\\n return CLASS.chartBar + this.classTarget(d.id);\\n };\\n c3_chart_internal_fn.classChartArc = function(d) {\\n return CLASS.chartArc + this.classTarget(d.data.id);\\n };\\n c3_chart_internal_fn.getTargetSelectorSuffix = function(targetId) {\\n return targetId || targetId === 0 ? ('-' + targetId).replace(/[\\\\s?!@#$%^&*()_=+,.<>'\\\":;\\\\[\\\\]\\\\/|~`{}\\\\\\\\]/g, '-') : '';\\n };\\n c3_chart_internal_fn.selectorTarget = function(id, prefix) {\\n return (prefix || '') + '.' + CLASS.target + this.getTargetSelectorSuffix(id);\\n };\\n c3_chart_internal_fn.selectorTargets = function(ids, prefix) {\\n var $$ = this;\\n ids = ids || [];\\n return ids.length\\n ? ids.map(function(id) {\\n return $$.selectorTarget(id, prefix);\\n })\\n : null;\\n };\\n c3_chart_internal_fn.selectorLegend = function(id) {\\n return '.' + CLASS.legendItem + this.getTargetSelectorSuffix(id);\\n };\\n c3_chart_internal_fn.selectorLegends = function(ids) {\\n var $$ = this;\\n return ids && ids.length\\n ? ids.map(function(id) {\\n return $$.selectorLegend(id);\\n })\\n : null;\\n };\\n\\n var isValue = (c3_chart_internal_fn.isValue = function(v) {\\n return v || v === 0;\\n }),\\n isFunction = (c3_chart_internal_fn.isFunction = function(o) {\\n return typeof o === 'function';\\n }),\\n isString = (c3_chart_internal_fn.isString = function(o) {\\n return typeof o === 'string';\\n }),\\n isUndefined = (c3_chart_internal_fn.isUndefined = function(v) {\\n return typeof v === 'undefined';\\n }),\\n isDefined = (c3_chart_internal_fn.isDefined = function(v) {\\n return typeof v !== 'undefined';\\n }),\\n ceil10 = (c3_chart_internal_fn.ceil10 = function(v) {\\n return Math.ceil(v / 10) * 10;\\n }),\\n asHalfPixel = (c3_chart_internal_fn.asHalfPixel = function(n) {\\n return Math.ceil(n) + 0.5;\\n }),\\n diffDomain = (c3_chart_internal_fn.diffDomain = function(d) {\\n return d[1] - d[0];\\n }),\\n isEmpty = (c3_chart_internal_fn.isEmpty = function(o) {\\n return (\\n typeof o === 'undefined' ||\\n o === null ||\\n (isString(o) && o.length === 0) ||\\n (typeof o === 'object' && Object.keys(o).length === 0)\\n );\\n }),\\n notEmpty = (c3_chart_internal_fn.notEmpty = function(o) {\\n return !c3_chart_internal_fn.isEmpty(o);\\n }),\\n getOption = (c3_chart_internal_fn.getOption = function(options, key, defaultValue) {\\n return isDefined(options[key]) ? options[key] : defaultValue;\\n }),\\n hasValue = (c3_chart_internal_fn.hasValue = function(dict, value) {\\n var found = false;\\n Object.keys(dict).forEach(function(key) {\\n if (dict[key] === value) {\\n found = true;\\n }\\n });\\n return found;\\n }),\\n sanitise = (c3_chart_internal_fn.sanitise = function(str) {\\n return typeof str === 'string' ? str.replace(/</g, '<').replace(/>/g, '>') : str;\\n }),\\n getPathBox = (c3_chart_internal_fn.getPathBox = function(path) {\\n var box = path.getBoundingClientRect(),\\n items = [path.pathSegList.getItem(0), path.pathSegList.getItem(1)],\\n minX = items[0].x,\\n minY = Math.min(items[0].y, items[1].y);\\n return { x: minX, y: minY, width: box.width, height: box.height };\\n });\\n\\n c3_chart_fn.focus = function(targetIds) {\\n var $$ = this.internal,\\n candidates;\\n\\n targetIds = $$.mapToTargetIds(targetIds);\\n (candidates = $$.svg.selectAll($$.selectorTargets(targetIds.filter($$.isTargetToShow, $$)))), this.revert();\\n this.defocus();\\n candidates.classed(CLASS.focused, true).classed(CLASS.defocused, false);\\n if ($$.hasArcType()) {\\n $$.expandArc(targetIds);\\n }\\n $$.toggleFocusLegend(targetIds, true);\\n\\n $$.focusedTargetIds = targetIds;\\n $$.defocusedTargetIds = $$.defocusedTargetIds.filter(function(id) {\\n return targetIds.indexOf(id) < 0;\\n });\\n };\\n\\n c3_chart_fn.defocus = function(targetIds) {\\n var $$ = this.internal,\\n candidates;\\n\\n targetIds = $$.mapToTargetIds(targetIds);\\n (candidates = $$.svg.selectAll($$.selectorTargets(targetIds.filter($$.isTargetToShow, $$)))),\\n candidates.classed(CLASS.focused, false).classed(CLASS.defocused, true);\\n if ($$.hasArcType()) {\\n $$.unexpandArc(targetIds);\\n }\\n $$.toggleFocusLegend(targetIds, false);\\n\\n $$.focusedTargetIds = $$.focusedTargetIds.filter(function(id) {\\n return targetIds.indexOf(id) < 0;\\n });\\n $$.defocusedTargetIds = targetIds;\\n };\\n\\n c3_chart_fn.revert = function(targetIds) {\\n var $$ = this.internal,\\n candidates;\\n\\n targetIds = $$.mapToTargetIds(targetIds);\\n candidates = $$.svg.selectAll($$.selectorTargets(targetIds)); // should be for all targets\\n\\n candidates.classed(CLASS.focused, false).classed(CLASS.defocused, false);\\n if ($$.hasArcType()) {\\n $$.unexpandArc(targetIds);\\n }\\n if ($$.config.legend_show) {\\n $$.showLegend(targetIds.filter($$.isLegendToShow.bind($$)));\\n $$.legend\\n .selectAll($$.selectorLegends(targetIds))\\n .filter(function() {\\n return $$.d3.select(this).classed(CLASS.legendItemFocused);\\n })\\n .classed(CLASS.legendItemFocused, false);\\n }\\n\\n $$.focusedTargetIds = [];\\n $$.defocusedTargetIds = [];\\n };\\n\\n c3_chart_fn.show = function(targetIds, options) {\\n var $$ = this.internal,\\n targets;\\n\\n targetIds = $$.mapToTargetIds(targetIds);\\n options = options || {};\\n\\n $$.removeHiddenTargetIds(targetIds);\\n targets = $$.svg.selectAll($$.selectorTargets(targetIds));\\n\\n targets\\n .transition()\\n .style('opacity', 1, 'important')\\n .call($$.endall, function() {\\n targets.style('opacity', null).style('opacity', 1);\\n });\\n\\n if (options.withLegend) {\\n $$.showLegend(targetIds);\\n }\\n\\n $$.redraw({ withUpdateOrgXDomain: true, withUpdateXDomain: true, withLegend: true });\\n };\\n\\n c3_chart_fn.hide = function(targetIds, options) {\\n var $$ = this.internal,\\n targets;\\n\\n targetIds = $$.mapToTargetIds(targetIds);\\n options = options || {};\\n\\n $$.addHiddenTargetIds(targetIds);\\n targets = $$.svg.selectAll($$.selectorTargets(targetIds));\\n\\n targets\\n .transition()\\n .style('opacity', 0, 'important')\\n .call($$.endall, function() {\\n targets.style('opacity', null).style('opacity', 0);\\n });\\n\\n if (options.withLegend) {\\n $$.hideLegend(targetIds);\\n }\\n\\n $$.redraw({ withUpdateOrgXDomain: true, withUpdateXDomain: true, withLegend: true });\\n };\\n\\n c3_chart_fn.toggle = function(targetIds, options) {\\n var that = this,\\n $$ = this.internal;\\n $$.mapToTargetIds(targetIds).forEach(function(targetId) {\\n $$.isTargetToShow(targetId) ? that.hide(targetId, options) : that.show(targetId, options);\\n });\\n };\\n\\n c3_chart_fn.zoom = function(domain) {\\n var $$ = this.internal;\\n if (domain) {\\n if ($$.isTimeSeries()) {\\n domain = domain.map(function(x) {\\n return $$.parseDate(x);\\n });\\n }\\n $$.brush.extent(domain);\\n $$.redraw({ withUpdateXDomain: true, withY: $$.config.zoom_rescale });\\n $$.config.zoom_onzoom.call(this, $$.x.orgDomain());\\n }\\n return $$.brush.extent();\\n };\\n c3_chart_fn.zoom.enable = function(enabled) {\\n var $$ = this.internal;\\n $$.config.zoom_enabled = enabled;\\n $$.updateAndRedraw();\\n };\\n c3_chart_fn.unzoom = function() {\\n var $$ = this.internal;\\n $$.brush.clear().update();\\n $$.redraw({ withUpdateXDomain: true });\\n };\\n\\n c3_chart_fn.zoom.max = function(max) {\\n var $$ = this.internal,\\n config = $$.config,\\n d3 = $$.d3;\\n if (max === 0 || max) {\\n config.zoom_x_max = d3.max([$$.orgXDomain[1], max]);\\n } else {\\n return config.zoom_x_max;\\n }\\n };\\n\\n c3_chart_fn.zoom.min = function(min) {\\n var $$ = this.internal,\\n config = $$.config,\\n d3 = $$.d3;\\n if (min === 0 || min) {\\n config.zoom_x_min = d3.min([$$.orgXDomain[0], min]);\\n } else {\\n return config.zoom_x_min;\\n }\\n };\\n\\n c3_chart_fn.zoom.range = function(range) {\\n if (arguments.length) {\\n if (isDefined(range.max)) {\\n this.domain.max(range.max);\\n }\\n if (isDefined(range.min)) {\\n this.domain.min(range.min);\\n }\\n } else {\\n return {\\n max: this.domain.max(),\\n min: this.domain.min()\\n };\\n }\\n };\\n\\n c3_chart_fn.load = function(args) {\\n var $$ = this.internal,\\n config = $$.config;\\n // update xs if specified\\n if (args.xs) {\\n $$.addXs(args.xs);\\n }\\n // update names if exists\\n if ('names' in args) {\\n c3_chart_fn.data.names.bind(this)(args.names);\\n }\\n // update classes if exists\\n if ('classes' in args) {\\n Object.keys(args.classes).forEach(function(id) {\\n config.data_classes[id] = args.classes[id];\\n });\\n }\\n // update categories if exists\\n if ('categories' in args && $$.isCategorized()) {\\n config.axis_x_categories = args.categories;\\n }\\n // update axes if exists\\n if ('axes' in args) {\\n Object.keys(args.axes).forEach(function(id) {\\n config.data_axes[id] = args.axes[id];\\n });\\n }\\n // update colors if exists\\n if ('colors' in args) {\\n Object.keys(args.colors).forEach(function(id) {\\n config.data_colors[id] = args.colors[id];\\n });\\n }\\n // use cache if exists\\n if ('cacheIds' in args && $$.hasCaches(args.cacheIds)) {\\n $$.load($$.getCaches(args.cacheIds), args.done);\\n return;\\n }\\n // unload if needed\\n if ('unload' in args) {\\n // TODO: do not unload if target will load (included in url/rows/columns)\\n $$.unload($$.mapToTargetIds(typeof args.unload === 'boolean' && args.unload ? null : args.unload), function() {\\n $$.loadFromArgs(args);\\n });\\n } else {\\n $$.loadFromArgs(args);\\n }\\n };\\n\\n c3_chart_fn.unload = function(args) {\\n var $$ = this.internal;\\n args = args || {};\\n if (args instanceof Array) {\\n args = { ids: args };\\n } else if (typeof args === 'string') {\\n args = { ids: [args] };\\n }\\n $$.unload($$.mapToTargetIds(args.ids), function() {\\n $$.redraw({ withUpdateOrgXDomain: true, withUpdateXDomain: true, withLegend: true });\\n if (args.done) {\\n args.done();\\n }\\n });\\n };\\n\\n c3_chart_fn.flow = function(args) {\\n var $$ = this.internal,\\n targets,\\n data,\\n notfoundIds = [],\\n orgDataCount = $$.getMaxDataCount(),\\n dataCount,\\n domain,\\n baseTarget,\\n baseValue,\\n length = 0,\\n tail = 0,\\n diff,\\n to;\\n\\n if (args.json) {\\n data = $$.convertJsonToData(args.json, args.keys);\\n } else if (args.rows) {\\n data = $$.convertRowsToData(args.rows);\\n } else if (args.columns) {\\n data = $$.convertColumnsToData(args.columns);\\n } else {\\n return;\\n }\\n targets = $$.convertDataToTargets(data, true);\\n\\n // Update/Add data\\n $$.data.targets.forEach(function(t) {\\n var found = false,\\n i,\\n j;\\n for (i = 0; i < targets.length; i++) {\\n if (t.id === targets[i].id) {\\n found = true;\\n\\n if (t.values[t.values.length - 1]) {\\n tail = t.values[t.values.length - 1].index + 1;\\n }\\n length = targets[i].values.length;\\n\\n for (j = 0; j < length; j++) {\\n targets[i].values[j].index = tail + j;\\n if (!$$.isTimeSeries()) {\\n targets[i].values[j].x = tail + j;\\n }\\n }\\n t.values = t.values.concat(targets[i].values);\\n\\n targets.splice(i, 1);\\n break;\\n }\\n }\\n if (!found) {\\n notfoundIds.push(t.id);\\n }\\n });\\n\\n // Append null for not found targets\\n $$.data.targets.forEach(function(t) {\\n var i, j;\\n for (i = 0; i < notfoundIds.length; i++) {\\n if (t.id === notfoundIds[i]) {\\n tail = t.values[t.values.length - 1].index + 1;\\n for (j = 0; j < length; j++) {\\n t.values.push({\\n id: t.id,\\n index: tail + j,\\n x: $$.isTimeSeries() ? $$.getOtherTargetX(tail + j) : tail + j,\\n value: null\\n });\\n }\\n }\\n }\\n });\\n\\n // Generate null values for new target\\n if ($$.data.targets.length) {\\n targets.forEach(function(t) {\\n var i,\\n missing = [];\\n for (i = $$.data.targets[0].values[0].index; i < tail; i++) {\\n missing.push({\\n id: t.id,\\n index: i,\\n x: $$.isTimeSeries() ? $$.getOtherTargetX(i) : i,\\n value: null\\n });\\n }\\n t.values.forEach(function(v) {\\n v.index += tail;\\n if (!$$.isTimeSeries()) {\\n v.x += tail;\\n }\\n });\\n t.values = missing.concat(t.values);\\n });\\n }\\n $$.data.targets = $$.data.targets.concat(targets); // add remained\\n\\n // check data count because behavior needs to change when it's only one\\n dataCount = $$.getMaxDataCount();\\n baseTarget = $$.data.targets[0];\\n baseValue = baseTarget.values[0];\\n\\n // Update length to flow if needed\\n if (isDefined(args.to)) {\\n length = 0;\\n to = $$.isTimeSeries() ? $$.parseDate(args.to) : args.to;\\n baseTarget.values.forEach(function(v) {\\n if (v.x < to) {\\n length++;\\n }\\n });\\n } else if (isDefined(args.length)) {\\n length = args.length;\\n }\\n\\n // If only one data, update the domain to flow from left edge of the chart\\n if (!orgDataCount) {\\n if ($$.isTimeSeries()) {\\n if (baseTarget.values.length > 1) {\\n diff = baseTarget.values[baseTarget.values.length - 1].x - baseValue.x;\\n } else {\\n diff = baseValue.x - $$.getXDomain($$.data.targets)[0];\\n }\\n } else {\\n diff = 1;\\n }\\n domain = [baseValue.x - diff, baseValue.x];\\n $$.updateXDomain(null, true, true, false, domain);\\n } else if (orgDataCount === 1) {\\n if ($$.isTimeSeries()) {\\n diff = (baseTarget.values[baseTarget.values.length - 1].x - baseValue.x) / 2;\\n domain = [new Date(+baseValue.x - diff), new Date(+baseValue.x + diff)];\\n $$.updateXDomain(null, true, true, false, domain);\\n }\\n }\\n\\n // Set targets\\n $$.updateTargets($$.data.targets);\\n\\n // Redraw with new targets\\n $$.redraw({\\n flow: {\\n index: baseValue.index,\\n length: length,\\n duration: isValue(args.duration) ? args.duration : $$.config.transition_duration,\\n done: args.done,\\n orgDataCount: orgDataCount\\n },\\n withLegend: true,\\n withTransition: orgDataCount > 1,\\n withTrimXDomain: false,\\n withUpdateXAxis: true\\n });\\n };\\n\\n c3_chart_internal_fn.generateFlow = function(args) {\\n var $$ = this,\\n config = $$.config,\\n d3 = $$.d3;\\n\\n return function() {\\n var targets = args.targets,\\n flow = args.flow,\\n drawBar = args.drawBar,\\n drawLine = args.drawLine,\\n drawArea = args.drawArea,\\n cx = args.cx,\\n cy = args.cy,\\n xv = args.xv,\\n xForText = args.xForText,\\n yForText = args.yForText,\\n duration = args.duration;\\n\\n var translateX,\\n scaleX = 1,\\n transform,\\n flowIndex = flow.index,\\n flowLength = flow.length,\\n flowStart = $$.getValueOnIndex($$.data.targets[0].values, flowIndex),\\n flowEnd = $$.getValueOnIndex($$.data.targets[0].values, flowIndex + flowLength),\\n orgDomain = $$.x.domain(),\\n domain,\\n durationForFlow = flow.duration || duration,\\n done = flow.done || function() {},\\n wait = $$.generateWait();\\n\\n var xgrid = $$.xgrid || d3.selectAll([]),\\n xgridLines = $$.xgridLines || d3.selectAll([]),\\n mainRegion = $$.mainRegion || d3.selectAll([]),\\n mainText = $$.mainText || d3.selectAll([]),\\n mainBar = $$.mainBar || d3.selectAll([]),\\n mainLine = $$.mainLine || d3.selectAll([]),\\n mainArea = $$.mainArea || d3.selectAll([]),\\n mainCircle = $$.mainCircle || d3.selectAll([]);\\n\\n // set flag\\n $$.flowing = true;\\n\\n // remove head data after rendered\\n $$.data.targets.forEach(function(d) {\\n d.values.splice(0, flowLength);\\n });\\n\\n // update x domain to generate axis elements for flow\\n domain = $$.updateXDomain(targets, true, true);\\n // update elements related to x scale\\n if ($$.updateXGrid) {\\n $$.updateXGrid(true);\\n }\\n\\n // generate transform to flow\\n if (!flow.orgDataCount) {\\n // if empty\\n if ($$.data.targets[0].values.length !== 1) {\\n translateX = $$.x(orgDomain[0]) - $$.x(domain[0]);\\n } else {\\n if ($$.isTimeSeries()) {\\n flowStart = $$.getValueOnIndex($$.data.targets[0].values, 0);\\n flowEnd = $$.getValueOnIndex($$.data.targets[0].values, $$.data.targets[0].values.length - 1);\\n translateX = $$.x(flowStart.x) - $$.x(flowEnd.x);\\n } else {\\n translateX = diffDomain(domain) / 2;\\n }\\n }\\n } else if (flow.orgDataCount === 1 || (flowStart && flowStart.x) === (flowEnd && flowEnd.x)) {\\n translateX = $$.x(orgDomain[0]) - $$.x(domain[0]);\\n } else {\\n if ($$.isTimeSeries()) {\\n translateX = $$.x(orgDomain[0]) - $$.x(domain[0]);\\n } else {\\n translateX = $$.x(flowStart.x) - $$.x(flowEnd.x);\\n }\\n }\\n scaleX = diffDomain(orgDomain) / diffDomain(domain);\\n transform = 'translate(' + translateX + ',0) scale(' + scaleX + ',1)';\\n\\n $$.hideXGridFocus();\\n\\n d3.transition()\\n .ease('linear')\\n .duration(durationForFlow)\\n .each(function() {\\n wait.add($$.axes.x.transition().call($$.xAxis));\\n wait.add(mainBar.transition().attr('transform', transform));\\n wait.add(mainLine.transition().attr('transform', transform));\\n wait.add(mainArea.transition().attr('transform', transform));\\n wait.add(mainCircle.transition().attr('transform', transform));\\n wait.add(mainText.transition().attr('transform', transform));\\n wait.add(\\n mainRegion\\n .filter($$.isRegionOnX)\\n .transition()\\n .attr('transform', transform)\\n );\\n wait.add(xgrid.transition().attr('transform', transform));\\n wait.add(xgridLines.transition().attr('transform', transform));\\n })\\n .call(wait, function() {\\n var i,\\n shapes = [],\\n texts = [],\\n eventRects = [];\\n\\n // remove flowed elements\\n if (flowLength) {\\n for (i = 0; i < flowLength; i++) {\\n shapes.push('.' + CLASS.shape + '-' + (flowIndex + i));\\n texts.push('.' + CLASS.text + '-' + (flowIndex + i));\\n eventRects.push('.' + CLASS.eventRect + '-' + (flowIndex + i));\\n }\\n $$.svg\\n .selectAll('.' + CLASS.shapes)\\n .selectAll(shapes)\\n .remove();\\n $$.svg\\n .selectAll('.' + CLASS.texts)\\n .selectAll(texts)\\n .remove();\\n $$.svg\\n .selectAll('.' + CLASS.eventRects)\\n .selectAll(eventRects)\\n .remove();\\n $$.svg.select('.' + CLASS.xgrid).remove();\\n }\\n\\n // draw again for removing flowed elements and reverting attr\\n xgrid.attr('transform', null).attr($$.xgridAttr);\\n xgridLines.attr('transform', null);\\n xgridLines\\n .select('line')\\n .attr('x1', config.axis_rotated ? 0 : xv)\\n .attr('x2', config.axis_rotated ? $$.width : xv);\\n xgridLines\\n .select('text')\\n .attr('x', config.axis_rotated ? $$.width : 0)\\n .attr('y', xv);\\n mainBar.attr('transform', null).attr('d', drawBar);\\n mainLine.attr('transform', null).attr('d', drawLine);\\n mainArea.attr('transform', null).attr('d', drawArea);\\n mainCircle\\n .attr('transform', null)\\n .attr('cx', cx)\\n .attr('cy', cy);\\n mainText\\n .attr('transform', null)\\n .attr('x', xForText)\\n .attr('y', yForText)\\n .style('fill-opacity', $$.opacityForText.bind($$));\\n mainRegion.attr('transform', null);\\n mainRegion\\n .select('rect')\\n .filter($$.isRegionOnX)\\n .attr('x', $$.regionX.bind($$))\\n .attr('width', $$.regionWidth.bind($$));\\n\\n if (config.interaction_enabled) {\\n $$.redrawEventRect();\\n }\\n\\n // callback for end of flow\\n done();\\n\\n $$.flowing = false;\\n });\\n };\\n };\\n\\n c3_chart_fn.selected = function(targetId) {\\n var $$ = this.internal,\\n d3 = $$.d3;\\n return d3.merge(\\n $$.main\\n .selectAll('.' + CLASS.shapes + $$.getTargetSelectorSuffix(targetId))\\n .selectAll('.' + CLASS.shape)\\n .filter(function() {\\n return d3.select(this).classed(CLASS.SELECTED);\\n })\\n .map(function(d) {\\n return d.map(function(d) {\\n var data = d.__data__;\\n return data.data ? data.data : data;\\n });\\n })\\n );\\n };\\n c3_chart_fn.select = function(ids, indices, resetOther) {\\n var $$ = this.internal,\\n d3 = $$.d3,\\n config = $$.config;\\n if (!config.data_selection_enabled) {\\n return;\\n }\\n $$.main\\n .selectAll('.' + CLASS.shapes)\\n .selectAll('.' + CLASS.shape)\\n .each(function(d, i) {\\n var shape = d3.select(this),\\n id = d.data ? d.data.id : d.id,\\n toggle = $$.getToggle(this, d).bind($$),\\n isTargetId = config.data_selection_grouped || !ids || ids.indexOf(id) >= 0,\\n isTargetIndex = !indices || indices.indexOf(i) >= 0,\\n isSelected = shape.classed(CLASS.SELECTED);\\n // line/area selection not supported yet\\n if (shape.classed(CLASS.line) || shape.classed(CLASS.area)) {\\n return;\\n }\\n if (isTargetId && isTargetIndex) {\\n if (config.data_selection_isselectable(d) && !isSelected) {\\n toggle(true, shape.classed(CLASS.SELECTED, true), d, i);\\n }\\n } else if (isDefined(resetOther) && resetOther) {\\n if (isSelected) {\\n toggle(false, shape.classed(CLASS.SELECTED, false), d, i);\\n }\\n }\\n });\\n };\\n c3_chart_fn.unselect = function(ids, indices) {\\n var $$ = this.internal,\\n d3 = $$.d3,\\n config = $$.config;\\n if (!config.data_selection_enabled) {\\n return;\\n }\\n $$.main\\n .selectAll('.' + CLASS.shapes)\\n .selectAll('.' + CLASS.shape)\\n .each(function(d, i) {\\n var shape = d3.select(this),\\n id = d.data ? d.data.id : d.id,\\n toggle = $$.getToggle(this, d).bind($$),\\n isTargetId = config.data_selection_grouped || !ids || ids.indexOf(id) >= 0,\\n isTargetIndex = !indices || indices.indexOf(i) >= 0,\\n isSelected = shape.classed(CLASS.SELECTED);\\n // line/area selection not supported yet\\n if (shape.classed(CLASS.line) || shape.classed(CLASS.area)) {\\n return;\\n }\\n if (isTargetId && isTargetIndex) {\\n if (config.data_selection_isselectable(d)) {\\n if (isSelected) {\\n toggle(false, shape.classed(CLASS.SELECTED, false), d, i);\\n }\\n }\\n }\\n });\\n };\\n\\n c3_chart_fn.transform = function(type, targetIds) {\\n var $$ = this.internal,\\n options = ['pie', 'donut'].indexOf(type) >= 0 ? { withTransform: true } : null;\\n $$.transformTo(targetIds, type, options);\\n };\\n\\n c3_chart_internal_fn.transformTo = function(targetIds, type, optionsForRedraw) {\\n var $$ = this,\\n withTransitionForAxis = !$$.hasArcType(),\\n options = optionsForRedraw || { withTransitionForAxis: withTransitionForAxis };\\n options.withTransitionForTransform = false;\\n $$.transiting = false;\\n $$.setTargetType(targetIds, type);\\n $$.updateTargets($$.data.targets); // this is needed when transforming to arc\\n $$.updateAndRedraw(options);\\n };\\n\\n c3_chart_fn.groups = function(groups) {\\n var $$ = this.internal,\\n config = $$.config;\\n if (isUndefined(groups)) {\\n return config.data_groups;\\n }\\n config.data_groups = groups;\\n $$.redraw();\\n return config.data_groups;\\n };\\n\\n c3_chart_fn.xgrids = function(grids) {\\n var $$ = this.internal,\\n config = $$.config;\\n if (!grids) {\\n return config.grid_x_lines;\\n }\\n config.grid_x_lines = grids;\\n $$.redrawWithoutRescale();\\n return config.grid_x_lines;\\n };\\n c3_chart_fn.xgrids.add = function(grids) {\\n var $$ = this.internal;\\n return this.xgrids($$.config.grid_x_lines.concat(grids ? grids : []));\\n };\\n c3_chart_fn.xgrids.remove = function(params) {\\n // TODO: multiple\\n var $$ = this.internal;\\n $$.removeGridLines(params, true);\\n };\\n\\n c3_chart_fn.ygrids = function(grids) {\\n var $$ = this.internal,\\n config = $$.config;\\n if (!grids) {\\n return config.grid_y_lines;\\n }\\n config.grid_y_lines = grids;\\n $$.redrawWithoutRescale();\\n return config.grid_y_lines;\\n };\\n c3_chart_fn.ygrids.add = function(grids) {\\n var $$ = this.internal;\\n return this.ygrids($$.config.grid_y_lines.concat(grids ? grids : []));\\n };\\n c3_chart_fn.ygrids.remove = function(params) {\\n // TODO: multiple\\n var $$ = this.internal;\\n $$.removeGridLines(params, false);\\n };\\n\\n c3_chart_fn.regions = function(regions) {\\n var $$ = this.internal,\\n config = $$.config;\\n if (!regions) {\\n return config.regions;\\n }\\n config.regions = regions;\\n $$.redrawWithoutRescale();\\n return config.regions;\\n };\\n c3_chart_fn.regions.add = function(regions) {\\n var $$ = this.internal,\\n config = $$.config;\\n if (!regions) {\\n return config.regions;\\n }\\n config.regions = config.regions.concat(regions);\\n $$.redrawWithoutRescale();\\n return config.regions;\\n };\\n c3_chart_fn.regions.remove = function(options) {\\n var $$ = this.internal,\\n config = $$.config,\\n duration,\\n classes,\\n regions;\\n\\n options = options || {};\\n duration = $$.getOption(options, 'duration', config.transition_duration);\\n classes = $$.getOption(options, 'classes', [CLASS.region]);\\n\\n regions = $$.main.select('.' + CLASS.regions).selectAll(\\n classes.map(function(c) {\\n return '.' + c;\\n })\\n );\\n (duration ? regions.transition().duration(duration) : regions).style('opacity', 0).remove();\\n\\n config.regions = config.regions.filter(function(region) {\\n var found = false;\\n if (!region['class']) {\\n return true;\\n }\\n region['class'].split(' ').forEach(function(c) {\\n if (classes.indexOf(c) >= 0) {\\n found = true;\\n }\\n });\\n return !found;\\n });\\n\\n return config.regions;\\n };\\n\\n c3_chart_fn.data = function(targetIds) {\\n var targets = this.internal.data.targets;\\n return typeof targetIds === 'undefined'\\n ? targets\\n : targets.filter(function(t) {\\n return [].concat(targetIds).indexOf(t.id) >= 0;\\n });\\n };\\n c3_chart_fn.data.shown = function(targetIds) {\\n return this.internal.filterTargetsToShow(this.data(targetIds));\\n };\\n c3_chart_fn.data.values = function(targetId) {\\n var targets,\\n values = null;\\n if (targetId) {\\n targets = this.data(targetId);\\n values = targets[0]\\n ? targets[0].values.map(function(d) {\\n return d.value;\\n })\\n : null;\\n }\\n return values;\\n };\\n c3_chart_fn.data.names = function(names) {\\n this.internal.clearLegendItemTextBoxCache();\\n return this.internal.updateDataAttributes('names', names);\\n };\\n c3_chart_fn.data.colors = function(colors) {\\n return this.internal.updateDataAttributes('colors', colors);\\n };\\n c3_chart_fn.data.axes = function(axes) {\\n return this.internal.updateDataAttributes('axes', axes);\\n };\\n\\n c3_chart_fn.category = function(i, category) {\\n var $$ = this.internal,\\n config = $$.config;\\n if (arguments.length > 1) {\\n config.axis_x_categories[i] = category;\\n $$.redraw();\\n }\\n return config.axis_x_categories[i];\\n };\\n c3_chart_fn.categories = function(categories) {\\n var $$ = this.internal,\\n config = $$.config;\\n if (!arguments.length) {\\n return config.axis_x_categories;\\n }\\n config.axis_x_categories = categories;\\n $$.redraw();\\n return config.axis_x_categories;\\n };\\n\\n // TODO: fix\\n c3_chart_fn.color = function(id) {\\n var $$ = this.internal;\\n return $$.color(id); // more patterns\\n };\\n\\n c3_chart_fn.x = function(x) {\\n var $$ = this.internal;\\n if (arguments.length) {\\n $$.updateTargetX($$.data.targets, x);\\n $$.redraw({ withUpdateOrgXDomain: true, withUpdateXDomain: true });\\n }\\n return $$.data.xs;\\n };\\n c3_chart_fn.xs = function(xs) {\\n var $$ = this.internal;\\n if (arguments.length) {\\n $$.updateTargetXs($$.data.targets, xs);\\n $$.redraw({ withUpdateOrgXDomain: true, withUpdateXDomain: true });\\n }\\n return $$.data.xs;\\n };\\n\\n c3_chart_fn.axis = function() {};\\n c3_chart_fn.axis.labels = function(labels) {\\n var $$ = this.internal;\\n if (arguments.length) {\\n Object.keys(labels).forEach(function(axisId) {\\n $$.axis.setLabelText(axisId, labels[axisId]);\\n });\\n $$.axis.updateLabels();\\n }\\n // TODO: return some values?\\n };\\n c3_chart_fn.axis.max = function(max) {\\n var $$ = this.internal,\\n config = $$.config;\\n if (arguments.length) {\\n if (typeof max === 'object') {\\n if (isValue(max.x)) {\\n config.axis_x_max = max.x;\\n }\\n if (isValue(max.y)) {\\n config.axis_y_max = max.y;\\n }\\n if (isValue(max.y2)) {\\n config.axis_y2_max = max.y2;\\n }\\n } else {\\n config.axis_y_max = config.axis_y2_max = max;\\n }\\n $$.redraw({ withUpdateOrgXDomain: true, withUpdateXDomain: true });\\n } else {\\n return {\\n x: config.axis_x_max,\\n y: config.axis_y_max,\\n y2: config.axis_y2_max\\n };\\n }\\n };\\n c3_chart_fn.axis.min = function(min) {\\n var $$ = this.internal,\\n config = $$.config;\\n if (arguments.length) {\\n if (typeof min === 'object') {\\n if (isValue(min.x)) {\\n config.axis_x_min = min.x;\\n }\\n if (isValue(min.y)) {\\n config.axis_y_min = min.y;\\n }\\n if (isValue(min.y2)) {\\n config.axis_y2_min = min.y2;\\n }\\n } else {\\n config.axis_y_min = config.axis_y2_min = min;\\n }\\n $$.redraw({ withUpdateOrgXDomain: true, withUpdateXDomain: true });\\n } else {\\n return {\\n x: config.axis_x_min,\\n y: config.axis_y_min,\\n y2: config.axis_y2_min\\n };\\n }\\n };\\n c3_chart_fn.axis.range = function(range) {\\n if (arguments.length) {\\n if (isDefined(range.max)) {\\n this.axis.max(range.max);\\n }\\n if (isDefined(range.min)) {\\n this.axis.min(range.min);\\n }\\n } else {\\n return {\\n max: this.axis.max(),\\n min: this.axis.min()\\n };\\n }\\n };\\n\\n c3_chart_fn.legend = function() {};\\n c3_chart_fn.legend.show = function(targetIds) {\\n var $$ = this.internal;\\n $$.showLegend($$.mapToTargetIds(targetIds));\\n $$.updateAndRedraw({ withLegend: true });\\n };\\n c3_chart_fn.legend.hide = function(targetIds) {\\n var $$ = this.internal;\\n $$.hideLegend($$.mapToTargetIds(targetIds));\\n $$.updateAndRedraw({ withLegend: true });\\n };\\n\\n c3_chart_fn.resize = function(size) {\\n var $$ = this.internal,\\n config = $$.config;\\n config.size_width = size ? size.width : null;\\n config.size_height = size ? size.height : null;\\n this.flush();\\n };\\n\\n c3_chart_fn.flush = function() {\\n var $$ = this.internal;\\n $$.updateAndRedraw({ withLegend: true, withTransition: false, withTransitionForTransform: false });\\n };\\n\\n c3_chart_fn.destroy = function() {\\n var $$ = this.internal;\\n\\n window.clearInterval($$.intervalForObserveInserted);\\n\\n if ($$.resizeTimeout !== undefined) {\\n window.clearTimeout($$.resizeTimeout);\\n }\\n\\n if (window.detachEvent) {\\n window.detachEvent('onresize', $$.resizeFunction);\\n } else if (window.removeEventListener) {\\n window.removeEventListener('resize', $$.resizeFunction);\\n } else {\\n var wrapper = window.onresize;\\n // check if no one else removed our wrapper and remove our resizeFunction from it\\n if (wrapper && wrapper.add && wrapper.remove) {\\n wrapper.remove($$.resizeFunction);\\n }\\n }\\n\\n $$.selectChart.classed('c3', false).html('');\\n\\n // MEMO: this is needed because the reference of some elements will not be released, then memory leak will happen.\\n Object.keys($$).forEach(function(key) {\\n $$[key] = null;\\n });\\n\\n return null;\\n };\\n\\n c3_chart_fn.tooltip = function() {};\\n c3_chart_fn.tooltip.show = function(args) {\\n var $$ = this.internal,\\n index,\\n mouse;\\n\\n // determine mouse position on the chart\\n if (args.mouse) {\\n mouse = args.mouse;\\n }\\n\\n // determine focus data\\n if (args.data) {\\n if ($$.isMultipleX()) {\\n // if multiple xs, target point will be determined by mouse\\n mouse = [$$.x(args.data.x), $$.getYScale(args.data.id)(args.data.value)];\\n index = null;\\n } else {\\n // TODO: when tooltip_grouped = false\\n index = isValue(args.data.index) ? args.data.index : $$.getIndexByX(args.data.x);\\n }\\n } else if (typeof args.x !== 'undefined') {\\n index = $$.getIndexByX(args.x);\\n } else if (typeof args.index !== 'undefined') {\\n index = args.index;\\n }\\n\\n // emulate mouse events to show\\n $$.dispatchEvent('mouseover', index, mouse);\\n $$.dispatchEvent('mousemove', index, mouse);\\n\\n $$.config.tooltip_onshow.call($$, args.data);\\n };\\n c3_chart_fn.tooltip.hide = function() {\\n // TODO: get target data by checking the state of focus\\n this.internal.dispatchEvent('mouseout', 0);\\n\\n this.internal.config.tooltip_onhide.call(this);\\n };\\n\\n // Features:\\n // 1. category axis\\n // 2. ceil values of translate/x/y to int for half pixel antialiasing\\n // 3. multiline tick text\\n var tickTextCharSize;\\n\\n function c3_axis(d3, params) {\\n var scale = d3.scale.linear(),\\n orient = 'bottom',\\n innerTickSize = 6,\\n outerTickSize,\\n tickPadding = 3,\\n tickValues = null,\\n tickFormat,\\n tickArguments;\\n\\n var tickOffset = 0,\\n tickCulling = true,\\n tickCentered;\\n\\n params = params || {};\\n outerTickSize = params.withOuterTick ? 6 : 0;\\n\\n function axisX(selection, x) {\\n selection.attr('transform', function(d) {\\n return 'translate(' + Math.ceil(x(d) + tickOffset) + ', 0)';\\n });\\n }\\n\\n function axisY(selection, y) {\\n selection.attr('transform', function(d) {\\n return 'translate(0,' + Math.ceil(y(d)) + ')';\\n });\\n }\\n\\n function scaleExtent(domain) {\\n var start = domain[0],\\n stop = domain[domain.length - 1];\\n return start < stop ? [start, stop] : [stop, start];\\n }\\n\\n function generateTicks(scale) {\\n var i,\\n domain,\\n ticks = [];\\n if (scale.ticks) {\\n return scale.ticks.apply(scale, tickArguments);\\n }\\n domain = scale.domain();\\n for (i = Math.ceil(domain[0]); i < domain[1]; i++) {\\n ticks.push(i);\\n }\\n if (ticks.length > 0 && ticks[0] > 0) {\\n ticks.unshift(ticks[0] - (ticks[1] - ticks[0]));\\n }\\n return ticks;\\n }\\n\\n function copyScale() {\\n var newScale = scale.copy(),\\n domain;\\n if (params.isCategory) {\\n domain = scale.domain();\\n newScale.domain([domain[0], domain[1] - 1]);\\n }\\n return newScale;\\n }\\n\\n function textFormatted(v) {\\n var formatted = tickFormat ? tickFormat(v) : v;\\n return typeof formatted !== 'undefined' ? formatted : '';\\n }\\n\\n function getSizeFor1Char(tick) {\\n if (tickTextCharSize) {\\n return tickTextCharSize;\\n }\\n var size = {\\n h: 11.5,\\n w: 5.5\\n };\\n tick\\n .select('text')\\n .text(textFormatted)\\n .each(function(d) {\\n var box = this.getBoundingClientRect(),\\n text = textFormatted(d),\\n h = box.height,\\n w = text ? box.width / text.length : undefined;\\n if (h && w) {\\n size.h = h;\\n size.w = w;\\n }\\n })\\n .text('');\\n tickTextCharSize = size;\\n return size;\\n }\\n\\n function transitionise(selection) {\\n return params.withoutTransition ? selection : d3.transition(selection);\\n }\\n\\n function axis(g) {\\n g.each(function() {\\n var g = (axis.g = d3.select(this));\\n\\n var scale0 = this.__chart__ || scale,\\n scale1 = (this.__chart__ = copyScale());\\n\\n var ticks = tickValues ? tickValues : generateTicks(scale1),\\n tick = g.selectAll('.tick').data(ticks, scale1),\\n tickEnter = tick\\n .enter()\\n .insert('g', '.domain')\\n .attr('class', 'tick')\\n .style('opacity', 1e-6),\\n // MEMO: No exit transition. The reason is this transition affects max tick width calculation because old tick will be included in the ticks.\\n tickExit = tick.exit().remove(),\\n tickUpdate = transitionise(tick).style('opacity', 1),\\n tickTransform,\\n tickX,\\n tickY;\\n\\n var range = scale.rangeExtent ? scale.rangeExtent() : scaleExtent(scale.range()),\\n path = g.selectAll('.domain').data([0]),\\n pathUpdate = (path\\n .enter()\\n .append('path')\\n .attr('class', 'domain'),\\n transitionise(path));\\n tickEnter.append('line');\\n tickEnter.append('text');\\n\\n var lineEnter = tickEnter.select('line'),\\n lineUpdate = tickUpdate.select('line'),\\n textEnter = tickEnter.select('text'),\\n textUpdate = tickUpdate.select('text');\\n\\n if (params.isCategory) {\\n tickOffset = Math.ceil((scale1(1) - scale1(0)) / 2);\\n tickX = tickCentered ? 0 : tickOffset;\\n tickY = tickCentered ? tickOffset : 0;\\n } else {\\n tickOffset = tickX = 0;\\n }\\n\\n var text,\\n tspan,\\n sizeFor1Char = getSizeFor1Char(g.select('.tick')),\\n counts = [];\\n var tickLength = Math.max(innerTickSize, 0) + tickPadding,\\n isVertical = orient === 'left' || orient === 'right';\\n\\n // this should be called only when category axis\\n function splitTickText(d, maxWidth) {\\n var tickText = textFormatted(d),\\n subtext,\\n spaceIndex,\\n textWidth,\\n splitted = [];\\n\\n if (Object.prototype.toString.call(tickText) === '[object Array]') {\\n return tickText;\\n }\\n\\n if (!maxWidth || maxWidth <= 0) {\\n maxWidth = isVertical ? 95 : params.isCategory ? Math.ceil(scale1(ticks[1]) - scale1(ticks[0])) - 12 : 110;\\n }\\n\\n function split(splitted, text) {\\n spaceIndex = undefined;\\n for (var i = 1; i < text.length; i++) {\\n if (text.charAt(i) === ' ') {\\n spaceIndex = i;\\n }\\n subtext = text.substr(0, i + 1);\\n textWidth = sizeFor1Char.w * subtext.length;\\n // if text width gets over tick width, split by space index or crrent index\\n if (maxWidth < textWidth) {\\n return split(\\n splitted.concat(text.substr(0, spaceIndex ? spaceIndex : i)),\\n text.slice(spaceIndex ? spaceIndex + 1 : i)\\n );\\n }\\n }\\n return splitted.concat(text);\\n }\\n\\n return split(splitted, tickText + '');\\n }\\n\\n function tspanDy(d, i) {\\n var dy = sizeFor1Char.h;\\n if (i === 0) {\\n if (orient === 'left' || orient === 'right') {\\n dy = -((counts[d.index] - 1) * (sizeFor1Char.h / 2) - 3);\\n } else {\\n dy = '.71em';\\n }\\n }\\n return dy;\\n }\\n\\n function tickSize(d) {\\n var tickPosition = scale(d) + (tickCentered ? 0 : tickOffset);\\n return range[0] < tickPosition && tickPosition < range[1] ? innerTickSize : 0;\\n }\\n\\n text = tick.select('text');\\n tspan = text.selectAll('tspan').data(function(d, i) {\\n var splitted = params.tickMultiline ? splitTickText(d, params.tickWidth) : [].concat(textFormatted(d));\\n counts[i] = splitted.length;\\n return splitted.map(function(s) {\\n return { index: i, splitted: s };\\n });\\n });\\n tspan.enter().append('tspan');\\n tspan.exit().remove();\\n tspan.text(function(d) {\\n return d.splitted;\\n });\\n\\n var rotate = params.tickTextRotate;\\n\\n function textAnchorForText(rotate) {\\n if (!rotate) {\\n return 'middle';\\n }\\n return rotate > 0 ? 'start' : 'end';\\n }\\n\\n function textTransform(rotate) {\\n if (!rotate) {\\n return '';\\n }\\n return 'rotate(' + rotate + ')';\\n }\\n\\n function dxForText(rotate) {\\n if (!rotate) {\\n return 0;\\n }\\n return 8 * Math.sin(Math.PI * (rotate / 180));\\n }\\n\\n function yForText(rotate) {\\n if (!rotate) {\\n return tickLength;\\n }\\n return 11.5 - 2.5 * (rotate / 15) * (rotate > 0 ? 1 : -1);\\n }\\n\\n switch (orient) {\\n case 'bottom': {\\n tickTransform = axisX;\\n lineEnter.attr('y2', innerTickSize);\\n textEnter.attr('y', tickLength);\\n lineUpdate\\n .attr('x1', tickX)\\n .attr('x2', tickX)\\n .attr('y2', tickSize);\\n textUpdate\\n .attr('x', 0)\\n .attr('y', yForText(rotate))\\n .style('text-anchor', textAnchorForText(rotate))\\n .attr('transform', textTransform(rotate));\\n tspan\\n .attr('x', 0)\\n .attr('dy', tspanDy)\\n .attr('dx', dxForText(rotate));\\n pathUpdate.attr('d', 'M' + range[0] + ',' + outerTickSize + 'V0H' + range[1] + 'V' + outerTickSize);\\n break;\\n }\\n case 'top': {\\n // TODO: rotated tick text\\n tickTransform = axisX;\\n lineEnter.attr('y2', -innerTickSize);\\n textEnter.attr('y', -tickLength);\\n lineUpdate.attr('x2', 0).attr('y2', -innerTickSize);\\n textUpdate.attr('x', 0).attr('y', -tickLength);\\n text.style('text-anchor', 'middle');\\n tspan.attr('x', 0).attr('dy', '0em');\\n pathUpdate.attr('d', 'M' + range[0] + ',' + -outerTickSize + 'V0H' + range[1] + 'V' + -outerTickSize);\\n break;\\n }\\n case 'left': {\\n tickTransform = axisY;\\n lineEnter.attr('x2', -innerTickSize);\\n textEnter.attr('x', -tickLength);\\n lineUpdate\\n .attr('x2', -innerTickSize)\\n .attr('y1', tickY)\\n .attr('y2', tickY);\\n textUpdate.attr('x', -tickLength).attr('y', tickOffset);\\n text.style('text-anchor', 'end');\\n tspan.attr('x', -tickLength).attr('dy', tspanDy);\\n pathUpdate.attr('d', 'M' + -outerTickSize + ',' + range[0] + 'H0V' + range[1] + 'H' + -outerTickSize);\\n break;\\n }\\n case 'right': {\\n tickTransform = axisY;\\n lineEnter.attr('x2', innerTickSize);\\n textEnter.attr('x', tickLength);\\n lineUpdate.attr('x2', innerTickSize).attr('y2', 0);\\n textUpdate.attr('x', tickLength).attr('y', 0);\\n text.style('text-anchor', 'start');\\n tspan.attr('x', tickLength).attr('dy', tspanDy);\\n pathUpdate.attr('d', 'M' + outerTickSize + ',' + range[0] + 'H0V' + range[1] + 'H' + outerTickSize);\\n break;\\n }\\n }\\n if (scale1.rangeBand) {\\n var x = scale1,\\n dx = x.rangeBand() / 2;\\n scale0 = scale1 = function(d) {\\n return x(d) + dx;\\n };\\n } else if (scale0.rangeBand) {\\n scale0 = scale1;\\n } else {\\n tickExit.call(tickTransform, scale1);\\n }\\n tickEnter.call(tickTransform, scale0);\\n tickUpdate.call(tickTransform, scale1);\\n });\\n }\\n\\n axis.scale = function(x) {\\n if (!arguments.length) {\\n return scale;\\n }\\n scale = x;\\n return axis;\\n };\\n axis.orient = function(x) {\\n if (!arguments.length) {\\n return orient;\\n }\\n orient = x in { top: 1, right: 1, bottom: 1, left: 1 } ? x + '' : 'bottom';\\n return axis;\\n };\\n axis.tickFormat = function(format) {\\n if (!arguments.length) {\\n return tickFormat;\\n }\\n tickFormat = format;\\n return axis;\\n };\\n axis.tickCentered = function(isCentered) {\\n if (!arguments.length) {\\n return tickCentered;\\n }\\n tickCentered = isCentered;\\n return axis;\\n };\\n axis.tickOffset = function() {\\n return tickOffset;\\n };\\n axis.tickInterval = function() {\\n var interval, length;\\n if (params.isCategory) {\\n interval = tickOffset * 2;\\n } else {\\n length =\\n axis.g\\n .select('path.domain')\\n .node()\\n .getTotalLength() -\\n outerTickSize * 2;\\n interval = length / axis.g.selectAll('line').size();\\n }\\n return interval === Infinity ? 0 : interval;\\n };\\n axis.ticks = function() {\\n if (!arguments.length) {\\n return tickArguments;\\n }\\n tickArguments = arguments;\\n return axis;\\n };\\n axis.tickCulling = function(culling) {\\n if (!arguments.length) {\\n return tickCulling;\\n }\\n tickCulling = culling;\\n return axis;\\n };\\n axis.tickValues = function(x) {\\n if (typeof x === 'function') {\\n tickValues = function() {\\n return x(scale.domain());\\n };\\n } else {\\n if (!arguments.length) {\\n return tickValues;\\n }\\n tickValues = x;\\n }\\n return axis;\\n };\\n return axis;\\n }\\n\\n c3_chart_internal_fn.isSafari = function() {\\n var ua = window.navigator.userAgent;\\n return ua.indexOf('Safari') >= 0 && ua.indexOf('Chrome') < 0;\\n };\\n c3_chart_internal_fn.isChrome = function() {\\n var ua = window.navigator.userAgent;\\n return ua.indexOf('Chrome') >= 0;\\n };\\n\\n /* jshint ignore:start */\\n\\n // PhantomJS doesn't have support for Function.prototype.bind, which has caused confusion. Use\\n // this polyfill to avoid the confusion.\\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind#Polyfill\\n\\n if (!Function.prototype.bind) {\\n Function.prototype.bind = function(oThis) {\\n if (typeof this !== 'function') {\\n // closest thing possible to the ECMAScript 5\\n // internal IsCallable function\\n throw new TypeError('Function.prototype.bind - what is trying to be bound is not callable');\\n }\\n\\n var aArgs = Array.prototype.slice.call(arguments, 1),\\n fToBind = this,\\n fNOP = function() {},\\n fBound = function() {\\n return fToBind.apply(\\n this instanceof fNOP ? this : oThis,\\n aArgs.concat(Array.prototype.slice.call(arguments))\\n );\\n };\\n\\n fNOP.prototype = this.prototype;\\n fBound.prototype = new fNOP();\\n\\n return fBound;\\n };\\n }\\n\\n //SVGPathSeg API polyfill\\n //https://github.com/progers/pathseg\\n //\\n //This is a drop-in replacement for the SVGPathSeg and SVGPathSegList APIs that were removed from\\n //SVG2 (https://lists.w3.org/Archives/Public/www-svg/2015Jun/0044.html), including the latest spec\\n //changes which were implemented in Firefox 43 and Chrome 46.\\n //Chrome 48 removes these APIs, so this polyfill is required.\\n\\n (function() {\\n 'use strict';\\n if (!('SVGPathSeg' in window)) {\\n // Spec: http://www.w3.org/TR/SVG11/single-page.html#paths-InterfaceSVGPathSeg\\n window.SVGPathSeg = function(type, typeAsLetter, owningPathSegList) {\\n this.pathSegType = type;\\n this.pathSegTypeAsLetter = typeAsLetter;\\n this._owningPathSegList = owningPathSegList;\\n };\\n\\n SVGPathSeg.PATHSEG_UNKNOWN = 0;\\n SVGPathSeg.PATHSEG_CLOSEPATH = 1;\\n SVGPathSeg.PATHSEG_MOVETO_ABS = 2;\\n SVGPathSeg.PATHSEG_MOVETO_REL = 3;\\n SVGPathSeg.PATHSEG_LINETO_ABS = 4;\\n SVGPathSeg.PATHSEG_LINETO_REL = 5;\\n SVGPathSeg.PATHSEG_CURVETO_CUBIC_ABS = 6;\\n SVGPathSeg.PATHSEG_CURVETO_CUBIC_REL = 7;\\n SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_ABS = 8;\\n SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_REL = 9;\\n SVGPathSeg.PATHSEG_ARC_ABS = 10;\\n SVGPathSeg.PATHSEG_ARC_REL = 11;\\n SVGPathSeg.PATHSEG_LINETO_HORIZONTAL_ABS = 12;\\n SVGPathSeg.PATHSEG_LINETO_HORIZONTAL_REL = 13;\\n SVGPathSeg.PATHSEG_LINETO_VERTICAL_ABS = 14;\\n SVGPathSeg.PATHSEG_LINETO_VERTICAL_REL = 15;\\n SVGPathSeg.PATHSEG_CURVETO_CUBIC_SMOOTH_ABS = 16;\\n SVGPathSeg.PATHSEG_CURVETO_CUBIC_SMOOTH_REL = 17;\\n SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_SMOOTH_ABS = 18;\\n SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_SMOOTH_REL = 19;\\n\\n // Notify owning PathSegList on any changes so they can be synchronized back to the path element.\\n SVGPathSeg.prototype._segmentChanged = function() {\\n if (this._owningPathSegList) this._owningPathSegList.segmentChanged(this);\\n };\\n\\n window.SVGPathSegClosePath = function(owningPathSegList) {\\n SVGPathSeg.call(this, SVGPathSeg.PATHSEG_CLOSEPATH, 'z', owningPathSegList);\\n };\\n SVGPathSegClosePath.prototype = Object.create(SVGPathSeg.prototype);\\n SVGPathSegClosePath.prototype.toString = function() {\\n return '[object SVGPathSegClosePath]';\\n };\\n SVGPathSegClosePath.prototype._asPathString = function() {\\n return this.pathSegTypeAsLetter;\\n };\\n SVGPathSegClosePath.prototype.clone = function() {\\n return new SVGPathSegClosePath(undefined);\\n };\\n\\n window.SVGPathSegMovetoAbs = function(owningPathSegList, x, y) {\\n SVGPathSeg.call(this, SVGPathSeg.PATHSEG_MOVETO_ABS, 'M', owningPathSegList);\\n this._x = x;\\n this._y = y;\\n };\\n SVGPathSegMovetoAbs.prototype = Object.create(SVGPathSeg.prototype);\\n SVGPathSegMovetoAbs.prototype.toString = function() {\\n return '[object SVGPathSegMovetoAbs]';\\n };\\n SVGPathSegMovetoAbs.prototype._asPathString = function() {\\n return this.pathSegTypeAsLetter + ' ' + this._x + ' ' + this._y;\\n };\\n SVGPathSegMovetoAbs.prototype.clone = function() {\\n return new SVGPathSegMovetoAbs(undefined, this._x, this._y);\\n };\\n Object.defineProperty(SVGPathSegMovetoAbs.prototype, 'x', {\\n get: function() {\\n return this._x;\\n },\\n set: function(x) {\\n this._x = x;\\n this._segmentChanged();\\n },\\n enumerable: true\\n });\\n Object.defineProperty(SVGPathSegMovetoAbs.prototype, 'y', {\\n get: function() {\\n return this._y;\\n },\\n set: function(y) {\\n this._y = y;\\n this._segmentChanged();\\n },\\n enumerable: true\\n });\\n\\n window.SVGPathSegMovetoRel = function(owningPathSegList, x, y) {\\n SVGPathSeg.call(this, SVGPathSeg.PATHSEG_MOVETO_REL, 'm', owningPathSegList);\\n this._x = x;\\n this._y = y;\\n };\\n SVGPathSegMovetoRel.prototype = Object.create(SVGPathSeg.prototype);\\n SVGPathSegMovetoRel.prototype.toString = function() {\\n return '[object SVGPathSegMovetoRel]';\\n };\\n SVGPathSegMovetoRel.prototype._asPathString = function() {\\n return this.pathSegTypeAsLetter + ' ' + this._x + ' ' + this._y;\\n };\\n SVGPathSegMovetoRel.prototype.clone = function() {\\n return new SVGPathSegMovetoRel(undefined, this._x, this._y);\\n };\\n Object.defineProperty(SVGPathSegMovetoRel.prototype, 'x', {\\n get: function() {\\n return this._x;\\n },\\n set: function(x) {\\n this._x = x;\\n this._segmentChanged();\\n },\\n enumerable: true\\n });\\n Object.defineProperty(SVGPathSegMovetoRel.prototype, 'y', {\\n get: function() {\\n return this._y;\\n },\\n set: function(y) {\\n this._y = y;\\n this._segmentChanged();\\n },\\n enumerable: true\\n });\\n\\n window.SVGPathSegLinetoAbs = function(owningPathSegList, x, y) {\\n SVGPathSeg.call(this, SVGPathSeg.PATHSEG_LINETO_ABS, 'L', owningPathSegList);\\n this._x = x;\\n this._y = y;\\n };\\n SVGPathSegLinetoAbs.prototype = Object.create(SVGPathSeg.prototype);\\n SVGPathSegLinetoAbs.prototype.toString = function() {\\n return '[object SVGPathSegLinetoAbs]';\\n };\\n SVGPathSegLinetoAbs.prototype._asPathString = function() {\\n return this.pathSegTypeAsLetter + ' ' + this._x + ' ' + this._y;\\n };\\n SVGPathSegLinetoAbs.prototype.clone = function() {\\n return new SVGPathSegLinetoAbs(undefined, this._x, this._y);\\n };\\n Object.defineProperty(SVGPathSegLinetoAbs.prototype, 'x', {\\n get: function() {\\n return this._x;\\n },\\n set: function(x) {\\n this._x = x;\\n this._segmentChanged();\\n },\\n enumerable: true\\n });\\n Object.defineProperty(SVGPathSegLinetoAbs.prototype, 'y', {\\n get: function() {\\n return this._y;\\n },\\n set: function(y) {\\n this._y = y;\\n this._segmentChanged();\\n },\\n enumerable: true\\n });\\n\\n window.SVGPathSegLinetoRel = function(owningPathSegList, x, y) {\\n SVGPathSeg.call(this, SVGPathSeg.PATHSEG_LINETO_REL, 'l', owningPathSegList);\\n this._x = x;\\n this._y = y;\\n };\\n SVGPathSegLinetoRel.prototype = Object.create(SVGPathSeg.prototype);\\n SVGPathSegLinetoRel.prototype.toString = function() {\\n return '[object SVGPathSegLinetoRel]';\\n };\\n SVGPathSegLinetoRel.prototype._asPathString = function() {\\n return this.pathSegTypeAsLetter + ' ' + this._x + ' ' + this._y;\\n };\\n SVGPathSegLinetoRel.prototype.clone = function() {\\n return new SVGPathSegLinetoRel(undefined, this._x, this._y);\\n };\\n Object.defineProperty(SVGPathSegLinetoRel.prototype, 'x', {\\n get: function() {\\n return this._x;\\n },\\n set: function(x) {\\n this._x = x;\\n this._segmentChanged();\\n },\\n enumerable: true\\n });\\n Object.defineProperty(SVGPathSegLinetoRel.prototype, 'y', {\\n get: function() {\\n return this._y;\\n },\\n set: function(y) {\\n this._y = y;\\n this._segmentChanged();\\n },\\n enumerable: true\\n });\\n\\n window.SVGPathSegCurvetoCubicAbs = function(owningPathSegList, x, y, x1, y1, x2, y2) {\\n SVGPathSeg.call(this, SVGPathSeg.PATHSEG_CURVETO_CUBIC_ABS, 'C', owningPathSegList);\\n this._x = x;\\n this._y = y;\\n this._x1 = x1;\\n this._y1 = y1;\\n this._x2 = x2;\\n this._y2 = y2;\\n };\\n SVGPathSegCurvetoCubicAbs.prototype = Object.create(SVGPathSeg.prototype);\\n SVGPathSegCurvetoCubicAbs.prototype.toString = function() {\\n return '[object SVGPathSegCurvetoCubicAbs]';\\n };\\n SVGPathSegCurvetoCubicAbs.prototype._asPathString = function() {\\n return (\\n this.pathSegTypeAsLetter +\\n ' ' +\\n this._x1 +\\n ' ' +\\n this._y1 +\\n ' ' +\\n this._x2 +\\n ' ' +\\n this._y2 +\\n ' ' +\\n this._x +\\n ' ' +\\n this._y\\n );\\n };\\n SVGPathSegCurvetoCubicAbs.prototype.clone = function() {\\n return new SVGPathSegCurvetoCubicAbs(undefined, this._x, this._y, this._x1, this._y1, this._x2, this._y2);\\n };\\n Object.defineProperty(SVGPathSegCurvetoCubicAbs.prototype, 'x', {\\n get: function() {\\n return this._x;\\n },\\n set: function(x) {\\n this._x = x;\\n this._segmentChanged();\\n },\\n enumerable: true\\n });\\n Object.defineProperty(SVGPathSegCurvetoCubicAbs.prototype, 'y', {\\n get: function() {\\n return this._y;\\n },\\n set: function(y) {\\n this._y = y;\\n this._segmentChanged();\\n },\\n enumerable: true\\n });\\n Object.defineProperty(SVGPathSegCurvetoCubicAbs.prototype, 'x1', {\\n get: function() {\\n return this._x1;\\n },\\n set: function(x1) {\\n this._x1 = x1;\\n this._segmentChanged();\\n },\\n enumerable: true\\n });\\n Object.defineProperty(SVGPathSegCurvetoCubicAbs.prototype, 'y1', {\\n get: function() {\\n return this._y1;\\n },\\n set: function(y1) {\\n this._y1 = y1;\\n this._segmentChanged();\\n },\\n enumerable: true\\n });\\n Object.defineProperty(SVGPathSegCurvetoCubicAbs.prototype, 'x2', {\\n get: function() {\\n return this._x2;\\n },\\n set: function(x2) {\\n this._x2 = x2;\\n this._segmentChanged();\\n },\\n enumerable: true\\n });\\n Object.defineProperty(SVGPathSegCurvetoCubicAbs.prototype, 'y2', {\\n get: function() {\\n return this._y2;\\n },\\n set: function(y2) {\\n this._y2 = y2;\\n this._segmentChanged();\\n },\\n enumerable: true\\n });\\n\\n window.SVGPathSegCurvetoCubicRel = function(owningPathSegList, x, y, x1, y1, x2, y2) {\\n SVGPathSeg.call(this, SVGPathSeg.PATHSEG_CURVETO_CUBIC_REL, 'c', owningPathSegList);\\n this._x = x;\\n this._y = y;\\n this._x1 = x1;\\n this._y1 = y1;\\n this._x2 = x2;\\n this._y2 = y2;\\n };\\n SVGPathSegCurvetoCubicRel.prototype = Object.create(SVGPathSeg.prototype);\\n SVGPathSegCurvetoCubicRel.prototype.toString = function() {\\n return '[object SVGPathSegCurvetoCubicRel]';\\n };\\n SVGPathSegCurvetoCubicRel.prototype._asPathString = function() {\\n return (\\n this.pathSegTypeAsLetter +\\n ' ' +\\n this._x1 +\\n ' ' +\\n this._y1 +\\n ' ' +\\n this._x2 +\\n ' ' +\\n this._y2 +\\n ' ' +\\n this._x +\\n ' ' +\\n this._y\\n );\\n };\\n SVGPathSegCurvetoCubicRel.prototype.clone = function() {\\n return new SVGPathSegCurvetoCubicRel(undefined, this._x, this._y, this._x1, this._y1, this._x2, this._y2);\\n };\\n Object.defineProperty(SVGPathSegCurvetoCubicRel.prototype, 'x', {\\n get: function() {\\n return this._x;\\n },\\n set: function(x) {\\n this._x = x;\\n this._segmentChanged();\\n },\\n enumerable: true\\n });\\n Object.defineProperty(SVGPathSegCurvetoCubicRel.prototype, 'y', {\\n get: function() {\\n return this._y;\\n },\\n set: function(y) {\\n this._y = y;\\n this._segmentChanged();\\n },\\n enumerable: true\\n });\\n Object.defineProperty(SVGPathSegCurvetoCubicRel.prototype, 'x1', {\\n get: function() {\\n return this._x1;\\n },\\n set: function(x1) {\\n this._x1 = x1;\\n this._segmentChanged();\\n },\\n enumerable: true\\n });\\n Object.defineProperty(SVGPathSegCurvetoCubicRel.prototype, 'y1', {\\n get: function() {\\n return this._y1;\\n },\\n set: function(y1) {\\n this._y1 = y1;\\n this._segmentChanged();\\n },\\n enumerable: true\\n });\\n Object.defineProperty(SVGPathSegCurvetoCubicRel.prototype, 'x2', {\\n get: function() {\\n return this._x2;\\n },\\n set: function(x2) {\\n this._x2 = x2;\\n this._segmentChanged();\\n },\\n enumerable: true\\n });\\n Object.defineProperty(SVGPathSegCurvetoCubicRel.prototype, 'y2', {\\n get: function() {\\n return this._y2;\\n },\\n set: function(y2) {\\n this._y2 = y2;\\n this._segmentChanged();\\n },\\n enumerable: true\\n });\\n\\n window.SVGPathSegCurvetoQuadraticAbs = function(owningPathSegList, x, y, x1, y1) {\\n SVGPathSeg.call(this, SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_ABS, 'Q', owningPathSegList);\\n this._x = x;\\n this._y = y;\\n this._x1 = x1;\\n this._y1 = y1;\\n };\\n SVGPathSegCurvetoQuadraticAbs.prototype = Object.create(SVGPathSeg.prototype);\\n SVGPathSegCurvetoQuadraticAbs.prototype.toString = function() {\\n return '[object SVGPathSegCurvetoQuadraticAbs]';\\n };\\n SVGPathSegCurvetoQuadraticAbs.prototype._asPathString = function() {\\n return this.pathSegTypeAsLetter + ' ' + this._x1 + ' ' + this._y1 + ' ' + this._x + ' ' + this._y;\\n };\\n SVGPathSegCurvetoQuadraticAbs.prototype.clone = function() {\\n return new SVGPathSegCurvetoQuadraticAbs(undefined, this._x, this._y, this._x1, this._y1);\\n };\\n Object.defineProperty(SVGPathSegCurvetoQuadraticAbs.prototype, 'x', {\\n get: function() {\\n return this._x;\\n },\\n set: function(x) {\\n this._x = x;\\n this._segmentChanged();\\n },\\n enumerable: true\\n });\\n Object.defineProperty(SVGPathSegCurvetoQuadraticAbs.prototype, 'y', {\\n get: function() {\\n return this._y;\\n },\\n set: function(y) {\\n this._y = y;\\n this._segmentChanged();\\n },\\n enumerable: true\\n });\\n Object.defineProperty(SVGPathSegCurvetoQuadraticAbs.prototype, 'x1', {\\n get: function() {\\n return this._x1;\\n },\\n set: function(x1) {\\n this._x1 = x1;\\n this._segmentChanged();\\n },\\n enumerable: true\\n });\\n Object.defineProperty(SVGPathSegCurvetoQuadraticAbs.prototype, 'y1', {\\n get: function() {\\n return this._y1;\\n },\\n set: function(y1) {\\n this._y1 = y1;\\n this._segmentChanged();\\n },\\n enumerable: true\\n });\\n\\n window.SVGPathSegCurvetoQuadraticRel = function(owningPathSegList, x, y, x1, y1) {\\n SVGPathSeg.call(this, SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_REL, 'q', owningPathSegList);\\n this._x = x;\\n this._y = y;\\n this._x1 = x1;\\n this._y1 = y1;\\n };\\n SVGPathSegCurvetoQuadraticRel.prototype = Object.create(SVGPathSeg.prototype);\\n SVGPathSegCurvetoQuadraticRel.prototype.toString = function() {\\n return '[object SVGPathSegCurvetoQuadraticRel]';\\n };\\n SVGPathSegCurvetoQuadraticRel.prototype._asPathString = function() {\\n return this.pathSegTypeAsLetter + ' ' + this._x1 + ' ' + this._y1 + ' ' + this._x + ' ' + this._y;\\n };\\n SVGPathSegCurvetoQuadraticRel.prototype.clone = function() {\\n return new SVGPathSegCurvetoQuadraticRel(undefined, this._x, this._y, this._x1, this._y1);\\n };\\n Object.defineProperty(SVGPathSegCurvetoQuadraticRel.prototype, 'x', {\\n get: function() {\\n return this._x;\\n },\\n set: function(x) {\\n this._x = x;\\n this._segmentChanged();\\n },\\n enumerable: true\\n });\\n Object.defineProperty(SVGPathSegCurvetoQuadraticRel.prototype, 'y', {\\n get: function() {\\n return this._y;\\n },\\n set: function(y) {\\n this._y = y;\\n this._segmentChanged();\\n },\\n enumerable: true\\n });\\n Object.defineProperty(SVGPathSegCurvetoQuadraticRel.prototype, 'x1', {\\n get: function() {\\n return this._x1;\\n },\\n set: function(x1) {\\n this._x1 = x1;\\n this._segmentChanged();\\n },\\n enumerable: true\\n });\\n Object.defineProperty(SVGPathSegCurvetoQuadraticRel.prototype, 'y1', {\\n get: function() {\\n return this._y1;\\n },\\n set: function(y1) {\\n this._y1 = y1;\\n this._segmentChanged();\\n },\\n enumerable: true\\n });\\n\\n window.SVGPathSegArcAbs = function(owningPathSegList, x, y, r1, r2, angle, largeArcFlag, sweepFlag) {\\n SVGPathSeg.call(this, SVGPathSeg.PATHSEG_ARC_ABS, 'A', owningPathSegList);\\n this._x = x;\\n this._y = y;\\n this._r1 = r1;\\n this._r2 = r2;\\n this._angle = angle;\\n this._largeArcFlag = largeArcFlag;\\n this._sweepFlag = sweepFlag;\\n };\\n SVGPathSegArcAbs.prototype = Object.create(SVGPathSeg.prototype);\\n SVGPathSegArcAbs.prototype.toString = function() {\\n return '[object SVGPathSegArcAbs]';\\n };\\n SVGPathSegArcAbs.prototype._asPathString = function() {\\n return (\\n this.pathSegTypeAsLetter +\\n ' ' +\\n this._r1 +\\n ' ' +\\n this._r2 +\\n ' ' +\\n this._angle +\\n ' ' +\\n (this._largeArcFlag ? '1' : '0') +\\n ' ' +\\n (this._sweepFlag ? '1' : '0') +\\n ' ' +\\n this._x +\\n ' ' +\\n this._y\\n );\\n };\\n SVGPathSegArcAbs.prototype.clone = function() {\\n return new SVGPathSegArcAbs(\\n undefined,\\n this._x,\\n this._y,\\n this._r1,\\n this._r2,\\n this._angle,\\n this._largeArcFlag,\\n this._sweepFlag\\n );\\n };\\n Object.defineProperty(SVGPathSegArcAbs.prototype, 'x', {\\n get: function() {\\n return this._x;\\n },\\n set: function(x) {\\n this._x = x;\\n this._segmentChanged();\\n },\\n enumerable: true\\n });\\n Object.defineProperty(SVGPathSegArcAbs.prototype, 'y', {\\n get: function() {\\n return this._y;\\n },\\n set: function(y) {\\n this._y = y;\\n this._segmentChanged();\\n },\\n enumerable: true\\n });\\n Object.defineProperty(SVGPathSegArcAbs.prototype, 'r1', {\\n get: function() {\\n return this._r1;\\n },\\n set: function(r1) {\\n this._r1 = r1;\\n this._segmentChanged();\\n },\\n enumerable: true\\n });\\n Object.defineProperty(SVGPathSegArcAbs.prototype, 'r2', {\\n get: function() {\\n return this._r2;\\n },\\n set: function(r2) {\\n this._r2 = r2;\\n this._segmentChanged();\\n },\\n enumerable: true\\n });\\n Object.defineProperty(SVGPathSegArcAbs.prototype, 'angle', {\\n get: function() {\\n return this._angle;\\n },\\n set: function(angle) {\\n this._angle = angle;\\n this._segmentChanged();\\n },\\n enumerable: true\\n });\\n Object.defineProperty(SVGPathSegArcAbs.prototype, 'largeArcFlag', {\\n get: function() {\\n return this._largeArcFlag;\\n },\\n set: function(largeArcFlag) {\\n this._largeArcFlag = largeArcFlag;\\n this._segmentChanged();\\n },\\n enumerable: true\\n });\\n Object.defineProperty(SVGPathSegArcAbs.prototype, 'sweepFlag', {\\n get: function() {\\n return this._sweepFlag;\\n },\\n set: function(sweepFlag) {\\n this._sweepFlag = sweepFlag;\\n this._segmentChanged();\\n },\\n enumerable: true\\n });\\n\\n window.SVGPathSegArcRel = function(owningPathSegList, x, y, r1, r2, angle, largeArcFlag, sweepFlag) {\\n SVGPathSeg.call(this, SVGPathSeg.PATHSEG_ARC_REL, 'a', owningPathSegList);\\n this._x = x;\\n this._y = y;\\n this._r1 = r1;\\n this._r2 = r2;\\n this._angle = angle;\\n this._largeArcFlag = largeArcFlag;\\n this._sweepFlag = sweepFlag;\\n };\\n SVGPathSegArcRel.prototype = Object.create(SVGPathSeg.prototype);\\n SVGPathSegArcRel.prototype.toString = function() {\\n return '[object SVGPathSegArcRel]';\\n };\\n SVGPathSegArcRel.prototype._asPathString = function() {\\n return (\\n this.pathSegTypeAsLetter +\\n ' ' +\\n this._r1 +\\n ' ' +\\n this._r2 +\\n ' ' +\\n this._angle +\\n ' ' +\\n (this._largeArcFlag ? '1' : '0') +\\n ' ' +\\n (this._sweepFlag ? '1' : '0') +\\n ' ' +\\n this._x +\\n ' ' +\\n this._y\\n );\\n };\\n SVGPathSegArcRel.prototype.clone = function() {\\n return new SVGPathSegArcRel(\\n undefined,\\n this._x,\\n this._y,\\n this._r1,\\n this._r2,\\n this._angle,\\n this._largeArcFlag,\\n this._sweepFlag\\n );\\n };\\n Object.defineProperty(SVGPathSegArcRel.prototype, 'x', {\\n get: function() {\\n return this._x;\\n },\\n set: function(x) {\\n this._x = x;\\n this._segmentChanged();\\n },\\n enumerable: true\\n });\\n Object.defineProperty(SVGPathSegArcRel.prototype, 'y', {\\n get: function() {\\n return this._y;\\n },\\n set: function(y) {\\n this._y = y;\\n this._segmentChanged();\\n },\\n enumerable: true\\n });\\n Object.defineProperty(SVGPathSegArcRel.prototype, 'r1', {\\n get: function() {\\n return this._r1;\\n },\\n set: function(r1) {\\n this._r1 = r1;\\n this._segmentChanged();\\n },\\n enumerable: true\\n });\\n Object.defineProperty(SVGPathSegArcRel.prototype, 'r2', {\\n get: function() {\\n return this._r2;\\n },\\n set: function(r2) {\\n this._r2 = r2;\\n this._segmentChanged();\\n },\\n enumerable: true\\n });\\n Object.defineProperty(SVGPathSegArcRel.prototype, 'angle', {\\n get: function() {\\n return this._angle;\\n },\\n set: function(angle) {\\n this._angle = angle;\\n this._segmentChanged();\\n },\\n enumerable: true\\n });\\n Object.defineProperty(SVGPathSegArcRel.prototype, 'largeArcFlag', {\\n get: function() {\\n return this._largeArcFlag;\\n },\\n set: function(largeArcFlag) {\\n this._largeArcFlag = largeArcFlag;\\n this._segmentChanged();\\n },\\n enumerable: true\\n });\\n Object.defineProperty(SVGPathSegArcRel.prototype, 'sweepFlag', {\\n get: function() {\\n return this._sweepFlag;\\n },\\n set: function(sweepFlag) {\\n this._sweepFlag = sweepFlag;\\n this._segmentChanged();\\n },\\n enumerable: true\\n });\\n\\n window.SVGPathSegLinetoHorizontalAbs = function(owningPathSegList, x) {\\n SVGPathSeg.call(this, SVGPathSeg.PATHSEG_LINETO_HORIZONTAL_ABS, 'H', owningPathSegList);\\n this._x = x;\\n };\\n SVGPathSegLinetoHorizontalAbs.prototype = Object.create(SVGPathSeg.prototype);\\n SVGPathSegLinetoHorizontalAbs.prototype.toString = function() {\\n return '[object SVGPathSegLinetoHorizontalAbs]';\\n };\\n SVGPathSegLinetoHorizontalAbs.prototype._asPathString = function() {\\n return this.pathSegTypeAsLetter + ' ' + this._x;\\n };\\n SVGPathSegLinetoHorizontalAbs.prototype.clone = function() {\\n return new SVGPathSegLinetoHorizontalAbs(undefined, this._x);\\n };\\n Object.defineProperty(SVGPathSegLinetoHorizontalAbs.prototype, 'x', {\\n get: function() {\\n return this._x;\\n },\\n set: function(x) {\\n this._x = x;\\n this._segmentChanged();\\n },\\n enumerable: true\\n });\\n\\n window.SVGPathSegLinetoHorizontalRel = function(owningPathSegList, x) {\\n SVGPathSeg.call(this, SVGPathSeg.PATHSEG_LINETO_HORIZONTAL_REL, 'h', owningPathSegList);\\n this._x = x;\\n };\\n SVGPathSegLinetoHorizontalRel.prototype = Object.create(SVGPathSeg.prototype);\\n SVGPathSegLinetoHorizontalRel.prototype.toString = function() {\\n return '[object SVGPathSegLinetoHorizontalRel]';\\n };\\n SVGPathSegLinetoHorizontalRel.prototype._asPathString = function() {\\n return this.pathSegTypeAsLetter + ' ' + this._x;\\n };\\n SVGPathSegLinetoHorizontalRel.prototype.clone = function() {\\n return new SVGPathSegLinetoHorizontalRel(undefined, this._x);\\n };\\n Object.defineProperty(SVGPathSegLinetoHorizontalRel.prototype, 'x', {\\n get: function() {\\n return this._x;\\n },\\n set: function(x) {\\n this._x = x;\\n this._segmentChanged();\\n },\\n enumerable: true\\n });\\n\\n window.SVGPathSegLinetoVerticalAbs = function(owningPathSegList, y) {\\n SVGPathSeg.call(this, SVGPathSeg.PATHSEG_LINETO_VERTICAL_ABS, 'V', owningPathSegList);\\n this._y = y;\\n };\\n SVGPathSegLinetoVerticalAbs.prototype = Object.create(SVGPathSeg.prototype);\\n SVGPathSegLinetoVerticalAbs.prototype.toString = function() {\\n return '[object SVGPathSegLinetoVerticalAbs]';\\n };\\n SVGPathSegLinetoVerticalAbs.prototype._asPathString = function() {\\n return this.pathSegTypeAsLetter + ' ' + this._y;\\n };\\n SVGPathSegLinetoVerticalAbs.prototype.clone = function() {\\n return new SVGPathSegLinetoVerticalAbs(undefined, this._y);\\n };\\n Object.defineProperty(SVGPathSegLinetoVerticalAbs.prototype, 'y', {\\n get: function() {\\n return this._y;\\n },\\n set: function(y) {\\n this._y = y;\\n this._segmentChanged();\\n },\\n enumerable: true\\n });\\n\\n window.SVGPathSegLinetoVerticalRel = function(owningPathSegList, y) {\\n SVGPathSeg.call(this, SVGPathSeg.PATHSEG_LINETO_VERTICAL_REL, 'v', owningPathSegList);\\n this._y = y;\\n };\\n SVGPathSegLinetoVerticalRel.prototype = Object.create(SVGPathSeg.prototype);\\n SVGPathSegLinetoVerticalRel.prototype.toString = function() {\\n return '[object SVGPathSegLinetoVerticalRel]';\\n };\\n SVGPathSegLinetoVerticalRel.prototype._asPathString = function() {\\n return this.pathSegTypeAsLetter + ' ' + this._y;\\n };\\n SVGPathSegLinetoVerticalRel.prototype.clone = function() {\\n return new SVGPathSegLinetoVerticalRel(undefined, this._y);\\n };\\n Object.defineProperty(SVGPathSegLinetoVerticalRel.prototype, 'y', {\\n get: function() {\\n return this._y;\\n },\\n set: function(y) {\\n this._y = y;\\n this._segmentChanged();\\n },\\n enumerable: true\\n });\\n\\n window.SVGPathSegCurvetoCubicSmoothAbs = function(owningPathSegList, x, y, x2, y2) {\\n SVGPathSeg.call(this, SVGPathSeg.PATHSEG_CURVETO_CUBIC_SMOOTH_ABS, 'S', owningPathSegList);\\n this._x = x;\\n this._y = y;\\n this._x2 = x2;\\n this._y2 = y2;\\n };\\n SVGPathSegCurvetoCubicSmoothAbs.prototype = Object.create(SVGPathSeg.prototype);\\n SVGPathSegCurvetoCubicSmoothAbs.prototype.toString = function() {\\n return '[object SVGPathSegCurvetoCubicSmoothAbs]';\\n };\\n SVGPathSegCurvetoCubicSmoothAbs.prototype._asPathString = function() {\\n return this.pathSegTypeAsLetter + ' ' + this._x2 + ' ' + this._y2 + ' ' + this._x + ' ' + this._y;\\n };\\n SVGPathSegCurvetoCubicSmoothAbs.prototype.clone = function() {\\n return new SVGPathSegCurvetoCubicSmoothAbs(undefined, this._x, this._y, this._x2, this._y2);\\n };\\n Object.defineProperty(SVGPathSegCurvetoCubicSmoothAbs.prototype, 'x', {\\n get: function() {\\n return this._x;\\n },\\n set: function(x) {\\n this._x = x;\\n this._segmentChanged();\\n },\\n enumerable: true\\n });\\n Object.defineProperty(SVGPathSegCurvetoCubicSmoothAbs.prototype, 'y', {\\n get: function() {\\n return this._y;\\n },\\n set: function(y) {\\n this._y = y;\\n this._segmentChanged();\\n },\\n enumerable: true\\n });\\n Object.defineProperty(SVGPathSegCurvetoCubicSmoothAbs.prototype, 'x2', {\\n get: function() {\\n return this._x2;\\n },\\n set: function(x2) {\\n this._x2 = x2;\\n this._segmentChanged();\\n },\\n enumerable: true\\n });\\n Object.defineProperty(SVGPathSegCurvetoCubicSmoothAbs.prototype, 'y2', {\\n get: function() {\\n return this._y2;\\n },\\n set: function(y2) {\\n this._y2 = y2;\\n this._segmentChanged();\\n },\\n enumerable: true\\n });\\n\\n window.SVGPathSegCurvetoCubicSmoothRel = function(owningPathSegList, x, y, x2, y2) {\\n SVGPathSeg.call(this, SVGPathSeg.PATHSEG_CURVETO_CUBIC_SMOOTH_REL, 's', owningPathSegList);\\n this._x = x;\\n this._y = y;\\n this._x2 = x2;\\n this._y2 = y2;\\n };\\n SVGPathSegCurvetoCubicSmoothRel.prototype = Object.create(SVGPathSeg.prototype);\\n SVGPathSegCurvetoCubicSmoothRel.prototype.toString = function() {\\n return '[object SVGPathSegCurvetoCubicSmoothRel]';\\n };\\n SVGPathSegCurvetoCubicSmoothRel.prototype._asPathString = function() {\\n return this.pathSegTypeAsLetter + ' ' + this._x2 + ' ' + this._y2 + ' ' + this._x + ' ' + this._y;\\n };\\n SVGPathSegCurvetoCubicSmoothRel.prototype.clone = function() {\\n return new SVGPathSegCurvetoCubicSmoothRel(undefined, this._x, this._y, this._x2, this._y2);\\n };\\n Object.defineProperty(SVGPathSegCurvetoCubicSmoothRel.prototype, 'x', {\\n get: function() {\\n return this._x;\\n },\\n set: function(x) {\\n this._x = x;\\n this._segmentChanged();\\n },\\n enumerable: true\\n });\\n Object.defineProperty(SVGPathSegCurvetoCubicSmoothRel.prototype, 'y', {\\n get: function() {\\n return this._y;\\n },\\n set: function(y) {\\n this._y = y;\\n this._segmentChanged();\\n },\\n enumerable: true\\n });\\n Object.defineProperty(SVGPathSegCurvetoCubicSmoothRel.prototype, 'x2', {\\n get: function() {\\n return this._x2;\\n },\\n set: function(x2) {\\n this._x2 = x2;\\n this._segmentChanged();\\n },\\n enumerable: true\\n });\\n Object.defineProperty(SVGPathSegCurvetoCubicSmoothRel.prototype, 'y2', {\\n get: function() {\\n return this._y2;\\n },\\n set: function(y2) {\\n this._y2 = y2;\\n this._segmentChanged();\\n },\\n enumerable: true\\n });\\n\\n window.SVGPathSegCurvetoQuadraticSmoothAbs = function(owningPathSegList, x, y) {\\n SVGPathSeg.call(this, SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_SMOOTH_ABS, 'T', owningPathSegList);\\n this._x = x;\\n this._y = y;\\n };\\n SVGPathSegCurvetoQuadraticSmoothAbs.prototype = Object.create(SVGPathSeg.prototype);\\n SVGPathSegCurvetoQuadraticSmoothAbs.prototype.toString = function() {\\n return '[object SVGPathSegCurvetoQuadraticSmoothAbs]';\\n };\\n SVGPathSegCurvetoQuadraticSmoothAbs.prototype._asPathString = function() {\\n return this.pathSegTypeAsLetter + ' ' + this._x + ' ' + this._y;\\n };\\n SVGPathSegCurvetoQuadraticSmoothAbs.prototype.clone = function() {\\n return new SVGPathSegCurvetoQuadraticSmoothAbs(undefined, this._x, this._y);\\n };\\n Object.defineProperty(SVGPathSegCurvetoQuadraticSmoothAbs.prototype, 'x', {\\n get: function() {\\n return this._x;\\n },\\n set: function(x) {\\n this._x = x;\\n this._segmentChanged();\\n },\\n enumerable: true\\n });\\n Object.defineProperty(SVGPathSegCurvetoQuadraticSmoothAbs.prototype, 'y', {\\n get: function() {\\n return this._y;\\n },\\n set: function(y) {\\n this._y = y;\\n this._segmentChanged();\\n },\\n enumerable: true\\n });\\n\\n window.SVGPathSegCurvetoQuadraticSmoothRel = function(owningPathSegList, x, y) {\\n SVGPathSeg.call(this, SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_SMOOTH_REL, 't', owningPathSegList);\\n this._x = x;\\n this._y = y;\\n };\\n SVGPathSegCurvetoQuadraticSmoothRel.prototype = Object.create(SVGPathSeg.prototype);\\n SVGPathSegCurvetoQuadraticSmoothRel.prototype.toString = function() {\\n return '[object SVGPathSegCurvetoQuadraticSmoothRel]';\\n };\\n SVGPathSegCurvetoQuadraticSmoothRel.prototype._asPathString = function() {\\n return this.pathSegTypeAsLetter + ' ' + this._x + ' ' + this._y;\\n };\\n SVGPathSegCurvetoQuadraticSmoothRel.prototype.clone = function() {\\n return new SVGPathSegCurvetoQuadraticSmoothRel(undefined, this._x, this._y);\\n };\\n Object.defineProperty(SVGPathSegCurvetoQuadraticSmoothRel.prototype, 'x', {\\n get: function() {\\n return this._x;\\n },\\n set: function(x) {\\n this._x = x;\\n this._segmentChanged();\\n },\\n enumerable: true\\n });\\n Object.defineProperty(SVGPathSegCurvetoQuadraticSmoothRel.prototype, 'y', {\\n get: function() {\\n return this._y;\\n },\\n set: function(y) {\\n this._y = y;\\n this._segmentChanged();\\n },\\n enumerable: true\\n });\\n\\n // Add createSVGPathSeg* functions to SVGPathElement.\\n // Spec: http://www.w3.org/TR/SVG11/single-page.html#paths-InterfaceSVGPathElement.\\n SVGPathElement.prototype.createSVGPathSegClosePath = function() {\\n return new SVGPathSegClosePath(undefined);\\n };\\n SVGPathElement.prototype.createSVGPathSegMovetoAbs = function(x, y) {\\n return new SVGPathSegMovetoAbs(undefined, x, y);\\n };\\n SVGPathElement.prototype.createSVGPathSegMovetoRel = function(x, y) {\\n return new SVGPathSegMovetoRel(undefined, x, y);\\n };\\n SVGPathElement.prototype.createSVGPathSegLinetoAbs = function(x, y) {\\n return new SVGPathSegLinetoAbs(undefined, x, y);\\n };\\n SVGPathElement.prototype.createSVGPathSegLinetoRel = function(x, y) {\\n return new SVGPathSegLinetoRel(undefined, x, y);\\n };\\n SVGPathElement.prototype.createSVGPathSegCurvetoCubicAbs = function(x, y, x1, y1, x2, y2) {\\n return new SVGPathSegCurvetoCubicAbs(undefined, x, y, x1, y1, x2, y2);\\n };\\n SVGPathElement.prototype.createSVGPathSegCurvetoCubicRel = function(x, y, x1, y1, x2, y2) {\\n return new SVGPathSegCurvetoCubicRel(undefined, x, y, x1, y1, x2, y2);\\n };\\n SVGPathElement.prototype.createSVGPathSegCurvetoQuadraticAbs = function(x, y, x1, y1) {\\n return new SVGPathSegCurvetoQuadraticAbs(undefined, x, y, x1, y1);\\n };\\n SVGPathElement.prototype.createSVGPathSegCurvetoQuadraticRel = function(x, y, x1, y1) {\\n return new SVGPathSegCurvetoQuadraticRel(undefined, x, y, x1, y1);\\n };\\n SVGPathElement.prototype.createSVGPathSegArcAbs = function(x, y, r1, r2, angle, largeArcFlag, sweepFlag) {\\n return new SVGPathSegArcAbs(undefined, x, y, r1, r2, angle, largeArcFlag, sweepFlag);\\n };\\n SVGPathElement.prototype.createSVGPathSegArcRel = function(x, y, r1, r2, angle, largeArcFlag, sweepFlag) {\\n return new SVGPathSegArcRel(undefined, x, y, r1, r2, angle, largeArcFlag, sweepFlag);\\n };\\n SVGPathElement.prototype.createSVGPathSegLinetoHorizontalAbs = function(x) {\\n return new SVGPathSegLinetoHorizontalAbs(undefined, x);\\n };\\n SVGPathElement.prototype.createSVGPathSegLinetoHorizontalRel = function(x) {\\n return new SVGPathSegLinetoHorizontalRel(undefined, x);\\n };\\n SVGPathElement.prototype.createSVGPathSegLinetoVerticalAbs = function(y) {\\n return new SVGPathSegLinetoVerticalAbs(undefined, y);\\n };\\n SVGPathElement.prototype.createSVGPathSegLinetoVerticalRel = function(y) {\\n return new SVGPathSegLinetoVerticalRel(undefined, y);\\n };\\n SVGPathElement.prototype.createSVGPathSegCurvetoCubicSmoothAbs = function(x, y, x2, y2) {\\n return new SVGPathSegCurvetoCubicSmoothAbs(undefined, x, y, x2, y2);\\n };\\n SVGPathElement.prototype.createSVGPathSegCurvetoCubicSmoothRel = function(x, y, x2, y2) {\\n return new SVGPathSegCurvetoCubicSmoothRel(undefined, x, y, x2, y2);\\n };\\n SVGPathElement.prototype.createSVGPathSegCurvetoQuadraticSmoothAbs = function(x, y) {\\n return new SVGPathSegCurvetoQuadraticSmoothAbs(undefined, x, y);\\n };\\n SVGPathElement.prototype.createSVGPathSegCurvetoQuadraticSmoothRel = function(x, y) {\\n return new SVGPathSegCurvetoQuadraticSmoothRel(undefined, x, y);\\n };\\n }\\n\\n if (!('SVGPathSegList' in window)) {\\n // Spec: http://www.w3.org/TR/SVG11/single-page.html#paths-InterfaceSVGPathSegList\\n window.SVGPathSegList = function(pathElement) {\\n this._pathElement = pathElement;\\n this._list = this._parsePath(this._pathElement.getAttribute('d'));\\n\\n // Use a MutationObserver to catch changes to the path's \\\"d\\\" attribute.\\n this._mutationObserverConfig = { attributes: true, attributeFilter: ['d'] };\\n this._pathElementMutationObserver = new MutationObserver(this._updateListFromPathMutations.bind(this));\\n this._pathElementMutationObserver.observe(this._pathElement, this._mutationObserverConfig);\\n };\\n\\n Object.defineProperty(SVGPathSegList.prototype, 'numberOfItems', {\\n get: function() {\\n this._checkPathSynchronizedToList();\\n return this._list.length;\\n },\\n enumerable: true\\n });\\n\\n // Add the pathSegList accessors to SVGPathElement.\\n // Spec: http://www.w3.org/TR/SVG11/single-page.html#paths-InterfaceSVGAnimatedPathData\\n Object.defineProperty(SVGPathElement.prototype, 'pathSegList', {\\n get: function() {\\n if (!this._pathSegList) this._pathSegList = new SVGPathSegList(this);\\n return this._pathSegList;\\n },\\n enumerable: true\\n });\\n // FIXME: The following are not implemented and simply return SVGPathElement.pathSegList.\\n Object.defineProperty(SVGPathElement.prototype, 'normalizedPathSegList', {\\n get: function() {\\n return this.pathSegList;\\n },\\n enumerable: true\\n });\\n Object.defineProperty(SVGPathElement.prototype, 'animatedPathSegList', {\\n get: function() {\\n return this.pathSegList;\\n },\\n enumerable: true\\n });\\n Object.defineProperty(SVGPathElement.prototype, 'animatedNormalizedPathSegList', {\\n get: function() {\\n return this.pathSegList;\\n },\\n enumerable: true\\n });\\n\\n // Process any pending mutations to the path element and update the list as needed.\\n // This should be the first call of all public functions and is needed because\\n // MutationObservers are not synchronous so we can have pending asynchronous mutations.\\n SVGPathSegList.prototype._checkPathSynchronizedToList = function() {\\n this._updateListFromPathMutations(this._pathElementMutationObserver.takeRecords());\\n };\\n\\n SVGPathSegList.prototype._updateListFromPathMutations = function(mutationRecords) {\\n if (!this._pathElement) return;\\n var hasPathMutations = false;\\n mutationRecords.forEach(function(record) {\\n if (record.attributeName == 'd') hasPathMutations = true;\\n });\\n if (hasPathMutations) this._list = this._parsePath(this._pathElement.getAttribute('d'));\\n };\\n\\n // Serialize the list and update the path's 'd' attribute.\\n SVGPathSegList.prototype._writeListToPath = function() {\\n this._pathElementMutationObserver.disconnect();\\n this._pathElement.setAttribute('d', SVGPathSegList._pathSegArrayAsString(this._list));\\n this._pathElementMutationObserver.observe(this._pathElement, this._mutationObserverConfig);\\n };\\n\\n // When a path segment changes the list needs to be synchronized back to the path element.\\n SVGPathSegList.prototype.segmentChanged = function(pathSeg) {\\n this._writeListToPath();\\n };\\n\\n SVGPathSegList.prototype.clear = function() {\\n this._checkPathSynchronizedToList();\\n\\n this._list.forEach(function(pathSeg) {\\n pathSeg._owningPathSegList = null;\\n });\\n this._list = [];\\n this._writeListToPath();\\n };\\n\\n SVGPathSegList.prototype.initialize = function(newItem) {\\n this._checkPathSynchronizedToList();\\n\\n this._list = [newItem];\\n newItem._owningPathSegList = this;\\n this._writeListToPath();\\n return newItem;\\n };\\n\\n SVGPathSegList.prototype._checkValidIndex = function(index) {\\n if (isNaN(index) || index < 0 || index >= this.numberOfItems) throw 'INDEX_SIZE_ERR';\\n };\\n\\n SVGPathSegList.prototype.getItem = function(index) {\\n this._checkPathSynchronizedToList();\\n\\n this._checkValidIndex(index);\\n return this._list[index];\\n };\\n\\n SVGPathSegList.prototype.insertItemBefore = function(newItem, index) {\\n this._checkPathSynchronizedToList();\\n\\n // Spec: If the index is greater than or equal to numberOfItems, then the new item is appended to the end of the list.\\n if (index > this.numberOfItems) index = this.numberOfItems;\\n if (newItem._owningPathSegList) {\\n // SVG2 spec says to make a copy.\\n newItem = newItem.clone();\\n }\\n this._list.splice(index, 0, newItem);\\n newItem._owningPathSegList = this;\\n this._writeListToPath();\\n return newItem;\\n };\\n\\n SVGPathSegList.prototype.replaceItem = function(newItem, index) {\\n this._checkPathSynchronizedToList();\\n\\n if (newItem._owningPathSegList) {\\n // SVG2 spec says to make a copy.\\n newItem = newItem.clone();\\n }\\n this._checkValidIndex(index);\\n this._list[index] = newItem;\\n newItem._owningPathSegList = this;\\n this._writeListToPath();\\n return newItem;\\n };\\n\\n SVGPathSegList.prototype.removeItem = function(index) {\\n this._checkPathSynchronizedToList();\\n\\n this._checkValidIndex(index);\\n var item = this._list[index];\\n this._list.splice(index, 1);\\n this._writeListToPath();\\n return item;\\n };\\n\\n SVGPathSegList.prototype.appendItem = function(newItem) {\\n this._checkPathSynchronizedToList();\\n\\n if (newItem._owningPathSegList) {\\n // SVG2 spec says to make a copy.\\n newItem = newItem.clone();\\n }\\n this._list.push(newItem);\\n newItem._owningPathSegList = this;\\n // TODO: Optimize this to just append to the existing attribute.\\n this._writeListToPath();\\n return newItem;\\n };\\n\\n SVGPathSegList._pathSegArrayAsString = function(pathSegArray) {\\n var string = '';\\n var first = true;\\n pathSegArray.forEach(function(pathSeg) {\\n if (first) {\\n first = false;\\n string += pathSeg._asPathString();\\n } else {\\n string += ' ' + pathSeg._asPathString();\\n }\\n });\\n return string;\\n };\\n\\n // This closely follows SVGPathParser::parsePath from Source/core/svg/SVGPathParser.cpp.\\n SVGPathSegList.prototype._parsePath = function(string) {\\n if (!string || string.length == 0) return [];\\n\\n var owningPathSegList = this;\\n\\n var Builder = function() {\\n this.pathSegList = [];\\n };\\n\\n Builder.prototype.appendSegment = function(pathSeg) {\\n this.pathSegList.push(pathSeg);\\n };\\n\\n var Source = function(string) {\\n this._string = string;\\n this._currentIndex = 0;\\n this._endIndex = this._string.length;\\n this._previousCommand = SVGPathSeg.PATHSEG_UNKNOWN;\\n\\n this._skipOptionalSpaces();\\n };\\n\\n Source.prototype._isCurrentSpace = function() {\\n var character = this._string[this._currentIndex];\\n return (\\n character <= ' ' &&\\n (character == ' ' || character == '\\\\n' || character == '\\\\t' || character == '\\\\r' || character == '\\\\f')\\n );\\n };\\n\\n Source.prototype._skipOptionalSpaces = function() {\\n while (this._currentIndex < this._endIndex && this._isCurrentSpace()) this._currentIndex++;\\n return this._currentIndex < this._endIndex;\\n };\\n\\n Source.prototype._skipOptionalSpacesOrDelimiter = function() {\\n if (\\n this._currentIndex < this._endIndex &&\\n !this._isCurrentSpace() &&\\n this._string.charAt(this._currentIndex) != ','\\n )\\n return false;\\n if (this._skipOptionalSpaces()) {\\n if (this._currentIndex < this._endIndex && this._string.charAt(this._currentIndex) == ',') {\\n this._currentIndex++;\\n this._skipOptionalSpaces();\\n }\\n }\\n return this._currentIndex < this._endIndex;\\n };\\n\\n Source.prototype.hasMoreData = function() {\\n return this._currentIndex < this._endIndex;\\n };\\n\\n Source.prototype.peekSegmentType = function() {\\n var lookahead = this._string[this._currentIndex];\\n return this._pathSegTypeFromChar(lookahead);\\n };\\n\\n Source.prototype._pathSegTypeFromChar = function(lookahead) {\\n switch (lookahead) {\\n case 'Z':\\n case 'z':\\n return SVGPathSeg.PATHSEG_CLOSEPATH;\\n case 'M':\\n return SVGPathSeg.PATHSEG_MOVETO_ABS;\\n case 'm':\\n return SVGPathSeg.PATHSEG_MOVETO_REL;\\n case 'L':\\n return SVGPathSeg.PATHSEG_LINETO_ABS;\\n case 'l':\\n return SVGPathSeg.PATHSEG_LINETO_REL;\\n case 'C':\\n return SVGPathSeg.PATHSEG_CURVETO_CUBIC_ABS;\\n case 'c':\\n return SVGPathSeg.PATHSEG_CURVETO_CUBIC_REL;\\n case 'Q':\\n return SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_ABS;\\n case 'q':\\n return SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_REL;\\n case 'A':\\n return SVGPathSeg.PATHSEG_ARC_ABS;\\n case 'a':\\n return SVGPathSeg.PATHSEG_ARC_REL;\\n case 'H':\\n return SVGPathSeg.PATHSEG_LINETO_HORIZONTAL_ABS;\\n case 'h':\\n return SVGPathSeg.PATHSEG_LINETO_HORIZONTAL_REL;\\n case 'V':\\n return SVGPathSeg.PATHSEG_LINETO_VERTICAL_ABS;\\n case 'v':\\n return SVGPathSeg.PATHSEG_LINETO_VERTICAL_REL;\\n case 'S':\\n return SVGPathSeg.PATHSEG_CURVETO_CUBIC_SMOOTH_ABS;\\n case 's':\\n return SVGPathSeg.PATHSEG_CURVETO_CUBIC_SMOOTH_REL;\\n case 'T':\\n return SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_SMOOTH_ABS;\\n case 't':\\n return SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_SMOOTH_REL;\\n default:\\n return SVGPathSeg.PATHSEG_UNKNOWN;\\n }\\n };\\n\\n Source.prototype._nextCommandHelper = function(lookahead, previousCommand) {\\n // Check for remaining coordinates in the current command.\\n if (\\n (lookahead == '+' || lookahead == '-' || lookahead == '.' || (lookahead >= '0' && lookahead <= '9')) &&\\n previousCommand != SVGPathSeg.PATHSEG_CLOSEPATH\\n ) {\\n if (previousCommand == SVGPathSeg.PATHSEG_MOVETO_ABS) return SVGPathSeg.PATHSEG_LINETO_ABS;\\n if (previousCommand == SVGPathSeg.PATHSEG_MOVETO_REL) return SVGPathSeg.PATHSEG_LINETO_REL;\\n return previousCommand;\\n }\\n return SVGPathSeg.PATHSEG_UNKNOWN;\\n };\\n\\n Source.prototype.initialCommandIsMoveTo = function() {\\n // If the path is empty it is still valid, so return true.\\n if (!this.hasMoreData()) return true;\\n var command = this.peekSegmentType();\\n // Path must start with moveTo.\\n return command == SVGPathSeg.PATHSEG_MOVETO_ABS || command == SVGPathSeg.PATHSEG_MOVETO_REL;\\n };\\n\\n // Parse a number from an SVG path. This very closely follows genericParseNumber(...) from Source/core/svg/SVGParserUtilities.cpp.\\n // Spec: http://www.w3.org/TR/SVG11/single-page.html#paths-PathDataBNF\\n Source.prototype._parseNumber = function() {\\n var exponent = 0;\\n var integer = 0;\\n var frac = 1;\\n var decimal = 0;\\n var sign = 1;\\n var expsign = 1;\\n\\n var startIndex = this._currentIndex;\\n\\n this._skipOptionalSpaces();\\n\\n // Read the sign.\\n if (this._currentIndex < this._endIndex && this._string.charAt(this._currentIndex) == '+')\\n this._currentIndex++;\\n else if (this._currentIndex < this._endIndex && this._string.charAt(this._currentIndex) == '-') {\\n this._currentIndex++;\\n sign = -1;\\n }\\n\\n if (\\n this._currentIndex == this._endIndex ||\\n ((this._string.charAt(this._currentIndex) < '0' || this._string.charAt(this._currentIndex) > '9') &&\\n this._string.charAt(this._currentIndex) != '.')\\n )\\n // The first character of a number must be one of [0-9+-.].\\n return undefined;\\n\\n // Read the integer part, build right-to-left.\\n var startIntPartIndex = this._currentIndex;\\n while (\\n this._currentIndex < this._endIndex &&\\n this._string.charAt(this._currentIndex) >= '0' &&\\n this._string.charAt(this._currentIndex) <= '9'\\n )\\n this._currentIndex++; // Advance to first non-digit.\\n\\n if (this._currentIndex != startIntPartIndex) {\\n var scanIntPartIndex = this._currentIndex - 1;\\n var multiplier = 1;\\n while (scanIntPartIndex >= startIntPartIndex) {\\n integer += multiplier * (this._string.charAt(scanIntPartIndex--) - '0');\\n multiplier *= 10;\\n }\\n }\\n\\n // Read the decimals.\\n if (this._currentIndex < this._endIndex && this._string.charAt(this._currentIndex) == '.') {\\n this._currentIndex++;\\n\\n // There must be a least one digit following the .\\n if (\\n this._currentIndex >= this._endIndex ||\\n this._string.charAt(this._currentIndex) < '0' ||\\n this._string.charAt(this._currentIndex) > '9'\\n )\\n return undefined;\\n while (\\n this._currentIndex < this._endIndex &&\\n this._string.charAt(this._currentIndex) >= '0' &&\\n this._string.charAt(this._currentIndex) <= '9'\\n )\\n decimal += (this._string.charAt(this._currentIndex++) - '0') * (frac *= 0.1);\\n }\\n\\n // Read the exponent part.\\n if (\\n this._currentIndex != startIndex &&\\n this._currentIndex + 1 < this._endIndex &&\\n (this._string.charAt(this._currentIndex) == 'e' || this._string.charAt(this._currentIndex) == 'E') &&\\n (this._string.charAt(this._currentIndex + 1) != 'x' && this._string.charAt(this._currentIndex + 1) != 'm')\\n ) {\\n this._currentIndex++;\\n\\n // Read the sign of the exponent.\\n if (this._string.charAt(this._currentIndex) == '+') {\\n this._currentIndex++;\\n } else if (this._string.charAt(this._currentIndex) == '-') {\\n this._currentIndex++;\\n expsign = -1;\\n }\\n\\n // There must be an exponent.\\n if (\\n this._currentIndex >= this._endIndex ||\\n this._string.charAt(this._currentIndex) < '0' ||\\n this._string.charAt(this._currentIndex) > '9'\\n )\\n return undefined;\\n\\n while (\\n this._currentIndex < this._endIndex &&\\n this._string.charAt(this._currentIndex) >= '0' &&\\n this._string.charAt(this._currentIndex) <= '9'\\n ) {\\n exponent *= 10;\\n exponent += this._string.charAt(this._currentIndex) - '0';\\n this._currentIndex++;\\n }\\n }\\n\\n var number = integer + decimal;\\n number *= sign;\\n\\n if (exponent) number *= Math.pow(10, expsign * exponent);\\n\\n if (startIndex == this._currentIndex) return undefined;\\n\\n this._skipOptionalSpacesOrDelimiter();\\n\\n return number;\\n };\\n\\n Source.prototype._parseArcFlag = function() {\\n if (this._currentIndex >= this._endIndex) return undefined;\\n var flag = false;\\n var flagChar = this._string.charAt(this._currentIndex++);\\n if (flagChar == '0') flag = false;\\n else if (flagChar == '1') flag = true;\\n else return undefined;\\n\\n this._skipOptionalSpacesOrDelimiter();\\n return flag;\\n };\\n\\n Source.prototype.parseSegment = function() {\\n var lookahead = this._string[this._currentIndex];\\n var command = this._pathSegTypeFromChar(lookahead);\\n if (command == SVGPathSeg.PATHSEG_UNKNOWN) {\\n // Possibly an implicit command. Not allowed if this is the first command.\\n if (this._previousCommand == SVGPathSeg.PATHSEG_UNKNOWN) return null;\\n command = this._nextCommandHelper(lookahead, this._previousCommand);\\n if (command == SVGPathSeg.PATHSEG_UNKNOWN) return null;\\n } else {\\n this._currentIndex++;\\n }\\n\\n this._previousCommand = command;\\n\\n switch (command) {\\n case SVGPathSeg.PATHSEG_MOVETO_REL:\\n return new SVGPathSegMovetoRel(owningPathSegList, this._parseNumber(), this._parseNumber());\\n case SVGPathSeg.PATHSEG_MOVETO_ABS:\\n return new SVGPathSegMovetoAbs(owningPathSegList, this._parseNumber(), this._parseNumber());\\n case SVGPathSeg.PATHSEG_LINETO_REL:\\n return new SVGPathSegLinetoRel(owningPathSegList, this._parseNumber(), this._parseNumber());\\n case SVGPathSeg.PATHSEG_LINETO_ABS:\\n return new SVGPathSegLinetoAbs(owningPathSegList, this._parseNumber(), this._parseNumber());\\n case SVGPathSeg.PATHSEG_LINETO_HORIZONTAL_REL:\\n return new SVGPathSegLinetoHorizontalRel(owningPathSegList, this._parseNumber());\\n case SVGPathSeg.PATHSEG_LINETO_HORIZONTAL_ABS:\\n return new SVGPathSegLinetoHorizontalAbs(owningPathSegList, this._parseNumber());\\n case SVGPathSeg.PATHSEG_LINETO_VERTICAL_REL:\\n return new SVGPathSegLinetoVerticalRel(owningPathSegList, this._parseNumber());\\n case SVGPathSeg.PATHSEG_LINETO_VERTICAL_ABS:\\n return new SVGPathSegLinetoVerticalAbs(owningPathSegList, this._parseNumber());\\n case SVGPathSeg.PATHSEG_CLOSEPATH:\\n this._skipOptionalSpaces();\\n return new SVGPathSegClosePath(owningPathSegList);\\n case SVGPathSeg.PATHSEG_CURVETO_CUBIC_REL:\\n var points = {\\n x1: this._parseNumber(),\\n y1: this._parseNumber(),\\n x2: this._parseNumber(),\\n y2: this._parseNumber(),\\n x: this._parseNumber(),\\n y: this._parseNumber()\\n };\\n return new SVGPathSegCurvetoCubicRel(\\n owningPathSegList,\\n points.x,\\n points.y,\\n points.x1,\\n points.y1,\\n points.x2,\\n points.y2\\n );\\n case SVGPathSeg.PATHSEG_CURVETO_CUBIC_ABS:\\n var points = {\\n x1: this._parseNumber(),\\n y1: this._parseNumber(),\\n x2: this._parseNumber(),\\n y2: this._parseNumber(),\\n x: this._parseNumber(),\\n y: this._parseNumber()\\n };\\n return new SVGPathSegCurvetoCubicAbs(\\n owningPathSegList,\\n points.x,\\n points.y,\\n points.x1,\\n points.y1,\\n points.x2,\\n points.y2\\n );\\n case SVGPathSeg.PATHSEG_CURVETO_CUBIC_SMOOTH_REL:\\n var points = {\\n x2: this._parseNumber(),\\n y2: this._parseNumber(),\\n x: this._parseNumber(),\\n y: this._parseNumber()\\n };\\n return new SVGPathSegCurvetoCubicSmoothRel(owningPathSegList, points.x, points.y, points.x2, points.y2);\\n case SVGPathSeg.PATHSEG_CURVETO_CUBIC_SMOOTH_ABS:\\n var points = {\\n x2: this._parseNumber(),\\n y2: this._parseNumber(),\\n x: this._parseNumber(),\\n y: this._parseNumber()\\n };\\n return new SVGPathSegCurvetoCubicSmoothAbs(owningPathSegList, points.x, points.y, points.x2, points.y2);\\n case SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_REL:\\n var points = {\\n x1: this._parseNumber(),\\n y1: this._parseNumber(),\\n x: this._parseNumber(),\\n y: this._parseNumber()\\n };\\n return new SVGPathSegCurvetoQuadraticRel(owningPathSegList, points.x, points.y, points.x1, points.y1);\\n case SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_ABS:\\n var points = {\\n x1: this._parseNumber(),\\n y1: this._parseNumber(),\\n x: this._parseNumber(),\\n y: this._parseNumber()\\n };\\n return new SVGPathSegCurvetoQuadraticAbs(owningPathSegList, points.x, points.y, points.x1, points.y1);\\n case SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_SMOOTH_REL:\\n return new SVGPathSegCurvetoQuadraticSmoothRel(\\n owningPathSegList,\\n this._parseNumber(),\\n this._parseNumber()\\n );\\n case SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_SMOOTH_ABS:\\n return new SVGPathSegCurvetoQuadraticSmoothAbs(\\n owningPathSegList,\\n this._parseNumber(),\\n this._parseNumber()\\n );\\n case SVGPathSeg.PATHSEG_ARC_REL:\\n var points = {\\n x1: this._parseNumber(),\\n y1: this._parseNumber(),\\n arcAngle: this._parseNumber(),\\n arcLarge: this._parseArcFlag(),\\n arcSweep: this._parseArcFlag(),\\n x: this._parseNumber(),\\n y: this._parseNumber()\\n };\\n return new SVGPathSegArcRel(\\n owningPathSegList,\\n points.x,\\n points.y,\\n points.x1,\\n points.y1,\\n points.arcAngle,\\n points.arcLarge,\\n points.arcSweep\\n );\\n case SVGPathSeg.PATHSEG_ARC_ABS:\\n var points = {\\n x1: this._parseNumber(),\\n y1: this._parseNumber(),\\n arcAngle: this._parseNumber(),\\n arcLarge: this._parseArcFlag(),\\n arcSweep: this._parseArcFlag(),\\n x: this._parseNumber(),\\n y: this._parseNumber()\\n };\\n return new SVGPathSegArcAbs(\\n owningPathSegList,\\n points.x,\\n points.y,\\n points.x1,\\n points.y1,\\n points.arcAngle,\\n points.arcLarge,\\n points.arcSweep\\n );\\n default:\\n throw 'Unknown path seg type.';\\n }\\n };\\n\\n var builder = new Builder();\\n var source = new Source(string);\\n\\n if (!source.initialCommandIsMoveTo()) return [];\\n while (source.hasMoreData()) {\\n var pathSeg = source.parseSegment();\\n if (!pathSeg) return [];\\n builder.appendSegment(pathSeg);\\n }\\n\\n return builder.pathSegList;\\n };\\n }\\n })();\\n\\n /* jshint ignore:end */\\n\\n if (typeof define === 'function' && define.amd) {\\n define('c3', ['d3'], function() {\\n return c3;\\n });\\n } else if ('undefined' !== typeof exports && 'undefined' !== typeof module) {\\n module.exports = c3;\\n } else {\\n window.c3 = c3;\\n }\\n})(window);\\n\"\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/raw-loader!./src/assets/inspinia/plugins/c3/c3.js\n// module id = 2182\n// module chunks = 1","require(\"!!/opt/atlassian/pipelines/agent/build/node_modules/script-loader/addScript.js\")(require(\"!!/opt/atlassian/pipelines/agent/build/node_modules/raw-loader/index.js!/opt/atlassian/pipelines/agent/build/src/assets/inspinia/plugins/morris/raphael.js\"))\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/script-loader!./src/assets/inspinia/plugins/morris/raphael.js\n// module id = 2183\n// module chunks = 1","module.exports = \"// ┌───────────────────────────────────────────────────────────────────────────────────────────────────────┐ \\\\\\\\\\n// │ Raphaël 2.2.0 - JavaScript Vector Library │ \\\\\\\\\\n// ├───────────────────────────────────────────────────────────────────────────────────────────────────────┤ \\\\\\\\\\n// │ Copyright © 2008-2016 Dmitry Baranovskiy (http://raphaeljs.com) │ \\\\\\\\\\n// │ Copyright © 2008-2016 Sencha Labs (http://sencha.com) │ \\\\\\\\\\n// ├───────────────────────────────────────────────────────────────────────────────────────────────────────┤ \\\\\\\\\\n// │ Licensed under the MIT (https://github.com/DmitryBaranovskiy/raphael/blob/master/license.txt) license.│ \\\\\\\\\\n// └───────────────────────────────────────────────────────────────────────────────────────────────────────┘ \\\\\\\\\\n\\n(function webpackUniversalModuleDefinition(root, factory) {\\n\\tif(typeof exports === 'object' && typeof module === 'object')\\n\\t\\tmodule.exports = factory();\\n\\telse if(typeof define === 'function' && define.amd)\\n\\t\\tdefine([], factory);\\n\\telse if(typeof exports === 'object')\\n\\t\\texports[\\\"Raphael\\\"] = factory();\\n\\telse\\n\\t\\troot[\\\"Raphael\\\"] = factory();\\n})(this, function() {\\nreturn /******/ (function(modules) { // webpackBootstrap\\n/******/ \\t// The module cache\\n/******/ \\tvar installedModules = {};\\n\\n/******/ \\t// The require function\\n/******/ \\tfunction __webpack_require__(moduleId) {\\n\\n/******/ \\t\\t// Check if module is in cache\\n/******/ \\t\\tif(installedModules[moduleId])\\n/******/ \\t\\t\\treturn installedModules[moduleId].exports;\\n\\n/******/ \\t\\t// Create a new module (and put it into the cache)\\n/******/ \\t\\tvar module = installedModules[moduleId] = {\\n/******/ \\t\\t\\texports: {},\\n/******/ \\t\\t\\tid: moduleId,\\n/******/ \\t\\t\\tloaded: false\\n/******/ \\t\\t};\\n\\n/******/ \\t\\t// Execute the module function\\n/******/ \\t\\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\\n\\n/******/ \\t\\t// Flag the module as loaded\\n/******/ \\t\\tmodule.loaded = true;\\n\\n/******/ \\t\\t// Return the exports of the module\\n/******/ \\t\\treturn module.exports;\\n/******/ \\t}\\n\\n\\n/******/ \\t// expose the modules object (__webpack_modules__)\\n/******/ \\t__webpack_require__.m = modules;\\n\\n/******/ \\t// expose the module cache\\n/******/ \\t__webpack_require__.c = installedModules;\\n\\n/******/ \\t// __webpack_public_path__\\n/******/ \\t__webpack_require__.p = \\\"\\\";\\n\\n/******/ \\t// Load entry module and return exports\\n/******/ \\treturn __webpack_require__(0);\\n/******/ })\\n/************************************************************************/\\n/******/ ([\\n/* 0 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(1), __webpack_require__(3), __webpack_require__(4)], __WEBPACK_AMD_DEFINE_RESULT__ = function(R) {\\n\\n\\t return R;\\n\\n\\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\\n\\n/***/ },\\n/* 1 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(2)], __WEBPACK_AMD_DEFINE_RESULT__ = function(eve) {\\n\\n\\t /*\\\\\\n\\t * Raphael\\n\\t [ method ]\\n\\t **\\n\\t * Creates a canvas object on which to draw.\\n\\t * You must do this first, as all future calls to drawing methods\\n\\t * from this instance will be bound to this canvas.\\n\\t > Parameters\\n\\t **\\n\\t - container (HTMLElement|string) DOM element or its ID which is going to be a parent for drawing surface\\n\\t - width (number)\\n\\t - height (number)\\n\\t - callback (function) #optional callback function which is going to be executed in the context of newly created paper\\n\\t * or\\n\\t - x (number)\\n\\t - y (number)\\n\\t - width (number)\\n\\t - height (number)\\n\\t - callback (function) #optional callback function which is going to be executed in the context of newly created paper\\n\\t * or\\n\\t - all (array) (first 3 or 4 elements in the array are equal to [containerID, width, height] or [x, y, width, height]. The rest are element descriptions in format {type: type, <attributes>}). See @Paper.add.\\n\\t - callback (function) #optional callback function which is going to be executed in the context of newly created paper\\n\\t * or\\n\\t - onReadyCallback (function) function that is going to be called on DOM ready event. You can also subscribe to this event via Eve’s “DOMLoad” event. In this case method returns `undefined`.\\n\\t = (object) @Paper\\n\\t > Usage\\n\\t | // Each of the following examples create a canvas\\n\\t | // that is 320px wide by 200px high.\\n\\t | // Canvas is created at the viewport’s 10,50 coordinate.\\n\\t | var paper = Raphael(10, 50, 320, 200);\\n\\t | // Canvas is created at the top left corner of the #notepad element\\n\\t | // (or its top right corner in dir=\\\"rtl\\\" elements)\\n\\t | var paper = Raphael(document.getElementById(\\\"notepad\\\"), 320, 200);\\n\\t | // Same as above\\n\\t | var paper = Raphael(\\\"notepad\\\", 320, 200);\\n\\t | // Image dump\\n\\t | var set = Raphael([\\\"notepad\\\", 320, 200, {\\n\\t | type: \\\"rect\\\",\\n\\t | x: 10,\\n\\t | y: 10,\\n\\t | width: 25,\\n\\t | height: 25,\\n\\t | stroke: \\\"#f00\\\"\\n\\t | }, {\\n\\t | type: \\\"text\\\",\\n\\t | x: 30,\\n\\t | y: 40,\\n\\t | text: \\\"Dump\\\"\\n\\t | }]);\\n\\t \\\\*/\\n\\t function R(first) {\\n\\t if (R.is(first, \\\"function\\\")) {\\n\\t return loaded ? first() : eve.on(\\\"raphael.DOMload\\\", first);\\n\\t } else if (R.is(first, array)) {\\n\\t return R._engine.create[apply](R, first.splice(0, 3 + R.is(first[0], nu))).add(first);\\n\\t } else {\\n\\t var args = Array.prototype.slice.call(arguments, 0);\\n\\t if (R.is(args[args.length - 1], \\\"function\\\")) {\\n\\t var f = args.pop();\\n\\t return loaded ? f.call(R._engine.create[apply](R, args)) : eve.on(\\\"raphael.DOMload\\\", function () {\\n\\t f.call(R._engine.create[apply](R, args));\\n\\t });\\n\\t } else {\\n\\t return R._engine.create[apply](R, arguments);\\n\\t }\\n\\t }\\n\\t }\\n\\t R.version = \\\"2.2.0\\\";\\n\\t R.eve = eve;\\n\\t var loaded,\\n\\t separator = /[, ]+/,\\n\\t elements = {circle: 1, rect: 1, path: 1, ellipse: 1, text: 1, image: 1},\\n\\t formatrg = /\\\\{(\\\\d+)\\\\}/g,\\n\\t proto = \\\"prototype\\\",\\n\\t has = \\\"hasOwnProperty\\\",\\n\\t g = {\\n\\t doc: document,\\n\\t win: window\\n\\t },\\n\\t oldRaphael = {\\n\\t was: Object.prototype[has].call(g.win, \\\"Raphael\\\"),\\n\\t is: g.win.Raphael\\n\\t },\\n\\t Paper = function () {\\n\\t /*\\\\\\n\\t * Paper.ca\\n\\t [ property (object) ]\\n\\t **\\n\\t * Shortcut for @Paper.customAttributes\\n\\t \\\\*/\\n\\t /*\\\\\\n\\t * Paper.customAttributes\\n\\t [ property (object) ]\\n\\t **\\n\\t * If you have a set of attributes that you would like to represent\\n\\t * as a function of some number you can do it easily with custom attributes:\\n\\t > Usage\\n\\t | paper.customAttributes.hue = function (num) {\\n\\t | num = num % 1;\\n\\t | return {fill: \\\"hsb(\\\" + num + \\\", 0.75, 1)\\\"};\\n\\t | };\\n\\t | // Custom attribute “hue” will change fill\\n\\t | // to be given hue with fixed saturation and brightness.\\n\\t | // Now you can use it like this:\\n\\t | var c = paper.circle(10, 10, 10).attr({hue: .45});\\n\\t | // or even like this:\\n\\t | c.animate({hue: 1}, 1e3);\\n\\t |\\n\\t | // You could also create custom attribute\\n\\t | // with multiple parameters:\\n\\t | paper.customAttributes.hsb = function (h, s, b) {\\n\\t | return {fill: \\\"hsb(\\\" + [h, s, b].join(\\\",\\\") + \\\")\\\"};\\n\\t | };\\n\\t | c.attr({hsb: \\\"0.5 .8 1\\\"});\\n\\t | c.animate({hsb: [1, 0, 0.5]}, 1e3);\\n\\t \\\\*/\\n\\t this.ca = this.customAttributes = {};\\n\\t },\\n\\t paperproto,\\n\\t appendChild = \\\"appendChild\\\",\\n\\t apply = \\\"apply\\\",\\n\\t concat = \\\"concat\\\",\\n\\t supportsTouch = ('ontouchstart' in g.win) || g.win.DocumentTouch && g.doc instanceof DocumentTouch, //taken from Modernizr touch test\\n\\t E = \\\"\\\",\\n\\t S = \\\" \\\",\\n\\t Str = String,\\n\\t split = \\\"split\\\",\\n\\t events = \\\"click dblclick mousedown mousemove mouseout mouseover mouseup touchstart touchmove touchend touchcancel\\\"[split](S),\\n\\t touchMap = {\\n\\t mousedown: \\\"touchstart\\\",\\n\\t mousemove: \\\"touchmove\\\",\\n\\t mouseup: \\\"touchend\\\"\\n\\t },\\n\\t lowerCase = Str.prototype.toLowerCase,\\n\\t math = Math,\\n\\t mmax = math.max,\\n\\t mmin = math.min,\\n\\t abs = math.abs,\\n\\t pow = math.pow,\\n\\t PI = math.PI,\\n\\t nu = \\\"number\\\",\\n\\t string = \\\"string\\\",\\n\\t array = \\\"array\\\",\\n\\t toString = \\\"toString\\\",\\n\\t fillString = \\\"fill\\\",\\n\\t objectToString = Object.prototype.toString,\\n\\t paper = {},\\n\\t push = \\\"push\\\",\\n\\t ISURL = R._ISURL = /^url\\\\(['\\\"]?(.+?)['\\\"]?\\\\)$/i,\\n\\t colourRegExp = /^\\\\s*((#[a-f\\\\d]{6})|(#[a-f\\\\d]{3})|rgba?\\\\(\\\\s*([\\\\d\\\\.]+%?\\\\s*,\\\\s*[\\\\d\\\\.]+%?\\\\s*,\\\\s*[\\\\d\\\\.]+%?(?:\\\\s*,\\\\s*[\\\\d\\\\.]+%?)?)\\\\s*\\\\)|hsba?\\\\(\\\\s*([\\\\d\\\\.]+(?:deg|\\\\xb0|%)?\\\\s*,\\\\s*[\\\\d\\\\.]+%?\\\\s*,\\\\s*[\\\\d\\\\.]+(?:%?\\\\s*,\\\\s*[\\\\d\\\\.]+)?)%?\\\\s*\\\\)|hsla?\\\\(\\\\s*([\\\\d\\\\.]+(?:deg|\\\\xb0|%)?\\\\s*,\\\\s*[\\\\d\\\\.]+%?\\\\s*,\\\\s*[\\\\d\\\\.]+(?:%?\\\\s*,\\\\s*[\\\\d\\\\.]+)?)%?\\\\s*\\\\))\\\\s*$/i,\\n\\t isnan = {\\\"NaN\\\": 1, \\\"Infinity\\\": 1, \\\"-Infinity\\\": 1},\\n\\t bezierrg = /^(?:cubic-)?bezier\\\\(([^,]+),([^,]+),([^,]+),([^\\\\)]+)\\\\)/,\\n\\t round = math.round,\\n\\t setAttribute = \\\"setAttribute\\\",\\n\\t toFloat = parseFloat,\\n\\t toInt = parseInt,\\n\\t upperCase = Str.prototype.toUpperCase,\\n\\t availableAttrs = R._availableAttrs = {\\n\\t \\\"arrow-end\\\": \\\"none\\\",\\n\\t \\\"arrow-start\\\": \\\"none\\\",\\n\\t blur: 0,\\n\\t \\\"clip-rect\\\": \\\"0 0 1e9 1e9\\\",\\n\\t cursor: \\\"default\\\",\\n\\t cx: 0,\\n\\t cy: 0,\\n\\t fill: \\\"#fff\\\",\\n\\t \\\"fill-opacity\\\": 1,\\n\\t font: '10px \\\"Arial\\\"',\\n\\t \\\"font-family\\\": '\\\"Arial\\\"',\\n\\t \\\"font-size\\\": \\\"10\\\",\\n\\t \\\"font-style\\\": \\\"normal\\\",\\n\\t \\\"font-weight\\\": 400,\\n\\t gradient: 0,\\n\\t height: 0,\\n\\t href: \\\"http://raphaeljs.com/\\\",\\n\\t \\\"letter-spacing\\\": 0,\\n\\t opacity: 1,\\n\\t path: \\\"M0,0\\\",\\n\\t r: 0,\\n\\t rx: 0,\\n\\t ry: 0,\\n\\t src: \\\"\\\",\\n\\t stroke: \\\"#000\\\",\\n\\t \\\"stroke-dasharray\\\": \\\"\\\",\\n\\t \\\"stroke-linecap\\\": \\\"butt\\\",\\n\\t \\\"stroke-linejoin\\\": \\\"butt\\\",\\n\\t \\\"stroke-miterlimit\\\": 0,\\n\\t \\\"stroke-opacity\\\": 1,\\n\\t \\\"stroke-width\\\": 1,\\n\\t target: \\\"_blank\\\",\\n\\t \\\"text-anchor\\\": \\\"middle\\\",\\n\\t title: \\\"Raphael\\\",\\n\\t transform: \\\"\\\",\\n\\t width: 0,\\n\\t x: 0,\\n\\t y: 0,\\n\\t class: \\\"\\\"\\n\\t },\\n\\t availableAnimAttrs = R._availableAnimAttrs = {\\n\\t blur: nu,\\n\\t \\\"clip-rect\\\": \\\"csv\\\",\\n\\t cx: nu,\\n\\t cy: nu,\\n\\t fill: \\\"colour\\\",\\n\\t \\\"fill-opacity\\\": nu,\\n\\t \\\"font-size\\\": nu,\\n\\t height: nu,\\n\\t opacity: nu,\\n\\t path: \\\"path\\\",\\n\\t r: nu,\\n\\t rx: nu,\\n\\t ry: nu,\\n\\t stroke: \\\"colour\\\",\\n\\t \\\"stroke-opacity\\\": nu,\\n\\t \\\"stroke-width\\\": nu,\\n\\t transform: \\\"transform\\\",\\n\\t width: nu,\\n\\t x: nu,\\n\\t y: nu\\n\\t },\\n\\t whitespace = /[\\\\x09\\\\x0a\\\\x0b\\\\x0c\\\\x0d\\\\x20\\\\xa0\\\\u1680\\\\u180e\\\\u2000\\\\u2001\\\\u2002\\\\u2003\\\\u2004\\\\u2005\\\\u2006\\\\u2007\\\\u2008\\\\u2009\\\\u200a\\\\u202f\\\\u205f\\\\u3000\\\\u2028\\\\u2029]/g,\\n\\t commaSpaces = /[\\\\x09\\\\x0a\\\\x0b\\\\x0c\\\\x0d\\\\x20\\\\xa0\\\\u1680\\\\u180e\\\\u2000\\\\u2001\\\\u2002\\\\u2003\\\\u2004\\\\u2005\\\\u2006\\\\u2007\\\\u2008\\\\u2009\\\\u200a\\\\u202f\\\\u205f\\\\u3000\\\\u2028\\\\u2029]*,[\\\\x09\\\\x0a\\\\x0b\\\\x0c\\\\x0d\\\\x20\\\\xa0\\\\u1680\\\\u180e\\\\u2000\\\\u2001\\\\u2002\\\\u2003\\\\u2004\\\\u2005\\\\u2006\\\\u2007\\\\u2008\\\\u2009\\\\u200a\\\\u202f\\\\u205f\\\\u3000\\\\u2028\\\\u2029]*/,\\n\\t hsrg = {hs: 1, rg: 1},\\n\\t p2s = /,?([achlmqrstvxz]),?/gi,\\n\\t pathCommand = /([achlmrqstvz])[\\\\x09\\\\x0a\\\\x0b\\\\x0c\\\\x0d\\\\x20\\\\xa0\\\\u1680\\\\u180e\\\\u2000\\\\u2001\\\\u2002\\\\u2003\\\\u2004\\\\u2005\\\\u2006\\\\u2007\\\\u2008\\\\u2009\\\\u200a\\\\u202f\\\\u205f\\\\u3000\\\\u2028\\\\u2029,]*((-?\\\\d*\\\\.?\\\\d*(?:e[\\\\-+]?\\\\d+)?[\\\\x09\\\\x0a\\\\x0b\\\\x0c\\\\x0d\\\\x20\\\\xa0\\\\u1680\\\\u180e\\\\u2000\\\\u2001\\\\u2002\\\\u2003\\\\u2004\\\\u2005\\\\u2006\\\\u2007\\\\u2008\\\\u2009\\\\u200a\\\\u202f\\\\u205f\\\\u3000\\\\u2028\\\\u2029]*,?[\\\\x09\\\\x0a\\\\x0b\\\\x0c\\\\x0d\\\\x20\\\\xa0\\\\u1680\\\\u180e\\\\u2000\\\\u2001\\\\u2002\\\\u2003\\\\u2004\\\\u2005\\\\u2006\\\\u2007\\\\u2008\\\\u2009\\\\u200a\\\\u202f\\\\u205f\\\\u3000\\\\u2028\\\\u2029]*)+)/ig,\\n\\t tCommand = /([rstm])[\\\\x09\\\\x0a\\\\x0b\\\\x0c\\\\x0d\\\\x20\\\\xa0\\\\u1680\\\\u180e\\\\u2000\\\\u2001\\\\u2002\\\\u2003\\\\u2004\\\\u2005\\\\u2006\\\\u2007\\\\u2008\\\\u2009\\\\u200a\\\\u202f\\\\u205f\\\\u3000\\\\u2028\\\\u2029,]*((-?\\\\d*\\\\.?\\\\d*(?:e[\\\\-+]?\\\\d+)?[\\\\x09\\\\x0a\\\\x0b\\\\x0c\\\\x0d\\\\x20\\\\xa0\\\\u1680\\\\u180e\\\\u2000\\\\u2001\\\\u2002\\\\u2003\\\\u2004\\\\u2005\\\\u2006\\\\u2007\\\\u2008\\\\u2009\\\\u200a\\\\u202f\\\\u205f\\\\u3000\\\\u2028\\\\u2029]*,?[\\\\x09\\\\x0a\\\\x0b\\\\x0c\\\\x0d\\\\x20\\\\xa0\\\\u1680\\\\u180e\\\\u2000\\\\u2001\\\\u2002\\\\u2003\\\\u2004\\\\u2005\\\\u2006\\\\u2007\\\\u2008\\\\u2009\\\\u200a\\\\u202f\\\\u205f\\\\u3000\\\\u2028\\\\u2029]*)+)/ig,\\n\\t pathValues = /(-?\\\\d*\\\\.?\\\\d*(?:e[\\\\-+]?\\\\d+)?)[\\\\x09\\\\x0a\\\\x0b\\\\x0c\\\\x0d\\\\x20\\\\xa0\\\\u1680\\\\u180e\\\\u2000\\\\u2001\\\\u2002\\\\u2003\\\\u2004\\\\u2005\\\\u2006\\\\u2007\\\\u2008\\\\u2009\\\\u200a\\\\u202f\\\\u205f\\\\u3000\\\\u2028\\\\u2029]*,?[\\\\x09\\\\x0a\\\\x0b\\\\x0c\\\\x0d\\\\x20\\\\xa0\\\\u1680\\\\u180e\\\\u2000\\\\u2001\\\\u2002\\\\u2003\\\\u2004\\\\u2005\\\\u2006\\\\u2007\\\\u2008\\\\u2009\\\\u200a\\\\u202f\\\\u205f\\\\u3000\\\\u2028\\\\u2029]*/ig,\\n\\t radial_gradient = R._radial_gradient = /^r(?:\\\\(([^,]+?)[\\\\x09\\\\x0a\\\\x0b\\\\x0c\\\\x0d\\\\x20\\\\xa0\\\\u1680\\\\u180e\\\\u2000\\\\u2001\\\\u2002\\\\u2003\\\\u2004\\\\u2005\\\\u2006\\\\u2007\\\\u2008\\\\u2009\\\\u200a\\\\u202f\\\\u205f\\\\u3000\\\\u2028\\\\u2029]*,[\\\\x09\\\\x0a\\\\x0b\\\\x0c\\\\x0d\\\\x20\\\\xa0\\\\u1680\\\\u180e\\\\u2000\\\\u2001\\\\u2002\\\\u2003\\\\u2004\\\\u2005\\\\u2006\\\\u2007\\\\u2008\\\\u2009\\\\u200a\\\\u202f\\\\u205f\\\\u3000\\\\u2028\\\\u2029]*([^\\\\)]+?)\\\\))?/,\\n\\t eldata = {},\\n\\t sortByKey = function (a, b) {\\n\\t return a.key - b.key;\\n\\t },\\n\\t sortByNumber = function (a, b) {\\n\\t return toFloat(a) - toFloat(b);\\n\\t },\\n\\t fun = function () {},\\n\\t pipe = function (x) {\\n\\t return x;\\n\\t },\\n\\t rectPath = R._rectPath = function (x, y, w, h, r) {\\n\\t if (r) {\\n\\t return [[\\\"M\\\", x + r, y], [\\\"l\\\", w - r * 2, 0], [\\\"a\\\", r, r, 0, 0, 1, r, r], [\\\"l\\\", 0, h - r * 2], [\\\"a\\\", r, r, 0, 0, 1, -r, r], [\\\"l\\\", r * 2 - w, 0], [\\\"a\\\", r, r, 0, 0, 1, -r, -r], [\\\"l\\\", 0, r * 2 - h], [\\\"a\\\", r, r, 0, 0, 1, r, -r], [\\\"z\\\"]];\\n\\t }\\n\\t return [[\\\"M\\\", x, y], [\\\"l\\\", w, 0], [\\\"l\\\", 0, h], [\\\"l\\\", -w, 0], [\\\"z\\\"]];\\n\\t },\\n\\t ellipsePath = function (x, y, rx, ry) {\\n\\t if (ry == null) {\\n\\t ry = rx;\\n\\t }\\n\\t return [[\\\"M\\\", x, y], [\\\"m\\\", 0, -ry], [\\\"a\\\", rx, ry, 0, 1, 1, 0, 2 * ry], [\\\"a\\\", rx, ry, 0, 1, 1, 0, -2 * ry], [\\\"z\\\"]];\\n\\t },\\n\\t getPath = R._getPath = {\\n\\t path: function (el) {\\n\\t return el.attr(\\\"path\\\");\\n\\t },\\n\\t circle: function (el) {\\n\\t var a = el.attrs;\\n\\t return ellipsePath(a.cx, a.cy, a.r);\\n\\t },\\n\\t ellipse: function (el) {\\n\\t var a = el.attrs;\\n\\t return ellipsePath(a.cx, a.cy, a.rx, a.ry);\\n\\t },\\n\\t rect: function (el) {\\n\\t var a = el.attrs;\\n\\t return rectPath(a.x, a.y, a.width, a.height, a.r);\\n\\t },\\n\\t image: function (el) {\\n\\t var a = el.attrs;\\n\\t return rectPath(a.x, a.y, a.width, a.height);\\n\\t },\\n\\t text: function (el) {\\n\\t var bbox = el._getBBox();\\n\\t return rectPath(bbox.x, bbox.y, bbox.width, bbox.height);\\n\\t },\\n\\t set : function(el) {\\n\\t var bbox = el._getBBox();\\n\\t return rectPath(bbox.x, bbox.y, bbox.width, bbox.height);\\n\\t }\\n\\t },\\n\\t /*\\\\\\n\\t * Raphael.mapPath\\n\\t [ method ]\\n\\t **\\n\\t * Transform the path string with given matrix.\\n\\t > Parameters\\n\\t - path (string) path string\\n\\t - matrix (object) see @Matrix\\n\\t = (string) transformed path string\\n\\t \\\\*/\\n\\t mapPath = R.mapPath = function (path, matrix) {\\n\\t if (!matrix) {\\n\\t return path;\\n\\t }\\n\\t var x, y, i, j, ii, jj, pathi;\\n\\t path = path2curve(path);\\n\\t for (i = 0, ii = path.length; i < ii; i++) {\\n\\t pathi = path[i];\\n\\t for (j = 1, jj = pathi.length; j < jj; j += 2) {\\n\\t x = matrix.x(pathi[j], pathi[j + 1]);\\n\\t y = matrix.y(pathi[j], pathi[j + 1]);\\n\\t pathi[j] = x;\\n\\t pathi[j + 1] = y;\\n\\t }\\n\\t }\\n\\t return path;\\n\\t };\\n\\n\\t R._g = g;\\n\\t /*\\\\\\n\\t * Raphael.type\\n\\t [ property (string) ]\\n\\t **\\n\\t * Can be “SVG”, “VML” or empty, depending on browser support.\\n\\t \\\\*/\\n\\t R.type = (g.win.SVGAngle || g.doc.implementation.hasFeature(\\\"http://www.w3.org/TR/SVG11/feature#BasicStructure\\\", \\\"1.1\\\") ? \\\"SVG\\\" : \\\"VML\\\");\\n\\t if (R.type == \\\"VML\\\") {\\n\\t var d = g.doc.createElement(\\\"div\\\"),\\n\\t b;\\n\\t d.innerHTML = '<v:shape adj=\\\"1\\\"/>';\\n\\t b = d.firstChild;\\n\\t b.style.behavior = \\\"url(#default#VML)\\\";\\n\\t if (!(b && typeof b.adj == \\\"object\\\")) {\\n\\t return (R.type = E);\\n\\t }\\n\\t d = null;\\n\\t }\\n\\t /*\\\\\\n\\t * Raphael.svg\\n\\t [ property (boolean) ]\\n\\t **\\n\\t * `true` if browser supports SVG.\\n\\t \\\\*/\\n\\t /*\\\\\\n\\t * Raphael.vml\\n\\t [ property (boolean) ]\\n\\t **\\n\\t * `true` if browser supports VML.\\n\\t \\\\*/\\n\\t R.svg = !(R.vml = R.type == \\\"VML\\\");\\n\\t R._Paper = Paper;\\n\\t /*\\\\\\n\\t * Raphael.fn\\n\\t [ property (object) ]\\n\\t **\\n\\t * You can add your own method to the canvas. For example if you want to draw a pie chart,\\n\\t * you can create your own pie chart function and ship it as a Raphaël plugin. To do this\\n\\t * you need to extend the `Raphael.fn` object. You should modify the `fn` object before a\\n\\t * Raphaël instance is created, otherwise it will take no effect. Please note that the\\n\\t * ability for namespaced plugins was removed in Raphael 2.0. It is up to the plugin to\\n\\t * ensure any namespacing ensures proper context.\\n\\t > Usage\\n\\t | Raphael.fn.arrow = function (x1, y1, x2, y2, size) {\\n\\t | return this.path( ... );\\n\\t | };\\n\\t | // or create namespace\\n\\t | Raphael.fn.mystuff = {\\n\\t | arrow: function () {…},\\n\\t | star: function () {…},\\n\\t | // etc…\\n\\t | };\\n\\t | var paper = Raphael(10, 10, 630, 480);\\n\\t | // then use it\\n\\t | paper.arrow(10, 10, 30, 30, 5).attr({fill: \\\"#f00\\\"});\\n\\t | paper.mystuff.arrow();\\n\\t | paper.mystuff.star();\\n\\t \\\\*/\\n\\t R.fn = paperproto = Paper.prototype = R.prototype;\\n\\t R._id = 0;\\n\\t /*\\\\\\n\\t * Raphael.is\\n\\t [ method ]\\n\\t **\\n\\t * Handful of replacements for `typeof` operator.\\n\\t > Parameters\\n\\t - o (…) any object or primitive\\n\\t - type (string) name of the type, i.e. “string”, “function”, “number”, etc.\\n\\t = (boolean) is given value is of given type\\n\\t \\\\*/\\n\\t R.is = function (o, type) {\\n\\t type = lowerCase.call(type);\\n\\t if (type == \\\"finite\\\") {\\n\\t return !isnan[has](+o);\\n\\t }\\n\\t if (type == \\\"array\\\") {\\n\\t return o instanceof Array;\\n\\t }\\n\\t return (type == \\\"null\\\" && o === null) ||\\n\\t (type == typeof o && o !== null) ||\\n\\t (type == \\\"object\\\" && o === Object(o)) ||\\n\\t (type == \\\"array\\\" && Array.isArray && Array.isArray(o)) ||\\n\\t objectToString.call(o).slice(8, -1).toLowerCase() == type;\\n\\t };\\n\\n\\t function clone(obj) {\\n\\t if (typeof obj == \\\"function\\\" || Object(obj) !== obj) {\\n\\t return obj;\\n\\t }\\n\\t var res = new obj.constructor;\\n\\t for (var key in obj) if (obj[has](key)) {\\n\\t res[key] = clone(obj[key]);\\n\\t }\\n\\t return res;\\n\\t }\\n\\n\\t /*\\\\\\n\\t * Raphael.angle\\n\\t [ method ]\\n\\t **\\n\\t * Returns angle between two or three points\\n\\t > Parameters\\n\\t - x1 (number) x coord of first point\\n\\t - y1 (number) y coord of first point\\n\\t - x2 (number) x coord of second point\\n\\t - y2 (number) y coord of second point\\n\\t - x3 (number) #optional x coord of third point\\n\\t - y3 (number) #optional y coord of third point\\n\\t = (number) angle in degrees.\\n\\t \\\\*/\\n\\t R.angle = function (x1, y1, x2, y2, x3, y3) {\\n\\t if (x3 == null) {\\n\\t var x = x1 - x2,\\n\\t y = y1 - y2;\\n\\t if (!x && !y) {\\n\\t return 0;\\n\\t }\\n\\t return (180 + math.atan2(-y, -x) * 180 / PI + 360) % 360;\\n\\t } else {\\n\\t return R.angle(x1, y1, x3, y3) - R.angle(x2, y2, x3, y3);\\n\\t }\\n\\t };\\n\\t /*\\\\\\n\\t * Raphael.rad\\n\\t [ method ]\\n\\t **\\n\\t * Transform angle to radians\\n\\t > Parameters\\n\\t - deg (number) angle in degrees\\n\\t = (number) angle in radians.\\n\\t \\\\*/\\n\\t R.rad = function (deg) {\\n\\t return deg % 360 * PI / 180;\\n\\t };\\n\\t /*\\\\\\n\\t * Raphael.deg\\n\\t [ method ]\\n\\t **\\n\\t * Transform angle to degrees\\n\\t > Parameters\\n\\t - rad (number) angle in radians\\n\\t = (number) angle in degrees.\\n\\t \\\\*/\\n\\t R.deg = function (rad) {\\n\\t return Math.round ((rad * 180 / PI% 360)* 1000) / 1000;\\n\\t };\\n\\t /*\\\\\\n\\t * Raphael.snapTo\\n\\t [ method ]\\n\\t **\\n\\t * Snaps given value to given grid.\\n\\t > Parameters\\n\\t - values (array|number) given array of values or step of the grid\\n\\t - value (number) value to adjust\\n\\t - tolerance (number) #optional tolerance for snapping. Default is `10`.\\n\\t = (number) adjusted value.\\n\\t \\\\*/\\n\\t R.snapTo = function (values, value, tolerance) {\\n\\t tolerance = R.is(tolerance, \\\"finite\\\") ? tolerance : 10;\\n\\t if (R.is(values, array)) {\\n\\t var i = values.length;\\n\\t while (i--) if (abs(values[i] - value) <= tolerance) {\\n\\t return values[i];\\n\\t }\\n\\t } else {\\n\\t values = +values;\\n\\t var rem = value % values;\\n\\t if (rem < tolerance) {\\n\\t return value - rem;\\n\\t }\\n\\t if (rem > values - tolerance) {\\n\\t return value - rem + values;\\n\\t }\\n\\t }\\n\\t return value;\\n\\t };\\n\\n\\t /*\\\\\\n\\t * Raphael.createUUID\\n\\t [ method ]\\n\\t **\\n\\t * Returns RFC4122, version 4 ID\\n\\t \\\\*/\\n\\t var createUUID = R.createUUID = (function (uuidRegEx, uuidReplacer) {\\n\\t return function () {\\n\\t return \\\"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\\\".replace(uuidRegEx, uuidReplacer).toUpperCase();\\n\\t };\\n\\t })(/[xy]/g, function (c) {\\n\\t var r = math.random() * 16 | 0,\\n\\t v = c == \\\"x\\\" ? r : (r & 3 | 8);\\n\\t return v.toString(16);\\n\\t });\\n\\n\\t /*\\\\\\n\\t * Raphael.setWindow\\n\\t [ method ]\\n\\t **\\n\\t * Used when you need to draw in `<iframe>`. Switched window to the iframe one.\\n\\t > Parameters\\n\\t - newwin (window) new window object\\n\\t \\\\*/\\n\\t R.setWindow = function (newwin) {\\n\\t eve(\\\"raphael.setWindow\\\", R, g.win, newwin);\\n\\t g.win = newwin;\\n\\t g.doc = g.win.document;\\n\\t if (R._engine.initWin) {\\n\\t R._engine.initWin(g.win);\\n\\t }\\n\\t };\\n\\t var toHex = function (color) {\\n\\t if (R.vml) {\\n\\t // http://dean.edwards.name/weblog/2009/10/convert-any-colour-value-to-hex-in-msie/\\n\\t var trim = /^\\\\s+|\\\\s+$/g;\\n\\t var bod;\\n\\t try {\\n\\t var docum = new ActiveXObject(\\\"htmlfile\\\");\\n\\t docum.write(\\\"<body>\\\");\\n\\t docum.close();\\n\\t bod = docum.body;\\n\\t } catch(e) {\\n\\t bod = createPopup().document.body;\\n\\t }\\n\\t var range = bod.createTextRange();\\n\\t toHex = cacher(function (color) {\\n\\t try {\\n\\t bod.style.color = Str(color).replace(trim, E);\\n\\t var value = range.queryCommandValue(\\\"ForeColor\\\");\\n\\t value = ((value & 255) << 16) | (value & 65280) | ((value & 16711680) >>> 16);\\n\\t return \\\"#\\\" + (\\\"000000\\\" + value.toString(16)).slice(-6);\\n\\t } catch(e) {\\n\\t return \\\"none\\\";\\n\\t }\\n\\t });\\n\\t } else {\\n\\t var i = g.doc.createElement(\\\"i\\\");\\n\\t i.title = \\\"Rapha\\\\xebl Colour Picker\\\";\\n\\t i.style.display = \\\"none\\\";\\n\\t g.doc.body.appendChild(i);\\n\\t toHex = cacher(function (color) {\\n\\t i.style.color = color;\\n\\t return g.doc.defaultView.getComputedStyle(i, E).getPropertyValue(\\\"color\\\");\\n\\t });\\n\\t }\\n\\t return toHex(color);\\n\\t },\\n\\t hsbtoString = function () {\\n\\t return \\\"hsb(\\\" + [this.h, this.s, this.b] + \\\")\\\";\\n\\t },\\n\\t hsltoString = function () {\\n\\t return \\\"hsl(\\\" + [this.h, this.s, this.l] + \\\")\\\";\\n\\t },\\n\\t rgbtoString = function () {\\n\\t return this.hex;\\n\\t },\\n\\t prepareRGB = function (r, g, b) {\\n\\t if (g == null && R.is(r, \\\"object\\\") && \\\"r\\\" in r && \\\"g\\\" in r && \\\"b\\\" in r) {\\n\\t b = r.b;\\n\\t g = r.g;\\n\\t r = r.r;\\n\\t }\\n\\t if (g == null && R.is(r, string)) {\\n\\t var clr = R.getRGB(r);\\n\\t r = clr.r;\\n\\t g = clr.g;\\n\\t b = clr.b;\\n\\t }\\n\\t if (r > 1 || g > 1 || b > 1) {\\n\\t r /= 255;\\n\\t g /= 255;\\n\\t b /= 255;\\n\\t }\\n\\n\\t return [r, g, b];\\n\\t },\\n\\t packageRGB = function (r, g, b, o) {\\n\\t r *= 255;\\n\\t g *= 255;\\n\\t b *= 255;\\n\\t var rgb = {\\n\\t r: r,\\n\\t g: g,\\n\\t b: b,\\n\\t hex: R.rgb(r, g, b),\\n\\t toString: rgbtoString\\n\\t };\\n\\t R.is(o, \\\"finite\\\") && (rgb.opacity = o);\\n\\t return rgb;\\n\\t };\\n\\n\\t /*\\\\\\n\\t * Raphael.color\\n\\t [ method ]\\n\\t **\\n\\t * Parses the color string and returns object with all values for the given color.\\n\\t > Parameters\\n\\t - clr (string) color string in one of the supported formats (see @Raphael.getRGB)\\n\\t = (object) Combined RGB & HSB object in format:\\n\\t o {\\n\\t o r (number) red,\\n\\t o g (number) green,\\n\\t o b (number) blue,\\n\\t o hex (string) color in HTML/CSS format: #••••••,\\n\\t o error (boolean) `true` if string can’t be parsed,\\n\\t o h (number) hue,\\n\\t o s (number) saturation,\\n\\t o v (number) value (brightness),\\n\\t o l (number) lightness\\n\\t o }\\n\\t \\\\*/\\n\\t R.color = function (clr) {\\n\\t var rgb;\\n\\t if (R.is(clr, \\\"object\\\") && \\\"h\\\" in clr && \\\"s\\\" in clr && \\\"b\\\" in clr) {\\n\\t rgb = R.hsb2rgb(clr);\\n\\t clr.r = rgb.r;\\n\\t clr.g = rgb.g;\\n\\t clr.b = rgb.b;\\n\\t clr.hex = rgb.hex;\\n\\t } else if (R.is(clr, \\\"object\\\") && \\\"h\\\" in clr && \\\"s\\\" in clr && \\\"l\\\" in clr) {\\n\\t rgb = R.hsl2rgb(clr);\\n\\t clr.r = rgb.r;\\n\\t clr.g = rgb.g;\\n\\t clr.b = rgb.b;\\n\\t clr.hex = rgb.hex;\\n\\t } else {\\n\\t if (R.is(clr, \\\"string\\\")) {\\n\\t clr = R.getRGB(clr);\\n\\t }\\n\\t if (R.is(clr, \\\"object\\\") && \\\"r\\\" in clr && \\\"g\\\" in clr && \\\"b\\\" in clr) {\\n\\t rgb = R.rgb2hsl(clr);\\n\\t clr.h = rgb.h;\\n\\t clr.s = rgb.s;\\n\\t clr.l = rgb.l;\\n\\t rgb = R.rgb2hsb(clr);\\n\\t clr.v = rgb.b;\\n\\t } else {\\n\\t clr = {hex: \\\"none\\\"};\\n\\t clr.r = clr.g = clr.b = clr.h = clr.s = clr.v = clr.l = -1;\\n\\t }\\n\\t }\\n\\t clr.toString = rgbtoString;\\n\\t return clr;\\n\\t };\\n\\t /*\\\\\\n\\t * Raphael.hsb2rgb\\n\\t [ method ]\\n\\t **\\n\\t * Converts HSB values to RGB object.\\n\\t > Parameters\\n\\t - h (number) hue\\n\\t - s (number) saturation\\n\\t - v (number) value or brightness\\n\\t = (object) RGB object in format:\\n\\t o {\\n\\t o r (number) red,\\n\\t o g (number) green,\\n\\t o b (number) blue,\\n\\t o hex (string) color in HTML/CSS format: #••••••\\n\\t o }\\n\\t \\\\*/\\n\\t R.hsb2rgb = function (h, s, v, o) {\\n\\t if (this.is(h, \\\"object\\\") && \\\"h\\\" in h && \\\"s\\\" in h && \\\"b\\\" in h) {\\n\\t v = h.b;\\n\\t s = h.s;\\n\\t o = h.o;\\n\\t h = h.h;\\n\\t }\\n\\t h *= 360;\\n\\t var R, G, B, X, C;\\n\\t h = (h % 360) / 60;\\n\\t C = v * s;\\n\\t X = C * (1 - abs(h % 2 - 1));\\n\\t R = G = B = v - C;\\n\\n\\t h = ~~h;\\n\\t R += [C, X, 0, 0, X, C][h];\\n\\t G += [X, C, C, X, 0, 0][h];\\n\\t B += [0, 0, X, C, C, X][h];\\n\\t return packageRGB(R, G, B, o);\\n\\t };\\n\\t /*\\\\\\n\\t * Raphael.hsl2rgb\\n\\t [ method ]\\n\\t **\\n\\t * Converts HSL values to RGB object.\\n\\t > Parameters\\n\\t - h (number) hue\\n\\t - s (number) saturation\\n\\t - l (number) luminosity\\n\\t = (object) RGB object in format:\\n\\t o {\\n\\t o r (number) red,\\n\\t o g (number) green,\\n\\t o b (number) blue,\\n\\t o hex (string) color in HTML/CSS format: #••••••\\n\\t o }\\n\\t \\\\*/\\n\\t R.hsl2rgb = function (h, s, l, o) {\\n\\t if (this.is(h, \\\"object\\\") && \\\"h\\\" in h && \\\"s\\\" in h && \\\"l\\\" in h) {\\n\\t l = h.l;\\n\\t s = h.s;\\n\\t h = h.h;\\n\\t }\\n\\t if (h > 1 || s > 1 || l > 1) {\\n\\t h /= 360;\\n\\t s /= 100;\\n\\t l /= 100;\\n\\t }\\n\\t h *= 360;\\n\\t var R, G, B, X, C;\\n\\t h = (h % 360) / 60;\\n\\t C = 2 * s * (l < .5 ? l : 1 - l);\\n\\t X = C * (1 - abs(h % 2 - 1));\\n\\t R = G = B = l - C / 2;\\n\\n\\t h = ~~h;\\n\\t R += [C, X, 0, 0, X, C][h];\\n\\t G += [X, C, C, X, 0, 0][h];\\n\\t B += [0, 0, X, C, C, X][h];\\n\\t return packageRGB(R, G, B, o);\\n\\t };\\n\\t /*\\\\\\n\\t * Raphael.rgb2hsb\\n\\t [ method ]\\n\\t **\\n\\t * Converts RGB values to HSB object.\\n\\t > Parameters\\n\\t - r (number) red\\n\\t - g (number) green\\n\\t - b (number) blue\\n\\t = (object) HSB object in format:\\n\\t o {\\n\\t o h (number) hue\\n\\t o s (number) saturation\\n\\t o b (number) brightness\\n\\t o }\\n\\t \\\\*/\\n\\t R.rgb2hsb = function (r, g, b) {\\n\\t b = prepareRGB(r, g, b);\\n\\t r = b[0];\\n\\t g = b[1];\\n\\t b = b[2];\\n\\n\\t var H, S, V, C;\\n\\t V = mmax(r, g, b);\\n\\t C = V - mmin(r, g, b);\\n\\t H = (C == 0 ? null :\\n\\t V == r ? (g - b) / C :\\n\\t V == g ? (b - r) / C + 2 :\\n\\t (r - g) / C + 4\\n\\t );\\n\\t H = ((H + 360) % 6) * 60 / 360;\\n\\t S = C == 0 ? 0 : C / V;\\n\\t return {h: H, s: S, b: V, toString: hsbtoString};\\n\\t };\\n\\t /*\\\\\\n\\t * Raphael.rgb2hsl\\n\\t [ method ]\\n\\t **\\n\\t * Converts RGB values to HSL object.\\n\\t > Parameters\\n\\t - r (number) red\\n\\t - g (number) green\\n\\t - b (number) blue\\n\\t = (object) HSL object in format:\\n\\t o {\\n\\t o h (number) hue\\n\\t o s (number) saturation\\n\\t o l (number) luminosity\\n\\t o }\\n\\t \\\\*/\\n\\t R.rgb2hsl = function (r, g, b) {\\n\\t b = prepareRGB(r, g, b);\\n\\t r = b[0];\\n\\t g = b[1];\\n\\t b = b[2];\\n\\n\\t var H, S, L, M, m, C;\\n\\t M = mmax(r, g, b);\\n\\t m = mmin(r, g, b);\\n\\t C = M - m;\\n\\t H = (C == 0 ? null :\\n\\t M == r ? (g - b) / C :\\n\\t M == g ? (b - r) / C + 2 :\\n\\t (r - g) / C + 4);\\n\\t H = ((H + 360) % 6) * 60 / 360;\\n\\t L = (M + m) / 2;\\n\\t S = (C == 0 ? 0 :\\n\\t L < .5 ? C / (2 * L) :\\n\\t C / (2 - 2 * L));\\n\\t return {h: H, s: S, l: L, toString: hsltoString};\\n\\t };\\n\\t R._path2string = function () {\\n\\t return this.join(\\\",\\\").replace(p2s, \\\"$1\\\");\\n\\t };\\n\\t function repush(array, item) {\\n\\t for (var i = 0, ii = array.length; i < ii; i++) if (array[i] === item) {\\n\\t return array.push(array.splice(i, 1)[0]);\\n\\t }\\n\\t }\\n\\t function cacher(f, scope, postprocessor) {\\n\\t function newf() {\\n\\t var arg = Array.prototype.slice.call(arguments, 0),\\n\\t args = arg.join(\\\"\\\\u2400\\\"),\\n\\t cache = newf.cache = newf.cache || {},\\n\\t count = newf.count = newf.count || [];\\n\\t if (cache[has](args)) {\\n\\t repush(count, args);\\n\\t return postprocessor ? postprocessor(cache[args]) : cache[args];\\n\\t }\\n\\t count.length >= 1e3 && delete cache[count.shift()];\\n\\t count.push(args);\\n\\t cache[args] = f[apply](scope, arg);\\n\\t return postprocessor ? postprocessor(cache[args]) : cache[args];\\n\\t }\\n\\t return newf;\\n\\t }\\n\\n\\t var preload = R._preload = function (src, f) {\\n\\t var img = g.doc.createElement(\\\"img\\\");\\n\\t img.style.cssText = \\\"position:absolute;left:-9999em;top:-9999em\\\";\\n\\t img.onload = function () {\\n\\t f.call(this);\\n\\t this.onload = null;\\n\\t g.doc.body.removeChild(this);\\n\\t };\\n\\t img.onerror = function () {\\n\\t g.doc.body.removeChild(this);\\n\\t };\\n\\t g.doc.body.appendChild(img);\\n\\t img.src = src;\\n\\t };\\n\\n\\t function clrToString() {\\n\\t return this.hex;\\n\\t }\\n\\n\\t /*\\\\\\n\\t * Raphael.getRGB\\n\\t [ method ]\\n\\t **\\n\\t * Parses colour string as RGB object\\n\\t > Parameters\\n\\t - colour (string) colour string in one of formats:\\n\\t # <ul>\\n\\t # <li>Colour name (“<code>red</code>”, “<code>green</code>”, “<code>cornflowerblue</code>”, etc)</li>\\n\\t # <li>#••• — shortened HTML colour: (“<code>#000</code>”, “<code>#fc0</code>”, etc)</li>\\n\\t # <li>#•••••• — full length HTML colour: (“<code>#000000</code>”, “<code>#bd2300</code>”)</li>\\n\\t # <li>rgb(•••, •••, •••) — red, green and blue channels’ values: (“<code>rgb(200, 100, 0)</code>”)</li>\\n\\t # <li>rgb(•••%, •••%, •••%) — same as above, but in %: (“<code>rgb(100%, 175%, 0%)</code>”)</li>\\n\\t # <li>hsb(•••, •••, •••) — hue, saturation and brightness values: (“<code>hsb(0.5, 0.25, 1)</code>”)</li>\\n\\t # <li>hsb(•••%, •••%, •••%) — same as above, but in %</li>\\n\\t # <li>hsl(•••, •••, •••) — same as hsb</li>\\n\\t # <li>hsl(•••%, •••%, •••%) — same as hsb</li>\\n\\t # </ul>\\n\\t = (object) RGB object in format:\\n\\t o {\\n\\t o r (number) red,\\n\\t o g (number) green,\\n\\t o b (number) blue\\n\\t o hex (string) color in HTML/CSS format: #••••••,\\n\\t o error (boolean) true if string can’t be parsed\\n\\t o }\\n\\t \\\\*/\\n\\t R.getRGB = cacher(function (colour) {\\n\\t if (!colour || !!((colour = Str(colour)).indexOf(\\\"-\\\") + 1)) {\\n\\t return {r: -1, g: -1, b: -1, hex: \\\"none\\\", error: 1, toString: clrToString};\\n\\t }\\n\\t if (colour == \\\"none\\\") {\\n\\t return {r: -1, g: -1, b: -1, hex: \\\"none\\\", toString: clrToString};\\n\\t }\\n\\t !(hsrg[has](colour.toLowerCase().substring(0, 2)) || colour.charAt() == \\\"#\\\") && (colour = toHex(colour));\\n\\t var res,\\n\\t red,\\n\\t green,\\n\\t blue,\\n\\t opacity,\\n\\t t,\\n\\t values,\\n\\t rgb = colour.match(colourRegExp);\\n\\t if (rgb) {\\n\\t if (rgb[2]) {\\n\\t blue = toInt(rgb[2].substring(5), 16);\\n\\t green = toInt(rgb[2].substring(3, 5), 16);\\n\\t red = toInt(rgb[2].substring(1, 3), 16);\\n\\t }\\n\\t if (rgb[3]) {\\n\\t blue = toInt((t = rgb[3].charAt(3)) + t, 16);\\n\\t green = toInt((t = rgb[3].charAt(2)) + t, 16);\\n\\t red = toInt((t = rgb[3].charAt(1)) + t, 16);\\n\\t }\\n\\t if (rgb[4]) {\\n\\t values = rgb[4][split](commaSpaces);\\n\\t red = toFloat(values[0]);\\n\\t values[0].slice(-1) == \\\"%\\\" && (red *= 2.55);\\n\\t green = toFloat(values[1]);\\n\\t values[1].slice(-1) == \\\"%\\\" && (green *= 2.55);\\n\\t blue = toFloat(values[2]);\\n\\t values[2].slice(-1) == \\\"%\\\" && (blue *= 2.55);\\n\\t rgb[1].toLowerCase().slice(0, 4) == \\\"rgba\\\" && (opacity = toFloat(values[3]));\\n\\t values[3] && values[3].slice(-1) == \\\"%\\\" && (opacity /= 100);\\n\\t }\\n\\t if (rgb[5]) {\\n\\t values = rgb[5][split](commaSpaces);\\n\\t red = toFloat(values[0]);\\n\\t values[0].slice(-1) == \\\"%\\\" && (red *= 2.55);\\n\\t green = toFloat(values[1]);\\n\\t values[1].slice(-1) == \\\"%\\\" && (green *= 2.55);\\n\\t blue = toFloat(values[2]);\\n\\t values[2].slice(-1) == \\\"%\\\" && (blue *= 2.55);\\n\\t (values[0].slice(-3) == \\\"deg\\\" || values[0].slice(-1) == \\\"\\\\xb0\\\") && (red /= 360);\\n\\t rgb[1].toLowerCase().slice(0, 4) == \\\"hsba\\\" && (opacity = toFloat(values[3]));\\n\\t values[3] && values[3].slice(-1) == \\\"%\\\" && (opacity /= 100);\\n\\t return R.hsb2rgb(red, green, blue, opacity);\\n\\t }\\n\\t if (rgb[6]) {\\n\\t values = rgb[6][split](commaSpaces);\\n\\t red = toFloat(values[0]);\\n\\t values[0].slice(-1) == \\\"%\\\" && (red *= 2.55);\\n\\t green = toFloat(values[1]);\\n\\t values[1].slice(-1) == \\\"%\\\" && (green *= 2.55);\\n\\t blue = toFloat(values[2]);\\n\\t values[2].slice(-1) == \\\"%\\\" && (blue *= 2.55);\\n\\t (values[0].slice(-3) == \\\"deg\\\" || values[0].slice(-1) == \\\"\\\\xb0\\\") && (red /= 360);\\n\\t rgb[1].toLowerCase().slice(0, 4) == \\\"hsla\\\" && (opacity = toFloat(values[3]));\\n\\t values[3] && values[3].slice(-1) == \\\"%\\\" && (opacity /= 100);\\n\\t return R.hsl2rgb(red, green, blue, opacity);\\n\\t }\\n\\t rgb = {r: red, g: green, b: blue, toString: clrToString};\\n\\t rgb.hex = \\\"#\\\" + (16777216 | blue | (green << 8) | (red << 16)).toString(16).slice(1);\\n\\t R.is(opacity, \\\"finite\\\") && (rgb.opacity = opacity);\\n\\t return rgb;\\n\\t }\\n\\t return {r: -1, g: -1, b: -1, hex: \\\"none\\\", error: 1, toString: clrToString};\\n\\t }, R);\\n\\t /*\\\\\\n\\t * Raphael.hsb\\n\\t [ method ]\\n\\t **\\n\\t * Converts HSB values to hex representation of the colour.\\n\\t > Parameters\\n\\t - h (number) hue\\n\\t - s (number) saturation\\n\\t - b (number) value or brightness\\n\\t = (string) hex representation of the colour.\\n\\t \\\\*/\\n\\t R.hsb = cacher(function (h, s, b) {\\n\\t return R.hsb2rgb(h, s, b).hex;\\n\\t });\\n\\t /*\\\\\\n\\t * Raphael.hsl\\n\\t [ method ]\\n\\t **\\n\\t * Converts HSL values to hex representation of the colour.\\n\\t > Parameters\\n\\t - h (number) hue\\n\\t - s (number) saturation\\n\\t - l (number) luminosity\\n\\t = (string) hex representation of the colour.\\n\\t \\\\*/\\n\\t R.hsl = cacher(function (h, s, l) {\\n\\t return R.hsl2rgb(h, s, l).hex;\\n\\t });\\n\\t /*\\\\\\n\\t * Raphael.rgb\\n\\t [ method ]\\n\\t **\\n\\t * Converts RGB values to hex representation of the colour.\\n\\t > Parameters\\n\\t - r (number) red\\n\\t - g (number) green\\n\\t - b (number) blue\\n\\t = (string) hex representation of the colour.\\n\\t \\\\*/\\n\\t R.rgb = cacher(function (r, g, b) {\\n\\t function round(x) { return (x + 0.5) | 0; }\\n\\t return \\\"#\\\" + (16777216 | round(b) | (round(g) << 8) | (round(r) << 16)).toString(16).slice(1);\\n\\t });\\n\\t /*\\\\\\n\\t * Raphael.getColor\\n\\t [ method ]\\n\\t **\\n\\t * On each call returns next colour in the spectrum. To reset it back to red call @Raphael.getColor.reset\\n\\t > Parameters\\n\\t - value (number) #optional brightness, default is `0.75`\\n\\t = (string) hex representation of the colour.\\n\\t \\\\*/\\n\\t R.getColor = function (value) {\\n\\t var start = this.getColor.start = this.getColor.start || {h: 0, s: 1, b: value || .75},\\n\\t rgb = this.hsb2rgb(start.h, start.s, start.b);\\n\\t start.h += .075;\\n\\t if (start.h > 1) {\\n\\t start.h = 0;\\n\\t start.s -= .2;\\n\\t start.s <= 0 && (this.getColor.start = {h: 0, s: 1, b: start.b});\\n\\t }\\n\\t return rgb.hex;\\n\\t };\\n\\t /*\\\\\\n\\t * Raphael.getColor.reset\\n\\t [ method ]\\n\\t **\\n\\t * Resets spectrum position for @Raphael.getColor back to red.\\n\\t \\\\*/\\n\\t R.getColor.reset = function () {\\n\\t delete this.start;\\n\\t };\\n\\n\\t // http://schepers.cc/getting-to-the-point\\n\\t function catmullRom2bezier(crp, z) {\\n\\t var d = [];\\n\\t for (var i = 0, iLen = crp.length; iLen - 2 * !z > i; i += 2) {\\n\\t var p = [\\n\\t {x: +crp[i - 2], y: +crp[i - 1]},\\n\\t {x: +crp[i], y: +crp[i + 1]},\\n\\t {x: +crp[i + 2], y: +crp[i + 3]},\\n\\t {x: +crp[i + 4], y: +crp[i + 5]}\\n\\t ];\\n\\t if (z) {\\n\\t if (!i) {\\n\\t p[0] = {x: +crp[iLen - 2], y: +crp[iLen - 1]};\\n\\t } else if (iLen - 4 == i) {\\n\\t p[3] = {x: +crp[0], y: +crp[1]};\\n\\t } else if (iLen - 2 == i) {\\n\\t p[2] = {x: +crp[0], y: +crp[1]};\\n\\t p[3] = {x: +crp[2], y: +crp[3]};\\n\\t }\\n\\t } else {\\n\\t if (iLen - 4 == i) {\\n\\t p[3] = p[2];\\n\\t } else if (!i) {\\n\\t p[0] = {x: +crp[i], y: +crp[i + 1]};\\n\\t }\\n\\t }\\n\\t d.push([\\\"C\\\",\\n\\t (-p[0].x + 6 * p[1].x + p[2].x) / 6,\\n\\t (-p[0].y + 6 * p[1].y + p[2].y) / 6,\\n\\t (p[1].x + 6 * p[2].x - p[3].x) / 6,\\n\\t (p[1].y + 6*p[2].y - p[3].y) / 6,\\n\\t p[2].x,\\n\\t p[2].y\\n\\t ]);\\n\\t }\\n\\n\\t return d;\\n\\t }\\n\\t /*\\\\\\n\\t * Raphael.parsePathString\\n\\t [ method ]\\n\\t **\\n\\t * Utility method\\n\\t **\\n\\t * Parses given path string into an array of arrays of path segments.\\n\\t > Parameters\\n\\t - pathString (string|array) path string or array of segments (in the last case it will be returned straight away)\\n\\t = (array) array of segments.\\n\\t \\\\*/\\n\\t R.parsePathString = function (pathString) {\\n\\t if (!pathString) {\\n\\t return null;\\n\\t }\\n\\t var pth = paths(pathString);\\n\\t if (pth.arr) {\\n\\t return pathClone(pth.arr);\\n\\t }\\n\\n\\t var paramCounts = {a: 7, c: 6, h: 1, l: 2, m: 2, r: 4, q: 4, s: 4, t: 2, v: 1, z: 0},\\n\\t data = [];\\n\\t if (R.is(pathString, array) && R.is(pathString[0], array)) { // rough assumption\\n\\t data = pathClone(pathString);\\n\\t }\\n\\t if (!data.length) {\\n\\t Str(pathString).replace(pathCommand, function (a, b, c) {\\n\\t var params = [],\\n\\t name = b.toLowerCase();\\n\\t c.replace(pathValues, function (a, b) {\\n\\t b && params.push(+b);\\n\\t });\\n\\t if (name == \\\"m\\\" && params.length > 2) {\\n\\t data.push([b][concat](params.splice(0, 2)));\\n\\t name = \\\"l\\\";\\n\\t b = b == \\\"m\\\" ? \\\"l\\\" : \\\"L\\\";\\n\\t }\\n\\t if (name == \\\"r\\\") {\\n\\t data.push([b][concat](params));\\n\\t } else while (params.length >= paramCounts[name]) {\\n\\t data.push([b][concat](params.splice(0, paramCounts[name])));\\n\\t if (!paramCounts[name]) {\\n\\t break;\\n\\t }\\n\\t }\\n\\t });\\n\\t }\\n\\t data.toString = R._path2string;\\n\\t pth.arr = pathClone(data);\\n\\t return data;\\n\\t };\\n\\t /*\\\\\\n\\t * Raphael.parseTransformString\\n\\t [ method ]\\n\\t **\\n\\t * Utility method\\n\\t **\\n\\t * Parses given path string into an array of transformations.\\n\\t > Parameters\\n\\t - TString (string|array) transform string or array of transformations (in the last case it will be returned straight away)\\n\\t = (array) array of transformations.\\n\\t \\\\*/\\n\\t R.parseTransformString = cacher(function (TString) {\\n\\t if (!TString) {\\n\\t return null;\\n\\t }\\n\\t var paramCounts = {r: 3, s: 4, t: 2, m: 6},\\n\\t data = [];\\n\\t if (R.is(TString, array) && R.is(TString[0], array)) { // rough assumption\\n\\t data = pathClone(TString);\\n\\t }\\n\\t if (!data.length) {\\n\\t Str(TString).replace(tCommand, function (a, b, c) {\\n\\t var params = [],\\n\\t name = lowerCase.call(b);\\n\\t c.replace(pathValues, function (a, b) {\\n\\t b && params.push(+b);\\n\\t });\\n\\t data.push([b][concat](params));\\n\\t });\\n\\t }\\n\\t data.toString = R._path2string;\\n\\t return data;\\n\\t });\\n\\t // PATHS\\n\\t var paths = function (ps) {\\n\\t var p = paths.ps = paths.ps || {};\\n\\t if (p[ps]) {\\n\\t p[ps].sleep = 100;\\n\\t } else {\\n\\t p[ps] = {\\n\\t sleep: 100\\n\\t };\\n\\t }\\n\\t setTimeout(function () {\\n\\t for (var key in p) if (p[has](key) && key != ps) {\\n\\t p[key].sleep--;\\n\\t !p[key].sleep && delete p[key];\\n\\t }\\n\\t });\\n\\t return p[ps];\\n\\t };\\n\\t /*\\\\\\n\\t * Raphael.findDotsAtSegment\\n\\t [ method ]\\n\\t **\\n\\t * Utility method\\n\\t **\\n\\t * Find dot coordinates on the given cubic bezier curve at the given t.\\n\\t > Parameters\\n\\t - p1x (number) x of the first point of the curve\\n\\t - p1y (number) y of the first point of the curve\\n\\t - c1x (number) x of the first anchor of the curve\\n\\t - c1y (number) y of the first anchor of the curve\\n\\t - c2x (number) x of the second anchor of the curve\\n\\t - c2y (number) y of the second anchor of the curve\\n\\t - p2x (number) x of the second point of the curve\\n\\t - p2y (number) y of the second point of the curve\\n\\t - t (number) position on the curve (0..1)\\n\\t = (object) point information in format:\\n\\t o {\\n\\t o x: (number) x coordinate of the point\\n\\t o y: (number) y coordinate of the point\\n\\t o m: {\\n\\t o x: (number) x coordinate of the left anchor\\n\\t o y: (number) y coordinate of the left anchor\\n\\t o }\\n\\t o n: {\\n\\t o x: (number) x coordinate of the right anchor\\n\\t o y: (number) y coordinate of the right anchor\\n\\t o }\\n\\t o start: {\\n\\t o x: (number) x coordinate of the start of the curve\\n\\t o y: (number) y coordinate of the start of the curve\\n\\t o }\\n\\t o end: {\\n\\t o x: (number) x coordinate of the end of the curve\\n\\t o y: (number) y coordinate of the end of the curve\\n\\t o }\\n\\t o alpha: (number) angle of the curve derivative at the point\\n\\t o }\\n\\t \\\\*/\\n\\t R.findDotsAtSegment = function (p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t) {\\n\\t var t1 = 1 - t,\\n\\t t13 = pow(t1, 3),\\n\\t t12 = pow(t1, 2),\\n\\t t2 = t * t,\\n\\t t3 = t2 * t,\\n\\t x = t13 * p1x + t12 * 3 * t * c1x + t1 * 3 * t * t * c2x + t3 * p2x,\\n\\t y = t13 * p1y + t12 * 3 * t * c1y + t1 * 3 * t * t * c2y + t3 * p2y,\\n\\t mx = p1x + 2 * t * (c1x - p1x) + t2 * (c2x - 2 * c1x + p1x),\\n\\t my = p1y + 2 * t * (c1y - p1y) + t2 * (c2y - 2 * c1y + p1y),\\n\\t nx = c1x + 2 * t * (c2x - c1x) + t2 * (p2x - 2 * c2x + c1x),\\n\\t ny = c1y + 2 * t * (c2y - c1y) + t2 * (p2y - 2 * c2y + c1y),\\n\\t ax = t1 * p1x + t * c1x,\\n\\t ay = t1 * p1y + t * c1y,\\n\\t cx = t1 * c2x + t * p2x,\\n\\t cy = t1 * c2y + t * p2y,\\n\\t alpha = (90 - math.atan2(mx - nx, my - ny) * 180 / PI);\\n\\t (mx > nx || my < ny) && (alpha += 180);\\n\\t return {\\n\\t x: x,\\n\\t y: y,\\n\\t m: {x: mx, y: my},\\n\\t n: {x: nx, y: ny},\\n\\t start: {x: ax, y: ay},\\n\\t end: {x: cx, y: cy},\\n\\t alpha: alpha\\n\\t };\\n\\t };\\n\\t /*\\\\\\n\\t * Raphael.bezierBBox\\n\\t [ method ]\\n\\t **\\n\\t * Utility method\\n\\t **\\n\\t * Return bounding box of a given cubic bezier curve\\n\\t > Parameters\\n\\t - p1x (number) x of the first point of the curve\\n\\t - p1y (number) y of the first point of the curve\\n\\t - c1x (number) x of the first anchor of the curve\\n\\t - c1y (number) y of the first anchor of the curve\\n\\t - c2x (number) x of the second anchor of the curve\\n\\t - c2y (number) y of the second anchor of the curve\\n\\t - p2x (number) x of the second point of the curve\\n\\t - p2y (number) y of the second point of the curve\\n\\t * or\\n\\t - bez (array) array of six points for bezier curve\\n\\t = (object) point information in format:\\n\\t o {\\n\\t o min: {\\n\\t o x: (number) x coordinate of the left point\\n\\t o y: (number) y coordinate of the top point\\n\\t o }\\n\\t o max: {\\n\\t o x: (number) x coordinate of the right point\\n\\t o y: (number) y coordinate of the bottom point\\n\\t o }\\n\\t o }\\n\\t \\\\*/\\n\\t R.bezierBBox = function (p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y) {\\n\\t if (!R.is(p1x, \\\"array\\\")) {\\n\\t p1x = [p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y];\\n\\t }\\n\\t var bbox = curveDim.apply(null, p1x);\\n\\t return {\\n\\t x: bbox.min.x,\\n\\t y: bbox.min.y,\\n\\t x2: bbox.max.x,\\n\\t y2: bbox.max.y,\\n\\t width: bbox.max.x - bbox.min.x,\\n\\t height: bbox.max.y - bbox.min.y\\n\\t };\\n\\t };\\n\\t /*\\\\\\n\\t * Raphael.isPointInsideBBox\\n\\t [ method ]\\n\\t **\\n\\t * Utility method\\n\\t **\\n\\t * Returns `true` if given point is inside bounding boxes.\\n\\t > Parameters\\n\\t - bbox (string) bounding box\\n\\t - x (string) x coordinate of the point\\n\\t - y (string) y coordinate of the point\\n\\t = (boolean) `true` if point inside\\n\\t \\\\*/\\n\\t R.isPointInsideBBox = function (bbox, x, y) {\\n\\t return x >= bbox.x && x <= bbox.x2 && y >= bbox.y && y <= bbox.y2;\\n\\t };\\n\\t /*\\\\\\n\\t * Raphael.isBBoxIntersect\\n\\t [ method ]\\n\\t **\\n\\t * Utility method\\n\\t **\\n\\t * Returns `true` if two bounding boxes intersect\\n\\t > Parameters\\n\\t - bbox1 (string) first bounding box\\n\\t - bbox2 (string) second bounding box\\n\\t = (boolean) `true` if they intersect\\n\\t \\\\*/\\n\\t R.isBBoxIntersect = function (bbox1, bbox2) {\\n\\t var i = R.isPointInsideBBox;\\n\\t return i(bbox2, bbox1.x, bbox1.y)\\n\\t || i(bbox2, bbox1.x2, bbox1.y)\\n\\t || i(bbox2, bbox1.x, bbox1.y2)\\n\\t || i(bbox2, bbox1.x2, bbox1.y2)\\n\\t || i(bbox1, bbox2.x, bbox2.y)\\n\\t || i(bbox1, bbox2.x2, bbox2.y)\\n\\t || i(bbox1, bbox2.x, bbox2.y2)\\n\\t || i(bbox1, bbox2.x2, bbox2.y2)\\n\\t || (bbox1.x < bbox2.x2 && bbox1.x > bbox2.x || bbox2.x < bbox1.x2 && bbox2.x > bbox1.x)\\n\\t && (bbox1.y < bbox2.y2 && bbox1.y > bbox2.y || bbox2.y < bbox1.y2 && bbox2.y > bbox1.y);\\n\\t };\\n\\t function base3(t, p1, p2, p3, p4) {\\n\\t var t1 = -3 * p1 + 9 * p2 - 9 * p3 + 3 * p4,\\n\\t t2 = t * t1 + 6 * p1 - 12 * p2 + 6 * p3;\\n\\t return t * t2 - 3 * p1 + 3 * p2;\\n\\t }\\n\\t function bezlen(x1, y1, x2, y2, x3, y3, x4, y4, z) {\\n\\t if (z == null) {\\n\\t z = 1;\\n\\t }\\n\\t z = z > 1 ? 1 : z < 0 ? 0 : z;\\n\\t var z2 = z / 2,\\n\\t n = 12,\\n\\t Tvalues = [-0.1252,0.1252,-0.3678,0.3678,-0.5873,0.5873,-0.7699,0.7699,-0.9041,0.9041,-0.9816,0.9816],\\n\\t Cvalues = [0.2491,0.2491,0.2335,0.2335,0.2032,0.2032,0.1601,0.1601,0.1069,0.1069,0.0472,0.0472],\\n\\t sum = 0;\\n\\t for (var i = 0; i < n; i++) {\\n\\t var ct = z2 * Tvalues[i] + z2,\\n\\t xbase = base3(ct, x1, x2, x3, x4),\\n\\t ybase = base3(ct, y1, y2, y3, y4),\\n\\t comb = xbase * xbase + ybase * ybase;\\n\\t sum += Cvalues[i] * math.sqrt(comb);\\n\\t }\\n\\t return z2 * sum;\\n\\t }\\n\\t function getTatLen(x1, y1, x2, y2, x3, y3, x4, y4, ll) {\\n\\t if (ll < 0 || bezlen(x1, y1, x2, y2, x3, y3, x4, y4) < ll) {\\n\\t return;\\n\\t }\\n\\t var t = 1,\\n\\t step = t / 2,\\n\\t t2 = t - step,\\n\\t l,\\n\\t e = .01;\\n\\t l = bezlen(x1, y1, x2, y2, x3, y3, x4, y4, t2);\\n\\t while (abs(l - ll) > e) {\\n\\t step /= 2;\\n\\t t2 += (l < ll ? 1 : -1) * step;\\n\\t l = bezlen(x1, y1, x2, y2, x3, y3, x4, y4, t2);\\n\\t }\\n\\t return t2;\\n\\t }\\n\\t function intersect(x1, y1, x2, y2, x3, y3, x4, y4) {\\n\\t if (\\n\\t mmax(x1, x2) < mmin(x3, x4) ||\\n\\t mmin(x1, x2) > mmax(x3, x4) ||\\n\\t mmax(y1, y2) < mmin(y3, y4) ||\\n\\t mmin(y1, y2) > mmax(y3, y4)\\n\\t ) {\\n\\t return;\\n\\t }\\n\\t var nx = (x1 * y2 - y1 * x2) * (x3 - x4) - (x1 - x2) * (x3 * y4 - y3 * x4),\\n\\t ny = (x1 * y2 - y1 * x2) * (y3 - y4) - (y1 - y2) * (x3 * y4 - y3 * x4),\\n\\t denominator = (x1 - x2) * (y3 - y4) - (y1 - y2) * (x3 - x4);\\n\\n\\t if (!denominator) {\\n\\t return;\\n\\t }\\n\\t var px = nx / denominator,\\n\\t py = ny / denominator,\\n\\t px2 = +px.toFixed(2),\\n\\t py2 = +py.toFixed(2);\\n\\t if (\\n\\t px2 < +mmin(x1, x2).toFixed(2) ||\\n\\t px2 > +mmax(x1, x2).toFixed(2) ||\\n\\t px2 < +mmin(x3, x4).toFixed(2) ||\\n\\t px2 > +mmax(x3, x4).toFixed(2) ||\\n\\t py2 < +mmin(y1, y2).toFixed(2) ||\\n\\t py2 > +mmax(y1, y2).toFixed(2) ||\\n\\t py2 < +mmin(y3, y4).toFixed(2) ||\\n\\t py2 > +mmax(y3, y4).toFixed(2)\\n\\t ) {\\n\\t return;\\n\\t }\\n\\t return {x: px, y: py};\\n\\t }\\n\\t function inter(bez1, bez2) {\\n\\t return interHelper(bez1, bez2);\\n\\t }\\n\\t function interCount(bez1, bez2) {\\n\\t return interHelper(bez1, bez2, 1);\\n\\t }\\n\\t function interHelper(bez1, bez2, justCount) {\\n\\t var bbox1 = R.bezierBBox(bez1),\\n\\t bbox2 = R.bezierBBox(bez2);\\n\\t if (!R.isBBoxIntersect(bbox1, bbox2)) {\\n\\t return justCount ? 0 : [];\\n\\t }\\n\\t var l1 = bezlen.apply(0, bez1),\\n\\t l2 = bezlen.apply(0, bez2),\\n\\t n1 = mmax(~~(l1 / 5), 1),\\n\\t n2 = mmax(~~(l2 / 5), 1),\\n\\t dots1 = [],\\n\\t dots2 = [],\\n\\t xy = {},\\n\\t res = justCount ? 0 : [];\\n\\t for (var i = 0; i < n1 + 1; i++) {\\n\\t var p = R.findDotsAtSegment.apply(R, bez1.concat(i / n1));\\n\\t dots1.push({x: p.x, y: p.y, t: i / n1});\\n\\t }\\n\\t for (i = 0; i < n2 + 1; i++) {\\n\\t p = R.findDotsAtSegment.apply(R, bez2.concat(i / n2));\\n\\t dots2.push({x: p.x, y: p.y, t: i / n2});\\n\\t }\\n\\t for (i = 0; i < n1; i++) {\\n\\t for (var j = 0; j < n2; j++) {\\n\\t var di = dots1[i],\\n\\t di1 = dots1[i + 1],\\n\\t dj = dots2[j],\\n\\t dj1 = dots2[j + 1],\\n\\t ci = abs(di1.x - di.x) < .001 ? \\\"y\\\" : \\\"x\\\",\\n\\t cj = abs(dj1.x - dj.x) < .001 ? \\\"y\\\" : \\\"x\\\",\\n\\t is = intersect(di.x, di.y, di1.x, di1.y, dj.x, dj.y, dj1.x, dj1.y);\\n\\t if (is) {\\n\\t if (xy[is.x.toFixed(4)] == is.y.toFixed(4)) {\\n\\t continue;\\n\\t }\\n\\t xy[is.x.toFixed(4)] = is.y.toFixed(4);\\n\\t var t1 = di.t + abs((is[ci] - di[ci]) / (di1[ci] - di[ci])) * (di1.t - di.t),\\n\\t t2 = dj.t + abs((is[cj] - dj[cj]) / (dj1[cj] - dj[cj])) * (dj1.t - dj.t);\\n\\t if (t1 >= 0 && t1 <= 1.001 && t2 >= 0 && t2 <= 1.001) {\\n\\t if (justCount) {\\n\\t res++;\\n\\t } else {\\n\\t res.push({\\n\\t x: is.x,\\n\\t y: is.y,\\n\\t t1: mmin(t1, 1),\\n\\t t2: mmin(t2, 1)\\n\\t });\\n\\t }\\n\\t }\\n\\t }\\n\\t }\\n\\t }\\n\\t return res;\\n\\t }\\n\\t /*\\\\\\n\\t * Raphael.pathIntersection\\n\\t [ method ]\\n\\t **\\n\\t * Utility method\\n\\t **\\n\\t * Finds intersections of two paths\\n\\t > Parameters\\n\\t - path1 (string) path string\\n\\t - path2 (string) path string\\n\\t = (array) dots of intersection\\n\\t o [\\n\\t o {\\n\\t o x: (number) x coordinate of the point\\n\\t o y: (number) y coordinate of the point\\n\\t o t1: (number) t value for segment of path1\\n\\t o t2: (number) t value for segment of path2\\n\\t o segment1: (number) order number for segment of path1\\n\\t o segment2: (number) order number for segment of path2\\n\\t o bez1: (array) eight coordinates representing beziér curve for the segment of path1\\n\\t o bez2: (array) eight coordinates representing beziér curve for the segment of path2\\n\\t o }\\n\\t o ]\\n\\t \\\\*/\\n\\t R.pathIntersection = function (path1, path2) {\\n\\t return interPathHelper(path1, path2);\\n\\t };\\n\\t R.pathIntersectionNumber = function (path1, path2) {\\n\\t return interPathHelper(path1, path2, 1);\\n\\t };\\n\\t function interPathHelper(path1, path2, justCount) {\\n\\t path1 = R._path2curve(path1);\\n\\t path2 = R._path2curve(path2);\\n\\t var x1, y1, x2, y2, x1m, y1m, x2m, y2m, bez1, bez2,\\n\\t res = justCount ? 0 : [];\\n\\t for (var i = 0, ii = path1.length; i < ii; i++) {\\n\\t var pi = path1[i];\\n\\t if (pi[0] == \\\"M\\\") {\\n\\t x1 = x1m = pi[1];\\n\\t y1 = y1m = pi[2];\\n\\t } else {\\n\\t if (pi[0] == \\\"C\\\") {\\n\\t bez1 = [x1, y1].concat(pi.slice(1));\\n\\t x1 = bez1[6];\\n\\t y1 = bez1[7];\\n\\t } else {\\n\\t bez1 = [x1, y1, x1, y1, x1m, y1m, x1m, y1m];\\n\\t x1 = x1m;\\n\\t y1 = y1m;\\n\\t }\\n\\t for (var j = 0, jj = path2.length; j < jj; j++) {\\n\\t var pj = path2[j];\\n\\t if (pj[0] == \\\"M\\\") {\\n\\t x2 = x2m = pj[1];\\n\\t y2 = y2m = pj[2];\\n\\t } else {\\n\\t if (pj[0] == \\\"C\\\") {\\n\\t bez2 = [x2, y2].concat(pj.slice(1));\\n\\t x2 = bez2[6];\\n\\t y2 = bez2[7];\\n\\t } else {\\n\\t bez2 = [x2, y2, x2, y2, x2m, y2m, x2m, y2m];\\n\\t x2 = x2m;\\n\\t y2 = y2m;\\n\\t }\\n\\t var intr = interHelper(bez1, bez2, justCount);\\n\\t if (justCount) {\\n\\t res += intr;\\n\\t } else {\\n\\t for (var k = 0, kk = intr.length; k < kk; k++) {\\n\\t intr[k].segment1 = i;\\n\\t intr[k].segment2 = j;\\n\\t intr[k].bez1 = bez1;\\n\\t intr[k].bez2 = bez2;\\n\\t }\\n\\t res = res.concat(intr);\\n\\t }\\n\\t }\\n\\t }\\n\\t }\\n\\t }\\n\\t return res;\\n\\t }\\n\\t /*\\\\\\n\\t * Raphael.isPointInsidePath\\n\\t [ method ]\\n\\t **\\n\\t * Utility method\\n\\t **\\n\\t * Returns `true` if given point is inside a given closed path.\\n\\t > Parameters\\n\\t - path (string) path string\\n\\t - x (number) x of the point\\n\\t - y (number) y of the point\\n\\t = (boolean) true, if point is inside the path\\n\\t \\\\*/\\n\\t R.isPointInsidePath = function (path, x, y) {\\n\\t var bbox = R.pathBBox(path);\\n\\t return R.isPointInsideBBox(bbox, x, y) &&\\n\\t interPathHelper(path, [[\\\"M\\\", x, y], [\\\"H\\\", bbox.x2 + 10]], 1) % 2 == 1;\\n\\t };\\n\\t R._removedFactory = function (methodname) {\\n\\t return function () {\\n\\t eve(\\\"raphael.log\\\", null, \\\"Rapha\\\\xebl: you are calling to method \\\\u201c\\\" + methodname + \\\"\\\\u201d of removed object\\\", methodname);\\n\\t };\\n\\t };\\n\\t /*\\\\\\n\\t * Raphael.pathBBox\\n\\t [ method ]\\n\\t **\\n\\t * Utility method\\n\\t **\\n\\t * Return bounding box of a given path\\n\\t > Parameters\\n\\t - path (string) path string\\n\\t = (object) bounding box\\n\\t o {\\n\\t o x: (number) x coordinate of the left top point of the box\\n\\t o y: (number) y coordinate of the left top point of the box\\n\\t o x2: (number) x coordinate of the right bottom point of the box\\n\\t o y2: (number) y coordinate of the right bottom point of the box\\n\\t o width: (number) width of the box\\n\\t o height: (number) height of the box\\n\\t o cx: (number) x coordinate of the center of the box\\n\\t o cy: (number) y coordinate of the center of the box\\n\\t o }\\n\\t \\\\*/\\n\\t var pathDimensions = R.pathBBox = function (path) {\\n\\t var pth = paths(path);\\n\\t if (pth.bbox) {\\n\\t return clone(pth.bbox);\\n\\t }\\n\\t if (!path) {\\n\\t return {x: 0, y: 0, width: 0, height: 0, x2: 0, y2: 0};\\n\\t }\\n\\t path = path2curve(path);\\n\\t var x = 0,\\n\\t y = 0,\\n\\t X = [],\\n\\t Y = [],\\n\\t p;\\n\\t for (var i = 0, ii = path.length; i < ii; i++) {\\n\\t p = path[i];\\n\\t if (p[0] == \\\"M\\\") {\\n\\t x = p[1];\\n\\t y = p[2];\\n\\t X.push(x);\\n\\t Y.push(y);\\n\\t } else {\\n\\t var dim = curveDim(x, y, p[1], p[2], p[3], p[4], p[5], p[6]);\\n\\t X = X[concat](dim.min.x, dim.max.x);\\n\\t Y = Y[concat](dim.min.y, dim.max.y);\\n\\t x = p[5];\\n\\t y = p[6];\\n\\t }\\n\\t }\\n\\t var xmin = mmin[apply](0, X),\\n\\t ymin = mmin[apply](0, Y),\\n\\t xmax = mmax[apply](0, X),\\n\\t ymax = mmax[apply](0, Y),\\n\\t width = xmax - xmin,\\n\\t height = ymax - ymin,\\n\\t bb = {\\n\\t x: xmin,\\n\\t y: ymin,\\n\\t x2: xmax,\\n\\t y2: ymax,\\n\\t width: width,\\n\\t height: height,\\n\\t cx: xmin + width / 2,\\n\\t cy: ymin + height / 2\\n\\t };\\n\\t pth.bbox = clone(bb);\\n\\t return bb;\\n\\t },\\n\\t pathClone = function (pathArray) {\\n\\t var res = clone(pathArray);\\n\\t res.toString = R._path2string;\\n\\t return res;\\n\\t },\\n\\t pathToRelative = R._pathToRelative = function (pathArray) {\\n\\t var pth = paths(pathArray);\\n\\t if (pth.rel) {\\n\\t return pathClone(pth.rel);\\n\\t }\\n\\t if (!R.is(pathArray, array) || !R.is(pathArray && pathArray[0], array)) { // rough assumption\\n\\t pathArray = R.parsePathString(pathArray);\\n\\t }\\n\\t var res = [],\\n\\t x = 0,\\n\\t y = 0,\\n\\t mx = 0,\\n\\t my = 0,\\n\\t start = 0;\\n\\t if (pathArray[0][0] == \\\"M\\\") {\\n\\t x = pathArray[0][1];\\n\\t y = pathArray[0][2];\\n\\t mx = x;\\n\\t my = y;\\n\\t start++;\\n\\t res.push([\\\"M\\\", x, y]);\\n\\t }\\n\\t for (var i = start, ii = pathArray.length; i < ii; i++) {\\n\\t var r = res[i] = [],\\n\\t pa = pathArray[i];\\n\\t if (pa[0] != lowerCase.call(pa[0])) {\\n\\t r[0] = lowerCase.call(pa[0]);\\n\\t switch (r[0]) {\\n\\t case \\\"a\\\":\\n\\t r[1] = pa[1];\\n\\t r[2] = pa[2];\\n\\t r[3] = pa[3];\\n\\t r[4] = pa[4];\\n\\t r[5] = pa[5];\\n\\t r[6] = +(pa[6] - x).toFixed(3);\\n\\t r[7] = +(pa[7] - y).toFixed(3);\\n\\t break;\\n\\t case \\\"v\\\":\\n\\t r[1] = +(pa[1] - y).toFixed(3);\\n\\t break;\\n\\t case \\\"m\\\":\\n\\t mx = pa[1];\\n\\t my = pa[2];\\n\\t default:\\n\\t for (var j = 1, jj = pa.length; j < jj; j++) {\\n\\t r[j] = +(pa[j] - ((j % 2) ? x : y)).toFixed(3);\\n\\t }\\n\\t }\\n\\t } else {\\n\\t r = res[i] = [];\\n\\t if (pa[0] == \\\"m\\\") {\\n\\t mx = pa[1] + x;\\n\\t my = pa[2] + y;\\n\\t }\\n\\t for (var k = 0, kk = pa.length; k < kk; k++) {\\n\\t res[i][k] = pa[k];\\n\\t }\\n\\t }\\n\\t var len = res[i].length;\\n\\t switch (res[i][0]) {\\n\\t case \\\"z\\\":\\n\\t x = mx;\\n\\t y = my;\\n\\t break;\\n\\t case \\\"h\\\":\\n\\t x += +res[i][len - 1];\\n\\t break;\\n\\t case \\\"v\\\":\\n\\t y += +res[i][len - 1];\\n\\t break;\\n\\t default:\\n\\t x += +res[i][len - 2];\\n\\t y += +res[i][len - 1];\\n\\t }\\n\\t }\\n\\t res.toString = R._path2string;\\n\\t pth.rel = pathClone(res);\\n\\t return res;\\n\\t },\\n\\t pathToAbsolute = R._pathToAbsolute = function (pathArray) {\\n\\t var pth = paths(pathArray);\\n\\t if (pth.abs) {\\n\\t return pathClone(pth.abs);\\n\\t }\\n\\t if (!R.is(pathArray, array) || !R.is(pathArray && pathArray[0], array)) { // rough assumption\\n\\t pathArray = R.parsePathString(pathArray);\\n\\t }\\n\\t if (!pathArray || !pathArray.length) {\\n\\t return [[\\\"M\\\", 0, 0]];\\n\\t }\\n\\t var res = [],\\n\\t x = 0,\\n\\t y = 0,\\n\\t mx = 0,\\n\\t my = 0,\\n\\t start = 0;\\n\\t if (pathArray[0][0] == \\\"M\\\") {\\n\\t x = +pathArray[0][1];\\n\\t y = +pathArray[0][2];\\n\\t mx = x;\\n\\t my = y;\\n\\t start++;\\n\\t res[0] = [\\\"M\\\", x, y];\\n\\t }\\n\\t var crz = pathArray.length == 3 && pathArray[0][0] == \\\"M\\\" && pathArray[1][0].toUpperCase() == \\\"R\\\" && pathArray[2][0].toUpperCase() == \\\"Z\\\";\\n\\t for (var r, pa, i = start, ii = pathArray.length; i < ii; i++) {\\n\\t res.push(r = []);\\n\\t pa = pathArray[i];\\n\\t if (pa[0] != upperCase.call(pa[0])) {\\n\\t r[0] = upperCase.call(pa[0]);\\n\\t switch (r[0]) {\\n\\t case \\\"A\\\":\\n\\t r[1] = pa[1];\\n\\t r[2] = pa[2];\\n\\t r[3] = pa[3];\\n\\t r[4] = pa[4];\\n\\t r[5] = pa[5];\\n\\t r[6] = +(pa[6] + x);\\n\\t r[7] = +(pa[7] + y);\\n\\t break;\\n\\t case \\\"V\\\":\\n\\t r[1] = +pa[1] + y;\\n\\t break;\\n\\t case \\\"H\\\":\\n\\t r[1] = +pa[1] + x;\\n\\t break;\\n\\t case \\\"R\\\":\\n\\t var dots = [x, y][concat](pa.slice(1));\\n\\t for (var j = 2, jj = dots.length; j < jj; j++) {\\n\\t dots[j] = +dots[j] + x;\\n\\t dots[++j] = +dots[j] + y;\\n\\t }\\n\\t res.pop();\\n\\t res = res[concat](catmullRom2bezier(dots, crz));\\n\\t break;\\n\\t case \\\"M\\\":\\n\\t mx = +pa[1] + x;\\n\\t my = +pa[2] + y;\\n\\t default:\\n\\t for (j = 1, jj = pa.length; j < jj; j++) {\\n\\t r[j] = +pa[j] + ((j % 2) ? x : y);\\n\\t }\\n\\t }\\n\\t } else if (pa[0] == \\\"R\\\") {\\n\\t dots = [x, y][concat](pa.slice(1));\\n\\t res.pop();\\n\\t res = res[concat](catmullRom2bezier(dots, crz));\\n\\t r = [\\\"R\\\"][concat](pa.slice(-2));\\n\\t } else {\\n\\t for (var k = 0, kk = pa.length; k < kk; k++) {\\n\\t r[k] = pa[k];\\n\\t }\\n\\t }\\n\\t switch (r[0]) {\\n\\t case \\\"Z\\\":\\n\\t x = mx;\\n\\t y = my;\\n\\t break;\\n\\t case \\\"H\\\":\\n\\t x = r[1];\\n\\t break;\\n\\t case \\\"V\\\":\\n\\t y = r[1];\\n\\t break;\\n\\t case \\\"M\\\":\\n\\t mx = r[r.length - 2];\\n\\t my = r[r.length - 1];\\n\\t default:\\n\\t x = r[r.length - 2];\\n\\t y = r[r.length - 1];\\n\\t }\\n\\t }\\n\\t res.toString = R._path2string;\\n\\t pth.abs = pathClone(res);\\n\\t return res;\\n\\t },\\n\\t l2c = function (x1, y1, x2, y2) {\\n\\t return [x1, y1, x2, y2, x2, y2];\\n\\t },\\n\\t q2c = function (x1, y1, ax, ay, x2, y2) {\\n\\t var _13 = 1 / 3,\\n\\t _23 = 2 / 3;\\n\\t return [\\n\\t _13 * x1 + _23 * ax,\\n\\t _13 * y1 + _23 * ay,\\n\\t _13 * x2 + _23 * ax,\\n\\t _13 * y2 + _23 * ay,\\n\\t x2,\\n\\t y2\\n\\t ];\\n\\t },\\n\\t a2c = function (x1, y1, rx, ry, angle, large_arc_flag, sweep_flag, x2, y2, recursive) {\\n\\t // for more information of where this math came from visit:\\n\\t // http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\\n\\t var _120 = PI * 120 / 180,\\n\\t rad = PI / 180 * (+angle || 0),\\n\\t res = [],\\n\\t xy,\\n\\t rotate = cacher(function (x, y, rad) {\\n\\t var X = x * math.cos(rad) - y * math.sin(rad),\\n\\t Y = x * math.sin(rad) + y * math.cos(rad);\\n\\t return {x: X, y: Y};\\n\\t });\\n\\t if (!recursive) {\\n\\t xy = rotate(x1, y1, -rad);\\n\\t x1 = xy.x;\\n\\t y1 = xy.y;\\n\\t xy = rotate(x2, y2, -rad);\\n\\t x2 = xy.x;\\n\\t y2 = xy.y;\\n\\t var cos = math.cos(PI / 180 * angle),\\n\\t sin = math.sin(PI / 180 * angle),\\n\\t x = (x1 - x2) / 2,\\n\\t y = (y1 - y2) / 2;\\n\\t var h = (x * x) / (rx * rx) + (y * y) / (ry * ry);\\n\\t if (h > 1) {\\n\\t h = math.sqrt(h);\\n\\t rx = h * rx;\\n\\t ry = h * ry;\\n\\t }\\n\\t var rx2 = rx * rx,\\n\\t ry2 = ry * ry,\\n\\t k = (large_arc_flag == sweep_flag ? -1 : 1) *\\n\\t math.sqrt(abs((rx2 * ry2 - rx2 * y * y - ry2 * x * x) / (rx2 * y * y + ry2 * x * x))),\\n\\t cx = k * rx * y / ry + (x1 + x2) / 2,\\n\\t cy = k * -ry * x / rx + (y1 + y2) / 2,\\n\\t f1 = math.asin(((y1 - cy) / ry).toFixed(9)),\\n\\t f2 = math.asin(((y2 - cy) / ry).toFixed(9));\\n\\n\\t f1 = x1 < cx ? PI - f1 : f1;\\n\\t f2 = x2 < cx ? PI - f2 : f2;\\n\\t f1 < 0 && (f1 = PI * 2 + f1);\\n\\t f2 < 0 && (f2 = PI * 2 + f2);\\n\\t if (sweep_flag && f1 > f2) {\\n\\t f1 = f1 - PI * 2;\\n\\t }\\n\\t if (!sweep_flag && f2 > f1) {\\n\\t f2 = f2 - PI * 2;\\n\\t }\\n\\t } else {\\n\\t f1 = recursive[0];\\n\\t f2 = recursive[1];\\n\\t cx = recursive[2];\\n\\t cy = recursive[3];\\n\\t }\\n\\t var df = f2 - f1;\\n\\t if (abs(df) > _120) {\\n\\t var f2old = f2,\\n\\t x2old = x2,\\n\\t y2old = y2;\\n\\t f2 = f1 + _120 * (sweep_flag && f2 > f1 ? 1 : -1);\\n\\t x2 = cx + rx * math.cos(f2);\\n\\t y2 = cy + ry * math.sin(f2);\\n\\t res = a2c(x2, y2, rx, ry, angle, 0, sweep_flag, x2old, y2old, [f2, f2old, cx, cy]);\\n\\t }\\n\\t df = f2 - f1;\\n\\t var c1 = math.cos(f1),\\n\\t s1 = math.sin(f1),\\n\\t c2 = math.cos(f2),\\n\\t s2 = math.sin(f2),\\n\\t t = math.tan(df / 4),\\n\\t hx = 4 / 3 * rx * t,\\n\\t hy = 4 / 3 * ry * t,\\n\\t m1 = [x1, y1],\\n\\t m2 = [x1 + hx * s1, y1 - hy * c1],\\n\\t m3 = [x2 + hx * s2, y2 - hy * c2],\\n\\t m4 = [x2, y2];\\n\\t m2[0] = 2 * m1[0] - m2[0];\\n\\t m2[1] = 2 * m1[1] - m2[1];\\n\\t if (recursive) {\\n\\t return [m2, m3, m4][concat](res);\\n\\t } else {\\n\\t res = [m2, m3, m4][concat](res).join()[split](\\\",\\\");\\n\\t var newres = [];\\n\\t for (var i = 0, ii = res.length; i < ii; i++) {\\n\\t newres[i] = i % 2 ? rotate(res[i - 1], res[i], rad).y : rotate(res[i], res[i + 1], rad).x;\\n\\t }\\n\\t return newres;\\n\\t }\\n\\t },\\n\\t findDotAtSegment = function (p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t) {\\n\\t var t1 = 1 - t;\\n\\t return {\\n\\t x: pow(t1, 3) * p1x + pow(t1, 2) * 3 * t * c1x + t1 * 3 * t * t * c2x + pow(t, 3) * p2x,\\n\\t y: pow(t1, 3) * p1y + pow(t1, 2) * 3 * t * c1y + t1 * 3 * t * t * c2y + pow(t, 3) * p2y\\n\\t };\\n\\t },\\n\\t curveDim = cacher(function (p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y) {\\n\\t var a = (c2x - 2 * c1x + p1x) - (p2x - 2 * c2x + c1x),\\n\\t b = 2 * (c1x - p1x) - 2 * (c2x - c1x),\\n\\t c = p1x - c1x,\\n\\t t1 = (-b + math.sqrt(b * b - 4 * a * c)) / 2 / a,\\n\\t t2 = (-b - math.sqrt(b * b - 4 * a * c)) / 2 / a,\\n\\t y = [p1y, p2y],\\n\\t x = [p1x, p2x],\\n\\t dot;\\n\\t abs(t1) > \\\"1e12\\\" && (t1 = .5);\\n\\t abs(t2) > \\\"1e12\\\" && (t2 = .5);\\n\\t if (t1 > 0 && t1 < 1) {\\n\\t dot = findDotAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t1);\\n\\t x.push(dot.x);\\n\\t y.push(dot.y);\\n\\t }\\n\\t if (t2 > 0 && t2 < 1) {\\n\\t dot = findDotAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t2);\\n\\t x.push(dot.x);\\n\\t y.push(dot.y);\\n\\t }\\n\\t a = (c2y - 2 * c1y + p1y) - (p2y - 2 * c2y + c1y);\\n\\t b = 2 * (c1y - p1y) - 2 * (c2y - c1y);\\n\\t c = p1y - c1y;\\n\\t t1 = (-b + math.sqrt(b * b - 4 * a * c)) / 2 / a;\\n\\t t2 = (-b - math.sqrt(b * b - 4 * a * c)) / 2 / a;\\n\\t abs(t1) > \\\"1e12\\\" && (t1 = .5);\\n\\t abs(t2) > \\\"1e12\\\" && (t2 = .5);\\n\\t if (t1 > 0 && t1 < 1) {\\n\\t dot = findDotAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t1);\\n\\t x.push(dot.x);\\n\\t y.push(dot.y);\\n\\t }\\n\\t if (t2 > 0 && t2 < 1) {\\n\\t dot = findDotAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t2);\\n\\t x.push(dot.x);\\n\\t y.push(dot.y);\\n\\t }\\n\\t return {\\n\\t min: {x: mmin[apply](0, x), y: mmin[apply](0, y)},\\n\\t max: {x: mmax[apply](0, x), y: mmax[apply](0, y)}\\n\\t };\\n\\t }),\\n\\t path2curve = R._path2curve = cacher(function (path, path2) {\\n\\t var pth = !path2 && paths(path);\\n\\t if (!path2 && pth.curve) {\\n\\t return pathClone(pth.curve);\\n\\t }\\n\\t var p = pathToAbsolute(path),\\n\\t p2 = path2 && pathToAbsolute(path2),\\n\\t attrs = {x: 0, y: 0, bx: 0, by: 0, X: 0, Y: 0, qx: null, qy: null},\\n\\t attrs2 = {x: 0, y: 0, bx: 0, by: 0, X: 0, Y: 0, qx: null, qy: null},\\n\\t processPath = function (path, d, pcom) {\\n\\t var nx, ny, tq = {T:1, Q:1};\\n\\t if (!path) {\\n\\t return [\\\"C\\\", d.x, d.y, d.x, d.y, d.x, d.y];\\n\\t }\\n\\t !(path[0] in tq) && (d.qx = d.qy = null);\\n\\t switch (path[0]) {\\n\\t case \\\"M\\\":\\n\\t d.X = path[1];\\n\\t d.Y = path[2];\\n\\t break;\\n\\t case \\\"A\\\":\\n\\t path = [\\\"C\\\"][concat](a2c[apply](0, [d.x, d.y][concat](path.slice(1))));\\n\\t break;\\n\\t case \\\"S\\\":\\n\\t if (pcom == \\\"C\\\" || pcom == \\\"S\\\") { // In \\\"S\\\" case we have to take into account, if the previous command is C/S.\\n\\t nx = d.x * 2 - d.bx; // And reflect the previous\\n\\t ny = d.y * 2 - d.by; // command's control point relative to the current point.\\n\\t }\\n\\t else { // or some else or nothing\\n\\t nx = d.x;\\n\\t ny = d.y;\\n\\t }\\n\\t path = [\\\"C\\\", nx, ny][concat](path.slice(1));\\n\\t break;\\n\\t case \\\"T\\\":\\n\\t if (pcom == \\\"Q\\\" || pcom == \\\"T\\\") { // In \\\"T\\\" case we have to take into account, if the previous command is Q/T.\\n\\t d.qx = d.x * 2 - d.qx; // And make a reflection similar\\n\\t d.qy = d.y * 2 - d.qy; // to case \\\"S\\\".\\n\\t }\\n\\t else { // or something else or nothing\\n\\t d.qx = d.x;\\n\\t d.qy = d.y;\\n\\t }\\n\\t path = [\\\"C\\\"][concat](q2c(d.x, d.y, d.qx, d.qy, path[1], path[2]));\\n\\t break;\\n\\t case \\\"Q\\\":\\n\\t d.qx = path[1];\\n\\t d.qy = path[2];\\n\\t path = [\\\"C\\\"][concat](q2c(d.x, d.y, path[1], path[2], path[3], path[4]));\\n\\t break;\\n\\t case \\\"L\\\":\\n\\t path = [\\\"C\\\"][concat](l2c(d.x, d.y, path[1], path[2]));\\n\\t break;\\n\\t case \\\"H\\\":\\n\\t path = [\\\"C\\\"][concat](l2c(d.x, d.y, path[1], d.y));\\n\\t break;\\n\\t case \\\"V\\\":\\n\\t path = [\\\"C\\\"][concat](l2c(d.x, d.y, d.x, path[1]));\\n\\t break;\\n\\t case \\\"Z\\\":\\n\\t path = [\\\"C\\\"][concat](l2c(d.x, d.y, d.X, d.Y));\\n\\t break;\\n\\t }\\n\\t return path;\\n\\t },\\n\\t fixArc = function (pp, i) {\\n\\t if (pp[i].length > 7) {\\n\\t pp[i].shift();\\n\\t var pi = pp[i];\\n\\t while (pi.length) {\\n\\t pcoms1[i]=\\\"A\\\"; // if created multiple C:s, their original seg is saved\\n\\t p2 && (pcoms2[i]=\\\"A\\\"); // the same as above\\n\\t pp.splice(i++, 0, [\\\"C\\\"][concat](pi.splice(0, 6)));\\n\\t }\\n\\t pp.splice(i, 1);\\n\\t ii = mmax(p.length, p2 && p2.length || 0);\\n\\t }\\n\\t },\\n\\t fixM = function (path1, path2, a1, a2, i) {\\n\\t if (path1 && path2 && path1[i][0] == \\\"M\\\" && path2[i][0] != \\\"M\\\") {\\n\\t path2.splice(i, 0, [\\\"M\\\", a2.x, a2.y]);\\n\\t a1.bx = 0;\\n\\t a1.by = 0;\\n\\t a1.x = path1[i][1];\\n\\t a1.y = path1[i][2];\\n\\t ii = mmax(p.length, p2 && p2.length || 0);\\n\\t }\\n\\t },\\n\\t pcoms1 = [], // path commands of original path p\\n\\t pcoms2 = [], // path commands of original path p2\\n\\t pfirst = \\\"\\\", // temporary holder for original path command\\n\\t pcom = \\\"\\\"; // holder for previous path command of original path\\n\\t for (var i = 0, ii = mmax(p.length, p2 && p2.length || 0); i < ii; i++) {\\n\\t p[i] && (pfirst = p[i][0]); // save current path command\\n\\n\\t if (pfirst != \\\"C\\\") // C is not saved yet, because it may be result of conversion\\n\\t {\\n\\t pcoms1[i] = pfirst; // Save current path command\\n\\t i && ( pcom = pcoms1[i-1]); // Get previous path command pcom\\n\\t }\\n\\t p[i] = processPath(p[i], attrs, pcom); // Previous path command is inputted to processPath\\n\\n\\t if (pcoms1[i] != \\\"A\\\" && pfirst == \\\"C\\\") pcoms1[i] = \\\"C\\\"; // A is the only command\\n\\t // which may produce multiple C:s\\n\\t // so we have to make sure that C is also C in original path\\n\\n\\t fixArc(p, i); // fixArc adds also the right amount of A:s to pcoms1\\n\\n\\t if (p2) { // the same procedures is done to p2\\n\\t p2[i] && (pfirst = p2[i][0]);\\n\\t if (pfirst != \\\"C\\\")\\n\\t {\\n\\t pcoms2[i] = pfirst;\\n\\t i && (pcom = pcoms2[i-1]);\\n\\t }\\n\\t p2[i] = processPath(p2[i], attrs2, pcom);\\n\\n\\t if (pcoms2[i]!=\\\"A\\\" && pfirst==\\\"C\\\") pcoms2[i]=\\\"C\\\";\\n\\n\\t fixArc(p2, i);\\n\\t }\\n\\t fixM(p, p2, attrs, attrs2, i);\\n\\t fixM(p2, p, attrs2, attrs, i);\\n\\t var seg = p[i],\\n\\t seg2 = p2 && p2[i],\\n\\t seglen = seg.length,\\n\\t seg2len = p2 && seg2.length;\\n\\t attrs.x = seg[seglen - 2];\\n\\t attrs.y = seg[seglen - 1];\\n\\t attrs.bx = toFloat(seg[seglen - 4]) || attrs.x;\\n\\t attrs.by = toFloat(seg[seglen - 3]) || attrs.y;\\n\\t attrs2.bx = p2 && (toFloat(seg2[seg2len - 4]) || attrs2.x);\\n\\t attrs2.by = p2 && (toFloat(seg2[seg2len - 3]) || attrs2.y);\\n\\t attrs2.x = p2 && seg2[seg2len - 2];\\n\\t attrs2.y = p2 && seg2[seg2len - 1];\\n\\t }\\n\\t if (!p2) {\\n\\t pth.curve = pathClone(p);\\n\\t }\\n\\t return p2 ? [p, p2] : p;\\n\\t }, null, pathClone),\\n\\t parseDots = R._parseDots = cacher(function (gradient) {\\n\\t var dots = [];\\n\\t for (var i = 0, ii = gradient.length; i < ii; i++) {\\n\\t var dot = {},\\n\\t par = gradient[i].match(/^([^:]*):?([\\\\d\\\\.]*)/);\\n\\t dot.color = R.getRGB(par[1]);\\n\\t if (dot.color.error) {\\n\\t return null;\\n\\t }\\n\\t dot.opacity = dot.color.opacity;\\n\\t dot.color = dot.color.hex;\\n\\t par[2] && (dot.offset = par[2] + \\\"%\\\");\\n\\t dots.push(dot);\\n\\t }\\n\\t for (i = 1, ii = dots.length - 1; i < ii; i++) {\\n\\t if (!dots[i].offset) {\\n\\t var start = toFloat(dots[i - 1].offset || 0),\\n\\t end = 0;\\n\\t for (var j = i + 1; j < ii; j++) {\\n\\t if (dots[j].offset) {\\n\\t end = dots[j].offset;\\n\\t break;\\n\\t }\\n\\t }\\n\\t if (!end) {\\n\\t end = 100;\\n\\t j = ii;\\n\\t }\\n\\t end = toFloat(end);\\n\\t var d = (end - start) / (j - i + 1);\\n\\t for (; i < j; i++) {\\n\\t start += d;\\n\\t dots[i].offset = start + \\\"%\\\";\\n\\t }\\n\\t }\\n\\t }\\n\\t return dots;\\n\\t }),\\n\\t tear = R._tear = function (el, paper) {\\n\\t el == paper.top && (paper.top = el.prev);\\n\\t el == paper.bottom && (paper.bottom = el.next);\\n\\t el.next && (el.next.prev = el.prev);\\n\\t el.prev && (el.prev.next = el.next);\\n\\t },\\n\\t tofront = R._tofront = function (el, paper) {\\n\\t if (paper.top === el) {\\n\\t return;\\n\\t }\\n\\t tear(el, paper);\\n\\t el.next = null;\\n\\t el.prev = paper.top;\\n\\t paper.top.next = el;\\n\\t paper.top = el;\\n\\t },\\n\\t toback = R._toback = function (el, paper) {\\n\\t if (paper.bottom === el) {\\n\\t return;\\n\\t }\\n\\t tear(el, paper);\\n\\t el.next = paper.bottom;\\n\\t el.prev = null;\\n\\t paper.bottom.prev = el;\\n\\t paper.bottom = el;\\n\\t },\\n\\t insertafter = R._insertafter = function (el, el2, paper) {\\n\\t tear(el, paper);\\n\\t el2 == paper.top && (paper.top = el);\\n\\t el2.next && (el2.next.prev = el);\\n\\t el.next = el2.next;\\n\\t el.prev = el2;\\n\\t el2.next = el;\\n\\t },\\n\\t insertbefore = R._insertbefore = function (el, el2, paper) {\\n\\t tear(el, paper);\\n\\t el2 == paper.bottom && (paper.bottom = el);\\n\\t el2.prev && (el2.prev.next = el);\\n\\t el.prev = el2.prev;\\n\\t el2.prev = el;\\n\\t el.next = el2;\\n\\t },\\n\\t /*\\\\\\n\\t * Raphael.toMatrix\\n\\t [ method ]\\n\\t **\\n\\t * Utility method\\n\\t **\\n\\t * Returns matrix of transformations applied to a given path\\n\\t > Parameters\\n\\t - path (string) path string\\n\\t - transform (string|array) transformation string\\n\\t = (object) @Matrix\\n\\t \\\\*/\\n\\t toMatrix = R.toMatrix = function (path, transform) {\\n\\t var bb = pathDimensions(path),\\n\\t el = {\\n\\t _: {\\n\\t transform: E\\n\\t },\\n\\t getBBox: function () {\\n\\t return bb;\\n\\t }\\n\\t };\\n\\t extractTransform(el, transform);\\n\\t return el.matrix;\\n\\t },\\n\\t /*\\\\\\n\\t * Raphael.transformPath\\n\\t [ method ]\\n\\t **\\n\\t * Utility method\\n\\t **\\n\\t * Returns path transformed by a given transformation\\n\\t > Parameters\\n\\t - path (string) path string\\n\\t - transform (string|array) transformation string\\n\\t = (string) path\\n\\t \\\\*/\\n\\t transformPath = R.transformPath = function (path, transform) {\\n\\t return mapPath(path, toMatrix(path, transform));\\n\\t },\\n\\t extractTransform = R._extractTransform = function (el, tstr) {\\n\\t if (tstr == null) {\\n\\t return el._.transform;\\n\\t }\\n\\t tstr = Str(tstr).replace(/\\\\.{3}|\\\\u2026/g, el._.transform || E);\\n\\t var tdata = R.parseTransformString(tstr),\\n\\t deg = 0,\\n\\t dx = 0,\\n\\t dy = 0,\\n\\t sx = 1,\\n\\t sy = 1,\\n\\t _ = el._,\\n\\t m = new Matrix;\\n\\t _.transform = tdata || [];\\n\\t if (tdata) {\\n\\t for (var i = 0, ii = tdata.length; i < ii; i++) {\\n\\t var t = tdata[i],\\n\\t tlen = t.length,\\n\\t command = Str(t[0]).toLowerCase(),\\n\\t absolute = t[0] != command,\\n\\t inver = absolute ? m.invert() : 0,\\n\\t x1,\\n\\t y1,\\n\\t x2,\\n\\t y2,\\n\\t bb;\\n\\t if (command == \\\"t\\\" && tlen == 3) {\\n\\t if (absolute) {\\n\\t x1 = inver.x(0, 0);\\n\\t y1 = inver.y(0, 0);\\n\\t x2 = inver.x(t[1], t[2]);\\n\\t y2 = inver.y(t[1], t[2]);\\n\\t m.translate(x2 - x1, y2 - y1);\\n\\t } else {\\n\\t m.translate(t[1], t[2]);\\n\\t }\\n\\t } else if (command == \\\"r\\\") {\\n\\t if (tlen == 2) {\\n\\t bb = bb || el.getBBox(1);\\n\\t m.rotate(t[1], bb.x + bb.width / 2, bb.y + bb.height / 2);\\n\\t deg += t[1];\\n\\t } else if (tlen == 4) {\\n\\t if (absolute) {\\n\\t x2 = inver.x(t[2], t[3]);\\n\\t y2 = inver.y(t[2], t[3]);\\n\\t m.rotate(t[1], x2, y2);\\n\\t } else {\\n\\t m.rotate(t[1], t[2], t[3]);\\n\\t }\\n\\t deg += t[1];\\n\\t }\\n\\t } else if (command == \\\"s\\\") {\\n\\t if (tlen == 2 || tlen == 3) {\\n\\t bb = bb || el.getBBox(1);\\n\\t m.scale(t[1], t[tlen - 1], bb.x + bb.width / 2, bb.y + bb.height / 2);\\n\\t sx *= t[1];\\n\\t sy *= t[tlen - 1];\\n\\t } else if (tlen == 5) {\\n\\t if (absolute) {\\n\\t x2 = inver.x(t[3], t[4]);\\n\\t y2 = inver.y(t[3], t[4]);\\n\\t m.scale(t[1], t[2], x2, y2);\\n\\t } else {\\n\\t m.scale(t[1], t[2], t[3], t[4]);\\n\\t }\\n\\t sx *= t[1];\\n\\t sy *= t[2];\\n\\t }\\n\\t } else if (command == \\\"m\\\" && tlen == 7) {\\n\\t m.add(t[1], t[2], t[3], t[4], t[5], t[6]);\\n\\t }\\n\\t _.dirtyT = 1;\\n\\t el.matrix = m;\\n\\t }\\n\\t }\\n\\n\\t /*\\\\\\n\\t * Element.matrix\\n\\t [ property (object) ]\\n\\t **\\n\\t * Keeps @Matrix object, which represents element transformation\\n\\t \\\\*/\\n\\t el.matrix = m;\\n\\n\\t _.sx = sx;\\n\\t _.sy = sy;\\n\\t _.deg = deg;\\n\\t _.dx = dx = m.e;\\n\\t _.dy = dy = m.f;\\n\\n\\t if (sx == 1 && sy == 1 && !deg && _.bbox) {\\n\\t _.bbox.x += +dx;\\n\\t _.bbox.y += +dy;\\n\\t } else {\\n\\t _.dirtyT = 1;\\n\\t }\\n\\t },\\n\\t getEmpty = function (item) {\\n\\t var l = item[0];\\n\\t switch (l.toLowerCase()) {\\n\\t case \\\"t\\\": return [l, 0, 0];\\n\\t case \\\"m\\\": return [l, 1, 0, 0, 1, 0, 0];\\n\\t case \\\"r\\\": if (item.length == 4) {\\n\\t return [l, 0, item[2], item[3]];\\n\\t } else {\\n\\t return [l, 0];\\n\\t }\\n\\t case \\\"s\\\": if (item.length == 5) {\\n\\t return [l, 1, 1, item[3], item[4]];\\n\\t } else if (item.length == 3) {\\n\\t return [l, 1, 1];\\n\\t } else {\\n\\t return [l, 1];\\n\\t }\\n\\t }\\n\\t },\\n\\t equaliseTransform = R._equaliseTransform = function (t1, t2) {\\n\\t t2 = Str(t2).replace(/\\\\.{3}|\\\\u2026/g, t1);\\n\\t t1 = R.parseTransformString(t1) || [];\\n\\t t2 = R.parseTransformString(t2) || [];\\n\\t var maxlength = mmax(t1.length, t2.length),\\n\\t from = [],\\n\\t to = [],\\n\\t i = 0, j, jj,\\n\\t tt1, tt2;\\n\\t for (; i < maxlength; i++) {\\n\\t tt1 = t1[i] || getEmpty(t2[i]);\\n\\t tt2 = t2[i] || getEmpty(tt1);\\n\\t if ((tt1[0] != tt2[0]) ||\\n\\t (tt1[0].toLowerCase() == \\\"r\\\" && (tt1[2] != tt2[2] || tt1[3] != tt2[3])) ||\\n\\t (tt1[0].toLowerCase() == \\\"s\\\" && (tt1[3] != tt2[3] || tt1[4] != tt2[4]))\\n\\t ) {\\n\\t return;\\n\\t }\\n\\t from[i] = [];\\n\\t to[i] = [];\\n\\t for (j = 0, jj = mmax(tt1.length, tt2.length); j < jj; j++) {\\n\\t j in tt1 && (from[i][j] = tt1[j]);\\n\\t j in tt2 && (to[i][j] = tt2[j]);\\n\\t }\\n\\t }\\n\\t return {\\n\\t from: from,\\n\\t to: to\\n\\t };\\n\\t };\\n\\t R._getContainer = function (x, y, w, h) {\\n\\t var container;\\n\\t container = h == null && !R.is(x, \\\"object\\\") ? g.doc.getElementById(x) : x;\\n\\t if (container == null) {\\n\\t return;\\n\\t }\\n\\t if (container.tagName) {\\n\\t if (y == null) {\\n\\t return {\\n\\t container: container,\\n\\t width: container.style.pixelWidth || container.offsetWidth,\\n\\t height: container.style.pixelHeight || container.offsetHeight\\n\\t };\\n\\t } else {\\n\\t return {\\n\\t container: container,\\n\\t width: y,\\n\\t height: w\\n\\t };\\n\\t }\\n\\t }\\n\\t return {\\n\\t container: 1,\\n\\t x: x,\\n\\t y: y,\\n\\t width: w,\\n\\t height: h\\n\\t };\\n\\t };\\n\\t /*\\\\\\n\\t * Raphael.pathToRelative\\n\\t [ method ]\\n\\t **\\n\\t * Utility method\\n\\t **\\n\\t * Converts path to relative form\\n\\t > Parameters\\n\\t - pathString (string|array) path string or array of segments\\n\\t = (array) array of segments.\\n\\t \\\\*/\\n\\t R.pathToRelative = pathToRelative;\\n\\t R._engine = {};\\n\\t /*\\\\\\n\\t * Raphael.path2curve\\n\\t [ method ]\\n\\t **\\n\\t * Utility method\\n\\t **\\n\\t * Converts path to a new path where all segments are cubic bezier curves.\\n\\t > Parameters\\n\\t - pathString (string|array) path string or array of segments\\n\\t = (array) array of segments.\\n\\t \\\\*/\\n\\t R.path2curve = path2curve;\\n\\t /*\\\\\\n\\t * Raphael.matrix\\n\\t [ method ]\\n\\t **\\n\\t * Utility method\\n\\t **\\n\\t * Returns matrix based on given parameters.\\n\\t > Parameters\\n\\t - a (number)\\n\\t - b (number)\\n\\t - c (number)\\n\\t - d (number)\\n\\t - e (number)\\n\\t - f (number)\\n\\t = (object) @Matrix\\n\\t \\\\*/\\n\\t R.matrix = function (a, b, c, d, e, f) {\\n\\t return new Matrix(a, b, c, d, e, f);\\n\\t };\\n\\t function Matrix(a, b, c, d, e, f) {\\n\\t if (a != null) {\\n\\t this.a = +a;\\n\\t this.b = +b;\\n\\t this.c = +c;\\n\\t this.d = +d;\\n\\t this.e = +e;\\n\\t this.f = +f;\\n\\t } else {\\n\\t this.a = 1;\\n\\t this.b = 0;\\n\\t this.c = 0;\\n\\t this.d = 1;\\n\\t this.e = 0;\\n\\t this.f = 0;\\n\\t }\\n\\t }\\n\\t (function (matrixproto) {\\n\\t /*\\\\\\n\\t * Matrix.add\\n\\t [ method ]\\n\\t **\\n\\t * Adds given matrix to existing one.\\n\\t > Parameters\\n\\t - a (number)\\n\\t - b (number)\\n\\t - c (number)\\n\\t - d (number)\\n\\t - e (number)\\n\\t - f (number)\\n\\t or\\n\\t - matrix (object) @Matrix\\n\\t \\\\*/\\n\\t matrixproto.add = function (a, b, c, d, e, f) {\\n\\t var out = [[], [], []],\\n\\t m = [[this.a, this.c, this.e], [this.b, this.d, this.f], [0, 0, 1]],\\n\\t matrix = [[a, c, e], [b, d, f], [0, 0, 1]],\\n\\t x, y, z, res;\\n\\n\\t if (a && a instanceof Matrix) {\\n\\t matrix = [[a.a, a.c, a.e], [a.b, a.d, a.f], [0, 0, 1]];\\n\\t }\\n\\n\\t for (x = 0; x < 3; x++) {\\n\\t for (y = 0; y < 3; y++) {\\n\\t res = 0;\\n\\t for (z = 0; z < 3; z++) {\\n\\t res += m[x][z] * matrix[z][y];\\n\\t }\\n\\t out[x][y] = res;\\n\\t }\\n\\t }\\n\\t this.a = out[0][0];\\n\\t this.b = out[1][0];\\n\\t this.c = out[0][1];\\n\\t this.d = out[1][1];\\n\\t this.e = out[0][2];\\n\\t this.f = out[1][2];\\n\\t };\\n\\t /*\\\\\\n\\t * Matrix.invert\\n\\t [ method ]\\n\\t **\\n\\t * Returns inverted version of the matrix\\n\\t = (object) @Matrix\\n\\t \\\\*/\\n\\t matrixproto.invert = function () {\\n\\t var me = this,\\n\\t x = me.a * me.d - me.b * me.c;\\n\\t return new Matrix(me.d / x, -me.b / x, -me.c / x, me.a / x, (me.c * me.f - me.d * me.e) / x, (me.b * me.e - me.a * me.f) / x);\\n\\t };\\n\\t /*\\\\\\n\\t * Matrix.clone\\n\\t [ method ]\\n\\t **\\n\\t * Returns copy of the matrix\\n\\t = (object) @Matrix\\n\\t \\\\*/\\n\\t matrixproto.clone = function () {\\n\\t return new Matrix(this.a, this.b, this.c, this.d, this.e, this.f);\\n\\t };\\n\\t /*\\\\\\n\\t * Matrix.translate\\n\\t [ method ]\\n\\t **\\n\\t * Translate the matrix\\n\\t > Parameters\\n\\t - x (number)\\n\\t - y (number)\\n\\t \\\\*/\\n\\t matrixproto.translate = function (x, y) {\\n\\t this.add(1, 0, 0, 1, x, y);\\n\\t };\\n\\t /*\\\\\\n\\t * Matrix.scale\\n\\t [ method ]\\n\\t **\\n\\t * Scales the matrix\\n\\t > Parameters\\n\\t - x (number)\\n\\t - y (number) #optional\\n\\t - cx (number) #optional\\n\\t - cy (number) #optional\\n\\t \\\\*/\\n\\t matrixproto.scale = function (x, y, cx, cy) {\\n\\t y == null && (y = x);\\n\\t (cx || cy) && this.add(1, 0, 0, 1, cx, cy);\\n\\t this.add(x, 0, 0, y, 0, 0);\\n\\t (cx || cy) && this.add(1, 0, 0, 1, -cx, -cy);\\n\\t };\\n\\t /*\\\\\\n\\t * Matrix.rotate\\n\\t [ method ]\\n\\t **\\n\\t * Rotates the matrix\\n\\t > Parameters\\n\\t - a (number)\\n\\t - x (number)\\n\\t - y (number)\\n\\t \\\\*/\\n\\t matrixproto.rotate = function (a, x, y) {\\n\\t a = R.rad(a);\\n\\t x = x || 0;\\n\\t y = y || 0;\\n\\t var cos = +math.cos(a).toFixed(9),\\n\\t sin = +math.sin(a).toFixed(9);\\n\\t this.add(cos, sin, -sin, cos, x, y);\\n\\t this.add(1, 0, 0, 1, -x, -y);\\n\\t };\\n\\t /*\\\\\\n\\t * Matrix.x\\n\\t [ method ]\\n\\t **\\n\\t * Return x coordinate for given point after transformation described by the matrix. See also @Matrix.y\\n\\t > Parameters\\n\\t - x (number)\\n\\t - y (number)\\n\\t = (number) x\\n\\t \\\\*/\\n\\t matrixproto.x = function (x, y) {\\n\\t return x * this.a + y * this.c + this.e;\\n\\t };\\n\\t /*\\\\\\n\\t * Matrix.y\\n\\t [ method ]\\n\\t **\\n\\t * Return y coordinate for given point after transformation described by the matrix. See also @Matrix.x\\n\\t > Parameters\\n\\t - x (number)\\n\\t - y (number)\\n\\t = (number) y\\n\\t \\\\*/\\n\\t matrixproto.y = function (x, y) {\\n\\t return x * this.b + y * this.d + this.f;\\n\\t };\\n\\t matrixproto.get = function (i) {\\n\\t return +this[Str.fromCharCode(97 + i)].toFixed(4);\\n\\t };\\n\\t matrixproto.toString = function () {\\n\\t return R.svg ?\\n\\t \\\"matrix(\\\" + [this.get(0), this.get(1), this.get(2), this.get(3), this.get(4), this.get(5)].join() + \\\")\\\" :\\n\\t [this.get(0), this.get(2), this.get(1), this.get(3), 0, 0].join();\\n\\t };\\n\\t matrixproto.toFilter = function () {\\n\\t return \\\"progid:DXImageTransform.Microsoft.Matrix(M11=\\\" + this.get(0) +\\n\\t \\\", M12=\\\" + this.get(2) + \\\", M21=\\\" + this.get(1) + \\\", M22=\\\" + this.get(3) +\\n\\t \\\", Dx=\\\" + this.get(4) + \\\", Dy=\\\" + this.get(5) + \\\", sizingmethod='auto expand')\\\";\\n\\t };\\n\\t matrixproto.offset = function () {\\n\\t return [this.e.toFixed(4), this.f.toFixed(4)];\\n\\t };\\n\\t function norm(a) {\\n\\t return a[0] * a[0] + a[1] * a[1];\\n\\t }\\n\\t function normalize(a) {\\n\\t var mag = math.sqrt(norm(a));\\n\\t a[0] && (a[0] /= mag);\\n\\t a[1] && (a[1] /= mag);\\n\\t }\\n\\t /*\\\\\\n\\t * Matrix.split\\n\\t [ method ]\\n\\t **\\n\\t * Splits matrix into primitive transformations\\n\\t = (object) in format:\\n\\t o dx (number) translation by x\\n\\t o dy (number) translation by y\\n\\t o scalex (number) scale by x\\n\\t o scaley (number) scale by y\\n\\t o shear (number) shear\\n\\t o rotate (number) rotation in deg\\n\\t o isSimple (boolean) could it be represented via simple transformations\\n\\t \\\\*/\\n\\t matrixproto.split = function () {\\n\\t var out = {};\\n\\t // translation\\n\\t out.dx = this.e;\\n\\t out.dy = this.f;\\n\\n\\t // scale and shear\\n\\t var row = [[this.a, this.c], [this.b, this.d]];\\n\\t out.scalex = math.sqrt(norm(row[0]));\\n\\t normalize(row[0]);\\n\\n\\t out.shear = row[0][0] * row[1][0] + row[0][1] * row[1][1];\\n\\t row[1] = [row[1][0] - row[0][0] * out.shear, row[1][1] - row[0][1] * out.shear];\\n\\n\\t out.scaley = math.sqrt(norm(row[1]));\\n\\t normalize(row[1]);\\n\\t out.shear /= out.scaley;\\n\\n\\t // rotation\\n\\t var sin = -row[0][1],\\n\\t cos = row[1][1];\\n\\t if (cos < 0) {\\n\\t out.rotate = R.deg(math.acos(cos));\\n\\t if (sin < 0) {\\n\\t out.rotate = 360 - out.rotate;\\n\\t }\\n\\t } else {\\n\\t out.rotate = R.deg(math.asin(sin));\\n\\t }\\n\\n\\t out.isSimple = !+out.shear.toFixed(9) && (out.scalex.toFixed(9) == out.scaley.toFixed(9) || !out.rotate);\\n\\t out.isSuperSimple = !+out.shear.toFixed(9) && out.scalex.toFixed(9) == out.scaley.toFixed(9) && !out.rotate;\\n\\t out.noRotation = !+out.shear.toFixed(9) && !out.rotate;\\n\\t return out;\\n\\t };\\n\\t /*\\\\\\n\\t * Matrix.toTransformString\\n\\t [ method ]\\n\\t **\\n\\t * Return transform string that represents given matrix\\n\\t = (string) transform string\\n\\t \\\\*/\\n\\t matrixproto.toTransformString = function (shorter) {\\n\\t var s = shorter || this[split]();\\n\\t if (s.isSimple) {\\n\\t s.scalex = +s.scalex.toFixed(4);\\n\\t s.scaley = +s.scaley.toFixed(4);\\n\\t s.rotate = +s.rotate.toFixed(4);\\n\\t return (s.dx || s.dy ? \\\"t\\\" + [s.dx, s.dy] : E) +\\n\\t (s.scalex != 1 || s.scaley != 1 ? \\\"s\\\" + [s.scalex, s.scaley, 0, 0] : E) +\\n\\t (s.rotate ? \\\"r\\\" + [s.rotate, 0, 0] : E);\\n\\t } else {\\n\\t return \\\"m\\\" + [this.get(0), this.get(1), this.get(2), this.get(3), this.get(4), this.get(5)];\\n\\t }\\n\\t };\\n\\t })(Matrix.prototype);\\n\\n\\t var preventDefault = function () {\\n\\t this.returnValue = false;\\n\\t },\\n\\t preventTouch = function () {\\n\\t return this.originalEvent.preventDefault();\\n\\t },\\n\\t stopPropagation = function () {\\n\\t this.cancelBubble = true;\\n\\t },\\n\\t stopTouch = function () {\\n\\t return this.originalEvent.stopPropagation();\\n\\t },\\n\\t getEventPosition = function (e) {\\n\\t var scrollY = g.doc.documentElement.scrollTop || g.doc.body.scrollTop,\\n\\t scrollX = g.doc.documentElement.scrollLeft || g.doc.body.scrollLeft;\\n\\n\\t return {\\n\\t x: e.clientX + scrollX,\\n\\t y: e.clientY + scrollY\\n\\t };\\n\\t },\\n\\t addEvent = (function () {\\n\\t if (g.doc.addEventListener) {\\n\\t return function (obj, type, fn, element) {\\n\\t var f = function (e) {\\n\\t var pos = getEventPosition(e);\\n\\t return fn.call(element, e, pos.x, pos.y);\\n\\t };\\n\\t obj.addEventListener(type, f, false);\\n\\n\\t if (supportsTouch && touchMap[type]) {\\n\\t var _f = function (e) {\\n\\t var pos = getEventPosition(e),\\n\\t olde = e;\\n\\n\\t for (var i = 0, ii = e.targetTouches && e.targetTouches.length; i < ii; i++) {\\n\\t if (e.targetTouches[i].target == obj) {\\n\\t e = e.targetTouches[i];\\n\\t e.originalEvent = olde;\\n\\t e.preventDefault = preventTouch;\\n\\t e.stopPropagation = stopTouch;\\n\\t break;\\n\\t }\\n\\t }\\n\\n\\t return fn.call(element, e, pos.x, pos.y);\\n\\t };\\n\\t obj.addEventListener(touchMap[type], _f, false);\\n\\t }\\n\\n\\t return function () {\\n\\t obj.removeEventListener(type, f, false);\\n\\n\\t if (supportsTouch && touchMap[type])\\n\\t obj.removeEventListener(touchMap[type], _f, false);\\n\\n\\t return true;\\n\\t };\\n\\t };\\n\\t } else if (g.doc.attachEvent) {\\n\\t return function (obj, type, fn, element) {\\n\\t var f = function (e) {\\n\\t e = e || g.win.event;\\n\\t var scrollY = g.doc.documentElement.scrollTop || g.doc.body.scrollTop,\\n\\t scrollX = g.doc.documentElement.scrollLeft || g.doc.body.scrollLeft,\\n\\t x = e.clientX + scrollX,\\n\\t y = e.clientY + scrollY;\\n\\t e.preventDefault = e.preventDefault || preventDefault;\\n\\t e.stopPropagation = e.stopPropagation || stopPropagation;\\n\\t return fn.call(element, e, x, y);\\n\\t };\\n\\t obj.attachEvent(\\\"on\\\" + type, f);\\n\\t var detacher = function () {\\n\\t obj.detachEvent(\\\"on\\\" + type, f);\\n\\t return true;\\n\\t };\\n\\t return detacher;\\n\\t };\\n\\t }\\n\\t })(),\\n\\t drag = [],\\n\\t dragMove = function (e) {\\n\\t var x = e.clientX,\\n\\t y = e.clientY,\\n\\t scrollY = g.doc.documentElement.scrollTop || g.doc.body.scrollTop,\\n\\t scrollX = g.doc.documentElement.scrollLeft || g.doc.body.scrollLeft,\\n\\t dragi,\\n\\t j = drag.length;\\n\\t while (j--) {\\n\\t dragi = drag[j];\\n\\t if (supportsTouch && e.touches) {\\n\\t var i = e.touches.length,\\n\\t touch;\\n\\t while (i--) {\\n\\t touch = e.touches[i];\\n\\t if (touch.identifier == dragi.el._drag.id) {\\n\\t x = touch.clientX;\\n\\t y = touch.clientY;\\n\\t (e.originalEvent ? e.originalEvent : e).preventDefault();\\n\\t break;\\n\\t }\\n\\t }\\n\\t } else {\\n\\t e.preventDefault();\\n\\t }\\n\\t var node = dragi.el.node,\\n\\t o,\\n\\t next = node.nextSibling,\\n\\t parent = node.parentNode,\\n\\t display = node.style.display;\\n\\t g.win.opera && parent.removeChild(node);\\n\\t node.style.display = \\\"none\\\";\\n\\t o = dragi.el.paper.getElementByPoint(x, y);\\n\\t node.style.display = display;\\n\\t g.win.opera && (next ? parent.insertBefore(node, next) : parent.appendChild(node));\\n\\t o && eve(\\\"raphael.drag.over.\\\" + dragi.el.id, dragi.el, o);\\n\\t x += scrollX;\\n\\t y += scrollY;\\n\\t eve(\\\"raphael.drag.move.\\\" + dragi.el.id, dragi.move_scope || dragi.el, x - dragi.el._drag.x, y - dragi.el._drag.y, x, y, e);\\n\\t }\\n\\t },\\n\\t dragUp = function (e) {\\n\\t R.unmousemove(dragMove).unmouseup(dragUp);\\n\\t var i = drag.length,\\n\\t dragi;\\n\\t while (i--) {\\n\\t dragi = drag[i];\\n\\t dragi.el._drag = {};\\n\\t eve(\\\"raphael.drag.end.\\\" + dragi.el.id, dragi.end_scope || dragi.start_scope || dragi.move_scope || dragi.el, e);\\n\\t }\\n\\t drag = [];\\n\\t },\\n\\t /*\\\\\\n\\t * Raphael.el\\n\\t [ property (object) ]\\n\\t **\\n\\t * You can add your own method to elements. This is useful when you want to hack default functionality or\\n\\t * want to wrap some common transformation or attributes in one method. In difference to canvas methods,\\n\\t * you can redefine element method at any time. Expending element methods wouldn’t affect set.\\n\\t > Usage\\n\\t | Raphael.el.red = function () {\\n\\t | this.attr({fill: \\\"#f00\\\"});\\n\\t | };\\n\\t | // then use it\\n\\t | paper.circle(100, 100, 20).red();\\n\\t \\\\*/\\n\\t elproto = R.el = {};\\n\\t /*\\\\\\n\\t * Element.click\\n\\t [ method ]\\n\\t **\\n\\t * Adds event handler for click for the element.\\n\\t > Parameters\\n\\t - handler (function) handler for the event\\n\\t = (object) @Element\\n\\t \\\\*/\\n\\t /*\\\\\\n\\t * Element.unclick\\n\\t [ method ]\\n\\t **\\n\\t * Removes event handler for click for the element.\\n\\t > Parameters\\n\\t - handler (function) #optional handler for the event\\n\\t = (object) @Element\\n\\t \\\\*/\\n\\n\\t /*\\\\\\n\\t * Element.dblclick\\n\\t [ method ]\\n\\t **\\n\\t * Adds event handler for double click for the element.\\n\\t > Parameters\\n\\t - handler (function) handler for the event\\n\\t = (object) @Element\\n\\t \\\\*/\\n\\t /*\\\\\\n\\t * Element.undblclick\\n\\t [ method ]\\n\\t **\\n\\t * Removes event handler for double click for the element.\\n\\t > Parameters\\n\\t - handler (function) #optional handler for the event\\n\\t = (object) @Element\\n\\t \\\\*/\\n\\n\\t /*\\\\\\n\\t * Element.mousedown\\n\\t [ method ]\\n\\t **\\n\\t * Adds event handler for mousedown for the element.\\n\\t > Parameters\\n\\t - handler (function) handler for the event\\n\\t = (object) @Element\\n\\t \\\\*/\\n\\t /*\\\\\\n\\t * Element.unmousedown\\n\\t [ method ]\\n\\t **\\n\\t * Removes event handler for mousedown for the element.\\n\\t > Parameters\\n\\t - handler (function) #optional handler for the event\\n\\t = (object) @Element\\n\\t \\\\*/\\n\\n\\t /*\\\\\\n\\t * Element.mousemove\\n\\t [ method ]\\n\\t **\\n\\t * Adds event handler for mousemove for the element.\\n\\t > Parameters\\n\\t - handler (function) handler for the event\\n\\t = (object) @Element\\n\\t \\\\*/\\n\\t /*\\\\\\n\\t * Element.unmousemove\\n\\t [ method ]\\n\\t **\\n\\t * Removes event handler for mousemove for the element.\\n\\t > Parameters\\n\\t - handler (function) #optional handler for the event\\n\\t = (object) @Element\\n\\t \\\\*/\\n\\n\\t /*\\\\\\n\\t * Element.mouseout\\n\\t [ method ]\\n\\t **\\n\\t * Adds event handler for mouseout for the element.\\n\\t > Parameters\\n\\t - handler (function) handler for the event\\n\\t = (object) @Element\\n\\t \\\\*/\\n\\t /*\\\\\\n\\t * Element.unmouseout\\n\\t [ method ]\\n\\t **\\n\\t * Removes event handler for mouseout for the element.\\n\\t > Parameters\\n\\t - handler (function) #optional handler for the event\\n\\t = (object) @Element\\n\\t \\\\*/\\n\\n\\t /*\\\\\\n\\t * Element.mouseover\\n\\t [ method ]\\n\\t **\\n\\t * Adds event handler for mouseover for the element.\\n\\t > Parameters\\n\\t - handler (function) handler for the event\\n\\t = (object) @Element\\n\\t \\\\*/\\n\\t /*\\\\\\n\\t * Element.unmouseover\\n\\t [ method ]\\n\\t **\\n\\t * Removes event handler for mouseover for the element.\\n\\t > Parameters\\n\\t - handler (function) #optional handler for the event\\n\\t = (object) @Element\\n\\t \\\\*/\\n\\n\\t /*\\\\\\n\\t * Element.mouseup\\n\\t [ method ]\\n\\t **\\n\\t * Adds event handler for mouseup for the element.\\n\\t > Parameters\\n\\t - handler (function) handler for the event\\n\\t = (object) @Element\\n\\t \\\\*/\\n\\t /*\\\\\\n\\t * Element.unmouseup\\n\\t [ method ]\\n\\t **\\n\\t * Removes event handler for mouseup for the element.\\n\\t > Parameters\\n\\t - handler (function) #optional handler for the event\\n\\t = (object) @Element\\n\\t \\\\*/\\n\\n\\t /*\\\\\\n\\t * Element.touchstart\\n\\t [ method ]\\n\\t **\\n\\t * Adds event handler for touchstart for the element.\\n\\t > Parameters\\n\\t - handler (function) handler for the event\\n\\t = (object) @Element\\n\\t \\\\*/\\n\\t /*\\\\\\n\\t * Element.untouchstart\\n\\t [ method ]\\n\\t **\\n\\t * Removes event handler for touchstart for the element.\\n\\t > Parameters\\n\\t - handler (function) #optional handler for the event\\n\\t = (object) @Element\\n\\t \\\\*/\\n\\n\\t /*\\\\\\n\\t * Element.touchmove\\n\\t [ method ]\\n\\t **\\n\\t * Adds event handler for touchmove for the element.\\n\\t > Parameters\\n\\t - handler (function) handler for the event\\n\\t = (object) @Element\\n\\t \\\\*/\\n\\t /*\\\\\\n\\t * Element.untouchmove\\n\\t [ method ]\\n\\t **\\n\\t * Removes event handler for touchmove for the element.\\n\\t > Parameters\\n\\t - handler (function) #optional handler for the event\\n\\t = (object) @Element\\n\\t \\\\*/\\n\\n\\t /*\\\\\\n\\t * Element.touchend\\n\\t [ method ]\\n\\t **\\n\\t * Adds event handler for touchend for the element.\\n\\t > Parameters\\n\\t - handler (function) handler for the event\\n\\t = (object) @Element\\n\\t \\\\*/\\n\\t /*\\\\\\n\\t * Element.untouchend\\n\\t [ method ]\\n\\t **\\n\\t * Removes event handler for touchend for the element.\\n\\t > Parameters\\n\\t - handler (function) #optional handler for the event\\n\\t = (object) @Element\\n\\t \\\\*/\\n\\n\\t /*\\\\\\n\\t * Element.touchcancel\\n\\t [ method ]\\n\\t **\\n\\t * Adds event handler for touchcancel for the element.\\n\\t > Parameters\\n\\t - handler (function) handler for the event\\n\\t = (object) @Element\\n\\t \\\\*/\\n\\t /*\\\\\\n\\t * Element.untouchcancel\\n\\t [ method ]\\n\\t **\\n\\t * Removes event handler for touchcancel for the element.\\n\\t > Parameters\\n\\t - handler (function) #optional handler for the event\\n\\t = (object) @Element\\n\\t \\\\*/\\n\\t for (var i = events.length; i--;) {\\n\\t (function (eventName) {\\n\\t R[eventName] = elproto[eventName] = function (fn, scope) {\\n\\t if (R.is(fn, \\\"function\\\")) {\\n\\t this.events = this.events || [];\\n\\t this.events.push({name: eventName, f: fn, unbind: addEvent(this.shape || this.node || g.doc, eventName, fn, scope || this)});\\n\\t }\\n\\t return this;\\n\\t };\\n\\t R[\\\"un\\\" + eventName] = elproto[\\\"un\\\" + eventName] = function (fn) {\\n\\t var events = this.events || [],\\n\\t l = events.length;\\n\\t while (l--){\\n\\t if (events[l].name == eventName && (R.is(fn, \\\"undefined\\\") || events[l].f == fn)) {\\n\\t events[l].unbind();\\n\\t events.splice(l, 1);\\n\\t !events.length && delete this.events;\\n\\t }\\n\\t }\\n\\t return this;\\n\\t };\\n\\t })(events[i]);\\n\\t }\\n\\n\\t /*\\\\\\n\\t * Element.data\\n\\t [ method ]\\n\\t **\\n\\t * Adds or retrieves given value associated with given key.\\n\\t **\\n\\t * See also @Element.removeData\\n\\t > Parameters\\n\\t - key (string) key to store data\\n\\t - value (any) #optional value to store\\n\\t = (object) @Element\\n\\t * or, if value is not specified:\\n\\t = (any) value\\n\\t * or, if key and value are not specified:\\n\\t = (object) Key/value pairs for all the data associated with the element.\\n\\t > Usage\\n\\t | for (var i = 0, i < 5, i++) {\\n\\t | paper.circle(10 + 15 * i, 10, 10)\\n\\t | .attr({fill: \\\"#000\\\"})\\n\\t | .data(\\\"i\\\", i)\\n\\t | .click(function () {\\n\\t | alert(this.data(\\\"i\\\"));\\n\\t | });\\n\\t | }\\n\\t \\\\*/\\n\\t elproto.data = function (key, value) {\\n\\t var data = eldata[this.id] = eldata[this.id] || {};\\n\\t if (arguments.length == 0) {\\n\\t return data;\\n\\t }\\n\\t if (arguments.length == 1) {\\n\\t if (R.is(key, \\\"object\\\")) {\\n\\t for (var i in key) if (key[has](i)) {\\n\\t this.data(i, key[i]);\\n\\t }\\n\\t return this;\\n\\t }\\n\\t eve(\\\"raphael.data.get.\\\" + this.id, this, data[key], key);\\n\\t return data[key];\\n\\t }\\n\\t data[key] = value;\\n\\t eve(\\\"raphael.data.set.\\\" + this.id, this, value, key);\\n\\t return this;\\n\\t };\\n\\t /*\\\\\\n\\t * Element.removeData\\n\\t [ method ]\\n\\t **\\n\\t * Removes value associated with an element by given key.\\n\\t * If key is not provided, removes all the data of the element.\\n\\t > Parameters\\n\\t - key (string) #optional key\\n\\t = (object) @Element\\n\\t \\\\*/\\n\\t elproto.removeData = function (key) {\\n\\t if (key == null) {\\n\\t eldata[this.id] = {};\\n\\t } else {\\n\\t eldata[this.id] && delete eldata[this.id][key];\\n\\t }\\n\\t return this;\\n\\t };\\n\\t /*\\\\\\n\\t * Element.getData\\n\\t [ method ]\\n\\t **\\n\\t * Retrieves the element data\\n\\t = (object) data\\n\\t \\\\*/\\n\\t elproto.getData = function () {\\n\\t return clone(eldata[this.id] || {});\\n\\t };\\n\\t /*\\\\\\n\\t * Element.hover\\n\\t [ method ]\\n\\t **\\n\\t * Adds event handlers for hover for the element.\\n\\t > Parameters\\n\\t - f_in (function) handler for hover in\\n\\t - f_out (function) handler for hover out\\n\\t - icontext (object) #optional context for hover in handler\\n\\t - ocontext (object) #optional context for hover out handler\\n\\t = (object) @Element\\n\\t \\\\*/\\n\\t elproto.hover = function (f_in, f_out, scope_in, scope_out) {\\n\\t return this.mouseover(f_in, scope_in).mouseout(f_out, scope_out || scope_in);\\n\\t };\\n\\t /*\\\\\\n\\t * Element.unhover\\n\\t [ method ]\\n\\t **\\n\\t * Removes event handlers for hover for the element.\\n\\t > Parameters\\n\\t - f_in (function) handler for hover in\\n\\t - f_out (function) handler for hover out\\n\\t = (object) @Element\\n\\t \\\\*/\\n\\t elproto.unhover = function (f_in, f_out) {\\n\\t return this.unmouseover(f_in).unmouseout(f_out);\\n\\t };\\n\\t var draggable = [];\\n\\t /*\\\\\\n\\t * Element.drag\\n\\t [ method ]\\n\\t **\\n\\t * Adds event handlers for drag of the element.\\n\\t > Parameters\\n\\t - onmove (function) handler for moving\\n\\t - onstart (function) handler for drag start\\n\\t - onend (function) handler for drag end\\n\\t - mcontext (object) #optional context for moving handler\\n\\t - scontext (object) #optional context for drag start handler\\n\\t - econtext (object) #optional context for drag end handler\\n\\t * Additionally following `drag` events will be triggered: `drag.start.<id>` on start,\\n\\t * `drag.end.<id>` on end and `drag.move.<id>` on every move. When element will be dragged over another element\\n\\t * `drag.over.<id>` will be fired as well.\\n\\t *\\n\\t * Start event and start handler will be called in specified context or in context of the element with following parameters:\\n\\t o x (number) x position of the mouse\\n\\t o y (number) y position of the mouse\\n\\t o event (object) DOM event object\\n\\t * Move event and move handler will be called in specified context or in context of the element with following parameters:\\n\\t o dx (number) shift by x from the start point\\n\\t o dy (number) shift by y from the start point\\n\\t o x (number) x position of the mouse\\n\\t o y (number) y position of the mouse\\n\\t o event (object) DOM event object\\n\\t * End event and end handler will be called in specified context or in context of the element with following parameters:\\n\\t o event (object) DOM event object\\n\\t = (object) @Element\\n\\t \\\\*/\\n\\t elproto.drag = function (onmove, onstart, onend, move_scope, start_scope, end_scope) {\\n\\t function start(e) {\\n\\t (e.originalEvent || e).preventDefault();\\n\\t var x = e.clientX,\\n\\t y = e.clientY,\\n\\t scrollY = g.doc.documentElement.scrollTop || g.doc.body.scrollTop,\\n\\t scrollX = g.doc.documentElement.scrollLeft || g.doc.body.scrollLeft;\\n\\t this._drag.id = e.identifier;\\n\\t if (supportsTouch && e.touches) {\\n\\t var i = e.touches.length, touch;\\n\\t while (i--) {\\n\\t touch = e.touches[i];\\n\\t this._drag.id = touch.identifier;\\n\\t if (touch.identifier == this._drag.id) {\\n\\t x = touch.clientX;\\n\\t y = touch.clientY;\\n\\t break;\\n\\t }\\n\\t }\\n\\t }\\n\\t this._drag.x = x + scrollX;\\n\\t this._drag.y = y + scrollY;\\n\\t !drag.length && R.mousemove(dragMove).mouseup(dragUp);\\n\\t drag.push({el: this, move_scope: move_scope, start_scope: start_scope, end_scope: end_scope});\\n\\t onstart && eve.on(\\\"raphael.drag.start.\\\" + this.id, onstart);\\n\\t onmove && eve.on(\\\"raphael.drag.move.\\\" + this.id, onmove);\\n\\t onend && eve.on(\\\"raphael.drag.end.\\\" + this.id, onend);\\n\\t eve(\\\"raphael.drag.start.\\\" + this.id, start_scope || move_scope || this, e.clientX + scrollX, e.clientY + scrollY, e);\\n\\t }\\n\\t this._drag = {};\\n\\t draggable.push({el: this, start: start});\\n\\t this.mousedown(start);\\n\\t return this;\\n\\t };\\n\\t /*\\\\\\n\\t * Element.onDragOver\\n\\t [ method ]\\n\\t **\\n\\t * Shortcut for assigning event handler for `drag.over.<id>` event, where id is id of the element (see @Element.id).\\n\\t > Parameters\\n\\t - f (function) handler for event, first argument would be the element you are dragging over\\n\\t \\\\*/\\n\\t elproto.onDragOver = function (f) {\\n\\t f ? eve.on(\\\"raphael.drag.over.\\\" + this.id, f) : eve.unbind(\\\"raphael.drag.over.\\\" + this.id);\\n\\t };\\n\\t /*\\\\\\n\\t * Element.undrag\\n\\t [ method ]\\n\\t **\\n\\t * Removes all drag event handlers from given element.\\n\\t \\\\*/\\n\\t elproto.undrag = function () {\\n\\t var i = draggable.length;\\n\\t while (i--) if (draggable[i].el == this) {\\n\\t this.unmousedown(draggable[i].start);\\n\\t draggable.splice(i, 1);\\n\\t eve.unbind(\\\"raphael.drag.*.\\\" + this.id);\\n\\t }\\n\\t !draggable.length && R.unmousemove(dragMove).unmouseup(dragUp);\\n\\t drag = [];\\n\\t };\\n\\t /*\\\\\\n\\t * Paper.circle\\n\\t [ method ]\\n\\t **\\n\\t * Draws a circle.\\n\\t **\\n\\t > Parameters\\n\\t **\\n\\t - x (number) x coordinate of the centre\\n\\t - y (number) y coordinate of the centre\\n\\t - r (number) radius\\n\\t = (object) Raphaël element object with type “circle”\\n\\t **\\n\\t > Usage\\n\\t | var c = paper.circle(50, 50, 40);\\n\\t \\\\*/\\n\\t paperproto.circle = function (x, y, r) {\\n\\t var out = R._engine.circle(this, x || 0, y || 0, r || 0);\\n\\t this.__set__ && this.__set__.push(out);\\n\\t return out;\\n\\t };\\n\\t /*\\\\\\n\\t * Paper.rect\\n\\t [ method ]\\n\\t *\\n\\t * Draws a rectangle.\\n\\t **\\n\\t > Parameters\\n\\t **\\n\\t - x (number) x coordinate of the top left corner\\n\\t - y (number) y coordinate of the top left corner\\n\\t - width (number) width\\n\\t - height (number) height\\n\\t - r (number) #optional radius for rounded corners, default is 0\\n\\t = (object) Raphaël element object with type “rect”\\n\\t **\\n\\t > Usage\\n\\t | // regular rectangle\\n\\t | var c = paper.rect(10, 10, 50, 50);\\n\\t | // rectangle with rounded corners\\n\\t | var c = paper.rect(40, 40, 50, 50, 10);\\n\\t \\\\*/\\n\\t paperproto.rect = function (x, y, w, h, r) {\\n\\t var out = R._engine.rect(this, x || 0, y || 0, w || 0, h || 0, r || 0);\\n\\t this.__set__ && this.__set__.push(out);\\n\\t return out;\\n\\t };\\n\\t /*\\\\\\n\\t * Paper.ellipse\\n\\t [ method ]\\n\\t **\\n\\t * Draws an ellipse.\\n\\t **\\n\\t > Parameters\\n\\t **\\n\\t - x (number) x coordinate of the centre\\n\\t - y (number) y coordinate of the centre\\n\\t - rx (number) horizontal radius\\n\\t - ry (number) vertical radius\\n\\t = (object) Raphaël element object with type “ellipse”\\n\\t **\\n\\t > Usage\\n\\t | var c = paper.ellipse(50, 50, 40, 20);\\n\\t \\\\*/\\n\\t paperproto.ellipse = function (x, y, rx, ry) {\\n\\t var out = R._engine.ellipse(this, x || 0, y || 0, rx || 0, ry || 0);\\n\\t this.__set__ && this.__set__.push(out);\\n\\t return out;\\n\\t };\\n\\t /*\\\\\\n\\t * Paper.path\\n\\t [ method ]\\n\\t **\\n\\t * Creates a path element by given path data string.\\n\\t > Parameters\\n\\t - pathString (string) #optional path string in SVG format.\\n\\t * Path string consists of one-letter commands, followed by comma seprarated arguments in numercal form. Example:\\n\\t | \\\"M10,20L30,40\\\"\\n\\t * Here we can see two commands: “M”, with arguments `(10, 20)` and “L” with arguments `(30, 40)`. Upper case letter mean command is absolute, lower case—relative.\\n\\t *\\n\\t # <p>Here is short list of commands available, for more details see <a href=\\\"http://www.w3.org/TR/SVG/paths.html#PathData\\\" title=\\\"Details of a path's data attribute's format are described in the SVG specification.\\\">SVG path string format</a>.</p>\\n\\t # <table><thead><tr><th>Command</th><th>Name</th><th>Parameters</th></tr></thead><tbody>\\n\\t # <tr><td>M</td><td>moveto</td><td>(x y)+</td></tr>\\n\\t # <tr><td>Z</td><td>closepath</td><td>(none)</td></tr>\\n\\t # <tr><td>L</td><td>lineto</td><td>(x y)+</td></tr>\\n\\t # <tr><td>H</td><td>horizontal lineto</td><td>x+</td></tr>\\n\\t # <tr><td>V</td><td>vertical lineto</td><td>y+</td></tr>\\n\\t # <tr><td>C</td><td>curveto</td><td>(x1 y1 x2 y2 x y)+</td></tr>\\n\\t # <tr><td>S</td><td>smooth curveto</td><td>(x2 y2 x y)+</td></tr>\\n\\t # <tr><td>Q</td><td>quadratic Bézier curveto</td><td>(x1 y1 x y)+</td></tr>\\n\\t # <tr><td>T</td><td>smooth quadratic Bézier curveto</td><td>(x y)+</td></tr>\\n\\t # <tr><td>A</td><td>elliptical arc</td><td>(rx ry x-axis-rotation large-arc-flag sweep-flag x y)+</td></tr>\\n\\t # <tr><td>R</td><td><a href=\\\"http://en.wikipedia.org/wiki/Catmull–Rom_spline#Catmull.E2.80.93Rom_spline\\\">Catmull-Rom curveto</a>*</td><td>x1 y1 (x y)+</td></tr></tbody></table>\\n\\t * * “Catmull-Rom curveto” is a not standard SVG command and added in 2.0 to make life easier.\\n\\t * Note: there is a special case when path consist of just three commands: “M10,10R…z”. In this case path will smoothly connects to its beginning.\\n\\t > Usage\\n\\t | var c = paper.path(\\\"M10 10L90 90\\\");\\n\\t | // draw a diagonal line:\\n\\t | // move to 10,10, line to 90,90\\n\\t * For example of path strings, check out these icons: http://raphaeljs.com/icons/\\n\\t \\\\*/\\n\\t paperproto.path = function (pathString) {\\n\\t pathString && !R.is(pathString, string) && !R.is(pathString[0], array) && (pathString += E);\\n\\t var out = R._engine.path(R.format[apply](R, arguments), this);\\n\\t this.__set__ && this.__set__.push(out);\\n\\t return out;\\n\\t };\\n\\t /*\\\\\\n\\t * Paper.image\\n\\t [ method ]\\n\\t **\\n\\t * Embeds an image into the surface.\\n\\t **\\n\\t > Parameters\\n\\t **\\n\\t - src (string) URI of the source image\\n\\t - x (number) x coordinate position\\n\\t - y (number) y coordinate position\\n\\t - width (number) width of the image\\n\\t - height (number) height of the image\\n\\t = (object) Raphaël element object with type “image”\\n\\t **\\n\\t > Usage\\n\\t | var c = paper.image(\\\"apple.png\\\", 10, 10, 80, 80);\\n\\t \\\\*/\\n\\t paperproto.image = function (src, x, y, w, h) {\\n\\t var out = R._engine.image(this, src || \\\"about:blank\\\", x || 0, y || 0, w || 0, h || 0);\\n\\t this.__set__ && this.__set__.push(out);\\n\\t return out;\\n\\t };\\n\\t /*\\\\\\n\\t * Paper.text\\n\\t [ method ]\\n\\t **\\n\\t * Draws a text string. If you need line breaks, put “\\\\n” in the string.\\n\\t **\\n\\t > Parameters\\n\\t **\\n\\t - x (number) x coordinate position\\n\\t - y (number) y coordinate position\\n\\t - text (string) The text string to draw\\n\\t = (object) Raphaël element object with type “text”\\n\\t **\\n\\t > Usage\\n\\t | var t = paper.text(50, 50, \\\"Raphaël\\\\nkicks\\\\nbutt!\\\");\\n\\t \\\\*/\\n\\t paperproto.text = function (x, y, text) {\\n\\t var out = R._engine.text(this, x || 0, y || 0, Str(text));\\n\\t this.__set__ && this.__set__.push(out);\\n\\t return out;\\n\\t };\\n\\t /*\\\\\\n\\t * Paper.set\\n\\t [ method ]\\n\\t **\\n\\t * Creates array-like object to keep and operate several elements at once.\\n\\t * Warning: it doesn’t create any elements for itself in the page, it just groups existing elements.\\n\\t * Sets act as pseudo elements — all methods available to an element can be used on a set.\\n\\t = (object) array-like object that represents set of elements\\n\\t **\\n\\t > Usage\\n\\t | var st = paper.set();\\n\\t | st.push(\\n\\t | paper.circle(10, 10, 5),\\n\\t | paper.circle(30, 10, 5)\\n\\t | );\\n\\t | st.attr({fill: \\\"red\\\"}); // changes the fill of both circles\\n\\t \\\\*/\\n\\t paperproto.set = function (itemsArray) {\\n\\t !R.is(itemsArray, \\\"array\\\") && (itemsArray = Array.prototype.splice.call(arguments, 0, arguments.length));\\n\\t var out = new Set(itemsArray);\\n\\t this.__set__ && this.__set__.push(out);\\n\\t out[\\\"paper\\\"] = this;\\n\\t out[\\\"type\\\"] = \\\"set\\\";\\n\\t return out;\\n\\t };\\n\\t /*\\\\\\n\\t * Paper.setStart\\n\\t [ method ]\\n\\t **\\n\\t * Creates @Paper.set. All elements that will be created after calling this method and before calling\\n\\t * @Paper.setFinish will be added to the set.\\n\\t **\\n\\t > Usage\\n\\t | paper.setStart();\\n\\t | paper.circle(10, 10, 5),\\n\\t | paper.circle(30, 10, 5)\\n\\t | var st = paper.setFinish();\\n\\t | st.attr({fill: \\\"red\\\"}); // changes the fill of both circles\\n\\t \\\\*/\\n\\t paperproto.setStart = function (set) {\\n\\t this.__set__ = set || this.set();\\n\\t };\\n\\t /*\\\\\\n\\t * Paper.setFinish\\n\\t [ method ]\\n\\t **\\n\\t * See @Paper.setStart. This method finishes catching and returns resulting set.\\n\\t **\\n\\t = (object) set\\n\\t \\\\*/\\n\\t paperproto.setFinish = function (set) {\\n\\t var out = this.__set__;\\n\\t delete this.__set__;\\n\\t return out;\\n\\t };\\n\\t /*\\\\\\n\\t * Paper.getSize\\n\\t [ method ]\\n\\t **\\n\\t * Obtains current paper actual size.\\n\\t **\\n\\t = (object)\\n\\t \\\\*/\\n\\t paperproto.getSize = function () {\\n\\t var container = this.canvas.parentNode;\\n\\t return {\\n\\t width: container.offsetWidth,\\n\\t height: container.offsetHeight\\n\\t };\\n\\t };\\n\\t /*\\\\\\n\\t * Paper.setSize\\n\\t [ method ]\\n\\t **\\n\\t * If you need to change dimensions of the canvas call this method\\n\\t **\\n\\t > Parameters\\n\\t **\\n\\t - width (number) new width of the canvas\\n\\t - height (number) new height of the canvas\\n\\t \\\\*/\\n\\t paperproto.setSize = function (width, height) {\\n\\t return R._engine.setSize.call(this, width, height);\\n\\t };\\n\\t /*\\\\\\n\\t * Paper.setViewBox\\n\\t [ method ]\\n\\t **\\n\\t * Sets the view box of the paper. Practically it gives you ability to zoom and pan whole paper surface by\\n\\t * specifying new boundaries.\\n\\t **\\n\\t > Parameters\\n\\t **\\n\\t - x (number) new x position, default is `0`\\n\\t - y (number) new y position, default is `0`\\n\\t - w (number) new width of the canvas\\n\\t - h (number) new height of the canvas\\n\\t - fit (boolean) `true` if you want graphics to fit into new boundary box\\n\\t \\\\*/\\n\\t paperproto.setViewBox = function (x, y, w, h, fit) {\\n\\t return R._engine.setViewBox.call(this, x, y, w, h, fit);\\n\\t };\\n\\t /*\\\\\\n\\t * Paper.top\\n\\t [ property ]\\n\\t **\\n\\t * Points to the topmost element on the paper\\n\\t \\\\*/\\n\\t /*\\\\\\n\\t * Paper.bottom\\n\\t [ property ]\\n\\t **\\n\\t * Points to the bottom element on the paper\\n\\t \\\\*/\\n\\t paperproto.top = paperproto.bottom = null;\\n\\t /*\\\\\\n\\t * Paper.raphael\\n\\t [ property ]\\n\\t **\\n\\t * Points to the @Raphael object/function\\n\\t \\\\*/\\n\\t paperproto.raphael = R;\\n\\t var getOffset = function (elem) {\\n\\t var box = elem.getBoundingClientRect(),\\n\\t doc = elem.ownerDocument,\\n\\t body = doc.body,\\n\\t docElem = doc.documentElement,\\n\\t clientTop = docElem.clientTop || body.clientTop || 0, clientLeft = docElem.clientLeft || body.clientLeft || 0,\\n\\t top = box.top + (g.win.pageYOffset || docElem.scrollTop || body.scrollTop ) - clientTop,\\n\\t left = box.left + (g.win.pageXOffset || docElem.scrollLeft || body.scrollLeft) - clientLeft;\\n\\t return {\\n\\t y: top,\\n\\t x: left\\n\\t };\\n\\t };\\n\\t /*\\\\\\n\\t * Paper.getElementByPoint\\n\\t [ method ]\\n\\t **\\n\\t * Returns you topmost element under given point.\\n\\t **\\n\\t = (object) Raphaël element object\\n\\t > Parameters\\n\\t **\\n\\t - x (number) x coordinate from the top left corner of the window\\n\\t - y (number) y coordinate from the top left corner of the window\\n\\t > Usage\\n\\t | paper.getElementByPoint(mouseX, mouseY).attr({stroke: \\\"#f00\\\"});\\n\\t \\\\*/\\n\\t paperproto.getElementByPoint = function (x, y) {\\n\\t var paper = this,\\n\\t svg = paper.canvas,\\n\\t target = g.doc.elementFromPoint(x, y);\\n\\t if (g.win.opera && target.tagName == \\\"svg\\\") {\\n\\t var so = getOffset(svg),\\n\\t sr = svg.createSVGRect();\\n\\t sr.x = x - so.x;\\n\\t sr.y = y - so.y;\\n\\t sr.width = sr.height = 1;\\n\\t var hits = svg.getIntersectionList(sr, null);\\n\\t if (hits.length) {\\n\\t target = hits[hits.length - 1];\\n\\t }\\n\\t }\\n\\t if (!target) {\\n\\t return null;\\n\\t }\\n\\t while (target.parentNode && target != svg.parentNode && !target.raphael) {\\n\\t target = target.parentNode;\\n\\t }\\n\\t target == paper.canvas.parentNode && (target = svg);\\n\\t target = target && target.raphael ? paper.getById(target.raphaelid) : null;\\n\\t return target;\\n\\t };\\n\\n\\t /*\\\\\\n\\t * Paper.getElementsByBBox\\n\\t [ method ]\\n\\t **\\n\\t * Returns set of elements that have an intersecting bounding box\\n\\t **\\n\\t > Parameters\\n\\t **\\n\\t - bbox (object) bbox to check with\\n\\t = (object) @Set\\n\\t \\\\*/\\n\\t paperproto.getElementsByBBox = function (bbox) {\\n\\t var set = this.set();\\n\\t this.forEach(function (el) {\\n\\t if (R.isBBoxIntersect(el.getBBox(), bbox)) {\\n\\t set.push(el);\\n\\t }\\n\\t });\\n\\t return set;\\n\\t };\\n\\n\\t /*\\\\\\n\\t * Paper.getById\\n\\t [ method ]\\n\\t **\\n\\t * Returns you element by its internal ID.\\n\\t **\\n\\t > Parameters\\n\\t **\\n\\t - id (number) id\\n\\t = (object) Raphaël element object\\n\\t \\\\*/\\n\\t paperproto.getById = function (id) {\\n\\t var bot = this.bottom;\\n\\t while (bot) {\\n\\t if (bot.id == id) {\\n\\t return bot;\\n\\t }\\n\\t bot = bot.next;\\n\\t }\\n\\t return null;\\n\\t };\\n\\t /*\\\\\\n\\t * Paper.forEach\\n\\t [ method ]\\n\\t **\\n\\t * Executes given function for each element on the paper\\n\\t *\\n\\t * If callback function returns `false` it will stop loop running.\\n\\t **\\n\\t > Parameters\\n\\t **\\n\\t - callback (function) function to run\\n\\t - thisArg (object) context object for the callback\\n\\t = (object) Paper object\\n\\t > Usage\\n\\t | paper.forEach(function (el) {\\n\\t | el.attr({ stroke: \\\"blue\\\" });\\n\\t | });\\n\\t \\\\*/\\n\\t paperproto.forEach = function (callback, thisArg) {\\n\\t var bot = this.bottom;\\n\\t while (bot) {\\n\\t if (callback.call(thisArg, bot) === false) {\\n\\t return this;\\n\\t }\\n\\t bot = bot.next;\\n\\t }\\n\\t return this;\\n\\t };\\n\\t /*\\\\\\n\\t * Paper.getElementsByPoint\\n\\t [ method ]\\n\\t **\\n\\t * Returns set of elements that have common point inside\\n\\t **\\n\\t > Parameters\\n\\t **\\n\\t - x (number) x coordinate of the point\\n\\t - y (number) y coordinate of the point\\n\\t = (object) @Set\\n\\t \\\\*/\\n\\t paperproto.getElementsByPoint = function (x, y) {\\n\\t var set = this.set();\\n\\t this.forEach(function (el) {\\n\\t if (el.isPointInside(x, y)) {\\n\\t set.push(el);\\n\\t }\\n\\t });\\n\\t return set;\\n\\t };\\n\\t function x_y() {\\n\\t return this.x + S + this.y;\\n\\t }\\n\\t function x_y_w_h() {\\n\\t return this.x + S + this.y + S + this.width + \\\" \\\\xd7 \\\" + this.height;\\n\\t }\\n\\t /*\\\\\\n\\t * Element.isPointInside\\n\\t [ method ]\\n\\t **\\n\\t * Determine if given point is inside this element’s shape\\n\\t **\\n\\t > Parameters\\n\\t **\\n\\t - x (number) x coordinate of the point\\n\\t - y (number) y coordinate of the point\\n\\t = (boolean) `true` if point inside the shape\\n\\t \\\\*/\\n\\t elproto.isPointInside = function (x, y) {\\n\\t var rp = this.realPath = getPath[this.type](this);\\n\\t if (this.attr('transform') && this.attr('transform').length) {\\n\\t rp = R.transformPath(rp, this.attr('transform'));\\n\\t }\\n\\t return R.isPointInsidePath(rp, x, y);\\n\\t };\\n\\t /*\\\\\\n\\t * Element.getBBox\\n\\t [ method ]\\n\\t **\\n\\t * Return bounding box for a given element\\n\\t **\\n\\t > Parameters\\n\\t **\\n\\t - isWithoutTransform (boolean) flag, `true` if you want to have bounding box before transformations. Default is `false`.\\n\\t = (object) Bounding box object:\\n\\t o {\\n\\t o x: (number) top left corner x\\n\\t o y: (number) top left corner y\\n\\t o x2: (number) bottom right corner x\\n\\t o y2: (number) bottom right corner y\\n\\t o width: (number) width\\n\\t o height: (number) height\\n\\t o }\\n\\t \\\\*/\\n\\t elproto.getBBox = function (isWithoutTransform) {\\n\\t if (this.removed) {\\n\\t return {};\\n\\t }\\n\\t var _ = this._;\\n\\t if (isWithoutTransform) {\\n\\t if (_.dirty || !_.bboxwt) {\\n\\t this.realPath = getPath[this.type](this);\\n\\t _.bboxwt = pathDimensions(this.realPath);\\n\\t _.bboxwt.toString = x_y_w_h;\\n\\t _.dirty = 0;\\n\\t }\\n\\t return _.bboxwt;\\n\\t }\\n\\t if (_.dirty || _.dirtyT || !_.bbox) {\\n\\t if (_.dirty || !this.realPath) {\\n\\t _.bboxwt = 0;\\n\\t this.realPath = getPath[this.type](this);\\n\\t }\\n\\t _.bbox = pathDimensions(mapPath(this.realPath, this.matrix));\\n\\t _.bbox.toString = x_y_w_h;\\n\\t _.dirty = _.dirtyT = 0;\\n\\t }\\n\\t return _.bbox;\\n\\t };\\n\\t /*\\\\\\n\\t * Element.clone\\n\\t [ method ]\\n\\t **\\n\\t = (object) clone of a given element\\n\\t **\\n\\t \\\\*/\\n\\t elproto.clone = function () {\\n\\t if (this.removed) {\\n\\t return null;\\n\\t }\\n\\t var out = this.paper[this.type]().attr(this.attr());\\n\\t this.__set__ && this.__set__.push(out);\\n\\t return out;\\n\\t };\\n\\t /*\\\\\\n\\t * Element.glow\\n\\t [ method ]\\n\\t **\\n\\t * Return set of elements that create glow-like effect around given element. See @Paper.set.\\n\\t *\\n\\t * Note: Glow is not connected to the element. If you change element attributes it won’t adjust itself.\\n\\t **\\n\\t > Parameters\\n\\t **\\n\\t - glow (object) #optional parameters object with all properties optional:\\n\\t o {\\n\\t o width (number) size of the glow, default is `10`\\n\\t o fill (boolean) will it be filled, default is `false`\\n\\t o opacity (number) opacity, default is `0.5`\\n\\t o offsetx (number) horizontal offset, default is `0`\\n\\t o offsety (number) vertical offset, default is `0`\\n\\t o color (string) glow colour, default is `black`\\n\\t o }\\n\\t = (object) @Paper.set of elements that represents glow\\n\\t \\\\*/\\n\\t elproto.glow = function (glow) {\\n\\t if (this.type == \\\"text\\\") {\\n\\t return null;\\n\\t }\\n\\t glow = glow || {};\\n\\t var s = {\\n\\t width: (glow.width || 10) + (+this.attr(\\\"stroke-width\\\") || 1),\\n\\t fill: glow.fill || false,\\n\\t opacity: glow.opacity == null ? .5 : glow.opacity,\\n\\t offsetx: glow.offsetx || 0,\\n\\t offsety: glow.offsety || 0,\\n\\t color: glow.color || \\\"#000\\\"\\n\\t },\\n\\t c = s.width / 2,\\n\\t r = this.paper,\\n\\t out = r.set(),\\n\\t path = this.realPath || getPath[this.type](this);\\n\\t path = this.matrix ? mapPath(path, this.matrix) : path;\\n\\t for (var i = 1; i < c + 1; i++) {\\n\\t out.push(r.path(path).attr({\\n\\t stroke: s.color,\\n\\t fill: s.fill ? s.color : \\\"none\\\",\\n\\t \\\"stroke-linejoin\\\": \\\"round\\\",\\n\\t \\\"stroke-linecap\\\": \\\"round\\\",\\n\\t \\\"stroke-width\\\": +(s.width / c * i).toFixed(3),\\n\\t opacity: +(s.opacity / c).toFixed(3)\\n\\t }));\\n\\t }\\n\\t return out.insertBefore(this).translate(s.offsetx, s.offsety);\\n\\t };\\n\\t var curveslengths = {},\\n\\t getPointAtSegmentLength = function (p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, length) {\\n\\t if (length == null) {\\n\\t return bezlen(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y);\\n\\t } else {\\n\\t return R.findDotsAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, getTatLen(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, length));\\n\\t }\\n\\t },\\n\\t getLengthFactory = function (istotal, subpath) {\\n\\t return function (path, length, onlystart) {\\n\\t path = path2curve(path);\\n\\t var x, y, p, l, sp = \\\"\\\", subpaths = {}, point,\\n\\t len = 0;\\n\\t for (var i = 0, ii = path.length; i < ii; i++) {\\n\\t p = path[i];\\n\\t if (p[0] == \\\"M\\\") {\\n\\t x = +p[1];\\n\\t y = +p[2];\\n\\t } else {\\n\\t l = getPointAtSegmentLength(x, y, p[1], p[2], p[3], p[4], p[5], p[6]);\\n\\t if (len + l > length) {\\n\\t if (subpath && !subpaths.start) {\\n\\t point = getPointAtSegmentLength(x, y, p[1], p[2], p[3], p[4], p[5], p[6], length - len);\\n\\t sp += [\\\"C\\\" + point.start.x, point.start.y, point.m.x, point.m.y, point.x, point.y];\\n\\t if (onlystart) {return sp;}\\n\\t subpaths.start = sp;\\n\\t sp = [\\\"M\\\" + point.x, point.y + \\\"C\\\" + point.n.x, point.n.y, point.end.x, point.end.y, p[5], p[6]].join();\\n\\t len += l;\\n\\t x = +p[5];\\n\\t y = +p[6];\\n\\t continue;\\n\\t }\\n\\t if (!istotal && !subpath) {\\n\\t point = getPointAtSegmentLength(x, y, p[1], p[2], p[3], p[4], p[5], p[6], length - len);\\n\\t return {x: point.x, y: point.y, alpha: point.alpha};\\n\\t }\\n\\t }\\n\\t len += l;\\n\\t x = +p[5];\\n\\t y = +p[6];\\n\\t }\\n\\t sp += p.shift() + p;\\n\\t }\\n\\t subpaths.end = sp;\\n\\t point = istotal ? len : subpath ? subpaths : R.findDotsAtSegment(x, y, p[0], p[1], p[2], p[3], p[4], p[5], 1);\\n\\t point.alpha && (point = {x: point.x, y: point.y, alpha: point.alpha});\\n\\t return point;\\n\\t };\\n\\t };\\n\\t var getTotalLength = getLengthFactory(1),\\n\\t getPointAtLength = getLengthFactory(),\\n\\t getSubpathsAtLength = getLengthFactory(0, 1);\\n\\t /*\\\\\\n\\t * Raphael.getTotalLength\\n\\t [ method ]\\n\\t **\\n\\t * Returns length of the given path in pixels.\\n\\t **\\n\\t > Parameters\\n\\t **\\n\\t - path (string) SVG path string.\\n\\t **\\n\\t = (number) length.\\n\\t \\\\*/\\n\\t R.getTotalLength = getTotalLength;\\n\\t /*\\\\\\n\\t * Raphael.getPointAtLength\\n\\t [ method ]\\n\\t **\\n\\t * Return coordinates of the point located at the given length on the given path.\\n\\t **\\n\\t > Parameters\\n\\t **\\n\\t - path (string) SVG path string\\n\\t - length (number)\\n\\t **\\n\\t = (object) representation of the point:\\n\\t o {\\n\\t o x: (number) x coordinate\\n\\t o y: (number) y coordinate\\n\\t o alpha: (number) angle of derivative\\n\\t o }\\n\\t \\\\*/\\n\\t R.getPointAtLength = getPointAtLength;\\n\\t /*\\\\\\n\\t * Raphael.getSubpath\\n\\t [ method ]\\n\\t **\\n\\t * Return subpath of a given path from given length to given length.\\n\\t **\\n\\t > Parameters\\n\\t **\\n\\t - path (string) SVG path string\\n\\t - from (number) position of the start of the segment\\n\\t - to (number) position of the end of the segment\\n\\t **\\n\\t = (string) pathstring for the segment\\n\\t \\\\*/\\n\\t R.getSubpath = function (path, from, to) {\\n\\t if (this.getTotalLength(path) - to < 1e-6) {\\n\\t return getSubpathsAtLength(path, from).end;\\n\\t }\\n\\t var a = getSubpathsAtLength(path, to, 1);\\n\\t return from ? getSubpathsAtLength(a, from).end : a;\\n\\t };\\n\\t /*\\\\\\n\\t * Element.getTotalLength\\n\\t [ method ]\\n\\t **\\n\\t * Returns length of the path in pixels. Only works for element of “path” type.\\n\\t = (number) length.\\n\\t \\\\*/\\n\\t elproto.getTotalLength = function () {\\n\\t var path = this.getPath();\\n\\t if (!path) {\\n\\t return;\\n\\t }\\n\\n\\t if (this.node.getTotalLength) {\\n\\t return this.node.getTotalLength();\\n\\t }\\n\\n\\t return getTotalLength(path);\\n\\t };\\n\\t /*\\\\\\n\\t * Element.getPointAtLength\\n\\t [ method ]\\n\\t **\\n\\t * Return coordinates of the point located at the given length on the given path. Only works for element of “path” type.\\n\\t **\\n\\t > Parameters\\n\\t **\\n\\t - length (number)\\n\\t **\\n\\t = (object) representation of the point:\\n\\t o {\\n\\t o x: (number) x coordinate\\n\\t o y: (number) y coordinate\\n\\t o alpha: (number) angle of derivative\\n\\t o }\\n\\t \\\\*/\\n\\t elproto.getPointAtLength = function (length) {\\n\\t var path = this.getPath();\\n\\t if (!path) {\\n\\t return;\\n\\t }\\n\\n\\t return getPointAtLength(path, length);\\n\\t };\\n\\t /*\\\\\\n\\t * Element.getPath\\n\\t [ method ]\\n\\t **\\n\\t * Returns path of the element. Only works for elements of “path” type and simple elements like circle.\\n\\t = (object) path\\n\\t **\\n\\t \\\\*/\\n\\t elproto.getPath = function () {\\n\\t var path,\\n\\t getPath = R._getPath[this.type];\\n\\n\\t if (this.type == \\\"text\\\" || this.type == \\\"set\\\") {\\n\\t return;\\n\\t }\\n\\n\\t if (getPath) {\\n\\t path = getPath(this);\\n\\t }\\n\\n\\t return path;\\n\\t };\\n\\t /*\\\\\\n\\t * Element.getSubpath\\n\\t [ method ]\\n\\t **\\n\\t * Return subpath of a given element from given length to given length. Only works for element of “path” type.\\n\\t **\\n\\t > Parameters\\n\\t **\\n\\t - from (number) position of the start of the segment\\n\\t - to (number) position of the end of the segment\\n\\t **\\n\\t = (string) pathstring for the segment\\n\\t \\\\*/\\n\\t elproto.getSubpath = function (from, to) {\\n\\t var path = this.getPath();\\n\\t if (!path) {\\n\\t return;\\n\\t }\\n\\n\\t return R.getSubpath(path, from, to);\\n\\t };\\n\\t /*\\\\\\n\\t * Raphael.easing_formulas\\n\\t [ property ]\\n\\t **\\n\\t * Object that contains easing formulas for animation. You could extend it with your own. By default it has following list of easing:\\n\\t # <ul>\\n\\t # <li>“linear”</li>\\n\\t # <li>“<” or “easeIn” or “ease-in”</li>\\n\\t # <li>“>” or “easeOut” or “ease-out”</li>\\n\\t # <li>“<>” or “easeInOut” or “ease-in-out”</li>\\n\\t # <li>“backIn” or “back-in”</li>\\n\\t # <li>“backOut” or “back-out”</li>\\n\\t # <li>“elastic”</li>\\n\\t # <li>“bounce”</li>\\n\\t # </ul>\\n\\t # <p>See also <a href=\\\"http://raphaeljs.com/easing.html\\\">Easing demo</a>.</p>\\n\\t \\\\*/\\n\\t var ef = R.easing_formulas = {\\n\\t linear: function (n) {\\n\\t return n;\\n\\t },\\n\\t \\\"<\\\": function (n) {\\n\\t return pow(n, 1.7);\\n\\t },\\n\\t \\\">\\\": function (n) {\\n\\t return pow(n, .48);\\n\\t },\\n\\t \\\"<>\\\": function (n) {\\n\\t var q = .48 - n / 1.04,\\n\\t Q = math.sqrt(.1734 + q * q),\\n\\t x = Q - q,\\n\\t X = pow(abs(x), 1 / 3) * (x < 0 ? -1 : 1),\\n\\t y = -Q - q,\\n\\t Y = pow(abs(y), 1 / 3) * (y < 0 ? -1 : 1),\\n\\t t = X + Y + .5;\\n\\t return (1 - t) * 3 * t * t + t * t * t;\\n\\t },\\n\\t backIn: function (n) {\\n\\t var s = 1.70158;\\n\\t return n * n * ((s + 1) * n - s);\\n\\t },\\n\\t backOut: function (n) {\\n\\t n = n - 1;\\n\\t var s = 1.70158;\\n\\t return n * n * ((s + 1) * n + s) + 1;\\n\\t },\\n\\t elastic: function (n) {\\n\\t if (n == !!n) {\\n\\t return n;\\n\\t }\\n\\t return pow(2, -10 * n) * math.sin((n - .075) * (2 * PI) / .3) + 1;\\n\\t },\\n\\t bounce: function (n) {\\n\\t var s = 7.5625,\\n\\t p = 2.75,\\n\\t l;\\n\\t if (n < (1 / p)) {\\n\\t l = s * n * n;\\n\\t } else {\\n\\t if (n < (2 / p)) {\\n\\t n -= (1.5 / p);\\n\\t l = s * n * n + .75;\\n\\t } else {\\n\\t if (n < (2.5 / p)) {\\n\\t n -= (2.25 / p);\\n\\t l = s * n * n + .9375;\\n\\t } else {\\n\\t n -= (2.625 / p);\\n\\t l = s * n * n + .984375;\\n\\t }\\n\\t }\\n\\t }\\n\\t return l;\\n\\t }\\n\\t };\\n\\t ef.easeIn = ef[\\\"ease-in\\\"] = ef[\\\"<\\\"];\\n\\t ef.easeOut = ef[\\\"ease-out\\\"] = ef[\\\">\\\"];\\n\\t ef.easeInOut = ef[\\\"ease-in-out\\\"] = ef[\\\"<>\\\"];\\n\\t ef[\\\"back-in\\\"] = ef.backIn;\\n\\t ef[\\\"back-out\\\"] = ef.backOut;\\n\\n\\t var animationElements = [],\\n\\t requestAnimFrame = window.requestAnimationFrame ||\\n\\t window.webkitRequestAnimationFrame ||\\n\\t window.mozRequestAnimationFrame ||\\n\\t window.oRequestAnimationFrame ||\\n\\t window.msRequestAnimationFrame ||\\n\\t function (callback) {\\n\\t setTimeout(callback, 16);\\n\\t },\\n\\t animation = function () {\\n\\t var Now = +new Date,\\n\\t l = 0;\\n\\t for (; l < animationElements.length; l++) {\\n\\t var e = animationElements[l];\\n\\t if (e.el.removed || e.paused) {\\n\\t continue;\\n\\t }\\n\\t var time = Now - e.start,\\n\\t ms = e.ms,\\n\\t easing = e.easing,\\n\\t from = e.from,\\n\\t diff = e.diff,\\n\\t to = e.to,\\n\\t t = e.t,\\n\\t that = e.el,\\n\\t set = {},\\n\\t now,\\n\\t init = {},\\n\\t key;\\n\\t if (e.initstatus) {\\n\\t time = (e.initstatus * e.anim.top - e.prev) / (e.percent - e.prev) * ms;\\n\\t e.status = e.initstatus;\\n\\t delete e.initstatus;\\n\\t e.stop && animationElements.splice(l--, 1);\\n\\t } else {\\n\\t e.status = (e.prev + (e.percent - e.prev) * (time / ms)) / e.anim.top;\\n\\t }\\n\\t if (time < 0) {\\n\\t continue;\\n\\t }\\n\\t if (time < ms) {\\n\\t var pos = easing(time / ms);\\n\\t for (var attr in from) if (from[has](attr)) {\\n\\t switch (availableAnimAttrs[attr]) {\\n\\t case nu:\\n\\t now = +from[attr] + pos * ms * diff[attr];\\n\\t break;\\n\\t case \\\"colour\\\":\\n\\t now = \\\"rgb(\\\" + [\\n\\t upto255(round(from[attr].r + pos * ms * diff[attr].r)),\\n\\t upto255(round(from[attr].g + pos * ms * diff[attr].g)),\\n\\t upto255(round(from[attr].b + pos * ms * diff[attr].b))\\n\\t ].join(\\\",\\\") + \\\")\\\";\\n\\t break;\\n\\t case \\\"path\\\":\\n\\t now = [];\\n\\t for (var i = 0, ii = from[attr].length; i < ii; i++) {\\n\\t now[i] = [from[attr][i][0]];\\n\\t for (var j = 1, jj = from[attr][i].length; j < jj; j++) {\\n\\t now[i][j] = +from[attr][i][j] + pos * ms * diff[attr][i][j];\\n\\t }\\n\\t now[i] = now[i].join(S);\\n\\t }\\n\\t now = now.join(S);\\n\\t break;\\n\\t case \\\"transform\\\":\\n\\t if (diff[attr].real) {\\n\\t now = [];\\n\\t for (i = 0, ii = from[attr].length; i < ii; i++) {\\n\\t now[i] = [from[attr][i][0]];\\n\\t for (j = 1, jj = from[attr][i].length; j < jj; j++) {\\n\\t now[i][j] = from[attr][i][j] + pos * ms * diff[attr][i][j];\\n\\t }\\n\\t }\\n\\t } else {\\n\\t var get = function (i) {\\n\\t return +from[attr][i] + pos * ms * diff[attr][i];\\n\\t };\\n\\t // now = [[\\\"r\\\", get(2), 0, 0], [\\\"t\\\", get(3), get(4)], [\\\"s\\\", get(0), get(1), 0, 0]];\\n\\t now = [[\\\"m\\\", get(0), get(1), get(2), get(3), get(4), get(5)]];\\n\\t }\\n\\t break;\\n\\t case \\\"csv\\\":\\n\\t if (attr == \\\"clip-rect\\\") {\\n\\t now = [];\\n\\t i = 4;\\n\\t while (i--) {\\n\\t now[i] = +from[attr][i] + pos * ms * diff[attr][i];\\n\\t }\\n\\t }\\n\\t break;\\n\\t default:\\n\\t var from2 = [][concat](from[attr]);\\n\\t now = [];\\n\\t i = that.paper.customAttributes[attr].length;\\n\\t while (i--) {\\n\\t now[i] = +from2[i] + pos * ms * diff[attr][i];\\n\\t }\\n\\t break;\\n\\t }\\n\\t set[attr] = now;\\n\\t }\\n\\t that.attr(set);\\n\\t (function (id, that, anim) {\\n\\t setTimeout(function () {\\n\\t eve(\\\"raphael.anim.frame.\\\" + id, that, anim);\\n\\t });\\n\\t })(that.id, that, e.anim);\\n\\t } else {\\n\\t (function(f, el, a) {\\n\\t setTimeout(function() {\\n\\t eve(\\\"raphael.anim.frame.\\\" + el.id, el, a);\\n\\t eve(\\\"raphael.anim.finish.\\\" + el.id, el, a);\\n\\t R.is(f, \\\"function\\\") && f.call(el);\\n\\t });\\n\\t })(e.callback, that, e.anim);\\n\\t that.attr(to);\\n\\t animationElements.splice(l--, 1);\\n\\t if (e.repeat > 1 && !e.next) {\\n\\t for (key in to) if (to[has](key)) {\\n\\t init[key] = e.totalOrigin[key];\\n\\t }\\n\\t e.el.attr(init);\\n\\t runAnimation(e.anim, e.el, e.anim.percents[0], null, e.totalOrigin, e.repeat - 1);\\n\\t }\\n\\t if (e.next && !e.stop) {\\n\\t runAnimation(e.anim, e.el, e.next, null, e.totalOrigin, e.repeat);\\n\\t }\\n\\t }\\n\\t }\\n\\t animationElements.length && requestAnimFrame(animation);\\n\\t },\\n\\t upto255 = function (color) {\\n\\t return color > 255 ? 255 : color < 0 ? 0 : color;\\n\\t };\\n\\t /*\\\\\\n\\t * Element.animateWith\\n\\t [ method ]\\n\\t **\\n\\t * Acts similar to @Element.animate, but ensure that given animation runs in sync with another given element.\\n\\t **\\n\\t > Parameters\\n\\t **\\n\\t - el (object) element to sync with\\n\\t - anim (object) animation to sync with\\n\\t - params (object) #optional final attributes for the element, see also @Element.attr\\n\\t - ms (number) #optional number of milliseconds for animation to run\\n\\t - easing (string) #optional easing type. Accept on of @Raphael.easing_formulas or CSS format: `cubic‐bezier(XX, XX, XX, XX)`\\n\\t - callback (function) #optional callback function. Will be called at the end of animation.\\n\\t * or\\n\\t - element (object) element to sync with\\n\\t - anim (object) animation to sync with\\n\\t - animation (object) #optional animation object, see @Raphael.animation\\n\\t **\\n\\t = (object) original element\\n\\t \\\\*/\\n\\t elproto.animateWith = function (el, anim, params, ms, easing, callback) {\\n\\t var element = this;\\n\\t if (element.removed) {\\n\\t callback && callback.call(element);\\n\\t return element;\\n\\t }\\n\\t var a = params instanceof Animation ? params : R.animation(params, ms, easing, callback),\\n\\t x, y;\\n\\t runAnimation(a, element, a.percents[0], null, element.attr());\\n\\t for (var i = 0, ii = animationElements.length; i < ii; i++) {\\n\\t if (animationElements[i].anim == anim && animationElements[i].el == el) {\\n\\t animationElements[ii - 1].start = animationElements[i].start;\\n\\t break;\\n\\t }\\n\\t }\\n\\t return element;\\n\\t //\\n\\t //\\n\\t // var a = params ? R.animation(params, ms, easing, callback) : anim,\\n\\t // status = element.status(anim);\\n\\t // return this.animate(a).status(a, status * anim.ms / a.ms);\\n\\t };\\n\\t function CubicBezierAtTime(t, p1x, p1y, p2x, p2y, duration) {\\n\\t var cx = 3 * p1x,\\n\\t bx = 3 * (p2x - p1x) - cx,\\n\\t ax = 1 - cx - bx,\\n\\t cy = 3 * p1y,\\n\\t by = 3 * (p2y - p1y) - cy,\\n\\t ay = 1 - cy - by;\\n\\t function sampleCurveX(t) {\\n\\t return ((ax * t + bx) * t + cx) * t;\\n\\t }\\n\\t function solve(x, epsilon) {\\n\\t var t = solveCurveX(x, epsilon);\\n\\t return ((ay * t + by) * t + cy) * t;\\n\\t }\\n\\t function solveCurveX(x, epsilon) {\\n\\t var t0, t1, t2, x2, d2, i;\\n\\t for(t2 = x, i = 0; i < 8; i++) {\\n\\t x2 = sampleCurveX(t2) - x;\\n\\t if (abs(x2) < epsilon) {\\n\\t return t2;\\n\\t }\\n\\t d2 = (3 * ax * t2 + 2 * bx) * t2 + cx;\\n\\t if (abs(d2) < 1e-6) {\\n\\t break;\\n\\t }\\n\\t t2 = t2 - x2 / d2;\\n\\t }\\n\\t t0 = 0;\\n\\t t1 = 1;\\n\\t t2 = x;\\n\\t if (t2 < t0) {\\n\\t return t0;\\n\\t }\\n\\t if (t2 > t1) {\\n\\t return t1;\\n\\t }\\n\\t while (t0 < t1) {\\n\\t x2 = sampleCurveX(t2);\\n\\t if (abs(x2 - x) < epsilon) {\\n\\t return t2;\\n\\t }\\n\\t if (x > x2) {\\n\\t t0 = t2;\\n\\t } else {\\n\\t t1 = t2;\\n\\t }\\n\\t t2 = (t1 - t0) / 2 + t0;\\n\\t }\\n\\t return t2;\\n\\t }\\n\\t return solve(t, 1 / (200 * duration));\\n\\t }\\n\\t elproto.onAnimation = function (f) {\\n\\t f ? eve.on(\\\"raphael.anim.frame.\\\" + this.id, f) : eve.unbind(\\\"raphael.anim.frame.\\\" + this.id);\\n\\t return this;\\n\\t };\\n\\t function Animation(anim, ms) {\\n\\t var percents = [],\\n\\t newAnim = {};\\n\\t this.ms = ms;\\n\\t this.times = 1;\\n\\t if (anim) {\\n\\t for (var attr in anim) if (anim[has](attr)) {\\n\\t newAnim[toFloat(attr)] = anim[attr];\\n\\t percents.push(toFloat(attr));\\n\\t }\\n\\t percents.sort(sortByNumber);\\n\\t }\\n\\t this.anim = newAnim;\\n\\t this.top = percents[percents.length - 1];\\n\\t this.percents = percents;\\n\\t }\\n\\t /*\\\\\\n\\t * Animation.delay\\n\\t [ method ]\\n\\t **\\n\\t * Creates a copy of existing animation object with given delay.\\n\\t **\\n\\t > Parameters\\n\\t **\\n\\t - delay (number) number of ms to pass between animation start and actual animation\\n\\t **\\n\\t = (object) new altered Animation object\\n\\t | var anim = Raphael.animation({cx: 10, cy: 20}, 2e3);\\n\\t | circle1.animate(anim); // run the given animation immediately\\n\\t | circle2.animate(anim.delay(500)); // run the given animation after 500 ms\\n\\t \\\\*/\\n\\t Animation.prototype.delay = function (delay) {\\n\\t var a = new Animation(this.anim, this.ms);\\n\\t a.times = this.times;\\n\\t a.del = +delay || 0;\\n\\t return a;\\n\\t };\\n\\t /*\\\\\\n\\t * Animation.repeat\\n\\t [ method ]\\n\\t **\\n\\t * Creates a copy of existing animation object with given repetition.\\n\\t **\\n\\t > Parameters\\n\\t **\\n\\t - repeat (number) number iterations of animation. For infinite animation pass `Infinity`\\n\\t **\\n\\t = (object) new altered Animation object\\n\\t \\\\*/\\n\\t Animation.prototype.repeat = function (times) {\\n\\t var a = new Animation(this.anim, this.ms);\\n\\t a.del = this.del;\\n\\t a.times = math.floor(mmax(times, 0)) || 1;\\n\\t return a;\\n\\t };\\n\\t function runAnimation(anim, element, percent, status, totalOrigin, times) {\\n\\t percent = toFloat(percent);\\n\\t var params,\\n\\t isInAnim,\\n\\t isInAnimSet,\\n\\t percents = [],\\n\\t next,\\n\\t prev,\\n\\t timestamp,\\n\\t ms = anim.ms,\\n\\t from = {},\\n\\t to = {},\\n\\t diff = {};\\n\\t if (status) {\\n\\t for (i = 0, ii = animationElements.length; i < ii; i++) {\\n\\t var e = animationElements[i];\\n\\t if (e.el.id == element.id && e.anim == anim) {\\n\\t if (e.percent != percent) {\\n\\t animationElements.splice(i, 1);\\n\\t isInAnimSet = 1;\\n\\t } else {\\n\\t isInAnim = e;\\n\\t }\\n\\t element.attr(e.totalOrigin);\\n\\t break;\\n\\t }\\n\\t }\\n\\t } else {\\n\\t status = +to; // NaN\\n\\t }\\n\\t for (var i = 0, ii = anim.percents.length; i < ii; i++) {\\n\\t if (anim.percents[i] == percent || anim.percents[i] > status * anim.top) {\\n\\t percent = anim.percents[i];\\n\\t prev = anim.percents[i - 1] || 0;\\n\\t ms = ms / anim.top * (percent - prev);\\n\\t next = anim.percents[i + 1];\\n\\t params = anim.anim[percent];\\n\\t break;\\n\\t } else if (status) {\\n\\t element.attr(anim.anim[anim.percents[i]]);\\n\\t }\\n\\t }\\n\\t if (!params) {\\n\\t return;\\n\\t }\\n\\t if (!isInAnim) {\\n\\t for (var attr in params) if (params[has](attr)) {\\n\\t if (availableAnimAttrs[has](attr) || element.paper.customAttributes[has](attr)) {\\n\\t from[attr] = element.attr(attr);\\n\\t (from[attr] == null) && (from[attr] = availableAttrs[attr]);\\n\\t to[attr] = params[attr];\\n\\t switch (availableAnimAttrs[attr]) {\\n\\t case nu:\\n\\t diff[attr] = (to[attr] - from[attr]) / ms;\\n\\t break;\\n\\t case \\\"colour\\\":\\n\\t from[attr] = R.getRGB(from[attr]);\\n\\t var toColour = R.getRGB(to[attr]);\\n\\t diff[attr] = {\\n\\t r: (toColour.r - from[attr].r) / ms,\\n\\t g: (toColour.g - from[attr].g) / ms,\\n\\t b: (toColour.b - from[attr].b) / ms\\n\\t };\\n\\t break;\\n\\t case \\\"path\\\":\\n\\t var pathes = path2curve(from[attr], to[attr]),\\n\\t toPath = pathes[1];\\n\\t from[attr] = pathes[0];\\n\\t diff[attr] = [];\\n\\t for (i = 0, ii = from[attr].length; i < ii; i++) {\\n\\t diff[attr][i] = [0];\\n\\t for (var j = 1, jj = from[attr][i].length; j < jj; j++) {\\n\\t diff[attr][i][j] = (toPath[i][j] - from[attr][i][j]) / ms;\\n\\t }\\n\\t }\\n\\t break;\\n\\t case \\\"transform\\\":\\n\\t var _ = element._,\\n\\t eq = equaliseTransform(_[attr], to[attr]);\\n\\t if (eq) {\\n\\t from[attr] = eq.from;\\n\\t to[attr] = eq.to;\\n\\t diff[attr] = [];\\n\\t diff[attr].real = true;\\n\\t for (i = 0, ii = from[attr].length; i < ii; i++) {\\n\\t diff[attr][i] = [from[attr][i][0]];\\n\\t for (j = 1, jj = from[attr][i].length; j < jj; j++) {\\n\\t diff[attr][i][j] = (to[attr][i][j] - from[attr][i][j]) / ms;\\n\\t }\\n\\t }\\n\\t } else {\\n\\t var m = (element.matrix || new Matrix),\\n\\t to2 = {\\n\\t _: {transform: _.transform},\\n\\t getBBox: function () {\\n\\t return element.getBBox(1);\\n\\t }\\n\\t };\\n\\t from[attr] = [\\n\\t m.a,\\n\\t m.b,\\n\\t m.c,\\n\\t m.d,\\n\\t m.e,\\n\\t m.f\\n\\t ];\\n\\t extractTransform(to2, to[attr]);\\n\\t to[attr] = to2._.transform;\\n\\t diff[attr] = [\\n\\t (to2.matrix.a - m.a) / ms,\\n\\t (to2.matrix.b - m.b) / ms,\\n\\t (to2.matrix.c - m.c) / ms,\\n\\t (to2.matrix.d - m.d) / ms,\\n\\t (to2.matrix.e - m.e) / ms,\\n\\t (to2.matrix.f - m.f) / ms\\n\\t ];\\n\\t // from[attr] = [_.sx, _.sy, _.deg, _.dx, _.dy];\\n\\t // var to2 = {_:{}, getBBox: function () { return element.getBBox(); }};\\n\\t // extractTransform(to2, to[attr]);\\n\\t // diff[attr] = [\\n\\t // (to2._.sx - _.sx) / ms,\\n\\t // (to2._.sy - _.sy) / ms,\\n\\t // (to2._.deg - _.deg) / ms,\\n\\t // (to2._.dx - _.dx) / ms,\\n\\t // (to2._.dy - _.dy) / ms\\n\\t // ];\\n\\t }\\n\\t break;\\n\\t case \\\"csv\\\":\\n\\t var values = Str(params[attr])[split](separator),\\n\\t from2 = Str(from[attr])[split](separator);\\n\\t if (attr == \\\"clip-rect\\\") {\\n\\t from[attr] = from2;\\n\\t diff[attr] = [];\\n\\t i = from2.length;\\n\\t while (i--) {\\n\\t diff[attr][i] = (values[i] - from[attr][i]) / ms;\\n\\t }\\n\\t }\\n\\t to[attr] = values;\\n\\t break;\\n\\t default:\\n\\t values = [][concat](params[attr]);\\n\\t from2 = [][concat](from[attr]);\\n\\t diff[attr] = [];\\n\\t i = element.paper.customAttributes[attr].length;\\n\\t while (i--) {\\n\\t diff[attr][i] = ((values[i] || 0) - (from2[i] || 0)) / ms;\\n\\t }\\n\\t break;\\n\\t }\\n\\t }\\n\\t }\\n\\t var easing = params.easing,\\n\\t easyeasy = R.easing_formulas[easing];\\n\\t if (!easyeasy) {\\n\\t easyeasy = Str(easing).match(bezierrg);\\n\\t if (easyeasy && easyeasy.length == 5) {\\n\\t var curve = easyeasy;\\n\\t easyeasy = function (t) {\\n\\t return CubicBezierAtTime(t, +curve[1], +curve[2], +curve[3], +curve[4], ms);\\n\\t };\\n\\t } else {\\n\\t easyeasy = pipe;\\n\\t }\\n\\t }\\n\\t timestamp = params.start || anim.start || +new Date;\\n\\t e = {\\n\\t anim: anim,\\n\\t percent: percent,\\n\\t timestamp: timestamp,\\n\\t start: timestamp + (anim.del || 0),\\n\\t status: 0,\\n\\t initstatus: status || 0,\\n\\t stop: false,\\n\\t ms: ms,\\n\\t easing: easyeasy,\\n\\t from: from,\\n\\t diff: diff,\\n\\t to: to,\\n\\t el: element,\\n\\t callback: params.callback,\\n\\t prev: prev,\\n\\t next: next,\\n\\t repeat: times || anim.times,\\n\\t origin: element.attr(),\\n\\t totalOrigin: totalOrigin\\n\\t };\\n\\t animationElements.push(e);\\n\\t if (status && !isInAnim && !isInAnimSet) {\\n\\t e.stop = true;\\n\\t e.start = new Date - ms * status;\\n\\t if (animationElements.length == 1) {\\n\\t return animation();\\n\\t }\\n\\t }\\n\\t if (isInAnimSet) {\\n\\t e.start = new Date - e.ms * status;\\n\\t }\\n\\t animationElements.length == 1 && requestAnimFrame(animation);\\n\\t } else {\\n\\t isInAnim.initstatus = status;\\n\\t isInAnim.start = new Date - isInAnim.ms * status;\\n\\t }\\n\\t eve(\\\"raphael.anim.start.\\\" + element.id, element, anim);\\n\\t }\\n\\t /*\\\\\\n\\t * Raphael.animation\\n\\t [ method ]\\n\\t **\\n\\t * Creates an animation object that can be passed to the @Element.animate or @Element.animateWith methods.\\n\\t * See also @Animation.delay and @Animation.repeat methods.\\n\\t **\\n\\t > Parameters\\n\\t **\\n\\t - params (object) final attributes for the element, see also @Element.attr\\n\\t - ms (number) number of milliseconds for animation to run\\n\\t - easing (string) #optional easing type. Accept one of @Raphael.easing_formulas or CSS format: `cubic‐bezier(XX, XX, XX, XX)`\\n\\t - callback (function) #optional callback function. Will be called at the end of animation.\\n\\t **\\n\\t = (object) @Animation\\n\\t \\\\*/\\n\\t R.animation = function (params, ms, easing, callback) {\\n\\t if (params instanceof Animation) {\\n\\t return params;\\n\\t }\\n\\t if (R.is(easing, \\\"function\\\") || !easing) {\\n\\t callback = callback || easing || null;\\n\\t easing = null;\\n\\t }\\n\\t params = Object(params);\\n\\t ms = +ms || 0;\\n\\t var p = {},\\n\\t json,\\n\\t attr;\\n\\t for (attr in params) if (params[has](attr) && toFloat(attr) != attr && toFloat(attr) + \\\"%\\\" != attr) {\\n\\t json = true;\\n\\t p[attr] = params[attr];\\n\\t }\\n\\t if (!json) {\\n\\t // if percent-like syntax is used and end-of-all animation callback used\\n\\t if(callback){\\n\\t // find the last one\\n\\t var lastKey = 0;\\n\\t for(var i in params){\\n\\t var percent = toInt(i);\\n\\t if(params[has](i) && percent > lastKey){\\n\\t lastKey = percent;\\n\\t }\\n\\t }\\n\\t lastKey += '%';\\n\\t // if already defined callback in the last keyframe, skip\\n\\t !params[lastKey].callback && (params[lastKey].callback = callback);\\n\\t }\\n\\t return new Animation(params, ms);\\n\\t } else {\\n\\t easing && (p.easing = easing);\\n\\t callback && (p.callback = callback);\\n\\t return new Animation({100: p}, ms);\\n\\t }\\n\\t };\\n\\t /*\\\\\\n\\t * Element.animate\\n\\t [ method ]\\n\\t **\\n\\t * Creates and starts animation for given element.\\n\\t **\\n\\t > Parameters\\n\\t **\\n\\t - params (object) final attributes for the element, see also @Element.attr\\n\\t - ms (number) number of milliseconds for animation to run\\n\\t - easing (string) #optional easing type. Accept one of @Raphael.easing_formulas or CSS format: `cubic‐bezier(XX, XX, XX, XX)`\\n\\t - callback (function) #optional callback function. Will be called at the end of animation.\\n\\t * or\\n\\t - animation (object) animation object, see @Raphael.animation\\n\\t **\\n\\t = (object) original element\\n\\t \\\\*/\\n\\t elproto.animate = function (params, ms, easing, callback) {\\n\\t var element = this;\\n\\t if (element.removed) {\\n\\t callback && callback.call(element);\\n\\t return element;\\n\\t }\\n\\t var anim = params instanceof Animation ? params : R.animation(params, ms, easing, callback);\\n\\t runAnimation(anim, element, anim.percents[0], null, element.attr());\\n\\t return element;\\n\\t };\\n\\t /*\\\\\\n\\t * Element.setTime\\n\\t [ method ]\\n\\t **\\n\\t * Sets the status of animation of the element in milliseconds. Similar to @Element.status method.\\n\\t **\\n\\t > Parameters\\n\\t **\\n\\t - anim (object) animation object\\n\\t - value (number) number of milliseconds from the beginning of the animation\\n\\t **\\n\\t = (object) original element if `value` is specified\\n\\t * Note, that during animation following events are triggered:\\n\\t *\\n\\t * On each animation frame event `anim.frame.<id>`, on start `anim.start.<id>` and on end `anim.finish.<id>`.\\n\\t \\\\*/\\n\\t elproto.setTime = function (anim, value) {\\n\\t if (anim && value != null) {\\n\\t this.status(anim, mmin(value, anim.ms) / anim.ms);\\n\\t }\\n\\t return this;\\n\\t };\\n\\t /*\\\\\\n\\t * Element.status\\n\\t [ method ]\\n\\t **\\n\\t * Gets or sets the status of animation of the element.\\n\\t **\\n\\t > Parameters\\n\\t **\\n\\t - anim (object) #optional animation object\\n\\t - value (number) #optional 0 – 1. If specified, method works like a setter and sets the status of a given animation to the value. This will cause animation to jump to the given position.\\n\\t **\\n\\t = (number) status\\n\\t * or\\n\\t = (array) status if `anim` is not specified. Array of objects in format:\\n\\t o {\\n\\t o anim: (object) animation object\\n\\t o status: (number) status\\n\\t o }\\n\\t * or\\n\\t = (object) original element if `value` is specified\\n\\t \\\\*/\\n\\t elproto.status = function (anim, value) {\\n\\t var out = [],\\n\\t i = 0,\\n\\t len,\\n\\t e;\\n\\t if (value != null) {\\n\\t runAnimation(anim, this, -1, mmin(value, 1));\\n\\t return this;\\n\\t } else {\\n\\t len = animationElements.length;\\n\\t for (; i < len; i++) {\\n\\t e = animationElements[i];\\n\\t if (e.el.id == this.id && (!anim || e.anim == anim)) {\\n\\t if (anim) {\\n\\t return e.status;\\n\\t }\\n\\t out.push({\\n\\t anim: e.anim,\\n\\t status: e.status\\n\\t });\\n\\t }\\n\\t }\\n\\t if (anim) {\\n\\t return 0;\\n\\t }\\n\\t return out;\\n\\t }\\n\\t };\\n\\t /*\\\\\\n\\t * Element.pause\\n\\t [ method ]\\n\\t **\\n\\t * Stops animation of the element with ability to resume it later on.\\n\\t **\\n\\t > Parameters\\n\\t **\\n\\t - anim (object) #optional animation object\\n\\t **\\n\\t = (object) original element\\n\\t \\\\*/\\n\\t elproto.pause = function (anim) {\\n\\t for (var i = 0; i < animationElements.length; i++) if (animationElements[i].el.id == this.id && (!anim || animationElements[i].anim == anim)) {\\n\\t if (eve(\\\"raphael.anim.pause.\\\" + this.id, this, animationElements[i].anim) !== false) {\\n\\t animationElements[i].paused = true;\\n\\t }\\n\\t }\\n\\t return this;\\n\\t };\\n\\t /*\\\\\\n\\t * Element.resume\\n\\t [ method ]\\n\\t **\\n\\t * Resumes animation if it was paused with @Element.pause method.\\n\\t **\\n\\t > Parameters\\n\\t **\\n\\t - anim (object) #optional animation object\\n\\t **\\n\\t = (object) original element\\n\\t \\\\*/\\n\\t elproto.resume = function (anim) {\\n\\t for (var i = 0; i < animationElements.length; i++) if (animationElements[i].el.id == this.id && (!anim || animationElements[i].anim == anim)) {\\n\\t var e = animationElements[i];\\n\\t if (eve(\\\"raphael.anim.resume.\\\" + this.id, this, e.anim) !== false) {\\n\\t delete e.paused;\\n\\t this.status(e.anim, e.status);\\n\\t }\\n\\t }\\n\\t return this;\\n\\t };\\n\\t /*\\\\\\n\\t * Element.stop\\n\\t [ method ]\\n\\t **\\n\\t * Stops animation of the element.\\n\\t **\\n\\t > Parameters\\n\\t **\\n\\t - anim (object) #optional animation object\\n\\t **\\n\\t = (object) original element\\n\\t \\\\*/\\n\\t elproto.stop = function (anim) {\\n\\t for (var i = 0; i < animationElements.length; i++) if (animationElements[i].el.id == this.id && (!anim || animationElements[i].anim == anim)) {\\n\\t if (eve(\\\"raphael.anim.stop.\\\" + this.id, this, animationElements[i].anim) !== false) {\\n\\t animationElements.splice(i--, 1);\\n\\t }\\n\\t }\\n\\t return this;\\n\\t };\\n\\t function stopAnimation(paper) {\\n\\t for (var i = 0; i < animationElements.length; i++) if (animationElements[i].el.paper == paper) {\\n\\t animationElements.splice(i--, 1);\\n\\t }\\n\\t }\\n\\t eve.on(\\\"raphael.remove\\\", stopAnimation);\\n\\t eve.on(\\\"raphael.clear\\\", stopAnimation);\\n\\t elproto.toString = function () {\\n\\t return \\\"Rapha\\\\xebl\\\\u2019s object\\\";\\n\\t };\\n\\n\\t // Set\\n\\t var Set = function (items) {\\n\\t this.items = [];\\n\\t this.length = 0;\\n\\t this.type = \\\"set\\\";\\n\\t if (items) {\\n\\t for (var i = 0, ii = items.length; i < ii; i++) {\\n\\t if (items[i] && (items[i].constructor == elproto.constructor || items[i].constructor == Set)) {\\n\\t this[this.items.length] = this.items[this.items.length] = items[i];\\n\\t this.length++;\\n\\t }\\n\\t }\\n\\t }\\n\\t },\\n\\t setproto = Set.prototype;\\n\\t /*\\\\\\n\\t * Set.push\\n\\t [ method ]\\n\\t **\\n\\t * Adds each argument to the current set.\\n\\t = (object) original element\\n\\t \\\\*/\\n\\t setproto.push = function () {\\n\\t var item,\\n\\t len;\\n\\t for (var i = 0, ii = arguments.length; i < ii; i++) {\\n\\t item = arguments[i];\\n\\t if (item && (item.constructor == elproto.constructor || item.constructor == Set)) {\\n\\t len = this.items.length;\\n\\t this[len] = this.items[len] = item;\\n\\t this.length++;\\n\\t }\\n\\t }\\n\\t return this;\\n\\t };\\n\\t /*\\\\\\n\\t * Set.pop\\n\\t [ method ]\\n\\t **\\n\\t * Removes last element and returns it.\\n\\t = (object) element\\n\\t \\\\*/\\n\\t setproto.pop = function () {\\n\\t this.length && delete this[this.length--];\\n\\t return this.items.pop();\\n\\t };\\n\\t /*\\\\\\n\\t * Set.forEach\\n\\t [ method ]\\n\\t **\\n\\t * Executes given function for each element in the set.\\n\\t *\\n\\t * If function returns `false` it will stop loop running.\\n\\t **\\n\\t > Parameters\\n\\t **\\n\\t - callback (function) function to run\\n\\t - thisArg (object) context object for the callback\\n\\t = (object) Set object\\n\\t \\\\*/\\n\\t setproto.forEach = function (callback, thisArg) {\\n\\t for (var i = 0, ii = this.items.length; i < ii; i++) {\\n\\t if (callback.call(thisArg, this.items[i], i) === false) {\\n\\t return this;\\n\\t }\\n\\t }\\n\\t return this;\\n\\t };\\n\\t for (var method in elproto) if (elproto[has](method)) {\\n\\t setproto[method] = (function (methodname) {\\n\\t return function () {\\n\\t var arg = arguments;\\n\\t return this.forEach(function (el) {\\n\\t el[methodname][apply](el, arg);\\n\\t });\\n\\t };\\n\\t })(method);\\n\\t }\\n\\t setproto.attr = function (name, value) {\\n\\t if (name && R.is(name, array) && R.is(name[0], \\\"object\\\")) {\\n\\t for (var j = 0, jj = name.length; j < jj; j++) {\\n\\t this.items[j].attr(name[j]);\\n\\t }\\n\\t } else {\\n\\t for (var i = 0, ii = this.items.length; i < ii; i++) {\\n\\t this.items[i].attr(name, value);\\n\\t }\\n\\t }\\n\\t return this;\\n\\t };\\n\\t /*\\\\\\n\\t * Set.clear\\n\\t [ method ]\\n\\t **\\n\\t * Removes all elements from the set\\n\\t \\\\*/\\n\\t setproto.clear = function () {\\n\\t while (this.length) {\\n\\t this.pop();\\n\\t }\\n\\t };\\n\\t /*\\\\\\n\\t * Set.splice\\n\\t [ method ]\\n\\t **\\n\\t * Removes given element from the set\\n\\t **\\n\\t > Parameters\\n\\t **\\n\\t - index (number) position of the deletion\\n\\t - count (number) number of element to remove\\n\\t - insertion… (object) #optional elements to insert\\n\\t = (object) set elements that were deleted\\n\\t \\\\*/\\n\\t setproto.splice = function (index, count, insertion) {\\n\\t index = index < 0 ? mmax(this.length + index, 0) : index;\\n\\t count = mmax(0, mmin(this.length - index, count));\\n\\t var tail = [],\\n\\t todel = [],\\n\\t args = [],\\n\\t i;\\n\\t for (i = 2; i < arguments.length; i++) {\\n\\t args.push(arguments[i]);\\n\\t }\\n\\t for (i = 0; i < count; i++) {\\n\\t todel.push(this[index + i]);\\n\\t }\\n\\t for (; i < this.length - index; i++) {\\n\\t tail.push(this[index + i]);\\n\\t }\\n\\t var arglen = args.length;\\n\\t for (i = 0; i < arglen + tail.length; i++) {\\n\\t this.items[index + i] = this[index + i] = i < arglen ? args[i] : tail[i - arglen];\\n\\t }\\n\\t i = this.items.length = this.length -= count - arglen;\\n\\t while (this[i]) {\\n\\t delete this[i++];\\n\\t }\\n\\t return new Set(todel);\\n\\t };\\n\\t /*\\\\\\n\\t * Set.exclude\\n\\t [ method ]\\n\\t **\\n\\t * Removes given element from the set\\n\\t **\\n\\t > Parameters\\n\\t **\\n\\t - element (object) element to remove\\n\\t = (boolean) `true` if object was found & removed from the set\\n\\t \\\\*/\\n\\t setproto.exclude = function (el) {\\n\\t for (var i = 0, ii = this.length; i < ii; i++) if (this[i] == el) {\\n\\t this.splice(i, 1);\\n\\t return true;\\n\\t }\\n\\t };\\n\\t setproto.animate = function (params, ms, easing, callback) {\\n\\t (R.is(easing, \\\"function\\\") || !easing) && (callback = easing || null);\\n\\t var len = this.items.length,\\n\\t i = len,\\n\\t item,\\n\\t set = this,\\n\\t collector;\\n\\t if (!len) {\\n\\t return this;\\n\\t }\\n\\t callback && (collector = function () {\\n\\t !--len && callback.call(set);\\n\\t });\\n\\t easing = R.is(easing, string) ? easing : collector;\\n\\t var anim = R.animation(params, ms, easing, collector);\\n\\t item = this.items[--i].animate(anim);\\n\\t while (i--) {\\n\\t this.items[i] && !this.items[i].removed && this.items[i].animateWith(item, anim, anim);\\n\\t (this.items[i] && !this.items[i].removed) || len--;\\n\\t }\\n\\t return this;\\n\\t };\\n\\t setproto.insertAfter = function (el) {\\n\\t var i = this.items.length;\\n\\t while (i--) {\\n\\t this.items[i].insertAfter(el);\\n\\t }\\n\\t return this;\\n\\t };\\n\\t setproto.getBBox = function () {\\n\\t var x = [],\\n\\t y = [],\\n\\t x2 = [],\\n\\t y2 = [];\\n\\t for (var i = this.items.length; i--;) if (!this.items[i].removed) {\\n\\t var box = this.items[i].getBBox();\\n\\t x.push(box.x);\\n\\t y.push(box.y);\\n\\t x2.push(box.x + box.width);\\n\\t y2.push(box.y + box.height);\\n\\t }\\n\\t x = mmin[apply](0, x);\\n\\t y = mmin[apply](0, y);\\n\\t x2 = mmax[apply](0, x2);\\n\\t y2 = mmax[apply](0, y2);\\n\\t return {\\n\\t x: x,\\n\\t y: y,\\n\\t x2: x2,\\n\\t y2: y2,\\n\\t width: x2 - x,\\n\\t height: y2 - y\\n\\t };\\n\\t };\\n\\t setproto.clone = function (s) {\\n\\t s = this.paper.set();\\n\\t for (var i = 0, ii = this.items.length; i < ii; i++) {\\n\\t s.push(this.items[i].clone());\\n\\t }\\n\\t return s;\\n\\t };\\n\\t setproto.toString = function () {\\n\\t return \\\"Rapha\\\\xebl\\\\u2018s set\\\";\\n\\t };\\n\\n\\t setproto.glow = function(glowConfig) {\\n\\t var ret = this.paper.set();\\n\\t this.forEach(function(shape, index){\\n\\t var g = shape.glow(glowConfig);\\n\\t if(g != null){\\n\\t g.forEach(function(shape2, index2){\\n\\t ret.push(shape2);\\n\\t });\\n\\t }\\n\\t });\\n\\t return ret;\\n\\t };\\n\\n\\n\\t /*\\\\\\n\\t * Set.isPointInside\\n\\t [ method ]\\n\\t **\\n\\t * Determine if given point is inside this set’s elements\\n\\t **\\n\\t > Parameters\\n\\t **\\n\\t - x (number) x coordinate of the point\\n\\t - y (number) y coordinate of the point\\n\\t = (boolean) `true` if point is inside any of the set's elements\\n\\t \\\\*/\\n\\t setproto.isPointInside = function (x, y) {\\n\\t var isPointInside = false;\\n\\t this.forEach(function (el) {\\n\\t if (el.isPointInside(x, y)) {\\n\\t isPointInside = true;\\n\\t return false; // stop loop\\n\\t }\\n\\t });\\n\\t return isPointInside;\\n\\t };\\n\\n\\t /*\\\\\\n\\t * Raphael.registerFont\\n\\t [ method ]\\n\\t **\\n\\t * Adds given font to the registered set of fonts for Raphaël. Should be used as an internal call from within Cufón’s font file.\\n\\t * Returns original parameter, so it could be used with chaining.\\n\\t # <a href=\\\"http://wiki.github.com/sorccu/cufon/about\\\">More about Cufón and how to convert your font form TTF, OTF, etc to JavaScript file.</a>\\n\\t **\\n\\t > Parameters\\n\\t **\\n\\t - font (object) the font to register\\n\\t = (object) the font you passed in\\n\\t > Usage\\n\\t | Cufon.registerFont(Raphael.registerFont({…}));\\n\\t \\\\*/\\n\\t R.registerFont = function (font) {\\n\\t if (!font.face) {\\n\\t return font;\\n\\t }\\n\\t this.fonts = this.fonts || {};\\n\\t var fontcopy = {\\n\\t w: font.w,\\n\\t face: {},\\n\\t glyphs: {}\\n\\t },\\n\\t family = font.face[\\\"font-family\\\"];\\n\\t for (var prop in font.face) if (font.face[has](prop)) {\\n\\t fontcopy.face[prop] = font.face[prop];\\n\\t }\\n\\t if (this.fonts[family]) {\\n\\t this.fonts[family].push(fontcopy);\\n\\t } else {\\n\\t this.fonts[family] = [fontcopy];\\n\\t }\\n\\t if (!font.svg) {\\n\\t fontcopy.face[\\\"units-per-em\\\"] = toInt(font.face[\\\"units-per-em\\\"], 10);\\n\\t for (var glyph in font.glyphs) if (font.glyphs[has](glyph)) {\\n\\t var path = font.glyphs[glyph];\\n\\t fontcopy.glyphs[glyph] = {\\n\\t w: path.w,\\n\\t k: {},\\n\\t d: path.d && \\\"M\\\" + path.d.replace(/[mlcxtrv]/g, function (command) {\\n\\t return {l: \\\"L\\\", c: \\\"C\\\", x: \\\"z\\\", t: \\\"m\\\", r: \\\"l\\\", v: \\\"c\\\"}[command] || \\\"M\\\";\\n\\t }) + \\\"z\\\"\\n\\t };\\n\\t if (path.k) {\\n\\t for (var k in path.k) if (path[has](k)) {\\n\\t fontcopy.glyphs[glyph].k[k] = path.k[k];\\n\\t }\\n\\t }\\n\\t }\\n\\t }\\n\\t return font;\\n\\t };\\n\\t /*\\\\\\n\\t * Paper.getFont\\n\\t [ method ]\\n\\t **\\n\\t * Finds font object in the registered fonts by given parameters. You could specify only one word from the font name, like “Myriad” for “Myriad Pro”.\\n\\t **\\n\\t > Parameters\\n\\t **\\n\\t - family (string) font family name or any word from it\\n\\t - weight (string) #optional font weight\\n\\t - style (string) #optional font style\\n\\t - stretch (string) #optional font stretch\\n\\t = (object) the font object\\n\\t > Usage\\n\\t | paper.print(100, 100, \\\"Test string\\\", paper.getFont(\\\"Times\\\", 800), 30);\\n\\t \\\\*/\\n\\t paperproto.getFont = function (family, weight, style, stretch) {\\n\\t stretch = stretch || \\\"normal\\\";\\n\\t style = style || \\\"normal\\\";\\n\\t weight = +weight || {normal: 400, bold: 700, lighter: 300, bolder: 800}[weight] || 400;\\n\\t if (!R.fonts) {\\n\\t return;\\n\\t }\\n\\t var font = R.fonts[family];\\n\\t if (!font) {\\n\\t var name = new RegExp(\\\"(^|\\\\\\\\s)\\\" + family.replace(/[^\\\\w\\\\d\\\\s+!~.:_-]/g, E) + \\\"(\\\\\\\\s|$)\\\", \\\"i\\\");\\n\\t for (var fontName in R.fonts) if (R.fonts[has](fontName)) {\\n\\t if (name.test(fontName)) {\\n\\t font = R.fonts[fontName];\\n\\t break;\\n\\t }\\n\\t }\\n\\t }\\n\\t var thefont;\\n\\t if (font) {\\n\\t for (var i = 0, ii = font.length; i < ii; i++) {\\n\\t thefont = font[i];\\n\\t if (thefont.face[\\\"font-weight\\\"] == weight && (thefont.face[\\\"font-style\\\"] == style || !thefont.face[\\\"font-style\\\"]) && thefont.face[\\\"font-stretch\\\"] == stretch) {\\n\\t break;\\n\\t }\\n\\t }\\n\\t }\\n\\t return thefont;\\n\\t };\\n\\t /*\\\\\\n\\t * Paper.print\\n\\t [ method ]\\n\\t **\\n\\t * Creates path that represent given text written using given font at given position with given size.\\n\\t * Result of the method is path element that contains whole text as a separate path.\\n\\t **\\n\\t > Parameters\\n\\t **\\n\\t - x (number) x position of the text\\n\\t - y (number) y position of the text\\n\\t - string (string) text to print\\n\\t - font (object) font object, see @Paper.getFont\\n\\t - size (number) #optional size of the font, default is `16`\\n\\t - origin (string) #optional could be `\\\"baseline\\\"` or `\\\"middle\\\"`, default is `\\\"middle\\\"`\\n\\t - letter_spacing (number) #optional number in range `-1..1`, default is `0`\\n\\t - line_spacing (number) #optional number in range `1..3`, default is `1`\\n\\t = (object) resulting path element, which consist of all letters\\n\\t > Usage\\n\\t | var txt = r.print(10, 50, \\\"print\\\", r.getFont(\\\"Museo\\\"), 30).attr({fill: \\\"#fff\\\"});\\n\\t \\\\*/\\n\\t paperproto.print = function (x, y, string, font, size, origin, letter_spacing, line_spacing) {\\n\\t origin = origin || \\\"middle\\\"; // baseline|middle\\n\\t letter_spacing = mmax(mmin(letter_spacing || 0, 1), -1);\\n\\t line_spacing = mmax(mmin(line_spacing || 1, 3), 1);\\n\\t var letters = Str(string)[split](E),\\n\\t shift = 0,\\n\\t notfirst = 0,\\n\\t path = E,\\n\\t scale;\\n\\t R.is(font, \\\"string\\\") && (font = this.getFont(font));\\n\\t if (font) {\\n\\t scale = (size || 16) / font.face[\\\"units-per-em\\\"];\\n\\t var bb = font.face.bbox[split](separator),\\n\\t top = +bb[0],\\n\\t lineHeight = bb[3] - bb[1],\\n\\t shifty = 0,\\n\\t height = +bb[1] + (origin == \\\"baseline\\\" ? lineHeight + (+font.face.descent) : lineHeight / 2);\\n\\t for (var i = 0, ii = letters.length; i < ii; i++) {\\n\\t if (letters[i] == \\\"\\\\n\\\") {\\n\\t shift = 0;\\n\\t curr = 0;\\n\\t notfirst = 0;\\n\\t shifty += lineHeight * line_spacing;\\n\\t } else {\\n\\t var prev = notfirst && font.glyphs[letters[i - 1]] || {},\\n\\t curr = font.glyphs[letters[i]];\\n\\t shift += notfirst ? (prev.w || font.w) + (prev.k && prev.k[letters[i]] || 0) + (font.w * letter_spacing) : 0;\\n\\t notfirst = 1;\\n\\t }\\n\\t if (curr && curr.d) {\\n\\t path += R.transformPath(curr.d, [\\\"t\\\", shift * scale, shifty * scale, \\\"s\\\", scale, scale, top, height, \\\"t\\\", (x - top) / scale, (y - height) / scale]);\\n\\t }\\n\\t }\\n\\t }\\n\\t return this.path(path).attr({\\n\\t fill: \\\"#000\\\",\\n\\t stroke: \\\"none\\\"\\n\\t });\\n\\t };\\n\\n\\t /*\\\\\\n\\t * Paper.add\\n\\t [ method ]\\n\\t **\\n\\t * Imports elements in JSON array in format `{type: type, <attributes>}`\\n\\t **\\n\\t > Parameters\\n\\t **\\n\\t - json (array)\\n\\t = (object) resulting set of imported elements\\n\\t > Usage\\n\\t | paper.add([\\n\\t | {\\n\\t | type: \\\"circle\\\",\\n\\t | cx: 10,\\n\\t | cy: 10,\\n\\t | r: 5\\n\\t | },\\n\\t | {\\n\\t | type: \\\"rect\\\",\\n\\t | x: 10,\\n\\t | y: 10,\\n\\t | width: 10,\\n\\t | height: 10,\\n\\t | fill: \\\"#fc0\\\"\\n\\t | }\\n\\t | ]);\\n\\t \\\\*/\\n\\t paperproto.add = function (json) {\\n\\t if (R.is(json, \\\"array\\\")) {\\n\\t var res = this.set(),\\n\\t i = 0,\\n\\t ii = json.length,\\n\\t j;\\n\\t for (; i < ii; i++) {\\n\\t j = json[i] || {};\\n\\t elements[has](j.type) && res.push(this[j.type]().attr(j));\\n\\t }\\n\\t }\\n\\t return res;\\n\\t };\\n\\n\\t /*\\\\\\n\\t * Raphael.format\\n\\t [ method ]\\n\\t **\\n\\t * Simple format function. Replaces construction of type “`{<number>}`” to the corresponding argument.\\n\\t **\\n\\t > Parameters\\n\\t **\\n\\t - token (string) string to format\\n\\t - … (string) rest of arguments will be treated as parameters for replacement\\n\\t = (string) formated string\\n\\t > Usage\\n\\t | var x = 10,\\n\\t | y = 20,\\n\\t | width = 40,\\n\\t | height = 50;\\n\\t | // this will draw a rectangular shape equivalent to \\\"M10,20h40v50h-40z\\\"\\n\\t | paper.path(Raphael.format(\\\"M{0},{1}h{2}v{3}h{4}z\\\", x, y, width, height, -width));\\n\\t \\\\*/\\n\\t R.format = function (token, params) {\\n\\t var args = R.is(params, array) ? [0][concat](params) : arguments;\\n\\t token && R.is(token, string) && args.length - 1 && (token = token.replace(formatrg, function (str, i) {\\n\\t return args[++i] == null ? E : args[i];\\n\\t }));\\n\\t return token || E;\\n\\t };\\n\\t /*\\\\\\n\\t * Raphael.fullfill\\n\\t [ method ]\\n\\t **\\n\\t * A little bit more advanced format function than @Raphael.format. Replaces construction of type “`{<name>}`” to the corresponding argument.\\n\\t **\\n\\t > Parameters\\n\\t **\\n\\t - token (string) string to format\\n\\t - json (object) object which properties will be used as a replacement\\n\\t = (string) formated string\\n\\t > Usage\\n\\t | // this will draw a rectangular shape equivalent to \\\"M10,20h40v50h-40z\\\"\\n\\t | paper.path(Raphael.fullfill(\\\"M{x},{y}h{dim.width}v{dim.height}h{dim['negative width']}z\\\", {\\n\\t | x: 10,\\n\\t | y: 20,\\n\\t | dim: {\\n\\t | width: 40,\\n\\t | height: 50,\\n\\t | \\\"negative width\\\": -40\\n\\t | }\\n\\t | }));\\n\\t \\\\*/\\n\\t R.fullfill = (function () {\\n\\t var tokenRegex = /\\\\{([^\\\\}]+)\\\\}/g,\\n\\t objNotationRegex = /(?:(?:^|\\\\.)(.+?)(?=\\\\[|\\\\.|$|\\\\()|\\\\[('|\\\")(.+?)\\\\2\\\\])(\\\\(\\\\))?/g, // matches .xxxxx or [\\\"xxxxx\\\"] to run over object properties\\n\\t replacer = function (all, key, obj) {\\n\\t var res = obj;\\n\\t key.replace(objNotationRegex, function (all, name, quote, quotedName, isFunc) {\\n\\t name = name || quotedName;\\n\\t if (res) {\\n\\t if (name in res) {\\n\\t res = res[name];\\n\\t }\\n\\t typeof res == \\\"function\\\" && isFunc && (res = res());\\n\\t }\\n\\t });\\n\\t res = (res == null || res == obj ? all : res) + \\\"\\\";\\n\\t return res;\\n\\t };\\n\\t return function (str, obj) {\\n\\t return String(str).replace(tokenRegex, function (all, key) {\\n\\t return replacer(all, key, obj);\\n\\t });\\n\\t };\\n\\t })();\\n\\t /*\\\\\\n\\t * Raphael.ninja\\n\\t [ method ]\\n\\t **\\n\\t * If you want to leave no trace of Raphaël (Well, Raphaël creates only one global variable `Raphael`, but anyway.) You can use `ninja` method.\\n\\t * Beware, that in this case plugins could stop working, because they are depending on global variable existence.\\n\\t **\\n\\t = (object) Raphael object\\n\\t > Usage\\n\\t | (function (local_raphael) {\\n\\t | var paper = local_raphael(10, 10, 320, 200);\\n\\t | …\\n\\t | })(Raphael.ninja());\\n\\t \\\\*/\\n\\t R.ninja = function () {\\n\\t if (oldRaphael.was) {\\n\\t g.win.Raphael = oldRaphael.is;\\n\\t } else {\\n\\t // IE8 raises an error when deleting window property\\n\\t window.Raphael = undefined;\\n\\t try {\\n\\t delete window.Raphael;\\n\\t } catch(e) {}\\n\\t }\\n\\t return R;\\n\\t };\\n\\t /*\\\\\\n\\t * Raphael.st\\n\\t [ property (object) ]\\n\\t **\\n\\t * You can add your own method to elements and sets. It is wise to add a set method for each element method\\n\\t * you added, so you will be able to call the same method on sets too.\\n\\t **\\n\\t * See also @Raphael.el.\\n\\t > Usage\\n\\t | Raphael.el.red = function () {\\n\\t | this.attr({fill: \\\"#f00\\\"});\\n\\t | };\\n\\t | Raphael.st.red = function () {\\n\\t | this.forEach(function (el) {\\n\\t | el.red();\\n\\t | });\\n\\t | };\\n\\t | // then use it\\n\\t | paper.set(paper.circle(100, 100, 20), paper.circle(110, 100, 20)).red();\\n\\t \\\\*/\\n\\t R.st = setproto;\\n\\n\\t eve.on(\\\"raphael.DOMload\\\", function () {\\n\\t loaded = true;\\n\\t });\\n\\n\\t // Firefox <3.6 fix: http://webreflection.blogspot.com/2009/11/195-chars-to-help-lazy-loading.html\\n\\t (function (doc, loaded, f) {\\n\\t if (doc.readyState == null && doc.addEventListener){\\n\\t doc.addEventListener(loaded, f = function () {\\n\\t doc.removeEventListener(loaded, f, false);\\n\\t doc.readyState = \\\"complete\\\";\\n\\t }, false);\\n\\t doc.readyState = \\\"loading\\\";\\n\\t }\\n\\t function isLoaded() {\\n\\t (/in/).test(doc.readyState) ? setTimeout(isLoaded, 9) : R.eve(\\\"raphael.DOMload\\\");\\n\\t }\\n\\t isLoaded();\\n\\t })(document, \\\"DOMContentLoaded\\\");\\n\\n\\t return R;\\n\\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\\n\\n\\n/***/ },\\n/* 2 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;// Copyright (c) 2013 Adobe Systems Incorporated. All rights reserved.\\n\\t// \\n\\t// Licensed under the Apache License, Version 2.0 (the \\\"License\\\");\\n\\t// you may not use this file except in compliance with the License.\\n\\t// You may obtain a copy of the License at\\n\\t// \\n\\t// http://www.apache.org/licenses/LICENSE-2.0\\n\\t// \\n\\t// Unless required by applicable law or agreed to in writing, software\\n\\t// distributed under the License is distributed on an \\\"AS IS\\\" BASIS,\\n\\t// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\\n\\t// See the License for the specific language governing permissions and\\n\\t// limitations under the License.\\n\\t// ┌────────────────────────────────────────────────────────────┐ \\\\\\\\\\n\\t// │ Eve 0.4.2 - JavaScript Events Library │ \\\\\\\\\\n\\t// ├────────────────────────────────────────────────────────────┤ \\\\\\\\\\n\\t// │ Author Dmitry Baranovskiy (http://dmitry.baranovskiy.com/) │ \\\\\\\\\\n\\t// └────────────────────────────────────────────────────────────┘ \\\\\\\\\\n\\n\\t(function (glob) {\\n\\t var version = \\\"0.4.2\\\",\\n\\t has = \\\"hasOwnProperty\\\",\\n\\t separator = /[\\\\.\\\\/]/,\\n\\t wildcard = \\\"*\\\",\\n\\t fun = function () {},\\n\\t numsort = function (a, b) {\\n\\t return a - b;\\n\\t },\\n\\t current_event,\\n\\t stop,\\n\\t events = {n: {}},\\n\\t /*\\\\\\n\\t * eve\\n\\t [ method ]\\n\\n\\t * Fires event with given `name`, given scope and other parameters.\\n\\n\\t > Arguments\\n\\n\\t - name (string) name of the *event*, dot (`.`) or slash (`/`) separated\\n\\t - scope (object) context for the event handlers\\n\\t - varargs (...) the rest of arguments will be sent to event handlers\\n\\n\\t = (object) array of returned values from the listeners\\n\\t \\\\*/\\n\\t eve = function (name, scope) {\\n\\t\\t\\t\\tname = String(name);\\n\\t var e = events,\\n\\t oldstop = stop,\\n\\t args = Array.prototype.slice.call(arguments, 2),\\n\\t listeners = eve.listeners(name),\\n\\t z = 0,\\n\\t f = false,\\n\\t l,\\n\\t indexed = [],\\n\\t queue = {},\\n\\t out = [],\\n\\t ce = current_event,\\n\\t errors = [];\\n\\t current_event = name;\\n\\t stop = 0;\\n\\t for (var i = 0, ii = listeners.length; i < ii; i++) if (\\\"zIndex\\\" in listeners[i]) {\\n\\t indexed.push(listeners[i].zIndex);\\n\\t if (listeners[i].zIndex < 0) {\\n\\t queue[listeners[i].zIndex] = listeners[i];\\n\\t }\\n\\t }\\n\\t indexed.sort(numsort);\\n\\t while (indexed[z] < 0) {\\n\\t l = queue[indexed[z++]];\\n\\t out.push(l.apply(scope, args));\\n\\t if (stop) {\\n\\t stop = oldstop;\\n\\t return out;\\n\\t }\\n\\t }\\n\\t for (i = 0; i < ii; i++) {\\n\\t l = listeners[i];\\n\\t if (\\\"zIndex\\\" in l) {\\n\\t if (l.zIndex == indexed[z]) {\\n\\t out.push(l.apply(scope, args));\\n\\t if (stop) {\\n\\t break;\\n\\t }\\n\\t do {\\n\\t z++;\\n\\t l = queue[indexed[z]];\\n\\t l && out.push(l.apply(scope, args));\\n\\t if (stop) {\\n\\t break;\\n\\t }\\n\\t } while (l)\\n\\t } else {\\n\\t queue[l.zIndex] = l;\\n\\t }\\n\\t } else {\\n\\t out.push(l.apply(scope, args));\\n\\t if (stop) {\\n\\t break;\\n\\t }\\n\\t }\\n\\t }\\n\\t stop = oldstop;\\n\\t current_event = ce;\\n\\t return out.length ? out : null;\\n\\t };\\n\\t\\t\\t// Undocumented. Debug only.\\n\\t\\t\\teve._events = events;\\n\\t /*\\\\\\n\\t * eve.listeners\\n\\t [ method ]\\n\\n\\t * Internal method which gives you array of all event handlers that will be triggered by the given `name`.\\n\\n\\t > Arguments\\n\\n\\t - name (string) name of the event, dot (`.`) or slash (`/`) separated\\n\\n\\t = (array) array of event handlers\\n\\t \\\\*/\\n\\t eve.listeners = function (name) {\\n\\t var names = name.split(separator),\\n\\t e = events,\\n\\t item,\\n\\t items,\\n\\t k,\\n\\t i,\\n\\t ii,\\n\\t j,\\n\\t jj,\\n\\t nes,\\n\\t es = [e],\\n\\t out = [];\\n\\t for (i = 0, ii = names.length; i < ii; i++) {\\n\\t nes = [];\\n\\t for (j = 0, jj = es.length; j < jj; j++) {\\n\\t e = es[j].n;\\n\\t items = [e[names[i]], e[wildcard]];\\n\\t k = 2;\\n\\t while (k--) {\\n\\t item = items[k];\\n\\t if (item) {\\n\\t nes.push(item);\\n\\t out = out.concat(item.f || []);\\n\\t }\\n\\t }\\n\\t }\\n\\t es = nes;\\n\\t }\\n\\t return out;\\n\\t };\\n\\t \\n\\t /*\\\\\\n\\t * eve.on\\n\\t [ method ]\\n\\t **\\n\\t * Binds given event handler with a given name. You can use wildcards “`*`” for the names:\\n\\t | eve.on(\\\"*.under.*\\\", f);\\n\\t | eve(\\\"mouse.under.floor\\\"); // triggers f\\n\\t * Use @eve to trigger the listener.\\n\\t **\\n\\t > Arguments\\n\\t **\\n\\t - name (string) name of the event, dot (`.`) or slash (`/`) separated, with optional wildcards\\n\\t - f (function) event handler function\\n\\t **\\n\\t = (function) returned function accepts a single numeric parameter that represents z-index of the handler. It is an optional feature and only used when you need to ensure that some subset of handlers will be invoked in a given order, despite of the order of assignment. \\n\\t > Example:\\n\\t | eve.on(\\\"mouse\\\", eatIt)(2);\\n\\t | eve.on(\\\"mouse\\\", scream);\\n\\t | eve.on(\\\"mouse\\\", catchIt)(1);\\n\\t * This will ensure that `catchIt()` function will be called before `eatIt()`.\\n\\t\\t *\\n\\t * If you want to put your handler before non-indexed handlers, specify a negative value.\\n\\t * Note: I assume most of the time you don’t need to worry about z-index, but it’s nice to have this feature “just in case”.\\n\\t \\\\*/\\n\\t eve.on = function (name, f) {\\n\\t\\t\\tname = String(name);\\n\\t\\t\\tif (typeof f != \\\"function\\\") {\\n\\t\\t\\t\\treturn function () {};\\n\\t\\t\\t}\\n\\t var names = name.split(separator),\\n\\t e = events;\\n\\t for (var i = 0, ii = names.length; i < ii; i++) {\\n\\t e = e.n;\\n\\t e = e.hasOwnProperty(names[i]) && e[names[i]] || (e[names[i]] = {n: {}});\\n\\t }\\n\\t e.f = e.f || [];\\n\\t for (i = 0, ii = e.f.length; i < ii; i++) if (e.f[i] == f) {\\n\\t return fun;\\n\\t }\\n\\t e.f.push(f);\\n\\t return function (zIndex) {\\n\\t if (+zIndex == +zIndex) {\\n\\t f.zIndex = +zIndex;\\n\\t }\\n\\t };\\n\\t };\\n\\t /*\\\\\\n\\t * eve.f\\n\\t [ method ]\\n\\t **\\n\\t * Returns function that will fire given event with optional arguments.\\n\\t\\t * Arguments that will be passed to the result function will be also\\n\\t\\t * concated to the list of final arguments.\\n\\t \\t | el.onclick = eve.f(\\\"click\\\", 1, 2);\\n\\t \\t | eve.on(\\\"click\\\", function (a, b, c) {\\n\\t \\t | console.log(a, b, c); // 1, 2, [event object]\\n\\t \\t | });\\n\\t > Arguments\\n\\t\\t - event (string) event name\\n\\t\\t - varargs (…) and any other arguments\\n\\t\\t = (function) possible event handler function\\n\\t \\\\*/\\n\\t\\teve.f = function (event) {\\n\\t\\t\\tvar attrs = [].slice.call(arguments, 1);\\n\\t\\t\\treturn function () {\\n\\t\\t\\t\\teve.apply(null, [event, null].concat(attrs).concat([].slice.call(arguments, 0)));\\n\\t\\t\\t};\\n\\t\\t};\\n\\t /*\\\\\\n\\t * eve.stop\\n\\t [ method ]\\n\\t **\\n\\t * Is used inside an event handler to stop the event, preventing any subsequent listeners from firing.\\n\\t \\\\*/\\n\\t eve.stop = function () {\\n\\t stop = 1;\\n\\t };\\n\\t /*\\\\\\n\\t * eve.nt\\n\\t [ method ]\\n\\t **\\n\\t * Could be used inside event handler to figure out actual name of the event.\\n\\t **\\n\\t > Arguments\\n\\t **\\n\\t - subname (string) #optional subname of the event\\n\\t **\\n\\t = (string) name of the event, if `subname` is not specified\\n\\t * or\\n\\t = (boolean) `true`, if current event’s name contains `subname`\\n\\t \\\\*/\\n\\t eve.nt = function (subname) {\\n\\t if (subname) {\\n\\t return new RegExp(\\\"(?:\\\\\\\\.|\\\\\\\\/|^)\\\" + subname + \\\"(?:\\\\\\\\.|\\\\\\\\/|$)\\\").test(current_event);\\n\\t }\\n\\t return current_event;\\n\\t };\\n\\t /*\\\\\\n\\t * eve.nts\\n\\t [ method ]\\n\\t **\\n\\t * Could be used inside event handler to figure out actual name of the event.\\n\\t **\\n\\t **\\n\\t = (array) names of the event\\n\\t \\\\*/\\n\\t eve.nts = function () {\\n\\t return current_event.split(separator);\\n\\t };\\n\\t /*\\\\\\n\\t * eve.off\\n\\t [ method ]\\n\\t **\\n\\t * Removes given function from the list of event listeners assigned to given name.\\n\\t\\t * If no arguments specified all the events will be cleared.\\n\\t **\\n\\t > Arguments\\n\\t **\\n\\t - name (string) name of the event, dot (`.`) or slash (`/`) separated, with optional wildcards\\n\\t - f (function) event handler function\\n\\t \\\\*/\\n\\t /*\\\\\\n\\t * eve.unbind\\n\\t [ method ]\\n\\t **\\n\\t * See @eve.off\\n\\t \\\\*/\\n\\t eve.off = eve.unbind = function (name, f) {\\n\\t\\t\\tif (!name) {\\n\\t\\t\\t eve._events = events = {n: {}};\\n\\t\\t\\t\\treturn;\\n\\t\\t\\t}\\n\\t var names = name.split(separator),\\n\\t e,\\n\\t key,\\n\\t splice,\\n\\t i, ii, j, jj,\\n\\t cur = [events];\\n\\t for (i = 0, ii = names.length; i < ii; i++) {\\n\\t for (j = 0; j < cur.length; j += splice.length - 2) {\\n\\t splice = [j, 1];\\n\\t e = cur[j].n;\\n\\t if (names[i] != wildcard) {\\n\\t if (e[names[i]]) {\\n\\t splice.push(e[names[i]]);\\n\\t }\\n\\t } else {\\n\\t for (key in e) if (e[has](key)) {\\n\\t splice.push(e[key]);\\n\\t }\\n\\t }\\n\\t cur.splice.apply(cur, splice);\\n\\t }\\n\\t }\\n\\t for (i = 0, ii = cur.length; i < ii; i++) {\\n\\t e = cur[i];\\n\\t while (e.n) {\\n\\t if (f) {\\n\\t if (e.f) {\\n\\t for (j = 0, jj = e.f.length; j < jj; j++) if (e.f[j] == f) {\\n\\t e.f.splice(j, 1);\\n\\t break;\\n\\t }\\n\\t !e.f.length && delete e.f;\\n\\t }\\n\\t for (key in e.n) if (e.n[has](key) && e.n[key].f) {\\n\\t var funcs = e.n[key].f;\\n\\t for (j = 0, jj = funcs.length; j < jj; j++) if (funcs[j] == f) {\\n\\t funcs.splice(j, 1);\\n\\t break;\\n\\t }\\n\\t !funcs.length && delete e.n[key].f;\\n\\t }\\n\\t } else {\\n\\t delete e.f;\\n\\t for (key in e.n) if (e.n[has](key) && e.n[key].f) {\\n\\t delete e.n[key].f;\\n\\t }\\n\\t }\\n\\t e = e.n;\\n\\t }\\n\\t }\\n\\t };\\n\\t /*\\\\\\n\\t * eve.once\\n\\t [ method ]\\n\\t **\\n\\t * Binds given event handler with a given name to only run once then unbind itself.\\n\\t | eve.once(\\\"login\\\", f);\\n\\t | eve(\\\"login\\\"); // triggers f\\n\\t | eve(\\\"login\\\"); // no listeners\\n\\t * Use @eve to trigger the listener.\\n\\t **\\n\\t > Arguments\\n\\t **\\n\\t - name (string) name of the event, dot (`.`) or slash (`/`) separated, with optional wildcards\\n\\t - f (function) event handler function\\n\\t **\\n\\t = (function) same return function as @eve.on\\n\\t \\\\*/\\n\\t eve.once = function (name, f) {\\n\\t var f2 = function () {\\n\\t eve.unbind(name, f2);\\n\\t return f.apply(this, arguments);\\n\\t };\\n\\t return eve.on(name, f2);\\n\\t };\\n\\t /*\\\\\\n\\t * eve.version\\n\\t [ property (string) ]\\n\\t **\\n\\t * Current version of the library.\\n\\t \\\\*/\\n\\t eve.version = version;\\n\\t eve.toString = function () {\\n\\t return \\\"You are running Eve \\\" + version;\\n\\t };\\n\\t (typeof module != \\\"undefined\\\" && module.exports) ? (module.exports = eve) : ( true ? (!(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_RESULT__ = function() { return eve; }.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__))) : (glob.eve = eve));\\n\\t})(this);\\n\\n\\n/***/ },\\n/* 3 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(1)], __WEBPACK_AMD_DEFINE_RESULT__ = function(R) {\\n\\t if (R && !R.svg) {\\n\\t return;\\n\\t }\\n\\n\\t var has = \\\"hasOwnProperty\\\",\\n\\t Str = String,\\n\\t toFloat = parseFloat,\\n\\t toInt = parseInt,\\n\\t math = Math,\\n\\t mmax = math.max,\\n\\t abs = math.abs,\\n\\t pow = math.pow,\\n\\t separator = /[, ]+/,\\n\\t eve = R.eve,\\n\\t E = \\\"\\\",\\n\\t S = \\\" \\\";\\n\\t var xlink = \\\"http://www.w3.org/1999/xlink\\\",\\n\\t markers = {\\n\\t block: \\\"M5,0 0,2.5 5,5z\\\",\\n\\t classic: \\\"M5,0 0,2.5 5,5 3.5,3 3.5,2z\\\",\\n\\t diamond: \\\"M2.5,0 5,2.5 2.5,5 0,2.5z\\\",\\n\\t open: \\\"M6,1 1,3.5 6,6\\\",\\n\\t oval: \\\"M2.5,0A2.5,2.5,0,0,1,2.5,5 2.5,2.5,0,0,1,2.5,0z\\\"\\n\\t },\\n\\t markerCounter = {};\\n\\t R.toString = function () {\\n\\t return \\\"Your browser supports SVG.\\\\nYou are running Rapha\\\\xebl \\\" + this.version;\\n\\t };\\n\\t var $ = function (el, attr) {\\n\\t if (attr) {\\n\\t if (typeof el == \\\"string\\\") {\\n\\t el = $(el);\\n\\t }\\n\\t for (var key in attr) if (attr[has](key)) {\\n\\t if (key.substring(0, 6) == \\\"xlink:\\\") {\\n\\t el.setAttributeNS(xlink, key.substring(6), Str(attr[key]));\\n\\t } else {\\n\\t el.setAttribute(key, Str(attr[key]));\\n\\t }\\n\\t }\\n\\t } else {\\n\\t el = R._g.doc.createElementNS(\\\"http://www.w3.org/2000/svg\\\", el);\\n\\t el.style && (el.style.webkitTapHighlightColor = \\\"rgba(0,0,0,0)\\\");\\n\\t }\\n\\t return el;\\n\\t },\\n\\t addGradientFill = function (element, gradient) {\\n\\t var type = \\\"linear\\\",\\n\\t id = element.id + gradient,\\n\\t fx = .5, fy = .5,\\n\\t o = element.node,\\n\\t SVG = element.paper,\\n\\t s = o.style,\\n\\t el = R._g.doc.getElementById(id);\\n\\t if (!el) {\\n\\t gradient = Str(gradient).replace(R._radial_gradient, function (all, _fx, _fy) {\\n\\t type = \\\"radial\\\";\\n\\t if (_fx && _fy) {\\n\\t fx = toFloat(_fx);\\n\\t fy = toFloat(_fy);\\n\\t var dir = ((fy > .5) * 2 - 1);\\n\\t pow(fx - .5, 2) + pow(fy - .5, 2) > .25 &&\\n\\t (fy = math.sqrt(.25 - pow(fx - .5, 2)) * dir + .5) &&\\n\\t fy != .5 &&\\n\\t (fy = fy.toFixed(5) - 1e-5 * dir);\\n\\t }\\n\\t return E;\\n\\t });\\n\\t gradient = gradient.split(/\\\\s*\\\\-\\\\s*/);\\n\\t if (type == \\\"linear\\\") {\\n\\t var angle = gradient.shift();\\n\\t angle = -toFloat(angle);\\n\\t if (isNaN(angle)) {\\n\\t return null;\\n\\t }\\n\\t var vector = [0, 0, math.cos(R.rad(angle)), math.sin(R.rad(angle))],\\n\\t max = 1 / (mmax(abs(vector[2]), abs(vector[3])) || 1);\\n\\t vector[2] *= max;\\n\\t vector[3] *= max;\\n\\t if (vector[2] < 0) {\\n\\t vector[0] = -vector[2];\\n\\t vector[2] = 0;\\n\\t }\\n\\t if (vector[3] < 0) {\\n\\t vector[1] = -vector[3];\\n\\t vector[3] = 0;\\n\\t }\\n\\t }\\n\\t var dots = R._parseDots(gradient);\\n\\t if (!dots) {\\n\\t return null;\\n\\t }\\n\\t id = id.replace(/[\\\\(\\\\)\\\\s,\\\\xb0#]/g, \\\"_\\\");\\n\\n\\t if (element.gradient && id != element.gradient.id) {\\n\\t SVG.defs.removeChild(element.gradient);\\n\\t delete element.gradient;\\n\\t }\\n\\n\\t if (!element.gradient) {\\n\\t el = $(type + \\\"Gradient\\\", {id: id});\\n\\t element.gradient = el;\\n\\t $(el, type == \\\"radial\\\" ? {\\n\\t fx: fx,\\n\\t fy: fy\\n\\t } : {\\n\\t x1: vector[0],\\n\\t y1: vector[1],\\n\\t x2: vector[2],\\n\\t y2: vector[3],\\n\\t gradientTransform: element.matrix.invert()\\n\\t });\\n\\t SVG.defs.appendChild(el);\\n\\t for (var i = 0, ii = dots.length; i < ii; i++) {\\n\\t el.appendChild($(\\\"stop\\\", {\\n\\t offset: dots[i].offset ? dots[i].offset : i ? \\\"100%\\\" : \\\"0%\\\",\\n\\t \\\"stop-color\\\": dots[i].color || \\\"#fff\\\",\\n\\t \\\"stop-opacity\\\": isFinite(dots[i].opacity) ? dots[i].opacity : 1\\n\\t }));\\n\\t }\\n\\t }\\n\\t }\\n\\t $(o, {\\n\\t fill: fillurl(id),\\n\\t opacity: 1,\\n\\t \\\"fill-opacity\\\": 1\\n\\t });\\n\\t s.fill = E;\\n\\t s.opacity = 1;\\n\\t s.fillOpacity = 1;\\n\\t return 1;\\n\\t },\\n\\t isIE9or10 = function () {\\n\\t var mode = document.documentMode;\\n\\t return mode && (mode === 9 || mode === 10);\\n\\t },\\n\\t fillurl = function (id) {\\n\\t if (isIE9or10()) {\\n\\t return \\\"url('#\\\" + id + \\\"')\\\";\\n\\t }\\n\\t var location = document.location;\\n\\t var locationString = (\\n\\t location.protocol + '//' +\\n\\t location.host +\\n\\t location.pathname +\\n\\t location.search\\n\\t );\\n\\t return \\\"url('\\\" + locationString + \\\"#\\\" + id + \\\"')\\\";\\n\\t },\\n\\t updatePosition = function (o) {\\n\\t var bbox = o.getBBox(1);\\n\\t $(o.pattern, {patternTransform: o.matrix.invert() + \\\" translate(\\\" + bbox.x + \\\",\\\" + bbox.y + \\\")\\\"});\\n\\t },\\n\\t addArrow = function (o, value, isEnd) {\\n\\t if (o.type == \\\"path\\\") {\\n\\t var values = Str(value).toLowerCase().split(\\\"-\\\"),\\n\\t p = o.paper,\\n\\t se = isEnd ? \\\"end\\\" : \\\"start\\\",\\n\\t node = o.node,\\n\\t attrs = o.attrs,\\n\\t stroke = attrs[\\\"stroke-width\\\"],\\n\\t i = values.length,\\n\\t type = \\\"classic\\\",\\n\\t from,\\n\\t to,\\n\\t dx,\\n\\t refX,\\n\\t attr,\\n\\t w = 3,\\n\\t h = 3,\\n\\t t = 5;\\n\\t while (i--) {\\n\\t switch (values[i]) {\\n\\t case \\\"block\\\":\\n\\t case \\\"classic\\\":\\n\\t case \\\"oval\\\":\\n\\t case \\\"diamond\\\":\\n\\t case \\\"open\\\":\\n\\t case \\\"none\\\":\\n\\t type = values[i];\\n\\t break;\\n\\t case \\\"wide\\\": h = 5; break;\\n\\t case \\\"narrow\\\": h = 2; break;\\n\\t case \\\"long\\\": w = 5; break;\\n\\t case \\\"short\\\": w = 2; break;\\n\\t }\\n\\t }\\n\\t if (type == \\\"open\\\") {\\n\\t w += 2;\\n\\t h += 2;\\n\\t t += 2;\\n\\t dx = 1;\\n\\t refX = isEnd ? 4 : 1;\\n\\t attr = {\\n\\t fill: \\\"none\\\",\\n\\t stroke: attrs.stroke\\n\\t };\\n\\t } else {\\n\\t refX = dx = w / 2;\\n\\t attr = {\\n\\t fill: attrs.stroke,\\n\\t stroke: \\\"none\\\"\\n\\t };\\n\\t }\\n\\t if (o._.arrows) {\\n\\t if (isEnd) {\\n\\t o._.arrows.endPath && markerCounter[o._.arrows.endPath]--;\\n\\t o._.arrows.endMarker && markerCounter[o._.arrows.endMarker]--;\\n\\t } else {\\n\\t o._.arrows.startPath && markerCounter[o._.arrows.startPath]--;\\n\\t o._.arrows.startMarker && markerCounter[o._.arrows.startMarker]--;\\n\\t }\\n\\t } else {\\n\\t o._.arrows = {};\\n\\t }\\n\\t if (type != \\\"none\\\") {\\n\\t var pathId = \\\"raphael-marker-\\\" + type,\\n\\t markerId = \\\"raphael-marker-\\\" + se + type + w + h + \\\"-obj\\\" + o.id;\\n\\t if (!R._g.doc.getElementById(pathId)) {\\n\\t p.defs.appendChild($($(\\\"path\\\"), {\\n\\t \\\"stroke-linecap\\\": \\\"round\\\",\\n\\t d: markers[type],\\n\\t id: pathId\\n\\t }));\\n\\t markerCounter[pathId] = 1;\\n\\t } else {\\n\\t markerCounter[pathId]++;\\n\\t }\\n\\t var marker = R._g.doc.getElementById(markerId),\\n\\t use;\\n\\t if (!marker) {\\n\\t marker = $($(\\\"marker\\\"), {\\n\\t id: markerId,\\n\\t markerHeight: h,\\n\\t markerWidth: w,\\n\\t orient: \\\"auto\\\",\\n\\t refX: refX,\\n\\t refY: h / 2\\n\\t });\\n\\t use = $($(\\\"use\\\"), {\\n\\t \\\"xlink:href\\\": \\\"#\\\" + pathId,\\n\\t transform: (isEnd ? \\\"rotate(180 \\\" + w / 2 + \\\" \\\" + h / 2 + \\\") \\\" : E) + \\\"scale(\\\" + w / t + \\\",\\\" + h / t + \\\")\\\",\\n\\t \\\"stroke-width\\\": (1 / ((w / t + h / t) / 2)).toFixed(4)\\n\\t });\\n\\t marker.appendChild(use);\\n\\t p.defs.appendChild(marker);\\n\\t markerCounter[markerId] = 1;\\n\\t } else {\\n\\t markerCounter[markerId]++;\\n\\t use = marker.getElementsByTagName(\\\"use\\\")[0];\\n\\t }\\n\\t $(use, attr);\\n\\t var delta = dx * (type != \\\"diamond\\\" && type != \\\"oval\\\");\\n\\t if (isEnd) {\\n\\t from = o._.arrows.startdx * stroke || 0;\\n\\t to = R.getTotalLength(attrs.path) - delta * stroke;\\n\\t } else {\\n\\t from = delta * stroke;\\n\\t to = R.getTotalLength(attrs.path) - (o._.arrows.enddx * stroke || 0);\\n\\t }\\n\\t attr = {};\\n\\t attr[\\\"marker-\\\" + se] = \\\"url(#\\\" + markerId + \\\")\\\";\\n\\t if (to || from) {\\n\\t attr.d = R.getSubpath(attrs.path, from, to);\\n\\t }\\n\\t $(node, attr);\\n\\t o._.arrows[se + \\\"Path\\\"] = pathId;\\n\\t o._.arrows[se + \\\"Marker\\\"] = markerId;\\n\\t o._.arrows[se + \\\"dx\\\"] = delta;\\n\\t o._.arrows[se + \\\"Type\\\"] = type;\\n\\t o._.arrows[se + \\\"String\\\"] = value;\\n\\t } else {\\n\\t if (isEnd) {\\n\\t from = o._.arrows.startdx * stroke || 0;\\n\\t to = R.getTotalLength(attrs.path) - from;\\n\\t } else {\\n\\t from = 0;\\n\\t to = R.getTotalLength(attrs.path) - (o._.arrows.enddx * stroke || 0);\\n\\t }\\n\\t o._.arrows[se + \\\"Path\\\"] && $(node, {d: R.getSubpath(attrs.path, from, to)});\\n\\t delete o._.arrows[se + \\\"Path\\\"];\\n\\t delete o._.arrows[se + \\\"Marker\\\"];\\n\\t delete o._.arrows[se + \\\"dx\\\"];\\n\\t delete o._.arrows[se + \\\"Type\\\"];\\n\\t delete o._.arrows[se + \\\"String\\\"];\\n\\t }\\n\\t for (attr in markerCounter) if (markerCounter[has](attr) && !markerCounter[attr]) {\\n\\t var item = R._g.doc.getElementById(attr);\\n\\t item && item.parentNode.removeChild(item);\\n\\t }\\n\\t }\\n\\t },\\n\\t dasharray = {\\n\\t \\\"-\\\": [3, 1],\\n\\t \\\".\\\": [1, 1],\\n\\t \\\"-.\\\": [3, 1, 1, 1],\\n\\t \\\"-..\\\": [3, 1, 1, 1, 1, 1],\\n\\t \\\". \\\": [1, 3],\\n\\t \\\"- \\\": [4, 3],\\n\\t \\\"--\\\": [8, 3],\\n\\t \\\"- .\\\": [4, 3, 1, 3],\\n\\t \\\"--.\\\": [8, 3, 1, 3],\\n\\t \\\"--..\\\": [8, 3, 1, 3, 1, 3]\\n\\t },\\n\\t addDashes = function (o, value, params) {\\n\\t value = dasharray[Str(value).toLowerCase()];\\n\\t if (value) {\\n\\t var width = o.attrs[\\\"stroke-width\\\"] || \\\"1\\\",\\n\\t butt = {round: width, square: width, butt: 0}[o.attrs[\\\"stroke-linecap\\\"] || params[\\\"stroke-linecap\\\"]] || 0,\\n\\t dashes = [],\\n\\t i = value.length;\\n\\t while (i--) {\\n\\t dashes[i] = value[i] * width + ((i % 2) ? 1 : -1) * butt;\\n\\t }\\n\\t $(o.node, {\\\"stroke-dasharray\\\": dashes.join(\\\",\\\")});\\n\\t }\\n\\t else {\\n\\t $(o.node, {\\\"stroke-dasharray\\\": \\\"none\\\"});\\n\\t }\\n\\t },\\n\\t setFillAndStroke = function (o, params) {\\n\\t var node = o.node,\\n\\t attrs = o.attrs,\\n\\t vis = node.style.visibility;\\n\\t node.style.visibility = \\\"hidden\\\";\\n\\t for (var att in params) {\\n\\t if (params[has](att)) {\\n\\t if (!R._availableAttrs[has](att)) {\\n\\t continue;\\n\\t }\\n\\t var value = params[att];\\n\\t attrs[att] = value;\\n\\t switch (att) {\\n\\t case \\\"blur\\\":\\n\\t o.blur(value);\\n\\t break;\\n\\t case \\\"title\\\":\\n\\t var title = node.getElementsByTagName(\\\"title\\\");\\n\\n\\t // Use the existing <title>.\\n\\t if (title.length && (title = title[0])) {\\n\\t title.firstChild.nodeValue = value;\\n\\t } else {\\n\\t title = $(\\\"title\\\");\\n\\t var val = R._g.doc.createTextNode(value);\\n\\t title.appendChild(val);\\n\\t node.appendChild(title);\\n\\t }\\n\\t break;\\n\\t case \\\"href\\\":\\n\\t case \\\"target\\\":\\n\\t var pn = node.parentNode;\\n\\t if (pn.tagName.toLowerCase() != \\\"a\\\") {\\n\\t var hl = $(\\\"a\\\");\\n\\t pn.insertBefore(hl, node);\\n\\t hl.appendChild(node);\\n\\t pn = hl;\\n\\t }\\n\\t if (att == \\\"target\\\") {\\n\\t pn.setAttributeNS(xlink, \\\"show\\\", value == \\\"blank\\\" ? \\\"new\\\" : value);\\n\\t } else {\\n\\t pn.setAttributeNS(xlink, att, value);\\n\\t }\\n\\t break;\\n\\t case \\\"cursor\\\":\\n\\t node.style.cursor = value;\\n\\t break;\\n\\t case \\\"transform\\\":\\n\\t o.transform(value);\\n\\t break;\\n\\t case \\\"arrow-start\\\":\\n\\t addArrow(o, value);\\n\\t break;\\n\\t case \\\"arrow-end\\\":\\n\\t addArrow(o, value, 1);\\n\\t break;\\n\\t case \\\"clip-rect\\\":\\n\\t var rect = Str(value).split(separator);\\n\\t if (rect.length == 4) {\\n\\t o.clip && o.clip.parentNode.parentNode.removeChild(o.clip.parentNode);\\n\\t var el = $(\\\"clipPath\\\"),\\n\\t rc = $(\\\"rect\\\");\\n\\t el.id = R.createUUID();\\n\\t $(rc, {\\n\\t x: rect[0],\\n\\t y: rect[1],\\n\\t width: rect[2],\\n\\t height: rect[3]\\n\\t });\\n\\t el.appendChild(rc);\\n\\t o.paper.defs.appendChild(el);\\n\\t $(node, {\\\"clip-path\\\": \\\"url(#\\\" + el.id + \\\")\\\"});\\n\\t o.clip = rc;\\n\\t }\\n\\t if (!value) {\\n\\t var path = node.getAttribute(\\\"clip-path\\\");\\n\\t if (path) {\\n\\t var clip = R._g.doc.getElementById(path.replace(/(^url\\\\(#|\\\\)$)/g, E));\\n\\t clip && clip.parentNode.removeChild(clip);\\n\\t $(node, {\\\"clip-path\\\": E});\\n\\t delete o.clip;\\n\\t }\\n\\t }\\n\\t break;\\n\\t case \\\"path\\\":\\n\\t if (o.type == \\\"path\\\") {\\n\\t $(node, {d: value ? attrs.path = R._pathToAbsolute(value) : \\\"M0,0\\\"});\\n\\t o._.dirty = 1;\\n\\t if (o._.arrows) {\\n\\t \\\"startString\\\" in o._.arrows && addArrow(o, o._.arrows.startString);\\n\\t \\\"endString\\\" in o._.arrows && addArrow(o, o._.arrows.endString, 1);\\n\\t }\\n\\t }\\n\\t break;\\n\\t case \\\"width\\\":\\n\\t node.setAttribute(att, value);\\n\\t o._.dirty = 1;\\n\\t if (attrs.fx) {\\n\\t att = \\\"x\\\";\\n\\t value = attrs.x;\\n\\t } else {\\n\\t break;\\n\\t }\\n\\t case \\\"x\\\":\\n\\t if (attrs.fx) {\\n\\t value = -attrs.x - (attrs.width || 0);\\n\\t }\\n\\t case \\\"rx\\\":\\n\\t if (att == \\\"rx\\\" && o.type == \\\"rect\\\") {\\n\\t break;\\n\\t }\\n\\t case \\\"cx\\\":\\n\\t node.setAttribute(att, value);\\n\\t o.pattern && updatePosition(o);\\n\\t o._.dirty = 1;\\n\\t break;\\n\\t case \\\"height\\\":\\n\\t node.setAttribute(att, value);\\n\\t o._.dirty = 1;\\n\\t if (attrs.fy) {\\n\\t att = \\\"y\\\";\\n\\t value = attrs.y;\\n\\t } else {\\n\\t break;\\n\\t }\\n\\t case \\\"y\\\":\\n\\t if (attrs.fy) {\\n\\t value = -attrs.y - (attrs.height || 0);\\n\\t }\\n\\t case \\\"ry\\\":\\n\\t if (att == \\\"ry\\\" && o.type == \\\"rect\\\") {\\n\\t break;\\n\\t }\\n\\t case \\\"cy\\\":\\n\\t node.setAttribute(att, value);\\n\\t o.pattern && updatePosition(o);\\n\\t o._.dirty = 1;\\n\\t break;\\n\\t case \\\"r\\\":\\n\\t if (o.type == \\\"rect\\\") {\\n\\t $(node, {rx: value, ry: value});\\n\\t } else {\\n\\t node.setAttribute(att, value);\\n\\t }\\n\\t o._.dirty = 1;\\n\\t break;\\n\\t case \\\"src\\\":\\n\\t if (o.type == \\\"image\\\") {\\n\\t node.setAttributeNS(xlink, \\\"href\\\", value);\\n\\t }\\n\\t break;\\n\\t case \\\"stroke-width\\\":\\n\\t if (o._.sx != 1 || o._.sy != 1) {\\n\\t value /= mmax(abs(o._.sx), abs(o._.sy)) || 1;\\n\\t }\\n\\t node.setAttribute(att, value);\\n\\t if (attrs[\\\"stroke-dasharray\\\"]) {\\n\\t addDashes(o, attrs[\\\"stroke-dasharray\\\"], params);\\n\\t }\\n\\t if (o._.arrows) {\\n\\t \\\"startString\\\" in o._.arrows && addArrow(o, o._.arrows.startString);\\n\\t \\\"endString\\\" in o._.arrows && addArrow(o, o._.arrows.endString, 1);\\n\\t }\\n\\t break;\\n\\t case \\\"stroke-dasharray\\\":\\n\\t addDashes(o, value, params);\\n\\t break;\\n\\t case \\\"fill\\\":\\n\\t var isURL = Str(value).match(R._ISURL);\\n\\t if (isURL) {\\n\\t el = $(\\\"pattern\\\");\\n\\t var ig = $(\\\"image\\\");\\n\\t el.id = R.createUUID();\\n\\t $(el, {x: 0, y: 0, patternUnits: \\\"userSpaceOnUse\\\", height: 1, width: 1});\\n\\t $(ig, {x: 0, y: 0, \\\"xlink:href\\\": isURL[1]});\\n\\t el.appendChild(ig);\\n\\n\\t (function (el) {\\n\\t R._preload(isURL[1], function () {\\n\\t var w = this.offsetWidth,\\n\\t h = this.offsetHeight;\\n\\t $(el, {width: w, height: h});\\n\\t $(ig, {width: w, height: h});\\n\\t });\\n\\t })(el);\\n\\t o.paper.defs.appendChild(el);\\n\\t $(node, {fill: \\\"url(#\\\" + el.id + \\\")\\\"});\\n\\t o.pattern = el;\\n\\t o.pattern && updatePosition(o);\\n\\t break;\\n\\t }\\n\\t var clr = R.getRGB(value);\\n\\t if (!clr.error) {\\n\\t delete params.gradient;\\n\\t delete attrs.gradient;\\n\\t !R.is(attrs.opacity, \\\"undefined\\\") &&\\n\\t R.is(params.opacity, \\\"undefined\\\") &&\\n\\t $(node, {opacity: attrs.opacity});\\n\\t !R.is(attrs[\\\"fill-opacity\\\"], \\\"undefined\\\") &&\\n\\t R.is(params[\\\"fill-opacity\\\"], \\\"undefined\\\") &&\\n\\t $(node, {\\\"fill-opacity\\\": attrs[\\\"fill-opacity\\\"]});\\n\\t } else if ((o.type == \\\"circle\\\" || o.type == \\\"ellipse\\\" || Str(value).charAt() != \\\"r\\\") && addGradientFill(o, value)) {\\n\\t if (\\\"opacity\\\" in attrs || \\\"fill-opacity\\\" in attrs) {\\n\\t var gradient = R._g.doc.getElementById(node.getAttribute(\\\"fill\\\").replace(/^url\\\\(#|\\\\)$/g, E));\\n\\t if (gradient) {\\n\\t var stops = gradient.getElementsByTagName(\\\"stop\\\");\\n\\t $(stops[stops.length - 1], {\\\"stop-opacity\\\": (\\\"opacity\\\" in attrs ? attrs.opacity : 1) * (\\\"fill-opacity\\\" in attrs ? attrs[\\\"fill-opacity\\\"] : 1)});\\n\\t }\\n\\t }\\n\\t attrs.gradient = value;\\n\\t attrs.fill = \\\"none\\\";\\n\\t break;\\n\\t }\\n\\t clr[has](\\\"opacity\\\") && $(node, {\\\"fill-opacity\\\": clr.opacity > 1 ? clr.opacity / 100 : clr.opacity});\\n\\t case \\\"stroke\\\":\\n\\t clr = R.getRGB(value);\\n\\t node.setAttribute(att, clr.hex);\\n\\t att == \\\"stroke\\\" && clr[has](\\\"opacity\\\") && $(node, {\\\"stroke-opacity\\\": clr.opacity > 1 ? clr.opacity / 100 : clr.opacity});\\n\\t if (att == \\\"stroke\\\" && o._.arrows) {\\n\\t \\\"startString\\\" in o._.arrows && addArrow(o, o._.arrows.startString);\\n\\t \\\"endString\\\" in o._.arrows && addArrow(o, o._.arrows.endString, 1);\\n\\t }\\n\\t break;\\n\\t case \\\"gradient\\\":\\n\\t (o.type == \\\"circle\\\" || o.type == \\\"ellipse\\\" || Str(value).charAt() != \\\"r\\\") && addGradientFill(o, value);\\n\\t break;\\n\\t case \\\"opacity\\\":\\n\\t if (attrs.gradient && !attrs[has](\\\"stroke-opacity\\\")) {\\n\\t $(node, {\\\"stroke-opacity\\\": value > 1 ? value / 100 : value});\\n\\t }\\n\\t // fall\\n\\t case \\\"fill-opacity\\\":\\n\\t if (attrs.gradient) {\\n\\t gradient = R._g.doc.getElementById(node.getAttribute(\\\"fill\\\").replace(/^url\\\\(#|\\\\)$/g, E));\\n\\t if (gradient) {\\n\\t stops = gradient.getElementsByTagName(\\\"stop\\\");\\n\\t $(stops[stops.length - 1], {\\\"stop-opacity\\\": value});\\n\\t }\\n\\t break;\\n\\t }\\n\\t default:\\n\\t att == \\\"font-size\\\" && (value = toInt(value, 10) + \\\"px\\\");\\n\\t var cssrule = att.replace(/(\\\\-.)/g, function (w) {\\n\\t return w.substring(1).toUpperCase();\\n\\t });\\n\\t node.style[cssrule] = value;\\n\\t o._.dirty = 1;\\n\\t node.setAttribute(att, value);\\n\\t break;\\n\\t }\\n\\t }\\n\\t }\\n\\n\\t tuneText(o, params);\\n\\t node.style.visibility = vis;\\n\\t },\\n\\t leading = 1.2,\\n\\t tuneText = function (el, params) {\\n\\t if (el.type != \\\"text\\\" || !(params[has](\\\"text\\\") || params[has](\\\"font\\\") || params[has](\\\"font-size\\\") || params[has](\\\"x\\\") || params[has](\\\"y\\\"))) {\\n\\t return;\\n\\t }\\n\\t var a = el.attrs,\\n\\t node = el.node,\\n\\t fontSize = node.firstChild ? toInt(R._g.doc.defaultView.getComputedStyle(node.firstChild, E).getPropertyValue(\\\"font-size\\\"), 10) : 10;\\n\\n\\t if (params[has](\\\"text\\\")) {\\n\\t a.text = params.text;\\n\\t while (node.firstChild) {\\n\\t node.removeChild(node.firstChild);\\n\\t }\\n\\t var texts = Str(params.text).split(\\\"\\\\n\\\"),\\n\\t tspans = [],\\n\\t tspan;\\n\\t for (var i = 0, ii = texts.length; i < ii; i++) {\\n\\t tspan = $(\\\"tspan\\\");\\n\\t i && $(tspan, {dy: fontSize * leading, x: a.x});\\n\\t tspan.appendChild(R._g.doc.createTextNode(texts[i]));\\n\\t node.appendChild(tspan);\\n\\t tspans[i] = tspan;\\n\\t }\\n\\t } else {\\n\\t tspans = node.getElementsByTagName(\\\"tspan\\\");\\n\\t for (i = 0, ii = tspans.length; i < ii; i++) if (i) {\\n\\t $(tspans[i], {dy: fontSize * leading, x: a.x});\\n\\t } else {\\n\\t $(tspans[0], {dy: 0});\\n\\t }\\n\\t }\\n\\t $(node, {x: a.x, y: a.y});\\n\\t el._.dirty = 1;\\n\\t var bb = el._getBBox(),\\n\\t dif = a.y - (bb.y + bb.height / 2);\\n\\t dif && R.is(dif, \\\"finite\\\") && $(tspans[0], {dy: dif});\\n\\t },\\n\\t getRealNode = function (node) {\\n\\t if (node.parentNode && node.parentNode.tagName.toLowerCase() === \\\"a\\\") {\\n\\t return node.parentNode;\\n\\t } else {\\n\\t return node;\\n\\t }\\n\\t },\\n\\t Element = function (node, svg) {\\n\\t var X = 0,\\n\\t Y = 0;\\n\\t /*\\\\\\n\\t * Element.node\\n\\t [ property (object) ]\\n\\t **\\n\\t * Gives you a reference to the DOM object, so you can assign event handlers or just mess around.\\n\\t **\\n\\t * Note: Don’t mess with it.\\n\\t > Usage\\n\\t | // draw a circle at coordinate 10,10 with radius of 10\\n\\t | var c = paper.circle(10, 10, 10);\\n\\t | c.node.onclick = function () {\\n\\t | c.attr(\\\"fill\\\", \\\"red\\\");\\n\\t | };\\n\\t \\\\*/\\n\\t this[0] = this.node = node;\\n\\t /*\\\\\\n\\t * Element.raphael\\n\\t [ property (object) ]\\n\\t **\\n\\t * Internal reference to @Raphael object. In case it is not available.\\n\\t > Usage\\n\\t | Raphael.el.red = function () {\\n\\t | var hsb = this.paper.raphael.rgb2hsb(this.attr(\\\"fill\\\"));\\n\\t | hsb.h = 1;\\n\\t | this.attr({fill: this.paper.raphael.hsb2rgb(hsb).hex});\\n\\t | }\\n\\t \\\\*/\\n\\t node.raphael = true;\\n\\t /*\\\\\\n\\t * Element.id\\n\\t [ property (number) ]\\n\\t **\\n\\t * Unique id of the element. Especially useful when you want to listen to events of the element,\\n\\t * because all events are fired in format `<module>.<action>.<id>`. Also useful for @Paper.getById method.\\n\\t \\\\*/\\n\\t this.id = guid();\\n\\t node.raphaelid = this.id;\\n\\n\\t /**\\n\\t * Method that returns a 5 letter/digit id, enough for 36^5 = 60466176 elements\\n\\t * @returns {string} id\\n\\t */\\n\\t function guid() {\\n\\t return (\\\"0000\\\" + (Math.random()*Math.pow(36,5) << 0).toString(36)).slice(-5);\\n\\t }\\n\\n\\t this.matrix = R.matrix();\\n\\t this.realPath = null;\\n\\t /*\\\\\\n\\t * Element.paper\\n\\t [ property (object) ]\\n\\t **\\n\\t * Internal reference to “paper” where object drawn. Mainly for use in plugins and element extensions.\\n\\t > Usage\\n\\t | Raphael.el.cross = function () {\\n\\t | this.attr({fill: \\\"red\\\"});\\n\\t | this.paper.path(\\\"M10,10L50,50M50,10L10,50\\\")\\n\\t | .attr({stroke: \\\"red\\\"});\\n\\t | }\\n\\t \\\\*/\\n\\t this.paper = svg;\\n\\t this.attrs = this.attrs || {};\\n\\t this._ = {\\n\\t transform: [],\\n\\t sx: 1,\\n\\t sy: 1,\\n\\t deg: 0,\\n\\t dx: 0,\\n\\t dy: 0,\\n\\t dirty: 1\\n\\t };\\n\\t !svg.bottom && (svg.bottom = this);\\n\\t /*\\\\\\n\\t * Element.prev\\n\\t [ property (object) ]\\n\\t **\\n\\t * Reference to the previous element in the hierarchy.\\n\\t \\\\*/\\n\\t this.prev = svg.top;\\n\\t svg.top && (svg.top.next = this);\\n\\t svg.top = this;\\n\\t /*\\\\\\n\\t * Element.next\\n\\t [ property (object) ]\\n\\t **\\n\\t * Reference to the next element in the hierarchy.\\n\\t \\\\*/\\n\\t this.next = null;\\n\\t },\\n\\t elproto = R.el;\\n\\n\\t Element.prototype = elproto;\\n\\t elproto.constructor = Element;\\n\\n\\t R._engine.path = function (pathString, SVG) {\\n\\t var el = $(\\\"path\\\");\\n\\t SVG.canvas && SVG.canvas.appendChild(el);\\n\\t var p = new Element(el, SVG);\\n\\t p.type = \\\"path\\\";\\n\\t setFillAndStroke(p, {\\n\\t fill: \\\"none\\\",\\n\\t stroke: \\\"#000\\\",\\n\\t path: pathString\\n\\t });\\n\\t return p;\\n\\t };\\n\\t /*\\\\\\n\\t * Element.rotate\\n\\t [ method ]\\n\\t **\\n\\t * Deprecated! Use @Element.transform instead.\\n\\t * Adds rotation by given angle around given point to the list of\\n\\t * transformations of the element.\\n\\t > Parameters\\n\\t - deg (number) angle in degrees\\n\\t - cx (number) #optional x coordinate of the centre of rotation\\n\\t - cy (number) #optional y coordinate of the centre of rotation\\n\\t * If cx & cy aren’t specified centre of the shape is used as a point of rotation.\\n\\t = (object) @Element\\n\\t \\\\*/\\n\\t elproto.rotate = function (deg, cx, cy) {\\n\\t if (this.removed) {\\n\\t return this;\\n\\t }\\n\\t deg = Str(deg).split(separator);\\n\\t if (deg.length - 1) {\\n\\t cx = toFloat(deg[1]);\\n\\t cy = toFloat(deg[2]);\\n\\t }\\n\\t deg = toFloat(deg[0]);\\n\\t (cy == null) && (cx = cy);\\n\\t if (cx == null || cy == null) {\\n\\t var bbox = this.getBBox(1);\\n\\t cx = bbox.x + bbox.width / 2;\\n\\t cy = bbox.y + bbox.height / 2;\\n\\t }\\n\\t this.transform(this._.transform.concat([[\\\"r\\\", deg, cx, cy]]));\\n\\t return this;\\n\\t };\\n\\t /*\\\\\\n\\t * Element.scale\\n\\t [ method ]\\n\\t **\\n\\t * Deprecated! Use @Element.transform instead.\\n\\t * Adds scale by given amount relative to given point to the list of\\n\\t * transformations of the element.\\n\\t > Parameters\\n\\t - sx (number) horisontal scale amount\\n\\t - sy (number) vertical scale amount\\n\\t - cx (number) #optional x coordinate of the centre of scale\\n\\t - cy (number) #optional y coordinate of the centre of scale\\n\\t * If cx & cy aren’t specified centre of the shape is used instead.\\n\\t = (object) @Element\\n\\t \\\\*/\\n\\t elproto.scale = function (sx, sy, cx, cy) {\\n\\t if (this.removed) {\\n\\t return this;\\n\\t }\\n\\t sx = Str(sx).split(separator);\\n\\t if (sx.length - 1) {\\n\\t sy = toFloat(sx[1]);\\n\\t cx = toFloat(sx[2]);\\n\\t cy = toFloat(sx[3]);\\n\\t }\\n\\t sx = toFloat(sx[0]);\\n\\t (sy == null) && (sy = sx);\\n\\t (cy == null) && (cx = cy);\\n\\t if (cx == null || cy == null) {\\n\\t var bbox = this.getBBox(1);\\n\\t }\\n\\t cx = cx == null ? bbox.x + bbox.width / 2 : cx;\\n\\t cy = cy == null ? bbox.y + bbox.height / 2 : cy;\\n\\t this.transform(this._.transform.concat([[\\\"s\\\", sx, sy, cx, cy]]));\\n\\t return this;\\n\\t };\\n\\t /*\\\\\\n\\t * Element.translate\\n\\t [ method ]\\n\\t **\\n\\t * Deprecated! Use @Element.transform instead.\\n\\t * Adds translation by given amount to the list of transformations of the element.\\n\\t > Parameters\\n\\t - dx (number) horisontal shift\\n\\t - dy (number) vertical shift\\n\\t = (object) @Element\\n\\t \\\\*/\\n\\t elproto.translate = function (dx, dy) {\\n\\t if (this.removed) {\\n\\t return this;\\n\\t }\\n\\t dx = Str(dx).split(separator);\\n\\t if (dx.length - 1) {\\n\\t dy = toFloat(dx[1]);\\n\\t }\\n\\t dx = toFloat(dx[0]) || 0;\\n\\t dy = +dy || 0;\\n\\t this.transform(this._.transform.concat([[\\\"t\\\", dx, dy]]));\\n\\t return this;\\n\\t };\\n\\t /*\\\\\\n\\t * Element.transform\\n\\t [ method ]\\n\\t **\\n\\t * Adds transformation to the element which is separate to other attributes,\\n\\t * i.e. translation doesn’t change `x` or `y` of the rectange. The format\\n\\t * of transformation string is similar to the path string syntax:\\n\\t | \\\"t100,100r30,100,100s2,2,100,100r45s1.5\\\"\\n\\t * Each letter is a command. There are four commands: `t` is for translate, `r` is for rotate, `s` is for\\n\\t * scale and `m` is for matrix.\\n\\t *\\n\\t * There are also alternative “absolute” translation, rotation and scale: `T`, `R` and `S`. They will not take previous transformation into account. For example, `...T100,0` will always move element 100 px horisontally, while `...t100,0` could move it vertically if there is `r90` before. Just compare results of `r90t100,0` and `r90T100,0`.\\n\\t *\\n\\t * So, the example line above could be read like “translate by 100, 100; rotate 30° around 100, 100; scale twice around 100, 100;\\n\\t * rotate 45° around centre; scale 1.5 times relative to centre”. As you can see rotate and scale commands have origin\\n\\t * coordinates as optional parameters, the default is the centre point of the element.\\n\\t * Matrix accepts six parameters.\\n\\t > Usage\\n\\t | var el = paper.rect(10, 20, 300, 200);\\n\\t | // translate 100, 100, rotate 45°, translate -100, 0\\n\\t | el.transform(\\\"t100,100r45t-100,0\\\");\\n\\t | // if you want you can append or prepend transformations\\n\\t | el.transform(\\\"...t50,50\\\");\\n\\t | el.transform(\\\"s2...\\\");\\n\\t | // or even wrap\\n\\t | el.transform(\\\"t50,50...t-50-50\\\");\\n\\t | // to reset transformation call method with empty string\\n\\t | el.transform(\\\"\\\");\\n\\t | // to get current value call it without parameters\\n\\t | console.log(el.transform());\\n\\t > Parameters\\n\\t - tstr (string) #optional transformation string\\n\\t * If tstr isn’t specified\\n\\t = (string) current transformation string\\n\\t * else\\n\\t = (object) @Element\\n\\t \\\\*/\\n\\t elproto.transform = function (tstr) {\\n\\t var _ = this._;\\n\\t if (tstr == null) {\\n\\t return _.transform;\\n\\t }\\n\\t R._extractTransform(this, tstr);\\n\\n\\t this.clip && $(this.clip, {transform: this.matrix.invert()});\\n\\t this.pattern && updatePosition(this);\\n\\t this.node && $(this.node, {transform: this.matrix});\\n\\n\\t if (_.sx != 1 || _.sy != 1) {\\n\\t var sw = this.attrs[has](\\\"stroke-width\\\") ? this.attrs[\\\"stroke-width\\\"] : 1;\\n\\t this.attr({\\\"stroke-width\\\": sw});\\n\\t }\\n\\n\\t return this;\\n\\t };\\n\\t /*\\\\\\n\\t * Element.hide\\n\\t [ method ]\\n\\t **\\n\\t * Makes element invisible. See @Element.show.\\n\\t = (object) @Element\\n\\t \\\\*/\\n\\t elproto.hide = function () {\\n\\t if(!this.removed) this.node.style.display = \\\"none\\\";\\n\\t return this;\\n\\t };\\n\\t /*\\\\\\n\\t * Element.show\\n\\t [ method ]\\n\\t **\\n\\t * Makes element visible. See @Element.hide.\\n\\t = (object) @Element\\n\\t \\\\*/\\n\\t elproto.show = function () {\\n\\t if(!this.removed) this.node.style.display = \\\"\\\";\\n\\t return this;\\n\\t };\\n\\t /*\\\\\\n\\t * Element.remove\\n\\t [ method ]\\n\\t **\\n\\t * Removes element from the paper.\\n\\t \\\\*/\\n\\t elproto.remove = function () {\\n\\t var node = getRealNode(this.node);\\n\\t if (this.removed || !node.parentNode) {\\n\\t return;\\n\\t }\\n\\t var paper = this.paper;\\n\\t paper.__set__ && paper.__set__.exclude(this);\\n\\t eve.unbind(\\\"raphael.*.*.\\\" + this.id);\\n\\t if (this.gradient) {\\n\\t paper.defs.removeChild(this.gradient);\\n\\t }\\n\\t R._tear(this, paper);\\n\\n\\t node.parentNode.removeChild(node);\\n\\n\\t // Remove custom data for element\\n\\t this.removeData();\\n\\n\\t for (var i in this) {\\n\\t this[i] = typeof this[i] == \\\"function\\\" ? R._removedFactory(i) : null;\\n\\t }\\n\\t this.removed = true;\\n\\t };\\n\\t elproto._getBBox = function () {\\n\\t if (this.node.style.display == \\\"none\\\") {\\n\\t this.show();\\n\\t var hide = true;\\n\\t }\\n\\t var canvasHidden = false,\\n\\t containerStyle;\\n\\t if (this.paper.canvas.parentElement) {\\n\\t containerStyle = this.paper.canvas.parentElement.style;\\n\\t } //IE10+ can't find parentElement\\n\\t else if (this.paper.canvas.parentNode) {\\n\\t containerStyle = this.paper.canvas.parentNode.style;\\n\\t }\\n\\n\\t if(containerStyle && containerStyle.display == \\\"none\\\") {\\n\\t canvasHidden = true;\\n\\t containerStyle.display = \\\"\\\";\\n\\t }\\n\\t var bbox = {};\\n\\t try {\\n\\t bbox = this.node.getBBox();\\n\\t } catch(e) {\\n\\t // Firefox 3.0.x, 25.0.1 (probably more versions affected) play badly here - possible fix\\n\\t bbox = {\\n\\t x: this.node.clientLeft,\\n\\t y: this.node.clientTop,\\n\\t width: this.node.clientWidth,\\n\\t height: this.node.clientHeight\\n\\t }\\n\\t } finally {\\n\\t bbox = bbox || {};\\n\\t if(canvasHidden){\\n\\t containerStyle.display = \\\"none\\\";\\n\\t }\\n\\t }\\n\\t hide && this.hide();\\n\\t return bbox;\\n\\t };\\n\\t /*\\\\\\n\\t * Element.attr\\n\\t [ method ]\\n\\t **\\n\\t * Sets the attributes of the element.\\n\\t > Parameters\\n\\t - attrName (string) attribute’s name\\n\\t - value (string) value\\n\\t * or\\n\\t - params (object) object of name/value pairs\\n\\t * or\\n\\t - attrName (string) attribute’s name\\n\\t * or\\n\\t - attrNames (array) in this case method returns array of current values for given attribute names\\n\\t = (object) @Element if attrsName & value or params are passed in.\\n\\t = (...) value of the attribute if only attrsName is passed in.\\n\\t = (array) array of values of the attribute if attrsNames is passed in.\\n\\t = (object) object of attributes if nothing is passed in.\\n\\t > Possible parameters\\n\\t # <p>Please refer to the <a href=\\\"http://www.w3.org/TR/SVG/\\\" title=\\\"The W3C Recommendation for the SVG language describes these properties in detail.\\\">SVG specification</a> for an explanation of these parameters.</p>\\n\\t o arrow-end (string) arrowhead on the end of the path. The format for string is `<type>[-<width>[-<length>]]`. Possible types: `classic`, `block`, `open`, `oval`, `diamond`, `none`, width: `wide`, `narrow`, `medium`, length: `long`, `short`, `midium`.\\n\\t o clip-rect (string) comma or space separated values: x, y, width and height\\n\\t o cursor (string) CSS type of the cursor\\n\\t o cx (number) the x-axis coordinate of the center of the circle, or ellipse\\n\\t o cy (number) the y-axis coordinate of the center of the circle, or ellipse\\n\\t o fill (string) colour, gradient or image\\n\\t o fill-opacity (number)\\n\\t o font (string)\\n\\t o font-family (string)\\n\\t o font-size (number) font size in pixels\\n\\t o font-weight (string)\\n\\t o height (number)\\n\\t o href (string) URL, if specified element behaves as hyperlink\\n\\t o opacity (number)\\n\\t o path (string) SVG path string format\\n\\t o r (number) radius of the circle, ellipse or rounded corner on the rect\\n\\t o rx (number) horisontal radius of the ellipse\\n\\t o ry (number) vertical radius of the ellipse\\n\\t o src (string) image URL, only works for @Element.image element\\n\\t o stroke (string) stroke colour\\n\\t o stroke-dasharray (string) [“”, “none”, “`-`”, “`.`”, “`-.`”, “`-..`”, “`. `”, “`- `”, “`--`”, “`- .`”, “`--.`”, “`--..`”]\\n\\t o stroke-linecap (string) [“`butt`”, “`square`”, “`round`”]\\n\\t o stroke-linejoin (string) [“`bevel`”, “`round`”, “`miter`”]\\n\\t o stroke-miterlimit (number)\\n\\t o stroke-opacity (number)\\n\\t o stroke-width (number) stroke width in pixels, default is '1'\\n\\t o target (string) used with href\\n\\t o text (string) contents of the text element. Use `\\\\n` for multiline text\\n\\t o text-anchor (string) [“`start`”, “`middle`”, “`end`”], default is “`middle`”\\n\\t o title (string) will create tooltip with a given text\\n\\t o transform (string) see @Element.transform\\n\\t o width (number)\\n\\t o x (number)\\n\\t o y (number)\\n\\t > Gradients\\n\\t * Linear gradient format: “`‹angle›-‹colour›[-‹colour›[:‹offset›]]*-‹colour›`”, example: “`90-#fff-#000`” – 90°\\n\\t * gradient from white to black or “`0-#fff-#f00:20-#000`” – 0° gradient from white via red (at 20%) to black.\\n\\t *\\n\\t * radial gradient: “`r[(‹fx›, ‹fy›)]‹colour›[-‹colour›[:‹offset›]]*-‹colour›`”, example: “`r#fff-#000`” –\\n\\t * gradient from white to black or “`r(0.25, 0.75)#fff-#000`” – gradient from white to black with focus point\\n\\t * at 0.25, 0.75. Focus point coordinates are in 0..1 range. Radial gradients can only be applied to circles and ellipses.\\n\\t > Path String\\n\\t # <p>Please refer to <a href=\\\"http://www.w3.org/TR/SVG/paths.html#PathData\\\" title=\\\"Details of a path’s data attribute’s format are described in the SVG specification.\\\">SVG documentation regarding path string</a>. Raphaël fully supports it.</p>\\n\\t > Colour Parsing\\n\\t # <ul>\\n\\t # <li>Colour name (“<code>red</code>”, “<code>green</code>”, “<code>cornflowerblue</code>”, etc)</li>\\n\\t # <li>#••• — shortened HTML colour: (“<code>#000</code>”, “<code>#fc0</code>”, etc)</li>\\n\\t # <li>#•••••• — full length HTML colour: (“<code>#000000</code>”, “<code>#bd2300</code>”)</li>\\n\\t # <li>rgb(•••, •••, •••) — red, green and blue channels’ values: (“<code>rgb(200, 100, 0)</code>”)</li>\\n\\t # <li>rgb(•••%, •••%, •••%) — same as above, but in %: (“<code>rgb(100%, 175%, 0%)</code>”)</li>\\n\\t # <li>rgba(•••, •••, •••, •••) — red, green and blue channels’ values: (“<code>rgba(200, 100, 0, .5)</code>”)</li>\\n\\t # <li>rgba(•••%, •••%, •••%, •••%) — same as above, but in %: (“<code>rgba(100%, 175%, 0%, 50%)</code>”)</li>\\n\\t # <li>hsb(•••, •••, •••) — hue, saturation and brightness values: (“<code>hsb(0.5, 0.25, 1)</code>”)</li>\\n\\t # <li>hsb(•••%, •••%, •••%) — same as above, but in %</li>\\n\\t # <li>hsba(•••, •••, •••, •••) — same as above, but with opacity</li>\\n\\t # <li>hsl(•••, •••, •••) — almost the same as hsb, see <a href=\\\"http://en.wikipedia.org/wiki/HSL_and_HSV\\\" title=\\\"HSL and HSV - Wikipedia, the free encyclopedia\\\">Wikipedia page</a></li>\\n\\t # <li>hsl(•••%, •••%, •••%) — same as above, but in %</li>\\n\\t # <li>hsla(•••, •••, •••, •••) — same as above, but with opacity</li>\\n\\t # <li>Optionally for hsb and hsl you could specify hue as a degree: “<code>hsl(240deg, 1, .5)</code>” or, if you want to go fancy, “<code>hsl(240°, 1, .5)</code>”</li>\\n\\t # </ul>\\n\\t \\\\*/\\n\\t elproto.attr = function (name, value) {\\n\\t if (this.removed) {\\n\\t return this;\\n\\t }\\n\\t if (name == null) {\\n\\t var res = {};\\n\\t for (var a in this.attrs) if (this.attrs[has](a)) {\\n\\t res[a] = this.attrs[a];\\n\\t }\\n\\t res.gradient && res.fill == \\\"none\\\" && (res.fill = res.gradient) && delete res.gradient;\\n\\t res.transform = this._.transform;\\n\\t return res;\\n\\t }\\n\\t if (value == null && R.is(name, \\\"string\\\")) {\\n\\t if (name == \\\"fill\\\" && this.attrs.fill == \\\"none\\\" && this.attrs.gradient) {\\n\\t return this.attrs.gradient;\\n\\t }\\n\\t if (name == \\\"transform\\\") {\\n\\t return this._.transform;\\n\\t }\\n\\t var names = name.split(separator),\\n\\t out = {};\\n\\t for (var i = 0, ii = names.length; i < ii; i++) {\\n\\t name = names[i];\\n\\t if (name in this.attrs) {\\n\\t out[name] = this.attrs[name];\\n\\t } else if (R.is(this.paper.customAttributes[name], \\\"function\\\")) {\\n\\t out[name] = this.paper.customAttributes[name].def;\\n\\t } else {\\n\\t out[name] = R._availableAttrs[name];\\n\\t }\\n\\t }\\n\\t return ii - 1 ? out : out[names[0]];\\n\\t }\\n\\t if (value == null && R.is(name, \\\"array\\\")) {\\n\\t out = {};\\n\\t for (i = 0, ii = name.length; i < ii; i++) {\\n\\t out[name[i]] = this.attr(name[i]);\\n\\t }\\n\\t return out;\\n\\t }\\n\\t if (value != null) {\\n\\t var params = {};\\n\\t params[name] = value;\\n\\t } else if (name != null && R.is(name, \\\"object\\\")) {\\n\\t params = name;\\n\\t }\\n\\t for (var key in params) {\\n\\t eve(\\\"raphael.attr.\\\" + key + \\\".\\\" + this.id, this, params[key]);\\n\\t }\\n\\t for (key in this.paper.customAttributes) if (this.paper.customAttributes[has](key) && params[has](key) && R.is(this.paper.customAttributes[key], \\\"function\\\")) {\\n\\t var par = this.paper.customAttributes[key].apply(this, [].concat(params[key]));\\n\\t this.attrs[key] = params[key];\\n\\t for (var subkey in par) if (par[has](subkey)) {\\n\\t params[subkey] = par[subkey];\\n\\t }\\n\\t }\\n\\t setFillAndStroke(this, params);\\n\\t return this;\\n\\t };\\n\\t /*\\\\\\n\\t * Element.toFront\\n\\t [ method ]\\n\\t **\\n\\t * Moves the element so it is the closest to the viewer’s eyes, on top of other elements.\\n\\t = (object) @Element\\n\\t \\\\*/\\n\\t elproto.toFront = function () {\\n\\t if (this.removed) {\\n\\t return this;\\n\\t }\\n\\t var node = getRealNode(this.node);\\n\\t node.parentNode.appendChild(node);\\n\\t var svg = this.paper;\\n\\t svg.top != this && R._tofront(this, svg);\\n\\t return this;\\n\\t };\\n\\t /*\\\\\\n\\t * Element.toBack\\n\\t [ method ]\\n\\t **\\n\\t * Moves the element so it is the furthest from the viewer’s eyes, behind other elements.\\n\\t = (object) @Element\\n\\t \\\\*/\\n\\t elproto.toBack = function () {\\n\\t if (this.removed) {\\n\\t return this;\\n\\t }\\n\\t var node = getRealNode(this.node);\\n\\t var parentNode = node.parentNode;\\n\\t parentNode.insertBefore(node, parentNode.firstChild);\\n\\t R._toback(this, this.paper);\\n\\t var svg = this.paper;\\n\\t return this;\\n\\t };\\n\\t /*\\\\\\n\\t * Element.insertAfter\\n\\t [ method ]\\n\\t **\\n\\t * Inserts current object after the given one.\\n\\t = (object) @Element\\n\\t \\\\*/\\n\\t elproto.insertAfter = function (element) {\\n\\t if (this.removed || !element) {\\n\\t return this;\\n\\t }\\n\\n\\t var node = getRealNode(this.node);\\n\\t var afterNode = getRealNode(element.node || element[element.length - 1].node);\\n\\t if (afterNode.nextSibling) {\\n\\t afterNode.parentNode.insertBefore(node, afterNode.nextSibling);\\n\\t } else {\\n\\t afterNode.parentNode.appendChild(node);\\n\\t }\\n\\t R._insertafter(this, element, this.paper);\\n\\t return this;\\n\\t };\\n\\t /*\\\\\\n\\t * Element.insertBefore\\n\\t [ method ]\\n\\t **\\n\\t * Inserts current object before the given one.\\n\\t = (object) @Element\\n\\t \\\\*/\\n\\t elproto.insertBefore = function (element) {\\n\\t if (this.removed || !element) {\\n\\t return this;\\n\\t }\\n\\n\\t var node = getRealNode(this.node);\\n\\t var beforeNode = getRealNode(element.node || element[0].node);\\n\\t beforeNode.parentNode.insertBefore(node, beforeNode);\\n\\t R._insertbefore(this, element, this.paper);\\n\\t return this;\\n\\t };\\n\\t elproto.blur = function (size) {\\n\\t // Experimental. No Safari support. Use it on your own risk.\\n\\t var t = this;\\n\\t if (+size !== 0) {\\n\\t var fltr = $(\\\"filter\\\"),\\n\\t blur = $(\\\"feGaussianBlur\\\");\\n\\t t.attrs.blur = size;\\n\\t fltr.id = R.createUUID();\\n\\t $(blur, {stdDeviation: +size || 1.5});\\n\\t fltr.appendChild(blur);\\n\\t t.paper.defs.appendChild(fltr);\\n\\t t._blur = fltr;\\n\\t $(t.node, {filter: \\\"url(#\\\" + fltr.id + \\\")\\\"});\\n\\t } else {\\n\\t if (t._blur) {\\n\\t t._blur.parentNode.removeChild(t._blur);\\n\\t delete t._blur;\\n\\t delete t.attrs.blur;\\n\\t }\\n\\t t.node.removeAttribute(\\\"filter\\\");\\n\\t }\\n\\t return t;\\n\\t };\\n\\t R._engine.circle = function (svg, x, y, r) {\\n\\t var el = $(\\\"circle\\\");\\n\\t svg.canvas && svg.canvas.appendChild(el);\\n\\t var res = new Element(el, svg);\\n\\t res.attrs = {cx: x, cy: y, r: r, fill: \\\"none\\\", stroke: \\\"#000\\\"};\\n\\t res.type = \\\"circle\\\";\\n\\t $(el, res.attrs);\\n\\t return res;\\n\\t };\\n\\t R._engine.rect = function (svg, x, y, w, h, r) {\\n\\t var el = $(\\\"rect\\\");\\n\\t svg.canvas && svg.canvas.appendChild(el);\\n\\t var res = new Element(el, svg);\\n\\t res.attrs = {x: x, y: y, width: w, height: h, rx: r || 0, ry: r || 0, fill: \\\"none\\\", stroke: \\\"#000\\\"};\\n\\t res.type = \\\"rect\\\";\\n\\t $(el, res.attrs);\\n\\t return res;\\n\\t };\\n\\t R._engine.ellipse = function (svg, x, y, rx, ry) {\\n\\t var el = $(\\\"ellipse\\\");\\n\\t svg.canvas && svg.canvas.appendChild(el);\\n\\t var res = new Element(el, svg);\\n\\t res.attrs = {cx: x, cy: y, rx: rx, ry: ry, fill: \\\"none\\\", stroke: \\\"#000\\\"};\\n\\t res.type = \\\"ellipse\\\";\\n\\t $(el, res.attrs);\\n\\t return res;\\n\\t };\\n\\t R._engine.image = function (svg, src, x, y, w, h) {\\n\\t var el = $(\\\"image\\\");\\n\\t $(el, {x: x, y: y, width: w, height: h, preserveAspectRatio: \\\"none\\\"});\\n\\t el.setAttributeNS(xlink, \\\"href\\\", src);\\n\\t svg.canvas && svg.canvas.appendChild(el);\\n\\t var res = new Element(el, svg);\\n\\t res.attrs = {x: x, y: y, width: w, height: h, src: src};\\n\\t res.type = \\\"image\\\";\\n\\t return res;\\n\\t };\\n\\t R._engine.text = function (svg, x, y, text) {\\n\\t var el = $(\\\"text\\\");\\n\\t svg.canvas && svg.canvas.appendChild(el);\\n\\t var res = new Element(el, svg);\\n\\t res.attrs = {\\n\\t x: x,\\n\\t y: y,\\n\\t \\\"text-anchor\\\": \\\"middle\\\",\\n\\t text: text,\\n\\t \\\"font-family\\\": R._availableAttrs[\\\"font-family\\\"],\\n\\t \\\"font-size\\\": R._availableAttrs[\\\"font-size\\\"],\\n\\t stroke: \\\"none\\\",\\n\\t fill: \\\"#000\\\"\\n\\t };\\n\\t res.type = \\\"text\\\";\\n\\t setFillAndStroke(res, res.attrs);\\n\\t return res;\\n\\t };\\n\\t R._engine.setSize = function (width, height) {\\n\\t this.width = width || this.width;\\n\\t this.height = height || this.height;\\n\\t this.canvas.setAttribute(\\\"width\\\", this.width);\\n\\t this.canvas.setAttribute(\\\"height\\\", this.height);\\n\\t if (this._viewBox) {\\n\\t this.setViewBox.apply(this, this._viewBox);\\n\\t }\\n\\t return this;\\n\\t };\\n\\t R._engine.create = function () {\\n\\t var con = R._getContainer.apply(0, arguments),\\n\\t container = con && con.container,\\n\\t x = con.x,\\n\\t y = con.y,\\n\\t width = con.width,\\n\\t height = con.height;\\n\\t if (!container) {\\n\\t throw new Error(\\\"SVG container not found.\\\");\\n\\t }\\n\\t var cnvs = $(\\\"svg\\\"),\\n\\t css = \\\"overflow:hidden;\\\",\\n\\t isFloating;\\n\\t x = x || 0;\\n\\t y = y || 0;\\n\\t width = width || 512;\\n\\t height = height || 342;\\n\\t $(cnvs, {\\n\\t height: height,\\n\\t version: 1.1,\\n\\t width: width,\\n\\t xmlns: \\\"http://www.w3.org/2000/svg\\\",\\n\\t \\\"xmlns:xlink\\\": \\\"http://www.w3.org/1999/xlink\\\"\\n\\t });\\n\\t if (container == 1) {\\n\\t cnvs.style.cssText = css + \\\"position:absolute;left:\\\" + x + \\\"px;top:\\\" + y + \\\"px\\\";\\n\\t R._g.doc.body.appendChild(cnvs);\\n\\t isFloating = 1;\\n\\t } else {\\n\\t cnvs.style.cssText = css + \\\"position:relative\\\";\\n\\t if (container.firstChild) {\\n\\t container.insertBefore(cnvs, container.firstChild);\\n\\t } else {\\n\\t container.appendChild(cnvs);\\n\\t }\\n\\t }\\n\\t container = new R._Paper;\\n\\t container.width = width;\\n\\t container.height = height;\\n\\t container.canvas = cnvs;\\n\\t container.clear();\\n\\t container._left = container._top = 0;\\n\\t isFloating && (container.renderfix = function () {});\\n\\t container.renderfix();\\n\\t return container;\\n\\t };\\n\\t R._engine.setViewBox = function (x, y, w, h, fit) {\\n\\t eve(\\\"raphael.setViewBox\\\", this, this._viewBox, [x, y, w, h, fit]);\\n\\t var paperSize = this.getSize(),\\n\\t size = mmax(w / paperSize.width, h / paperSize.height),\\n\\t top = this.top,\\n\\t aspectRatio = fit ? \\\"xMidYMid meet\\\" : \\\"xMinYMin\\\",\\n\\t vb,\\n\\t sw;\\n\\t if (x == null) {\\n\\t if (this._vbSize) {\\n\\t size = 1;\\n\\t }\\n\\t delete this._vbSize;\\n\\t vb = \\\"0 0 \\\" + this.width + S + this.height;\\n\\t } else {\\n\\t this._vbSize = size;\\n\\t vb = x + S + y + S + w + S + h;\\n\\t }\\n\\t $(this.canvas, {\\n\\t viewBox: vb,\\n\\t preserveAspectRatio: aspectRatio\\n\\t });\\n\\t while (size && top) {\\n\\t sw = \\\"stroke-width\\\" in top.attrs ? top.attrs[\\\"stroke-width\\\"] : 1;\\n\\t top.attr({\\\"stroke-width\\\": sw});\\n\\t top._.dirty = 1;\\n\\t top._.dirtyT = 1;\\n\\t top = top.prev;\\n\\t }\\n\\t this._viewBox = [x, y, w, h, !!fit];\\n\\t return this;\\n\\t };\\n\\t /*\\\\\\n\\t * Paper.renderfix\\n\\t [ method ]\\n\\t **\\n\\t * Fixes the issue of Firefox and IE9 regarding subpixel rendering. If paper is dependent\\n\\t * on other elements after reflow it could shift half pixel which cause for lines to lost their crispness.\\n\\t * This method fixes the issue.\\n\\t **\\n\\t Special thanks to Mariusz Nowak (http://www.medikoo.com/) for this method.\\n\\t \\\\*/\\n\\t R.prototype.renderfix = function () {\\n\\t var cnvs = this.canvas,\\n\\t s = cnvs.style,\\n\\t pos;\\n\\t try {\\n\\t pos = cnvs.getScreenCTM() || cnvs.createSVGMatrix();\\n\\t } catch (e) {\\n\\t pos = cnvs.createSVGMatrix();\\n\\t }\\n\\t var left = -pos.e % 1,\\n\\t top = -pos.f % 1;\\n\\t if (left || top) {\\n\\t if (left) {\\n\\t this._left = (this._left + left) % 1;\\n\\t s.left = this._left + \\\"px\\\";\\n\\t }\\n\\t if (top) {\\n\\t this._top = (this._top + top) % 1;\\n\\t s.top = this._top + \\\"px\\\";\\n\\t }\\n\\t }\\n\\t };\\n\\t /*\\\\\\n\\t * Paper.clear\\n\\t [ method ]\\n\\t **\\n\\t * Clears the paper, i.e. removes all the elements.\\n\\t \\\\*/\\n\\t R.prototype.clear = function () {\\n\\t R.eve(\\\"raphael.clear\\\", this);\\n\\t var c = this.canvas;\\n\\t while (c.firstChild) {\\n\\t c.removeChild(c.firstChild);\\n\\t }\\n\\t this.bottom = this.top = null;\\n\\t (this.desc = $(\\\"desc\\\")).appendChild(R._g.doc.createTextNode(\\\"Created with Rapha\\\\xebl \\\" + R.version));\\n\\t c.appendChild(this.desc);\\n\\t c.appendChild(this.defs = $(\\\"defs\\\"));\\n\\t };\\n\\t /*\\\\\\n\\t * Paper.remove\\n\\t [ method ]\\n\\t **\\n\\t * Removes the paper from the DOM.\\n\\t \\\\*/\\n\\t R.prototype.remove = function () {\\n\\t eve(\\\"raphael.remove\\\", this);\\n\\t this.canvas.parentNode && this.canvas.parentNode.removeChild(this.canvas);\\n\\t for (var i in this) {\\n\\t this[i] = typeof this[i] == \\\"function\\\" ? R._removedFactory(i) : null;\\n\\t }\\n\\t };\\n\\t var setproto = R.st;\\n\\t for (var method in elproto) if (elproto[has](method) && !setproto[has](method)) {\\n\\t setproto[method] = (function (methodname) {\\n\\t return function () {\\n\\t var arg = arguments;\\n\\t return this.forEach(function (el) {\\n\\t el[methodname].apply(el, arg);\\n\\t });\\n\\t };\\n\\t })(method);\\n\\t }\\n\\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\\n\\n\\n/***/ },\\n/* 4 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(1)], __WEBPACK_AMD_DEFINE_RESULT__ = function(R) {\\n\\t if (R && !R.vml) {\\n\\t return;\\n\\t }\\n\\n\\t var has = \\\"hasOwnProperty\\\",\\n\\t Str = String,\\n\\t toFloat = parseFloat,\\n\\t math = Math,\\n\\t round = math.round,\\n\\t mmax = math.max,\\n\\t mmin = math.min,\\n\\t abs = math.abs,\\n\\t fillString = \\\"fill\\\",\\n\\t separator = /[, ]+/,\\n\\t eve = R.eve,\\n\\t ms = \\\" progid:DXImageTransform.Microsoft\\\",\\n\\t S = \\\" \\\",\\n\\t E = \\\"\\\",\\n\\t map = {M: \\\"m\\\", L: \\\"l\\\", C: \\\"c\\\", Z: \\\"x\\\", m: \\\"t\\\", l: \\\"r\\\", c: \\\"v\\\", z: \\\"x\\\"},\\n\\t bites = /([clmz]),?([^clmz]*)/gi,\\n\\t blurregexp = / progid:\\\\S+Blur\\\\([^\\\\)]+\\\\)/g,\\n\\t val = /-?[^,\\\\s-]+/g,\\n\\t cssDot = \\\"position:absolute;left:0;top:0;width:1px;height:1px;behavior:url(#default#VML)\\\",\\n\\t zoom = 21600,\\n\\t pathTypes = {path: 1, rect: 1, image: 1},\\n\\t ovalTypes = {circle: 1, ellipse: 1},\\n\\t path2vml = function (path) {\\n\\t var total = /[ahqstv]/ig,\\n\\t command = R._pathToAbsolute;\\n\\t Str(path).match(total) && (command = R._path2curve);\\n\\t total = /[clmz]/g;\\n\\t if (command == R._pathToAbsolute && !Str(path).match(total)) {\\n\\t var res = Str(path).replace(bites, function (all, command, args) {\\n\\t var vals = [],\\n\\t isMove = command.toLowerCase() == \\\"m\\\",\\n\\t res = map[command];\\n\\t args.replace(val, function (value) {\\n\\t if (isMove && vals.length == 2) {\\n\\t res += vals + map[command == \\\"m\\\" ? \\\"l\\\" : \\\"L\\\"];\\n\\t vals = [];\\n\\t }\\n\\t vals.push(round(value * zoom));\\n\\t });\\n\\t return res + vals;\\n\\t });\\n\\t return res;\\n\\t }\\n\\t var pa = command(path), p, r;\\n\\t res = [];\\n\\t for (var i = 0, ii = pa.length; i < ii; i++) {\\n\\t p = pa[i];\\n\\t r = pa[i][0].toLowerCase();\\n\\t r == \\\"z\\\" && (r = \\\"x\\\");\\n\\t for (var j = 1, jj = p.length; j < jj; j++) {\\n\\t r += round(p[j] * zoom) + (j != jj - 1 ? \\\",\\\" : E);\\n\\t }\\n\\t res.push(r);\\n\\t }\\n\\t return res.join(S);\\n\\t },\\n\\t compensation = function (deg, dx, dy) {\\n\\t var m = R.matrix();\\n\\t m.rotate(-deg, .5, .5);\\n\\t return {\\n\\t dx: m.x(dx, dy),\\n\\t dy: m.y(dx, dy)\\n\\t };\\n\\t },\\n\\t setCoords = function (p, sx, sy, dx, dy, deg) {\\n\\t var _ = p._,\\n\\t m = p.matrix,\\n\\t fillpos = _.fillpos,\\n\\t o = p.node,\\n\\t s = o.style,\\n\\t y = 1,\\n\\t flip = \\\"\\\",\\n\\t dxdy,\\n\\t kx = zoom / sx,\\n\\t ky = zoom / sy;\\n\\t s.visibility = \\\"hidden\\\";\\n\\t if (!sx || !sy) {\\n\\t return;\\n\\t }\\n\\t o.coordsize = abs(kx) + S + abs(ky);\\n\\t s.rotation = deg * (sx * sy < 0 ? -1 : 1);\\n\\t if (deg) {\\n\\t var c = compensation(deg, dx, dy);\\n\\t dx = c.dx;\\n\\t dy = c.dy;\\n\\t }\\n\\t sx < 0 && (flip += \\\"x\\\");\\n\\t sy < 0 && (flip += \\\" y\\\") && (y = -1);\\n\\t s.flip = flip;\\n\\t o.coordorigin = (dx * -kx) + S + (dy * -ky);\\n\\t if (fillpos || _.fillsize) {\\n\\t var fill = o.getElementsByTagName(fillString);\\n\\t fill = fill && fill[0];\\n\\t o.removeChild(fill);\\n\\t if (fillpos) {\\n\\t c = compensation(deg, m.x(fillpos[0], fillpos[1]), m.y(fillpos[0], fillpos[1]));\\n\\t fill.position = c.dx * y + S + c.dy * y;\\n\\t }\\n\\t if (_.fillsize) {\\n\\t fill.size = _.fillsize[0] * abs(sx) + S + _.fillsize[1] * abs(sy);\\n\\t }\\n\\t o.appendChild(fill);\\n\\t }\\n\\t s.visibility = \\\"visible\\\";\\n\\t };\\n\\t R.toString = function () {\\n\\t return \\\"Your browser doesn\\\\u2019t support SVG. Falling down to VML.\\\\nYou are running Rapha\\\\xebl \\\" + this.version;\\n\\t };\\n\\t var addArrow = function (o, value, isEnd) {\\n\\t var values = Str(value).toLowerCase().split(\\\"-\\\"),\\n\\t se = isEnd ? \\\"end\\\" : \\\"start\\\",\\n\\t i = values.length,\\n\\t type = \\\"classic\\\",\\n\\t w = \\\"medium\\\",\\n\\t h = \\\"medium\\\";\\n\\t while (i--) {\\n\\t switch (values[i]) {\\n\\t case \\\"block\\\":\\n\\t case \\\"classic\\\":\\n\\t case \\\"oval\\\":\\n\\t case \\\"diamond\\\":\\n\\t case \\\"open\\\":\\n\\t case \\\"none\\\":\\n\\t type = values[i];\\n\\t break;\\n\\t case \\\"wide\\\":\\n\\t case \\\"narrow\\\": h = values[i]; break;\\n\\t case \\\"long\\\":\\n\\t case \\\"short\\\": w = values[i]; break;\\n\\t }\\n\\t }\\n\\t var stroke = o.node.getElementsByTagName(\\\"stroke\\\")[0];\\n\\t stroke[se + \\\"arrow\\\"] = type;\\n\\t stroke[se + \\\"arrowlength\\\"] = w;\\n\\t stroke[se + \\\"arrowwidth\\\"] = h;\\n\\t },\\n\\t setFillAndStroke = function (o, params) {\\n\\t // o.paper.canvas.style.display = \\\"none\\\";\\n\\t o.attrs = o.attrs || {};\\n\\t var node = o.node,\\n\\t a = o.attrs,\\n\\t s = node.style,\\n\\t xy,\\n\\t newpath = pathTypes[o.type] && (params.x != a.x || params.y != a.y || params.width != a.width || params.height != a.height || params.cx != a.cx || params.cy != a.cy || params.rx != a.rx || params.ry != a.ry || params.r != a.r),\\n\\t isOval = ovalTypes[o.type] && (a.cx != params.cx || a.cy != params.cy || a.r != params.r || a.rx != params.rx || a.ry != params.ry),\\n\\t res = o;\\n\\n\\n\\t for (var par in params) if (params[has](par)) {\\n\\t a[par] = params[par];\\n\\t }\\n\\t if (newpath) {\\n\\t a.path = R._getPath[o.type](o);\\n\\t o._.dirty = 1;\\n\\t }\\n\\t params.href && (node.href = params.href);\\n\\t params.title && (node.title = params.title);\\n\\t params.target && (node.target = params.target);\\n\\t params.cursor && (s.cursor = params.cursor);\\n\\t \\\"blur\\\" in params && o.blur(params.blur);\\n\\t if (params.path && o.type == \\\"path\\\" || newpath) {\\n\\t node.path = path2vml(~Str(a.path).toLowerCase().indexOf(\\\"r\\\") ? R._pathToAbsolute(a.path) : a.path);\\n\\t o._.dirty = 1;\\n\\t if (o.type == \\\"image\\\") {\\n\\t o._.fillpos = [a.x, a.y];\\n\\t o._.fillsize = [a.width, a.height];\\n\\t setCoords(o, 1, 1, 0, 0, 0);\\n\\t }\\n\\t }\\n\\t \\\"transform\\\" in params && o.transform(params.transform);\\n\\t if (isOval) {\\n\\t var cx = +a.cx,\\n\\t cy = +a.cy,\\n\\t rx = +a.rx || +a.r || 0,\\n\\t ry = +a.ry || +a.r || 0;\\n\\t node.path = R.format(\\\"ar{0},{1},{2},{3},{4},{1},{4},{1}x\\\", round((cx - rx) * zoom), round((cy - ry) * zoom), round((cx + rx) * zoom), round((cy + ry) * zoom), round(cx * zoom));\\n\\t o._.dirty = 1;\\n\\t }\\n\\t if (\\\"clip-rect\\\" in params) {\\n\\t var rect = Str(params[\\\"clip-rect\\\"]).split(separator);\\n\\t if (rect.length == 4) {\\n\\t rect[2] = +rect[2] + (+rect[0]);\\n\\t rect[3] = +rect[3] + (+rect[1]);\\n\\t var div = node.clipRect || R._g.doc.createElement(\\\"div\\\"),\\n\\t dstyle = div.style;\\n\\t dstyle.clip = R.format(\\\"rect({1}px {2}px {3}px {0}px)\\\", rect);\\n\\t if (!node.clipRect) {\\n\\t dstyle.position = \\\"absolute\\\";\\n\\t dstyle.top = 0;\\n\\t dstyle.left = 0;\\n\\t dstyle.width = o.paper.width + \\\"px\\\";\\n\\t dstyle.height = o.paper.height + \\\"px\\\";\\n\\t node.parentNode.insertBefore(div, node);\\n\\t div.appendChild(node);\\n\\t node.clipRect = div;\\n\\t }\\n\\t }\\n\\t if (!params[\\\"clip-rect\\\"]) {\\n\\t node.clipRect && (node.clipRect.style.clip = \\\"auto\\\");\\n\\t }\\n\\t }\\n\\t if (o.textpath) {\\n\\t var textpathStyle = o.textpath.style;\\n\\t params.font && (textpathStyle.font = params.font);\\n\\t params[\\\"font-family\\\"] && (textpathStyle.fontFamily = '\\\"' + params[\\\"font-family\\\"].split(\\\",\\\")[0].replace(/^['\\\"]+|['\\\"]+$/g, E) + '\\\"');\\n\\t params[\\\"font-size\\\"] && (textpathStyle.fontSize = params[\\\"font-size\\\"]);\\n\\t params[\\\"font-weight\\\"] && (textpathStyle.fontWeight = params[\\\"font-weight\\\"]);\\n\\t params[\\\"font-style\\\"] && (textpathStyle.fontStyle = params[\\\"font-style\\\"]);\\n\\t }\\n\\t if (\\\"arrow-start\\\" in params) {\\n\\t addArrow(res, params[\\\"arrow-start\\\"]);\\n\\t }\\n\\t if (\\\"arrow-end\\\" in params) {\\n\\t addArrow(res, params[\\\"arrow-end\\\"], 1);\\n\\t }\\n\\t if (params.opacity != null ||\\n\\t params.fill != null ||\\n\\t params.src != null ||\\n\\t params.stroke != null ||\\n\\t params[\\\"stroke-width\\\"] != null ||\\n\\t params[\\\"stroke-opacity\\\"] != null ||\\n\\t params[\\\"fill-opacity\\\"] != null ||\\n\\t params[\\\"stroke-dasharray\\\"] != null ||\\n\\t params[\\\"stroke-miterlimit\\\"] != null ||\\n\\t params[\\\"stroke-linejoin\\\"] != null ||\\n\\t params[\\\"stroke-linecap\\\"] != null) {\\n\\t var fill = node.getElementsByTagName(fillString),\\n\\t newfill = false;\\n\\t fill = fill && fill[0];\\n\\t !fill && (newfill = fill = createNode(fillString));\\n\\t if (o.type == \\\"image\\\" && params.src) {\\n\\t fill.src = params.src;\\n\\t }\\n\\t params.fill && (fill.on = true);\\n\\t if (fill.on == null || params.fill == \\\"none\\\" || params.fill === null) {\\n\\t fill.on = false;\\n\\t }\\n\\t if (fill.on && params.fill) {\\n\\t var isURL = Str(params.fill).match(R._ISURL);\\n\\t if (isURL) {\\n\\t fill.parentNode == node && node.removeChild(fill);\\n\\t fill.rotate = true;\\n\\t fill.src = isURL[1];\\n\\t fill.type = \\\"tile\\\";\\n\\t var bbox = o.getBBox(1);\\n\\t fill.position = bbox.x + S + bbox.y;\\n\\t o._.fillpos = [bbox.x, bbox.y];\\n\\n\\t R._preload(isURL[1], function () {\\n\\t o._.fillsize = [this.offsetWidth, this.offsetHeight];\\n\\t });\\n\\t } else {\\n\\t fill.color = R.getRGB(params.fill).hex;\\n\\t fill.src = E;\\n\\t fill.type = \\\"solid\\\";\\n\\t if (R.getRGB(params.fill).error && (res.type in {circle: 1, ellipse: 1} || Str(params.fill).charAt() != \\\"r\\\") && addGradientFill(res, params.fill, fill)) {\\n\\t a.fill = \\\"none\\\";\\n\\t a.gradient = params.fill;\\n\\t fill.rotate = false;\\n\\t }\\n\\t }\\n\\t }\\n\\t if (\\\"fill-opacity\\\" in params || \\\"opacity\\\" in params) {\\n\\t var opacity = ((+a[\\\"fill-opacity\\\"] + 1 || 2) - 1) * ((+a.opacity + 1 || 2) - 1) * ((+R.getRGB(params.fill).o + 1 || 2) - 1);\\n\\t opacity = mmin(mmax(opacity, 0), 1);\\n\\t fill.opacity = opacity;\\n\\t if (fill.src) {\\n\\t fill.color = \\\"none\\\";\\n\\t }\\n\\t }\\n\\t node.appendChild(fill);\\n\\t var stroke = (node.getElementsByTagName(\\\"stroke\\\") && node.getElementsByTagName(\\\"stroke\\\")[0]),\\n\\t newstroke = false;\\n\\t !stroke && (newstroke = stroke = createNode(\\\"stroke\\\"));\\n\\t if ((params.stroke && params.stroke != \\\"none\\\") ||\\n\\t params[\\\"stroke-width\\\"] ||\\n\\t params[\\\"stroke-opacity\\\"] != null ||\\n\\t params[\\\"stroke-dasharray\\\"] ||\\n\\t params[\\\"stroke-miterlimit\\\"] ||\\n\\t params[\\\"stroke-linejoin\\\"] ||\\n\\t params[\\\"stroke-linecap\\\"]) {\\n\\t stroke.on = true;\\n\\t }\\n\\t (params.stroke == \\\"none\\\" || params.stroke === null || stroke.on == null || params.stroke == 0 || params[\\\"stroke-width\\\"] == 0) && (stroke.on = false);\\n\\t var strokeColor = R.getRGB(params.stroke);\\n\\t stroke.on && params.stroke && (stroke.color = strokeColor.hex);\\n\\t opacity = ((+a[\\\"stroke-opacity\\\"] + 1 || 2) - 1) * ((+a.opacity + 1 || 2) - 1) * ((+strokeColor.o + 1 || 2) - 1);\\n\\t var width = (toFloat(params[\\\"stroke-width\\\"]) || 1) * .75;\\n\\t opacity = mmin(mmax(opacity, 0), 1);\\n\\t params[\\\"stroke-width\\\"] == null && (width = a[\\\"stroke-width\\\"]);\\n\\t params[\\\"stroke-width\\\"] && (stroke.weight = width);\\n\\t width && width < 1 && (opacity *= width) && (stroke.weight = 1);\\n\\t stroke.opacity = opacity;\\n\\n\\t params[\\\"stroke-linejoin\\\"] && (stroke.joinstyle = params[\\\"stroke-linejoin\\\"] || \\\"miter\\\");\\n\\t stroke.miterlimit = params[\\\"stroke-miterlimit\\\"] || 8;\\n\\t params[\\\"stroke-linecap\\\"] && (stroke.endcap = params[\\\"stroke-linecap\\\"] == \\\"butt\\\" ? \\\"flat\\\" : params[\\\"stroke-linecap\\\"] == \\\"square\\\" ? \\\"square\\\" : \\\"round\\\");\\n\\t if (\\\"stroke-dasharray\\\" in params) {\\n\\t var dasharray = {\\n\\t \\\"-\\\": \\\"shortdash\\\",\\n\\t \\\".\\\": \\\"shortdot\\\",\\n\\t \\\"-.\\\": \\\"shortdashdot\\\",\\n\\t \\\"-..\\\": \\\"shortdashdotdot\\\",\\n\\t \\\". \\\": \\\"dot\\\",\\n\\t \\\"- \\\": \\\"dash\\\",\\n\\t \\\"--\\\": \\\"longdash\\\",\\n\\t \\\"- .\\\": \\\"dashdot\\\",\\n\\t \\\"--.\\\": \\\"longdashdot\\\",\\n\\t \\\"--..\\\": \\\"longdashdotdot\\\"\\n\\t };\\n\\t stroke.dashstyle = dasharray[has](params[\\\"stroke-dasharray\\\"]) ? dasharray[params[\\\"stroke-dasharray\\\"]] : E;\\n\\t }\\n\\t newstroke && node.appendChild(stroke);\\n\\t }\\n\\t if (res.type == \\\"text\\\") {\\n\\t res.paper.canvas.style.display = E;\\n\\t var span = res.paper.span,\\n\\t m = 100,\\n\\t fontSize = a.font && a.font.match(/\\\\d+(?:\\\\.\\\\d*)?(?=px)/);\\n\\t s = span.style;\\n\\t a.font && (s.font = a.font);\\n\\t a[\\\"font-family\\\"] && (s.fontFamily = a[\\\"font-family\\\"]);\\n\\t a[\\\"font-weight\\\"] && (s.fontWeight = a[\\\"font-weight\\\"]);\\n\\t a[\\\"font-style\\\"] && (s.fontStyle = a[\\\"font-style\\\"]);\\n\\t fontSize = toFloat(a[\\\"font-size\\\"] || fontSize && fontSize[0]) || 10;\\n\\t s.fontSize = fontSize * m + \\\"px\\\";\\n\\t res.textpath.string && (span.innerHTML = Str(res.textpath.string).replace(/</g, \\\"<\\\").replace(/&/g, \\\"&\\\").replace(/\\\\n/g, \\\"<br>\\\"));\\n\\t var brect = span.getBoundingClientRect();\\n\\t res.W = a.w = (brect.right - brect.left) / m;\\n\\t res.H = a.h = (brect.bottom - brect.top) / m;\\n\\t // res.paper.canvas.style.display = \\\"none\\\";\\n\\t res.X = a.x;\\n\\t res.Y = a.y + res.H / 2;\\n\\n\\t (\\\"x\\\" in params || \\\"y\\\" in params) && (res.path.v = R.format(\\\"m{0},{1}l{2},{1}\\\", round(a.x * zoom), round(a.y * zoom), round(a.x * zoom) + 1));\\n\\t var dirtyattrs = [\\\"x\\\", \\\"y\\\", \\\"text\\\", \\\"font\\\", \\\"font-family\\\", \\\"font-weight\\\", \\\"font-style\\\", \\\"font-size\\\"];\\n\\t for (var d = 0, dd = dirtyattrs.length; d < dd; d++) if (dirtyattrs[d] in params) {\\n\\t res._.dirty = 1;\\n\\t break;\\n\\t }\\n\\n\\t // text-anchor emulation\\n\\t switch (a[\\\"text-anchor\\\"]) {\\n\\t case \\\"start\\\":\\n\\t res.textpath.style[\\\"v-text-align\\\"] = \\\"left\\\";\\n\\t res.bbx = res.W / 2;\\n\\t break;\\n\\t case \\\"end\\\":\\n\\t res.textpath.style[\\\"v-text-align\\\"] = \\\"right\\\";\\n\\t res.bbx = -res.W / 2;\\n\\t break;\\n\\t default:\\n\\t res.textpath.style[\\\"v-text-align\\\"] = \\\"center\\\";\\n\\t res.bbx = 0;\\n\\t break;\\n\\t }\\n\\t res.textpath.style[\\\"v-text-kern\\\"] = true;\\n\\t }\\n\\t // res.paper.canvas.style.display = E;\\n\\t },\\n\\t addGradientFill = function (o, gradient, fill) {\\n\\t o.attrs = o.attrs || {};\\n\\t var attrs = o.attrs,\\n\\t pow = Math.pow,\\n\\t opacity,\\n\\t oindex,\\n\\t type = \\\"linear\\\",\\n\\t fxfy = \\\".5 .5\\\";\\n\\t o.attrs.gradient = gradient;\\n\\t gradient = Str(gradient).replace(R._radial_gradient, function (all, fx, fy) {\\n\\t type = \\\"radial\\\";\\n\\t if (fx && fy) {\\n\\t fx = toFloat(fx);\\n\\t fy = toFloat(fy);\\n\\t pow(fx - .5, 2) + pow(fy - .5, 2) > .25 && (fy = math.sqrt(.25 - pow(fx - .5, 2)) * ((fy > .5) * 2 - 1) + .5);\\n\\t fxfy = fx + S + fy;\\n\\t }\\n\\t return E;\\n\\t });\\n\\t gradient = gradient.split(/\\\\s*\\\\-\\\\s*/);\\n\\t if (type == \\\"linear\\\") {\\n\\t var angle = gradient.shift();\\n\\t angle = -toFloat(angle);\\n\\t if (isNaN(angle)) {\\n\\t return null;\\n\\t }\\n\\t }\\n\\t var dots = R._parseDots(gradient);\\n\\t if (!dots) {\\n\\t return null;\\n\\t }\\n\\t o = o.shape || o.node;\\n\\t if (dots.length) {\\n\\t o.removeChild(fill);\\n\\t fill.on = true;\\n\\t fill.method = \\\"none\\\";\\n\\t fill.color = dots[0].color;\\n\\t fill.color2 = dots[dots.length - 1].color;\\n\\t var clrs = [];\\n\\t for (var i = 0, ii = dots.length; i < ii; i++) {\\n\\t dots[i].offset && clrs.push(dots[i].offset + S + dots[i].color);\\n\\t }\\n\\t fill.colors = clrs.length ? clrs.join() : \\\"0% \\\" + fill.color;\\n\\t if (type == \\\"radial\\\") {\\n\\t fill.type = \\\"gradientTitle\\\";\\n\\t fill.focus = \\\"100%\\\";\\n\\t fill.focussize = \\\"0 0\\\";\\n\\t fill.focusposition = fxfy;\\n\\t fill.angle = 0;\\n\\t } else {\\n\\t // fill.rotate= true;\\n\\t fill.type = \\\"gradient\\\";\\n\\t fill.angle = (270 - angle) % 360;\\n\\t }\\n\\t o.appendChild(fill);\\n\\t }\\n\\t return 1;\\n\\t },\\n\\t Element = function (node, vml) {\\n\\t this[0] = this.node = node;\\n\\t node.raphael = true;\\n\\t this.id = R._oid++;\\n\\t node.raphaelid = this.id;\\n\\t this.X = 0;\\n\\t this.Y = 0;\\n\\t this.attrs = {};\\n\\t this.paper = vml;\\n\\t this.matrix = R.matrix();\\n\\t this._ = {\\n\\t transform: [],\\n\\t sx: 1,\\n\\t sy: 1,\\n\\t dx: 0,\\n\\t dy: 0,\\n\\t deg: 0,\\n\\t dirty: 1,\\n\\t dirtyT: 1\\n\\t };\\n\\t !vml.bottom && (vml.bottom = this);\\n\\t this.prev = vml.top;\\n\\t vml.top && (vml.top.next = this);\\n\\t vml.top = this;\\n\\t this.next = null;\\n\\t };\\n\\t var elproto = R.el;\\n\\n\\t Element.prototype = elproto;\\n\\t elproto.constructor = Element;\\n\\t elproto.transform = function (tstr) {\\n\\t if (tstr == null) {\\n\\t return this._.transform;\\n\\t }\\n\\t var vbs = this.paper._viewBoxShift,\\n\\t vbt = vbs ? \\\"s\\\" + [vbs.scale, vbs.scale] + \\\"-1-1t\\\" + [vbs.dx, vbs.dy] : E,\\n\\t oldt;\\n\\t if (vbs) {\\n\\t oldt = tstr = Str(tstr).replace(/\\\\.{3}|\\\\u2026/g, this._.transform || E);\\n\\t }\\n\\t R._extractTransform(this, vbt + tstr);\\n\\t var matrix = this.matrix.clone(),\\n\\t skew = this.skew,\\n\\t o = this.node,\\n\\t split,\\n\\t isGrad = ~Str(this.attrs.fill).indexOf(\\\"-\\\"),\\n\\t isPatt = !Str(this.attrs.fill).indexOf(\\\"url(\\\");\\n\\t matrix.translate(1, 1);\\n\\t if (isPatt || isGrad || this.type == \\\"image\\\") {\\n\\t skew.matrix = \\\"1 0 0 1\\\";\\n\\t skew.offset = \\\"0 0\\\";\\n\\t split = matrix.split();\\n\\t if ((isGrad && split.noRotation) || !split.isSimple) {\\n\\t o.style.filter = matrix.toFilter();\\n\\t var bb = this.getBBox(),\\n\\t bbt = this.getBBox(1),\\n\\t dx = bb.x - bbt.x,\\n\\t dy = bb.y - bbt.y;\\n\\t o.coordorigin = (dx * -zoom) + S + (dy * -zoom);\\n\\t setCoords(this, 1, 1, dx, dy, 0);\\n\\t } else {\\n\\t o.style.filter = E;\\n\\t setCoords(this, split.scalex, split.scaley, split.dx, split.dy, split.rotate);\\n\\t }\\n\\t } else {\\n\\t o.style.filter = E;\\n\\t skew.matrix = Str(matrix);\\n\\t skew.offset = matrix.offset();\\n\\t }\\n\\t if (oldt !== null) { // empty string value is true as well\\n\\t this._.transform = oldt;\\n\\t R._extractTransform(this, oldt);\\n\\t }\\n\\t return this;\\n\\t };\\n\\t elproto.rotate = function (deg, cx, cy) {\\n\\t if (this.removed) {\\n\\t return this;\\n\\t }\\n\\t if (deg == null) {\\n\\t return;\\n\\t }\\n\\t deg = Str(deg).split(separator);\\n\\t if (deg.length - 1) {\\n\\t cx = toFloat(deg[1]);\\n\\t cy = toFloat(deg[2]);\\n\\t }\\n\\t deg = toFloat(deg[0]);\\n\\t (cy == null) && (cx = cy);\\n\\t if (cx == null || cy == null) {\\n\\t var bbox = this.getBBox(1);\\n\\t cx = bbox.x + bbox.width / 2;\\n\\t cy = bbox.y + bbox.height / 2;\\n\\t }\\n\\t this._.dirtyT = 1;\\n\\t this.transform(this._.transform.concat([[\\\"r\\\", deg, cx, cy]]));\\n\\t return this;\\n\\t };\\n\\t elproto.translate = function (dx, dy) {\\n\\t if (this.removed) {\\n\\t return this;\\n\\t }\\n\\t dx = Str(dx).split(separator);\\n\\t if (dx.length - 1) {\\n\\t dy = toFloat(dx[1]);\\n\\t }\\n\\t dx = toFloat(dx[0]) || 0;\\n\\t dy = +dy || 0;\\n\\t if (this._.bbox) {\\n\\t this._.bbox.x += dx;\\n\\t this._.bbox.y += dy;\\n\\t }\\n\\t this.transform(this._.transform.concat([[\\\"t\\\", dx, dy]]));\\n\\t return this;\\n\\t };\\n\\t elproto.scale = function (sx, sy, cx, cy) {\\n\\t if (this.removed) {\\n\\t return this;\\n\\t }\\n\\t sx = Str(sx).split(separator);\\n\\t if (sx.length - 1) {\\n\\t sy = toFloat(sx[1]);\\n\\t cx = toFloat(sx[2]);\\n\\t cy = toFloat(sx[3]);\\n\\t isNaN(cx) && (cx = null);\\n\\t isNaN(cy) && (cy = null);\\n\\t }\\n\\t sx = toFloat(sx[0]);\\n\\t (sy == null) && (sy = sx);\\n\\t (cy == null) && (cx = cy);\\n\\t if (cx == null || cy == null) {\\n\\t var bbox = this.getBBox(1);\\n\\t }\\n\\t cx = cx == null ? bbox.x + bbox.width / 2 : cx;\\n\\t cy = cy == null ? bbox.y + bbox.height / 2 : cy;\\n\\n\\t this.transform(this._.transform.concat([[\\\"s\\\", sx, sy, cx, cy]]));\\n\\t this._.dirtyT = 1;\\n\\t return this;\\n\\t };\\n\\t elproto.hide = function () {\\n\\t !this.removed && (this.node.style.display = \\\"none\\\");\\n\\t return this;\\n\\t };\\n\\t elproto.show = function () {\\n\\t !this.removed && (this.node.style.display = E);\\n\\t return this;\\n\\t };\\n\\t // Needed to fix the vml setViewBox issues\\n\\t elproto.auxGetBBox = R.el.getBBox;\\n\\t elproto.getBBox = function(){\\n\\t var b = this.auxGetBBox();\\n\\t if (this.paper && this.paper._viewBoxShift)\\n\\t {\\n\\t var c = {};\\n\\t var z = 1/this.paper._viewBoxShift.scale;\\n\\t c.x = b.x - this.paper._viewBoxShift.dx;\\n\\t c.x *= z;\\n\\t c.y = b.y - this.paper._viewBoxShift.dy;\\n\\t c.y *= z;\\n\\t c.width = b.width * z;\\n\\t c.height = b.height * z;\\n\\t c.x2 = c.x + c.width;\\n\\t c.y2 = c.y + c.height;\\n\\t return c;\\n\\t }\\n\\t return b;\\n\\t };\\n\\t elproto._getBBox = function () {\\n\\t if (this.removed) {\\n\\t return {};\\n\\t }\\n\\t return {\\n\\t x: this.X + (this.bbx || 0) - this.W / 2,\\n\\t y: this.Y - this.H,\\n\\t width: this.W,\\n\\t height: this.H\\n\\t };\\n\\t };\\n\\t elproto.remove = function () {\\n\\t if (this.removed || !this.node.parentNode) {\\n\\t return;\\n\\t }\\n\\t this.paper.__set__ && this.paper.__set__.exclude(this);\\n\\t R.eve.unbind(\\\"raphael.*.*.\\\" + this.id);\\n\\t R._tear(this, this.paper);\\n\\t this.node.parentNode.removeChild(this.node);\\n\\t this.shape && this.shape.parentNode.removeChild(this.shape);\\n\\t for (var i in this) {\\n\\t this[i] = typeof this[i] == \\\"function\\\" ? R._removedFactory(i) : null;\\n\\t }\\n\\t this.removed = true;\\n\\t };\\n\\t elproto.attr = function (name, value) {\\n\\t if (this.removed) {\\n\\t return this;\\n\\t }\\n\\t if (name == null) {\\n\\t var res = {};\\n\\t for (var a in this.attrs) if (this.attrs[has](a)) {\\n\\t res[a] = this.attrs[a];\\n\\t }\\n\\t res.gradient && res.fill == \\\"none\\\" && (res.fill = res.gradient) && delete res.gradient;\\n\\t res.transform = this._.transform;\\n\\t return res;\\n\\t }\\n\\t if (value == null && R.is(name, \\\"string\\\")) {\\n\\t if (name == fillString && this.attrs.fill == \\\"none\\\" && this.attrs.gradient) {\\n\\t return this.attrs.gradient;\\n\\t }\\n\\t var names = name.split(separator),\\n\\t out = {};\\n\\t for (var i = 0, ii = names.length; i < ii; i++) {\\n\\t name = names[i];\\n\\t if (name in this.attrs) {\\n\\t out[name] = this.attrs[name];\\n\\t } else if (R.is(this.paper.customAttributes[name], \\\"function\\\")) {\\n\\t out[name] = this.paper.customAttributes[name].def;\\n\\t } else {\\n\\t out[name] = R._availableAttrs[name];\\n\\t }\\n\\t }\\n\\t return ii - 1 ? out : out[names[0]];\\n\\t }\\n\\t if (this.attrs && value == null && R.is(name, \\\"array\\\")) {\\n\\t out = {};\\n\\t for (i = 0, ii = name.length; i < ii; i++) {\\n\\t out[name[i]] = this.attr(name[i]);\\n\\t }\\n\\t return out;\\n\\t }\\n\\t var params;\\n\\t if (value != null) {\\n\\t params = {};\\n\\t params[name] = value;\\n\\t }\\n\\t value == null && R.is(name, \\\"object\\\") && (params = name);\\n\\t for (var key in params) {\\n\\t eve(\\\"raphael.attr.\\\" + key + \\\".\\\" + this.id, this, params[key]);\\n\\t }\\n\\t if (params) {\\n\\t for (key in this.paper.customAttributes) if (this.paper.customAttributes[has](key) && params[has](key) && R.is(this.paper.customAttributes[key], \\\"function\\\")) {\\n\\t var par = this.paper.customAttributes[key].apply(this, [].concat(params[key]));\\n\\t this.attrs[key] = params[key];\\n\\t for (var subkey in par) if (par[has](subkey)) {\\n\\t params[subkey] = par[subkey];\\n\\t }\\n\\t }\\n\\t // this.paper.canvas.style.display = \\\"none\\\";\\n\\t if (params.text && this.type == \\\"text\\\") {\\n\\t this.textpath.string = params.text;\\n\\t }\\n\\t setFillAndStroke(this, params);\\n\\t // this.paper.canvas.style.display = E;\\n\\t }\\n\\t return this;\\n\\t };\\n\\t elproto.toFront = function () {\\n\\t !this.removed && this.node.parentNode.appendChild(this.node);\\n\\t this.paper && this.paper.top != this && R._tofront(this, this.paper);\\n\\t return this;\\n\\t };\\n\\t elproto.toBack = function () {\\n\\t if (this.removed) {\\n\\t return this;\\n\\t }\\n\\t if (this.node.parentNode.firstChild != this.node) {\\n\\t this.node.parentNode.insertBefore(this.node, this.node.parentNode.firstChild);\\n\\t R._toback(this, this.paper);\\n\\t }\\n\\t return this;\\n\\t };\\n\\t elproto.insertAfter = function (element) {\\n\\t if (this.removed) {\\n\\t return this;\\n\\t }\\n\\t if (element.constructor == R.st.constructor) {\\n\\t element = element[element.length - 1];\\n\\t }\\n\\t if (element.node.nextSibling) {\\n\\t element.node.parentNode.insertBefore(this.node, element.node.nextSibling);\\n\\t } else {\\n\\t element.node.parentNode.appendChild(this.node);\\n\\t }\\n\\t R._insertafter(this, element, this.paper);\\n\\t return this;\\n\\t };\\n\\t elproto.insertBefore = function (element) {\\n\\t if (this.removed) {\\n\\t return this;\\n\\t }\\n\\t if (element.constructor == R.st.constructor) {\\n\\t element = element[0];\\n\\t }\\n\\t element.node.parentNode.insertBefore(this.node, element.node);\\n\\t R._insertbefore(this, element, this.paper);\\n\\t return this;\\n\\t };\\n\\t elproto.blur = function (size) {\\n\\t var s = this.node.runtimeStyle,\\n\\t f = s.filter;\\n\\t f = f.replace(blurregexp, E);\\n\\t if (+size !== 0) {\\n\\t this.attrs.blur = size;\\n\\t s.filter = f + S + ms + \\\".Blur(pixelradius=\\\" + (+size || 1.5) + \\\")\\\";\\n\\t s.margin = R.format(\\\"-{0}px 0 0 -{0}px\\\", round(+size || 1.5));\\n\\t } else {\\n\\t s.filter = f;\\n\\t s.margin = 0;\\n\\t delete this.attrs.blur;\\n\\t }\\n\\t return this;\\n\\t };\\n\\n\\t R._engine.path = function (pathString, vml) {\\n\\t var el = createNode(\\\"shape\\\");\\n\\t el.style.cssText = cssDot;\\n\\t el.coordsize = zoom + S + zoom;\\n\\t el.coordorigin = vml.coordorigin;\\n\\t var p = new Element(el, vml),\\n\\t attr = {fill: \\\"none\\\", stroke: \\\"#000\\\"};\\n\\t pathString && (attr.path = pathString);\\n\\t p.type = \\\"path\\\";\\n\\t p.path = [];\\n\\t p.Path = E;\\n\\t setFillAndStroke(p, attr);\\n\\t vml.canvas && vml.canvas.appendChild(el);\\n\\t var skew = createNode(\\\"skew\\\");\\n\\t skew.on = true;\\n\\t el.appendChild(skew);\\n\\t p.skew = skew;\\n\\t p.transform(E);\\n\\t return p;\\n\\t };\\n\\t R._engine.rect = function (vml, x, y, w, h, r) {\\n\\t var path = R._rectPath(x, y, w, h, r),\\n\\t res = vml.path(path),\\n\\t a = res.attrs;\\n\\t res.X = a.x = x;\\n\\t res.Y = a.y = y;\\n\\t res.W = a.width = w;\\n\\t res.H = a.height = h;\\n\\t a.r = r;\\n\\t a.path = path;\\n\\t res.type = \\\"rect\\\";\\n\\t return res;\\n\\t };\\n\\t R._engine.ellipse = function (vml, x, y, rx, ry) {\\n\\t var res = vml.path(),\\n\\t a = res.attrs;\\n\\t res.X = x - rx;\\n\\t res.Y = y - ry;\\n\\t res.W = rx * 2;\\n\\t res.H = ry * 2;\\n\\t res.type = \\\"ellipse\\\";\\n\\t setFillAndStroke(res, {\\n\\t cx: x,\\n\\t cy: y,\\n\\t rx: rx,\\n\\t ry: ry\\n\\t });\\n\\t return res;\\n\\t };\\n\\t R._engine.circle = function (vml, x, y, r) {\\n\\t var res = vml.path(),\\n\\t a = res.attrs;\\n\\t res.X = x - r;\\n\\t res.Y = y - r;\\n\\t res.W = res.H = r * 2;\\n\\t res.type = \\\"circle\\\";\\n\\t setFillAndStroke(res, {\\n\\t cx: x,\\n\\t cy: y,\\n\\t r: r\\n\\t });\\n\\t return res;\\n\\t };\\n\\t R._engine.image = function (vml, src, x, y, w, h) {\\n\\t var path = R._rectPath(x, y, w, h),\\n\\t res = vml.path(path).attr({stroke: \\\"none\\\"}),\\n\\t a = res.attrs,\\n\\t node = res.node,\\n\\t fill = node.getElementsByTagName(fillString)[0];\\n\\t a.src = src;\\n\\t res.X = a.x = x;\\n\\t res.Y = a.y = y;\\n\\t res.W = a.width = w;\\n\\t res.H = a.height = h;\\n\\t a.path = path;\\n\\t res.type = \\\"image\\\";\\n\\t fill.parentNode == node && node.removeChild(fill);\\n\\t fill.rotate = true;\\n\\t fill.src = src;\\n\\t fill.type = \\\"tile\\\";\\n\\t res._.fillpos = [x, y];\\n\\t res._.fillsize = [w, h];\\n\\t node.appendChild(fill);\\n\\t setCoords(res, 1, 1, 0, 0, 0);\\n\\t return res;\\n\\t };\\n\\t R._engine.text = function (vml, x, y, text) {\\n\\t var el = createNode(\\\"shape\\\"),\\n\\t path = createNode(\\\"path\\\"),\\n\\t o = createNode(\\\"textpath\\\");\\n\\t x = x || 0;\\n\\t y = y || 0;\\n\\t text = text || \\\"\\\";\\n\\t path.v = R.format(\\\"m{0},{1}l{2},{1}\\\", round(x * zoom), round(y * zoom), round(x * zoom) + 1);\\n\\t path.textpathok = true;\\n\\t o.string = Str(text);\\n\\t o.on = true;\\n\\t el.style.cssText = cssDot;\\n\\t el.coordsize = zoom + S + zoom;\\n\\t el.coordorigin = \\\"0 0\\\";\\n\\t var p = new Element(el, vml),\\n\\t attr = {\\n\\t fill: \\\"#000\\\",\\n\\t stroke: \\\"none\\\",\\n\\t font: R._availableAttrs.font,\\n\\t text: text\\n\\t };\\n\\t p.shape = el;\\n\\t p.path = path;\\n\\t p.textpath = o;\\n\\t p.type = \\\"text\\\";\\n\\t p.attrs.text = Str(text);\\n\\t p.attrs.x = x;\\n\\t p.attrs.y = y;\\n\\t p.attrs.w = 1;\\n\\t p.attrs.h = 1;\\n\\t setFillAndStroke(p, attr);\\n\\t el.appendChild(o);\\n\\t el.appendChild(path);\\n\\t vml.canvas.appendChild(el);\\n\\t var skew = createNode(\\\"skew\\\");\\n\\t skew.on = true;\\n\\t el.appendChild(skew);\\n\\t p.skew = skew;\\n\\t p.transform(E);\\n\\t return p;\\n\\t };\\n\\t R._engine.setSize = function (width, height) {\\n\\t var cs = this.canvas.style;\\n\\t this.width = width;\\n\\t this.height = height;\\n\\t width == +width && (width += \\\"px\\\");\\n\\t height == +height && (height += \\\"px\\\");\\n\\t cs.width = width;\\n\\t cs.height = height;\\n\\t cs.clip = \\\"rect(0 \\\" + width + \\\" \\\" + height + \\\" 0)\\\";\\n\\t if (this._viewBox) {\\n\\t R._engine.setViewBox.apply(this, this._viewBox);\\n\\t }\\n\\t return this;\\n\\t };\\n\\t R._engine.setViewBox = function (x, y, w, h, fit) {\\n\\t R.eve(\\\"raphael.setViewBox\\\", this, this._viewBox, [x, y, w, h, fit]);\\n\\t var paperSize = this.getSize(),\\n\\t width = paperSize.width,\\n\\t height = paperSize.height,\\n\\t H, W;\\n\\t if (fit) {\\n\\t H = height / h;\\n\\t W = width / w;\\n\\t if (w * H < width) {\\n\\t x -= (width - w * H) / 2 / H;\\n\\t }\\n\\t if (h * W < height) {\\n\\t y -= (height - h * W) / 2 / W;\\n\\t }\\n\\t }\\n\\t this._viewBox = [x, y, w, h, !!fit];\\n\\t this._viewBoxShift = {\\n\\t dx: -x,\\n\\t dy: -y,\\n\\t scale: paperSize\\n\\t };\\n\\t this.forEach(function (el) {\\n\\t el.transform(\\\"...\\\");\\n\\t });\\n\\t return this;\\n\\t };\\n\\t var createNode;\\n\\t R._engine.initWin = function (win) {\\n\\t var doc = win.document;\\n\\t if (doc.styleSheets.length < 31) {\\n\\t doc.createStyleSheet().addRule(\\\".rvml\\\", \\\"behavior:url(#default#VML)\\\");\\n\\t } else {\\n\\t // no more room, add to the existing one\\n\\t // http://msdn.microsoft.com/en-us/library/ms531194%28VS.85%29.aspx\\n\\t doc.styleSheets[0].addRule(\\\".rvml\\\", \\\"behavior:url(#default#VML)\\\");\\n\\t }\\n\\t try {\\n\\t !doc.namespaces.rvml && doc.namespaces.add(\\\"rvml\\\", \\\"urn:schemas-microsoft-com:vml\\\");\\n\\t createNode = function (tagName) {\\n\\t return doc.createElement('<rvml:' + tagName + ' class=\\\"rvml\\\">');\\n\\t };\\n\\t } catch (e) {\\n\\t createNode = function (tagName) {\\n\\t return doc.createElement('<' + tagName + ' xmlns=\\\"urn:schemas-microsoft.com:vml\\\" class=\\\"rvml\\\">');\\n\\t };\\n\\t }\\n\\t };\\n\\t R._engine.initWin(R._g.win);\\n\\t R._engine.create = function () {\\n\\t var con = R._getContainer.apply(0, arguments),\\n\\t container = con.container,\\n\\t height = con.height,\\n\\t s,\\n\\t width = con.width,\\n\\t x = con.x,\\n\\t y = con.y;\\n\\t if (!container) {\\n\\t throw new Error(\\\"VML container not found.\\\");\\n\\t }\\n\\t var res = new R._Paper,\\n\\t c = res.canvas = R._g.doc.createElement(\\\"div\\\"),\\n\\t cs = c.style;\\n\\t x = x || 0;\\n\\t y = y || 0;\\n\\t width = width || 512;\\n\\t height = height || 342;\\n\\t res.width = width;\\n\\t res.height = height;\\n\\t width == +width && (width += \\\"px\\\");\\n\\t height == +height && (height += \\\"px\\\");\\n\\t res.coordsize = zoom * 1e3 + S + zoom * 1e3;\\n\\t res.coordorigin = \\\"0 0\\\";\\n\\t res.span = R._g.doc.createElement(\\\"span\\\");\\n\\t res.span.style.cssText = \\\"position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;\\\";\\n\\t c.appendChild(res.span);\\n\\t cs.cssText = R.format(\\\"top:0;left:0;width:{0};height:{1};display:inline-block;position:relative;clip:rect(0 {0} {1} 0);overflow:hidden\\\", width, height);\\n\\t if (container == 1) {\\n\\t R._g.doc.body.appendChild(c);\\n\\t cs.left = x + \\\"px\\\";\\n\\t cs.top = y + \\\"px\\\";\\n\\t cs.position = \\\"absolute\\\";\\n\\t } else {\\n\\t if (container.firstChild) {\\n\\t container.insertBefore(c, container.firstChild);\\n\\t } else {\\n\\t container.appendChild(c);\\n\\t }\\n\\t }\\n\\t res.renderfix = function () {};\\n\\t return res;\\n\\t };\\n\\t R.prototype.clear = function () {\\n\\t R.eve(\\\"raphael.clear\\\", this);\\n\\t this.canvas.innerHTML = E;\\n\\t this.span = R._g.doc.createElement(\\\"span\\\");\\n\\t this.span.style.cssText = \\\"position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;display:inline;\\\";\\n\\t this.canvas.appendChild(this.span);\\n\\t this.bottom = this.top = null;\\n\\t };\\n\\t R.prototype.remove = function () {\\n\\t R.eve(\\\"raphael.remove\\\", this);\\n\\t this.canvas.parentNode.removeChild(this.canvas);\\n\\t for (var i in this) {\\n\\t this[i] = typeof this[i] == \\\"function\\\" ? R._removedFactory(i) : null;\\n\\t }\\n\\t return true;\\n\\t };\\n\\n\\t var setproto = R.st;\\n\\t for (var method in elproto) if (elproto[has](method) && !setproto[has](method)) {\\n\\t setproto[method] = (function (methodname) {\\n\\t return function () {\\n\\t var arg = arguments;\\n\\t return this.forEach(function (el) {\\n\\t el[methodname].apply(el, arg);\\n\\t });\\n\\t };\\n\\t })(method);\\n\\t }\\n\\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\\n\\n\\n/***/ }\\n/******/ ])\\n});\\n;\"\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/raw-loader!./src/assets/inspinia/plugins/morris/raphael.js\n// module id = 2184\n// module chunks = 1","require(\"!!/opt/atlassian/pipelines/agent/build/node_modules/script-loader/addScript.js\")(require(\"!!/opt/atlassian/pipelines/agent/build/node_modules/raw-loader/index.js!/opt/atlassian/pipelines/agent/build/src/assets/inspinia/plugins/morris/morris.js\"))\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/script-loader!./src/assets/inspinia/plugins/morris/morris.js\n// module id = 2185\n// module chunks = 1","module.exports = \"/* @license\\nmorris.js v0.5.0\\nCopyright 2014 Olly Smith All rights reserved.\\nLicensed under the BSD-2-Clause License.\\n*/\\n\\n\\n(function() {\\n var $, Morris, minutesSpecHelper, secondsSpecHelper,\\n __slice = [].slice,\\n __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },\\n __hasProp = {}.hasOwnProperty,\\n __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\\n __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };\\n\\n Morris = window.Morris = {};\\n\\n $ = jQuery;\\n\\n Morris.EventEmitter = (function() {\\n function EventEmitter() {}\\n\\n EventEmitter.prototype.on = function(name, handler) {\\n if (this.handlers == null) {\\n this.handlers = {};\\n }\\n if (this.handlers[name] == null) {\\n this.handlers[name] = [];\\n }\\n this.handlers[name].push(handler);\\n return this;\\n };\\n\\n EventEmitter.prototype.fire = function() {\\n var args, handler, name, _i, _len, _ref, _results;\\n name = arguments[0], args = 2 <= arguments.length ? __slice.call(arguments, 1) : [];\\n if ((this.handlers != null) && (this.handlers[name] != null)) {\\n _ref = this.handlers[name];\\n _results = [];\\n for (_i = 0, _len = _ref.length; _i < _len; _i++) {\\n handler = _ref[_i];\\n _results.push(handler.apply(null, args));\\n }\\n return _results;\\n }\\n };\\n\\n return EventEmitter;\\n\\n })();\\n\\n Morris.commas = function(num) {\\n var absnum, intnum, ret, strabsnum;\\n if (num != null) {\\n ret = num < 0 ? \\\"-\\\" : \\\"\\\";\\n absnum = Math.abs(num);\\n intnum = Math.floor(absnum).toFixed(0);\\n ret += intnum.replace(/(?=(?:\\\\d{3})+$)(?!^)/g, ',');\\n strabsnum = absnum.toString();\\n if (strabsnum.length > intnum.length) {\\n ret += strabsnum.slice(intnum.length);\\n }\\n return ret;\\n } else {\\n return '-';\\n }\\n };\\n\\n Morris.pad2 = function(number) {\\n return (number < 10 ? '0' : '') + number;\\n };\\n\\n Morris.Grid = (function(_super) {\\n __extends(Grid, _super);\\n\\n function Grid(options) {\\n this.resizeHandler = __bind(this.resizeHandler, this);\\n var _this = this;\\n if (typeof options.element === 'string') {\\n this.el = $(document.getElementById(options.element));\\n } else {\\n this.el = $(options.element);\\n }\\n if ((this.el == null) || this.el.length === 0) {\\n throw new Error(\\\"Graph container element not found\\\");\\n }\\n if (this.el.css('position') === 'static') {\\n this.el.css('position', 'relative');\\n }\\n this.options = $.extend({}, this.gridDefaults, this.defaults || {}, options);\\n if (typeof this.options.units === 'string') {\\n this.options.postUnits = options.units;\\n }\\n this.raphael = new Raphael(this.el[0]);\\n this.elementWidth = null;\\n this.elementHeight = null;\\n this.dirty = false;\\n this.selectFrom = null;\\n if (this.init) {\\n this.init();\\n }\\n this.setData(this.options.data);\\n this.el.bind('mousemove', function(evt) {\\n var left, offset, right, width, x;\\n offset = _this.el.offset();\\n x = evt.pageX - offset.left;\\n if (_this.selectFrom) {\\n left = _this.data[_this.hitTest(Math.min(x, _this.selectFrom))]._x;\\n right = _this.data[_this.hitTest(Math.max(x, _this.selectFrom))]._x;\\n width = right - left;\\n return _this.selectionRect.attr({\\n x: left,\\n width: width\\n });\\n } else {\\n return _this.fire('hovermove', x, evt.pageY - offset.top);\\n }\\n });\\n this.el.bind('mouseleave', function(evt) {\\n if (_this.selectFrom) {\\n _this.selectionRect.hide();\\n _this.selectFrom = null;\\n }\\n return _this.fire('hoverout');\\n });\\n this.el.bind('touchstart touchmove touchend', function(evt) {\\n var offset, touch;\\n touch = evt.originalEvent.touches[0] || evt.originalEvent.changedTouches[0];\\n offset = _this.el.offset();\\n return _this.fire('hovermove', touch.pageX - offset.left, touch.pageY - offset.top);\\n });\\n this.el.bind('click', function(evt) {\\n var offset;\\n offset = _this.el.offset();\\n return _this.fire('gridclick', evt.pageX - offset.left, evt.pageY - offset.top);\\n });\\n if (this.options.rangeSelect) {\\n this.selectionRect = this.raphael.rect(0, 0, 0, this.el.innerHeight()).attr({\\n fill: this.options.rangeSelectColor,\\n stroke: false\\n }).toBack().hide();\\n this.el.bind('mousedown', function(evt) {\\n var offset;\\n offset = _this.el.offset();\\n return _this.startRange(evt.pageX - offset.left);\\n });\\n this.el.bind('mouseup', function(evt) {\\n var offset;\\n offset = _this.el.offset();\\n _this.endRange(evt.pageX - offset.left);\\n return _this.fire('hovermove', evt.pageX - offset.left, evt.pageY - offset.top);\\n });\\n }\\n if (this.options.resize) {\\n $(window).bind('resize', function(evt) {\\n if (_this.timeoutId != null) {\\n window.clearTimeout(_this.timeoutId);\\n }\\n return _this.timeoutId = window.setTimeout(_this.resizeHandler, 100);\\n });\\n }\\n this.el.css('-webkit-tap-highlight-color', 'rgba(0,0,0,0)');\\n if (this.postInit) {\\n this.postInit();\\n }\\n }\\n\\n Grid.prototype.gridDefaults = {\\n dateFormat: null,\\n axes: true,\\n grid: true,\\n gridLineColor: '#aaa',\\n gridStrokeWidth: 0.5,\\n gridTextColor: '#888',\\n gridTextSize: 12,\\n gridTextFamily: 'sans-serif',\\n gridTextWeight: 'normal',\\n hideHover: false,\\n yLabelFormat: null,\\n xLabelAngle: 0,\\n numLines: 5,\\n padding: 25,\\n parseTime: true,\\n postUnits: '',\\n preUnits: '',\\n ymax: 'auto',\\n ymin: 'auto 0',\\n goals: [],\\n goalStrokeWidth: 1.0,\\n goalLineColors: ['#666633', '#999966', '#cc6666', '#663333'],\\n events: [],\\n eventStrokeWidth: 1.0,\\n eventLineColors: ['#005a04', '#ccffbb', '#3a5f0b', '#005502'],\\n rangeSelect: null,\\n rangeSelectColor: '#eef',\\n resize: false\\n };\\n\\n Grid.prototype.setData = function(data, redraw) {\\n var e, idx, index, maxGoal, minGoal, ret, row, step, total, y, ykey, ymax, ymin, yval, _ref;\\n if (redraw == null) {\\n redraw = true;\\n }\\n this.options.data = data;\\n if ((data == null) || data.length === 0) {\\n this.data = [];\\n this.raphael.clear();\\n if (this.hover != null) {\\n this.hover.hide();\\n }\\n return;\\n }\\n ymax = this.cumulative ? 0 : null;\\n ymin = this.cumulative ? 0 : null;\\n if (this.options.goals.length > 0) {\\n minGoal = Math.min.apply(Math, this.options.goals);\\n maxGoal = Math.max.apply(Math, this.options.goals);\\n ymin = ymin != null ? Math.min(ymin, minGoal) : minGoal;\\n ymax = ymax != null ? Math.max(ymax, maxGoal) : maxGoal;\\n }\\n this.data = (function() {\\n var _i, _len, _results;\\n _results = [];\\n for (index = _i = 0, _len = data.length; _i < _len; index = ++_i) {\\n row = data[index];\\n ret = {\\n src: row\\n };\\n ret.label = row[this.options.xkey];\\n if (this.options.parseTime) {\\n ret.x = Morris.parseDate(ret.label);\\n if (this.options.dateFormat) {\\n ret.label = this.options.dateFormat(ret.x);\\n } else if (typeof ret.label === 'number') {\\n ret.label = new Date(ret.label).toString();\\n }\\n } else {\\n ret.x = index;\\n if (this.options.xLabelFormat) {\\n ret.label = this.options.xLabelFormat(ret);\\n }\\n }\\n total = 0;\\n ret.y = (function() {\\n var _j, _len1, _ref, _results1;\\n _ref = this.options.ykeys;\\n _results1 = [];\\n for (idx = _j = 0, _len1 = _ref.length; _j < _len1; idx = ++_j) {\\n ykey = _ref[idx];\\n yval = row[ykey];\\n if (typeof yval === 'string') {\\n yval = parseFloat(yval);\\n }\\n if ((yval != null) && typeof yval !== 'number') {\\n yval = null;\\n }\\n if (yval != null) {\\n if (this.cumulative) {\\n total += yval;\\n } else {\\n if (ymax != null) {\\n ymax = Math.max(yval, ymax);\\n ymin = Math.min(yval, ymin);\\n } else {\\n ymax = ymin = yval;\\n }\\n }\\n }\\n if (this.cumulative && (total != null)) {\\n ymax = Math.max(total, ymax);\\n ymin = Math.min(total, ymin);\\n }\\n _results1.push(yval);\\n }\\n return _results1;\\n }).call(this);\\n _results.push(ret);\\n }\\n return _results;\\n }).call(this);\\n if (this.options.parseTime) {\\n this.data = this.data.sort(function(a, b) {\\n return (a.x > b.x) - (b.x > a.x);\\n });\\n }\\n this.xmin = this.data[0].x;\\n this.xmax = this.data[this.data.length - 1].x;\\n this.events = [];\\n if (this.options.events.length > 0) {\\n if (this.options.parseTime) {\\n this.events = (function() {\\n var _i, _len, _ref, _results;\\n _ref = this.options.events;\\n _results = [];\\n for (_i = 0, _len = _ref.length; _i < _len; _i++) {\\n e = _ref[_i];\\n _results.push(Morris.parseDate(e));\\n }\\n return _results;\\n }).call(this);\\n } else {\\n this.events = this.options.events;\\n }\\n this.xmax = Math.max(this.xmax, Math.max.apply(Math, this.events));\\n this.xmin = Math.min(this.xmin, Math.min.apply(Math, this.events));\\n }\\n if (this.xmin === this.xmax) {\\n this.xmin -= 1;\\n this.xmax += 1;\\n }\\n this.ymin = this.yboundary('min', ymin);\\n this.ymax = this.yboundary('max', ymax);\\n if (this.ymin === this.ymax) {\\n if (ymin) {\\n this.ymin -= 1;\\n }\\n this.ymax += 1;\\n }\\n if (((_ref = this.options.axes) === true || _ref === 'both' || _ref === 'y') || this.options.grid === true) {\\n if (this.options.ymax === this.gridDefaults.ymax && this.options.ymin === this.gridDefaults.ymin) {\\n this.grid = this.autoGridLines(this.ymin, this.ymax, this.options.numLines);\\n this.ymin = Math.min(this.ymin, this.grid[0]);\\n this.ymax = Math.max(this.ymax, this.grid[this.grid.length - 1]);\\n } else {\\n step = (this.ymax - this.ymin) / (this.options.numLines - 1);\\n this.grid = (function() {\\n var _i, _ref1, _ref2, _results;\\n _results = [];\\n for (y = _i = _ref1 = this.ymin, _ref2 = this.ymax; step > 0 ? _i <= _ref2 : _i >= _ref2; y = _i += step) {\\n _results.push(y);\\n }\\n return _results;\\n }).call(this);\\n }\\n }\\n this.dirty = true;\\n if (redraw) {\\n return this.redraw();\\n }\\n };\\n\\n Grid.prototype.yboundary = function(boundaryType, currentValue) {\\n var boundaryOption, suggestedValue;\\n boundaryOption = this.options[\\\"y\\\" + boundaryType];\\n if (typeof boundaryOption === 'string') {\\n if (boundaryOption.slice(0, 4) === 'auto') {\\n if (boundaryOption.length > 5) {\\n suggestedValue = parseInt(boundaryOption.slice(5), 10);\\n if (currentValue == null) {\\n return suggestedValue;\\n }\\n return Math[boundaryType](currentValue, suggestedValue);\\n } else {\\n if (currentValue != null) {\\n return currentValue;\\n } else {\\n return 0;\\n }\\n }\\n } else {\\n return parseInt(boundaryOption, 10);\\n }\\n } else {\\n return boundaryOption;\\n }\\n };\\n\\n Grid.prototype.autoGridLines = function(ymin, ymax, nlines) {\\n var gmax, gmin, grid, smag, span, step, unit, y, ymag;\\n span = ymax - ymin;\\n ymag = Math.floor(Math.log(span) / Math.log(10));\\n unit = Math.pow(10, ymag);\\n gmin = Math.floor(ymin / unit) * unit;\\n gmax = Math.ceil(ymax / unit) * unit;\\n step = (gmax - gmin) / (nlines - 1);\\n if (unit === 1 && step > 1 && Math.ceil(step) !== step) {\\n step = Math.ceil(step);\\n gmax = gmin + step * (nlines - 1);\\n }\\n if (gmin < 0 && gmax > 0) {\\n gmin = Math.floor(ymin / step) * step;\\n gmax = Math.ceil(ymax / step) * step;\\n }\\n if (step < 1) {\\n smag = Math.floor(Math.log(step) / Math.log(10));\\n grid = (function() {\\n var _i, _results;\\n _results = [];\\n for (y = _i = gmin; step > 0 ? _i <= gmax : _i >= gmax; y = _i += step) {\\n _results.push(parseFloat(y.toFixed(1 - smag)));\\n }\\n return _results;\\n })();\\n } else {\\n grid = (function() {\\n var _i, _results;\\n _results = [];\\n for (y = _i = gmin; step > 0 ? _i <= gmax : _i >= gmax; y = _i += step) {\\n _results.push(y);\\n }\\n return _results;\\n })();\\n }\\n return grid;\\n };\\n\\n Grid.prototype._calc = function() {\\n var bottomOffsets, gridLine, h, i, w, yLabelWidths, _ref, _ref1;\\n w = this.el.width();\\n h = this.el.height();\\n if (this.elementWidth !== w || this.elementHeight !== h || this.dirty) {\\n this.elementWidth = w;\\n this.elementHeight = h;\\n this.dirty = false;\\n this.left = this.options.padding;\\n this.right = this.elementWidth - this.options.padding;\\n this.top = this.options.padding;\\n this.bottom = this.elementHeight - this.options.padding;\\n if ((_ref = this.options.axes) === true || _ref === 'both' || _ref === 'y') {\\n yLabelWidths = (function() {\\n var _i, _len, _ref1, _results;\\n _ref1 = this.grid;\\n _results = [];\\n for (_i = 0, _len = _ref1.length; _i < _len; _i++) {\\n gridLine = _ref1[_i];\\n _results.push(this.measureText(this.yAxisFormat(gridLine)).width);\\n }\\n return _results;\\n }).call(this);\\n this.left += Math.max.apply(Math, yLabelWidths);\\n }\\n if ((_ref1 = this.options.axes) === true || _ref1 === 'both' || _ref1 === 'x') {\\n bottomOffsets = (function() {\\n var _i, _ref2, _results;\\n _results = [];\\n for (i = _i = 0, _ref2 = this.data.length; 0 <= _ref2 ? _i < _ref2 : _i > _ref2; i = 0 <= _ref2 ? ++_i : --_i) {\\n _results.push(this.measureText(this.data[i].text, -this.options.xLabelAngle).height);\\n }\\n return _results;\\n }).call(this);\\n this.bottom -= Math.max.apply(Math, bottomOffsets);\\n }\\n this.width = Math.max(1, this.right - this.left);\\n this.height = Math.max(1, this.bottom - this.top);\\n this.dx = this.width / (this.xmax - this.xmin);\\n this.dy = this.height / (this.ymax - this.ymin);\\n if (this.calc) {\\n return this.calc();\\n }\\n }\\n };\\n\\n Grid.prototype.transY = function(y) {\\n return this.bottom - (y - this.ymin) * this.dy;\\n };\\n\\n Grid.prototype.transX = function(x) {\\n if (this.data.length === 1) {\\n return (this.left + this.right) / 2;\\n } else {\\n return this.left + (x - this.xmin) * this.dx;\\n }\\n };\\n\\n Grid.prototype.redraw = function() {\\n this.raphael.clear();\\n this._calc();\\n this.drawGrid();\\n this.drawGoals();\\n this.drawEvents();\\n if (this.draw) {\\n return this.draw();\\n }\\n };\\n\\n Grid.prototype.measureText = function(text, angle) {\\n var ret, tt;\\n if (angle == null) {\\n angle = 0;\\n }\\n tt = this.raphael.text(100, 100, text).attr('font-size', this.options.gridTextSize).attr('font-family', this.options.gridTextFamily).attr('font-weight', this.options.gridTextWeight).rotate(angle);\\n ret = tt.getBBox();\\n tt.remove();\\n return ret;\\n };\\n\\n Grid.prototype.yAxisFormat = function(label) {\\n return this.yLabelFormat(label);\\n };\\n\\n Grid.prototype.yLabelFormat = function(label) {\\n if (typeof this.options.yLabelFormat === 'function') {\\n return this.options.yLabelFormat(label);\\n } else {\\n return \\\"\\\" + this.options.preUnits + (Morris.commas(label)) + this.options.postUnits;\\n }\\n };\\n\\n Grid.prototype.drawGrid = function() {\\n var lineY, y, _i, _len, _ref, _ref1, _ref2, _results;\\n if (this.options.grid === false && ((_ref = this.options.axes) !== true && _ref !== 'both' && _ref !== 'y')) {\\n return;\\n }\\n _ref1 = this.grid;\\n _results = [];\\n for (_i = 0, _len = _ref1.length; _i < _len; _i++) {\\n lineY = _ref1[_i];\\n y = this.transY(lineY);\\n if ((_ref2 = this.options.axes) === true || _ref2 === 'both' || _ref2 === 'y') {\\n this.drawYAxisLabel(this.left - this.options.padding / 2, y, this.yAxisFormat(lineY));\\n }\\n if (this.options.grid) {\\n _results.push(this.drawGridLine(\\\"M\\\" + this.left + \\\",\\\" + y + \\\"H\\\" + (this.left + this.width)));\\n } else {\\n _results.push(void 0);\\n }\\n }\\n return _results;\\n };\\n\\n Grid.prototype.drawGoals = function() {\\n var color, goal, i, _i, _len, _ref, _results;\\n _ref = this.options.goals;\\n _results = [];\\n for (i = _i = 0, _len = _ref.length; _i < _len; i = ++_i) {\\n goal = _ref[i];\\n color = this.options.goalLineColors[i % this.options.goalLineColors.length];\\n _results.push(this.drawGoal(goal, color));\\n }\\n return _results;\\n };\\n\\n Grid.prototype.drawEvents = function() {\\n var color, event, i, _i, _len, _ref, _results;\\n _ref = this.events;\\n _results = [];\\n for (i = _i = 0, _len = _ref.length; _i < _len; i = ++_i) {\\n event = _ref[i];\\n color = this.options.eventLineColors[i % this.options.eventLineColors.length];\\n _results.push(this.drawEvent(event, color));\\n }\\n return _results;\\n };\\n\\n Grid.prototype.drawGoal = function(goal, color) {\\n return this.raphael.path(\\\"M\\\" + this.left + \\\",\\\" + (this.transY(goal)) + \\\"H\\\" + this.right).attr('stroke', color).attr('stroke-width', this.options.goalStrokeWidth);\\n };\\n\\n Grid.prototype.drawEvent = function(event, color) {\\n return this.raphael.path(\\\"M\\\" + (this.transX(event)) + \\\",\\\" + this.bottom + \\\"V\\\" + this.top).attr('stroke', color).attr('stroke-width', this.options.eventStrokeWidth);\\n };\\n\\n Grid.prototype.drawYAxisLabel = function(xPos, yPos, text) {\\n return this.raphael.text(xPos, yPos, text).attr('font-size', this.options.gridTextSize).attr('font-family', this.options.gridTextFamily).attr('font-weight', this.options.gridTextWeight).attr('fill', this.options.gridTextColor).attr('text-anchor', 'end');\\n };\\n\\n Grid.prototype.drawGridLine = function(path) {\\n return this.raphael.path(path).attr('stroke', this.options.gridLineColor).attr('stroke-width', this.options.gridStrokeWidth);\\n };\\n\\n Grid.prototype.startRange = function(x) {\\n this.hover.hide();\\n this.selectFrom = x;\\n return this.selectionRect.attr({\\n x: x,\\n width: 0\\n }).show();\\n };\\n\\n Grid.prototype.endRange = function(x) {\\n var end, start;\\n if (this.selectFrom) {\\n start = Math.min(this.selectFrom, x);\\n end = Math.max(this.selectFrom, x);\\n this.options.rangeSelect.call(this.el, {\\n start: this.data[this.hitTest(start)].x,\\n end: this.data[this.hitTest(end)].x\\n });\\n return this.selectFrom = null;\\n }\\n };\\n\\n Grid.prototype.resizeHandler = function() {\\n this.timeoutId = null;\\n this.raphael.setSize(this.el.width(), this.el.height());\\n return this.redraw();\\n };\\n\\n return Grid;\\n\\n })(Morris.EventEmitter);\\n\\n Morris.parseDate = function(date) {\\n var isecs, m, msecs, n, o, offsetmins, p, q, r, ret, secs;\\n if (typeof date === 'number') {\\n return date;\\n }\\n m = date.match(/^(\\\\d+) Q(\\\\d)$/);\\n n = date.match(/^(\\\\d+)-(\\\\d+)$/);\\n o = date.match(/^(\\\\d+)-(\\\\d+)-(\\\\d+)$/);\\n p = date.match(/^(\\\\d+) W(\\\\d+)$/);\\n q = date.match(/^(\\\\d+)-(\\\\d+)-(\\\\d+)[ T](\\\\d+):(\\\\d+)(Z|([+-])(\\\\d\\\\d):?(\\\\d\\\\d))?$/);\\n r = date.match(/^(\\\\d+)-(\\\\d+)-(\\\\d+)[ T](\\\\d+):(\\\\d+):(\\\\d+(\\\\.\\\\d+)?)(Z|([+-])(\\\\d\\\\d):?(\\\\d\\\\d))?$/);\\n if (m) {\\n return new Date(parseInt(m[1], 10), parseInt(m[2], 10) * 3 - 1, 1).getTime();\\n } else if (n) {\\n return new Date(parseInt(n[1], 10), parseInt(n[2], 10) - 1, 1).getTime();\\n } else if (o) {\\n return new Date(parseInt(o[1], 10), parseInt(o[2], 10) - 1, parseInt(o[3], 10)).getTime();\\n } else if (p) {\\n ret = new Date(parseInt(p[1], 10), 0, 1);\\n if (ret.getDay() !== 4) {\\n ret.setMonth(0, 1 + ((4 - ret.getDay()) + 7) % 7);\\n }\\n return ret.getTime() + parseInt(p[2], 10) * 604800000;\\n } else if (q) {\\n if (!q[6]) {\\n return new Date(parseInt(q[1], 10), parseInt(q[2], 10) - 1, parseInt(q[3], 10), parseInt(q[4], 10), parseInt(q[5], 10)).getTime();\\n } else {\\n offsetmins = 0;\\n if (q[6] !== 'Z') {\\n offsetmins = parseInt(q[8], 10) * 60 + parseInt(q[9], 10);\\n if (q[7] === '+') {\\n offsetmins = 0 - offsetmins;\\n }\\n }\\n return Date.UTC(parseInt(q[1], 10), parseInt(q[2], 10) - 1, parseInt(q[3], 10), parseInt(q[4], 10), parseInt(q[5], 10) + offsetmins);\\n }\\n } else if (r) {\\n secs = parseFloat(r[6]);\\n isecs = Math.floor(secs);\\n msecs = Math.round((secs - isecs) * 1000);\\n if (!r[8]) {\\n return new Date(parseInt(r[1], 10), parseInt(r[2], 10) - 1, parseInt(r[3], 10), parseInt(r[4], 10), parseInt(r[5], 10), isecs, msecs).getTime();\\n } else {\\n offsetmins = 0;\\n if (r[8] !== 'Z') {\\n offsetmins = parseInt(r[10], 10) * 60 + parseInt(r[11], 10);\\n if (r[9] === '+') {\\n offsetmins = 0 - offsetmins;\\n }\\n }\\n return Date.UTC(parseInt(r[1], 10), parseInt(r[2], 10) - 1, parseInt(r[3], 10), parseInt(r[4], 10), parseInt(r[5], 10) + offsetmins, isecs, msecs);\\n }\\n } else {\\n return new Date(parseInt(date, 10), 0, 1).getTime();\\n }\\n };\\n\\n Morris.Hover = (function() {\\n Hover.defaults = {\\n \\\"class\\\": 'morris-hover morris-default-style'\\n };\\n\\n function Hover(options) {\\n if (options == null) {\\n options = {};\\n }\\n this.options = $.extend({}, Morris.Hover.defaults, options);\\n this.el = $(\\\"<div class='\\\" + this.options[\\\"class\\\"] + \\\"'></div>\\\");\\n this.el.hide();\\n this.options.parent.append(this.el);\\n }\\n\\n Hover.prototype.update = function(html, x, y) {\\n if (!html) {\\n return this.hide();\\n } else {\\n this.html(html);\\n this.show();\\n return this.moveTo(x, y);\\n }\\n };\\n\\n Hover.prototype.html = function(content) {\\n return this.el.html(content);\\n };\\n\\n Hover.prototype.moveTo = function(x, y) {\\n var hoverHeight, hoverWidth, left, parentHeight, parentWidth, top;\\n parentWidth = this.options.parent.innerWidth();\\n parentHeight = this.options.parent.innerHeight();\\n hoverWidth = this.el.outerWidth();\\n hoverHeight = this.el.outerHeight();\\n left = Math.min(Math.max(0, x - hoverWidth / 2), parentWidth - hoverWidth);\\n if (y != null) {\\n top = y - hoverHeight - 10;\\n if (top < 0) {\\n top = y + 10;\\n if (top + hoverHeight > parentHeight) {\\n top = parentHeight / 2 - hoverHeight / 2;\\n }\\n }\\n } else {\\n top = parentHeight / 2 - hoverHeight / 2;\\n }\\n return this.el.css({\\n left: left + \\\"px\\\",\\n top: parseInt(top) + \\\"px\\\"\\n });\\n };\\n\\n Hover.prototype.show = function() {\\n return this.el.show();\\n };\\n\\n Hover.prototype.hide = function() {\\n return this.el.hide();\\n };\\n\\n return Hover;\\n\\n })();\\n\\n Morris.Line = (function(_super) {\\n __extends(Line, _super);\\n\\n function Line(options) {\\n this.hilight = __bind(this.hilight, this);\\n this.onHoverOut = __bind(this.onHoverOut, this);\\n this.onHoverMove = __bind(this.onHoverMove, this);\\n this.onGridClick = __bind(this.onGridClick, this);\\n if (!(this instanceof Morris.Line)) {\\n return new Morris.Line(options);\\n }\\n Line.__super__.constructor.call(this, options);\\n }\\n\\n Line.prototype.init = function() {\\n if (this.options.hideHover !== 'always') {\\n this.hover = new Morris.Hover({\\n parent: this.el\\n });\\n this.on('hovermove', this.onHoverMove);\\n this.on('hoverout', this.onHoverOut);\\n return this.on('gridclick', this.onGridClick);\\n }\\n };\\n\\n Line.prototype.defaults = {\\n lineWidth: 3,\\n pointSize: 4,\\n lineColors: ['#0b62a4', '#7A92A3', '#4da74d', '#afd8f8', '#edc240', '#cb4b4b', '#9440ed'],\\n pointStrokeWidths: [1],\\n pointStrokeColors: ['#ffffff'],\\n pointFillColors: [],\\n smooth: true,\\n xLabels: 'auto',\\n xLabelFormat: null,\\n xLabelMargin: 24,\\n hideHover: false\\n };\\n\\n Line.prototype.calc = function() {\\n this.calcPoints();\\n return this.generatePaths();\\n };\\n\\n Line.prototype.calcPoints = function() {\\n var row, y, _i, _len, _ref, _results;\\n _ref = this.data;\\n _results = [];\\n for (_i = 0, _len = _ref.length; _i < _len; _i++) {\\n row = _ref[_i];\\n row._x = this.transX(row.x);\\n row._y = (function() {\\n var _j, _len1, _ref1, _results1;\\n _ref1 = row.y;\\n _results1 = [];\\n for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) {\\n y = _ref1[_j];\\n if (y != null) {\\n _results1.push(this.transY(y));\\n } else {\\n _results1.push(y);\\n }\\n }\\n return _results1;\\n }).call(this);\\n _results.push(row._ymax = Math.min.apply(Math, [this.bottom].concat((function() {\\n var _j, _len1, _ref1, _results1;\\n _ref1 = row._y;\\n _results1 = [];\\n for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) {\\n y = _ref1[_j];\\n if (y != null) {\\n _results1.push(y);\\n }\\n }\\n return _results1;\\n })())));\\n }\\n return _results;\\n };\\n\\n Line.prototype.hitTest = function(x) {\\n var index, r, _i, _len, _ref;\\n if (this.data.length === 0) {\\n return null;\\n }\\n _ref = this.data.slice(1);\\n for (index = _i = 0, _len = _ref.length; _i < _len; index = ++_i) {\\n r = _ref[index];\\n if (x < (r._x + this.data[index]._x) / 2) {\\n break;\\n }\\n }\\n return index;\\n };\\n\\n Line.prototype.onGridClick = function(x, y) {\\n var index;\\n index = this.hitTest(x);\\n return this.fire('click', index, this.data[index].src, x, y);\\n };\\n\\n Line.prototype.onHoverMove = function(x, y) {\\n var index;\\n index = this.hitTest(x);\\n return this.displayHoverForRow(index);\\n };\\n\\n Line.prototype.onHoverOut = function() {\\n if (this.options.hideHover !== false) {\\n return this.displayHoverForRow(null);\\n }\\n };\\n\\n Line.prototype.displayHoverForRow = function(index) {\\n var _ref;\\n if (index != null) {\\n (_ref = this.hover).update.apply(_ref, this.hoverContentForRow(index));\\n return this.hilight(index);\\n } else {\\n this.hover.hide();\\n return this.hilight();\\n }\\n };\\n\\n Line.prototype.hoverContentForRow = function(index) {\\n var content, j, row, y, _i, _len, _ref;\\n row = this.data[index];\\n content = \\\"<div class='morris-hover-row-label'>\\\" + row.label + \\\"</div>\\\";\\n _ref = row.y;\\n for (j = _i = 0, _len = _ref.length; _i < _len; j = ++_i) {\\n y = _ref[j];\\n content += \\\"<div class='morris-hover-point' style='color: \\\" + (this.colorFor(row, j, 'label')) + \\\"'>\\\\n \\\" + this.options.labels[j] + \\\":\\\\n \\\" + (this.yLabelFormat(y)) + \\\"\\\\n</div>\\\";\\n }\\n if (typeof this.options.hoverCallback === 'function') {\\n content = this.options.hoverCallback(index, this.options, content, row.src);\\n }\\n return [content, row._x, row._ymax];\\n };\\n\\n Line.prototype.generatePaths = function() {\\n var coords, i, r, smooth;\\n return this.paths = (function() {\\n var _i, _ref, _ref1, _results;\\n _results = [];\\n for (i = _i = 0, _ref = this.options.ykeys.length; 0 <= _ref ? _i < _ref : _i > _ref; i = 0 <= _ref ? ++_i : --_i) {\\n smooth = typeof this.options.smooth === \\\"boolean\\\" ? this.options.smooth : (_ref1 = this.options.ykeys[i], __indexOf.call(this.options.smooth, _ref1) >= 0);\\n coords = (function() {\\n var _j, _len, _ref2, _results1;\\n _ref2 = this.data;\\n _results1 = [];\\n for (_j = 0, _len = _ref2.length; _j < _len; _j++) {\\n r = _ref2[_j];\\n if (r._y[i] !== void 0) {\\n _results1.push({\\n x: r._x,\\n y: r._y[i]\\n });\\n }\\n }\\n return _results1;\\n }).call(this);\\n if (coords.length > 1) {\\n _results.push(Morris.Line.createPath(coords, smooth, this.bottom));\\n } else {\\n _results.push(null);\\n }\\n }\\n return _results;\\n }).call(this);\\n };\\n\\n Line.prototype.draw = function() {\\n var _ref;\\n if ((_ref = this.options.axes) === true || _ref === 'both' || _ref === 'x') {\\n this.drawXAxis();\\n }\\n this.drawSeries();\\n if (this.options.hideHover === false) {\\n return this.displayHoverForRow(this.data.length - 1);\\n }\\n };\\n\\n Line.prototype.drawXAxis = function() {\\n var drawLabel, l, labels, prevAngleMargin, prevLabelMargin, row, ypos, _i, _len, _results,\\n _this = this;\\n ypos = this.bottom + this.options.padding / 2;\\n prevLabelMargin = null;\\n prevAngleMargin = null;\\n drawLabel = function(labelText, xpos) {\\n var label, labelBox, margin, offset, textBox;\\n label = _this.drawXAxisLabel(_this.transX(xpos), ypos, labelText);\\n textBox = label.getBBox();\\n label.transform(\\\"r\\\" + (-_this.options.xLabelAngle));\\n labelBox = label.getBBox();\\n label.transform(\\\"t0,\\\" + (labelBox.height / 2) + \\\"...\\\");\\n if (_this.options.xLabelAngle !== 0) {\\n offset = -0.5 * textBox.width * Math.cos(_this.options.xLabelAngle * Math.PI / 180.0);\\n label.transform(\\\"t\\\" + offset + \\\",0...\\\");\\n }\\n labelBox = label.getBBox();\\n if (((prevLabelMargin == null) || prevLabelMargin >= labelBox.x + labelBox.width || (prevAngleMargin != null) && prevAngleMargin >= labelBox.x) && labelBox.x >= 0 && (labelBox.x + labelBox.width) < _this.el.width()) {\\n if (_this.options.xLabelAngle !== 0) {\\n margin = 1.25 * _this.options.gridTextSize / Math.sin(_this.options.xLabelAngle * Math.PI / 180.0);\\n prevAngleMargin = labelBox.x - margin;\\n }\\n return prevLabelMargin = labelBox.x - _this.options.xLabelMargin;\\n } else {\\n return label.remove();\\n }\\n };\\n if (this.options.parseTime) {\\n if (this.data.length === 1 && this.options.xLabels === 'auto') {\\n labels = [[this.data[0].label, this.data[0].x]];\\n } else {\\n labels = Morris.labelSeries(this.xmin, this.xmax, this.width, this.options.xLabels, this.options.xLabelFormat);\\n }\\n } else {\\n labels = (function() {\\n var _i, _len, _ref, _results;\\n _ref = this.data;\\n _results = [];\\n for (_i = 0, _len = _ref.length; _i < _len; _i++) {\\n row = _ref[_i];\\n _results.push([row.label, row.x]);\\n }\\n return _results;\\n }).call(this);\\n }\\n labels.reverse();\\n _results = [];\\n for (_i = 0, _len = labels.length; _i < _len; _i++) {\\n l = labels[_i];\\n _results.push(drawLabel(l[0], l[1]));\\n }\\n return _results;\\n };\\n\\n Line.prototype.drawSeries = function() {\\n var i, _i, _j, _ref, _ref1, _results;\\n this.seriesPoints = [];\\n for (i = _i = _ref = this.options.ykeys.length - 1; _ref <= 0 ? _i <= 0 : _i >= 0; i = _ref <= 0 ? ++_i : --_i) {\\n this._drawLineFor(i);\\n }\\n _results = [];\\n for (i = _j = _ref1 = this.options.ykeys.length - 1; _ref1 <= 0 ? _j <= 0 : _j >= 0; i = _ref1 <= 0 ? ++_j : --_j) {\\n _results.push(this._drawPointFor(i));\\n }\\n return _results;\\n };\\n\\n Line.prototype._drawPointFor = function(index) {\\n var circle, row, _i, _len, _ref, _results;\\n this.seriesPoints[index] = [];\\n _ref = this.data;\\n _results = [];\\n for (_i = 0, _len = _ref.length; _i < _len; _i++) {\\n row = _ref[_i];\\n circle = null;\\n if (row._y[index] != null) {\\n circle = this.drawLinePoint(row._x, row._y[index], this.colorFor(row, index, 'point'), index);\\n }\\n _results.push(this.seriesPoints[index].push(circle));\\n }\\n return _results;\\n };\\n\\n Line.prototype._drawLineFor = function(index) {\\n var path;\\n path = this.paths[index];\\n if (path !== null) {\\n return this.drawLinePath(path, this.colorFor(null, index, 'line'), index);\\n }\\n };\\n\\n Line.createPath = function(coords, smooth, bottom) {\\n var coord, g, grads, i, ix, lg, path, prevCoord, x1, x2, y1, y2, _i, _len;\\n path = \\\"\\\";\\n if (smooth) {\\n grads = Morris.Line.gradients(coords);\\n }\\n prevCoord = {\\n y: null\\n };\\n for (i = _i = 0, _len = coords.length; _i < _len; i = ++_i) {\\n coord = coords[i];\\n if (coord.y != null) {\\n if (prevCoord.y != null) {\\n if (smooth) {\\n g = grads[i];\\n lg = grads[i - 1];\\n ix = (coord.x - prevCoord.x) / 4;\\n x1 = prevCoord.x + ix;\\n y1 = Math.min(bottom, prevCoord.y + ix * lg);\\n x2 = coord.x - ix;\\n y2 = Math.min(bottom, coord.y - ix * g);\\n path += \\\"C\\\" + x1 + \\\",\\\" + y1 + \\\",\\\" + x2 + \\\",\\\" + y2 + \\\",\\\" + coord.x + \\\",\\\" + coord.y;\\n } else {\\n path += \\\"L\\\" + coord.x + \\\",\\\" + coord.y;\\n }\\n } else {\\n if (!smooth || (grads[i] != null)) {\\n path += \\\"M\\\" + coord.x + \\\",\\\" + coord.y;\\n }\\n }\\n }\\n prevCoord = coord;\\n }\\n return path;\\n };\\n\\n Line.gradients = function(coords) {\\n var coord, grad, i, nextCoord, prevCoord, _i, _len, _results;\\n grad = function(a, b) {\\n return (a.y - b.y) / (a.x - b.x);\\n };\\n _results = [];\\n for (i = _i = 0, _len = coords.length; _i < _len; i = ++_i) {\\n coord = coords[i];\\n if (coord.y != null) {\\n nextCoord = coords[i + 1] || {\\n y: null\\n };\\n prevCoord = coords[i - 1] || {\\n y: null\\n };\\n if ((prevCoord.y != null) && (nextCoord.y != null)) {\\n _results.push(grad(prevCoord, nextCoord));\\n } else if (prevCoord.y != null) {\\n _results.push(grad(prevCoord, coord));\\n } else if (nextCoord.y != null) {\\n _results.push(grad(coord, nextCoord));\\n } else {\\n _results.push(null);\\n }\\n } else {\\n _results.push(null);\\n }\\n }\\n return _results;\\n };\\n\\n Line.prototype.hilight = function(index) {\\n var i, _i, _j, _ref, _ref1;\\n if (this.prevHilight !== null && this.prevHilight !== index) {\\n for (i = _i = 0, _ref = this.seriesPoints.length - 1; 0 <= _ref ? _i <= _ref : _i >= _ref; i = 0 <= _ref ? ++_i : --_i) {\\n if (this.seriesPoints[i][this.prevHilight]) {\\n this.seriesPoints[i][this.prevHilight].animate(this.pointShrinkSeries(i));\\n }\\n }\\n }\\n if (index !== null && this.prevHilight !== index) {\\n for (i = _j = 0, _ref1 = this.seriesPoints.length - 1; 0 <= _ref1 ? _j <= _ref1 : _j >= _ref1; i = 0 <= _ref1 ? ++_j : --_j) {\\n if (this.seriesPoints[i][index]) {\\n this.seriesPoints[i][index].animate(this.pointGrowSeries(i));\\n }\\n }\\n }\\n return this.prevHilight = index;\\n };\\n\\n Line.prototype.colorFor = function(row, sidx, type) {\\n if (typeof this.options.lineColors === 'function') {\\n return this.options.lineColors.call(this, row, sidx, type);\\n } else if (type === 'point') {\\n return this.options.pointFillColors[sidx % this.options.pointFillColors.length] || this.options.lineColors[sidx % this.options.lineColors.length];\\n } else {\\n return this.options.lineColors[sidx % this.options.lineColors.length];\\n }\\n };\\n\\n Line.prototype.drawXAxisLabel = function(xPos, yPos, text) {\\n return this.raphael.text(xPos, yPos, text).attr('font-size', this.options.gridTextSize).attr('font-family', this.options.gridTextFamily).attr('font-weight', this.options.gridTextWeight).attr('fill', this.options.gridTextColor);\\n };\\n\\n Line.prototype.drawLinePath = function(path, lineColor, lineIndex) {\\n return this.raphael.path(path).attr('stroke', lineColor).attr('stroke-width', this.lineWidthForSeries(lineIndex));\\n };\\n\\n Line.prototype.drawLinePoint = function(xPos, yPos, pointColor, lineIndex) {\\n return this.raphael.circle(xPos, yPos, this.pointSizeForSeries(lineIndex)).attr('fill', pointColor).attr('stroke-width', this.pointStrokeWidthForSeries(lineIndex)).attr('stroke', this.pointStrokeColorForSeries(lineIndex));\\n };\\n\\n Line.prototype.pointStrokeWidthForSeries = function(index) {\\n return this.options.pointStrokeWidths[index % this.options.pointStrokeWidths.length];\\n };\\n\\n Line.prototype.pointStrokeColorForSeries = function(index) {\\n return this.options.pointStrokeColors[index % this.options.pointStrokeColors.length];\\n };\\n\\n Line.prototype.lineWidthForSeries = function(index) {\\n if (this.options.lineWidth instanceof Array) {\\n return this.options.lineWidth[index % this.options.lineWidth.length];\\n } else {\\n return this.options.lineWidth;\\n }\\n };\\n\\n Line.prototype.pointSizeForSeries = function(index) {\\n if (this.options.pointSize instanceof Array) {\\n return this.options.pointSize[index % this.options.pointSize.length];\\n } else {\\n return this.options.pointSize;\\n }\\n };\\n\\n Line.prototype.pointGrowSeries = function(index) {\\n return Raphael.animation({\\n r: this.pointSizeForSeries(index) + 3\\n }, 25, 'linear');\\n };\\n\\n Line.prototype.pointShrinkSeries = function(index) {\\n return Raphael.animation({\\n r: this.pointSizeForSeries(index)\\n }, 25, 'linear');\\n };\\n\\n return Line;\\n\\n })(Morris.Grid);\\n\\n Morris.labelSeries = function(dmin, dmax, pxwidth, specName, xLabelFormat) {\\n var d, d0, ddensity, name, ret, s, spec, t, _i, _len, _ref;\\n ddensity = 200 * (dmax - dmin) / pxwidth;\\n d0 = new Date(dmin);\\n spec = Morris.LABEL_SPECS[specName];\\n if (spec === void 0) {\\n _ref = Morris.AUTO_LABEL_ORDER;\\n for (_i = 0, _len = _ref.length; _i < _len; _i++) {\\n name = _ref[_i];\\n s = Morris.LABEL_SPECS[name];\\n if (ddensity >= s.span) {\\n spec = s;\\n break;\\n }\\n }\\n }\\n if (spec === void 0) {\\n spec = Morris.LABEL_SPECS[\\\"second\\\"];\\n }\\n if (xLabelFormat) {\\n spec = $.extend({}, spec, {\\n fmt: xLabelFormat\\n });\\n }\\n d = spec.start(d0);\\n ret = [];\\n while ((t = d.getTime()) <= dmax) {\\n if (t >= dmin) {\\n ret.push([spec.fmt(d), t]);\\n }\\n spec.incr(d);\\n }\\n return ret;\\n };\\n\\n minutesSpecHelper = function(interval) {\\n return {\\n span: interval * 60 * 1000,\\n start: function(d) {\\n return new Date(d.getFullYear(), d.getMonth(), d.getDate(), d.getHours());\\n },\\n fmt: function(d) {\\n return \\\"\\\" + (Morris.pad2(d.getHours())) + \\\":\\\" + (Morris.pad2(d.getMinutes()));\\n },\\n incr: function(d) {\\n return d.setUTCMinutes(d.getUTCMinutes() + interval);\\n }\\n };\\n };\\n\\n secondsSpecHelper = function(interval) {\\n return {\\n span: interval * 1000,\\n start: function(d) {\\n return new Date(d.getFullYear(), d.getMonth(), d.getDate(), d.getHours(), d.getMinutes());\\n },\\n fmt: function(d) {\\n return \\\"\\\" + (Morris.pad2(d.getHours())) + \\\":\\\" + (Morris.pad2(d.getMinutes())) + \\\":\\\" + (Morris.pad2(d.getSeconds()));\\n },\\n incr: function(d) {\\n return d.setUTCSeconds(d.getUTCSeconds() + interval);\\n }\\n };\\n };\\n\\n Morris.LABEL_SPECS = {\\n \\\"decade\\\": {\\n span: 172800000000,\\n start: function(d) {\\n return new Date(d.getFullYear() - d.getFullYear() % 10, 0, 1);\\n },\\n fmt: function(d) {\\n return \\\"\\\" + (d.getFullYear());\\n },\\n incr: function(d) {\\n return d.setFullYear(d.getFullYear() + 10);\\n }\\n },\\n \\\"year\\\": {\\n span: 17280000000,\\n start: function(d) {\\n return new Date(d.getFullYear(), 0, 1);\\n },\\n fmt: function(d) {\\n return \\\"\\\" + (d.getFullYear());\\n },\\n incr: function(d) {\\n return d.setFullYear(d.getFullYear() + 1);\\n }\\n },\\n \\\"month\\\": {\\n span: 2419200000,\\n start: function(d) {\\n return new Date(d.getFullYear(), d.getMonth(), 1);\\n },\\n fmt: function(d) {\\n return \\\"\\\" + (d.getFullYear()) + \\\"-\\\" + (Morris.pad2(d.getMonth() + 1));\\n },\\n incr: function(d) {\\n return d.setMonth(d.getMonth() + 1);\\n }\\n },\\n \\\"week\\\": {\\n span: 604800000,\\n start: function(d) {\\n return new Date(d.getFullYear(), d.getMonth(), d.getDate());\\n },\\n fmt: function(d) {\\n return \\\"\\\" + (d.getFullYear()) + \\\"-\\\" + (Morris.pad2(d.getMonth() + 1)) + \\\"-\\\" + (Morris.pad2(d.getDate()));\\n },\\n incr: function(d) {\\n return d.setDate(d.getDate() + 7);\\n }\\n },\\n \\\"day\\\": {\\n span: 86400000,\\n start: function(d) {\\n return new Date(d.getFullYear(), d.getMonth(), d.getDate());\\n },\\n fmt: function(d) {\\n return \\\"\\\" + (d.getFullYear()) + \\\"-\\\" + (Morris.pad2(d.getMonth() + 1)) + \\\"-\\\" + (Morris.pad2(d.getDate()));\\n },\\n incr: function(d) {\\n return d.setDate(d.getDate() + 1);\\n }\\n },\\n \\\"hour\\\": minutesSpecHelper(60),\\n \\\"30min\\\": minutesSpecHelper(30),\\n \\\"15min\\\": minutesSpecHelper(15),\\n \\\"10min\\\": minutesSpecHelper(10),\\n \\\"5min\\\": minutesSpecHelper(5),\\n \\\"minute\\\": minutesSpecHelper(1),\\n \\\"30sec\\\": secondsSpecHelper(30),\\n \\\"15sec\\\": secondsSpecHelper(15),\\n \\\"10sec\\\": secondsSpecHelper(10),\\n \\\"5sec\\\": secondsSpecHelper(5),\\n \\\"second\\\": secondsSpecHelper(1)\\n };\\n\\n Morris.AUTO_LABEL_ORDER = [\\\"decade\\\", \\\"year\\\", \\\"month\\\", \\\"week\\\", \\\"day\\\", \\\"hour\\\", \\\"30min\\\", \\\"15min\\\", \\\"10min\\\", \\\"5min\\\", \\\"minute\\\", \\\"30sec\\\", \\\"15sec\\\", \\\"10sec\\\", \\\"5sec\\\", \\\"second\\\"];\\n\\n Morris.Area = (function(_super) {\\n var areaDefaults;\\n\\n __extends(Area, _super);\\n\\n areaDefaults = {\\n fillOpacity: 'auto',\\n behaveLikeLine: false\\n };\\n\\n function Area(options) {\\n var areaOptions;\\n if (!(this instanceof Morris.Area)) {\\n return new Morris.Area(options);\\n }\\n areaOptions = $.extend({}, areaDefaults, options);\\n this.cumulative = !areaOptions.behaveLikeLine;\\n if (areaOptions.fillOpacity === 'auto') {\\n areaOptions.fillOpacity = areaOptions.behaveLikeLine ? .8 : 1;\\n }\\n Area.__super__.constructor.call(this, areaOptions);\\n }\\n\\n Area.prototype.calcPoints = function() {\\n var row, total, y, _i, _len, _ref, _results;\\n _ref = this.data;\\n _results = [];\\n for (_i = 0, _len = _ref.length; _i < _len; _i++) {\\n row = _ref[_i];\\n row._x = this.transX(row.x);\\n total = 0;\\n row._y = (function() {\\n var _j, _len1, _ref1, _results1;\\n _ref1 = row.y;\\n _results1 = [];\\n for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) {\\n y = _ref1[_j];\\n if (this.options.behaveLikeLine) {\\n _results1.push(this.transY(y));\\n } else {\\n total += y || 0;\\n _results1.push(this.transY(total));\\n }\\n }\\n return _results1;\\n }).call(this);\\n _results.push(row._ymax = Math.max.apply(Math, row._y));\\n }\\n return _results;\\n };\\n\\n Area.prototype.drawSeries = function() {\\n var i, range, _i, _j, _k, _len, _ref, _ref1, _results, _results1, _results2;\\n this.seriesPoints = [];\\n if (this.options.behaveLikeLine) {\\n range = (function() {\\n _results = [];\\n for (var _i = 0, _ref = this.options.ykeys.length - 1; 0 <= _ref ? _i <= _ref : _i >= _ref; 0 <= _ref ? _i++ : _i--){ _results.push(_i); }\\n return _results;\\n }).apply(this);\\n } else {\\n range = (function() {\\n _results1 = [];\\n for (var _j = _ref1 = this.options.ykeys.length - 1; _ref1 <= 0 ? _j <= 0 : _j >= 0; _ref1 <= 0 ? _j++ : _j--){ _results1.push(_j); }\\n return _results1;\\n }).apply(this);\\n }\\n _results2 = [];\\n for (_k = 0, _len = range.length; _k < _len; _k++) {\\n i = range[_k];\\n this._drawFillFor(i);\\n this._drawLineFor(i);\\n _results2.push(this._drawPointFor(i));\\n }\\n return _results2;\\n };\\n\\n Area.prototype._drawFillFor = function(index) {\\n var path;\\n path = this.paths[index];\\n if (path !== null) {\\n path = path + (\\\"L\\\" + (this.transX(this.xmax)) + \\\",\\\" + this.bottom + \\\"L\\\" + (this.transX(this.xmin)) + \\\",\\\" + this.bottom + \\\"Z\\\");\\n return this.drawFilledPath(path, this.fillForSeries(index));\\n }\\n };\\n\\n Area.prototype.fillForSeries = function(i) {\\n var color;\\n color = Raphael.rgb2hsl(this.colorFor(this.data[i], i, 'line'));\\n return Raphael.hsl(color.h, this.options.behaveLikeLine ? color.s * 0.9 : color.s * 0.75, Math.min(0.98, this.options.behaveLikeLine ? color.l * 1.2 : color.l * 1.25));\\n };\\n\\n Area.prototype.drawFilledPath = function(path, fill) {\\n return this.raphael.path(path).attr('fill', fill).attr('fill-opacity', this.options.fillOpacity).attr('stroke', 'none');\\n };\\n\\n return Area;\\n\\n })(Morris.Line);\\n\\n Morris.Bar = (function(_super) {\\n __extends(Bar, _super);\\n\\n function Bar(options) {\\n this.onHoverOut = __bind(this.onHoverOut, this);\\n this.onHoverMove = __bind(this.onHoverMove, this);\\n this.onGridClick = __bind(this.onGridClick, this);\\n if (!(this instanceof Morris.Bar)) {\\n return new Morris.Bar(options);\\n }\\n Bar.__super__.constructor.call(this, $.extend({}, options, {\\n parseTime: false\\n }));\\n }\\n\\n Bar.prototype.init = function() {\\n this.cumulative = this.options.stacked;\\n if (this.options.hideHover !== 'always') {\\n this.hover = new Morris.Hover({\\n parent: this.el\\n });\\n this.on('hovermove', this.onHoverMove);\\n this.on('hoverout', this.onHoverOut);\\n return this.on('gridclick', this.onGridClick);\\n }\\n };\\n\\n Bar.prototype.defaults = {\\n barSizeRatio: 0.75,\\n barGap: 3,\\n barColors: ['#0b62a4', '#7a92a3', '#4da74d', '#afd8f8', '#edc240', '#cb4b4b', '#9440ed'],\\n barOpacity: 1.0,\\n barRadius: [0, 0, 0, 0],\\n xLabelMargin: 50\\n };\\n\\n Bar.prototype.calc = function() {\\n var _ref;\\n this.calcBars();\\n if (this.options.hideHover === false) {\\n return (_ref = this.hover).update.apply(_ref, this.hoverContentForRow(this.data.length - 1));\\n }\\n };\\n\\n Bar.prototype.calcBars = function() {\\n var idx, row, y, _i, _len, _ref, _results;\\n _ref = this.data;\\n _results = [];\\n for (idx = _i = 0, _len = _ref.length; _i < _len; idx = ++_i) {\\n row = _ref[idx];\\n row._x = this.left + this.width * (idx + 0.5) / this.data.length;\\n _results.push(row._y = (function() {\\n var _j, _len1, _ref1, _results1;\\n _ref1 = row.y;\\n _results1 = [];\\n for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) {\\n y = _ref1[_j];\\n if (y != null) {\\n _results1.push(this.transY(y));\\n } else {\\n _results1.push(null);\\n }\\n }\\n return _results1;\\n }).call(this));\\n }\\n return _results;\\n };\\n\\n Bar.prototype.draw = function() {\\n var _ref;\\n if ((_ref = this.options.axes) === true || _ref === 'both' || _ref === 'x') {\\n this.drawXAxis();\\n }\\n return this.drawSeries();\\n };\\n\\n Bar.prototype.drawXAxis = function() {\\n var i, label, labelBox, margin, offset, prevAngleMargin, prevLabelMargin, row, textBox, ypos, _i, _ref, _results;\\n ypos = this.bottom + (this.options.xAxisLabelTopPadding || this.options.padding / 2);\\n prevLabelMargin = null;\\n prevAngleMargin = null;\\n _results = [];\\n for (i = _i = 0, _ref = this.data.length; 0 <= _ref ? _i < _ref : _i > _ref; i = 0 <= _ref ? ++_i : --_i) {\\n row = this.data[this.data.length - 1 - i];\\n label = this.drawXAxisLabel(row._x, ypos, row.label);\\n textBox = label.getBBox();\\n label.transform(\\\"r\\\" + (-this.options.xLabelAngle));\\n labelBox = label.getBBox();\\n label.transform(\\\"t0,\\\" + (labelBox.height / 2) + \\\"...\\\");\\n if (this.options.xLabelAngle !== 0) {\\n offset = -0.5 * textBox.width * Math.cos(this.options.xLabelAngle * Math.PI / 180.0);\\n label.transform(\\\"t\\\" + offset + \\\",0...\\\");\\n }\\n if (((prevLabelMargin == null) || prevLabelMargin >= labelBox.x + labelBox.width || (prevAngleMargin != null) && prevAngleMargin >= labelBox.x) && labelBox.x >= 0 && (labelBox.x + labelBox.width) < this.el.width()) {\\n if (this.options.xLabelAngle !== 0) {\\n margin = 1.25 * this.options.gridTextSize / Math.sin(this.options.xLabelAngle * Math.PI / 180.0);\\n prevAngleMargin = labelBox.x - margin;\\n }\\n _results.push(prevLabelMargin = labelBox.x - this.options.xLabelMargin);\\n } else {\\n _results.push(label.remove());\\n }\\n }\\n return _results;\\n };\\n\\n Bar.prototype.drawSeries = function() {\\n var barWidth, bottom, groupWidth, idx, lastTop, left, leftPadding, numBars, row, sidx, size, spaceLeft, top, ypos, zeroPos;\\n groupWidth = this.width / this.options.data.length;\\n numBars = this.options.stacked ? 1 : this.options.ykeys.length;\\n barWidth = (groupWidth * this.options.barSizeRatio - this.options.barGap * (numBars - 1)) / numBars;\\n if (this.options.barSize) {\\n barWidth = Math.min(barWidth, this.options.barSize);\\n }\\n spaceLeft = groupWidth - barWidth * numBars - this.options.barGap * (numBars - 1);\\n leftPadding = spaceLeft / 2;\\n zeroPos = this.ymin <= 0 && this.ymax >= 0 ? this.transY(0) : null;\\n return this.bars = (function() {\\n var _i, _len, _ref, _results;\\n _ref = this.data;\\n _results = [];\\n for (idx = _i = 0, _len = _ref.length; _i < _len; idx = ++_i) {\\n row = _ref[idx];\\n lastTop = 0;\\n _results.push((function() {\\n var _j, _len1, _ref1, _results1;\\n _ref1 = row._y;\\n _results1 = [];\\n for (sidx = _j = 0, _len1 = _ref1.length; _j < _len1; sidx = ++_j) {\\n ypos = _ref1[sidx];\\n if (ypos !== null) {\\n if (zeroPos) {\\n top = Math.min(ypos, zeroPos);\\n bottom = Math.max(ypos, zeroPos);\\n } else {\\n top = ypos;\\n bottom = this.bottom;\\n }\\n left = this.left + idx * groupWidth + leftPadding;\\n if (!this.options.stacked) {\\n left += sidx * (barWidth + this.options.barGap);\\n }\\n size = bottom - top;\\n if (this.options.verticalGridCondition && this.options.verticalGridCondition(row.x)) {\\n this.drawBar(this.left + idx * groupWidth, this.top, groupWidth, Math.abs(this.top - this.bottom), this.options.verticalGridColor, this.options.verticalGridOpacity, this.options.barRadius);\\n }\\n if (this.options.stacked) {\\n top -= lastTop;\\n }\\n this.drawBar(left, top, barWidth, size, this.colorFor(row, sidx, 'bar'), this.options.barOpacity, this.options.barRadius);\\n _results1.push(lastTop += size);\\n } else {\\n _results1.push(null);\\n }\\n }\\n return _results1;\\n }).call(this));\\n }\\n return _results;\\n }).call(this);\\n };\\n\\n Bar.prototype.colorFor = function(row, sidx, type) {\\n var r, s;\\n if (typeof this.options.barColors === 'function') {\\n r = {\\n x: row.x,\\n y: row.y[sidx],\\n label: row.label\\n };\\n s = {\\n index: sidx,\\n key: this.options.ykeys[sidx],\\n label: this.options.labels[sidx]\\n };\\n return this.options.barColors.call(this, r, s, type);\\n } else {\\n return this.options.barColors[sidx % this.options.barColors.length];\\n }\\n };\\n\\n Bar.prototype.hitTest = function(x) {\\n if (this.data.length === 0) {\\n return null;\\n }\\n x = Math.max(Math.min(x, this.right), this.left);\\n return Math.min(this.data.length - 1, Math.floor((x - this.left) / (this.width / this.data.length)));\\n };\\n\\n Bar.prototype.onGridClick = function(x, y) {\\n var index;\\n index = this.hitTest(x);\\n return this.fire('click', index, this.data[index].src, x, y);\\n };\\n\\n Bar.prototype.onHoverMove = function(x, y) {\\n var index, _ref;\\n index = this.hitTest(x);\\n return (_ref = this.hover).update.apply(_ref, this.hoverContentForRow(index));\\n };\\n\\n Bar.prototype.onHoverOut = function() {\\n if (this.options.hideHover !== false) {\\n return this.hover.hide();\\n }\\n };\\n\\n Bar.prototype.hoverContentForRow = function(index) {\\n var content, j, row, x, y, _i, _len, _ref;\\n row = this.data[index];\\n content = \\\"<div class='morris-hover-row-label'>\\\" + row.label + \\\"</div>\\\";\\n _ref = row.y;\\n for (j = _i = 0, _len = _ref.length; _i < _len; j = ++_i) {\\n y = _ref[j];\\n content += \\\"<div class='morris-hover-point' style='color: \\\" + (this.colorFor(row, j, 'label')) + \\\"'>\\\\n \\\" + this.options.labels[j] + \\\":\\\\n \\\" + (this.yLabelFormat(y)) + \\\"\\\\n</div>\\\";\\n }\\n if (typeof this.options.hoverCallback === 'function') {\\n content = this.options.hoverCallback(index, this.options, content, row.src);\\n }\\n x = this.left + (index + 0.5) * this.width / this.data.length;\\n return [content, x];\\n };\\n\\n Bar.prototype.drawXAxisLabel = function(xPos, yPos, text) {\\n var label;\\n return label = this.raphael.text(xPos, yPos, text).attr('font-size', this.options.gridTextSize).attr('font-family', this.options.gridTextFamily).attr('font-weight', this.options.gridTextWeight).attr('fill', this.options.gridTextColor);\\n };\\n\\n Bar.prototype.drawBar = function(xPos, yPos, width, height, barColor, opacity, radiusArray) {\\n var maxRadius, path;\\n maxRadius = Math.max.apply(Math, radiusArray);\\n if (maxRadius === 0 || maxRadius > height) {\\n path = this.raphael.rect(xPos, yPos, width, height);\\n } else {\\n path = this.raphael.path(this.roundedRect(xPos, yPos, width, height, radiusArray));\\n }\\n return path.attr('fill', barColor).attr('fill-opacity', opacity).attr('stroke', 'none');\\n };\\n\\n Bar.prototype.roundedRect = function(x, y, w, h, r) {\\n if (r == null) {\\n r = [0, 0, 0, 0];\\n }\\n return [\\\"M\\\", x, r[0] + y, \\\"Q\\\", x, y, x + r[0], y, \\\"L\\\", x + w - r[1], y, \\\"Q\\\", x + w, y, x + w, y + r[1], \\\"L\\\", x + w, y + h - r[2], \\\"Q\\\", x + w, y + h, x + w - r[2], y + h, \\\"L\\\", x + r[3], y + h, \\\"Q\\\", x, y + h, x, y + h - r[3], \\\"Z\\\"];\\n };\\n\\n return Bar;\\n\\n })(Morris.Grid);\\n\\n Morris.Donut = (function(_super) {\\n __extends(Donut, _super);\\n\\n Donut.prototype.defaults = {\\n colors: ['#0B62A4', '#3980B5', '#679DC6', '#95BBD7', '#B0CCE1', '#095791', '#095085', '#083E67', '#052C48', '#042135'],\\n backgroundColor: '#FFFFFF',\\n labelColor: '#000000',\\n formatter: Morris.commas,\\n resize: false\\n };\\n\\n function Donut(options) {\\n this.resizeHandler = __bind(this.resizeHandler, this);\\n this.select = __bind(this.select, this);\\n this.click = __bind(this.click, this);\\n var _this = this;\\n if (!(this instanceof Morris.Donut)) {\\n return new Morris.Donut(options);\\n }\\n this.options = $.extend({}, this.defaults, options);\\n if (typeof options.element === 'string') {\\n this.el = $(document.getElementById(options.element));\\n } else {\\n this.el = $(options.element);\\n }\\n if (this.el === null || this.el.length === 0) {\\n throw new Error(\\\"Graph placeholder not found.\\\");\\n }\\n if (options.data === void 0 || options.data.length === 0) {\\n return;\\n }\\n this.raphael = new Raphael(this.el[0]);\\n if (this.options.resize) {\\n $(window).bind('resize', function(evt) {\\n if (_this.timeoutId != null) {\\n window.clearTimeout(_this.timeoutId);\\n }\\n return _this.timeoutId = window.setTimeout(_this.resizeHandler, 100);\\n });\\n }\\n this.setData(options.data);\\n }\\n\\n Donut.prototype.redraw = function() {\\n var C, cx, cy, i, idx, last, max_value, min, next, seg, total, value, w, _i, _j, _k, _len, _len1, _len2, _ref, _ref1, _ref2, _results;\\n this.raphael.clear();\\n cx = this.el.width() / 2;\\n cy = this.el.height() / 2;\\n w = (Math.min(cx, cy) - 10) / 3;\\n total = 0;\\n _ref = this.values;\\n for (_i = 0, _len = _ref.length; _i < _len; _i++) {\\n value = _ref[_i];\\n total += value;\\n }\\n min = 5 / (2 * w);\\n C = 1.9999 * Math.PI - min * this.data.length;\\n last = 0;\\n idx = 0;\\n this.segments = [];\\n _ref1 = this.values;\\n for (i = _j = 0, _len1 = _ref1.length; _j < _len1; i = ++_j) {\\n value = _ref1[i];\\n next = last + min + C * (value / total);\\n seg = new Morris.DonutSegment(cx, cy, w * 2, w, last, next, this.data[i].color || this.options.colors[idx % this.options.colors.length], this.options.backgroundColor, idx, this.raphael);\\n seg.render();\\n this.segments.push(seg);\\n seg.on('hover', this.select);\\n seg.on('click', this.click);\\n last = next;\\n idx += 1;\\n }\\n this.text1 = this.drawEmptyDonutLabel(cx, cy - 10, this.options.labelColor, 15, 800);\\n this.text2 = this.drawEmptyDonutLabel(cx, cy + 10, this.options.labelColor, 14);\\n max_value = Math.max.apply(Math, this.values);\\n idx = 0;\\n _ref2 = this.values;\\n _results = [];\\n for (_k = 0, _len2 = _ref2.length; _k < _len2; _k++) {\\n value = _ref2[_k];\\n if (value === max_value) {\\n this.select(idx);\\n break;\\n }\\n _results.push(idx += 1);\\n }\\n return _results;\\n };\\n\\n Donut.prototype.setData = function(data) {\\n var row;\\n this.data = data;\\n this.values = (function() {\\n var _i, _len, _ref, _results;\\n _ref = this.data;\\n _results = [];\\n for (_i = 0, _len = _ref.length; _i < _len; _i++) {\\n row = _ref[_i];\\n _results.push(parseFloat(row.value));\\n }\\n return _results;\\n }).call(this);\\n return this.redraw();\\n };\\n\\n Donut.prototype.click = function(idx) {\\n return this.fire('click', idx, this.data[idx]);\\n };\\n\\n Donut.prototype.select = function(idx) {\\n var row, s, segment, _i, _len, _ref;\\n _ref = this.segments;\\n for (_i = 0, _len = _ref.length; _i < _len; _i++) {\\n s = _ref[_i];\\n s.deselect();\\n }\\n segment = this.segments[idx];\\n segment.select();\\n row = this.data[idx];\\n return this.setLabels(row.label, this.options.formatter(row.value, row));\\n };\\n\\n Donut.prototype.setLabels = function(label1, label2) {\\n var inner, maxHeightBottom, maxHeightTop, maxWidth, text1bbox, text1scale, text2bbox, text2scale;\\n inner = (Math.min(this.el.width() / 2, this.el.height() / 2) - 10) * 2 / 3;\\n maxWidth = 1.8 * inner;\\n maxHeightTop = inner / 2;\\n maxHeightBottom = inner / 3;\\n this.text1.attr({\\n text: label1,\\n transform: ''\\n });\\n text1bbox = this.text1.getBBox();\\n text1scale = Math.min(maxWidth / text1bbox.width, maxHeightTop / text1bbox.height);\\n this.text1.attr({\\n transform: \\\"S\\\" + text1scale + \\\",\\\" + text1scale + \\\",\\\" + (text1bbox.x + text1bbox.width / 2) + \\\",\\\" + (text1bbox.y + text1bbox.height)\\n });\\n this.text2.attr({\\n text: label2,\\n transform: ''\\n });\\n text2bbox = this.text2.getBBox();\\n text2scale = Math.min(maxWidth / text2bbox.width, maxHeightBottom / text2bbox.height);\\n return this.text2.attr({\\n transform: \\\"S\\\" + text2scale + \\\",\\\" + text2scale + \\\",\\\" + (text2bbox.x + text2bbox.width / 2) + \\\",\\\" + text2bbox.y\\n });\\n };\\n\\n Donut.prototype.drawEmptyDonutLabel = function(xPos, yPos, color, fontSize, fontWeight) {\\n var text;\\n text = this.raphael.text(xPos, yPos, '').attr('font-size', fontSize).attr('fill', color);\\n if (fontWeight != null) {\\n text.attr('font-weight', fontWeight);\\n }\\n return text;\\n };\\n\\n Donut.prototype.resizeHandler = function() {\\n this.timeoutId = null;\\n this.raphael.setSize(this.el.width(), this.el.height());\\n return this.redraw();\\n };\\n\\n return Donut;\\n\\n })(Morris.EventEmitter);\\n\\n Morris.DonutSegment = (function(_super) {\\n __extends(DonutSegment, _super);\\n\\n function DonutSegment(cx, cy, inner, outer, p0, p1, color, backgroundColor, index, raphael) {\\n this.cx = cx;\\n this.cy = cy;\\n this.inner = inner;\\n this.outer = outer;\\n this.color = color;\\n this.backgroundColor = backgroundColor;\\n this.index = index;\\n this.raphael = raphael;\\n this.deselect = __bind(this.deselect, this);\\n this.select = __bind(this.select, this);\\n this.sin_p0 = Math.sin(p0);\\n this.cos_p0 = Math.cos(p0);\\n this.sin_p1 = Math.sin(p1);\\n this.cos_p1 = Math.cos(p1);\\n this.is_long = (p1 - p0) > Math.PI ? 1 : 0;\\n this.path = this.calcSegment(this.inner + 3, this.inner + this.outer - 5);\\n this.selectedPath = this.calcSegment(this.inner + 3, this.inner + this.outer);\\n this.hilight = this.calcArc(this.inner);\\n }\\n\\n DonutSegment.prototype.calcArcPoints = function(r) {\\n return [this.cx + r * this.sin_p0, this.cy + r * this.cos_p0, this.cx + r * this.sin_p1, this.cy + r * this.cos_p1];\\n };\\n\\n DonutSegment.prototype.calcSegment = function(r1, r2) {\\n var ix0, ix1, iy0, iy1, ox0, ox1, oy0, oy1, _ref, _ref1;\\n _ref = this.calcArcPoints(r1), ix0 = _ref[0], iy0 = _ref[1], ix1 = _ref[2], iy1 = _ref[3];\\n _ref1 = this.calcArcPoints(r2), ox0 = _ref1[0], oy0 = _ref1[1], ox1 = _ref1[2], oy1 = _ref1[3];\\n return (\\\"M\\\" + ix0 + \\\",\\\" + iy0) + (\\\"A\\\" + r1 + \\\",\\\" + r1 + \\\",0,\\\" + this.is_long + \\\",0,\\\" + ix1 + \\\",\\\" + iy1) + (\\\"L\\\" + ox1 + \\\",\\\" + oy1) + (\\\"A\\\" + r2 + \\\",\\\" + r2 + \\\",0,\\\" + this.is_long + \\\",1,\\\" + ox0 + \\\",\\\" + oy0) + \\\"Z\\\";\\n };\\n\\n DonutSegment.prototype.calcArc = function(r) {\\n var ix0, ix1, iy0, iy1, _ref;\\n _ref = this.calcArcPoints(r), ix0 = _ref[0], iy0 = _ref[1], ix1 = _ref[2], iy1 = _ref[3];\\n return (\\\"M\\\" + ix0 + \\\",\\\" + iy0) + (\\\"A\\\" + r + \\\",\\\" + r + \\\",0,\\\" + this.is_long + \\\",0,\\\" + ix1 + \\\",\\\" + iy1);\\n };\\n\\n DonutSegment.prototype.render = function() {\\n var _this = this;\\n this.arc = this.drawDonutArc(this.hilight, this.color);\\n return this.seg = this.drawDonutSegment(this.path, this.color, this.backgroundColor, function() {\\n return _this.fire('hover', _this.index);\\n }, function() {\\n return _this.fire('click', _this.index);\\n });\\n };\\n\\n DonutSegment.prototype.drawDonutArc = function(path, color) {\\n return this.raphael.path(path).attr({\\n stroke: color,\\n 'stroke-width': 2,\\n opacity: 0\\n });\\n };\\n\\n DonutSegment.prototype.drawDonutSegment = function(path, fillColor, strokeColor, hoverFunction, clickFunction) {\\n return this.raphael.path(path).attr({\\n fill: fillColor,\\n stroke: strokeColor,\\n 'stroke-width': 3\\n }).hover(hoverFunction).click(clickFunction);\\n };\\n\\n DonutSegment.prototype.select = function() {\\n if (!this.selected) {\\n this.seg.animate({\\n path: this.selectedPath\\n }, 150, '<>');\\n this.arc.animate({\\n opacity: 1\\n }, 150, '<>');\\n return this.selected = true;\\n }\\n };\\n\\n DonutSegment.prototype.deselect = function() {\\n if (this.selected) {\\n this.seg.animate({\\n path: this.path\\n }, 150, '<>');\\n this.arc.animate({\\n opacity: 0\\n }, 150, '<>');\\n return this.selected = false;\\n }\\n };\\n\\n return DonutSegment;\\n\\n })(Morris.EventEmitter);\\n\\n}).call(this);\\n\"\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/raw-loader!./src/assets/inspinia/plugins/morris/morris.js\n// module id = 2186\n// module chunks = 1","require(\"!!/opt/atlassian/pipelines/agent/build/node_modules/script-loader/addScript.js\")(require(\"!!/opt/atlassian/pipelines/agent/build/node_modules/raw-loader/index.js!/opt/atlassian/pipelines/agent/build/src/assets/inspinia/plugins/ladda/spin.min.js\"))\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/script-loader!./src/assets/inspinia/plugins/ladda/spin.min.js\n// module id = 2187\n// module chunks = 1","module.exports = \"(function(t,e){\\\"object\\\"==typeof exports?module.exports=e():\\\"function\\\"==typeof define&&define.amd?define(e):t.Spinner=e()})(this,function(){\\\"use strict\\\";function t(t,e){var i,n=document.createElement(t||\\\"div\\\");for(i in e)n[i]=e[i];return n}function e(t){for(var e=1,i=arguments.length;i>e;e++)t.appendChild(arguments[e]);return t}function i(t,e,i,n){var r=[\\\"opacity\\\",e,~~(100*t),i,n].join(\\\"-\\\"),o=.01+100*(i/n),a=Math.max(1-(1-t)/e*(100-o),t),s=u.substring(0,u.indexOf(\\\"Animation\\\")).toLowerCase(),l=s&&\\\"-\\\"+s+\\\"-\\\"||\\\"\\\";return c[r]||(p.insertRule(\\\"@\\\"+l+\\\"keyframes \\\"+r+\\\"{\\\"+\\\"0%{opacity:\\\"+a+\\\"}\\\"+o+\\\"%{opacity:\\\"+t+\\\"}\\\"+(o+.01)+\\\"%{opacity:1}\\\"+(o+e)%100+\\\"%{opacity:\\\"+t+\\\"}\\\"+\\\"100%{opacity:\\\"+a+\\\"}\\\"+\\\"}\\\",p.cssRules.length),c[r]=1),r}function n(t,e){var i,n,r=t.style;for(e=e.charAt(0).toUpperCase()+e.slice(1),n=0;d.length>n;n++)if(i=d[n]+e,void 0!==r[i])return i;return void 0!==r[e]?e:void 0}function r(t,e){for(var i in e)t.style[n(t,i)||i]=e[i];return t}function o(t){for(var e=1;arguments.length>e;e++){var i=arguments[e];for(var n in i)void 0===t[n]&&(t[n]=i[n])}return t}function a(t,e){return\\\"string\\\"==typeof t?t:t[e%t.length]}function s(t){this.opts=o(t||{},s.defaults,f)}function l(){function i(e,i){return t(\\\"<\\\"+e+' xmlns=\\\"urn:schemas-microsoft.com:vml\\\" class=\\\"spin-vml\\\">',i)}p.addRule(\\\".spin-vml\\\",\\\"behavior:url(#default#VML)\\\"),s.prototype.lines=function(t,n){function o(){return r(i(\\\"group\\\",{coordsize:d+\\\" \\\"+d,coordorigin:-u+\\\" \\\"+-u}),{width:d,height:d})}function s(t,s,l){e(p,e(r(o(),{rotation:360/n.lines*t+\\\"deg\\\",left:~~s}),e(r(i(\\\"roundrect\\\",{arcsize:n.corners}),{width:u,height:n.width,left:n.radius,top:-n.width>>1,filter:l}),i(\\\"fill\\\",{color:a(n.color,t),opacity:n.opacity}),i(\\\"stroke\\\",{opacity:0}))))}var l,u=n.length+n.width,d=2*u,c=2*-(n.width+n.length)+\\\"px\\\",p=r(o(),{position:\\\"absolute\\\",top:c,left:c});if(n.shadow)for(l=1;n.lines>=l;l++)s(l,-2,\\\"progid:DXImageTransform.Microsoft.Blur(pixelradius=2,makeshadow=1,shadowopacity=.3)\\\");for(l=1;n.lines>=l;l++)s(l);return e(t,p)},s.prototype.opacity=function(t,e,i,n){var r=t.firstChild;n=n.shadow&&n.lines||0,r&&r.childNodes.length>e+n&&(r=r.childNodes[e+n],r=r&&r.firstChild,r=r&&r.firstChild,r&&(r.opacity=i))}}var u,d=[\\\"webkit\\\",\\\"Moz\\\",\\\"ms\\\",\\\"O\\\"],c={},p=function(){var i=t(\\\"style\\\",{type:\\\"text/css\\\"});return e(document.getElementsByTagName(\\\"head\\\")[0],i),i.sheet||i.styleSheet}(),f={lines:12,length:7,width:5,radius:10,rotate:0,corners:1,color:\\\"#000\\\",direction:1,speed:1,trail:100,opacity:.25,fps:20,zIndex:2e9,className:\\\"spinner\\\",top:\\\"50%\\\",left:\\\"50%\\\",position:\\\"absolute\\\"};s.defaults={},o(s.prototype,{spin:function(e){this.stop();var i=this,n=i.opts,o=i.el=r(t(0,{className:n.className}),{position:n.position,width:0,zIndex:n.zIndex});if(n.radius+n.length+n.width,r(o,{left:n.left,top:n.top}),e&&e.insertBefore(o,e.firstChild||null),o.setAttribute(\\\"role\\\",\\\"progressbar\\\"),i.lines(o,i.opts),!u){var a,s=0,l=(n.lines-1)*(1-n.direction)/2,d=n.fps,c=d/n.speed,p=(1-n.opacity)/(c*n.trail/100),f=c/n.lines;(function h(){s++;for(var t=0;n.lines>t;t++)a=Math.max(1-(s+(n.lines-t)*f)%c*p,n.opacity),i.opacity(o,t*n.direction+l,a,n);i.timeout=i.el&&setTimeout(h,~~(1e3/d))})()}return i},stop:function(){var t=this.el;return t&&(clearTimeout(this.timeout),t.parentNode&&t.parentNode.removeChild(t),this.el=void 0),this},lines:function(n,o){function s(e,i){return r(t(),{position:\\\"absolute\\\",width:o.length+o.width+\\\"px\\\",height:o.width+\\\"px\\\",background:e,boxShadow:i,transformOrigin:\\\"left\\\",transform:\\\"rotate(\\\"+~~(360/o.lines*d+o.rotate)+\\\"deg) translate(\\\"+o.radius+\\\"px\\\"+\\\",0)\\\",borderRadius:(o.corners*o.width>>1)+\\\"px\\\"})}for(var l,d=0,c=(o.lines-1)*(1-o.direction)/2;o.lines>d;d++)l=r(t(),{position:\\\"absolute\\\",top:1+~(o.width/2)+\\\"px\\\",transform:o.hwaccel?\\\"translate3d(0,0,0)\\\":\\\"\\\",opacity:o.opacity,animation:u&&i(o.opacity,o.trail,c+d*o.direction,o.lines)+\\\" \\\"+1/o.speed+\\\"s linear infinite\\\"}),o.shadow&&e(l,r(s(\\\"#000\\\",\\\"0 0 4px #000\\\"),{top:\\\"2px\\\"})),e(n,e(l,s(a(o.color,d),\\\"0 0 1px rgba(0,0,0,.1)\\\")));return n},opacity:function(t,e,i){t.childNodes.length>e&&(t.childNodes[e].style.opacity=i)}});var h=r(t(\\\"group\\\"),{behavior:\\\"url(#default#VML)\\\"});return!n(h,\\\"transform\\\")&&h.adj?l():u=n(h,\\\"animation\\\"),s});\"\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/raw-loader!./src/assets/inspinia/plugins/ladda/spin.min.js\n// module id = 2188\n// module chunks = 1","require(\"!!/opt/atlassian/pipelines/agent/build/node_modules/script-loader/addScript.js\")(require(\"!!/opt/atlassian/pipelines/agent/build/node_modules/raw-loader/index.js!/opt/atlassian/pipelines/agent/build/src/assets/inspinia/plugins/ladda/ladda.min.js\"))\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/script-loader!./src/assets/inspinia/plugins/ladda/ladda.min.js\n// module id = 2189\n// module chunks = 1","module.exports = \"/*!\\n * Ladda 0.9.8 (2015-03-19, 17:22)\\n * http://lab.hakim.se/ladda\\n * MIT licensed\\n *\\n * Copyright (C) 2015 Hakim El Hattab, http://hakim.se\\n */\\n(function(t,e){\\\"object\\\"==typeof exports?module.exports=e(require(\\\"spin.js\\\")):\\\"function\\\"==typeof define&&define.amd?define([\\\"spin.min.js\\\"],e):t.Ladda=e(t.Spinner)})(this,function(t){\\\"use strict\\\";function e(t){if(t===void 0)return console.warn(\\\"Ladda button target must be defined.\\\"),void 0;t.querySelector(\\\".ladda-label\\\")||(t.innerHTML='<span class=\\\"ladda-label\\\">'+t.innerHTML+\\\"</span>\\\");var e,n=t.querySelector(\\\".ladda-spinner\\\");n||(n=document.createElement(\\\"span\\\"),n.className=\\\"ladda-spinner\\\"),t.appendChild(n);var r,a={start:function(){return e||(e=o(t)),t.setAttribute(\\\"disabled\\\",\\\"\\\"),t.setAttribute(\\\"data-loading\\\",\\\"\\\"),clearTimeout(r),e.spin(n),this.setProgress(0),this},startAfter:function(t){return clearTimeout(r),r=setTimeout(function(){a.start()},t),this},stop:function(){return t.removeAttribute(\\\"disabled\\\"),t.removeAttribute(\\\"data-loading\\\"),clearTimeout(r),e&&(r=setTimeout(function(){e.stop()},1e3)),this},toggle:function(){return this.isLoading()?this.stop():this.start(),this},setProgress:function(e){e=Math.max(Math.min(e,1),0);var n=t.querySelector(\\\".ladda-progress\\\");0===e&&n&&n.parentNode?n.parentNode.removeChild(n):(n||(n=document.createElement(\\\"div\\\"),n.className=\\\"ladda-progress\\\",t.appendChild(n)),n.style.width=(e||0)*t.offsetWidth+\\\"px\\\")},enable:function(){return this.stop(),this},disable:function(){return this.stop(),t.setAttribute(\\\"disabled\\\",\\\"\\\"),this},isLoading:function(){return t.hasAttribute(\\\"data-loading\\\")},remove:function(){clearTimeout(r),t.removeAttribute(\\\"disabled\\\",\\\"\\\"),t.removeAttribute(\\\"data-loading\\\",\\\"\\\"),e&&(e.stop(),e=null);for(var n=0,i=u.length;i>n;n++)if(a===u[n]){u.splice(n,1);break}}};return u.push(a),a}function n(t,e){for(;t.parentNode&&t.tagName!==e;)t=t.parentNode;return e===t.tagName?t:void 0}function r(t){for(var e=[\\\"input\\\",\\\"textarea\\\",\\\"select\\\"],n=[],r=0;e.length>r;r++)for(var a=t.getElementsByTagName(e[r]),i=0;a.length>i;i++)a[i].hasAttribute(\\\"required\\\")&&n.push(a[i]);return n}function a(t,a){a=a||{};var i=[];\\\"string\\\"==typeof t?i=s(document.querySelectorAll(t)):\\\"object\\\"==typeof t&&\\\"string\\\"==typeof t.nodeName&&(i=[t]);for(var o=0,u=i.length;u>o;o++)(function(){var t=i[o];if(\\\"function\\\"==typeof t.addEventListener){var s=e(t),u=-1;t.addEventListener(\\\"click\\\",function(){var e=!0,i=n(t,\\\"FORM\\\");if(i!==void 0)for(var o=r(i),d=0;o.length>d;d++)\\\"\\\"===o[d].value.replace(/^\\\\s+|\\\\s+$/g,\\\"\\\")&&(e=!1),\\\"checkbox\\\"!==o[d].type&&\\\"radio\\\"!==o[d].type||o[d].checked||(e=!1),\\\"email\\\"===o[d].type&&(e=/^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\\\\.[a-zA-Z0-9-.]+$/.test(o[d].value));e&&(s.startAfter(1),\\\"number\\\"==typeof a.timeout&&(clearTimeout(u),u=setTimeout(s.stop,a.timeout)),\\\"function\\\"==typeof a.callback&&a.callback.apply(null,[s]))},!1)}})()}function i(){for(var t=0,e=u.length;e>t;t++)u[t].stop()}function o(e){var n,r=e.offsetHeight;0===r&&(r=parseFloat(window.getComputedStyle(e).height)),r>32&&(r*=.8),e.hasAttribute(\\\"data-spinner-size\\\")&&(r=parseInt(e.getAttribute(\\\"data-spinner-size\\\"),10)),e.hasAttribute(\\\"data-spinner-color\\\")&&(n=e.getAttribute(\\\"data-spinner-color\\\"));var a=12,i=.2*r,o=.6*i,s=7>i?2:3;return new t({color:n||\\\"#fff\\\",lines:a,radius:i,length:o,width:s,zIndex:\\\"auto\\\",top:\\\"auto\\\",left:\\\"auto\\\",className:\\\"\\\"})}function s(t){for(var e=[],n=0;t.length>n;n++)e.push(t[n]);return e}var u=[];return{bind:a,create:e,stopAll:i}});\"\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/raw-loader!./src/assets/inspinia/plugins/ladda/ladda.min.js\n// module id = 2190\n// module chunks = 1","require(\"!!/opt/atlassian/pipelines/agent/build/node_modules/script-loader/addScript.js\")(require(\"!!/opt/atlassian/pipelines/agent/build/node_modules/raw-loader/index.js!/opt/atlassian/pipelines/agent/build/src/assets/inspinia/plugins/ladda/angular-ladda.min.js\"))\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/script-loader!./src/assets/inspinia/plugins/ladda/angular-ladda.min.js\n// module id = 2191\n// module chunks = 1","module.exports = \"/*! angular-ladda 0.3.1 */\\n!function(e,t){\\\"use strict\\\";if(\\\"function\\\"==typeof define&&define.amd)define([\\\"angular\\\",\\\"ladda\\\"],t);else{if(\\\"undefined\\\"==typeof module||\\\"object\\\"!=typeof module.exports)return t(e.angular,e.Ladda);module.exports=t(require(\\\"angular\\\"),require(\\\"ladda\\\"))}}(this,function(e,t){\\\"use strict\\\";var a=\\\"angular-ladda\\\";return e.module(a,[]).provider(\\\"ladda\\\",function(){var t={style:\\\"zoom-in\\\"};return{setOption:function(a){e.extend(t,a)},$get:function(){return t}}}).directive(\\\"ladda\\\",[\\\"ladda\\\",function(a){return{restrict:\\\"A\\\",priority:-1,link:function(n,d,r){if(d.addClass(\\\"ladda-button\\\"),e.isUndefined(d.attr(\\\"data-style\\\"))&&d.attr(\\\"data-style\\\",a.style||\\\"zoom-in\\\"),!d[0].querySelector(\\\".ladda-label\\\")){var i=document.createElement(\\\"span\\\");i.className=\\\"ladda-label\\\",e.element(i).append(d.contents()),d.append(i)}var l=t.create(d[0]);n.$watch(r.ladda,function(t){return t||e.isNumber(t)?(l.isLoading()||l.start(),void(e.isNumber(t)&&l.setProgress(t))):(l.stop(),void(r.ngDisabled&&d.attr(\\\"disabled\\\",n.$eval(r.ngDisabled))))})}}}]),a});\"\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/raw-loader!./src/assets/inspinia/plugins/ladda/angular-ladda.min.js\n// module id = 2192\n// module chunks = 1","require(\"!!/opt/atlassian/pipelines/agent/build/node_modules/script-loader/addScript.js\")(require(\"!!/opt/atlassian/pipelines/agent/build/node_modules/raw-loader/index.js!/opt/atlassian/pipelines/agent/build/src/assets/inspinia/inspinia.js\"))\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/script-loader!./src/assets/inspinia/inspinia.js\n// module id = 2193\n// module chunks = 1","module.exports = \"/**\\n * INSPINIA - Responsive Admin Theme\\n * 2.7.1\\n *\\n * Custom scripts\\n */\\n\\n/**\\n * Adds all of the event listeners to change props based on document size\\n *\\n */\\n(function documentResizeConfiguration() {\\n let fixHeightTimer;\\n let fixHeightBodySmallTimer;\\n let fixBodySmallTimer;\\n let fixSidebarTopTimer;\\n\\n /**\\n * Sets the heights of nav and wrapper elements to the tallest\\n *\\n */\\n function fixHeight() {\\n clearTimeout(fixHeightTimer);\\n\\n fixHeightTimer = setTimeout(() => {\\n try {\\n const navbarHeight = document.getElementsByClassName('navbar-default')[0].clientHeight;\\n const wrapperHeight = document.getElementById('page-wrapper').clientHeight;\\n\\n if (navbarHeight > wrapperHeight) {\\n document.getElementById('page-wrapper').style.minHeight = `${navbarHeight}px`;\\n }\\n\\n if (navbarHeight < wrapperHeight) {\\n document.getElementById('page-wrapper').style.minHeight = `${window.innerHeight}px`;\\n }\\n\\n if (document.body.classList.contains('fixed-nav')) {\\n if (navbarHeight > wrapperHeight) {\\n document.getElementById('page-wrapper').style.minHeight = `${navbarHeight}px`;\\n } else {\\n document.getElementById('page-wrapper').style.minHeight = `${window.innerHeight - 60}px`;\\n }\\n }\\n } catch (err) {\\n console.log(err);\\n }\\n }, 250);\\n }\\n\\n function fixHeightBodySmall() {\\n clearTimeout(fixHeightBodySmallTimer);\\n\\n fixHeightBodySmallTimer = setTimeout(() => {\\n if (!document.body.classList.contains('body-small')) {\\n fixHeight();\\n }\\n }, 250);\\n }\\n\\n /**\\n * Adds the body-small class to the body element if below the media query threshold\\n *\\n */\\n function fixBodySmall() {\\n clearTimeout(fixBodySmallTimer);\\n\\n fixBodySmallTimer = setTimeout(() => {\\n if ($('body').hasClass('mini-navbar')) {\\n return;\\n }\\n\\n if (document.body.clientWidth < 769) {\\n return document.body.classList.add('body-small');\\n }\\n document.body.classList.remove('body-small');\\n }, 250);\\n }\\n\\n /**\\n * Not even clear if this is useful =P\\n *\\n */\\n function fixSidebarTop() {\\n clearTimeout(fixSidebarTopTimer);\\n\\n fixSidebarTopTimer = setTimeout(() => {\\n try {\\n if (window.pageXOffset > 0 && !document.body.classList.contains('fixed-nav')) {\\n document.getElementById('right-sidebar').classList.add('sidebar-top');\\n } else {\\n document.getElementById('right-sidebar').classList.remove('sidebar-top');\\n }\\n } catch (err) {\\n console.log(err);\\n }\\n }, 250);\\n }\\n\\n document.addEventListener('readystatechange', event => {\\n if (event.target.readyState === 'complete') {\\n setTimeout(function() {\\n fixHeight();\\n }, 200);\\n }\\n });\\n\\n window.addEventListener('load', event => {\\n fixBodySmall();\\n fixHeightBodySmall();\\n });\\n\\n window.addEventListener('resize', event => {\\n fixBodySmall();\\n fixHeightBodySmall();\\n });\\n\\n window.addEventListener('scroll', event => {\\n fixHeightBodySmall();\\n fixSidebarTop();\\n });\\n})();\\n\"\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/raw-loader!./src/assets/inspinia/inspinia.js\n// module id = 2194\n// module chunks = 1","require(\"!!/opt/atlassian/pipelines/agent/build/node_modules/script-loader/addScript.js\")(require(\"!!/opt/atlassian/pipelines/agent/build/node_modules/raw-loader/index.js!/opt/atlassian/pipelines/agent/build/src/assets/inspinia/plugins/metisMenu/jquery.metisMenu.js\"))\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/script-loader!./src/assets/inspinia/plugins/metisMenu/jquery.metisMenu.js\n// module id = 2195\n// module chunks = 1","module.exports = \"/*\\r\\n * metismenu - v2.0.2\\r\\n * A jQuery menu plugin\\r\\n * https://github.com/onokumus/metisMenu\\r\\n *\\r\\n * Made by Osman Nuri Okumus\\r\\n * Under MIT License\\r\\n */\\r\\n\\r\\n!function(a){\\\"use strict\\\";function b(){var a=document.createElement(\\\"mm\\\"),b={WebkitTransition:\\\"webkitTransitionEnd\\\",MozTransition:\\\"transitionend\\\",OTransition:\\\"oTransitionEnd otransitionend\\\",transition:\\\"transitionend\\\"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}function c(b){return this.each(function(){var c=a(this),d=c.data(\\\"mm\\\"),f=a.extend({},e.DEFAULTS,c.data(),\\\"object\\\"==typeof b&&b);d||c.data(\\\"mm\\\",d=new e(this,f)),\\\"string\\\"==typeof b&&d[b]()})}a.fn.emulateTransitionEnd=function(b){var c=!1,e=this;a(this).one(\\\"mmTransitionEnd\\\",function(){c=!0});var f=function(){c||a(e).trigger(d.end)};return setTimeout(f,b),this};var d=b();d&&(a.event.special.mmTransitionEnd={bindType:d.end,delegateType:d.end,handle:function(b){return a(b.target).is(this)?b.handleObj.handler.apply(this,arguments):void 0}});var e=function(b,c){this.$element=a(b),this.options=a.extend({},e.DEFAULTS,c),this.transitioning=null,this.init()};e.TRANSITION_DURATION=350,e.DEFAULTS={toggle:!0,doubleTapToGo:!1,activeClass:\\\"active\\\"},e.prototype.init=function(){var b=this,c=this.options.activeClass;this.$element.find(\\\"li.\\\"+c).has(\\\"ul\\\").children(\\\"ul\\\").addClass(\\\"collapse in\\\"),this.$element.find(\\\"li\\\").not(\\\".\\\"+c).has(\\\"ul\\\").children(\\\"ul\\\").addClass(\\\"collapse\\\"),this.options.doubleTapToGo&&this.$element.find(\\\"li.\\\"+c).has(\\\"ul\\\").children(\\\"a\\\").addClass(\\\"doubleTapToGo\\\"),this.$element.find(\\\"li\\\").has(\\\"ul\\\").children(\\\"a\\\").on(\\\"click.metisMenu\\\",function(d){var e=a(this),f=e.parent(\\\"li\\\"),g=f.children(\\\"ul\\\");return d.preventDefault(),f.hasClass(c)?b.hide(g):b.show(g),b.options.doubleTapToGo&&b.doubleTapToGo(e)&&\\\"#\\\"!==e.attr(\\\"href\\\")&&\\\"\\\"!==e.attr(\\\"href\\\")?(d.stopPropagation(),void(document.location=e.attr(\\\"href\\\"))):void 0})},e.prototype.doubleTapToGo=function(a){var b=this.$element;return a.hasClass(\\\"doubleTapToGo\\\")?(a.removeClass(\\\"doubleTapToGo\\\"),!0):a.parent().children(\\\"ul\\\").length?(b.find(\\\".doubleTapToGo\\\").removeClass(\\\"doubleTapToGo\\\"),a.addClass(\\\"doubleTapToGo\\\"),!1):void 0},e.prototype.show=function(b){var c=this.options.activeClass,f=a(b),g=f.parent(\\\"li\\\");if(!this.transitioning&&!f.hasClass(\\\"in\\\")){g.addClass(c),this.options.toggle&&this.hide(g.siblings().children(\\\"ul.in\\\")),f.removeClass(\\\"collapse\\\").addClass(\\\"collapsing\\\").height(0),this.transitioning=1;var h=function(){f.removeClass(\\\"collapsing\\\").addClass(\\\"collapse in\\\").height(\\\"\\\"),this.transitioning=0};return d?void f.one(\\\"mmTransitionEnd\\\",a.proxy(h,this)).emulateTransitionEnd(e.TRANSITION_DURATION).height(f[0].scrollHeight):h.call(this)}},e.prototype.hide=function(b){var c=this.options.activeClass,f=a(b);if(!this.transitioning&&f.hasClass(\\\"in\\\")){f.parent(\\\"li\\\").removeClass(c),f.height(f.height())[0].offsetHeight,f.addClass(\\\"collapsing\\\").removeClass(\\\"collapse\\\").removeClass(\\\"in\\\"),this.transitioning=1;var g=function(){this.transitioning=0,f.removeClass(\\\"collapsing\\\").addClass(\\\"collapse\\\")};return d?void f.height(0).one(\\\"mmTransitionEnd\\\",a.proxy(g,this)).emulateTransitionEnd(e.TRANSITION_DURATION):g.call(this)}};var f=a.fn.metisMenu;a.fn.metisMenu=c,a.fn.metisMenu.Constructor=e,a.fn.metisMenu.noConflict=function(){return a.fn.metisMenu=f,this}}(jQuery);\\r\\n\"\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/raw-loader!./src/assets/inspinia/plugins/metisMenu/jquery.metisMenu.js\n// module id = 2196\n// module chunks = 1","require(\"!!/opt/atlassian/pipelines/agent/build/node_modules/script-loader/addScript.js\")(require(\"!!/opt/atlassian/pipelines/agent/build/node_modules/raw-loader/index.js!/opt/atlassian/pipelines/agent/build/src/assets/inspinia/plugins/staps/jquery.steps.min.js\"))\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/script-loader!./src/assets/inspinia/plugins/staps/jquery.steps.min.js\n// module id = 2197\n// module chunks = 1","module.exports = \"/*! \\n * jQuery Steps v1.0.6 - 04/27/2014\\n * Copyright (c) 2014 Rafael Staib (http://www.jquery-steps.com)\\n * Licensed under MIT http://www.opensource.org/licenses/MIT\\n */\\n!function(a,b){function c(a,b){o(a).push(b)}function d(d,e,f){var g=d.children(e.headerTag),h=d.children(e.bodyTag);g.length>h.length?R(Z,\\\"contents\\\"):g.length<h.length&&R(Z,\\\"titles\\\");var i=e.startIndex;if(f.stepCount=g.length,e.saveState&&a.cookie){var j=a.cookie(U+q(d)),k=parseInt(j,0);!isNaN(k)&&k<f.stepCount&&(i=k)}f.currentIndex=i,g.each(function(e){var f=a(this),g=h.eq(e),i=g.data(\\\"mode\\\"),j=null==i?$.html:r($,/^\\\\s*$/.test(i)||isNaN(i)?i:parseInt(i,0)),k=j===$.html||g.data(\\\"url\\\")===b?\\\"\\\":g.data(\\\"url\\\"),l=j!==$.html&&\\\"1\\\"===g.data(\\\"loaded\\\"),m=a.extend({},bb,{title:f.html(),content:j===$.html?g.html():\\\"\\\",contentUrl:k,contentMode:j,contentLoaded:l});c(d,m)})}function e(a){a.triggerHandler(\\\"canceled\\\")}function f(a,b){return a.currentIndex-b}function g(b,c){var d=i(b);b.unbind(d).removeData(\\\"uid\\\").removeData(\\\"options\\\").removeData(\\\"state\\\").removeData(\\\"steps\\\").removeData(\\\"eventNamespace\\\").find(\\\".actions a\\\").unbind(d),b.removeClass(c.clearFixCssClass+\\\" vertical\\\");var e=b.find(\\\".content > *\\\");e.removeData(\\\"loaded\\\").removeData(\\\"mode\\\").removeData(\\\"url\\\"),e.removeAttr(\\\"id\\\").removeAttr(\\\"role\\\").removeAttr(\\\"tabindex\\\").removeAttr(\\\"class\\\").removeAttr(\\\"style\\\")._removeAria(\\\"labelledby\\\")._removeAria(\\\"hidden\\\"),b.find(\\\".content > [data-mode='async'],.content > [data-mode='iframe']\\\").empty();var f=a('<{0} class=\\\"{1}\\\"></{0}>'.format(b.get(0).tagName,b.attr(\\\"class\\\"))),g=b._id();return null!=g&&\\\"\\\"!==g&&f._id(g),f.html(b.find(\\\".content\\\").html()),b.after(f),b.remove(),f}function h(a,b){var c=a.find(\\\".steps li\\\").eq(b.currentIndex);a.triggerHandler(\\\"finishing\\\",[b.currentIndex])?(c.addClass(\\\"done\\\").removeClass(\\\"error\\\"),a.triggerHandler(\\\"finished\\\",[b.currentIndex])):c.addClass(\\\"error\\\")}function i(a){var b=a.data(\\\"eventNamespace\\\");return null==b&&(b=\\\".\\\"+q(a),a.data(\\\"eventNamespace\\\",b)),b}function j(a,b){var c=q(a);return a.find(\\\"#\\\"+c+V+b)}function k(a,b){var c=q(a);return a.find(\\\"#\\\"+c+W+b)}function l(a,b){var c=q(a);return a.find(\\\"#\\\"+c+X+b)}function m(a){return a.data(\\\"options\\\")}function n(a){return a.data(\\\"state\\\")}function o(a){return a.data(\\\"steps\\\")}function p(a,b){var c=o(a);return(0>b||b>=c.length)&&R(Y),c[b]}function q(a){var b=a.data(\\\"uid\\\");return null==b&&(b=a._id(),null==b&&(b=\\\"steps-uid-\\\".concat(T),a._id(b)),T++,a.data(\\\"uid\\\",b)),b}function r(a,c){if(S(\\\"enumType\\\",a),S(\\\"keyOrValue\\\",c),\\\"string\\\"==typeof c){var d=a[c];return d===b&&R(\\\"The enum key '{0}' does not exist.\\\",c),d}if(\\\"number\\\"==typeof c){for(var e in a)if(a[e]===c)return c;R(\\\"Invalid enum value '{0}'.\\\",c)}else R(\\\"Invalid key or value type.\\\")}function s(a,b,c){return B(a,b,c,v(c,1))}function t(a,b,c){return B(a,b,c,f(c,1))}function u(a,b,c,d){if((0>d||d>=c.stepCount)&&R(Y),!(b.forceMoveForward&&d<c.currentIndex)){var e=c.currentIndex;return a.triggerHandler(\\\"stepChanging\\\",[c.currentIndex,d])?(c.currentIndex=d,O(a,b,c),E(a,b,c,e),D(a,b,c),A(a,b,c),P(a,b,c,d,e),a.triggerHandler(\\\"stepChanged\\\",[d,e])):a.find(\\\".steps li\\\").eq(e).addClass(\\\"error\\\"),!0}}function v(a,b){return a.currentIndex+b}function w(b){var c=a.extend(!0,{},cb,b);return this.each(function(){var b=a(this),e={currentIndex:c.startIndex,currentStep:null,stepCount:0,transitionElement:null};b.data(\\\"options\\\",c),b.data(\\\"state\\\",e),b.data(\\\"steps\\\",[]),d(b,c,e),J(b,c,e),G(b,c),c.autoFocus&&0===T&&j(b,c.startIndex).focus()})}function x(b,c,d,e,f){(0>e||e>d.stepCount)&&R(Y),f=a.extend({},bb,f),y(b,e,f),d.currentIndex!==d.stepCount&&d.currentIndex>=e&&(d.currentIndex++,O(b,c,d)),d.stepCount++;var g=b.find(\\\".content\\\"),h=a(\\\"<{0}>{1}</{0}>\\\".format(c.headerTag,f.title)),i=a(\\\"<{0}></{0}>\\\".format(c.bodyTag));return(null==f.contentMode||f.contentMode===$.html)&&i.html(f.content),0===e?g.prepend(i).prepend(h):k(b,e-1).after(i).after(h),K(b,d,i,e),N(b,c,d,h,e),F(b,c,d,e),e===d.currentIndex&&E(b,c,d),D(b,c,d),b}function y(a,b,c){o(a).splice(b,0,c)}function z(b){var c=a(this),d=m(c),e=n(c);if(d.suppressPaginationOnFocus&&c.find(\\\":focus\\\").is(\\\":input\\\"))return b.preventDefault(),!1;var f={left:37,right:39};b.keyCode===f.left?(b.preventDefault(),t(c,d,e)):b.keyCode===f.right&&(b.preventDefault(),s(c,d,e))}function A(b,c,d){if(d.stepCount>0){var e=p(b,d.currentIndex);if(!c.enableContentCache||!e.contentLoaded)switch(r($,e.contentMode)){case $.iframe:b.find(\\\".content > .body\\\").eq(d.currentIndex).empty().html('<iframe src=\\\"'+e.contentUrl+'\\\" frameborder=\\\"0\\\" scrolling=\\\"no\\\" />').data(\\\"loaded\\\",\\\"1\\\");break;case $.async:var f=k(b,d.currentIndex)._aria(\\\"busy\\\",\\\"true\\\").empty().append(M(c.loadingTemplate,{text:c.labels.loading}));a.ajax({url:e.contentUrl,cache:!1}).done(function(a){f.empty().html(a)._aria(\\\"busy\\\",\\\"false\\\").data(\\\"loaded\\\",\\\"1\\\")})}}}function B(a,b,c,d){var e=c.currentIndex;if(d>=0&&d<c.stepCount&&!(b.forceMoveForward&&d<c.currentIndex)){var f=j(a,d),g=f.parent(),h=g.hasClass(\\\"disabled\\\");return g._enableAria(),f.click(),e===c.currentIndex&&h?(g._enableAria(!1),!1):!0}return!1}function C(b){b.preventDefault();var c=a(this),d=c.parent().parent().parent().parent(),f=m(d),g=n(d),i=c.attr(\\\"href\\\");switch(i.substring(i.lastIndexOf(\\\"#\\\")+1)){case\\\"cancel\\\":e(d);break;case\\\"finish\\\":h(d,g);break;case\\\"next\\\":s(d,f,g);break;case\\\"previous\\\":t(d,f,g)}}function D(a,b,c){if(b.enablePagination){var d=a.find(\\\".actions a[href$='#finish']\\\").parent(),e=a.find(\\\".actions a[href$='#next']\\\").parent();if(!b.forceMoveForward){var f=a.find(\\\".actions a[href$='#previous']\\\").parent();f._enableAria(c.currentIndex>0)}b.enableFinishButton&&b.showFinishButtonAlways?(d._enableAria(c.stepCount>0),e._enableAria(c.stepCount>1&&c.stepCount>c.currentIndex+1)):(d._showAria(b.enableFinishButton&&c.stepCount>=c.currentIndex+1),e._showAria(0===c.stepCount||c.stepCount>c.currentIndex+1)._enableAria(c.stepCount>c.currentIndex+1||!b.enableFinishButton))}}function E(b,c,d,e){var f=j(b,d.currentIndex),g=a('<span class=\\\"current-info audible\\\">'+c.labels.current+\\\" </span>\\\"),h=b.find(\\\".content > .title\\\");if(null!=e){var i=j(b,e);i.parent().addClass(\\\"done\\\").removeClass(\\\"error\\\")._selectAria(!1),h.eq(e).removeClass(\\\"current\\\").next(\\\".body\\\").removeClass(\\\"current\\\"),g=i.find(\\\".current-info\\\"),f.focus()}f.prepend(g).parent()._selectAria().removeClass(\\\"done\\\")._enableAria(),h.eq(d.currentIndex).addClass(\\\"current\\\").next(\\\".body\\\").addClass(\\\"current\\\")}function F(a,b,c,d){for(var e=q(a),f=d;f<c.stepCount;f++){var g=e+V+f,h=e+W+f,i=e+X+f,j=a.find(\\\".title\\\").eq(f)._id(i);a.find(\\\".steps a\\\").eq(f)._id(g)._aria(\\\"controls\\\",h).attr(\\\"href\\\",\\\"#\\\"+i).html(M(b.titleTemplate,{index:f+1,title:j.html()})),a.find(\\\".body\\\").eq(f)._id(h)._aria(\\\"labelledby\\\",i)}}function G(a,b){var c=i(a);a.bind(\\\"canceled\\\"+c,b.onCanceled),a.bind(\\\"finishing\\\"+c,b.onFinishing),a.bind(\\\"finished\\\"+c,b.onFinished),a.bind(\\\"stepChanging\\\"+c,b.onStepChanging),a.bind(\\\"stepChanged\\\"+c,b.onStepChanged),b.enableKeyNavigation&&a.bind(\\\"keyup\\\"+c,z),a.find(\\\".actions a\\\").bind(\\\"click\\\"+c,C)}function H(a,b,c,d){return 0>d||d>=c.stepCount||c.currentIndex===d?!1:(I(a,d),c.currentIndex>d&&(c.currentIndex--,O(a,b,c)),c.stepCount--,l(a,d).remove(),k(a,d).remove(),j(a,d).parent().remove(),0===d&&a.find(\\\".steps li\\\").first().addClass(\\\"first\\\"),d===c.stepCount&&a.find(\\\".steps li\\\").eq(d).addClass(\\\"last\\\"),F(a,b,c,d),D(a,b,c),!0)}function I(a,b){o(a).splice(b,1)}function J(b,c,d){var e='<{0} class=\\\"{1}\\\">{2}</{0}>',f=r(_,c.stepsOrientation),g=f===_.vertical?\\\" vertical\\\":\\\"\\\",h=a(e.format(c.contentContainerTag,\\\"content \\\"+c.clearFixCssClass,b.html())),i=a(e.format(c.stepsContainerTag,\\\"steps \\\"+c.clearFixCssClass,'<ul role=\\\"tablist\\\"></ul>')),j=h.children(c.headerTag),k=h.children(c.bodyTag);b.attr(\\\"role\\\",\\\"application\\\").empty().append(i).append(h).addClass(c.cssClass+\\\" \\\"+c.clearFixCssClass+g),k.each(function(c){K(b,d,a(this),c)}),j.each(function(e){N(b,c,d,a(this),e)}),E(b,c,d),L(b,c,d)}function K(a,b,c,d){var e=q(a),f=e+W+d,g=e+X+d;c._id(f).attr(\\\"role\\\",\\\"tabpanel\\\")._aria(\\\"labelledby\\\",g).addClass(\\\"body\\\")._showAria(b.currentIndex===d)}function L(a,b,c){if(b.enablePagination){var d='<{0} class=\\\"actions {1}\\\"><ul role=\\\"menu\\\" aria-label=\\\"{2}\\\">{3}</ul></{0}>',e='<li><a href=\\\"#{0}\\\" role=\\\"menuitem\\\">{1}</a></li>',f=\\\"\\\";b.forceMoveForward||(f+=e.format(\\\"previous\\\",b.labels.previous)),f+=e.format(\\\"next\\\",b.labels.next),b.enableFinishButton&&(f+=e.format(\\\"finish\\\",b.labels.finish)),b.enableCancelButton&&(f+=e.format(\\\"cancel\\\",b.labels.cancel)),a.append(d.format(b.actionContainerTag,b.clearFixCssClass,b.labels.pagination,f)),D(a,b,c),A(a,b,c)}}function M(a,c){for(var d=a.match(/#([a-z]*)#/gi),e=0;e<d.length;e++){var f=d[e],g=f.substring(1,f.length-1);c[g]===b&&R(\\\"The key '{0}' does not exist in the substitute collection!\\\",g),a=a.replace(f,c[g])}return a}function N(b,c,d,e,f){var g=q(b),h=g+V+f,j=g+W+f,k=g+X+f,l=b.find(\\\".steps > ul\\\"),m=M(c.titleTemplate,{index:f+1,title:e.html()}),n=a('<li role=\\\"tab\\\"><a id=\\\"'+h+'\\\" href=\\\"#'+k+'\\\" aria-controls=\\\"'+j+'\\\">'+m+\\\"</a></li>\\\");n._enableAria(c.enableAllSteps||d.currentIndex>f),d.currentIndex>f&&n.addClass(\\\"done\\\"),e._id(k).attr(\\\"tabindex\\\",\\\"-1\\\").addClass(\\\"title\\\"),0===f?l.prepend(n):l.find(\\\"li\\\").eq(f-1).after(n),0===f&&l.find(\\\"li\\\").removeClass(\\\"first\\\").eq(f).addClass(\\\"first\\\"),f===d.stepCount-1&&l.find(\\\"li\\\").removeClass(\\\"last\\\").eq(f).addClass(\\\"last\\\"),n.children(\\\"a\\\").bind(\\\"click\\\"+i(b),Q)}function O(b,c,d){c.saveState&&a.cookie&&a.cookie(U+q(b),d.currentIndex)}function P(b,c,d,e,f){var g=b.find(\\\".content > .body\\\"),h=r(ab,c.transitionEffect),i=c.transitionEffectSpeed,j=g.eq(e),k=g.eq(f);switch(h){case ab.fade:case ab.slide:var l=h===ab.fade?\\\"fadeOut\\\":\\\"slideUp\\\",m=h===ab.fade?\\\"fadeIn\\\":\\\"slideDown\\\";d.transitionElement=j,k[l](i,function(){var b=a(this)._showAria(!1).parent().parent(),c=n(b);c.transitionElement&&(c.transitionElement[m](i,function(){a(this)._showAria()}),c.transitionElement=null)}).promise();break;case ab.slideLeft:var o=k.outerWidth(!0),p=e>f?-o:o,q=e>f?o:-o;k.animate({left:p},i,function(){a(this)._showAria(!1)}).promise(),j.css(\\\"left\\\",q+\\\"px\\\")._showAria().animate({left:0},i).promise();break;default:k._showAria(!1),j._showAria()}}function Q(b){b.preventDefault();var c=a(this),d=c.parent().parent().parent().parent(),e=m(d),f=n(d),g=f.currentIndex;if(c.parent().is(\\\":not(.disabled):not(.current)\\\")){var h=c.attr(\\\"href\\\"),i=parseInt(h.substring(h.lastIndexOf(\\\"-\\\")+1),0);u(d,e,f,i)}return g===f.currentIndex?(j(d,g).focus(),!1):void 0}function R(a){throw arguments.length>1&&(a=a.format(Array.prototype.slice.call(arguments,1))),new Error(a)}function S(a,b){null==b&&R(\\\"The argument '{0}' is null or undefined.\\\",a)}a.fn.extend({_aria:function(a,b){return this.attr(\\\"aria-\\\"+a,b)},_removeAria:function(a){return this.removeAttr(\\\"aria-\\\"+a)},_enableAria:function(a){return null==a||a?this.removeClass(\\\"disabled\\\")._aria(\\\"disabled\\\",\\\"false\\\"):this.addClass(\\\"disabled\\\")._aria(\\\"disabled\\\",\\\"true\\\")},_showAria:function(a){return null==a||a?this.show()._aria(\\\"hidden\\\",\\\"false\\\"):this.hide()._aria(\\\"hidden\\\",\\\"true\\\")},_selectAria:function(a){return null==a||a?this.addClass(\\\"current\\\")._aria(\\\"selected\\\",\\\"true\\\"):this.removeClass(\\\"current\\\")._aria(\\\"selected\\\",\\\"false\\\")},_id:function(a){return a?this.attr(\\\"id\\\",a):this.attr(\\\"id\\\")}}),String.prototype.format||(String.prototype.format=function(){for(var b=1===arguments.length&&a.isArray(arguments[0])?arguments[0]:arguments,c=this,d=0;d<b.length;d++){var e=new RegExp(\\\"\\\\\\\\{\\\"+d+\\\"\\\\\\\\}\\\",\\\"gm\\\");c=c.replace(e,b[d])}return c});var T=0,U=\\\"jQu3ry_5teps_St@te_\\\",V=\\\"-t-\\\",W=\\\"-p-\\\",X=\\\"-h-\\\",Y=\\\"Index out of range.\\\",Z=\\\"One or more corresponding step {0} are missing.\\\";a.fn.steps=function(b){return a.fn.steps[b]?a.fn.steps[b].apply(this,Array.prototype.slice.call(arguments,1)):\\\"object\\\"!=typeof b&&b?void a.error(\\\"Method \\\"+b+\\\" does not exist on jQuery.steps\\\"):w.apply(this,arguments)},a.fn.steps.add=function(a){var b=n(this);return x(this,m(this),b,b.stepCount,a)},a.fn.steps.destroy=function(){return g(this,m(this))},a.fn.steps.finish=function(){h(this,n(this))},a.fn.steps.getCurrentIndex=function(){return n(this).currentIndex},a.fn.steps.getCurrentStep=function(){return p(this,n(this).currentIndex)},a.fn.steps.getStep=function(a){return p(this,a)},a.fn.steps.insert=function(a,b){return x(this,m(this),n(this),a,b)},a.fn.steps.next=function(){return s(this,m(this),n(this))},a.fn.steps.previous=function(){return t(this,m(this),n(this))},a.fn.steps.remove=function(a){return H(this,m(this),n(this),a)},a.fn.steps.setStep=function(){throw new Error(\\\"Not yet implemented!\\\")},a.fn.steps.skip=function(){throw new Error(\\\"Not yet implemented!\\\")};var $=a.fn.steps.contentMode={html:0,iframe:1,async:2},_=a.fn.steps.stepsOrientation={horizontal:0,vertical:1},ab=a.fn.steps.transitionEffect={none:0,fade:1,slide:2,slideLeft:3},bb=a.fn.steps.stepModel={title:\\\"\\\",content:\\\"\\\",contentUrl:\\\"\\\",contentMode:$.html,contentLoaded:!1},cb=a.fn.steps.defaults={headerTag:\\\"h1\\\",bodyTag:\\\"div\\\",contentContainerTag:\\\"div\\\",actionContainerTag:\\\"div\\\",stepsContainerTag:\\\"div\\\",cssClass:\\\"wizard\\\",clearFixCssClass:\\\"clearfix\\\",stepsOrientation:_.horizontal,titleTemplate:'<span class=\\\"number\\\">#index#.</span> #title#',loadingTemplate:'<span class=\\\"spinner\\\"></span> #text#',autoFocus:!1,enableAllSteps:!1,enableKeyNavigation:!0,enablePagination:!0,suppressPaginationOnFocus:!0,enableContentCache:!0,enableCancelButton:!0,enableFinishButton:!0,preloadContent:!1,showFinishButtonAlways:!1,forceMoveForward:!1,saveState:!1,startIndex:0,transitionEffect:ab.none,transitionEffectSpeed:200,onStepChanging:function(){return!0},onStepChanged:function(){},onCanceled:function(){},onFinishing:function(){return!0},onFinished:function(){},labels:{cancel:\\\"Cancel\\\",current:\\\"current step:\\\",pagination:\\\"Pagination\\\",finish:\\\"Finish\\\",next:\\\"Next\\\",previous:\\\"Previous\\\",loading:\\\"Loading ...\\\"}}}(jQuery);\"\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/raw-loader!./src/assets/inspinia/plugins/staps/jquery.steps.min.js\n// module id = 2198\n// module chunks = 1","require(\"!!/opt/atlassian/pipelines/agent/build/node_modules/script-loader/addScript.js\")(require(\"!!/opt/atlassian/pipelines/agent/build/node_modules/raw-loader/index.js!/opt/atlassian/pipelines/agent/build/src/assets/inspinia/plugins/slimscroll/jquery.slimscroll.min.js\"))\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/script-loader!./src/assets/inspinia/plugins/slimscroll/jquery.slimscroll.min.js\n// module id = 2199\n// module chunks = 1","module.exports = \"/*! Copyright (c) 2011 Piotr Rochala (http://rocha.la)\\n * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)\\n * and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.\\n *\\n * Version: 1.3.6\\n *\\n */\\n(function(e){e.fn.extend({slimScroll:function(g){var a=e.extend({width:\\\"auto\\\",height:\\\"250px\\\",size:\\\"7px\\\",color:\\\"#000\\\",position:\\\"right\\\",distance:\\\"1px\\\",start:\\\"top\\\",opacity:.4,alwaysVisible:!1,disableFadeOut:!1,railVisible:!1,railColor:\\\"#333\\\",railOpacity:.2,railDraggable:!0,railClass:\\\"slimScrollRail\\\",barClass:\\\"slimScrollBar\\\",wrapperClass:\\\"slimScrollDiv\\\",allowPageScroll:!1,wheelStep:20,touchScrollStep:200,borderRadius:\\\"7px\\\",railBorderRadius:\\\"7px\\\"},g);this.each(function(){function v(d){if(r){d=d||window.event;\\n var c=0;d.wheelDelta&&(c=-d.wheelDelta/120);d.detail&&(c=d.detail/3);e(d.target||d.srcTarget||d.srcElement).closest(\\\".\\\"+a.wrapperClass).is(b.parent())&&m(c,!0);d.preventDefault&&!k&&d.preventDefault();k||(d.returnValue=!1)}}function m(d,e,g){k=!1;var f=d,h=b.outerHeight()-c.outerHeight();e&&(f=parseInt(c.css(\\\"top\\\"))+d*parseInt(a.wheelStep)/100*c.outerHeight(),f=Math.min(Math.max(f,0),h),f=0<d?Math.ceil(f):Math.floor(f),c.css({top:f+\\\"px\\\"}));l=parseInt(c.css(\\\"top\\\"))/(b.outerHeight()-c.outerHeight());\\n f=l*(b[0].scrollHeight-b.outerHeight());g&&(f=d,d=f/b[0].scrollHeight*b.outerHeight(),d=Math.min(Math.max(d,0),h),c.css({top:d+\\\"px\\\"}));b.scrollTop(f);b.trigger(\\\"slimscrolling\\\",~~f);w();p()}function x(){u=Math.max(b.outerHeight()/b[0].scrollHeight*b.outerHeight(),30);c.css({height:u+\\\"px\\\"});var a=u==b.outerHeight()?\\\"none\\\":\\\"block\\\";c.css({display:a})}function w(){x();clearTimeout(B);l==~~l?(k=a.allowPageScroll,C!=l&&b.trigger(\\\"slimscroll\\\",0==~~l?\\\"top\\\":\\\"bottom\\\")):k=!1;C=l;u>=b.outerHeight()?k=!0:(c.stop(!0,\\n !0).fadeIn(\\\"fast\\\"),a.railVisible&&h.stop(!0,!0).fadeIn(\\\"fast\\\"))}function p(){a.alwaysVisible||(B=setTimeout(function(){a.disableFadeOut&&r||y||z||(c.fadeOut(\\\"slow\\\"),h.fadeOut(\\\"slow\\\"))},1E3))}var r,y,z,B,A,u,l,C,k=!1,b=e(this);if(b.parent().hasClass(a.wrapperClass)){var n=b.scrollTop(),c=b.closest(\\\".\\\"+a.barClass),h=b.closest(\\\".\\\"+a.railClass);x();if(e.isPlainObject(g)){if(\\\"height\\\"in g&&\\\"auto\\\"==g.height){b.parent().css(\\\"height\\\",\\\"auto\\\");b.css(\\\"height\\\",\\\"auto\\\");var q=b.parent().parent().height();b.parent().css(\\\"height\\\",\\n q);b.css(\\\"height\\\",q)}if(\\\"scrollTo\\\"in g)n=parseInt(a.scrollTo);else if(\\\"scrollBy\\\"in g)n+=parseInt(a.scrollBy);else if(\\\"destroy\\\"in g){c.remove();h.remove();b.unwrap();return}m(n,!1,!0)}}else if(!(e.isPlainObject(g)&&\\\"destroy\\\"in g)){a.height=\\\"auto\\\"==a.height?b.parent().height():a.height;n=e(\\\"<div></div>\\\").addClass(a.wrapperClass).css({position:\\\"relative\\\",overflow:\\\"hidden\\\",width:a.width,height:a.height});b.css({overflow:\\\"hidden\\\",width:a.width,height:a.height});var h=e(\\\"<div></div>\\\").addClass(a.railClass).css({width:a.size,\\n height:\\\"100%\\\",position:\\\"absolute\\\",top:0,display:a.alwaysVisible&&a.railVisible?\\\"block\\\":\\\"none\\\",\\\"border-radius\\\":a.railBorderRadius,background:a.railColor,opacity:a.railOpacity,zIndex:90}),c=e(\\\"<div></div>\\\").addClass(a.barClass).css({background:a.color,width:a.size,position:\\\"absolute\\\",top:0,opacity:a.opacity,display:a.alwaysVisible?\\\"block\\\":\\\"none\\\",\\\"border-radius\\\":a.borderRadius,BorderRadius:a.borderRadius,MozBorderRadius:a.borderRadius,WebkitBorderRadius:a.borderRadius,zIndex:99}),q=\\\"right\\\"==a.position?\\n{right:a.distance}:{left:a.distance};h.css(q);c.css(q);b.wrap(n);b.parent().append(c);b.parent().append(h);a.railDraggable&&c.bind(\\\"mousedown\\\",function(a){var b=e(document);z=!0;t=parseFloat(c.css(\\\"top\\\"));pageY=a.pageY;b.bind(\\\"mousemove.slimscroll\\\",function(a){currTop=t+a.pageY-pageY;c.css(\\\"top\\\",currTop);m(0,c.position().top,!1)});b.bind(\\\"mouseup.slimscroll\\\",function(a){z=!1;p();b.unbind(\\\".slimscroll\\\")});return!1}).bind(\\\"selectstart.slimscroll\\\",function(a){a.stopPropagation();a.preventDefault();return!1});\\n h.hover(function(){w()},function(){p()});c.hover(function(){y=!0},function(){y=!1});b.hover(function(){r=!0;w();p()},function(){r=!1;p()});b.bind(\\\"touchstart\\\",function(a,b){a.originalEvent.touches.length&&(A=a.originalEvent.touches[0].pageY)});b.bind(\\\"touchmove\\\",function(b){k||b.originalEvent.preventDefault();b.originalEvent.touches.length&&(m((A-b.originalEvent.touches[0].pageY)/a.touchScrollStep,!0),A=b.originalEvent.touches[0].pageY)});x();\\\"bottom\\\"===a.start?(c.css({top:b.outerHeight()-c.outerHeight()}),\\n m(0,!0)):\\\"top\\\"!==a.start&&(m(e(a.start).position().top,null,!0),a.alwaysVisible||c.hide());window.addEventListener?(this.addEventListener(\\\"DOMMouseScroll\\\",v,!1),this.addEventListener(\\\"mousewheel\\\",v,!1)):document.attachEvent(\\\"onmousewheel\\\",v)}});return this}});e.fn.extend({slimscroll:e.fn.slimScroll})})(jQuery);\"\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/raw-loader!./src/assets/inspinia/plugins/slimscroll/jquery.slimscroll.min.js\n// module id = 2200\n// module chunks = 1","require(\"!!/opt/atlassian/pipelines/agent/build/node_modules/script-loader/addScript.js\")(require(\"!!/opt/atlassian/pipelines/agent/build/node_modules/raw-loader/index.js!/opt/atlassian/pipelines/agent/build/src/assets/inspinia/plugins/pace/pace.min.js\"))\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/script-loader!./src/assets/inspinia/plugins/pace/pace.min.js\n// module id = 2201\n// module chunks = 1","module.exports = \"/*! pace 1.0.0 */\\n(function(){var a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X=[].slice,Y={}.hasOwnProperty,Z=function(a,b){function c(){this.constructor=a}for(var d in b)Y.call(b,d)&&(a[d]=b[d]);return c.prototype=b.prototype,a.prototype=new c,a.__super__=b.prototype,a},$=[].indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(b in this&&this[b]===a)return b;return-1};for(u={catchupTime:100,initialRate:.03,minTime:250,ghostTime:100,maxProgressPerFrame:20,easeFactor:1.25,startOnPageLoad:!0,restartOnPushState:!0,restartOnRequestAfter:500,target:\\\"body\\\",elements:{checkInterval:100,selectors:[\\\"body\\\"]},eventLag:{minSamples:10,sampleCount:3,lagThreshold:3},ajax:{trackMethods:[\\\"GET\\\"],trackWebSockets:!0,ignoreURLs:[]}},C=function(){var a;return null!=(a=\\\"undefined\\\"!=typeof performance&&null!==performance&&\\\"function\\\"==typeof performance.now?performance.now():void 0)?a:+new Date},E=window.requestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||window.msRequestAnimationFrame,t=window.cancelAnimationFrame||window.mozCancelAnimationFrame,null==E&&(E=function(a){return setTimeout(a,50)},t=function(a){return clearTimeout(a)}),G=function(a){var b,c;return b=C(),(c=function(){var d;return d=C()-b,d>=33?(b=C(),a(d,function(){return E(c)})):setTimeout(c,33-d)})()},F=function(){var a,b,c;return c=arguments[0],b=arguments[1],a=3<=arguments.length?X.call(arguments,2):[],\\\"function\\\"==typeof c[b]?c[b].apply(c,a):c[b]},v=function(){var a,b,c,d,e,f,g;for(b=arguments[0],d=2<=arguments.length?X.call(arguments,1):[],f=0,g=d.length;g>f;f++)if(c=d[f])for(a in c)Y.call(c,a)&&(e=c[a],null!=b[a]&&\\\"object\\\"==typeof b[a]&&null!=e&&\\\"object\\\"==typeof e?v(b[a],e):b[a]=e);return b},q=function(a){var b,c,d,e,f;for(c=b=0,e=0,f=a.length;f>e;e++)d=a[e],c+=Math.abs(d),b++;return c/b},x=function(a,b){var c,d,e;if(null==a&&(a=\\\"options\\\"),null==b&&(b=!0),e=document.querySelector(\\\"[data-pace-\\\"+a+\\\"]\\\")){if(c=e.getAttribute(\\\"data-pace-\\\"+a),!b)return c;try{return JSON.parse(c)}catch(f){return d=f,\\\"undefined\\\"!=typeof console&&null!==console?console.error(\\\"Error parsing inline pace options\\\",d):void 0}}},g=function(){function a(){}return a.prototype.on=function(a,b,c,d){var e;return null==d&&(d=!1),null==this.bindings&&(this.bindings={}),null==(e=this.bindings)[a]&&(e[a]=[]),this.bindings[a].push({handler:b,ctx:c,once:d})},a.prototype.once=function(a,b,c){return this.on(a,b,c,!0)},a.prototype.off=function(a,b){var c,d,e;if(null!=(null!=(d=this.bindings)?d[a]:void 0)){if(null==b)return delete this.bindings[a];for(c=0,e=[];c<this.bindings[a].length;)e.push(this.bindings[a][c].handler===b?this.bindings[a].splice(c,1):c++);return e}},a.prototype.trigger=function(){var a,b,c,d,e,f,g,h,i;if(c=arguments[0],a=2<=arguments.length?X.call(arguments,1):[],null!=(g=this.bindings)?g[c]:void 0){for(e=0,i=[];e<this.bindings[c].length;)h=this.bindings[c][e],d=h.handler,b=h.ctx,f=h.once,d.apply(null!=b?b:this,a),i.push(f?this.bindings[c].splice(e,1):e++);return i}},a}(),j=window.Pace||{},window.Pace=j,v(j,g.prototype),D=j.options=v({},u,window.paceOptions,x()),U=[\\\"ajax\\\",\\\"document\\\",\\\"eventLag\\\",\\\"elements\\\"],Q=0,S=U.length;S>Q;Q++)K=U[Q],D[K]===!0&&(D[K]=u[K]);i=function(a){function b(){return V=b.__super__.constructor.apply(this,arguments)}return Z(b,a),b}(Error),b=function(){function a(){this.progress=0}return a.prototype.getElement=function(){var a;if(null==this.el){if(a=document.querySelector(D.target),!a)throw new i;this.el=document.createElement(\\\"div\\\"),this.el.className=\\\"pace pace-active\\\",document.body.className=document.body.className.replace(/pace-done/g,\\\"\\\"),document.body.className+=\\\" pace-running\\\",this.el.innerHTML='<div class=\\\"pace-progress\\\">\\\\n <div class=\\\"pace-progress-inner\\\"></div>\\\\n</div>\\\\n<div class=\\\"pace-activity\\\"></div>',null!=a.firstChild?a.insertBefore(this.el,a.firstChild):a.appendChild(this.el)}return this.el},a.prototype.finish=function(){var a;return a=this.getElement(),a.className=a.className.replace(\\\"pace-active\\\",\\\"\\\"),a.className+=\\\" pace-inactive\\\",document.body.className=document.body.className.replace(\\\"pace-running\\\",\\\"\\\"),document.body.className+=\\\" pace-done\\\"},a.prototype.update=function(a){return this.progress=a,this.render()},a.prototype.destroy=function(){try{this.getElement().parentNode.removeChild(this.getElement())}catch(a){i=a}return this.el=void 0},a.prototype.render=function(){var a,b,c,d,e,f,g;if(null==document.querySelector(D.target))return!1;for(a=this.getElement(),d=\\\"translate3d(\\\"+this.progress+\\\"%, 0, 0)\\\",g=[\\\"webkitTransform\\\",\\\"msTransform\\\",\\\"transform\\\"],e=0,f=g.length;f>e;e++)b=g[e],a.children[0].style[b]=d;return(!this.lastRenderedProgress||this.lastRenderedProgress|0!==this.progress|0)&&(a.children[0].setAttribute(\\\"data-progress-text\\\",\\\"\\\"+(0|this.progress)+\\\"%\\\"),this.progress>=100?c=\\\"99\\\":(c=this.progress<10?\\\"0\\\":\\\"\\\",c+=0|this.progress),a.children[0].setAttribute(\\\"data-progress\\\",\\\"\\\"+c)),this.lastRenderedProgress=this.progress},a.prototype.done=function(){return this.progress>=100},a}(),h=function(){function a(){this.bindings={}}return a.prototype.trigger=function(a,b){var c,d,e,f,g;if(null!=this.bindings[a]){for(f=this.bindings[a],g=[],d=0,e=f.length;e>d;d++)c=f[d],g.push(c.call(this,b));return g}},a.prototype.on=function(a,b){var c;return null==(c=this.bindings)[a]&&(c[a]=[]),this.bindings[a].push(b)},a}(),P=window.XMLHttpRequest,O=window.XDomainRequest,N=window.WebSocket,w=function(a,b){var c,d,e,f;f=[];for(d in b.prototype)try{e=b.prototype[d],f.push(null==a[d]&&\\\"function\\\"!=typeof e?a[d]=e:void 0)}catch(g){c=g}return f},A=[],j.ignore=function(){var a,b,c;return b=arguments[0],a=2<=arguments.length?X.call(arguments,1):[],A.unshift(\\\"ignore\\\"),c=b.apply(null,a),A.shift(),c},j.track=function(){var a,b,c;return b=arguments[0],a=2<=arguments.length?X.call(arguments,1):[],A.unshift(\\\"track\\\"),c=b.apply(null,a),A.shift(),c},J=function(a){var b;if(null==a&&(a=\\\"GET\\\"),\\\"track\\\"===A[0])return\\\"force\\\";if(!A.length&&D.ajax){if(\\\"socket\\\"===a&&D.ajax.trackWebSockets)return!0;if(b=a.toUpperCase(),$.call(D.ajax.trackMethods,b)>=0)return!0}return!1},k=function(a){function b(){var a,c=this;b.__super__.constructor.apply(this,arguments),a=function(a){var b;return b=a.open,a.open=function(d,e){return J(d)&&c.trigger(\\\"request\\\",{type:d,url:e,request:a}),b.apply(a,arguments)}},window.XMLHttpRequest=function(b){var c;return c=new P(b),a(c),c};try{w(window.XMLHttpRequest,P)}catch(d){}if(null!=O){window.XDomainRequest=function(){var b;return b=new O,a(b),b};try{w(window.XDomainRequest,O)}catch(d){}}if(null!=N&&D.ajax.trackWebSockets){window.WebSocket=function(a,b){var d;return d=null!=b?new N(a,b):new N(a),J(\\\"socket\\\")&&c.trigger(\\\"request\\\",{type:\\\"socket\\\",url:a,protocols:b,request:d}),d};try{w(window.WebSocket,N)}catch(d){}}}return Z(b,a),b}(h),R=null,y=function(){return null==R&&(R=new k),R},I=function(a){var b,c,d,e;for(e=D.ajax.ignoreURLs,c=0,d=e.length;d>c;c++)if(b=e[c],\\\"string\\\"==typeof b){if(-1!==a.indexOf(b))return!0}else if(b.test(a))return!0;return!1},y().on(\\\"request\\\",function(b){var c,d,e,f,g;return f=b.type,e=b.request,g=b.url,I(g)?void 0:j.running||D.restartOnRequestAfter===!1&&\\\"force\\\"!==J(f)?void 0:(d=arguments,c=D.restartOnRequestAfter||0,\\\"boolean\\\"==typeof c&&(c=0),setTimeout(function(){var b,c,g,h,i,k;if(b=\\\"socket\\\"===f?e.readyState<2:0<(h=e.readyState)&&4>h){for(j.restart(),i=j.sources,k=[],c=0,g=i.length;g>c;c++){if(K=i[c],K instanceof a){K.watch.apply(K,d);break}k.push(void 0)}return k}},c))}),a=function(){function a(){var a=this;this.elements=[],y().on(\\\"request\\\",function(){return a.watch.apply(a,arguments)})}return a.prototype.watch=function(a){var b,c,d,e;return d=a.type,b=a.request,e=a.url,I(e)?void 0:(c=\\\"socket\\\"===d?new n(b):new o(b),this.elements.push(c))},a}(),o=function(){function a(a){var b,c,d,e,f,g,h=this;if(this.progress=0,null!=window.ProgressEvent)for(c=null,a.addEventListener(\\\"progress\\\",function(a){return h.progress=a.lengthComputable?100*a.loaded/a.total:h.progress+(100-h.progress)/2},!1),g=[\\\"load\\\",\\\"abort\\\",\\\"timeout\\\",\\\"error\\\"],d=0,e=g.length;e>d;d++)b=g[d],a.addEventListener(b,function(){return h.progress=100},!1);else f=a.onreadystatechange,a.onreadystatechange=function(){var b;return 0===(b=a.readyState)||4===b?h.progress=100:3===a.readyState&&(h.progress=50),\\\"function\\\"==typeof f?f.apply(null,arguments):void 0}}return a}(),n=function(){function a(a){var b,c,d,e,f=this;for(this.progress=0,e=[\\\"error\\\",\\\"open\\\"],c=0,d=e.length;d>c;c++)b=e[c],a.addEventListener(b,function(){return f.progress=100},!1)}return a}(),d=function(){function a(a){var b,c,d,f;for(null==a&&(a={}),this.elements=[],null==a.selectors&&(a.selectors=[]),f=a.selectors,c=0,d=f.length;d>c;c++)b=f[c],this.elements.push(new e(b))}return a}(),e=function(){function a(a){this.selector=a,this.progress=0,this.check()}return a.prototype.check=function(){var a=this;return document.querySelector(this.selector)?this.done():setTimeout(function(){return a.check()},D.elements.checkInterval)},a.prototype.done=function(){return this.progress=100},a}(),c=function(){function a(){var a,b,c=this;this.progress=null!=(b=this.states[document.readyState])?b:100,a=document.onreadystatechange,document.onreadystatechange=function(){return null!=c.states[document.readyState]&&(c.progress=c.states[document.readyState]),\\\"function\\\"==typeof a?a.apply(null,arguments):void 0}}return a.prototype.states={loading:0,interactive:50,complete:100},a}(),f=function(){function a(){var a,b,c,d,e,f=this;this.progress=0,a=0,e=[],d=0,c=C(),b=setInterval(function(){var g;return g=C()-c-50,c=C(),e.push(g),e.length>D.eventLag.sampleCount&&e.shift(),a=q(e),++d>=D.eventLag.minSamples&&a<D.eventLag.lagThreshold?(f.progress=100,clearInterval(b)):f.progress=100*(3/(a+3))},50)}return a}(),m=function(){function a(a){this.source=a,this.last=this.sinceLastUpdate=0,this.rate=D.initialRate,this.catchup=0,this.progress=this.lastProgress=0,null!=this.source&&(this.progress=F(this.source,\\\"progress\\\"))}return a.prototype.tick=function(a,b){var c;return null==b&&(b=F(this.source,\\\"progress\\\")),b>=100&&(this.done=!0),b===this.last?this.sinceLastUpdate+=a:(this.sinceLastUpdate&&(this.rate=(b-this.last)/this.sinceLastUpdate),this.catchup=(b-this.progress)/D.catchupTime,this.sinceLastUpdate=0,this.last=b),b>this.progress&&(this.progress+=this.catchup*a),c=1-Math.pow(this.progress/100,D.easeFactor),this.progress+=c*this.rate*a,this.progress=Math.min(this.lastProgress+D.maxProgressPerFrame,this.progress),this.progress=Math.max(0,this.progress),this.progress=Math.min(100,this.progress),this.lastProgress=this.progress,this.progress},a}(),L=null,H=null,r=null,M=null,p=null,s=null,j.running=!1,z=function(){return D.restartOnPushState?j.restart():void 0},null!=window.history.pushState&&(T=window.history.pushState,window.history.pushState=function(){return z(),T.apply(window.history,arguments)}),null!=window.history.replaceState&&(W=window.history.replaceState,window.history.replaceState=function(){return z(),W.apply(window.history,arguments)}),l={ajax:a,elements:d,document:c,eventLag:f},(B=function(){var a,c,d,e,f,g,h,i;for(j.sources=L=[],g=[\\\"ajax\\\",\\\"elements\\\",\\\"document\\\",\\\"eventLag\\\"],c=0,e=g.length;e>c;c++)a=g[c],D[a]!==!1&&L.push(new l[a](D[a]));for(i=null!=(h=D.extraSources)?h:[],d=0,f=i.length;f>d;d++)K=i[d],L.push(new K(D));return j.bar=r=new b,H=[],M=new m})(),j.stop=function(){return j.trigger(\\\"stop\\\"),j.running=!1,r.destroy(),s=!0,null!=p&&(\\\"function\\\"==typeof t&&t(p),p=null),B()},j.restart=function(){return j.trigger(\\\"restart\\\"),j.stop(),j.start()},j.go=function(){var a;return j.running=!0,r.render(),a=C(),s=!1,p=G(function(b,c){var d,e,f,g,h,i,k,l,n,o,p,q,t,u,v,w;for(l=100-r.progress,e=p=0,f=!0,i=q=0,u=L.length;u>q;i=++q)for(K=L[i],o=null!=H[i]?H[i]:H[i]=[],h=null!=(w=K.elements)?w:[K],k=t=0,v=h.length;v>t;k=++t)g=h[k],n=null!=o[k]?o[k]:o[k]=new m(g),f&=n.done,n.done||(e++,p+=n.tick(b));return d=p/e,r.update(M.tick(b,d)),r.done()||f||s?(r.update(100),j.trigger(\\\"done\\\"),setTimeout(function(){return r.finish(),j.running=!1,j.trigger(\\\"hide\\\")},Math.max(D.ghostTime,Math.max(D.minTime-(C()-a),0)))):c()})},j.start=function(a){v(D,a),j.running=!0;try{r.render()}catch(b){i=b}return document.querySelector(\\\".pace\\\")?(j.trigger(\\\"start\\\"),j.go()):setTimeout(j.start,50)},\\\"function\\\"==typeof define&&define.amd?define(function(){return j}):\\\"object\\\"==typeof exports?module.exports=j:D.startOnPageLoad&&j.start()}).call(this);\"\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/raw-loader!./src/assets/inspinia/plugins/pace/pace.min.js\n// module id = 2202\n// module chunks = 1","require(\"!!/opt/atlassian/pipelines/agent/build/node_modules/script-loader/addScript.js\")(require(\"!!/opt/atlassian/pipelines/agent/build/node_modules/raw-loader/index.js!/opt/atlassian/pipelines/agent/build/src/assets/inspinia/plugins/angular-bootstrap-checkbox.js\"))\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/script-loader!./src/assets/inspinia/plugins/angular-bootstrap-checkbox.js\n// module id = 2203\n// module chunks = 1","module.exports = \"\\\"use strict\\\";\\r\\n\\r\\nangular.module(\\\"ui.checkbox\\\", []).directive(\\\"checkbox\\\", function() {\\r\\n return {\\r\\n scope: {},\\r\\n require: \\\"ngModel\\\",\\r\\n restrict: \\\"E\\\",\\r\\n replace: \\\"true\\\",\\r\\n template: \\\"<button type=\\\\\\\"button\\\\\\\" ng-style=\\\\\\\"stylebtn\\\\\\\" class=\\\\\\\"btn btn-white\\\\\\\" ng-class=\\\\\\\"{'btn-xs': size==='default', 'btn-sm': size==='large', 'btn-lg': size==='largest'}\\\\\\\">\\\" +\\r\\n \\\"<span ng-style=\\\\\\\"styleicon\\\\\\\" class=\\\\\\\"glyphicon\\\\\\\" ng-class=\\\\\\\"{'fa fa-check': checked===true}\\\\\\\"></span>\\\" +\\r\\n \\\"</button>\\\",\\r\\n link: function(scope, elem, attrs, modelCtrl) {\\r\\n\\r\\n var label = elem.next('span');\\r\\n\\r\\n scope.size = \\\"default\\\";\\r\\n // Default Button Styling\\r\\n scope.stylebtn = {};\\r\\n // Default Checkmark Styling\\r\\n scope.styleicon = {\\\"width\\\": \\\"10px\\\", \\\"left\\\": \\\"-1px\\\"};\\r\\n // If size is undefined, Checkbox has normal size (Bootstrap 'xs')\\r\\n if(attrs.large !== undefined) {\\r\\n scope.size = \\\"large\\\";\\r\\n scope.stylebtn = {\\\"padding-top\\\": \\\"2px\\\", \\\"padding-bottom\\\": \\\"2px\\\", \\\"height\\\": \\\"30px\\\"};\\r\\n scope.styleicon = {\\\"width\\\": \\\"8px\\\", \\\"left\\\": \\\"-5px\\\", \\\"font-size\\\": \\\"17px\\\"};\\r\\n }\\r\\n if(attrs.larger !== undefined) {\\r\\n scope.size = \\\"larger\\\";\\r\\n scope.stylebtn = {\\\"padding-top\\\": \\\"2px\\\", \\\"padding-bottom\\\": \\\"2px\\\", \\\"height\\\": \\\"34px\\\"};\\r\\n scope.styleicon = {\\\"width\\\": \\\"8px\\\", \\\"left\\\": \\\"-8px\\\", \\\"font-size\\\": \\\"22px\\\"};\\r\\n }\\r\\n if(attrs.largest !== undefined) {\\r\\n scope.size = \\\"largest\\\";\\r\\n scope.stylebtn = {\\\"padding-top\\\": \\\"2px\\\", \\\"padding-bottom\\\": \\\"2px\\\", \\\"height\\\": \\\"45px\\\"};\\r\\n scope.styleicon = {\\\"width\\\": \\\"11px\\\", \\\"left\\\": \\\"-11px\\\", \\\"font-size\\\": \\\"30px\\\"};\\r\\n }\\r\\n\\r\\n var trueValue = true;\\r\\n var falseValue = false;\\r\\n\\r\\n // If defined set true value\\r\\n if(attrs.ngTrueValue !== undefined) {\\r\\n trueValue = attrs.ngTrueValue;\\r\\n\\r\\n }\\r\\n // If defined set false value\\r\\n if(attrs.ngFalseValue !== undefined) {\\r\\n falseValue = attrs.ngFalseValue;\\r\\n }\\r\\n\\r\\n // Check if name attribute is set and if so add it to the DOM element\\r\\n if(scope.name !== undefined) {\\r\\n elem.name = scope.name;\\r\\n }\\r\\n\\r\\n // Update element when model changes\\r\\n scope.$watch(function() {\\r\\n if(modelCtrl.$modelValue === trueValue || modelCtrl.$modelValue === true) {\\r\\n modelCtrl.$setViewValue(trueValue);\\r\\n label.addClass('todo-completed');\\r\\n } else {\\r\\n modelCtrl.$setViewValue(falseValue);\\r\\n }\\r\\n return modelCtrl.$modelValue;\\r\\n }, function(newVal, oldVal) {\\r\\n scope.checked = modelCtrl.$modelValue === trueValue;\\r\\n }, true);\\r\\n\\r\\n // On click swap value and trigger onChange function\\r\\n elem.bind(\\\"click\\\", function() {\\r\\n\\r\\n scope.$apply(function() {\\r\\n if(modelCtrl.$modelValue === falseValue) {\\r\\n modelCtrl.$setViewValue(trueValue);\\r\\n label.toggleClass('todo-completed');\\r\\n } else {\\r\\n modelCtrl.$setViewValue(falseValue);\\r\\n label.toggleClass('todo-completed');\\r\\n }\\r\\n });\\r\\n });\\r\\n }\\r\\n };\\r\\n});\"\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/raw-loader!./src/assets/inspinia/plugins/angular-bootstrap-checkbox.js\n// module id = 2204\n// module chunks = 1","require(\"!!/opt/atlassian/pipelines/agent/build/node_modules/script-loader/addScript.js\")(require(\"!!/opt/atlassian/pipelines/agent/build/node_modules/raw-loader/index.js!/opt/atlassian/pipelines/agent/build/src/assets/inspinia/plugins/flot/jquery.flot.js\"))\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/script-loader!./src/assets/inspinia/plugins/flot/jquery.flot.js\n// module id = 2205\n// module chunks = 1","module.exports = \"/* Javascript plotting library for jQuery, version 0.8.3.\\n\\nCopyright (c) 2007-2014 IOLA and Ole Laursen.\\nLicensed under the MIT license.\\n\\n*/\\n\\n// first an inline dependency, jquery.colorhelpers.js, we inline it here\\n// for convenience\\n\\n/* Plugin for jQuery for working with colors.\\n *\\n * Version 1.1.\\n *\\n * Inspiration from jQuery color animation plugin by John Resig.\\n *\\n * Released under the MIT license by Ole Laursen, October 2009.\\n *\\n * Examples:\\n *\\n * $.color.parse(\\\"#fff\\\").scale('rgb', 0.25).add('a', -0.5).toString()\\n * var c = $.color.extract($(\\\"#mydiv\\\"), 'background-color');\\n * console.log(c.r, c.g, c.b, c.a);\\n * $.color.make(100, 50, 25, 0.4).toString() // returns \\\"rgba(100,50,25,0.4)\\\"\\n *\\n * Note that .scale() and .add() return the same modified object\\n * instead of making a new one.\\n *\\n * V. 1.1: Fix error handling so e.g. parsing an empty string does\\n * produce a color rather than just crashing.\\n */\\n(function($){$.color={};$.color.make=function(r,g,b,a){var o={};o.r=r||0;o.g=g||0;o.b=b||0;o.a=a!=null?a:1;o.add=function(c,d){for(var i=0;i<c.length;++i)o[c.charAt(i)]+=d;return o.normalize()};o.scale=function(c,f){for(var i=0;i<c.length;++i)o[c.charAt(i)]*=f;return o.normalize()};o.toString=function(){if(o.a>=1){return\\\"rgb(\\\"+[o.r,o.g,o.b].join(\\\",\\\")+\\\")\\\"}else{return\\\"rgba(\\\"+[o.r,o.g,o.b,o.a].join(\\\",\\\")+\\\")\\\"}};o.normalize=function(){function clamp(min,value,max){return value<min?min:value>max?max:value}o.r=clamp(0,parseInt(o.r),255);o.g=clamp(0,parseInt(o.g),255);o.b=clamp(0,parseInt(o.b),255);o.a=clamp(0,o.a,1);return o};o.clone=function(){return $.color.make(o.r,o.b,o.g,o.a)};return o.normalize()};$.color.extract=function(elem,css){var c;do{c=elem.css(css).toLowerCase();if(c!=\\\"\\\"&&c!=\\\"transparent\\\")break;elem=elem.parent()}while(elem.length&&!$.nodeName(elem.get(0),\\\"body\\\"));if(c==\\\"rgba(0, 0, 0, 0)\\\")c=\\\"transparent\\\";return $.color.parse(c)};$.color.parse=function(str){var res,m=$.color.make;if(res=/rgb\\\\(\\\\s*([0-9]{1,3})\\\\s*,\\\\s*([0-9]{1,3})\\\\s*,\\\\s*([0-9]{1,3})\\\\s*\\\\)/.exec(str))return m(parseInt(res[1],10),parseInt(res[2],10),parseInt(res[3],10));if(res=/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*\\\\)/.exec(str))return m(parseInt(res[1],10),parseInt(res[2],10),parseInt(res[3],10),parseFloat(res[4]));if(res=/rgb\\\\(\\\\s*([0-9]+(?:\\\\.[0-9]+)?)\\\\%\\\\s*,\\\\s*([0-9]+(?:\\\\.[0-9]+)?)\\\\%\\\\s*,\\\\s*([0-9]+(?:\\\\.[0-9]+)?)\\\\%\\\\s*\\\\)/.exec(str))return m(parseFloat(res[1])*2.55,parseFloat(res[2])*2.55,parseFloat(res[3])*2.55);if(res=/rgba\\\\(\\\\s*([0-9]+(?:\\\\.[0-9]+)?)\\\\%\\\\s*,\\\\s*([0-9]+(?:\\\\.[0-9]+)?)\\\\%\\\\s*,\\\\s*([0-9]+(?:\\\\.[0-9]+)?)\\\\%\\\\s*,\\\\s*([0-9]+(?:\\\\.[0-9]+)?)\\\\s*\\\\)/.exec(str))return m(parseFloat(res[1])*2.55,parseFloat(res[2])*2.55,parseFloat(res[3])*2.55,parseFloat(res[4]));if(res=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(str))return m(parseInt(res[1],16),parseInt(res[2],16),parseInt(res[3],16));if(res=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(str))return m(parseInt(res[1]+res[1],16),parseInt(res[2]+res[2],16),parseInt(res[3]+res[3],16));var name=$.trim(str).toLowerCase();if(name==\\\"transparent\\\")return m(255,255,255,0);else{res=lookupColors[name]||[0,0,0];return m(res[0],res[1],res[2])}};var lookupColors={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0,0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0]}})(jQuery);\\n\\n// the actual Flot code\\n(function($) {\\n\\n\\t// Cache the prototype hasOwnProperty for faster access\\n\\n\\tvar hasOwnProperty = Object.prototype.hasOwnProperty;\\n\\n // A shim to provide 'detach' to jQuery versions prior to 1.4. Using a DOM\\n // operation produces the same effect as detach, i.e. removing the element\\n // without touching its jQuery data.\\n\\n // Do not merge this into Flot 0.9, since it requires jQuery 1.4.4+.\\n\\n if (!$.fn.detach) {\\n $.fn.detach = function() {\\n return this.each(function() {\\n if (this.parentNode) {\\n this.parentNode.removeChild( this );\\n }\\n });\\n };\\n }\\n\\n\\t///////////////////////////////////////////////////////////////////////////\\n\\t// The Canvas object is a wrapper around an HTML5 <canvas> tag.\\n\\t//\\n\\t// @constructor\\n\\t// @param {string} cls List of classes to apply to the canvas.\\n\\t// @param {element} container Element onto which to append the canvas.\\n\\t//\\n\\t// Requiring a container is a little iffy, but unfortunately canvas\\n\\t// operations don't work unless the canvas is attached to the DOM.\\n\\n\\tfunction Canvas(cls, container) {\\n\\n\\t\\tvar element = container.children(\\\".\\\" + cls)[0];\\n\\n\\t\\tif (element == null) {\\n\\n\\t\\t\\telement = document.createElement(\\\"canvas\\\");\\n\\t\\t\\telement.className = cls;\\n\\n\\t\\t\\t$(element).css({ direction: \\\"ltr\\\", position: \\\"absolute\\\", left: 0, top: 0 })\\n\\t\\t\\t\\t.appendTo(container);\\n\\n\\t\\t\\t// If HTML5 Canvas isn't available, fall back to [Ex|Flash]canvas\\n\\n\\t\\t\\tif (!element.getContext) {\\n\\t\\t\\t\\tif (window.G_vmlCanvasManager) {\\n\\t\\t\\t\\t\\telement = window.G_vmlCanvasManager.initElement(element);\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\tthrow new Error(\\\"Canvas is not available. If you're using IE with a fall-back such as Excanvas, then there's either a mistake in your conditional include, or the page has no DOCTYPE and is rendering in Quirks Mode.\\\");\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\tthis.element = element;\\n\\n\\t\\tvar context = this.context = element.getContext(\\\"2d\\\");\\n\\n\\t\\t// Determine the screen's ratio of physical to device-independent\\n\\t\\t// pixels. This is the ratio between the canvas width that the browser\\n\\t\\t// advertises and the number of pixels actually present in that space.\\n\\n\\t\\t// The iPhone 4, for example, has a device-independent width of 320px,\\n\\t\\t// but its screen is actually 640px wide. It therefore has a pixel\\n\\t\\t// ratio of 2, while most normal devices have a ratio of 1.\\n\\n\\t\\tvar devicePixelRatio = window.devicePixelRatio || 1,\\n\\t\\t\\tbackingStoreRatio =\\n\\t\\t\\t\\tcontext.webkitBackingStorePixelRatio ||\\n\\t\\t\\t\\tcontext.mozBackingStorePixelRatio ||\\n\\t\\t\\t\\tcontext.msBackingStorePixelRatio ||\\n\\t\\t\\t\\tcontext.oBackingStorePixelRatio ||\\n\\t\\t\\t\\tcontext.backingStorePixelRatio || 1;\\n\\n\\t\\tthis.pixelRatio = devicePixelRatio / backingStoreRatio;\\n\\n\\t\\t// Size the canvas to match the internal dimensions of its container\\n\\n\\t\\tthis.resize(container.width(), container.height());\\n\\n\\t\\t// Collection of HTML div layers for text overlaid onto the canvas\\n\\n\\t\\tthis.textContainer = null;\\n\\t\\tthis.text = {};\\n\\n\\t\\t// Cache of text fragments and metrics, so we can avoid expensively\\n\\t\\t// re-calculating them when the plot is re-rendered in a loop.\\n\\n\\t\\tthis._textCache = {};\\n\\t}\\n\\n\\t// Resizes the canvas to the given dimensions.\\n\\t//\\n\\t// @param {number} width New width of the canvas, in pixels.\\n\\t// @param {number} width New height of the canvas, in pixels.\\n\\n\\tCanvas.prototype.resize = function(width, height) {\\n\\n\\t\\tif (width <= 0 || height <= 0) {\\n\\t\\t\\tthrow new Error(\\\"Invalid dimensions for plot, width = \\\" + width + \\\", height = \\\" + height);\\n\\t\\t}\\n\\n\\t\\tvar element = this.element,\\n\\t\\t\\tcontext = this.context,\\n\\t\\t\\tpixelRatio = this.pixelRatio;\\n\\n\\t\\t// Resize the canvas, increasing its density based on the display's\\n\\t\\t// pixel ratio; basically giving it more pixels without increasing the\\n\\t\\t// size of its element, to take advantage of the fact that retina\\n\\t\\t// displays have that many more pixels in the same advertised space.\\n\\n\\t\\t// Resizing should reset the state (excanvas seems to be buggy though)\\n\\n\\t\\tif (this.width != width) {\\n\\t\\t\\telement.width = width * pixelRatio;\\n\\t\\t\\telement.style.width = width + \\\"px\\\";\\n\\t\\t\\tthis.width = width;\\n\\t\\t}\\n\\n\\t\\tif (this.height != height) {\\n\\t\\t\\telement.height = height * pixelRatio;\\n\\t\\t\\telement.style.height = height + \\\"px\\\";\\n\\t\\t\\tthis.height = height;\\n\\t\\t}\\n\\n\\t\\t// Save the context, so we can reset in case we get replotted. The\\n\\t\\t// restore ensure that we're really back at the initial state, and\\n\\t\\t// should be safe even if we haven't saved the initial state yet.\\n\\n\\t\\tcontext.restore();\\n\\t\\tcontext.save();\\n\\n\\t\\t// Scale the coordinate space to match the display density; so even though we\\n\\t\\t// may have twice as many pixels, we still want lines and other drawing to\\n\\t\\t// appear at the same size; the extra pixels will just make them crisper.\\n\\n\\t\\tcontext.scale(pixelRatio, pixelRatio);\\n\\t};\\n\\n\\t// Clears the entire canvas area, not including any overlaid HTML text\\n\\n\\tCanvas.prototype.clear = function() {\\n\\t\\tthis.context.clearRect(0, 0, this.width, this.height);\\n\\t};\\n\\n\\t// Finishes rendering the canvas, including managing the text overlay.\\n\\n\\tCanvas.prototype.render = function() {\\n\\n\\t\\tvar cache = this._textCache;\\n\\n\\t\\t// For each text layer, add elements marked as active that haven't\\n\\t\\t// already been rendered, and remove those that are no longer active.\\n\\n\\t\\tfor (var layerKey in cache) {\\n\\t\\t\\tif (hasOwnProperty.call(cache, layerKey)) {\\n\\n\\t\\t\\t\\tvar layer = this.getTextLayer(layerKey),\\n\\t\\t\\t\\t\\tlayerCache = cache[layerKey];\\n\\n\\t\\t\\t\\tlayer.hide();\\n\\n\\t\\t\\t\\tfor (var styleKey in layerCache) {\\n\\t\\t\\t\\t\\tif (hasOwnProperty.call(layerCache, styleKey)) {\\n\\t\\t\\t\\t\\t\\tvar styleCache = layerCache[styleKey];\\n\\t\\t\\t\\t\\t\\tfor (var key in styleCache) {\\n\\t\\t\\t\\t\\t\\t\\tif (hasOwnProperty.call(styleCache, key)) {\\n\\n\\t\\t\\t\\t\\t\\t\\t\\tvar positions = styleCache[key].positions;\\n\\n\\t\\t\\t\\t\\t\\t\\t\\tfor (var i = 0, position; position = positions[i]; i++) {\\n\\t\\t\\t\\t\\t\\t\\t\\t\\tif (position.active) {\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\tif (!position.rendered) {\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\tlayer.append(position.element);\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\tposition.rendered = true;\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\tpositions.splice(i--, 1);\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\tif (position.rendered) {\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\tposition.element.detach();\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\t\\t\\t\\tif (positions.length == 0) {\\n\\t\\t\\t\\t\\t\\t\\t\\t\\tdelete styleCache[key];\\n\\t\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\tlayer.show();\\n\\t\\t\\t}\\n\\t\\t}\\n\\t};\\n\\n\\t// Creates (if necessary) and returns the text overlay container.\\n\\t//\\n\\t// @param {string} classes String of space-separated CSS classes used to\\n\\t// uniquely identify the text layer.\\n\\t// @return {object} The jQuery-wrapped text-layer div.\\n\\n\\tCanvas.prototype.getTextLayer = function(classes) {\\n\\n\\t\\tvar layer = this.text[classes];\\n\\n\\t\\t// Create the text layer if it doesn't exist\\n\\n\\t\\tif (layer == null) {\\n\\n\\t\\t\\t// Create the text layer container, if it doesn't exist\\n\\n\\t\\t\\tif (this.textContainer == null) {\\n\\t\\t\\t\\tthis.textContainer = $(\\\"<div class='flot-text'></div>\\\")\\n\\t\\t\\t\\t\\t.css({\\n\\t\\t\\t\\t\\t\\tposition: \\\"absolute\\\",\\n\\t\\t\\t\\t\\t\\ttop: 0,\\n\\t\\t\\t\\t\\t\\tleft: 0,\\n\\t\\t\\t\\t\\t\\tbottom: 0,\\n\\t\\t\\t\\t\\t\\tright: 0,\\n\\t\\t\\t\\t\\t\\t'font-size': \\\"smaller\\\",\\n\\t\\t\\t\\t\\t\\tcolor: \\\"#545454\\\"\\n\\t\\t\\t\\t\\t})\\n\\t\\t\\t\\t\\t.insertAfter(this.element);\\n\\t\\t\\t}\\n\\n\\t\\t\\tlayer = this.text[classes] = $(\\\"<div></div>\\\")\\n\\t\\t\\t\\t.addClass(classes)\\n\\t\\t\\t\\t.css({\\n\\t\\t\\t\\t\\tposition: \\\"absolute\\\",\\n\\t\\t\\t\\t\\ttop: 0,\\n\\t\\t\\t\\t\\tleft: 0,\\n\\t\\t\\t\\t\\tbottom: 0,\\n\\t\\t\\t\\t\\tright: 0\\n\\t\\t\\t\\t})\\n\\t\\t\\t\\t.appendTo(this.textContainer);\\n\\t\\t}\\n\\n\\t\\treturn layer;\\n\\t};\\n\\n\\t// Creates (if necessary) and returns a text info object.\\n\\t//\\n\\t// The object looks like this:\\n\\t//\\n\\t// {\\n\\t// width: Width of the text's wrapper div.\\n\\t// height: Height of the text's wrapper div.\\n\\t// element: The jQuery-wrapped HTML div containing the text.\\n\\t// positions: Array of positions at which this text is drawn.\\n\\t// }\\n\\t//\\n\\t// The positions array contains objects that look like this:\\n\\t//\\n\\t// {\\n\\t// active: Flag indicating whether the text should be visible.\\n\\t// rendered: Flag indicating whether the text is currently visible.\\n\\t// element: The jQuery-wrapped HTML div containing the text.\\n\\t// x: X coordinate at which to draw the text.\\n\\t// y: Y coordinate at which to draw the text.\\n\\t// }\\n\\t//\\n\\t// Each position after the first receives a clone of the original element.\\n\\t//\\n\\t// The idea is that that the width, height, and general 'identity' of the\\n\\t// text is constant no matter where it is placed; the placements are a\\n\\t// secondary property.\\n\\t//\\n\\t// Canvas maintains a cache of recently-used text info objects; getTextInfo\\n\\t// either returns the cached element or creates a new entry.\\n\\t//\\n\\t// @param {string} layer A string of space-separated CSS classes uniquely\\n\\t// identifying the layer containing this text.\\n\\t// @param {string} text Text string to retrieve info for.\\n\\t// @param {(string|object)=} font Either a string of space-separated CSS\\n\\t// classes or a font-spec object, defining the text's font and style.\\n\\t// @param {number=} angle Angle at which to rotate the text, in degrees.\\n\\t// Angle is currently unused, it will be implemented in the future.\\n\\t// @param {number=} width Maximum width of the text before it wraps.\\n\\t// @return {object} a text info object.\\n\\n\\tCanvas.prototype.getTextInfo = function(layer, text, font, angle, width) {\\n\\n\\t\\tvar textStyle, layerCache, styleCache, info;\\n\\n\\t\\t// Cast the value to a string, in case we were given a number or such\\n\\n\\t\\ttext = \\\"\\\" + text;\\n\\n\\t\\t// If the font is a font-spec object, generate a CSS font definition\\n\\n\\t\\tif (typeof font === \\\"object\\\") {\\n\\t\\t\\ttextStyle = font.style + \\\" \\\" + font.variant + \\\" \\\" + font.weight + \\\" \\\" + font.size + \\\"px/\\\" + font.lineHeight + \\\"px \\\" + font.family;\\n\\t\\t} else {\\n\\t\\t\\ttextStyle = font;\\n\\t\\t}\\n\\n\\t\\t// Retrieve (or create) the cache for the text's layer and styles\\n\\n\\t\\tlayerCache = this._textCache[layer];\\n\\n\\t\\tif (layerCache == null) {\\n\\t\\t\\tlayerCache = this._textCache[layer] = {};\\n\\t\\t}\\n\\n\\t\\tstyleCache = layerCache[textStyle];\\n\\n\\t\\tif (styleCache == null) {\\n\\t\\t\\tstyleCache = layerCache[textStyle] = {};\\n\\t\\t}\\n\\n\\t\\tinfo = styleCache[text];\\n\\n\\t\\t// If we can't find a matching element in our cache, create a new one\\n\\n\\t\\tif (info == null) {\\n\\n\\t\\t\\tvar element = $(\\\"<div></div>\\\").html(text)\\n\\t\\t\\t\\t.css({\\n\\t\\t\\t\\t\\tposition: \\\"absolute\\\",\\n\\t\\t\\t\\t\\t'max-width': width,\\n\\t\\t\\t\\t\\ttop: -9999\\n\\t\\t\\t\\t})\\n\\t\\t\\t\\t.appendTo(this.getTextLayer(layer));\\n\\n\\t\\t\\tif (typeof font === \\\"object\\\") {\\n\\t\\t\\t\\telement.css({\\n\\t\\t\\t\\t\\tfont: textStyle,\\n\\t\\t\\t\\t\\tcolor: font.color\\n\\t\\t\\t\\t});\\n\\t\\t\\t} else if (typeof font === \\\"string\\\") {\\n\\t\\t\\t\\telement.addClass(font);\\n\\t\\t\\t}\\n\\n\\t\\t\\tinfo = styleCache[text] = {\\n\\t\\t\\t\\twidth: element.outerWidth(true),\\n\\t\\t\\t\\theight: element.outerHeight(true),\\n\\t\\t\\t\\telement: element,\\n\\t\\t\\t\\tpositions: []\\n\\t\\t\\t};\\n\\n\\t\\t\\telement.detach();\\n\\t\\t}\\n\\n\\t\\treturn info;\\n\\t};\\n\\n\\t// Adds a text string to the canvas text overlay.\\n\\t//\\n\\t// The text isn't drawn immediately; it is marked as rendering, which will\\n\\t// result in its addition to the canvas on the next render pass.\\n\\t//\\n\\t// @param {string} layer A string of space-separated CSS classes uniquely\\n\\t// identifying the layer containing this text.\\n\\t// @param {number} x X coordinate at which to draw the text.\\n\\t// @param {number} y Y coordinate at which to draw the text.\\n\\t// @param {string} text Text string to draw.\\n\\t// @param {(string|object)=} font Either a string of space-separated CSS\\n\\t// classes or a font-spec object, defining the text's font and style.\\n\\t// @param {number=} angle Angle at which to rotate the text, in degrees.\\n\\t// Angle is currently unused, it will be implemented in the future.\\n\\t// @param {number=} width Maximum width of the text before it wraps.\\n\\t// @param {string=} halign Horizontal alignment of the text; either \\\"left\\\",\\n\\t// \\\"center\\\" or \\\"right\\\".\\n\\t// @param {string=} valign Vertical alignment of the text; either \\\"top\\\",\\n\\t// \\\"middle\\\" or \\\"bottom\\\".\\n\\n\\tCanvas.prototype.addText = function(layer, x, y, text, font, angle, width, halign, valign) {\\n\\n\\t\\tvar info = this.getTextInfo(layer, text, font, angle, width),\\n\\t\\t\\tpositions = info.positions;\\n\\n\\t\\t// Tweak the div's position to match the text's alignment\\n\\n\\t\\tif (halign == \\\"center\\\") {\\n\\t\\t\\tx -= info.width / 2;\\n\\t\\t} else if (halign == \\\"right\\\") {\\n\\t\\t\\tx -= info.width;\\n\\t\\t}\\n\\n\\t\\tif (valign == \\\"middle\\\") {\\n\\t\\t\\ty -= info.height / 2;\\n\\t\\t} else if (valign == \\\"bottom\\\") {\\n\\t\\t\\ty -= info.height;\\n\\t\\t}\\n\\n\\t\\t// Determine whether this text already exists at this position.\\n\\t\\t// If so, mark it for inclusion in the next render pass.\\n\\n\\t\\tfor (var i = 0, position; position = positions[i]; i++) {\\n\\t\\t\\tif (position.x == x && position.y == y) {\\n\\t\\t\\t\\tposition.active = true;\\n\\t\\t\\t\\treturn;\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t// If the text doesn't exist at this position, create a new entry\\n\\n\\t\\t// For the very first position we'll re-use the original element,\\n\\t\\t// while for subsequent ones we'll clone it.\\n\\n\\t\\tposition = {\\n\\t\\t\\tactive: true,\\n\\t\\t\\trendered: false,\\n\\t\\t\\telement: positions.length ? info.element.clone() : info.element,\\n\\t\\t\\tx: x,\\n\\t\\t\\ty: y\\n\\t\\t};\\n\\n\\t\\tpositions.push(position);\\n\\n\\t\\t// Move the element to its final position within the container\\n\\n\\t\\tposition.element.css({\\n\\t\\t\\ttop: Math.round(y),\\n\\t\\t\\tleft: Math.round(x),\\n\\t\\t\\t'text-align': halign\\t// In case the text wraps\\n\\t\\t});\\n\\t};\\n\\n\\t// Removes one or more text strings from the canvas text overlay.\\n\\t//\\n\\t// If no parameters are given, all text within the layer is removed.\\n\\t//\\n\\t// Note that the text is not immediately removed; it is simply marked as\\n\\t// inactive, which will result in its removal on the next render pass.\\n\\t// This avoids the performance penalty for 'clear and redraw' behavior,\\n\\t// where we potentially get rid of all text on a layer, but will likely\\n\\t// add back most or all of it later, as when redrawing axes, for example.\\n\\t//\\n\\t// @param {string} layer A string of space-separated CSS classes uniquely\\n\\t// identifying the layer containing this text.\\n\\t// @param {number=} x X coordinate of the text.\\n\\t// @param {number=} y Y coordinate of the text.\\n\\t// @param {string=} text Text string to remove.\\n\\t// @param {(string|object)=} font Either a string of space-separated CSS\\n\\t// classes or a font-spec object, defining the text's font and style.\\n\\t// @param {number=} angle Angle at which the text is rotated, in degrees.\\n\\t// Angle is currently unused, it will be implemented in the future.\\n\\n\\tCanvas.prototype.removeText = function(layer, x, y, text, font, angle) {\\n\\t\\tif (text == null) {\\n\\t\\t\\tvar layerCache = this._textCache[layer];\\n\\t\\t\\tif (layerCache != null) {\\n\\t\\t\\t\\tfor (var styleKey in layerCache) {\\n\\t\\t\\t\\t\\tif (hasOwnProperty.call(layerCache, styleKey)) {\\n\\t\\t\\t\\t\\t\\tvar styleCache = layerCache[styleKey];\\n\\t\\t\\t\\t\\t\\tfor (var key in styleCache) {\\n\\t\\t\\t\\t\\t\\t\\tif (hasOwnProperty.call(styleCache, key)) {\\n\\t\\t\\t\\t\\t\\t\\t\\tvar positions = styleCache[key].positions;\\n\\t\\t\\t\\t\\t\\t\\t\\tfor (var i = 0, position; position = positions[i]; i++) {\\n\\t\\t\\t\\t\\t\\t\\t\\t\\tposition.active = false;\\n\\t\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t} else {\\n\\t\\t\\tvar positions = this.getTextInfo(layer, text, font, angle).positions;\\n\\t\\t\\tfor (var i = 0, position; position = positions[i]; i++) {\\n\\t\\t\\t\\tif (position.x == x && position.y == y) {\\n\\t\\t\\t\\t\\tposition.active = false;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t};\\n\\n\\t///////////////////////////////////////////////////////////////////////////\\n\\t// The top-level container for the entire plot.\\n\\n function Plot(placeholder, data_, options_, plugins) {\\n // data is on the form:\\n // [ series1, series2 ... ]\\n // where series is either just the data as [ [x1, y1], [x2, y2], ... ]\\n // or { data: [ [x1, y1], [x2, y2], ... ], label: \\\"some label\\\", ... }\\n\\n var series = [],\\n options = {\\n // the color theme used for graphs\\n colors: [\\\"#edc240\\\", \\\"#afd8f8\\\", \\\"#cb4b4b\\\", \\\"#4da74d\\\", \\\"#9440ed\\\"],\\n legend: {\\n show: true,\\n noColumns: 1, // number of colums in legend table\\n labelFormatter: null, // fn: string -> string\\n labelBoxBorderColor: \\\"#ccc\\\", // border color for the little label boxes\\n container: null, // container (as jQuery object) to put legend in, null means default on top of graph\\n position: \\\"ne\\\", // position of default legend container within plot\\n margin: 5, // distance from grid edge to default legend container within plot\\n backgroundColor: null, // null means auto-detect\\n backgroundOpacity: 0.85, // set to 0 to avoid background\\n sorted: null // default to no legend sorting\\n },\\n xaxis: {\\n show: null, // null = auto-detect, true = always, false = never\\n position: \\\"bottom\\\", // or \\\"top\\\"\\n mode: null, // null or \\\"time\\\"\\n font: null, // null (derived from CSS in placeholder) or object like { size: 11, lineHeight: 13, style: \\\"italic\\\", weight: \\\"bold\\\", family: \\\"sans-serif\\\", variant: \\\"small-caps\\\" }\\n color: null, // base color, labels, ticks\\n tickColor: null, // possibly different color of ticks, e.g. \\\"rgba(0,0,0,0.15)\\\"\\n transform: null, // null or f: number -> number to transform axis\\n inverseTransform: null, // if transform is set, this should be the inverse function\\n min: null, // min. value to show, null means set automatically\\n max: null, // max. value to show, null means set automatically\\n autoscaleMargin: null, // margin in % to add if auto-setting min/max\\n ticks: null, // either [1, 3] or [[1, \\\"a\\\"], 3] or (fn: axis info -> ticks) or app. number of ticks for auto-ticks\\n tickFormatter: null, // fn: number -> string\\n labelWidth: null, // size of tick labels in pixels\\n labelHeight: null,\\n reserveSpace: null, // whether to reserve space even if axis isn't shown\\n tickLength: null, // size in pixels of ticks, or \\\"full\\\" for whole line\\n alignTicksWithAxis: null, // axis number or null for no sync\\n tickDecimals: null, // no. of decimals, null means auto\\n tickSize: null, // number or [number, \\\"unit\\\"]\\n minTickSize: null // number or [number, \\\"unit\\\"]\\n },\\n yaxis: {\\n autoscaleMargin: 0.02,\\n position: \\\"left\\\" // or \\\"right\\\"\\n },\\n xaxes: [],\\n yaxes: [],\\n series: {\\n points: {\\n show: false,\\n radius: 3,\\n lineWidth: 2, // in pixels\\n fill: true,\\n fillColor: \\\"#ffffff\\\",\\n symbol: \\\"circle\\\" // or callback\\n },\\n lines: {\\n // we don't put in show: false so we can see\\n // whether lines were actively disabled\\n lineWidth: 2, // in pixels\\n fill: false,\\n fillColor: null,\\n steps: false\\n // Omit 'zero', so we can later default its value to\\n // match that of the 'fill' option.\\n },\\n bars: {\\n show: false,\\n lineWidth: 2, // in pixels\\n barWidth: 1, // in units of the x axis\\n fill: true,\\n fillColor: null,\\n align: \\\"left\\\", // \\\"left\\\", \\\"right\\\", or \\\"center\\\"\\n horizontal: false,\\n zero: true\\n },\\n shadowSize: 3,\\n highlightColor: null\\n },\\n grid: {\\n show: true,\\n aboveData: false,\\n color: \\\"#545454\\\", // primary color used for outline and labels\\n backgroundColor: null, // null for transparent, else color\\n borderColor: null, // set if different from the grid color\\n tickColor: null, // color for the ticks, e.g. \\\"rgba(0,0,0,0.15)\\\"\\n margin: 0, // distance from the canvas edge to the grid\\n labelMargin: 5, // in pixels\\n axisMargin: 8, // in pixels\\n borderWidth: 2, // in pixels\\n minBorderMargin: null, // in pixels, null means taken from points radius\\n markings: null, // array of ranges or fn: axes -> array of ranges\\n markingsColor: \\\"#f4f4f4\\\",\\n markingsLineWidth: 2,\\n // interactive stuff\\n clickable: false,\\n hoverable: false,\\n autoHighlight: true, // highlight in case mouse is near\\n mouseActiveRadius: 10 // how far the mouse can be away to activate an item\\n },\\n interaction: {\\n redrawOverlayInterval: 1000/60 // time between updates, -1 means in same flow\\n },\\n hooks: {}\\n },\\n surface = null, // the canvas for the plot itself\\n overlay = null, // canvas for interactive stuff on top of plot\\n eventHolder = null, // jQuery object that events should be bound to\\n ctx = null, octx = null,\\n xaxes = [], yaxes = [],\\n plotOffset = { left: 0, right: 0, top: 0, bottom: 0},\\n plotWidth = 0, plotHeight = 0,\\n hooks = {\\n processOptions: [],\\n processRawData: [],\\n processDatapoints: [],\\n processOffset: [],\\n drawBackground: [],\\n drawSeries: [],\\n draw: [],\\n bindEvents: [],\\n drawOverlay: [],\\n shutdown: []\\n },\\n plot = this;\\n\\n // public functions\\n plot.setData = setData;\\n plot.setupGrid = setupGrid;\\n plot.draw = draw;\\n plot.getPlaceholder = function() { return placeholder; };\\n plot.getCanvas = function() { return surface.element; };\\n plot.getPlotOffset = function() { return plotOffset; };\\n plot.width = function () { return plotWidth; };\\n plot.height = function () { return plotHeight; };\\n plot.offset = function () {\\n var o = eventHolder.offset();\\n o.left += plotOffset.left;\\n o.top += plotOffset.top;\\n return o;\\n };\\n plot.getData = function () { return series; };\\n plot.getAxes = function () {\\n var res = {}, i;\\n $.each(xaxes.concat(yaxes), function (_, axis) {\\n if (axis)\\n res[axis.direction + (axis.n != 1 ? axis.n : \\\"\\\") + \\\"axis\\\"] = axis;\\n });\\n return res;\\n };\\n plot.getXAxes = function () { return xaxes; };\\n plot.getYAxes = function () { return yaxes; };\\n plot.c2p = canvasToAxisCoords;\\n plot.p2c = axisToCanvasCoords;\\n plot.getOptions = function () { return options; };\\n plot.highlight = highlight;\\n plot.unhighlight = unhighlight;\\n plot.triggerRedrawOverlay = triggerRedrawOverlay;\\n plot.pointOffset = function(point) {\\n return {\\n left: parseInt(xaxes[axisNumber(point, \\\"x\\\") - 1].p2c(+point.x) + plotOffset.left, 10),\\n top: parseInt(yaxes[axisNumber(point, \\\"y\\\") - 1].p2c(+point.y) + plotOffset.top, 10)\\n };\\n };\\n plot.shutdown = shutdown;\\n plot.destroy = function () {\\n shutdown();\\n placeholder.removeData(\\\"plot\\\").empty();\\n\\n series = [];\\n options = null;\\n surface = null;\\n overlay = null;\\n eventHolder = null;\\n ctx = null;\\n octx = null;\\n xaxes = [];\\n yaxes = [];\\n hooks = null;\\n highlights = [];\\n plot = null;\\n };\\n plot.resize = function () {\\n \\tvar width = placeholder.width(),\\n \\t\\theight = placeholder.height();\\n surface.resize(width, height);\\n overlay.resize(width, height);\\n };\\n\\n // public attributes\\n plot.hooks = hooks;\\n\\n // initialize\\n initPlugins(plot);\\n parseOptions(options_);\\n setupCanvases();\\n setData(data_);\\n setupGrid();\\n draw();\\n bindEvents();\\n\\n\\n function executeHooks(hook, args) {\\n args = [plot].concat(args);\\n for (var i = 0; i < hook.length; ++i)\\n hook[i].apply(this, args);\\n }\\n\\n function initPlugins() {\\n\\n // References to key classes, allowing plugins to modify them\\n\\n var classes = {\\n Canvas: Canvas\\n };\\n\\n for (var i = 0; i < plugins.length; ++i) {\\n var p = plugins[i];\\n p.init(plot, classes);\\n if (p.options)\\n $.extend(true, options, p.options);\\n }\\n }\\n\\n function parseOptions(opts) {\\n\\n $.extend(true, options, opts);\\n\\n // $.extend merges arrays, rather than replacing them. When less\\n // colors are provided than the size of the default palette, we\\n // end up with those colors plus the remaining defaults, which is\\n // not expected behavior; avoid it by replacing them here.\\n\\n if (opts && opts.colors) {\\n \\toptions.colors = opts.colors;\\n }\\n\\n if (options.xaxis.color == null)\\n options.xaxis.color = $.color.parse(options.grid.color).scale('a', 0.22).toString();\\n if (options.yaxis.color == null)\\n options.yaxis.color = $.color.parse(options.grid.color).scale('a', 0.22).toString();\\n\\n if (options.xaxis.tickColor == null) // grid.tickColor for back-compatibility\\n options.xaxis.tickColor = options.grid.tickColor || options.xaxis.color;\\n if (options.yaxis.tickColor == null) // grid.tickColor for back-compatibility\\n options.yaxis.tickColor = options.grid.tickColor || options.yaxis.color;\\n\\n if (options.grid.borderColor == null)\\n options.grid.borderColor = options.grid.color;\\n if (options.grid.tickColor == null)\\n options.grid.tickColor = $.color.parse(options.grid.color).scale('a', 0.22).toString();\\n\\n // Fill in defaults for axis options, including any unspecified\\n // font-spec fields, if a font-spec was provided.\\n\\n // If no x/y axis options were provided, create one of each anyway,\\n // since the rest of the code assumes that they exist.\\n\\n var i, axisOptions, axisCount,\\n fontSize = placeholder.css(\\\"font-size\\\"),\\n fontSizeDefault = fontSize ? +fontSize.replace(\\\"px\\\", \\\"\\\") : 13,\\n fontDefaults = {\\n style: placeholder.css(\\\"font-style\\\"),\\n size: Math.round(0.8 * fontSizeDefault),\\n variant: placeholder.css(\\\"font-variant\\\"),\\n weight: placeholder.css(\\\"font-weight\\\"),\\n family: placeholder.css(\\\"font-family\\\")\\n };\\n\\n axisCount = options.xaxes.length || 1;\\n for (i = 0; i < axisCount; ++i) {\\n\\n axisOptions = options.xaxes[i];\\n if (axisOptions && !axisOptions.tickColor) {\\n axisOptions.tickColor = axisOptions.color;\\n }\\n\\n axisOptions = $.extend(true, {}, options.xaxis, axisOptions);\\n options.xaxes[i] = axisOptions;\\n\\n if (axisOptions.font) {\\n axisOptions.font = $.extend({}, fontDefaults, axisOptions.font);\\n if (!axisOptions.font.color) {\\n axisOptions.font.color = axisOptions.color;\\n }\\n if (!axisOptions.font.lineHeight) {\\n axisOptions.font.lineHeight = Math.round(axisOptions.font.size * 1.15);\\n }\\n }\\n }\\n\\n axisCount = options.yaxes.length || 1;\\n for (i = 0; i < axisCount; ++i) {\\n\\n axisOptions = options.yaxes[i];\\n if (axisOptions && !axisOptions.tickColor) {\\n axisOptions.tickColor = axisOptions.color;\\n }\\n\\n axisOptions = $.extend(true, {}, options.yaxis, axisOptions);\\n options.yaxes[i] = axisOptions;\\n\\n if (axisOptions.font) {\\n axisOptions.font = $.extend({}, fontDefaults, axisOptions.font);\\n if (!axisOptions.font.color) {\\n axisOptions.font.color = axisOptions.color;\\n }\\n if (!axisOptions.font.lineHeight) {\\n axisOptions.font.lineHeight = Math.round(axisOptions.font.size * 1.15);\\n }\\n }\\n }\\n\\n // backwards compatibility, to be removed in future\\n if (options.xaxis.noTicks && options.xaxis.ticks == null)\\n options.xaxis.ticks = options.xaxis.noTicks;\\n if (options.yaxis.noTicks && options.yaxis.ticks == null)\\n options.yaxis.ticks = options.yaxis.noTicks;\\n if (options.x2axis) {\\n options.xaxes[1] = $.extend(true, {}, options.xaxis, options.x2axis);\\n options.xaxes[1].position = \\\"top\\\";\\n // Override the inherit to allow the axis to auto-scale\\n if (options.x2axis.min == null) {\\n options.xaxes[1].min = null;\\n }\\n if (options.x2axis.max == null) {\\n options.xaxes[1].max = null;\\n }\\n }\\n if (options.y2axis) {\\n options.yaxes[1] = $.extend(true, {}, options.yaxis, options.y2axis);\\n options.yaxes[1].position = \\\"right\\\";\\n // Override the inherit to allow the axis to auto-scale\\n if (options.y2axis.min == null) {\\n options.yaxes[1].min = null;\\n }\\n if (options.y2axis.max == null) {\\n options.yaxes[1].max = null;\\n }\\n }\\n if (options.grid.coloredAreas)\\n options.grid.markings = options.grid.coloredAreas;\\n if (options.grid.coloredAreasColor)\\n options.grid.markingsColor = options.grid.coloredAreasColor;\\n if (options.lines)\\n $.extend(true, options.series.lines, options.lines);\\n if (options.points)\\n $.extend(true, options.series.points, options.points);\\n if (options.bars)\\n $.extend(true, options.series.bars, options.bars);\\n if (options.shadowSize != null)\\n options.series.shadowSize = options.shadowSize;\\n if (options.highlightColor != null)\\n options.series.highlightColor = options.highlightColor;\\n\\n // save options on axes for future reference\\n for (i = 0; i < options.xaxes.length; ++i)\\n getOrCreateAxis(xaxes, i + 1).options = options.xaxes[i];\\n for (i = 0; i < options.yaxes.length; ++i)\\n getOrCreateAxis(yaxes, i + 1).options = options.yaxes[i];\\n\\n // add hooks from options\\n for (var n in hooks)\\n if (options.hooks[n] && options.hooks[n].length)\\n hooks[n] = hooks[n].concat(options.hooks[n]);\\n\\n executeHooks(hooks.processOptions, [options]);\\n }\\n\\n function setData(d) {\\n series = parseData(d);\\n fillInSeriesOptions();\\n processData();\\n }\\n\\n function parseData(d) {\\n var res = [];\\n for (var i = 0; i < d.length; ++i) {\\n var s = $.extend(true, {}, options.series);\\n\\n if (d[i].data != null) {\\n s.data = d[i].data; // move the data instead of deep-copy\\n delete d[i].data;\\n\\n $.extend(true, s, d[i]);\\n\\n d[i].data = s.data;\\n }\\n else\\n s.data = d[i];\\n res.push(s);\\n }\\n\\n return res;\\n }\\n\\n function axisNumber(obj, coord) {\\n var a = obj[coord + \\\"axis\\\"];\\n if (typeof a == \\\"object\\\") // if we got a real axis, extract number\\n a = a.n;\\n if (typeof a != \\\"number\\\")\\n a = 1; // default to first axis\\n return a;\\n }\\n\\n function allAxes() {\\n // return flat array without annoying null entries\\n return $.grep(xaxes.concat(yaxes), function (a) { return a; });\\n }\\n\\n function canvasToAxisCoords(pos) {\\n // return an object with x/y corresponding to all used axes\\n var res = {}, i, axis;\\n for (i = 0; i < xaxes.length; ++i) {\\n axis = xaxes[i];\\n if (axis && axis.used)\\n res[\\\"x\\\" + axis.n] = axis.c2p(pos.left);\\n }\\n\\n for (i = 0; i < yaxes.length; ++i) {\\n axis = yaxes[i];\\n if (axis && axis.used)\\n res[\\\"y\\\" + axis.n] = axis.c2p(pos.top);\\n }\\n\\n if (res.x1 !== undefined)\\n res.x = res.x1;\\n if (res.y1 !== undefined)\\n res.y = res.y1;\\n\\n return res;\\n }\\n\\n function axisToCanvasCoords(pos) {\\n // get canvas coords from the first pair of x/y found in pos\\n var res = {}, i, axis, key;\\n\\n for (i = 0; i < xaxes.length; ++i) {\\n axis = xaxes[i];\\n if (axis && axis.used) {\\n key = \\\"x\\\" + axis.n;\\n if (pos[key] == null && axis.n == 1)\\n key = \\\"x\\\";\\n\\n if (pos[key] != null) {\\n res.left = axis.p2c(pos[key]);\\n break;\\n }\\n }\\n }\\n\\n for (i = 0; i < yaxes.length; ++i) {\\n axis = yaxes[i];\\n if (axis && axis.used) {\\n key = \\\"y\\\" + axis.n;\\n if (pos[key] == null && axis.n == 1)\\n key = \\\"y\\\";\\n\\n if (pos[key] != null) {\\n res.top = axis.p2c(pos[key]);\\n break;\\n }\\n }\\n }\\n\\n return res;\\n }\\n\\n function getOrCreateAxis(axes, number) {\\n if (!axes[number - 1])\\n axes[number - 1] = {\\n n: number, // save the number for future reference\\n direction: axes == xaxes ? \\\"x\\\" : \\\"y\\\",\\n options: $.extend(true, {}, axes == xaxes ? options.xaxis : options.yaxis)\\n };\\n\\n return axes[number - 1];\\n }\\n\\n function fillInSeriesOptions() {\\n\\n var neededColors = series.length, maxIndex = -1, i;\\n\\n // Subtract the number of series that already have fixed colors or\\n // color indexes from the number that we still need to generate.\\n\\n for (i = 0; i < series.length; ++i) {\\n var sc = series[i].color;\\n if (sc != null) {\\n neededColors--;\\n if (typeof sc == \\\"number\\\" && sc > maxIndex) {\\n maxIndex = sc;\\n }\\n }\\n }\\n\\n // If any of the series have fixed color indexes, then we need to\\n // generate at least as many colors as the highest index.\\n\\n if (neededColors <= maxIndex) {\\n neededColors = maxIndex + 1;\\n }\\n\\n // Generate all the colors, using first the option colors and then\\n // variations on those colors once they're exhausted.\\n\\n var c, colors = [], colorPool = options.colors,\\n colorPoolSize = colorPool.length, variation = 0;\\n\\n for (i = 0; i < neededColors; i++) {\\n\\n c = $.color.parse(colorPool[i % colorPoolSize] || \\\"#666\\\");\\n\\n // Each time we exhaust the colors in the pool we adjust\\n // a scaling factor used to produce more variations on\\n // those colors. The factor alternates negative/positive\\n // to produce lighter/darker colors.\\n\\n // Reset the variation after every few cycles, or else\\n // it will end up producing only white or black colors.\\n\\n if (i % colorPoolSize == 0 && i) {\\n if (variation >= 0) {\\n if (variation < 0.5) {\\n variation = -variation - 0.2;\\n } else variation = 0;\\n } else variation = -variation;\\n }\\n\\n colors[i] = c.scale('rgb', 1 + variation);\\n }\\n\\n // Finalize the series options, filling in their colors\\n\\n var colori = 0, s;\\n for (i = 0; i < series.length; ++i) {\\n s = series[i];\\n\\n // assign colors\\n if (s.color == null) {\\n s.color = colors[colori].toString();\\n ++colori;\\n }\\n else if (typeof s.color == \\\"number\\\")\\n s.color = colors[s.color].toString();\\n\\n // turn on lines automatically in case nothing is set\\n if (s.lines.show == null) {\\n var v, show = true;\\n for (v in s)\\n if (s[v] && s[v].show) {\\n show = false;\\n break;\\n }\\n if (show)\\n s.lines.show = true;\\n }\\n\\n // If nothing was provided for lines.zero, default it to match\\n // lines.fill, since areas by default should extend to zero.\\n\\n if (s.lines.zero == null) {\\n s.lines.zero = !!s.lines.fill;\\n }\\n\\n // setup axes\\n s.xaxis = getOrCreateAxis(xaxes, axisNumber(s, \\\"x\\\"));\\n s.yaxis = getOrCreateAxis(yaxes, axisNumber(s, \\\"y\\\"));\\n }\\n }\\n\\n function processData() {\\n var topSentry = Number.POSITIVE_INFINITY,\\n bottomSentry = Number.NEGATIVE_INFINITY,\\n fakeInfinity = Number.MAX_VALUE,\\n i, j, k, m, length,\\n s, points, ps, x, y, axis, val, f, p,\\n data, format;\\n\\n function updateAxis(axis, min, max) {\\n if (min < axis.datamin && min != -fakeInfinity)\\n axis.datamin = min;\\n if (max > axis.datamax && max != fakeInfinity)\\n axis.datamax = max;\\n }\\n\\n $.each(allAxes(), function (_, axis) {\\n // init axis\\n axis.datamin = topSentry;\\n axis.datamax = bottomSentry;\\n axis.used = false;\\n });\\n\\n for (i = 0; i < series.length; ++i) {\\n s = series[i];\\n s.datapoints = { points: [] };\\n\\n executeHooks(hooks.processRawData, [ s, s.data, s.datapoints ]);\\n }\\n\\n // first pass: clean and copy data\\n for (i = 0; i < series.length; ++i) {\\n s = series[i];\\n\\n data = s.data;\\n format = s.datapoints.format;\\n\\n if (!format) {\\n format = [];\\n // find out how to copy\\n format.push({ x: true, number: true, required: true });\\n format.push({ y: true, number: true, required: true });\\n\\n if (s.bars.show || (s.lines.show && s.lines.fill)) {\\n var autoscale = !!((s.bars.show && s.bars.zero) || (s.lines.show && s.lines.zero));\\n format.push({ y: true, number: true, required: false, defaultValue: 0, autoscale: autoscale });\\n if (s.bars.horizontal) {\\n delete format[format.length - 1].y;\\n format[format.length - 1].x = true;\\n }\\n }\\n\\n s.datapoints.format = format;\\n }\\n\\n if (s.datapoints.pointsize != null)\\n continue; // already filled in\\n\\n s.datapoints.pointsize = format.length;\\n\\n ps = s.datapoints.pointsize;\\n points = s.datapoints.points;\\n\\n var insertSteps = s.lines.show && s.lines.steps;\\n s.xaxis.used = s.yaxis.used = true;\\n\\n for (j = k = 0; j < data.length; ++j, k += ps) {\\n p = data[j];\\n\\n var nullify = p == null;\\n if (!nullify) {\\n for (m = 0; m < ps; ++m) {\\n val = p[m];\\n f = format[m];\\n\\n if (f) {\\n if (f.number && val != null) {\\n val = +val; // convert to number\\n if (isNaN(val))\\n val = null;\\n else if (val == Infinity)\\n val = fakeInfinity;\\n else if (val == -Infinity)\\n val = -fakeInfinity;\\n }\\n\\n if (val == null) {\\n if (f.required)\\n nullify = true;\\n\\n if (f.defaultValue != null)\\n val = f.defaultValue;\\n }\\n }\\n\\n points[k + m] = val;\\n }\\n }\\n\\n if (nullify) {\\n for (m = 0; m < ps; ++m) {\\n val = points[k + m];\\n if (val != null) {\\n f = format[m];\\n // extract min/max info\\n if (f.autoscale !== false) {\\n if (f.x) {\\n updateAxis(s.xaxis, val, val);\\n }\\n if (f.y) {\\n updateAxis(s.yaxis, val, val);\\n }\\n }\\n }\\n points[k + m] = null;\\n }\\n }\\n else {\\n // a little bit of line specific stuff that\\n // perhaps shouldn't be here, but lacking\\n // better means...\\n if (insertSteps && k > 0\\n && points[k - ps] != null\\n && points[k - ps] != points[k]\\n && points[k - ps + 1] != points[k + 1]) {\\n // copy the point to make room for a middle point\\n for (m = 0; m < ps; ++m)\\n points[k + ps + m] = points[k + m];\\n\\n // middle point has same y\\n points[k + 1] = points[k - ps + 1];\\n\\n // we've added a point, better reflect that\\n k += ps;\\n }\\n }\\n }\\n }\\n\\n // give the hooks a chance to run\\n for (i = 0; i < series.length; ++i) {\\n s = series[i];\\n\\n executeHooks(hooks.processDatapoints, [ s, s.datapoints]);\\n }\\n\\n // second pass: find datamax/datamin for auto-scaling\\n for (i = 0; i < series.length; ++i) {\\n s = series[i];\\n points = s.datapoints.points;\\n ps = s.datapoints.pointsize;\\n format = s.datapoints.format;\\n\\n var xmin = topSentry, ymin = topSentry,\\n xmax = bottomSentry, ymax = bottomSentry;\\n\\n for (j = 0; j < points.length; j += ps) {\\n if (points[j] == null)\\n continue;\\n\\n for (m = 0; m < ps; ++m) {\\n val = points[j + m];\\n f = format[m];\\n if (!f || f.autoscale === false || val == fakeInfinity || val == -fakeInfinity)\\n continue;\\n\\n if (f.x) {\\n if (val < xmin)\\n xmin = val;\\n if (val > xmax)\\n xmax = val;\\n }\\n if (f.y) {\\n if (val < ymin)\\n ymin = val;\\n if (val > ymax)\\n ymax = val;\\n }\\n }\\n }\\n\\n if (s.bars.show) {\\n // make sure we got room for the bar on the dancing floor\\n var delta;\\n\\n switch (s.bars.align) {\\n case \\\"left\\\":\\n delta = 0;\\n break;\\n case \\\"right\\\":\\n delta = -s.bars.barWidth;\\n break;\\n default:\\n delta = -s.bars.barWidth / 2;\\n }\\n\\n if (s.bars.horizontal) {\\n ymin += delta;\\n ymax += delta + s.bars.barWidth;\\n }\\n else {\\n xmin += delta;\\n xmax += delta + s.bars.barWidth;\\n }\\n }\\n\\n updateAxis(s.xaxis, xmin, xmax);\\n updateAxis(s.yaxis, ymin, ymax);\\n }\\n\\n $.each(allAxes(), function (_, axis) {\\n if (axis.datamin == topSentry)\\n axis.datamin = null;\\n if (axis.datamax == bottomSentry)\\n axis.datamax = null;\\n });\\n }\\n\\n function setupCanvases() {\\n\\n // Make sure the placeholder is clear of everything except canvases\\n // from a previous plot in this container that we'll try to re-use.\\n\\n placeholder.css(\\\"padding\\\", 0) // padding messes up the positioning\\n .children().filter(function(){\\n return !$(this).hasClass(\\\"flot-overlay\\\") && !$(this).hasClass('flot-base');\\n }).remove();\\n\\n if (placeholder.css(\\\"position\\\") == 'static')\\n placeholder.css(\\\"position\\\", \\\"relative\\\"); // for positioning labels and overlay\\n\\n surface = new Canvas(\\\"flot-base\\\", placeholder);\\n overlay = new Canvas(\\\"flot-overlay\\\", placeholder); // overlay canvas for interactive features\\n\\n ctx = surface.context;\\n octx = overlay.context;\\n\\n // define which element we're listening for events on\\n eventHolder = $(overlay.element).unbind();\\n\\n // If we're re-using a plot object, shut down the old one\\n\\n var existing = placeholder.data(\\\"plot\\\");\\n\\n if (existing) {\\n existing.shutdown();\\n overlay.clear();\\n }\\n\\n // save in case we get replotted\\n placeholder.data(\\\"plot\\\", plot);\\n }\\n\\n function bindEvents() {\\n // bind events\\n if (options.grid.hoverable) {\\n eventHolder.mousemove(onMouseMove);\\n\\n // Use bind, rather than .mouseleave, because we officially\\n // still support jQuery 1.2.6, which doesn't define a shortcut\\n // for mouseenter or mouseleave. This was a bug/oversight that\\n // was fixed somewhere around 1.3.x. We can return to using\\n // .mouseleave when we drop support for 1.2.6.\\n\\n eventHolder.bind(\\\"mouseleave\\\", onMouseLeave);\\n }\\n\\n if (options.grid.clickable)\\n eventHolder.click(onClick);\\n\\n executeHooks(hooks.bindEvents, [eventHolder]);\\n }\\n\\n function shutdown() {\\n if (redrawTimeout)\\n clearTimeout(redrawTimeout);\\n\\n eventHolder.unbind(\\\"mousemove\\\", onMouseMove);\\n eventHolder.unbind(\\\"mouseleave\\\", onMouseLeave);\\n eventHolder.unbind(\\\"click\\\", onClick);\\n\\n executeHooks(hooks.shutdown, [eventHolder]);\\n }\\n\\n function setTransformationHelpers(axis) {\\n // set helper functions on the axis, assumes plot area\\n // has been computed already\\n\\n function identity(x) { return x; }\\n\\n var s, m, t = axis.options.transform || identity,\\n it = axis.options.inverseTransform;\\n\\n // precompute how much the axis is scaling a point\\n // in canvas space\\n if (axis.direction == \\\"x\\\") {\\n s = axis.scale = plotWidth / Math.abs(t(axis.max) - t(axis.min));\\n m = Math.min(t(axis.max), t(axis.min));\\n }\\n else {\\n s = axis.scale = plotHeight / Math.abs(t(axis.max) - t(axis.min));\\n s = -s;\\n m = Math.max(t(axis.max), t(axis.min));\\n }\\n\\n // data point to canvas coordinate\\n if (t == identity) // slight optimization\\n axis.p2c = function (p) { return (p - m) * s; };\\n else\\n axis.p2c = function (p) { return (t(p) - m) * s; };\\n // canvas coordinate to data point\\n if (!it)\\n axis.c2p = function (c) { return m + c / s; };\\n else\\n axis.c2p = function (c) { return it(m + c / s); };\\n }\\n\\n function measureTickLabels(axis) {\\n\\n var opts = axis.options,\\n ticks = axis.ticks || [],\\n labelWidth = opts.labelWidth || 0,\\n labelHeight = opts.labelHeight || 0,\\n maxWidth = labelWidth || (axis.direction == \\\"x\\\" ? Math.floor(surface.width / (ticks.length || 1)) : null),\\n legacyStyles = axis.direction + \\\"Axis \\\" + axis.direction + axis.n + \\\"Axis\\\",\\n layer = \\\"flot-\\\" + axis.direction + \\\"-axis flot-\\\" + axis.direction + axis.n + \\\"-axis \\\" + legacyStyles,\\n font = opts.font || \\\"flot-tick-label tickLabel\\\";\\n\\n for (var i = 0; i < ticks.length; ++i) {\\n\\n var t = ticks[i];\\n\\n if (!t.label)\\n continue;\\n\\n var info = surface.getTextInfo(layer, t.label, font, null, maxWidth);\\n\\n labelWidth = Math.max(labelWidth, info.width);\\n labelHeight = Math.max(labelHeight, info.height);\\n }\\n\\n axis.labelWidth = opts.labelWidth || labelWidth;\\n axis.labelHeight = opts.labelHeight || labelHeight;\\n }\\n\\n function allocateAxisBoxFirstPhase(axis) {\\n // find the bounding box of the axis by looking at label\\n // widths/heights and ticks, make room by diminishing the\\n // plotOffset; this first phase only looks at one\\n // dimension per axis, the other dimension depends on the\\n // other axes so will have to wait\\n\\n var lw = axis.labelWidth,\\n lh = axis.labelHeight,\\n pos = axis.options.position,\\n isXAxis = axis.direction === \\\"x\\\",\\n tickLength = axis.options.tickLength,\\n axisMargin = options.grid.axisMargin,\\n padding = options.grid.labelMargin,\\n innermost = true,\\n outermost = true,\\n first = true,\\n found = false;\\n\\n // Determine the axis's position in its direction and on its side\\n\\n $.each(isXAxis ? xaxes : yaxes, function(i, a) {\\n if (a && (a.show || a.reserveSpace)) {\\n if (a === axis) {\\n found = true;\\n } else if (a.options.position === pos) {\\n if (found) {\\n outermost = false;\\n } else {\\n innermost = false;\\n }\\n }\\n if (!found) {\\n first = false;\\n }\\n }\\n });\\n\\n // The outermost axis on each side has no margin\\n\\n if (outermost) {\\n axisMargin = 0;\\n }\\n\\n // The ticks for the first axis in each direction stretch across\\n\\n if (tickLength == null) {\\n tickLength = first ? \\\"full\\\" : 5;\\n }\\n\\n if (!isNaN(+tickLength))\\n padding += +tickLength;\\n\\n if (isXAxis) {\\n lh += padding;\\n\\n if (pos == \\\"bottom\\\") {\\n plotOffset.bottom += lh + axisMargin;\\n axis.box = { top: surface.height - plotOffset.bottom, height: lh };\\n }\\n else {\\n axis.box = { top: plotOffset.top + axisMargin, height: lh };\\n plotOffset.top += lh + axisMargin;\\n }\\n }\\n else {\\n lw += padding;\\n\\n if (pos == \\\"left\\\") {\\n axis.box = { left: plotOffset.left + axisMargin, width: lw };\\n plotOffset.left += lw + axisMargin;\\n }\\n else {\\n plotOffset.right += lw + axisMargin;\\n axis.box = { left: surface.width - plotOffset.right, width: lw };\\n }\\n }\\n\\n // save for future reference\\n axis.position = pos;\\n axis.tickLength = tickLength;\\n axis.box.padding = padding;\\n axis.innermost = innermost;\\n }\\n\\n function allocateAxisBoxSecondPhase(axis) {\\n // now that all axis boxes have been placed in one\\n // dimension, we can set the remaining dimension coordinates\\n if (axis.direction == \\\"x\\\") {\\n axis.box.left = plotOffset.left - axis.labelWidth / 2;\\n axis.box.width = surface.width - plotOffset.left - plotOffset.right + axis.labelWidth;\\n }\\n else {\\n axis.box.top = plotOffset.top - axis.labelHeight / 2;\\n axis.box.height = surface.height - plotOffset.bottom - plotOffset.top + axis.labelHeight;\\n }\\n }\\n\\n function adjustLayoutForThingsStickingOut() {\\n // possibly adjust plot offset to ensure everything stays\\n // inside the canvas and isn't clipped off\\n\\n var minMargin = options.grid.minBorderMargin,\\n axis, i;\\n\\n // check stuff from the plot (FIXME: this should just read\\n // a value from the series, otherwise it's impossible to\\n // customize)\\n if (minMargin == null) {\\n minMargin = 0;\\n for (i = 0; i < series.length; ++i)\\n minMargin = Math.max(minMargin, 2 * (series[i].points.radius + series[i].points.lineWidth/2));\\n }\\n\\n var margins = {\\n left: minMargin,\\n right: minMargin,\\n top: minMargin,\\n bottom: minMargin\\n };\\n\\n // check axis labels, note we don't check the actual\\n // labels but instead use the overall width/height to not\\n // jump as much around with replots\\n $.each(allAxes(), function (_, axis) {\\n if (axis.reserveSpace && axis.ticks && axis.ticks.length) {\\n if (axis.direction === \\\"x\\\") {\\n margins.left = Math.max(margins.left, axis.labelWidth / 2);\\n margins.right = Math.max(margins.right, axis.labelWidth / 2);\\n } else {\\n margins.bottom = Math.max(margins.bottom, axis.labelHeight / 2);\\n margins.top = Math.max(margins.top, axis.labelHeight / 2);\\n }\\n }\\n });\\n\\n plotOffset.left = Math.ceil(Math.max(margins.left, plotOffset.left));\\n plotOffset.right = Math.ceil(Math.max(margins.right, plotOffset.right));\\n plotOffset.top = Math.ceil(Math.max(margins.top, plotOffset.top));\\n plotOffset.bottom = Math.ceil(Math.max(margins.bottom, plotOffset.bottom));\\n }\\n\\n function setupGrid() {\\n var i, axes = allAxes(), showGrid = options.grid.show;\\n\\n // Initialize the plot's offset from the edge of the canvas\\n\\n for (var a in plotOffset) {\\n var margin = options.grid.margin || 0;\\n plotOffset[a] = typeof margin == \\\"number\\\" ? margin : margin[a] || 0;\\n }\\n\\n executeHooks(hooks.processOffset, [plotOffset]);\\n\\n // If the grid is visible, add its border width to the offset\\n\\n for (var a in plotOffset) {\\n if(typeof(options.grid.borderWidth) == \\\"object\\\") {\\n plotOffset[a] += showGrid ? options.grid.borderWidth[a] : 0;\\n }\\n else {\\n plotOffset[a] += showGrid ? options.grid.borderWidth : 0;\\n }\\n }\\n\\n $.each(axes, function (_, axis) {\\n var axisOpts = axis.options;\\n axis.show = axisOpts.show == null ? axis.used : axisOpts.show;\\n axis.reserveSpace = axisOpts.reserveSpace == null ? axis.show : axisOpts.reserveSpace;\\n setRange(axis);\\n });\\n\\n if (showGrid) {\\n\\n var allocatedAxes = $.grep(axes, function (axis) {\\n return axis.show || axis.reserveSpace;\\n });\\n\\n $.each(allocatedAxes, function (_, axis) {\\n // make the ticks\\n setupTickGeneration(axis);\\n setTicks(axis);\\n snapRangeToTicks(axis, axis.ticks);\\n // find labelWidth/Height for axis\\n measureTickLabels(axis);\\n });\\n\\n // with all dimensions calculated, we can compute the\\n // axis bounding boxes, start from the outside\\n // (reverse order)\\n for (i = allocatedAxes.length - 1; i >= 0; --i)\\n allocateAxisBoxFirstPhase(allocatedAxes[i]);\\n\\n // make sure we've got enough space for things that\\n // might stick out\\n adjustLayoutForThingsStickingOut();\\n\\n $.each(allocatedAxes, function (_, axis) {\\n allocateAxisBoxSecondPhase(axis);\\n });\\n }\\n\\n plotWidth = surface.width - plotOffset.left - plotOffset.right;\\n plotHeight = surface.height - plotOffset.bottom - plotOffset.top;\\n\\n // now we got the proper plot dimensions, we can compute the scaling\\n $.each(axes, function (_, axis) {\\n setTransformationHelpers(axis);\\n });\\n\\n if (showGrid) {\\n drawAxisLabels();\\n }\\n\\n insertLegend();\\n }\\n\\n function setRange(axis) {\\n var opts = axis.options,\\n min = +(opts.min != null ? opts.min : axis.datamin),\\n max = +(opts.max != null ? opts.max : axis.datamax),\\n delta = max - min;\\n\\n if (delta == 0.0) {\\n // degenerate case\\n var widen = max == 0 ? 1 : 0.01;\\n\\n if (opts.min == null)\\n min -= widen;\\n // always widen max if we couldn't widen min to ensure we\\n // don't fall into min == max which doesn't work\\n if (opts.max == null || opts.min != null)\\n max += widen;\\n }\\n else {\\n // consider autoscaling\\n var margin = opts.autoscaleMargin;\\n if (margin != null) {\\n if (opts.min == null) {\\n min -= delta * margin;\\n // make sure we don't go below zero if all values\\n // are positive\\n if (min < 0 && axis.datamin != null && axis.datamin >= 0)\\n min = 0;\\n }\\n if (opts.max == null) {\\n max += delta * margin;\\n if (max > 0 && axis.datamax != null && axis.datamax <= 0)\\n max = 0;\\n }\\n }\\n }\\n axis.min = min;\\n axis.max = max;\\n }\\n\\n function setupTickGeneration(axis) {\\n var opts = axis.options;\\n\\n // estimate number of ticks\\n var noTicks;\\n if (typeof opts.ticks == \\\"number\\\" && opts.ticks > 0)\\n noTicks = opts.ticks;\\n else\\n // heuristic based on the model a*sqrt(x) fitted to\\n // some data points that seemed reasonable\\n noTicks = 0.3 * Math.sqrt(axis.direction == \\\"x\\\" ? surface.width : surface.height);\\n\\n var delta = (axis.max - axis.min) / noTicks,\\n dec = -Math.floor(Math.log(delta) / Math.LN10),\\n maxDec = opts.tickDecimals;\\n\\n if (maxDec != null && dec > maxDec) {\\n dec = maxDec;\\n }\\n\\n var magn = Math.pow(10, -dec),\\n norm = delta / magn, // norm is between 1.0 and 10.0\\n size;\\n\\n if (norm < 1.5) {\\n size = 1;\\n } else if (norm < 3) {\\n size = 2;\\n // special case for 2.5, requires an extra decimal\\n if (norm > 2.25 && (maxDec == null || dec + 1 <= maxDec)) {\\n size = 2.5;\\n ++dec;\\n }\\n } else if (norm < 7.5) {\\n size = 5;\\n } else {\\n size = 10;\\n }\\n\\n size *= magn;\\n\\n if (opts.minTickSize != null && size < opts.minTickSize) {\\n size = opts.minTickSize;\\n }\\n\\n axis.delta = delta;\\n axis.tickDecimals = Math.max(0, maxDec != null ? maxDec : dec);\\n axis.tickSize = opts.tickSize || size;\\n\\n // Time mode was moved to a plug-in in 0.8, and since so many people use it\\n // we'll add an especially friendly reminder to make sure they included it.\\n\\n if (opts.mode == \\\"time\\\" && !axis.tickGenerator) {\\n throw new Error(\\\"Time mode requires the flot.time plugin.\\\");\\n }\\n\\n // Flot supports base-10 axes; any other mode else is handled by a plug-in,\\n // like flot.time.js.\\n\\n if (!axis.tickGenerator) {\\n\\n axis.tickGenerator = function (axis) {\\n\\n var ticks = [],\\n start = floorInBase(axis.min, axis.tickSize),\\n i = 0,\\n v = Number.NaN,\\n prev;\\n\\n do {\\n prev = v;\\n v = start + i * axis.tickSize;\\n ticks.push(v);\\n ++i;\\n } while (v < axis.max && v != prev);\\n return ticks;\\n };\\n\\n\\t\\t\\t\\taxis.tickFormatter = function (value, axis) {\\n\\n\\t\\t\\t\\t\\tvar factor = axis.tickDecimals ? Math.pow(10, axis.tickDecimals) : 1;\\n\\t\\t\\t\\t\\tvar formatted = \\\"\\\" + Math.round(value * factor) / factor;\\n\\n\\t\\t\\t\\t\\t// If tickDecimals was specified, ensure that we have exactly that\\n\\t\\t\\t\\t\\t// much precision; otherwise default to the value's own precision.\\n\\n\\t\\t\\t\\t\\tif (axis.tickDecimals != null) {\\n\\t\\t\\t\\t\\t\\tvar decimal = formatted.indexOf(\\\".\\\");\\n\\t\\t\\t\\t\\t\\tvar precision = decimal == -1 ? 0 : formatted.length - decimal - 1;\\n\\t\\t\\t\\t\\t\\tif (precision < axis.tickDecimals) {\\n\\t\\t\\t\\t\\t\\t\\treturn (precision ? formatted : formatted + \\\".\\\") + (\\\"\\\" + factor).substr(1, axis.tickDecimals - precision);\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}\\n\\n return formatted;\\n };\\n }\\n\\n if ($.isFunction(opts.tickFormatter))\\n axis.tickFormatter = function (v, axis) { return \\\"\\\" + opts.tickFormatter(v, axis); };\\n\\n if (opts.alignTicksWithAxis != null) {\\n var otherAxis = (axis.direction == \\\"x\\\" ? xaxes : yaxes)[opts.alignTicksWithAxis - 1];\\n if (otherAxis && otherAxis.used && otherAxis != axis) {\\n // consider snapping min/max to outermost nice ticks\\n var niceTicks = axis.tickGenerator(axis);\\n if (niceTicks.length > 0) {\\n if (opts.min == null)\\n axis.min = Math.min(axis.min, niceTicks[0]);\\n if (opts.max == null && niceTicks.length > 1)\\n axis.max = Math.max(axis.max, niceTicks[niceTicks.length - 1]);\\n }\\n\\n axis.tickGenerator = function (axis) {\\n // copy ticks, scaled to this axis\\n var ticks = [], v, i;\\n for (i = 0; i < otherAxis.ticks.length; ++i) {\\n v = (otherAxis.ticks[i].v - otherAxis.min) / (otherAxis.max - otherAxis.min);\\n v = axis.min + v * (axis.max - axis.min);\\n ticks.push(v);\\n }\\n return ticks;\\n };\\n\\n // we might need an extra decimal since forced\\n // ticks don't necessarily fit naturally\\n if (!axis.mode && opts.tickDecimals == null) {\\n var extraDec = Math.max(0, -Math.floor(Math.log(axis.delta) / Math.LN10) + 1),\\n ts = axis.tickGenerator(axis);\\n\\n // only proceed if the tick interval rounded\\n // with an extra decimal doesn't give us a\\n // zero at end\\n if (!(ts.length > 1 && /\\\\..*0$/.test((ts[1] - ts[0]).toFixed(extraDec))))\\n axis.tickDecimals = extraDec;\\n }\\n }\\n }\\n }\\n\\n function setTicks(axis) {\\n var oticks = axis.options.ticks, ticks = [];\\n if (oticks == null || (typeof oticks == \\\"number\\\" && oticks > 0))\\n ticks = axis.tickGenerator(axis);\\n else if (oticks) {\\n if ($.isFunction(oticks))\\n // generate the ticks\\n ticks = oticks(axis);\\n else\\n ticks = oticks;\\n }\\n\\n // clean up/labelify the supplied ticks, copy them over\\n var i, v;\\n axis.ticks = [];\\n for (i = 0; i < ticks.length; ++i) {\\n var label = null;\\n var t = ticks[i];\\n if (typeof t == \\\"object\\\") {\\n v = +t[0];\\n if (t.length > 1)\\n label = t[1];\\n }\\n else\\n v = +t;\\n if (label == null)\\n label = axis.tickFormatter(v, axis);\\n if (!isNaN(v))\\n axis.ticks.push({ v: v, label: label });\\n }\\n }\\n\\n function snapRangeToTicks(axis, ticks) {\\n if (axis.options.autoscaleMargin && ticks.length > 0) {\\n // snap to ticks\\n if (axis.options.min == null)\\n axis.min = Math.min(axis.min, ticks[0].v);\\n if (axis.options.max == null && ticks.length > 1)\\n axis.max = Math.max(axis.max, ticks[ticks.length - 1].v);\\n }\\n }\\n\\n function draw() {\\n\\n surface.clear();\\n\\n executeHooks(hooks.drawBackground, [ctx]);\\n\\n var grid = options.grid;\\n\\n // draw background, if any\\n if (grid.show && grid.backgroundColor)\\n drawBackground();\\n\\n if (grid.show && !grid.aboveData) {\\n drawGrid();\\n }\\n\\n for (var i = 0; i < series.length; ++i) {\\n executeHooks(hooks.drawSeries, [ctx, series[i]]);\\n drawSeries(series[i]);\\n }\\n\\n executeHooks(hooks.draw, [ctx]);\\n\\n if (grid.show && grid.aboveData) {\\n drawGrid();\\n }\\n\\n surface.render();\\n\\n // A draw implies that either the axes or data have changed, so we\\n // should probably update the overlay highlights as well.\\n\\n triggerRedrawOverlay();\\n }\\n\\n function extractRange(ranges, coord) {\\n var axis, from, to, key, axes = allAxes();\\n\\n for (var i = 0; i < axes.length; ++i) {\\n axis = axes[i];\\n if (axis.direction == coord) {\\n key = coord + axis.n + \\\"axis\\\";\\n if (!ranges[key] && axis.n == 1)\\n key = coord + \\\"axis\\\"; // support x1axis as xaxis\\n if (ranges[key]) {\\n from = ranges[key].from;\\n to = ranges[key].to;\\n break;\\n }\\n }\\n }\\n\\n // backwards-compat stuff - to be removed in future\\n if (!ranges[key]) {\\n axis = coord == \\\"x\\\" ? xaxes[0] : yaxes[0];\\n from = ranges[coord + \\\"1\\\"];\\n to = ranges[coord + \\\"2\\\"];\\n }\\n\\n // auto-reverse as an added bonus\\n if (from != null && to != null && from > to) {\\n var tmp = from;\\n from = to;\\n to = tmp;\\n }\\n\\n return { from: from, to: to, axis: axis };\\n }\\n\\n function drawBackground() {\\n ctx.save();\\n ctx.translate(plotOffset.left, plotOffset.top);\\n\\n ctx.fillStyle = getColorOrGradient(options.grid.backgroundColor, plotHeight, 0, \\\"rgba(255, 255, 255, 0)\\\");\\n ctx.fillRect(0, 0, plotWidth, plotHeight);\\n ctx.restore();\\n }\\n\\n function drawGrid() {\\n var i, axes, bw, bc;\\n\\n ctx.save();\\n ctx.translate(plotOffset.left, plotOffset.top);\\n\\n // draw markings\\n var markings = options.grid.markings;\\n if (markings) {\\n if ($.isFunction(markings)) {\\n axes = plot.getAxes();\\n // xmin etc. is backwards compatibility, to be\\n // removed in the future\\n axes.xmin = axes.xaxis.min;\\n axes.xmax = axes.xaxis.max;\\n axes.ymin = axes.yaxis.min;\\n axes.ymax = axes.yaxis.max;\\n\\n markings = markings(axes);\\n }\\n\\n for (i = 0; i < markings.length; ++i) {\\n var m = markings[i],\\n xrange = extractRange(m, \\\"x\\\"),\\n yrange = extractRange(m, \\\"y\\\");\\n\\n // fill in missing\\n if (xrange.from == null)\\n xrange.from = xrange.axis.min;\\n if (xrange.to == null)\\n xrange.to = xrange.axis.max;\\n if (yrange.from == null)\\n yrange.from = yrange.axis.min;\\n if (yrange.to == null)\\n yrange.to = yrange.axis.max;\\n\\n // clip\\n if (xrange.to < xrange.axis.min || xrange.from > xrange.axis.max ||\\n yrange.to < yrange.axis.min || yrange.from > yrange.axis.max)\\n continue;\\n\\n xrange.from = Math.max(xrange.from, xrange.axis.min);\\n xrange.to = Math.min(xrange.to, xrange.axis.max);\\n yrange.from = Math.max(yrange.from, yrange.axis.min);\\n yrange.to = Math.min(yrange.to, yrange.axis.max);\\n\\n var xequal = xrange.from === xrange.to,\\n yequal = yrange.from === yrange.to;\\n\\n if (xequal && yequal) {\\n continue;\\n }\\n\\n // then draw\\n xrange.from = Math.floor(xrange.axis.p2c(xrange.from));\\n xrange.to = Math.floor(xrange.axis.p2c(xrange.to));\\n yrange.from = Math.floor(yrange.axis.p2c(yrange.from));\\n yrange.to = Math.floor(yrange.axis.p2c(yrange.to));\\n\\n if (xequal || yequal) {\\n var lineWidth = m.lineWidth || options.grid.markingsLineWidth,\\n subPixel = lineWidth % 2 ? 0.5 : 0;\\n ctx.beginPath();\\n ctx.strokeStyle = m.color || options.grid.markingsColor;\\n ctx.lineWidth = lineWidth;\\n if (xequal) {\\n ctx.moveTo(xrange.to + subPixel, yrange.from);\\n ctx.lineTo(xrange.to + subPixel, yrange.to);\\n } else {\\n ctx.moveTo(xrange.from, yrange.to + subPixel);\\n ctx.lineTo(xrange.to, yrange.to + subPixel); \\n }\\n ctx.stroke();\\n } else {\\n ctx.fillStyle = m.color || options.grid.markingsColor;\\n ctx.fillRect(xrange.from, yrange.to,\\n xrange.to - xrange.from,\\n yrange.from - yrange.to);\\n }\\n }\\n }\\n\\n // draw the ticks\\n axes = allAxes();\\n bw = options.grid.borderWidth;\\n\\n for (var j = 0; j < axes.length; ++j) {\\n var axis = axes[j], box = axis.box,\\n t = axis.tickLength, x, y, xoff, yoff;\\n if (!axis.show || axis.ticks.length == 0)\\n continue;\\n\\n ctx.lineWidth = 1;\\n\\n // find the edges\\n if (axis.direction == \\\"x\\\") {\\n x = 0;\\n if (t == \\\"full\\\")\\n y = (axis.position == \\\"top\\\" ? 0 : plotHeight);\\n else\\n y = box.top - plotOffset.top + (axis.position == \\\"top\\\" ? box.height : 0);\\n }\\n else {\\n y = 0;\\n if (t == \\\"full\\\")\\n x = (axis.position == \\\"left\\\" ? 0 : plotWidth);\\n else\\n x = box.left - plotOffset.left + (axis.position == \\\"left\\\" ? box.width : 0);\\n }\\n\\n // draw tick bar\\n if (!axis.innermost) {\\n ctx.strokeStyle = axis.options.color;\\n ctx.beginPath();\\n xoff = yoff = 0;\\n if (axis.direction == \\\"x\\\")\\n xoff = plotWidth + 1;\\n else\\n yoff = plotHeight + 1;\\n\\n if (ctx.lineWidth == 1) {\\n if (axis.direction == \\\"x\\\") {\\n y = Math.floor(y) + 0.5;\\n } else {\\n x = Math.floor(x) + 0.5;\\n }\\n }\\n\\n ctx.moveTo(x, y);\\n ctx.lineTo(x + xoff, y + yoff);\\n ctx.stroke();\\n }\\n\\n // draw ticks\\n\\n ctx.strokeStyle = axis.options.tickColor;\\n\\n ctx.beginPath();\\n for (i = 0; i < axis.ticks.length; ++i) {\\n var v = axis.ticks[i].v;\\n\\n xoff = yoff = 0;\\n\\n if (isNaN(v) || v < axis.min || v > axis.max\\n // skip those lying on the axes if we got a border\\n || (t == \\\"full\\\"\\n && ((typeof bw == \\\"object\\\" && bw[axis.position] > 0) || bw > 0)\\n && (v == axis.min || v == axis.max)))\\n continue;\\n\\n if (axis.direction == \\\"x\\\") {\\n x = axis.p2c(v);\\n yoff = t == \\\"full\\\" ? -plotHeight : t;\\n\\n if (axis.position == \\\"top\\\")\\n yoff = -yoff;\\n }\\n else {\\n y = axis.p2c(v);\\n xoff = t == \\\"full\\\" ? -plotWidth : t;\\n\\n if (axis.position == \\\"left\\\")\\n xoff = -xoff;\\n }\\n\\n if (ctx.lineWidth == 1) {\\n if (axis.direction == \\\"x\\\")\\n x = Math.floor(x) + 0.5;\\n else\\n y = Math.floor(y) + 0.5;\\n }\\n\\n ctx.moveTo(x, y);\\n ctx.lineTo(x + xoff, y + yoff);\\n }\\n\\n ctx.stroke();\\n }\\n\\n\\n // draw border\\n if (bw) {\\n // If either borderWidth or borderColor is an object, then draw the border\\n // line by line instead of as one rectangle\\n bc = options.grid.borderColor;\\n if(typeof bw == \\\"object\\\" || typeof bc == \\\"object\\\") {\\n if (typeof bw !== \\\"object\\\") {\\n bw = {top: bw, right: bw, bottom: bw, left: bw};\\n }\\n if (typeof bc !== \\\"object\\\") {\\n bc = {top: bc, right: bc, bottom: bc, left: bc};\\n }\\n\\n if (bw.top > 0) {\\n ctx.strokeStyle = bc.top;\\n ctx.lineWidth = bw.top;\\n ctx.beginPath();\\n ctx.moveTo(0 - bw.left, 0 - bw.top/2);\\n ctx.lineTo(plotWidth, 0 - bw.top/2);\\n ctx.stroke();\\n }\\n\\n if (bw.right > 0) {\\n ctx.strokeStyle = bc.right;\\n ctx.lineWidth = bw.right;\\n ctx.beginPath();\\n ctx.moveTo(plotWidth + bw.right / 2, 0 - bw.top);\\n ctx.lineTo(plotWidth + bw.right / 2, plotHeight);\\n ctx.stroke();\\n }\\n\\n if (bw.bottom > 0) {\\n ctx.strokeStyle = bc.bottom;\\n ctx.lineWidth = bw.bottom;\\n ctx.beginPath();\\n ctx.moveTo(plotWidth + bw.right, plotHeight + bw.bottom / 2);\\n ctx.lineTo(0, plotHeight + bw.bottom / 2);\\n ctx.stroke();\\n }\\n\\n if (bw.left > 0) {\\n ctx.strokeStyle = bc.left;\\n ctx.lineWidth = bw.left;\\n ctx.beginPath();\\n ctx.moveTo(0 - bw.left/2, plotHeight + bw.bottom);\\n ctx.lineTo(0- bw.left/2, 0);\\n ctx.stroke();\\n }\\n }\\n else {\\n ctx.lineWidth = bw;\\n ctx.strokeStyle = options.grid.borderColor;\\n ctx.strokeRect(-bw/2, -bw/2, plotWidth + bw, plotHeight + bw);\\n }\\n }\\n\\n ctx.restore();\\n }\\n\\n function drawAxisLabels() {\\n\\n $.each(allAxes(), function (_, axis) {\\n var box = axis.box,\\n legacyStyles = axis.direction + \\\"Axis \\\" + axis.direction + axis.n + \\\"Axis\\\",\\n layer = \\\"flot-\\\" + axis.direction + \\\"-axis flot-\\\" + axis.direction + axis.n + \\\"-axis \\\" + legacyStyles,\\n font = axis.options.font || \\\"flot-tick-label tickLabel\\\",\\n tick, x, y, halign, valign;\\n\\n // Remove text before checking for axis.show and ticks.length;\\n // otherwise plugins, like flot-tickrotor, that draw their own\\n // tick labels will end up with both theirs and the defaults.\\n\\n surface.removeText(layer);\\n\\n if (!axis.show || axis.ticks.length == 0)\\n return;\\n\\n for (var i = 0; i < axis.ticks.length; ++i) {\\n\\n tick = axis.ticks[i];\\n if (!tick.label || tick.v < axis.min || tick.v > axis.max)\\n continue;\\n\\n if (axis.direction == \\\"x\\\") {\\n halign = \\\"center\\\";\\n x = plotOffset.left + axis.p2c(tick.v);\\n if (axis.position == \\\"bottom\\\") {\\n y = box.top + box.padding;\\n } else {\\n y = box.top + box.height - box.padding;\\n valign = \\\"bottom\\\";\\n }\\n } else {\\n valign = \\\"middle\\\";\\n y = plotOffset.top + axis.p2c(tick.v);\\n if (axis.position == \\\"left\\\") {\\n x = box.left + box.width - box.padding;\\n halign = \\\"right\\\";\\n } else {\\n x = box.left + box.padding;\\n }\\n }\\n\\n surface.addText(layer, x, y, tick.label, font, null, null, halign, valign);\\n }\\n });\\n }\\n\\n function drawSeries(series) {\\n if (series.lines.show)\\n drawSeriesLines(series);\\n if (series.bars.show)\\n drawSeriesBars(series);\\n if (series.points.show)\\n drawSeriesPoints(series);\\n }\\n\\n function drawSeriesLines(series) {\\n function plotLine(datapoints, xoffset, yoffset, axisx, axisy) {\\n var points = datapoints.points,\\n ps = datapoints.pointsize,\\n prevx = null, prevy = null;\\n\\n ctx.beginPath();\\n for (var i = ps; i < points.length; i += ps) {\\n var x1 = points[i - ps], y1 = points[i - ps + 1],\\n x2 = points[i], y2 = points[i + 1];\\n\\n if (x1 == null || x2 == null)\\n continue;\\n\\n // clip with ymin\\n if (y1 <= y2 && y1 < axisy.min) {\\n if (y2 < axisy.min)\\n continue; // line segment is outside\\n // compute new intersection point\\n x1 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1;\\n y1 = axisy.min;\\n }\\n else if (y2 <= y1 && y2 < axisy.min) {\\n if (y1 < axisy.min)\\n continue;\\n x2 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1;\\n y2 = axisy.min;\\n }\\n\\n // clip with ymax\\n if (y1 >= y2 && y1 > axisy.max) {\\n if (y2 > axisy.max)\\n continue;\\n x1 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1;\\n y1 = axisy.max;\\n }\\n else if (y2 >= y1 && y2 > axisy.max) {\\n if (y1 > axisy.max)\\n continue;\\n x2 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1;\\n y2 = axisy.max;\\n }\\n\\n // clip with xmin\\n if (x1 <= x2 && x1 < axisx.min) {\\n if (x2 < axisx.min)\\n continue;\\n y1 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1;\\n x1 = axisx.min;\\n }\\n else if (x2 <= x1 && x2 < axisx.min) {\\n if (x1 < axisx.min)\\n continue;\\n y2 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1;\\n x2 = axisx.min;\\n }\\n\\n // clip with xmax\\n if (x1 >= x2 && x1 > axisx.max) {\\n if (x2 > axisx.max)\\n continue;\\n y1 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1;\\n x1 = axisx.max;\\n }\\n else if (x2 >= x1 && x2 > axisx.max) {\\n if (x1 > axisx.max)\\n continue;\\n y2 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1;\\n x2 = axisx.max;\\n }\\n\\n if (x1 != prevx || y1 != prevy)\\n ctx.moveTo(axisx.p2c(x1) + xoffset, axisy.p2c(y1) + yoffset);\\n\\n prevx = x2;\\n prevy = y2;\\n ctx.lineTo(axisx.p2c(x2) + xoffset, axisy.p2c(y2) + yoffset);\\n }\\n ctx.stroke();\\n }\\n\\n function plotLineArea(datapoints, axisx, axisy) {\\n var points = datapoints.points,\\n ps = datapoints.pointsize,\\n bottom = Math.min(Math.max(0, axisy.min), axisy.max),\\n i = 0, top, areaOpen = false,\\n ypos = 1, segmentStart = 0, segmentEnd = 0;\\n\\n // we process each segment in two turns, first forward\\n // direction to sketch out top, then once we hit the\\n // end we go backwards to sketch the bottom\\n while (true) {\\n if (ps > 0 && i > points.length + ps)\\n break;\\n\\n i += ps; // ps is negative if going backwards\\n\\n var x1 = points[i - ps],\\n y1 = points[i - ps + ypos],\\n x2 = points[i], y2 = points[i + ypos];\\n\\n if (areaOpen) {\\n if (ps > 0 && x1 != null && x2 == null) {\\n // at turning point\\n segmentEnd = i;\\n ps = -ps;\\n ypos = 2;\\n continue;\\n }\\n\\n if (ps < 0 && i == segmentStart + ps) {\\n // done with the reverse sweep\\n ctx.fill();\\n areaOpen = false;\\n ps = -ps;\\n ypos = 1;\\n i = segmentStart = segmentEnd + ps;\\n continue;\\n }\\n }\\n\\n if (x1 == null || x2 == null)\\n continue;\\n\\n // clip x values\\n\\n // clip with xmin\\n if (x1 <= x2 && x1 < axisx.min) {\\n if (x2 < axisx.min)\\n continue;\\n y1 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1;\\n x1 = axisx.min;\\n }\\n else if (x2 <= x1 && x2 < axisx.min) {\\n if (x1 < axisx.min)\\n continue;\\n y2 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1;\\n x2 = axisx.min;\\n }\\n\\n // clip with xmax\\n if (x1 >= x2 && x1 > axisx.max) {\\n if (x2 > axisx.max)\\n continue;\\n y1 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1;\\n x1 = axisx.max;\\n }\\n else if (x2 >= x1 && x2 > axisx.max) {\\n if (x1 > axisx.max)\\n continue;\\n y2 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1;\\n x2 = axisx.max;\\n }\\n\\n if (!areaOpen) {\\n // open area\\n ctx.beginPath();\\n ctx.moveTo(axisx.p2c(x1), axisy.p2c(bottom));\\n areaOpen = true;\\n }\\n\\n // now first check the case where both is outside\\n if (y1 >= axisy.max && y2 >= axisy.max) {\\n ctx.lineTo(axisx.p2c(x1), axisy.p2c(axisy.max));\\n ctx.lineTo(axisx.p2c(x2), axisy.p2c(axisy.max));\\n continue;\\n }\\n else if (y1 <= axisy.min && y2 <= axisy.min) {\\n ctx.lineTo(axisx.p2c(x1), axisy.p2c(axisy.min));\\n ctx.lineTo(axisx.p2c(x2), axisy.p2c(axisy.min));\\n continue;\\n }\\n\\n // else it's a bit more complicated, there might\\n // be a flat maxed out rectangle first, then a\\n // triangular cutout or reverse; to find these\\n // keep track of the current x values\\n var x1old = x1, x2old = x2;\\n\\n // clip the y values, without shortcutting, we\\n // go through all cases in turn\\n\\n // clip with ymin\\n if (y1 <= y2 && y1 < axisy.min && y2 >= axisy.min) {\\n x1 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1;\\n y1 = axisy.min;\\n }\\n else if (y2 <= y1 && y2 < axisy.min && y1 >= axisy.min) {\\n x2 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1;\\n y2 = axisy.min;\\n }\\n\\n // clip with ymax\\n if (y1 >= y2 && y1 > axisy.max && y2 <= axisy.max) {\\n x1 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1;\\n y1 = axisy.max;\\n }\\n else if (y2 >= y1 && y2 > axisy.max && y1 <= axisy.max) {\\n x2 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1;\\n y2 = axisy.max;\\n }\\n\\n // if the x value was changed we got a rectangle\\n // to fill\\n if (x1 != x1old) {\\n ctx.lineTo(axisx.p2c(x1old), axisy.p2c(y1));\\n // it goes to (x1, y1), but we fill that below\\n }\\n\\n // fill triangular section, this sometimes result\\n // in redundant points if (x1, y1) hasn't changed\\n // from previous line to, but we just ignore that\\n ctx.lineTo(axisx.p2c(x1), axisy.p2c(y1));\\n ctx.lineTo(axisx.p2c(x2), axisy.p2c(y2));\\n\\n // fill the other rectangle if it's there\\n if (x2 != x2old) {\\n ctx.lineTo(axisx.p2c(x2), axisy.p2c(y2));\\n ctx.lineTo(axisx.p2c(x2old), axisy.p2c(y2));\\n }\\n }\\n }\\n\\n ctx.save();\\n ctx.translate(plotOffset.left, plotOffset.top);\\n ctx.lineJoin = \\\"round\\\";\\n\\n var lw = series.lines.lineWidth,\\n sw = series.shadowSize;\\n // FIXME: consider another form of shadow when filling is turned on\\n if (lw > 0 && sw > 0) {\\n // draw shadow as a thick and thin line with transparency\\n ctx.lineWidth = sw;\\n ctx.strokeStyle = \\\"rgba(0,0,0,0.1)\\\";\\n // position shadow at angle from the mid of line\\n var angle = Math.PI/18;\\n plotLine(series.datapoints, Math.sin(angle) * (lw/2 + sw/2), Math.cos(angle) * (lw/2 + sw/2), series.xaxis, series.yaxis);\\n ctx.lineWidth = sw/2;\\n plotLine(series.datapoints, Math.sin(angle) * (lw/2 + sw/4), Math.cos(angle) * (lw/2 + sw/4), series.xaxis, series.yaxis);\\n }\\n\\n ctx.lineWidth = lw;\\n ctx.strokeStyle = series.color;\\n var fillStyle = getFillStyle(series.lines, series.color, 0, plotHeight);\\n if (fillStyle) {\\n ctx.fillStyle = fillStyle;\\n plotLineArea(series.datapoints, series.xaxis, series.yaxis);\\n }\\n\\n if (lw > 0)\\n plotLine(series.datapoints, 0, 0, series.xaxis, series.yaxis);\\n ctx.restore();\\n }\\n\\n function drawSeriesPoints(series) {\\n function plotPoints(datapoints, radius, fillStyle, offset, shadow, axisx, axisy, symbol) {\\n var points = datapoints.points, ps = datapoints.pointsize;\\n\\n for (var i = 0; i < points.length; i += ps) {\\n var x = points[i], y = points[i + 1];\\n if (x == null || x < axisx.min || x > axisx.max || y < axisy.min || y > axisy.max)\\n continue;\\n\\n ctx.beginPath();\\n x = axisx.p2c(x);\\n y = axisy.p2c(y) + offset;\\n if (symbol == \\\"circle\\\")\\n ctx.arc(x, y, radius, 0, shadow ? Math.PI : Math.PI * 2, false);\\n else\\n symbol(ctx, x, y, radius, shadow);\\n ctx.closePath();\\n\\n if (fillStyle) {\\n ctx.fillStyle = fillStyle;\\n ctx.fill();\\n }\\n ctx.stroke();\\n }\\n }\\n\\n ctx.save();\\n ctx.translate(plotOffset.left, plotOffset.top);\\n\\n var lw = series.points.lineWidth,\\n sw = series.shadowSize,\\n radius = series.points.radius,\\n symbol = series.points.symbol;\\n\\n // If the user sets the line width to 0, we change it to a very \\n // small value. A line width of 0 seems to force the default of 1.\\n // Doing the conditional here allows the shadow setting to still be \\n // optional even with a lineWidth of 0.\\n\\n if( lw == 0 )\\n lw = 0.0001;\\n\\n if (lw > 0 && sw > 0) {\\n // draw shadow in two steps\\n var w = sw / 2;\\n ctx.lineWidth = w;\\n ctx.strokeStyle = \\\"rgba(0,0,0,0.1)\\\";\\n plotPoints(series.datapoints, radius, null, w + w/2, true,\\n series.xaxis, series.yaxis, symbol);\\n\\n ctx.strokeStyle = \\\"rgba(0,0,0,0.2)\\\";\\n plotPoints(series.datapoints, radius, null, w/2, true,\\n series.xaxis, series.yaxis, symbol);\\n }\\n\\n ctx.lineWidth = lw;\\n ctx.strokeStyle = series.color;\\n plotPoints(series.datapoints, radius,\\n getFillStyle(series.points, series.color), 0, false,\\n series.xaxis, series.yaxis, symbol);\\n ctx.restore();\\n }\\n\\n function drawBar(x, y, b, barLeft, barRight, fillStyleCallback, axisx, axisy, c, horizontal, lineWidth) {\\n var left, right, bottom, top,\\n drawLeft, drawRight, drawTop, drawBottom,\\n tmp;\\n\\n // in horizontal mode, we start the bar from the left\\n // instead of from the bottom so it appears to be\\n // horizontal rather than vertical\\n if (horizontal) {\\n drawBottom = drawRight = drawTop = true;\\n drawLeft = false;\\n left = b;\\n right = x;\\n top = y + barLeft;\\n bottom = y + barRight;\\n\\n // account for negative bars\\n if (right < left) {\\n tmp = right;\\n right = left;\\n left = tmp;\\n drawLeft = true;\\n drawRight = false;\\n }\\n }\\n else {\\n drawLeft = drawRight = drawTop = true;\\n drawBottom = false;\\n left = x + barLeft;\\n right = x + barRight;\\n bottom = b;\\n top = y;\\n\\n // account for negative bars\\n if (top < bottom) {\\n tmp = top;\\n top = bottom;\\n bottom = tmp;\\n drawBottom = true;\\n drawTop = false;\\n }\\n }\\n\\n // clip\\n if (right < axisx.min || left > axisx.max ||\\n top < axisy.min || bottom > axisy.max)\\n return;\\n\\n if (left < axisx.min) {\\n left = axisx.min;\\n drawLeft = false;\\n }\\n\\n if (right > axisx.max) {\\n right = axisx.max;\\n drawRight = false;\\n }\\n\\n if (bottom < axisy.min) {\\n bottom = axisy.min;\\n drawBottom = false;\\n }\\n\\n if (top > axisy.max) {\\n top = axisy.max;\\n drawTop = false;\\n }\\n\\n left = axisx.p2c(left);\\n bottom = axisy.p2c(bottom);\\n right = axisx.p2c(right);\\n top = axisy.p2c(top);\\n\\n // fill the bar\\n if (fillStyleCallback) {\\n c.fillStyle = fillStyleCallback(bottom, top);\\n c.fillRect(left, top, right - left, bottom - top)\\n }\\n\\n // draw outline\\n if (lineWidth > 0 && (drawLeft || drawRight || drawTop || drawBottom)) {\\n c.beginPath();\\n\\n // FIXME: inline moveTo is buggy with excanvas\\n c.moveTo(left, bottom);\\n if (drawLeft)\\n c.lineTo(left, top);\\n else\\n c.moveTo(left, top);\\n if (drawTop)\\n c.lineTo(right, top);\\n else\\n c.moveTo(right, top);\\n if (drawRight)\\n c.lineTo(right, bottom);\\n else\\n c.moveTo(right, bottom);\\n if (drawBottom)\\n c.lineTo(left, bottom);\\n else\\n c.moveTo(left, bottom);\\n c.stroke();\\n }\\n }\\n\\n function drawSeriesBars(series) {\\n function plotBars(datapoints, barLeft, barRight, fillStyleCallback, axisx, axisy) {\\n var points = datapoints.points, ps = datapoints.pointsize;\\n\\n for (var i = 0; i < points.length; i += ps) {\\n if (points[i] == null)\\n continue;\\n drawBar(points[i], points[i + 1], points[i + 2], barLeft, barRight, fillStyleCallback, axisx, axisy, ctx, series.bars.horizontal, series.bars.lineWidth);\\n }\\n }\\n\\n ctx.save();\\n ctx.translate(plotOffset.left, plotOffset.top);\\n\\n // FIXME: figure out a way to add shadows (for instance along the right edge)\\n ctx.lineWidth = series.bars.lineWidth;\\n ctx.strokeStyle = series.color;\\n\\n var barLeft;\\n\\n switch (series.bars.align) {\\n case \\\"left\\\":\\n barLeft = 0;\\n break;\\n case \\\"right\\\":\\n barLeft = -series.bars.barWidth;\\n break;\\n default:\\n barLeft = -series.bars.barWidth / 2;\\n }\\n\\n var fillStyleCallback = series.bars.fill ? function (bottom, top) { return getFillStyle(series.bars, series.color, bottom, top); } : null;\\n plotBars(series.datapoints, barLeft, barLeft + series.bars.barWidth, fillStyleCallback, series.xaxis, series.yaxis);\\n ctx.restore();\\n }\\n\\n function getFillStyle(filloptions, seriesColor, bottom, top) {\\n var fill = filloptions.fill;\\n if (!fill)\\n return null;\\n\\n if (filloptions.fillColor)\\n return getColorOrGradient(filloptions.fillColor, bottom, top, seriesColor);\\n\\n var c = $.color.parse(seriesColor);\\n c.a = typeof fill == \\\"number\\\" ? fill : 0.4;\\n c.normalize();\\n return c.toString();\\n }\\n\\n function insertLegend() {\\n\\n if (options.legend.container != null) {\\n $(options.legend.container).html(\\\"\\\");\\n } else {\\n placeholder.find(\\\".legend\\\").remove();\\n }\\n\\n if (!options.legend.show) {\\n return;\\n }\\n\\n var fragments = [], entries = [], rowStarted = false,\\n lf = options.legend.labelFormatter, s, label;\\n\\n // Build a list of legend entries, with each having a label and a color\\n\\n for (var i = 0; i < series.length; ++i) {\\n s = series[i];\\n if (s.label) {\\n label = lf ? lf(s.label, s) : s.label;\\n if (label) {\\n entries.push({\\n label: label,\\n color: s.color\\n });\\n }\\n }\\n }\\n\\n // Sort the legend using either the default or a custom comparator\\n\\n if (options.legend.sorted) {\\n if ($.isFunction(options.legend.sorted)) {\\n entries.sort(options.legend.sorted);\\n } else if (options.legend.sorted == \\\"reverse\\\") {\\n \\tentries.reverse();\\n } else {\\n var ascending = options.legend.sorted != \\\"descending\\\";\\n entries.sort(function(a, b) {\\n return a.label == b.label ? 0 : (\\n (a.label < b.label) != ascending ? 1 : -1 // Logical XOR\\n );\\n });\\n }\\n }\\n\\n // Generate markup for the list of entries, in their final order\\n\\n for (var i = 0; i < entries.length; ++i) {\\n\\n var entry = entries[i];\\n\\n if (i % options.legend.noColumns == 0) {\\n if (rowStarted)\\n fragments.push('</tr>');\\n fragments.push('<tr>');\\n rowStarted = true;\\n }\\n\\n fragments.push(\\n '<td class=\\\"legendColorBox\\\"><div style=\\\"border:1px solid ' + options.legend.labelBoxBorderColor + ';padding:1px\\\"><div style=\\\"width:4px;height:0;border:5px solid ' + entry.color + ';overflow:hidden\\\"></div></div></td>' +\\n '<td class=\\\"legendLabel\\\">' + entry.label + '</td>'\\n );\\n }\\n\\n if (rowStarted)\\n fragments.push('</tr>');\\n\\n if (fragments.length == 0)\\n return;\\n\\n var table = '<table style=\\\"font-size:smaller;color:' + options.grid.color + '\\\">' + fragments.join(\\\"\\\") + '</table>';\\n if (options.legend.container != null)\\n $(options.legend.container).html(table);\\n else {\\n var pos = \\\"\\\",\\n p = options.legend.position,\\n m = options.legend.margin;\\n if (m[0] == null)\\n m = [m, m];\\n if (p.charAt(0) == \\\"n\\\")\\n pos += 'top:' + (m[1] + plotOffset.top) + 'px;';\\n else if (p.charAt(0) == \\\"s\\\")\\n pos += 'bottom:' + (m[1] + plotOffset.bottom) + 'px;';\\n if (p.charAt(1) == \\\"e\\\")\\n pos += 'right:' + (m[0] + plotOffset.right) + 'px;';\\n else if (p.charAt(1) == \\\"w\\\")\\n pos += 'left:' + (m[0] + plotOffset.left) + 'px;';\\n var legend = $('<div class=\\\"legend\\\">' + table.replace('style=\\\"', 'style=\\\"position:absolute;' + pos +';') + '</div>').appendTo(placeholder);\\n if (options.legend.backgroundOpacity != 0.0) {\\n // put in the transparent background\\n // separately to avoid blended labels and\\n // label boxes\\n var c = options.legend.backgroundColor;\\n if (c == null) {\\n c = options.grid.backgroundColor;\\n if (c && typeof c == \\\"string\\\")\\n c = $.color.parse(c);\\n else\\n c = $.color.extract(legend, 'background-color');\\n c.a = 1;\\n c = c.toString();\\n }\\n var div = legend.children();\\n $('<div style=\\\"position:absolute;width:' + div.width() + 'px;height:' + div.height() + 'px;' + pos +'background-color:' + c + ';\\\"> </div>').prependTo(legend).css('opacity', options.legend.backgroundOpacity);\\n }\\n }\\n }\\n\\n\\n // interactive features\\n\\n var highlights = [],\\n redrawTimeout = null;\\n\\n // returns the data item the mouse is over, or null if none is found\\n function findNearbyItem(mouseX, mouseY, seriesFilter) {\\n var maxDistance = options.grid.mouseActiveRadius,\\n smallestDistance = maxDistance * maxDistance + 1,\\n item = null, foundPoint = false, i, j, ps;\\n\\n for (i = series.length - 1; i >= 0; --i) {\\n if (!seriesFilter(series[i]))\\n continue;\\n\\n var s = series[i],\\n axisx = s.xaxis,\\n axisy = s.yaxis,\\n points = s.datapoints.points,\\n mx = axisx.c2p(mouseX), // precompute some stuff to make the loop faster\\n my = axisy.c2p(mouseY),\\n maxx = maxDistance / axisx.scale,\\n maxy = maxDistance / axisy.scale;\\n\\n ps = s.datapoints.pointsize;\\n // with inverse transforms, we can't use the maxx/maxy\\n // optimization, sadly\\n if (axisx.options.inverseTransform)\\n maxx = Number.MAX_VALUE;\\n if (axisy.options.inverseTransform)\\n maxy = Number.MAX_VALUE;\\n\\n if (s.lines.show || s.points.show) {\\n for (j = 0; j < points.length; j += ps) {\\n var x = points[j], y = points[j + 1];\\n if (x == null)\\n continue;\\n\\n // For points and lines, the cursor must be within a\\n // certain distance to the data point\\n if (x - mx > maxx || x - mx < -maxx ||\\n y - my > maxy || y - my < -maxy)\\n continue;\\n\\n // We have to calculate distances in pixels, not in\\n // data units, because the scales of the axes may be different\\n var dx = Math.abs(axisx.p2c(x) - mouseX),\\n dy = Math.abs(axisy.p2c(y) - mouseY),\\n dist = dx * dx + dy * dy; // we save the sqrt\\n\\n // use <= to ensure last point takes precedence\\n // (last generally means on top of)\\n if (dist < smallestDistance) {\\n smallestDistance = dist;\\n item = [i, j / ps];\\n }\\n }\\n }\\n\\n if (s.bars.show && !item) { // no other point can be nearby\\n\\n var barLeft, barRight;\\n\\n switch (s.bars.align) {\\n case \\\"left\\\":\\n barLeft = 0;\\n break;\\n case \\\"right\\\":\\n barLeft = -s.bars.barWidth;\\n break;\\n default:\\n barLeft = -s.bars.barWidth / 2;\\n }\\n\\n barRight = barLeft + s.bars.barWidth;\\n\\n for (j = 0; j < points.length; j += ps) {\\n var x = points[j], y = points[j + 1], b = points[j + 2];\\n if (x == null)\\n continue;\\n\\n // for a bar graph, the cursor must be inside the bar\\n if (series[i].bars.horizontal ?\\n (mx <= Math.max(b, x) && mx >= Math.min(b, x) &&\\n my >= y + barLeft && my <= y + barRight) :\\n (mx >= x + barLeft && mx <= x + barRight &&\\n my >= Math.min(b, y) && my <= Math.max(b, y)))\\n item = [i, j / ps];\\n }\\n }\\n }\\n\\n if (item) {\\n i = item[0];\\n j = item[1];\\n ps = series[i].datapoints.pointsize;\\n\\n return { datapoint: series[i].datapoints.points.slice(j * ps, (j + 1) * ps),\\n dataIndex: j,\\n series: series[i],\\n seriesIndex: i };\\n }\\n\\n return null;\\n }\\n\\n function onMouseMove(e) {\\n if (options.grid.hoverable)\\n triggerClickHoverEvent(\\\"plothover\\\", e,\\n function (s) { return s[\\\"hoverable\\\"] != false; });\\n }\\n\\n function onMouseLeave(e) {\\n if (options.grid.hoverable)\\n triggerClickHoverEvent(\\\"plothover\\\", e,\\n function (s) { return false; });\\n }\\n\\n function onClick(e) {\\n triggerClickHoverEvent(\\\"plotclick\\\", e,\\n function (s) { return s[\\\"clickable\\\"] != false; });\\n }\\n\\n // trigger click or hover event (they send the same parameters\\n // so we share their code)\\n function triggerClickHoverEvent(eventname, event, seriesFilter) {\\n var offset = eventHolder.offset(),\\n canvasX = event.pageX - offset.left - plotOffset.left,\\n canvasY = event.pageY - offset.top - plotOffset.top,\\n pos = canvasToAxisCoords({ left: canvasX, top: canvasY });\\n\\n pos.pageX = event.pageX;\\n pos.pageY = event.pageY;\\n\\n var item = findNearbyItem(canvasX, canvasY, seriesFilter);\\n\\n if (item) {\\n // fill in mouse pos for any listeners out there\\n item.pageX = parseInt(item.series.xaxis.p2c(item.datapoint[0]) + offset.left + plotOffset.left, 10);\\n item.pageY = parseInt(item.series.yaxis.p2c(item.datapoint[1]) + offset.top + plotOffset.top, 10);\\n }\\n\\n if (options.grid.autoHighlight) {\\n // clear auto-highlights\\n for (var i = 0; i < highlights.length; ++i) {\\n var h = highlights[i];\\n if (h.auto == eventname &&\\n !(item && h.series == item.series &&\\n h.point[0] == item.datapoint[0] &&\\n h.point[1] == item.datapoint[1]))\\n unhighlight(h.series, h.point);\\n }\\n\\n if (item)\\n highlight(item.series, item.datapoint, eventname);\\n }\\n\\n placeholder.trigger(eventname, [ pos, item ]);\\n }\\n\\n function triggerRedrawOverlay() {\\n var t = options.interaction.redrawOverlayInterval;\\n if (t == -1) { // skip event queue\\n drawOverlay();\\n return;\\n }\\n\\n if (!redrawTimeout)\\n redrawTimeout = setTimeout(drawOverlay, t);\\n }\\n\\n function drawOverlay() {\\n redrawTimeout = null;\\n\\n // draw highlights\\n octx.save();\\n overlay.clear();\\n octx.translate(plotOffset.left, plotOffset.top);\\n\\n var i, hi;\\n for (i = 0; i < highlights.length; ++i) {\\n hi = highlights[i];\\n\\n if (hi.series.bars.show)\\n drawBarHighlight(hi.series, hi.point);\\n else\\n drawPointHighlight(hi.series, hi.point);\\n }\\n octx.restore();\\n\\n executeHooks(hooks.drawOverlay, [octx]);\\n }\\n\\n function highlight(s, point, auto) {\\n if (typeof s == \\\"number\\\")\\n s = series[s];\\n\\n if (typeof point == \\\"number\\\") {\\n var ps = s.datapoints.pointsize;\\n point = s.datapoints.points.slice(ps * point, ps * (point + 1));\\n }\\n\\n var i = indexOfHighlight(s, point);\\n if (i == -1) {\\n highlights.push({ series: s, point: point, auto: auto });\\n\\n triggerRedrawOverlay();\\n }\\n else if (!auto)\\n highlights[i].auto = false;\\n }\\n\\n function unhighlight(s, point) {\\n if (s == null && point == null) {\\n highlights = [];\\n triggerRedrawOverlay();\\n return;\\n }\\n\\n if (typeof s == \\\"number\\\")\\n s = series[s];\\n\\n if (typeof point == \\\"number\\\") {\\n var ps = s.datapoints.pointsize;\\n point = s.datapoints.points.slice(ps * point, ps * (point + 1));\\n }\\n\\n var i = indexOfHighlight(s, point);\\n if (i != -1) {\\n highlights.splice(i, 1);\\n\\n triggerRedrawOverlay();\\n }\\n }\\n\\n function indexOfHighlight(s, p) {\\n for (var i = 0; i < highlights.length; ++i) {\\n var h = highlights[i];\\n if (h.series == s && h.point[0] == p[0]\\n && h.point[1] == p[1])\\n return i;\\n }\\n return -1;\\n }\\n\\n function drawPointHighlight(series, point) {\\n var x = point[0], y = point[1],\\n axisx = series.xaxis, axisy = series.yaxis,\\n highlightColor = (typeof series.highlightColor === \\\"string\\\") ? series.highlightColor : $.color.parse(series.color).scale('a', 0.5).toString();\\n\\n if (x < axisx.min || x > axisx.max || y < axisy.min || y > axisy.max)\\n return;\\n\\n var pointRadius = series.points.radius + series.points.lineWidth / 2;\\n octx.lineWidth = pointRadius;\\n octx.strokeStyle = highlightColor;\\n var radius = 1.5 * pointRadius;\\n x = axisx.p2c(x);\\n y = axisy.p2c(y);\\n\\n octx.beginPath();\\n if (series.points.symbol == \\\"circle\\\")\\n octx.arc(x, y, radius, 0, 2 * Math.PI, false);\\n else\\n series.points.symbol(octx, x, y, radius, false);\\n octx.closePath();\\n octx.stroke();\\n }\\n\\n function drawBarHighlight(series, point) {\\n var highlightColor = (typeof series.highlightColor === \\\"string\\\") ? series.highlightColor : $.color.parse(series.color).scale('a', 0.5).toString(),\\n fillStyle = highlightColor,\\n barLeft;\\n\\n switch (series.bars.align) {\\n case \\\"left\\\":\\n barLeft = 0;\\n break;\\n case \\\"right\\\":\\n barLeft = -series.bars.barWidth;\\n break;\\n default:\\n barLeft = -series.bars.barWidth / 2;\\n }\\n\\n octx.lineWidth = series.bars.lineWidth;\\n octx.strokeStyle = highlightColor;\\n\\n drawBar(point[0], point[1], point[2] || 0, barLeft, barLeft + series.bars.barWidth,\\n function () { return fillStyle; }, series.xaxis, series.yaxis, octx, series.bars.horizontal, series.bars.lineWidth);\\n }\\n\\n function getColorOrGradient(spec, bottom, top, defaultColor) {\\n if (typeof spec == \\\"string\\\")\\n return spec;\\n else {\\n // assume this is a gradient spec; IE currently only\\n // supports a simple vertical gradient properly, so that's\\n // what we support too\\n var gradient = ctx.createLinearGradient(0, top, 0, bottom);\\n\\n for (var i = 0, l = spec.colors.length; i < l; ++i) {\\n var c = spec.colors[i];\\n if (typeof c != \\\"string\\\") {\\n var co = $.color.parse(defaultColor);\\n if (c.brightness != null)\\n co = co.scale('rgb', c.brightness);\\n if (c.opacity != null)\\n co.a *= c.opacity;\\n c = co.toString();\\n }\\n gradient.addColorStop(i / (l - 1), c);\\n }\\n\\n return gradient;\\n }\\n }\\n }\\n\\n // Add the plot function to the top level of the jQuery object\\n\\n $.plot = function(placeholder, data, options) {\\n //var t0 = new Date();\\n var plot = new Plot($(placeholder), data, options, $.plot.plugins);\\n //(window.console ? console.log : alert)(\\\"time used (msecs): \\\" + ((new Date()).getTime() - t0.getTime()));\\n return plot;\\n };\\n\\n $.plot.version = \\\"0.8.3\\\";\\n\\n $.plot.plugins = [];\\n\\n // Also add the plot function as a chainable property\\n\\n $.fn.plot = function(data, options) {\\n return this.each(function() {\\n $.plot(this, data, options);\\n });\\n };\\n\\n // round to nearby lower multiple of base\\n function floorInBase(n, base) {\\n return base * Math.floor(n / base);\\n }\\n\\n})(jQuery);\\n\"\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/raw-loader!./src/assets/inspinia/plugins/flot/jquery.flot.js\n// module id = 2206\n// module chunks = 1","require(\"!!/opt/atlassian/pipelines/agent/build/node_modules/script-loader/addScript.js\")(require(\"!!/opt/atlassian/pipelines/agent/build/node_modules/raw-loader/index.js!/opt/atlassian/pipelines/agent/build/src/assets/inspinia/plugins/flot/jquery.flot.time.js\"))\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/script-loader!./src/assets/inspinia/plugins/flot/jquery.flot.time.js\n// module id = 2207\n// module chunks = 1","module.exports = \"/* Pretty handling of time axes.\\n\\nCopyright (c) 2007-2014 IOLA and Ole Laursen.\\nLicensed under the MIT license.\\n\\nSet axis.mode to \\\"time\\\" to enable. See the section \\\"Time series data\\\" in\\nAPI.txt for details.\\n\\n*/\\n\\n(function($) {\\n\\n\\tvar options = {\\n\\t\\txaxis: {\\n\\t\\t\\ttimezone: null,\\t\\t// \\\"browser\\\" for local to the client or timezone for timezone-js\\n\\t\\t\\ttimeformat: null,\\t// format string to use\\n\\t\\t\\ttwelveHourClock: false,\\t// 12 or 24 time in time mode\\n\\t\\t\\tmonthNames: null\\t// list of names of months\\n\\t\\t}\\n\\t};\\n\\n\\t// round to nearby lower multiple of base\\n\\n\\tfunction floorInBase(n, base) {\\n\\t\\treturn base * Math.floor(n / base);\\n\\t}\\n\\n\\t// Returns a string with the date d formatted according to fmt.\\n\\t// A subset of the Open Group's strftime format is supported.\\n\\n\\tfunction formatDate(d, fmt, monthNames, dayNames) {\\n\\n\\t\\tif (typeof d.strftime == \\\"function\\\") {\\n\\t\\t\\treturn d.strftime(fmt);\\n\\t\\t}\\n\\n\\t\\tvar leftPad = function(n, pad) {\\n\\t\\t\\tn = \\\"\\\" + n;\\n\\t\\t\\tpad = \\\"\\\" + (pad == null ? \\\"0\\\" : pad);\\n\\t\\t\\treturn n.length == 1 ? pad + n : n;\\n\\t\\t};\\n\\n\\t\\tvar r = [];\\n\\t\\tvar escape = false;\\n\\t\\tvar hours = d.getHours();\\n\\t\\tvar isAM = hours < 12;\\n\\n\\t\\tif (monthNames == null) {\\n\\t\\t\\tmonthNames = [\\\"Jan\\\", \\\"Feb\\\", \\\"Mar\\\", \\\"Apr\\\", \\\"May\\\", \\\"Jun\\\", \\\"Jul\\\", \\\"Aug\\\", \\\"Sep\\\", \\\"Oct\\\", \\\"Nov\\\", \\\"Dec\\\"];\\n\\t\\t}\\n\\n\\t\\tif (dayNames == null) {\\n\\t\\t\\tdayNames = [\\\"Sun\\\", \\\"Mon\\\", \\\"Tue\\\", \\\"Wed\\\", \\\"Thu\\\", \\\"Fri\\\", \\\"Sat\\\"];\\n\\t\\t}\\n\\n\\t\\tvar hours12;\\n\\n\\t\\tif (hours > 12) {\\n\\t\\t\\thours12 = hours - 12;\\n\\t\\t} else if (hours == 0) {\\n\\t\\t\\thours12 = 12;\\n\\t\\t} else {\\n\\t\\t\\thours12 = hours;\\n\\t\\t}\\n\\n\\t\\tfor (var i = 0; i < fmt.length; ++i) {\\n\\n\\t\\t\\tvar c = fmt.charAt(i);\\n\\n\\t\\t\\tif (escape) {\\n\\t\\t\\t\\tswitch (c) {\\n\\t\\t\\t\\t\\tcase 'a': c = \\\"\\\" + dayNames[d.getDay()]; break;\\n\\t\\t\\t\\t\\tcase 'b': c = \\\"\\\" + monthNames[d.getMonth()]; break;\\n\\t\\t\\t\\t\\tcase 'd': c = leftPad(d.getDate()); break;\\n\\t\\t\\t\\t\\tcase 'e': c = leftPad(d.getDate(), \\\" \\\"); break;\\n\\t\\t\\t\\t\\tcase 'h':\\t// For back-compat with 0.7; remove in 1.0\\n\\t\\t\\t\\t\\tcase 'H': c = leftPad(hours); break;\\n\\t\\t\\t\\t\\tcase 'I': c = leftPad(hours12); break;\\n\\t\\t\\t\\t\\tcase 'l': c = leftPad(hours12, \\\" \\\"); break;\\n\\t\\t\\t\\t\\tcase 'm': c = leftPad(d.getMonth() + 1); break;\\n\\t\\t\\t\\t\\tcase 'M': c = leftPad(d.getMinutes()); break;\\n\\t\\t\\t\\t\\t// quarters not in Open Group's strftime specification\\n\\t\\t\\t\\t\\tcase 'q':\\n\\t\\t\\t\\t\\t\\tc = \\\"\\\" + (Math.floor(d.getMonth() / 3) + 1); break;\\n\\t\\t\\t\\t\\tcase 'S': c = leftPad(d.getSeconds()); break;\\n\\t\\t\\t\\t\\tcase 'y': c = leftPad(d.getFullYear() % 100); break;\\n\\t\\t\\t\\t\\tcase 'Y': c = \\\"\\\" + d.getFullYear(); break;\\n\\t\\t\\t\\t\\tcase 'p': c = (isAM) ? (\\\"\\\" + \\\"am\\\") : (\\\"\\\" + \\\"pm\\\"); break;\\n\\t\\t\\t\\t\\tcase 'P': c = (isAM) ? (\\\"\\\" + \\\"AM\\\") : (\\\"\\\" + \\\"PM\\\"); break;\\n\\t\\t\\t\\t\\tcase 'w': c = \\\"\\\" + d.getDay(); break;\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tr.push(c);\\n\\t\\t\\t\\tescape = false;\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tif (c == \\\"%\\\") {\\n\\t\\t\\t\\t\\tescape = true;\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\tr.push(c);\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\treturn r.join(\\\"\\\");\\n\\t}\\n\\n\\t// To have a consistent view of time-based data independent of which time\\n\\t// zone the client happens to be in we need a date-like object independent\\n\\t// of time zones. This is done through a wrapper that only calls the UTC\\n\\t// versions of the accessor methods.\\n\\n\\tfunction makeUtcWrapper(d) {\\n\\n\\t\\tfunction addProxyMethod(sourceObj, sourceMethod, targetObj, targetMethod) {\\n\\t\\t\\tsourceObj[sourceMethod] = function() {\\n\\t\\t\\t\\treturn targetObj[targetMethod].apply(targetObj, arguments);\\n\\t\\t\\t};\\n\\t\\t};\\n\\n\\t\\tvar utc = {\\n\\t\\t\\tdate: d\\n\\t\\t};\\n\\n\\t\\t// support strftime, if found\\n\\n\\t\\tif (d.strftime != undefined) {\\n\\t\\t\\taddProxyMethod(utc, \\\"strftime\\\", d, \\\"strftime\\\");\\n\\t\\t}\\n\\n\\t\\taddProxyMethod(utc, \\\"getTime\\\", d, \\\"getTime\\\");\\n\\t\\taddProxyMethod(utc, \\\"setTime\\\", d, \\\"setTime\\\");\\n\\n\\t\\tvar props = [\\\"Date\\\", \\\"Day\\\", \\\"FullYear\\\", \\\"Hours\\\", \\\"Milliseconds\\\", \\\"Minutes\\\", \\\"Month\\\", \\\"Seconds\\\"];\\n\\n\\t\\tfor (var p = 0; p < props.length; p++) {\\n\\t\\t\\taddProxyMethod(utc, \\\"get\\\" + props[p], d, \\\"getUTC\\\" + props[p]);\\n\\t\\t\\taddProxyMethod(utc, \\\"set\\\" + props[p], d, \\\"setUTC\\\" + props[p]);\\n\\t\\t}\\n\\n\\t\\treturn utc;\\n\\t};\\n\\n\\t// select time zone strategy. This returns a date-like object tied to the\\n\\t// desired timezone\\n\\n\\tfunction dateGenerator(ts, opts) {\\n\\t\\tif (opts.timezone == \\\"browser\\\") {\\n\\t\\t\\treturn new Date(ts);\\n\\t\\t} else if (!opts.timezone || opts.timezone == \\\"utc\\\") {\\n\\t\\t\\treturn makeUtcWrapper(new Date(ts));\\n\\t\\t} else if (typeof timezoneJS != \\\"undefined\\\" && typeof timezoneJS.Date != \\\"undefined\\\") {\\n\\t\\t\\tvar d = new timezoneJS.Date();\\n\\t\\t\\t// timezone-js is fickle, so be sure to set the time zone before\\n\\t\\t\\t// setting the time.\\n\\t\\t\\td.setTimezone(opts.timezone);\\n\\t\\t\\td.setTime(ts);\\n\\t\\t\\treturn d;\\n\\t\\t} else {\\n\\t\\t\\treturn makeUtcWrapper(new Date(ts));\\n\\t\\t}\\n\\t}\\n\\t\\n\\t// map of app. size of time units in milliseconds\\n\\n\\tvar timeUnitSize = {\\n\\t\\t\\\"second\\\": 1000,\\n\\t\\t\\\"minute\\\": 60 * 1000,\\n\\t\\t\\\"hour\\\": 60 * 60 * 1000,\\n\\t\\t\\\"day\\\": 24 * 60 * 60 * 1000,\\n\\t\\t\\\"month\\\": 30 * 24 * 60 * 60 * 1000,\\n\\t\\t\\\"quarter\\\": 3 * 30 * 24 * 60 * 60 * 1000,\\n\\t\\t\\\"year\\\": 365.2425 * 24 * 60 * 60 * 1000\\n\\t};\\n\\n\\t// the allowed tick sizes, after 1 year we use\\n\\t// an integer algorithm\\n\\n\\tvar baseSpec = [\\n\\t\\t[1, \\\"second\\\"], [2, \\\"second\\\"], [5, \\\"second\\\"], [10, \\\"second\\\"],\\n\\t\\t[30, \\\"second\\\"], \\n\\t\\t[1, \\\"minute\\\"], [2, \\\"minute\\\"], [5, \\\"minute\\\"], [10, \\\"minute\\\"],\\n\\t\\t[30, \\\"minute\\\"], \\n\\t\\t[1, \\\"hour\\\"], [2, \\\"hour\\\"], [4, \\\"hour\\\"],\\n\\t\\t[8, \\\"hour\\\"], [12, \\\"hour\\\"],\\n\\t\\t[1, \\\"day\\\"], [2, \\\"day\\\"], [3, \\\"day\\\"],\\n\\t\\t[0.25, \\\"month\\\"], [0.5, \\\"month\\\"], [1, \\\"month\\\"],\\n\\t\\t[2, \\\"month\\\"]\\n\\t];\\n\\n\\t// we don't know which variant(s) we'll need yet, but generating both is\\n\\t// cheap\\n\\n\\tvar specMonths = baseSpec.concat([[3, \\\"month\\\"], [6, \\\"month\\\"],\\n\\t\\t[1, \\\"year\\\"]]);\\n\\tvar specQuarters = baseSpec.concat([[1, \\\"quarter\\\"], [2, \\\"quarter\\\"],\\n\\t\\t[1, \\\"year\\\"]]);\\n\\n\\tfunction init(plot) {\\n\\t\\tplot.hooks.processOptions.push(function (plot, options) {\\n\\t\\t\\t$.each(plot.getAxes(), function(axisName, axis) {\\n\\n\\t\\t\\t\\tvar opts = axis.options;\\n\\n\\t\\t\\t\\tif (opts.mode == \\\"time\\\") {\\n\\t\\t\\t\\t\\taxis.tickGenerator = function(axis) {\\n\\n\\t\\t\\t\\t\\t\\tvar ticks = [];\\n\\t\\t\\t\\t\\t\\tvar d = dateGenerator(axis.min, opts);\\n\\t\\t\\t\\t\\t\\tvar minSize = 0;\\n\\n\\t\\t\\t\\t\\t\\t// make quarter use a possibility if quarters are\\n\\t\\t\\t\\t\\t\\t// mentioned in either of these options\\n\\n\\t\\t\\t\\t\\t\\tvar spec = (opts.tickSize && opts.tickSize[1] ===\\n\\t\\t\\t\\t\\t\\t\\t\\\"quarter\\\") ||\\n\\t\\t\\t\\t\\t\\t\\t(opts.minTickSize && opts.minTickSize[1] ===\\n\\t\\t\\t\\t\\t\\t\\t\\\"quarter\\\") ? specQuarters : specMonths;\\n\\n\\t\\t\\t\\t\\t\\tif (opts.minTickSize != null) {\\n\\t\\t\\t\\t\\t\\t\\tif (typeof opts.tickSize == \\\"number\\\") {\\n\\t\\t\\t\\t\\t\\t\\t\\tminSize = opts.tickSize;\\n\\t\\t\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\t\\t\\tminSize = opts.minTickSize[0] * timeUnitSize[opts.minTickSize[1]];\\n\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\t\\tfor (var i = 0; i < spec.length - 1; ++i) {\\n\\t\\t\\t\\t\\t\\t\\tif (axis.delta < (spec[i][0] * timeUnitSize[spec[i][1]]\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t + spec[i + 1][0] * timeUnitSize[spec[i + 1][1]]) / 2\\n\\t\\t\\t\\t\\t\\t\\t\\t&& spec[i][0] * timeUnitSize[spec[i][1]] >= minSize) {\\n\\t\\t\\t\\t\\t\\t\\t\\tbreak;\\n\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\t\\tvar size = spec[i][0];\\n\\t\\t\\t\\t\\t\\tvar unit = spec[i][1];\\n\\n\\t\\t\\t\\t\\t\\t// special-case the possibility of several years\\n\\n\\t\\t\\t\\t\\t\\tif (unit == \\\"year\\\") {\\n\\n\\t\\t\\t\\t\\t\\t\\t// if given a minTickSize in years, just use it,\\n\\t\\t\\t\\t\\t\\t\\t// ensuring that it's an integer\\n\\n\\t\\t\\t\\t\\t\\t\\tif (opts.minTickSize != null && opts.minTickSize[1] == \\\"year\\\") {\\n\\t\\t\\t\\t\\t\\t\\t\\tsize = Math.floor(opts.minTickSize[0]);\\n\\t\\t\\t\\t\\t\\t\\t} else {\\n\\n\\t\\t\\t\\t\\t\\t\\t\\tvar magn = Math.pow(10, Math.floor(Math.log(axis.delta / timeUnitSize.year) / Math.LN10));\\n\\t\\t\\t\\t\\t\\t\\t\\tvar norm = (axis.delta / timeUnitSize.year) / magn;\\n\\n\\t\\t\\t\\t\\t\\t\\t\\tif (norm < 1.5) {\\n\\t\\t\\t\\t\\t\\t\\t\\t\\tsize = 1;\\n\\t\\t\\t\\t\\t\\t\\t\\t} else if (norm < 3) {\\n\\t\\t\\t\\t\\t\\t\\t\\t\\tsize = 2;\\n\\t\\t\\t\\t\\t\\t\\t\\t} else if (norm < 7.5) {\\n\\t\\t\\t\\t\\t\\t\\t\\t\\tsize = 5;\\n\\t\\t\\t\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\t\\t\\t\\tsize = 10;\\n\\t\\t\\t\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\t\\t\\t\\tsize *= magn;\\n\\t\\t\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\t\\t\\t// minimum size for years is 1\\n\\n\\t\\t\\t\\t\\t\\t\\tif (size < 1) {\\n\\t\\t\\t\\t\\t\\t\\t\\tsize = 1;\\n\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\t\\taxis.tickSize = opts.tickSize || [size, unit];\\n\\t\\t\\t\\t\\t\\tvar tickSize = axis.tickSize[0];\\n\\t\\t\\t\\t\\t\\tunit = axis.tickSize[1];\\n\\n\\t\\t\\t\\t\\t\\tvar step = tickSize * timeUnitSize[unit];\\n\\n\\t\\t\\t\\t\\t\\tif (unit == \\\"second\\\") {\\n\\t\\t\\t\\t\\t\\t\\td.setSeconds(floorInBase(d.getSeconds(), tickSize));\\n\\t\\t\\t\\t\\t\\t} else if (unit == \\\"minute\\\") {\\n\\t\\t\\t\\t\\t\\t\\td.setMinutes(floorInBase(d.getMinutes(), tickSize));\\n\\t\\t\\t\\t\\t\\t} else if (unit == \\\"hour\\\") {\\n\\t\\t\\t\\t\\t\\t\\td.setHours(floorInBase(d.getHours(), tickSize));\\n\\t\\t\\t\\t\\t\\t} else if (unit == \\\"month\\\") {\\n\\t\\t\\t\\t\\t\\t\\td.setMonth(floorInBase(d.getMonth(), tickSize));\\n\\t\\t\\t\\t\\t\\t} else if (unit == \\\"quarter\\\") {\\n\\t\\t\\t\\t\\t\\t\\td.setMonth(3 * floorInBase(d.getMonth() / 3,\\n\\t\\t\\t\\t\\t\\t\\t\\ttickSize));\\n\\t\\t\\t\\t\\t\\t} else if (unit == \\\"year\\\") {\\n\\t\\t\\t\\t\\t\\t\\td.setFullYear(floorInBase(d.getFullYear(), tickSize));\\n\\t\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\t\\t// reset smaller components\\n\\n\\t\\t\\t\\t\\t\\td.setMilliseconds(0);\\n\\n\\t\\t\\t\\t\\t\\tif (step >= timeUnitSize.minute) {\\n\\t\\t\\t\\t\\t\\t\\td.setSeconds(0);\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\tif (step >= timeUnitSize.hour) {\\n\\t\\t\\t\\t\\t\\t\\td.setMinutes(0);\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\tif (step >= timeUnitSize.day) {\\n\\t\\t\\t\\t\\t\\t\\td.setHours(0);\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\tif (step >= timeUnitSize.day * 4) {\\n\\t\\t\\t\\t\\t\\t\\td.setDate(1);\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\tif (step >= timeUnitSize.month * 2) {\\n\\t\\t\\t\\t\\t\\t\\td.setMonth(floorInBase(d.getMonth(), 3));\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\tif (step >= timeUnitSize.quarter * 2) {\\n\\t\\t\\t\\t\\t\\t\\td.setMonth(floorInBase(d.getMonth(), 6));\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\tif (step >= timeUnitSize.year) {\\n\\t\\t\\t\\t\\t\\t\\td.setMonth(0);\\n\\t\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\t\\tvar carry = 0;\\n\\t\\t\\t\\t\\t\\tvar v = Number.NaN;\\n\\t\\t\\t\\t\\t\\tvar prev;\\n\\n\\t\\t\\t\\t\\t\\tdo {\\n\\n\\t\\t\\t\\t\\t\\t\\tprev = v;\\n\\t\\t\\t\\t\\t\\t\\tv = d.getTime();\\n\\t\\t\\t\\t\\t\\t\\tticks.push(v);\\n\\n\\t\\t\\t\\t\\t\\t\\tif (unit == \\\"month\\\" || unit == \\\"quarter\\\") {\\n\\t\\t\\t\\t\\t\\t\\t\\tif (tickSize < 1) {\\n\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t// a bit complicated - we'll divide the\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t// month/quarter up but we need to take\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t// care of fractions so we don't end up in\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t// the middle of a day\\n\\n\\t\\t\\t\\t\\t\\t\\t\\t\\td.setDate(1);\\n\\t\\t\\t\\t\\t\\t\\t\\t\\tvar start = d.getTime();\\n\\t\\t\\t\\t\\t\\t\\t\\t\\td.setMonth(d.getMonth() +\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t(unit == \\\"quarter\\\" ? 3 : 1));\\n\\t\\t\\t\\t\\t\\t\\t\\t\\tvar end = d.getTime();\\n\\t\\t\\t\\t\\t\\t\\t\\t\\td.setTime(v + carry * timeUnitSize.hour + (end - start) * tickSize);\\n\\t\\t\\t\\t\\t\\t\\t\\t\\tcarry = d.getHours();\\n\\t\\t\\t\\t\\t\\t\\t\\t\\td.setHours(0);\\n\\t\\t\\t\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\t\\t\\t\\td.setMonth(d.getMonth() +\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\ttickSize * (unit == \\\"quarter\\\" ? 3 : 1));\\n\\t\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t\\t} else if (unit == \\\"year\\\") {\\n\\t\\t\\t\\t\\t\\t\\t\\td.setFullYear(d.getFullYear() + tickSize);\\n\\t\\t\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\t\\t\\td.setTime(v + step);\\n\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t} while (v < axis.max && v != prev);\\n\\n\\t\\t\\t\\t\\t\\treturn ticks;\\n\\t\\t\\t\\t\\t};\\n\\n\\t\\t\\t\\t\\taxis.tickFormatter = function (v, axis) {\\n\\n\\t\\t\\t\\t\\t\\tvar d = dateGenerator(v, axis.options);\\n\\n\\t\\t\\t\\t\\t\\t// first check global format\\n\\n\\t\\t\\t\\t\\t\\tif (opts.timeformat != null) {\\n\\t\\t\\t\\t\\t\\t\\treturn formatDate(d, opts.timeformat, opts.monthNames, opts.dayNames);\\n\\t\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\t\\t// possibly use quarters if quarters are mentioned in\\n\\t\\t\\t\\t\\t\\t// any of these places\\n\\n\\t\\t\\t\\t\\t\\tvar useQuarters = (axis.options.tickSize &&\\n\\t\\t\\t\\t\\t\\t\\t\\taxis.options.tickSize[1] == \\\"quarter\\\") ||\\n\\t\\t\\t\\t\\t\\t\\t(axis.options.minTickSize &&\\n\\t\\t\\t\\t\\t\\t\\t\\taxis.options.minTickSize[1] == \\\"quarter\\\");\\n\\n\\t\\t\\t\\t\\t\\tvar t = axis.tickSize[0] * timeUnitSize[axis.tickSize[1]];\\n\\t\\t\\t\\t\\t\\tvar span = axis.max - axis.min;\\n\\t\\t\\t\\t\\t\\tvar suffix = (opts.twelveHourClock) ? \\\" %p\\\" : \\\"\\\";\\n\\t\\t\\t\\t\\t\\tvar hourCode = (opts.twelveHourClock) ? \\\"%I\\\" : \\\"%H\\\";\\n\\t\\t\\t\\t\\t\\tvar fmt;\\n\\n\\t\\t\\t\\t\\t\\tif (t < timeUnitSize.minute) {\\n\\t\\t\\t\\t\\t\\t\\tfmt = hourCode + \\\":%M:%S\\\" + suffix;\\n\\t\\t\\t\\t\\t\\t} else if (t < timeUnitSize.day) {\\n\\t\\t\\t\\t\\t\\t\\tif (span < 2 * timeUnitSize.day) {\\n\\t\\t\\t\\t\\t\\t\\t\\tfmt = hourCode + \\\":%M\\\" + suffix;\\n\\t\\t\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\t\\t\\tfmt = \\\"%b %d \\\" + hourCode + \\\":%M\\\" + suffix;\\n\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t} else if (t < timeUnitSize.month) {\\n\\t\\t\\t\\t\\t\\t\\tfmt = \\\"%b %d\\\";\\n\\t\\t\\t\\t\\t\\t} else if ((useQuarters && t < timeUnitSize.quarter) ||\\n\\t\\t\\t\\t\\t\\t\\t(!useQuarters && t < timeUnitSize.year)) {\\n\\t\\t\\t\\t\\t\\t\\tif (span < timeUnitSize.year) {\\n\\t\\t\\t\\t\\t\\t\\t\\tfmt = \\\"%b\\\";\\n\\t\\t\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\t\\t\\tfmt = \\\"%b %Y\\\";\\n\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t} else if (useQuarters && t < timeUnitSize.year) {\\n\\t\\t\\t\\t\\t\\t\\tif (span < timeUnitSize.year) {\\n\\t\\t\\t\\t\\t\\t\\t\\tfmt = \\\"Q%q\\\";\\n\\t\\t\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\t\\t\\tfmt = \\\"Q%q %Y\\\";\\n\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\t\\tfmt = \\\"%Y\\\";\\n\\t\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\t\\tvar rt = formatDate(d, fmt, opts.monthNames, opts.dayNames);\\n\\n\\t\\t\\t\\t\\t\\treturn rt;\\n\\t\\t\\t\\t\\t};\\n\\t\\t\\t\\t}\\n\\t\\t\\t});\\n\\t\\t});\\n\\t}\\n\\n\\t$.plot.plugins.push({\\n\\t\\tinit: init,\\n\\t\\toptions: options,\\n\\t\\tname: 'time',\\n\\t\\tversion: '1.0'\\n\\t});\\n\\n\\t// Time-axis support used to be in Flot core, which exposed the\\n\\t// formatDate function on the plot object. Various plugins depend\\n\\t// on the function, so we need to re-expose it here.\\n\\n\\t$.plot.formatDate = formatDate;\\n\\t$.plot.dateGenerator = dateGenerator;\\n\\n})(jQuery);\\n\"\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/raw-loader!./src/assets/inspinia/plugins/flot/jquery.flot.time.js\n// module id = 2208\n// module chunks = 1","require(\"!!/opt/atlassian/pipelines/agent/build/node_modules/script-loader/addScript.js\")(require(\"!!/opt/atlassian/pipelines/agent/build/node_modules/raw-loader/index.js!/opt/atlassian/pipelines/agent/build/src/assets/inspinia/plugins/flot/jquery.flot.tooltip.min.js\"))\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/script-loader!./src/assets/inspinia/plugins/flot/jquery.flot.tooltip.min.js\n// module id = 2209\n// module chunks = 1","module.exports = \"/*\\r\\n * jquery.flot.tooltip\\r\\n * \\r\\n * description: easy-to-use tooltips for Flot charts\\r\\n * version: 0.6.2\\r\\n * author: Krzysztof Urbas @krzysu [myviews.pl]\\r\\n * website: https://github.com/krzysu/flot.tooltip\\r\\n * \\r\\n * build on 2013-09-30\\r\\n * released under MIT License, 2012\\r\\n*/ \\r\\n(function(t){var o={tooltip:!1,tooltipOpts:{content:\\\"%s | X: %x | Y: %y\\\",xDateFormat:null,yDateFormat:null,shifts:{x:10,y:20},defaultTheme:!0,onHover:function(){}}},i=function(t){this.tipPosition={x:0,y:0},this.init(t)};i.prototype.init=function(o){function i(t){var o={};o.x=t.pageX,o.y=t.pageY,s.updateTooltipPosition(o)}function e(t,o,i){var e=s.getDomElement();if(i){var n;n=s.stringFormat(s.tooltipOptions.content,i),e.html(n),s.updateTooltipPosition({x:o.pageX,y:o.pageY}),e.css({left:s.tipPosition.x+s.tooltipOptions.shifts.x,top:s.tipPosition.y+s.tooltipOptions.shifts.y}).show(),\\\"function\\\"==typeof s.tooltipOptions.onHover&&s.tooltipOptions.onHover(i,e)}else e.hide().html(\\\"\\\")}var s=this;o.hooks.bindEvents.push(function(o,n){s.plotOptions=o.getOptions(),s.plotOptions.tooltip!==!1&&void 0!==s.plotOptions.tooltip&&(s.tooltipOptions=s.plotOptions.tooltipOpts,s.getDomElement(),t(o.getPlaceholder()).bind(\\\"plothover\\\",e),t(n).bind(\\\"mousemove\\\",i))}),o.hooks.shutdown.push(function(o,s){t(o.getPlaceholder()).unbind(\\\"plothover\\\",e),t(s).unbind(\\\"mousemove\\\",i)})},i.prototype.getDomElement=function(){var o;return t(\\\"#flotTip\\\").length>0?o=t(\\\"#flotTip\\\"):(o=t(\\\"<div />\\\").attr(\\\"id\\\",\\\"flotTip\\\"),o.appendTo(\\\"body\\\").hide().css({position:\\\"absolute\\\"}),this.tooltipOptions.defaultTheme&&o.css({background:\\\"#fff\\\",\\\"z-index\\\":\\\"100\\\",padding:\\\"0.4em 0.6em\\\",\\\"border-radius\\\":\\\"0.5em\\\",\\\"font-size\\\":\\\"0.8em\\\",border:\\\"1px solid #111\\\",display:\\\"none\\\",\\\"white-space\\\":\\\"nowrap\\\"})),o},i.prototype.updateTooltipPosition=function(o){var i=t(\\\"#flotTip\\\").outerWidth()+this.tooltipOptions.shifts.x,e=t(\\\"#flotTip\\\").outerHeight()+this.tooltipOptions.shifts.y;o.x-t(window).scrollLeft()>t(window).innerWidth()-i&&(o.x-=i),o.y-t(window).scrollTop()>t(window).innerHeight()-e&&(o.y-=e),this.tipPosition.x=o.x,this.tipPosition.y=o.y},i.prototype.stringFormat=function(t,o){var i=/%p\\\\.{0,1}(\\\\d{0,})/,e=/%s/,s=/%x\\\\.{0,1}(?:\\\\d{0,})/,n=/%y\\\\.{0,1}(?:\\\\d{0,})/;return\\\"function\\\"==typeof t&&(t=t(o.series.label,o.series.data[o.dataIndex][0],o.series.data[o.dataIndex][1],o)),o.series.percent!==void 0&&(t=this.adjustValPrecision(i,t,o.series.percent)),o.series.label!==void 0&&(t=t.replace(e,o.series.label)),this.isTimeMode(\\\"xaxis\\\",o)&&this.isXDateFormat(o)&&(t=t.replace(s,this.timestampToDate(o.series.data[o.dataIndex][0],this.tooltipOptions.xDateFormat))),this.isTimeMode(\\\"yaxis\\\",o)&&this.isYDateFormat(o)&&(t=t.replace(n,this.timestampToDate(o.series.data[o.dataIndex][1],this.tooltipOptions.yDateFormat))),\\\"number\\\"==typeof o.series.data[o.dataIndex][0]&&(t=this.adjustValPrecision(s,t,o.series.data[o.dataIndex][0])),\\\"number\\\"==typeof o.series.data[o.dataIndex][1]&&(t=this.adjustValPrecision(n,t,o.series.data[o.dataIndex][1])),o.series.xaxis.tickFormatter!==void 0&&(t=t.replace(s,o.series.xaxis.tickFormatter(o.series.data[o.dataIndex][0],o.series.xaxis))),o.series.yaxis.tickFormatter!==void 0&&(t=t.replace(n,o.series.yaxis.tickFormatter(o.series.data[o.dataIndex][1],o.series.yaxis))),t},i.prototype.isTimeMode=function(t,o){return o.series[t].options.mode!==void 0&&\\\"time\\\"===o.series[t].options.mode},i.prototype.isXDateFormat=function(){return this.tooltipOptions.xDateFormat!==void 0&&null!==this.tooltipOptions.xDateFormat},i.prototype.isYDateFormat=function(){return this.tooltipOptions.yDateFormat!==void 0&&null!==this.tooltipOptions.yDateFormat},i.prototype.timestampToDate=function(o,i){var e=new Date(o);return t.plot.formatDate(e,i)},i.prototype.adjustValPrecision=function(t,o,i){var e,s=o.match(t);return null!==s&&\\\"\\\"!==RegExp.$1&&(e=RegExp.$1,i=i.toFixed(e),o=o.replace(t,i)),o};var e=function(t){new i(t)};t.plot.plugins.push({init:e,options:o,name:\\\"tooltip\\\",version:\\\"0.6.1\\\"})})(jQuery);\"\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/raw-loader!./src/assets/inspinia/plugins/flot/jquery.flot.tooltip.min.js\n// module id = 2210\n// module chunks = 1","require(\"!!/opt/atlassian/pipelines/agent/build/node_modules/script-loader/addScript.js\")(require(\"!!/opt/atlassian/pipelines/agent/build/node_modules/raw-loader/index.js!/opt/atlassian/pipelines/agent/build/src/assets/inspinia/plugins/flot/jquery.flot.spline.js\"))\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/script-loader!./src/assets/inspinia/plugins/flot/jquery.flot.spline.js\n// module id = 2211\n// module chunks = 1","module.exports = \"/**\\r\\n * Flot plugin that provides spline interpolation for line graphs\\r\\n * author: Alex Bardas < alex.bardas@gmail.com >\\r\\n * modified by: Avi Kohn https://github.com/AMKohn\\r\\n * based on the spline interpolation described at:\\r\\n *\\t\\t http://scaledinnovation.com/analytics/splines/aboutSplines.html\\r\\n *\\r\\n * Example usage: (add in plot options series object)\\r\\n *\\t\\tfor linespline:\\r\\n *\\t\\t\\tseries: {\\r\\n *\\t\\t\\t\\t...\\r\\n *\\t\\t\\t\\tlines: {\\r\\n *\\t\\t\\t\\t\\tshow: false\\r\\n *\\t\\t\\t\\t},\\r\\n *\\t\\t\\t\\tsplines: {\\r\\n *\\t\\t\\t\\t\\tshow: true,\\r\\n *\\t\\t\\t\\t\\ttension: x, (float between 0 and 1, defaults to 0.5),\\r\\n *\\t\\t\\t\\t\\tlineWidth: y (number, defaults to 2),\\r\\n *\\t\\t\\t\\t\\tfill: z (float between 0 .. 1 or false, as in flot documentation)\\r\\n *\\t\\t\\t\\t},\\r\\n *\\t\\t\\t\\t...\\r\\n *\\t\\t\\t}\\r\\n *\\t\\tareaspline:\\r\\n *\\t\\t\\tseries: {\\r\\n *\\t\\t\\t\\t...\\r\\n *\\t\\t\\t\\tlines: {\\r\\n *\\t\\t\\t\\t\\tshow: true,\\r\\n *\\t\\t\\t\\t\\tlineWidth: 0, (line drawing will not execute)\\r\\n *\\t\\t\\t\\t\\tfill: x, (float between 0 .. 1, as in flot documentation)\\r\\n *\\t\\t\\t\\t\\t...\\r\\n *\\t\\t\\t\\t},\\r\\n *\\t\\t\\t\\tsplines: {\\r\\n *\\t\\t\\t\\t\\tshow: true,\\r\\n *\\t\\t\\t\\t\\ttension: 0.5 (float between 0 and 1)\\r\\n *\\t\\t\\t\\t},\\r\\n *\\t\\t\\t\\t...\\r\\n *\\t\\t\\t}\\r\\n *\\r\\n */\\r\\n\\r\\n(function($) {\\r\\n 'use strict'\\r\\n\\r\\n /**\\r\\n * @param {Number} x0, y0, x1, y1: coordinates of the end (knot) points of the segment\\r\\n * @param {Number} x2, y2: the next knot (not connected, but needed to calculate p2)\\r\\n * @param {Number} tension: control how far the control points spread\\r\\n * @return {Array}: p1 -> control point, from x1 back toward x0\\r\\n * \\t\\t\\t\\t\\tp2 -> the next control point, returned to become the next segment's p1\\r\\n *\\r\\n * @api private\\r\\n */\\r\\n function getControlPoints(x0, y0, x1, y1, x2, y2, tension) {\\r\\n\\r\\n var pow = Math.pow,\\r\\n sqrt = Math.sqrt,\\r\\n d01, d12, fa, fb, p1x, p1y, p2x, p2y;\\r\\n\\r\\n // Scaling factors: distances from this knot to the previous and following knots.\\r\\n d01 = sqrt(pow(x1 - x0, 2) + pow(y1 - y0, 2));\\r\\n d12 = sqrt(pow(x2 - x1, 2) + pow(y2 - y1, 2));\\r\\n\\r\\n fa = tension * d01 / (d01 + d12);\\r\\n fb = tension - fa;\\r\\n\\r\\n p1x = x1 + fa * (x0 - x2);\\r\\n p1y = y1 + fa * (y0 - y2);\\r\\n\\r\\n p2x = x1 - fb * (x0 - x2);\\r\\n p2y = y1 - fb * (y0 - y2);\\r\\n\\r\\n return [p1x, p1y, p2x, p2y];\\r\\n }\\r\\n\\r\\n var line = [];\\r\\n\\r\\n function drawLine(points, ctx, height, fill, seriesColor) {\\r\\n var c = $.color.parse(seriesColor);\\r\\n\\r\\n c.a = typeof fill == \\\"number\\\" ? fill : .3;\\r\\n c.normalize();\\r\\n c = c.toString();\\r\\n\\r\\n ctx.beginPath();\\r\\n ctx.moveTo(points[0][0], points[0][1]);\\r\\n\\r\\n var plength = points.length;\\r\\n\\r\\n for (var i = 0; i < plength; i++) {\\r\\n ctx[points[i][3]].apply(ctx, points[i][2]);\\r\\n }\\r\\n\\r\\n ctx.stroke();\\r\\n\\r\\n ctx.lineWidth = 0;\\r\\n ctx.lineTo(points[plength - 1][0], height);\\r\\n ctx.lineTo(points[0][0], height);\\r\\n\\r\\n ctx.closePath();\\r\\n\\r\\n if (fill !== false) {\\r\\n ctx.fillStyle = c;\\r\\n ctx.fill();\\r\\n }\\r\\n }\\r\\n\\r\\n /**\\r\\n * @param {Object} ctx: canvas context\\r\\n * @param {String} type: accepted strings: 'bezier' or 'quadratic' (defaults to quadratic)\\r\\n * @param {Array} points: 2 points for which to draw the interpolation\\r\\n * @param {Array} cpoints: control points for those segment points\\r\\n *\\r\\n * @api private\\r\\n */\\r\\n function queue(ctx, type, points, cpoints) {\\r\\n if (type === void 0 || (type !== 'bezier' && type !== 'quadratic')) {\\r\\n type = 'quadratic';\\r\\n }\\r\\n type = type + 'CurveTo';\\r\\n\\r\\n if (line.length == 0) line.push([points[0], points[1], cpoints.concat(points.slice(2)), type]);\\r\\n else if (type == \\\"quadraticCurveTo\\\" && points.length == 2) {\\r\\n cpoints = cpoints.slice(0, 2).concat(points);\\r\\n\\r\\n line.push([points[0], points[1], cpoints, type]);\\r\\n }\\r\\n else line.push([points[2], points[3], cpoints.concat(points.slice(2)), type]);\\r\\n }\\r\\n\\r\\n /**\\r\\n * @param {Object} plot\\r\\n * @param {Object} ctx: canvas context\\r\\n * @param {Object} series\\r\\n *\\r\\n * @api private\\r\\n */\\r\\n\\r\\n function drawSpline(plot, ctx, series) {\\r\\n // Not interested if spline is not requested\\r\\n if (series.splines.show !== true) {\\r\\n return;\\r\\n }\\r\\n\\r\\n var cp = [],\\r\\n // array of control points\\r\\n tension = series.splines.tension || 0.5,\\r\\n idx, x, y, points = series.datapoints.points,\\r\\n ps = series.datapoints.pointsize,\\r\\n plotOffset = plot.getPlotOffset(),\\r\\n len = points.length,\\r\\n pts = [];\\r\\n\\r\\n line = [];\\r\\n\\r\\n // Cannot display a linespline/areaspline if there are less than 3 points\\r\\n if (len / ps < 4) {\\r\\n $.extend(series.lines, series.splines);\\r\\n return;\\r\\n }\\r\\n\\r\\n for (idx = 0; idx < len; idx += ps) {\\r\\n x = points[idx];\\r\\n y = points[idx + 1];\\r\\n if (x == null || x < series.xaxis.min || x > series.xaxis.max || y < series.yaxis.min || y > series.yaxis.max) {\\r\\n continue;\\r\\n }\\r\\n\\r\\n pts.push(series.xaxis.p2c(x) + plotOffset.left, series.yaxis.p2c(y) + plotOffset.top);\\r\\n }\\r\\n\\r\\n len = pts.length;\\r\\n\\r\\n // Draw an open curve, not connected at the ends\\r\\n for (idx = 0; idx < len - 2; idx += 2) {\\r\\n cp = cp.concat(getControlPoints.apply(this, pts.slice(idx, idx + 6).concat([tension])));\\r\\n }\\r\\n\\r\\n ctx.save();\\r\\n ctx.strokeStyle = series.color;\\r\\n ctx.lineWidth = series.splines.lineWidth;\\r\\n\\r\\n queue(ctx, 'quadratic', pts.slice(0, 4), cp.slice(0, 2));\\r\\n\\r\\n for (idx = 2; idx < len - 3; idx += 2) {\\r\\n queue(ctx, 'bezier', pts.slice(idx, idx + 4), cp.slice(2 * idx - 2, 2 * idx + 2));\\r\\n }\\r\\n\\r\\n queue(ctx, 'quadratic', pts.slice(len - 2, len), [cp[2 * len - 10], cp[2 * len - 9], pts[len - 4], pts[len - 3]]);\\r\\n\\r\\n drawLine(line, ctx, plot.height() + 10, series.splines.fill, series.color);\\r\\n\\r\\n ctx.restore();\\r\\n }\\r\\n\\r\\n $.plot.plugins.push({\\r\\n init: function(plot) {\\r\\n plot.hooks.drawSeries.push(drawSpline);\\r\\n },\\r\\n options: {\\r\\n series: {\\r\\n splines: {\\r\\n show: false,\\r\\n lineWidth: 2,\\r\\n tension: 0.5,\\r\\n fill: false\\r\\n }\\r\\n }\\r\\n },\\r\\n name: 'spline',\\r\\n version: '0.8.2'\\r\\n });\\r\\n})(jQuery);\\r\\n\"\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/raw-loader!./src/assets/inspinia/plugins/flot/jquery.flot.spline.js\n// module id = 2212\n// module chunks = 1","require(\"!!/opt/atlassian/pipelines/agent/build/node_modules/script-loader/addScript.js\")(require(\"!!/opt/atlassian/pipelines/agent/build/node_modules/raw-loader/index.js!/opt/atlassian/pipelines/agent/build/src/assets/inspinia/plugins/flot/jquery.flot.resize.js\"))\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/script-loader!./src/assets/inspinia/plugins/flot/jquery.flot.resize.js\n// module id = 2213\n// module chunks = 1","module.exports = \"/* Flot plugin for automatically redrawing plots as the placeholder resizes.\\n\\nCopyright (c) 2007-2014 IOLA and Ole Laursen.\\nLicensed under the MIT license.\\n\\nIt works by listening for changes on the placeholder div (through the jQuery\\nresize event plugin) - if the size changes, it will redraw the plot.\\n\\nThere are no options. If you need to disable the plugin for some plots, you\\ncan just fix the size of their placeholders.\\n\\n*/\\n\\n/* Inline dependency:\\n * jQuery resize event - v1.1 - 3/14/2010\\n * http://benalman.com/projects/jquery-resize-plugin/\\n *\\n * Copyright (c) 2010 \\\"Cowboy\\\" Ben Alman\\n * Dual licensed under the MIT and GPL licenses.\\n * http://benalman.com/about/license/\\n */\\n(function($,e,t){\\\"$:nomunge\\\";var i=[],n=$.resize=$.extend($.resize,{}),a,r=false,s=\\\"setTimeout\\\",u=\\\"resize\\\",m=u+\\\"-special-event\\\",o=\\\"pendingDelay\\\",l=\\\"activeDelay\\\",f=\\\"throttleWindow\\\";n[o]=200;n[l]=20;n[f]=true;$.event.special[u]={setup:function(){if(!n[f]&&this[s]){return false}var e=$(this);i.push(this);e.data(m,{w:e.width(),h:e.height()});if(i.length===1){a=t;h()}},teardown:function(){if(!n[f]&&this[s]){return false}var e=$(this);for(var t=i.length-1;t>=0;t--){if(i[t]==this){i.splice(t,1);break}}e.removeData(m);if(!i.length){if(r){cancelAnimationFrame(a)}else{clearTimeout(a)}a=null}},add:function(e){if(!n[f]&&this[s]){return false}var i;function a(e,n,a){var r=$(this),s=r.data(m)||{};s.w=n!==t?n:r.width();s.h=a!==t?a:r.height();i.apply(this,arguments)}if($.isFunction(e)){i=e;return a}else{i=e.handler;e.handler=a}}};function h(t){if(r===true){r=t||1}for(var s=i.length-1;s>=0;s--){var l=$(i[s]);if(l[0]==e||l.is(\\\":visible\\\")){var f=l.width(),c=l.height(),d=l.data(m);if(d&&(f!==d.w||c!==d.h)){l.trigger(u,[d.w=f,d.h=c]);r=t||true}}else{d=l.data(m);d.w=0;d.h=0}}if(a!==null){if(r&&(t==null||t-r<1e3)){a=e.requestAnimationFrame(h)}else{a=setTimeout(h,n[o]);r=false}}}if(!e.requestAnimationFrame){e.requestAnimationFrame=function(){return e.webkitRequestAnimationFrame||e.mozRequestAnimationFrame||e.oRequestAnimationFrame||e.msRequestAnimationFrame||function(t,i){return e.setTimeout(function(){t((new Date).getTime())},n[l])}}()}if(!e.cancelAnimationFrame){e.cancelAnimationFrame=function(){return e.webkitCancelRequestAnimationFrame||e.mozCancelRequestAnimationFrame||e.oCancelRequestAnimationFrame||e.msCancelRequestAnimationFrame||clearTimeout}()}})(jQuery,this);\\n\\n(function ($) {\\n var options = { }; // no options\\n\\n function init(plot) {\\n function onResize() {\\n var placeholder = plot.getPlaceholder();\\n\\n // somebody might have hidden us and we can't plot\\n // when we don't have the dimensions\\n if (placeholder.width() == 0 || placeholder.height() == 0)\\n return;\\n\\n plot.resize();\\n plot.setupGrid();\\n plot.draw();\\n }\\n \\n function bindEvents(plot, eventHolder) {\\n plot.getPlaceholder().resize(onResize);\\n }\\n\\n function shutdown(plot, eventHolder) {\\n plot.getPlaceholder().unbind(\\\"resize\\\", onResize);\\n }\\n \\n plot.hooks.bindEvents.push(bindEvents);\\n plot.hooks.shutdown.push(shutdown);\\n }\\n \\n $.plot.plugins.push({\\n init: init,\\n options: options,\\n name: 'resize',\\n version: '1.0'\\n });\\n})(jQuery);\\n\"\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/raw-loader!./src/assets/inspinia/plugins/flot/jquery.flot.resize.js\n// module id = 2214\n// module chunks = 1","require(\"!!/opt/atlassian/pipelines/agent/build/node_modules/script-loader/addScript.js\")(require(\"!!/opt/atlassian/pipelines/agent/build/node_modules/raw-loader/index.js!/opt/atlassian/pipelines/agent/build/src/assets/inspinia/plugins/flot/jquery.flot.pie.js\"))\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/script-loader!./src/assets/inspinia/plugins/flot/jquery.flot.pie.js\n// module id = 2215\n// module chunks = 1","module.exports = \"/* Flot plugin for rendering pie charts.\\n\\nCopyright (c) 2007-2014 IOLA and Ole Laursen.\\nLicensed under the MIT license.\\n\\nThe plugin assumes that each series has a single data value, and that each\\nvalue is a positive integer or zero. Negative numbers don't make sense for a\\npie chart, and have unpredictable results. The values do NOT need to be\\npassed in as percentages; the plugin will calculate the total and per-slice\\npercentages internally.\\n\\n* Created by Brian Medendorp\\n\\n* Updated with contributions from btburnett3, Anthony Aragues and Xavi Ivars\\n\\nThe plugin supports these options:\\n\\n\\tseries: {\\n\\t\\tpie: {\\n\\t\\t\\tshow: true/false\\n\\t\\t\\tradius: 0-1 for percentage of fullsize, or a specified pixel length, or 'auto'\\n\\t\\t\\tinnerRadius: 0-1 for percentage of fullsize or a specified pixel length, for creating a donut effect\\n\\t\\t\\tstartAngle: 0-2 factor of PI used for starting angle (in radians) i.e 3/2 starts at the top, 0 and 2 have the same result\\n\\t\\t\\ttilt: 0-1 for percentage to tilt the pie, where 1 is no tilt, and 0 is completely flat (nothing will show)\\n\\t\\t\\toffset: {\\n\\t\\t\\t\\ttop: integer value to move the pie up or down\\n\\t\\t\\t\\tleft: integer value to move the pie left or right, or 'auto'\\n\\t\\t\\t},\\n\\t\\t\\tstroke: {\\n\\t\\t\\t\\tcolor: any hexidecimal color value (other formats may or may not work, so best to stick with something like '#FFF')\\n\\t\\t\\t\\twidth: integer pixel width of the stroke\\n\\t\\t\\t},\\n\\t\\t\\tlabel: {\\n\\t\\t\\t\\tshow: true/false, or 'auto'\\n\\t\\t\\t\\tformatter: a user-defined function that modifies the text/style of the label text\\n\\t\\t\\t\\tradius: 0-1 for percentage of fullsize, or a specified pixel length\\n\\t\\t\\t\\tbackground: {\\n\\t\\t\\t\\t\\tcolor: any hexidecimal color value (other formats may or may not work, so best to stick with something like '#000')\\n\\t\\t\\t\\t\\topacity: 0-1\\n\\t\\t\\t\\t},\\n\\t\\t\\t\\tthreshold: 0-1 for the percentage value at which to hide labels (if they're too small)\\n\\t\\t\\t},\\n\\t\\t\\tcombine: {\\n\\t\\t\\t\\tthreshold: 0-1 for the percentage value at which to combine slices (if they're too small)\\n\\t\\t\\t\\tcolor: any hexidecimal color value (other formats may or may not work, so best to stick with something like '#CCC'), if null, the plugin will automatically use the color of the first slice to be combined\\n\\t\\t\\t\\tlabel: any text value of what the combined slice should be labeled\\n\\t\\t\\t}\\n\\t\\t\\thighlight: {\\n\\t\\t\\t\\topacity: 0-1\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\nMore detail and specific examples can be found in the included HTML file.\\n\\n*/\\n\\n(function($) {\\n\\n\\t// Maximum redraw attempts when fitting labels within the plot\\n\\n\\tvar REDRAW_ATTEMPTS = 10;\\n\\n\\t// Factor by which to shrink the pie when fitting labels within the plot\\n\\n\\tvar REDRAW_SHRINK = 0.95;\\n\\n\\tfunction init(plot) {\\n\\n\\t\\tvar canvas = null,\\n\\t\\t\\ttarget = null,\\n\\t\\t\\toptions = null,\\n\\t\\t\\tmaxRadius = null,\\n\\t\\t\\tcenterLeft = null,\\n\\t\\t\\tcenterTop = null,\\n\\t\\t\\tprocessed = false,\\n\\t\\t\\tctx = null;\\n\\n\\t\\t// interactive variables\\n\\n\\t\\tvar highlights = [];\\n\\n\\t\\t// add hook to determine if pie plugin in enabled, and then perform necessary operations\\n\\n\\t\\tplot.hooks.processOptions.push(function(plot, options) {\\n\\t\\t\\tif (options.series.pie.show) {\\n\\n\\t\\t\\t\\toptions.grid.show = false;\\n\\n\\t\\t\\t\\t// set labels.show\\n\\n\\t\\t\\t\\tif (options.series.pie.label.show == \\\"auto\\\") {\\n\\t\\t\\t\\t\\tif (options.legend.show) {\\n\\t\\t\\t\\t\\t\\toptions.series.pie.label.show = false;\\n\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\toptions.series.pie.label.show = true;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t// set radius\\n\\n\\t\\t\\t\\tif (options.series.pie.radius == \\\"auto\\\") {\\n\\t\\t\\t\\t\\tif (options.series.pie.label.show) {\\n\\t\\t\\t\\t\\t\\toptions.series.pie.radius = 3/4;\\n\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\toptions.series.pie.radius = 1;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t// ensure sane tilt\\n\\n\\t\\t\\t\\tif (options.series.pie.tilt > 1) {\\n\\t\\t\\t\\t\\toptions.series.pie.tilt = 1;\\n\\t\\t\\t\\t} else if (options.series.pie.tilt < 0) {\\n\\t\\t\\t\\t\\toptions.series.pie.tilt = 0;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t});\\n\\n\\t\\tplot.hooks.bindEvents.push(function(plot, eventHolder) {\\n\\t\\t\\tvar options = plot.getOptions();\\n\\t\\t\\tif (options.series.pie.show) {\\n\\t\\t\\t\\tif (options.grid.hoverable) {\\n\\t\\t\\t\\t\\teventHolder.unbind(\\\"mousemove\\\").mousemove(onMouseMove);\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tif (options.grid.clickable) {\\n\\t\\t\\t\\t\\teventHolder.unbind(\\\"click\\\").click(onClick);\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t});\\n\\n\\t\\tplot.hooks.processDatapoints.push(function(plot, series, data, datapoints) {\\n\\t\\t\\tvar options = plot.getOptions();\\n\\t\\t\\tif (options.series.pie.show) {\\n\\t\\t\\t\\tprocessDatapoints(plot, series, data, datapoints);\\n\\t\\t\\t}\\n\\t\\t});\\n\\n\\t\\tplot.hooks.drawOverlay.push(function(plot, octx) {\\n\\t\\t\\tvar options = plot.getOptions();\\n\\t\\t\\tif (options.series.pie.show) {\\n\\t\\t\\t\\tdrawOverlay(plot, octx);\\n\\t\\t\\t}\\n\\t\\t});\\n\\n\\t\\tplot.hooks.draw.push(function(plot, newCtx) {\\n\\t\\t\\tvar options = plot.getOptions();\\n\\t\\t\\tif (options.series.pie.show) {\\n\\t\\t\\t\\tdraw(plot, newCtx);\\n\\t\\t\\t}\\n\\t\\t});\\n\\n\\t\\tfunction processDatapoints(plot, series, datapoints) {\\n\\t\\t\\tif (!processed)\\t{\\n\\t\\t\\t\\tprocessed = true;\\n\\t\\t\\t\\tcanvas = plot.getCanvas();\\n\\t\\t\\t\\ttarget = $(canvas).parent();\\n\\t\\t\\t\\toptions = plot.getOptions();\\n\\t\\t\\t\\tplot.setData(combine(plot.getData()));\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\tfunction combine(data) {\\n\\n\\t\\t\\tvar total = 0,\\n\\t\\t\\t\\tcombined = 0,\\n\\t\\t\\t\\tnumCombined = 0,\\n\\t\\t\\t\\tcolor = options.series.pie.combine.color,\\n\\t\\t\\t\\tnewdata = [];\\n\\n\\t\\t\\t// Fix up the raw data from Flot, ensuring the data is numeric\\n\\n\\t\\t\\tfor (var i = 0; i < data.length; ++i) {\\n\\n\\t\\t\\t\\tvar value = data[i].data;\\n\\n\\t\\t\\t\\t// If the data is an array, we'll assume that it's a standard\\n\\t\\t\\t\\t// Flot x-y pair, and are concerned only with the second value.\\n\\n\\t\\t\\t\\t// Note how we use the original array, rather than creating a\\n\\t\\t\\t\\t// new one; this is more efficient and preserves any extra data\\n\\t\\t\\t\\t// that the user may have stored in higher indexes.\\n\\n\\t\\t\\t\\tif ($.isArray(value) && value.length == 1) {\\n \\t\\t\\t\\tvalue = value[0];\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\tif ($.isArray(value)) {\\n\\t\\t\\t\\t\\t// Equivalent to $.isNumeric() but compatible with jQuery < 1.7\\n\\t\\t\\t\\t\\tif (!isNaN(parseFloat(value[1])) && isFinite(value[1])) {\\n\\t\\t\\t\\t\\t\\tvalue[1] = +value[1];\\n\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\tvalue[1] = 0;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t} else if (!isNaN(parseFloat(value)) && isFinite(value)) {\\n\\t\\t\\t\\t\\tvalue = [1, +value];\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\tvalue = [1, 0];\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\tdata[i].data = [value];\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Sum up all the slices, so we can calculate percentages for each\\n\\n\\t\\t\\tfor (var i = 0; i < data.length; ++i) {\\n\\t\\t\\t\\ttotal += data[i].data[0][1];\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Count the number of slices with percentages below the combine\\n\\t\\t\\t// threshold; if it turns out to be just one, we won't combine.\\n\\n\\t\\t\\tfor (var i = 0; i < data.length; ++i) {\\n\\t\\t\\t\\tvar value = data[i].data[0][1];\\n\\t\\t\\t\\tif (value / total <= options.series.pie.combine.threshold) {\\n\\t\\t\\t\\t\\tcombined += value;\\n\\t\\t\\t\\t\\tnumCombined++;\\n\\t\\t\\t\\t\\tif (!color) {\\n\\t\\t\\t\\t\\t\\tcolor = data[i].color;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\n\\t\\t\\tfor (var i = 0; i < data.length; ++i) {\\n\\t\\t\\t\\tvar value = data[i].data[0][1];\\n\\t\\t\\t\\tif (numCombined < 2 || value / total > options.series.pie.combine.threshold) {\\n\\t\\t\\t\\t\\tnewdata.push(\\n\\t\\t\\t\\t\\t\\t$.extend(data[i], { /* extend to allow keeping all other original data values\\n\\t\\t\\t\\t\\t\\t and using them e.g. in labelFormatter. */\\n\\t\\t\\t\\t\\t\\t\\tdata: [[1, value]],\\n\\t\\t\\t\\t\\t\\t\\tcolor: data[i].color,\\n\\t\\t\\t\\t\\t\\t\\tlabel: data[i].label,\\n\\t\\t\\t\\t\\t\\t\\tangle: value * Math.PI * 2 / total,\\n\\t\\t\\t\\t\\t\\t\\tpercent: value / (total / 100)\\n\\t\\t\\t\\t\\t\\t})\\n\\t\\t\\t\\t\\t);\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\n\\t\\t\\tif (numCombined > 1) {\\n\\t\\t\\t\\tnewdata.push({\\n\\t\\t\\t\\t\\tdata: [[1, combined]],\\n\\t\\t\\t\\t\\tcolor: color,\\n\\t\\t\\t\\t\\tlabel: options.series.pie.combine.label,\\n\\t\\t\\t\\t\\tangle: combined * Math.PI * 2 / total,\\n\\t\\t\\t\\t\\tpercent: combined / (total / 100)\\n\\t\\t\\t\\t});\\n\\t\\t\\t}\\n\\n\\t\\t\\treturn newdata;\\n\\t\\t}\\n\\n\\t\\tfunction draw(plot, newCtx) {\\n\\n\\t\\t\\tif (!target) {\\n\\t\\t\\t\\treturn; // if no series were passed\\n\\t\\t\\t}\\n\\n\\t\\t\\tvar canvasWidth = plot.getPlaceholder().width(),\\n\\t\\t\\t\\tcanvasHeight = plot.getPlaceholder().height(),\\n\\t\\t\\t\\tlegendWidth = target.children().filter(\\\".legend\\\").children().width() || 0;\\n\\n\\t\\t\\tctx = newCtx;\\n\\n\\t\\t\\t// WARNING: HACK! REWRITE THIS CODE AS SOON AS POSSIBLE!\\n\\n\\t\\t\\t// When combining smaller slices into an 'other' slice, we need to\\n\\t\\t\\t// add a new series. Since Flot gives plugins no way to modify the\\n\\t\\t\\t// list of series, the pie plugin uses a hack where the first call\\n\\t\\t\\t// to processDatapoints results in a call to setData with the new\\n\\t\\t\\t// list of series, then subsequent processDatapoints do nothing.\\n\\n\\t\\t\\t// The plugin-global 'processed' flag is used to control this hack;\\n\\t\\t\\t// it starts out false, and is set to true after the first call to\\n\\t\\t\\t// processDatapoints.\\n\\n\\t\\t\\t// Unfortunately this turns future setData calls into no-ops; they\\n\\t\\t\\t// call processDatapoints, the flag is true, and nothing happens.\\n\\n\\t\\t\\t// To fix this we'll set the flag back to false here in draw, when\\n\\t\\t\\t// all series have been processed, so the next sequence of calls to\\n\\t\\t\\t// processDatapoints once again starts out with a slice-combine.\\n\\t\\t\\t// This is really a hack; in 0.9 we need to give plugins a proper\\n\\t\\t\\t// way to modify series before any processing begins.\\n\\n\\t\\t\\tprocessed = false;\\n\\n\\t\\t\\t// calculate maximum radius and center point\\n\\n\\t\\t\\tmaxRadius = Math.min(canvasWidth, canvasHeight / options.series.pie.tilt) / 2;\\n\\t\\t\\tcenterTop = canvasHeight / 2 + options.series.pie.offset.top;\\n\\t\\t\\tcenterLeft = canvasWidth / 2;\\n\\n\\t\\t\\tif (options.series.pie.offset.left == \\\"auto\\\") {\\n\\t\\t\\t\\tif (options.legend.position.match(\\\"w\\\")) {\\n\\t\\t\\t\\t\\tcenterLeft += legendWidth / 2;\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\tcenterLeft -= legendWidth / 2;\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tif (centerLeft < maxRadius) {\\n\\t\\t\\t\\t\\tcenterLeft = maxRadius;\\n\\t\\t\\t\\t} else if (centerLeft > canvasWidth - maxRadius) {\\n\\t\\t\\t\\t\\tcenterLeft = canvasWidth - maxRadius;\\n\\t\\t\\t\\t}\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tcenterLeft += options.series.pie.offset.left;\\n\\t\\t\\t}\\n\\n\\t\\t\\tvar slices = plot.getData(),\\n\\t\\t\\t\\tattempts = 0;\\n\\n\\t\\t\\t// Keep shrinking the pie's radius until drawPie returns true,\\n\\t\\t\\t// indicating that all the labels fit, or we try too many times.\\n\\n\\t\\t\\tdo {\\n\\t\\t\\t\\tif (attempts > 0) {\\n\\t\\t\\t\\t\\tmaxRadius *= REDRAW_SHRINK;\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tattempts += 1;\\n\\t\\t\\t\\tclear();\\n\\t\\t\\t\\tif (options.series.pie.tilt <= 0.8) {\\n\\t\\t\\t\\t\\tdrawShadow();\\n\\t\\t\\t\\t}\\n\\t\\t\\t} while (!drawPie() && attempts < REDRAW_ATTEMPTS)\\n\\n\\t\\t\\tif (attempts >= REDRAW_ATTEMPTS) {\\n\\t\\t\\t\\tclear();\\n\\t\\t\\t\\ttarget.prepend(\\\"<div class='error'>Could not draw pie with labels contained inside canvas</div>\\\");\\n\\t\\t\\t}\\n\\n\\t\\t\\tif (plot.setSeries && plot.insertLegend) {\\n\\t\\t\\t\\tplot.setSeries(slices);\\n\\t\\t\\t\\tplot.insertLegend();\\n\\t\\t\\t}\\n\\n\\t\\t\\t// we're actually done at this point, just defining internal functions at this point\\n\\n\\t\\t\\tfunction clear() {\\n\\t\\t\\t\\tctx.clearRect(0, 0, canvasWidth, canvasHeight);\\n\\t\\t\\t\\ttarget.children().filter(\\\".pieLabel, .pieLabelBackground\\\").remove();\\n\\t\\t\\t}\\n\\n\\t\\t\\tfunction drawShadow() {\\n\\n\\t\\t\\t\\tvar shadowLeft = options.series.pie.shadow.left;\\n\\t\\t\\t\\tvar shadowTop = options.series.pie.shadow.top;\\n\\t\\t\\t\\tvar edge = 10;\\n\\t\\t\\t\\tvar alpha = options.series.pie.shadow.alpha;\\n\\t\\t\\t\\tvar radius = options.series.pie.radius > 1 ? options.series.pie.radius : maxRadius * options.series.pie.radius;\\n\\n\\t\\t\\t\\tif (radius >= canvasWidth / 2 - shadowLeft || radius * options.series.pie.tilt >= canvasHeight / 2 - shadowTop || radius <= edge) {\\n\\t\\t\\t\\t\\treturn;\\t// shadow would be outside canvas, so don't draw it\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\tctx.save();\\n\\t\\t\\t\\tctx.translate(shadowLeft,shadowTop);\\n\\t\\t\\t\\tctx.globalAlpha = alpha;\\n\\t\\t\\t\\tctx.fillStyle = \\\"#000\\\";\\n\\n\\t\\t\\t\\t// center and rotate to starting position\\n\\n\\t\\t\\t\\tctx.translate(centerLeft,centerTop);\\n\\t\\t\\t\\tctx.scale(1, options.series.pie.tilt);\\n\\n\\t\\t\\t\\t//radius -= edge;\\n\\n\\t\\t\\t\\tfor (var i = 1; i <= edge; i++) {\\n\\t\\t\\t\\t\\tctx.beginPath();\\n\\t\\t\\t\\t\\tctx.arc(0, 0, radius, 0, Math.PI * 2, false);\\n\\t\\t\\t\\t\\tctx.fill();\\n\\t\\t\\t\\t\\tradius -= i;\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\tctx.restore();\\n\\t\\t\\t}\\n\\n\\t\\t\\tfunction drawPie() {\\n\\n\\t\\t\\t\\tvar startAngle = Math.PI * options.series.pie.startAngle;\\n\\t\\t\\t\\tvar radius = options.series.pie.radius > 1 ? options.series.pie.radius : maxRadius * options.series.pie.radius;\\n\\n\\t\\t\\t\\t// center and rotate to starting position\\n\\n\\t\\t\\t\\tctx.save();\\n\\t\\t\\t\\tctx.translate(centerLeft,centerTop);\\n\\t\\t\\t\\tctx.scale(1, options.series.pie.tilt);\\n\\t\\t\\t\\t//ctx.rotate(startAngle); // start at top; -- This doesn't work properly in Opera\\n\\n\\t\\t\\t\\t// draw slices\\n\\n\\t\\t\\t\\tctx.save();\\n\\t\\t\\t\\tvar currentAngle = startAngle;\\n\\t\\t\\t\\tfor (var i = 0; i < slices.length; ++i) {\\n\\t\\t\\t\\t\\tslices[i].startAngle = currentAngle;\\n\\t\\t\\t\\t\\tdrawSlice(slices[i].angle, slices[i].color, true);\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tctx.restore();\\n\\n\\t\\t\\t\\t// draw slice outlines\\n\\n\\t\\t\\t\\tif (options.series.pie.stroke.width > 0) {\\n\\t\\t\\t\\t\\tctx.save();\\n\\t\\t\\t\\t\\tctx.lineWidth = options.series.pie.stroke.width;\\n\\t\\t\\t\\t\\tcurrentAngle = startAngle;\\n\\t\\t\\t\\t\\tfor (var i = 0; i < slices.length; ++i) {\\n\\t\\t\\t\\t\\t\\tdrawSlice(slices[i].angle, options.series.pie.stroke.color, false);\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\tctx.restore();\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t// draw donut hole\\n\\n\\t\\t\\t\\tdrawDonutHole(ctx);\\n\\n\\t\\t\\t\\tctx.restore();\\n\\n\\t\\t\\t\\t// Draw the labels, returning true if they fit within the plot\\n\\n\\t\\t\\t\\tif (options.series.pie.label.show) {\\n\\t\\t\\t\\t\\treturn drawLabels();\\n\\t\\t\\t\\t} else return true;\\n\\n\\t\\t\\t\\tfunction drawSlice(angle, color, fill) {\\n\\n\\t\\t\\t\\t\\tif (angle <= 0 || isNaN(angle)) {\\n\\t\\t\\t\\t\\t\\treturn;\\n\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\tif (fill) {\\n\\t\\t\\t\\t\\t\\tctx.fillStyle = color;\\n\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\tctx.strokeStyle = color;\\n\\t\\t\\t\\t\\t\\tctx.lineJoin = \\\"round\\\";\\n\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\tctx.beginPath();\\n\\t\\t\\t\\t\\tif (Math.abs(angle - Math.PI * 2) > 0.000000001) {\\n\\t\\t\\t\\t\\t\\tctx.moveTo(0, 0); // Center of the pie\\n\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\t//ctx.arc(0, 0, radius, 0, angle, false); // This doesn't work properly in Opera\\n\\t\\t\\t\\t\\tctx.arc(0, 0, radius,currentAngle, currentAngle + angle / 2, false);\\n\\t\\t\\t\\t\\tctx.arc(0, 0, radius,currentAngle + angle / 2, currentAngle + angle, false);\\n\\t\\t\\t\\t\\tctx.closePath();\\n\\t\\t\\t\\t\\t//ctx.rotate(angle); // This doesn't work properly in Opera\\n\\t\\t\\t\\t\\tcurrentAngle += angle;\\n\\n\\t\\t\\t\\t\\tif (fill) {\\n\\t\\t\\t\\t\\t\\tctx.fill();\\n\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\tctx.stroke();\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\tfunction drawLabels() {\\n\\n\\t\\t\\t\\t\\tvar currentAngle = startAngle;\\n\\t\\t\\t\\t\\tvar radius = options.series.pie.label.radius > 1 ? options.series.pie.label.radius : maxRadius * options.series.pie.label.radius;\\n\\n\\t\\t\\t\\t\\tfor (var i = 0; i < slices.length; ++i) {\\n\\t\\t\\t\\t\\t\\tif (slices[i].percent >= options.series.pie.label.threshold * 100) {\\n\\t\\t\\t\\t\\t\\t\\tif (!drawLabel(slices[i], currentAngle, i)) {\\n\\t\\t\\t\\t\\t\\t\\t\\treturn false;\\n\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\tcurrentAngle += slices[i].angle;\\n\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\treturn true;\\n\\n\\t\\t\\t\\t\\tfunction drawLabel(slice, startAngle, index) {\\n\\n\\t\\t\\t\\t\\t\\tif (slice.data[0][1] == 0) {\\n\\t\\t\\t\\t\\t\\t\\treturn true;\\n\\t\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\t\\t// format label text\\n\\n\\t\\t\\t\\t\\t\\tvar lf = options.legend.labelFormatter, text, plf = options.series.pie.label.formatter;\\n\\n\\t\\t\\t\\t\\t\\tif (lf) {\\n\\t\\t\\t\\t\\t\\t\\ttext = lf(slice.label, slice);\\n\\t\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\t\\ttext = slice.label;\\n\\t\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\t\\tif (plf) {\\n\\t\\t\\t\\t\\t\\t\\ttext = plf(text, slice);\\n\\t\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\t\\tvar halfAngle = ((startAngle + slice.angle) + startAngle) / 2;\\n\\t\\t\\t\\t\\t\\tvar x = centerLeft + Math.round(Math.cos(halfAngle) * radius);\\n\\t\\t\\t\\t\\t\\tvar y = centerTop + Math.round(Math.sin(halfAngle) * radius) * options.series.pie.tilt;\\n\\n\\t\\t\\t\\t\\t\\tvar html = \\\"<span class='pieLabel' id='pieLabel\\\" + index + \\\"' style='position:absolute;top:\\\" + y + \\\"px;left:\\\" + x + \\\"px;'>\\\" + text + \\\"</span>\\\";\\n\\t\\t\\t\\t\\t\\ttarget.append(html);\\n\\n\\t\\t\\t\\t\\t\\tvar label = target.children(\\\"#pieLabel\\\" + index);\\n\\t\\t\\t\\t\\t\\tvar labelTop = (y - label.height() / 2);\\n\\t\\t\\t\\t\\t\\tvar labelLeft = (x - label.width() / 2);\\n\\n\\t\\t\\t\\t\\t\\tlabel.css(\\\"top\\\", labelTop);\\n\\t\\t\\t\\t\\t\\tlabel.css(\\\"left\\\", labelLeft);\\n\\n\\t\\t\\t\\t\\t\\t// check to make sure that the label is not outside the canvas\\n\\n\\t\\t\\t\\t\\t\\tif (0 - labelTop > 0 || 0 - labelLeft > 0 || canvasHeight - (labelTop + label.height()) < 0 || canvasWidth - (labelLeft + label.width()) < 0) {\\n\\t\\t\\t\\t\\t\\t\\treturn false;\\n\\t\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\t\\tif (options.series.pie.label.background.opacity != 0) {\\n\\n\\t\\t\\t\\t\\t\\t\\t// put in the transparent background separately to avoid blended labels and label boxes\\n\\n\\t\\t\\t\\t\\t\\t\\tvar c = options.series.pie.label.background.color;\\n\\n\\t\\t\\t\\t\\t\\t\\tif (c == null) {\\n\\t\\t\\t\\t\\t\\t\\t\\tc = slice.color;\\n\\t\\t\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\t\\t\\tvar pos = \\\"top:\\\" + labelTop + \\\"px;left:\\\" + labelLeft + \\\"px;\\\";\\n\\t\\t\\t\\t\\t\\t\\t$(\\\"<div class='pieLabelBackground' style='position:absolute;width:\\\" + label.width() + \\\"px;height:\\\" + label.height() + \\\"px;\\\" + pos + \\\"background-color:\\\" + c + \\\";'></div>\\\")\\n\\t\\t\\t\\t\\t\\t\\t\\t.css(\\\"opacity\\\", options.series.pie.label.background.opacity)\\n\\t\\t\\t\\t\\t\\t\\t\\t.insertBefore(label);\\n\\t\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\t\\treturn true;\\n\\t\\t\\t\\t\\t} // end individual label function\\n\\t\\t\\t\\t} // end drawLabels function\\n\\t\\t\\t} // end drawPie function\\n\\t\\t} // end draw function\\n\\n\\t\\t// Placed here because it needs to be accessed from multiple locations\\n\\n\\t\\tfunction drawDonutHole(layer) {\\n\\t\\t\\tif (options.series.pie.innerRadius > 0) {\\n\\n\\t\\t\\t\\t// subtract the center\\n\\n\\t\\t\\t\\tlayer.save();\\n\\t\\t\\t\\tvar innerRadius = options.series.pie.innerRadius > 1 ? options.series.pie.innerRadius : maxRadius * options.series.pie.innerRadius;\\n\\t\\t\\t\\tlayer.globalCompositeOperation = \\\"destination-out\\\"; // this does not work with excanvas, but it will fall back to using the stroke color\\n\\t\\t\\t\\tlayer.beginPath();\\n\\t\\t\\t\\tlayer.fillStyle = options.series.pie.stroke.color;\\n\\t\\t\\t\\tlayer.arc(0, 0, innerRadius, 0, Math.PI * 2, false);\\n\\t\\t\\t\\tlayer.fill();\\n\\t\\t\\t\\tlayer.closePath();\\n\\t\\t\\t\\tlayer.restore();\\n\\n\\t\\t\\t\\t// add inner stroke\\n\\n\\t\\t\\t\\tlayer.save();\\n\\t\\t\\t\\tlayer.beginPath();\\n\\t\\t\\t\\tlayer.strokeStyle = options.series.pie.stroke.color;\\n\\t\\t\\t\\tlayer.arc(0, 0, innerRadius, 0, Math.PI * 2, false);\\n\\t\\t\\t\\tlayer.stroke();\\n\\t\\t\\t\\tlayer.closePath();\\n\\t\\t\\t\\tlayer.restore();\\n\\n\\t\\t\\t\\t// TODO: add extra shadow inside hole (with a mask) if the pie is tilted.\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t//-- Additional Interactive related functions --\\n\\n\\t\\tfunction isPointInPoly(poly, pt) {\\n\\t\\t\\tfor(var c = false, i = -1, l = poly.length, j = l - 1; ++i < l; j = i)\\n\\t\\t\\t\\t((poly[i][1] <= pt[1] && pt[1] < poly[j][1]) || (poly[j][1] <= pt[1] && pt[1]< poly[i][1]))\\n\\t\\t\\t\\t&& (pt[0] < (poly[j][0] - poly[i][0]) * (pt[1] - poly[i][1]) / (poly[j][1] - poly[i][1]) + poly[i][0])\\n\\t\\t\\t\\t&& (c = !c);\\n\\t\\t\\treturn c;\\n\\t\\t}\\n\\n\\t\\tfunction findNearbySlice(mouseX, mouseY) {\\n\\n\\t\\t\\tvar slices = plot.getData(),\\n\\t\\t\\t\\toptions = plot.getOptions(),\\n\\t\\t\\t\\tradius = options.series.pie.radius > 1 ? options.series.pie.radius : maxRadius * options.series.pie.radius,\\n\\t\\t\\t\\tx, y;\\n\\n\\t\\t\\tfor (var i = 0; i < slices.length; ++i) {\\n\\n\\t\\t\\t\\tvar s = slices[i];\\n\\n\\t\\t\\t\\tif (s.pie.show) {\\n\\n\\t\\t\\t\\t\\tctx.save();\\n\\t\\t\\t\\t\\tctx.beginPath();\\n\\t\\t\\t\\t\\tctx.moveTo(0, 0); // Center of the pie\\n\\t\\t\\t\\t\\t//ctx.scale(1, options.series.pie.tilt);\\t// this actually seems to break everything when here.\\n\\t\\t\\t\\t\\tctx.arc(0, 0, radius, s.startAngle, s.startAngle + s.angle / 2, false);\\n\\t\\t\\t\\t\\tctx.arc(0, 0, radius, s.startAngle + s.angle / 2, s.startAngle + s.angle, false);\\n\\t\\t\\t\\t\\tctx.closePath();\\n\\t\\t\\t\\t\\tx = mouseX - centerLeft;\\n\\t\\t\\t\\t\\ty = mouseY - centerTop;\\n\\n\\t\\t\\t\\t\\tif (ctx.isPointInPath) {\\n\\t\\t\\t\\t\\t\\tif (ctx.isPointInPath(mouseX - centerLeft, mouseY - centerTop)) {\\n\\t\\t\\t\\t\\t\\t\\tctx.restore();\\n\\t\\t\\t\\t\\t\\t\\treturn {\\n\\t\\t\\t\\t\\t\\t\\t\\tdatapoint: [s.percent, s.data],\\n\\t\\t\\t\\t\\t\\t\\t\\tdataIndex: 0,\\n\\t\\t\\t\\t\\t\\t\\t\\tseries: s,\\n\\t\\t\\t\\t\\t\\t\\t\\tseriesIndex: i\\n\\t\\t\\t\\t\\t\\t\\t};\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t} else {\\n\\n\\t\\t\\t\\t\\t\\t// excanvas for IE doesn;t support isPointInPath, this is a workaround.\\n\\n\\t\\t\\t\\t\\t\\tvar p1X = radius * Math.cos(s.startAngle),\\n\\t\\t\\t\\t\\t\\t\\tp1Y = radius * Math.sin(s.startAngle),\\n\\t\\t\\t\\t\\t\\t\\tp2X = radius * Math.cos(s.startAngle + s.angle / 4),\\n\\t\\t\\t\\t\\t\\t\\tp2Y = radius * Math.sin(s.startAngle + s.angle / 4),\\n\\t\\t\\t\\t\\t\\t\\tp3X = radius * Math.cos(s.startAngle + s.angle / 2),\\n\\t\\t\\t\\t\\t\\t\\tp3Y = radius * Math.sin(s.startAngle + s.angle / 2),\\n\\t\\t\\t\\t\\t\\t\\tp4X = radius * Math.cos(s.startAngle + s.angle / 1.5),\\n\\t\\t\\t\\t\\t\\t\\tp4Y = radius * Math.sin(s.startAngle + s.angle / 1.5),\\n\\t\\t\\t\\t\\t\\t\\tp5X = radius * Math.cos(s.startAngle + s.angle),\\n\\t\\t\\t\\t\\t\\t\\tp5Y = radius * Math.sin(s.startAngle + s.angle),\\n\\t\\t\\t\\t\\t\\t\\tarrPoly = [[0, 0], [p1X, p1Y], [p2X, p2Y], [p3X, p3Y], [p4X, p4Y], [p5X, p5Y]],\\n\\t\\t\\t\\t\\t\\t\\tarrPoint = [x, y];\\n\\n\\t\\t\\t\\t\\t\\t// TODO: perhaps do some mathmatical trickery here with the Y-coordinate to compensate for pie tilt?\\n\\n\\t\\t\\t\\t\\t\\tif (isPointInPoly(arrPoly, arrPoint)) {\\n\\t\\t\\t\\t\\t\\t\\tctx.restore();\\n\\t\\t\\t\\t\\t\\t\\treturn {\\n\\t\\t\\t\\t\\t\\t\\t\\tdatapoint: [s.percent, s.data],\\n\\t\\t\\t\\t\\t\\t\\t\\tdataIndex: 0,\\n\\t\\t\\t\\t\\t\\t\\t\\tseries: s,\\n\\t\\t\\t\\t\\t\\t\\t\\tseriesIndex: i\\n\\t\\t\\t\\t\\t\\t\\t};\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\tctx.restore();\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\n\\t\\t\\treturn null;\\n\\t\\t}\\n\\n\\t\\tfunction onMouseMove(e) {\\n\\t\\t\\ttriggerClickHoverEvent(\\\"plothover\\\", e);\\n\\t\\t}\\n\\n\\t\\tfunction onClick(e) {\\n\\t\\t\\ttriggerClickHoverEvent(\\\"plotclick\\\", e);\\n\\t\\t}\\n\\n\\t\\t// trigger click or hover event (they send the same parameters so we share their code)\\n\\n\\t\\tfunction triggerClickHoverEvent(eventname, e) {\\n\\n\\t\\t\\tvar offset = plot.offset();\\n\\t\\t\\tvar canvasX = parseInt(e.pageX - offset.left);\\n\\t\\t\\tvar canvasY = parseInt(e.pageY - offset.top);\\n\\t\\t\\tvar item = findNearbySlice(canvasX, canvasY);\\n\\n\\t\\t\\tif (options.grid.autoHighlight) {\\n\\n\\t\\t\\t\\t// clear auto-highlights\\n\\n\\t\\t\\t\\tfor (var i = 0; i < highlights.length; ++i) {\\n\\t\\t\\t\\t\\tvar h = highlights[i];\\n\\t\\t\\t\\t\\tif (h.auto == eventname && !(item && h.series == item.series)) {\\n\\t\\t\\t\\t\\t\\tunhighlight(h.series);\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\n\\t\\t\\t// highlight the slice\\n\\n\\t\\t\\tif (item) {\\n\\t\\t\\t\\thighlight(item.series, eventname);\\n\\t\\t\\t}\\n\\n\\t\\t\\t// trigger any hover bind events\\n\\n\\t\\t\\tvar pos = { pageX: e.pageX, pageY: e.pageY };\\n\\t\\t\\ttarget.trigger(eventname, [pos, item]);\\n\\t\\t}\\n\\n\\t\\tfunction highlight(s, auto) {\\n\\t\\t\\t//if (typeof s == \\\"number\\\") {\\n\\t\\t\\t//\\ts = series[s];\\n\\t\\t\\t//}\\n\\n\\t\\t\\tvar i = indexOfHighlight(s);\\n\\n\\t\\t\\tif (i == -1) {\\n\\t\\t\\t\\thighlights.push({ series: s, auto: auto });\\n\\t\\t\\t\\tplot.triggerRedrawOverlay();\\n\\t\\t\\t} else if (!auto) {\\n\\t\\t\\t\\thighlights[i].auto = false;\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\tfunction unhighlight(s) {\\n\\t\\t\\tif (s == null) {\\n\\t\\t\\t\\thighlights = [];\\n\\t\\t\\t\\tplot.triggerRedrawOverlay();\\n\\t\\t\\t}\\n\\n\\t\\t\\t//if (typeof s == \\\"number\\\") {\\n\\t\\t\\t//\\ts = series[s];\\n\\t\\t\\t//}\\n\\n\\t\\t\\tvar i = indexOfHighlight(s);\\n\\n\\t\\t\\tif (i != -1) {\\n\\t\\t\\t\\thighlights.splice(i, 1);\\n\\t\\t\\t\\tplot.triggerRedrawOverlay();\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\tfunction indexOfHighlight(s) {\\n\\t\\t\\tfor (var i = 0; i < highlights.length; ++i) {\\n\\t\\t\\t\\tvar h = highlights[i];\\n\\t\\t\\t\\tif (h.series == s)\\n\\t\\t\\t\\t\\treturn i;\\n\\t\\t\\t}\\n\\t\\t\\treturn -1;\\n\\t\\t}\\n\\n\\t\\tfunction drawOverlay(plot, octx) {\\n\\n\\t\\t\\tvar options = plot.getOptions();\\n\\n\\t\\t\\tvar radius = options.series.pie.radius > 1 ? options.series.pie.radius : maxRadius * options.series.pie.radius;\\n\\n\\t\\t\\toctx.save();\\n\\t\\t\\toctx.translate(centerLeft, centerTop);\\n\\t\\t\\toctx.scale(1, options.series.pie.tilt);\\n\\n\\t\\t\\tfor (var i = 0; i < highlights.length; ++i) {\\n\\t\\t\\t\\tdrawHighlight(highlights[i].series);\\n\\t\\t\\t}\\n\\n\\t\\t\\tdrawDonutHole(octx);\\n\\n\\t\\t\\toctx.restore();\\n\\n\\t\\t\\tfunction drawHighlight(series) {\\n\\n\\t\\t\\t\\tif (series.angle <= 0 || isNaN(series.angle)) {\\n\\t\\t\\t\\t\\treturn;\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t//octx.fillStyle = parseColor(options.series.pie.highlight.color).scale(null, null, null, options.series.pie.highlight.opacity).toString();\\n\\t\\t\\t\\toctx.fillStyle = \\\"rgba(255, 255, 255, \\\" + options.series.pie.highlight.opacity + \\\")\\\"; // this is temporary until we have access to parseColor\\n\\t\\t\\t\\toctx.beginPath();\\n\\t\\t\\t\\tif (Math.abs(series.angle - Math.PI * 2) > 0.000000001) {\\n\\t\\t\\t\\t\\toctx.moveTo(0, 0); // Center of the pie\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\toctx.arc(0, 0, radius, series.startAngle, series.startAngle + series.angle / 2, false);\\n\\t\\t\\t\\toctx.arc(0, 0, radius, series.startAngle + series.angle / 2, series.startAngle + series.angle, false);\\n\\t\\t\\t\\toctx.closePath();\\n\\t\\t\\t\\toctx.fill();\\n\\t\\t\\t}\\n\\t\\t}\\n\\t} // end init (plugin body)\\n\\n\\t// define pie specific options and their default values\\n\\n\\tvar options = {\\n\\t\\tseries: {\\n\\t\\t\\tpie: {\\n\\t\\t\\t\\tshow: false,\\n\\t\\t\\t\\tradius: \\\"auto\\\",\\t// actual radius of the visible pie (based on full calculated radius if <=1, or hard pixel value)\\n\\t\\t\\t\\tinnerRadius: 0, /* for donut */\\n\\t\\t\\t\\tstartAngle: 3/2,\\n\\t\\t\\t\\ttilt: 1,\\n\\t\\t\\t\\tshadow: {\\n\\t\\t\\t\\t\\tleft: 5,\\t// shadow left offset\\n\\t\\t\\t\\t\\ttop: 15,\\t// shadow top offset\\n\\t\\t\\t\\t\\talpha: 0.02\\t// shadow alpha\\n\\t\\t\\t\\t},\\n\\t\\t\\t\\toffset: {\\n\\t\\t\\t\\t\\ttop: 0,\\n\\t\\t\\t\\t\\tleft: \\\"auto\\\"\\n\\t\\t\\t\\t},\\n\\t\\t\\t\\tstroke: {\\n\\t\\t\\t\\t\\tcolor: \\\"#fff\\\",\\n\\t\\t\\t\\t\\twidth: 1\\n\\t\\t\\t\\t},\\n\\t\\t\\t\\tlabel: {\\n\\t\\t\\t\\t\\tshow: \\\"auto\\\",\\n\\t\\t\\t\\t\\tformatter: function(label, slice) {\\n\\t\\t\\t\\t\\t\\treturn \\\"<div style='font-size:x-small;text-align:center;padding:2px;color:\\\" + slice.color + \\\";'>\\\" + label + \\\"<br/>\\\" + Math.round(slice.percent) + \\\"%</div>\\\";\\n\\t\\t\\t\\t\\t},\\t// formatter function\\n\\t\\t\\t\\t\\tradius: 1,\\t// radius at which to place the labels (based on full calculated radius if <=1, or hard pixel value)\\n\\t\\t\\t\\t\\tbackground: {\\n\\t\\t\\t\\t\\t\\tcolor: null,\\n\\t\\t\\t\\t\\t\\topacity: 0\\n\\t\\t\\t\\t\\t},\\n\\t\\t\\t\\t\\tthreshold: 0\\t// percentage at which to hide the label (i.e. the slice is too narrow)\\n\\t\\t\\t\\t},\\n\\t\\t\\t\\tcombine: {\\n\\t\\t\\t\\t\\tthreshold: -1,\\t// percentage at which to combine little slices into one larger slice\\n\\t\\t\\t\\t\\tcolor: null,\\t// color to give the new slice (auto-generated if null)\\n\\t\\t\\t\\t\\tlabel: \\\"Other\\\"\\t// label to give the new slice\\n\\t\\t\\t\\t},\\n\\t\\t\\t\\thighlight: {\\n\\t\\t\\t\\t\\t//color: \\\"#fff\\\",\\t\\t// will add this functionality once parseColor is available\\n\\t\\t\\t\\t\\topacity: 0.5\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t};\\n\\n\\t$.plot.plugins.push({\\n\\t\\tinit: init,\\n\\t\\toptions: options,\\n\\t\\tname: \\\"pie\\\",\\n\\t\\tversion: \\\"1.1\\\"\\n\\t});\\n\\n})(jQuery);\\n\"\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/raw-loader!./src/assets/inspinia/plugins/flot/jquery.flot.pie.js\n// module id = 2216\n// module chunks = 1","require(\"!!/opt/atlassian/pipelines/agent/build/node_modules/script-loader/addScript.js\")(require(\"!!/opt/atlassian/pipelines/agent/build/node_modules/raw-loader/index.js!/opt/atlassian/pipelines/agent/build/src/assets/inspinia/plugins/flot/curvedLines.js\"))\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/script-loader!./src/assets/inspinia/plugins/flot/curvedLines.js\n// module id = 2217\n// module chunks = 1","module.exports = \"/* The MIT License\\r\\n\\r\\n Copyright (c) 2011 by Michael Zinsmaier and nergal.dev\\r\\n Copyright (c) 2012 by Thomas Ritou\\r\\n\\r\\n Permission is hereby granted, free of charge, to any person obtaining a copy\\r\\n of this software and associated documentation files (the \\\"Software\\\"), to deal\\r\\n in the Software without restriction, including without limitation the rights\\r\\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\\r\\n copies of the Software, and to permit persons to whom the Software is\\r\\n furnished to do so, subject to the following conditions:\\r\\n\\r\\n The above copyright notice and this permission notice shall be included in\\r\\n all copies or substantial portions of the Software.\\r\\n\\r\\n THE SOFTWARE IS PROVIDED \\\"AS IS\\\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\\r\\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\\r\\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\\r\\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\\r\\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\\r\\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\\r\\n THE SOFTWARE.\\r\\n */\\r\\n\\r\\n/*\\r\\n\\r\\n ____________________________________________________\\r\\n\\r\\n what it is:\\r\\n ____________________________________________________\\r\\n\\r\\n curvedLines is a plugin for flot, that tries to display lines in a smoother way.\\r\\n The plugin is based on nergal.dev's work https://code.google.com/p/flot/issues/detail?id=226\\r\\n and further extended with a mode that forces the min/max points of the curves to be on the\\r\\n points. Both modes are achieved through adding of more data points\\r\\n => 1) with large data sets you may get trouble\\r\\n => 2) if you want to display the points too, you have to plot them as 2nd data series over the lines\\r\\n\\r\\n && 3) consecutive x data points are not allowed to have the same value\\r\\n\\r\\n This is version 0.5 of curvedLines so it will probably not work in every case. However\\r\\n the basic form of use descirbed next works (:\\r\\n\\r\\n Feel free to further improve the code\\r\\n\\r\\n ____________________________________________________\\r\\n\\r\\n how to use it:\\r\\n ____________________________________________________\\r\\n\\r\\n var d1 = [[5,5],[7,3],[9,12]];\\r\\n\\r\\n var options = { series: { curvedLines: { active: true }}};\\r\\n\\r\\n $.plot($(\\\"#placeholder\\\"), [{data = d1, lines: { show: true}, curvedLines: {apply: true}}], options);\\r\\n\\r\\n _____________________________________________________\\r\\n\\r\\n options:\\r\\n _____________________________________________________\\r\\n\\r\\n active: bool true => plugin can be used\\r\\n apply: bool true => series will be drawn as curved line\\r\\n fit: bool true => forces the max,mins of the curve to be on the datapoints\\r\\n curvePointFactor int defines how many \\\"virtual\\\" points are used per \\\"real\\\" data point to\\r\\n emulate the curvedLines (points total = real points * curvePointFactor)\\r\\n fitPointDist: int defines the x axis distance of the additional two points that are used\\r\\n to enforce the min max condition.\\r\\n\\r\\n + line options (since v0.5 curved lines use flots line implementation for drawing\\r\\n => line options like fill, show ... are supported out of the box)\\r\\n\\r\\n */\\r\\n\\r\\n/*\\r\\n * v0.1 initial commit\\r\\n * v0.15 negative values should work now (outcommented a negative -> 0 hook hope it does no harm)\\r\\n * v0.2 added fill option (thanks to monemihir) and multi axis support (thanks to soewono effendi)\\r\\n * v0.3 improved saddle handling and added basic handling of Dates\\r\\n * v0.4 rewritten fill option (thomas ritou) mostly from original flot code (now fill between points rather than to graph bottom), corrected fill Opacity bug\\r\\n * v0.5 rewritten instead of implementing a own draw function CurvedLines is now based on the processDatapoints flot hook (credits go to thomas ritou).\\r\\n * \\t\\t This change breakes existing code however CurvedLines are now just many tiny straight lines to flot and therefore all flot lines options (like gradient fill,\\r\\n * \\t shadow) are now supported out of the box\\r\\n * v0.6 flot 0.8 compatibility and some bug fixes\\r\\n */\\r\\n\\r\\n(function($) {\\r\\n\\r\\n var options = {\\r\\n series : {\\r\\n curvedLines : {\\r\\n active : false,\\r\\n apply: false,\\r\\n fit : false,\\r\\n curvePointFactor : 20,\\r\\n fitPointDist : undefined\\r\\n }\\r\\n }\\r\\n };\\r\\n\\r\\n function init(plot) {\\r\\n\\r\\n plot.hooks.processOptions.push(processOptions);\\r\\n\\r\\n //if the plugin is active register processDatapoints method\\r\\n function processOptions(plot, options) {\\r\\n if (options.series.curvedLines.active) {\\r\\n plot.hooks.processDatapoints.unshift(processDatapoints);\\r\\n }\\r\\n }\\r\\n\\r\\n //only if the plugin is active\\r\\n function processDatapoints(plot, series, datapoints) {\\r\\n var nrPoints = datapoints.points.length / datapoints.pointsize;\\r\\n var EPSILON = 0.5; //pretty large epsilon but save\\r\\n\\r\\n if (series.curvedLines.apply == true && series.originSeries === undefined && nrPoints > (1 + EPSILON)) {\\r\\n if (series.lines.fill) {\\r\\n\\r\\n var pointsTop = calculateCurvePoints(datapoints, series.curvedLines, 1)\\r\\n ,pointsBottom = calculateCurvePoints(datapoints, series.curvedLines, 2); //flot makes sure for us that we've got a second y point if fill is true !\\r\\n\\r\\n //Merge top and bottom curve\\r\\n datapoints.pointsize = 3;\\r\\n datapoints.points = [];\\r\\n var j = 0;\\r\\n var k = 0;\\r\\n var i = 0;\\r\\n var ps = 2;\\r\\n while (i < pointsTop.length || j < pointsBottom.length) {\\r\\n if (pointsTop[i] == pointsBottom[j]) {\\r\\n datapoints.points[k] = pointsTop[i];\\r\\n datapoints.points[k + 1] = pointsTop[i + 1];\\r\\n datapoints.points[k + 2] = pointsBottom[j + 1];\\r\\n j += ps;\\r\\n i += ps;\\r\\n\\r\\n } else if (pointsTop[i] < pointsBottom[j]) {\\r\\n datapoints.points[k] = pointsTop[i];\\r\\n datapoints.points[k + 1] = pointsTop[i + 1];\\r\\n datapoints.points[k + 2] = k > 0 ? datapoints.points[k-1] : null;\\r\\n i += ps;\\r\\n } else {\\r\\n datapoints.points[k] = pointsBottom[j];\\r\\n datapoints.points[k + 1] = k > 1 ? datapoints.points[k-2] : null;\\r\\n datapoints.points[k + 2] = pointsBottom[j + 1];\\r\\n j += ps;\\r\\n }\\r\\n k += 3;\\r\\n }\\r\\n } else if (series.lines.lineWidth > 0) {\\r\\n datapoints.points = calculateCurvePoints(datapoints, series.curvedLines, 1);\\r\\n datapoints.pointsize = 2;\\r\\n }\\r\\n }\\r\\n }\\r\\n\\r\\n //no real idea whats going on here code mainly from https://code.google.com/p/flot/issues/detail?id=226\\r\\n //if fit option is selected additional datapoints get inserted before the curve calculations in nergal.dev s code.\\r\\n function calculateCurvePoints(datapoints, curvedLinesOptions, yPos) {\\r\\n\\r\\n var points = datapoints.points, ps = datapoints.pointsize;\\r\\n var num = curvedLinesOptions.curvePointFactor * (points.length / ps);\\r\\n\\r\\n var xdata = new Array;\\r\\n var ydata = new Array;\\r\\n\\r\\n var curX = -1;\\r\\n var curY = -1;\\r\\n var j = 0;\\r\\n\\r\\n if (curvedLinesOptions.fit) {\\r\\n //insert a point before and after the \\\"real\\\" data point to force the line\\r\\n //to have a max,min at the data point.\\r\\n\\r\\n var fpDist;\\r\\n if(typeof curvedLinesOptions.fitPointDist == 'undefined') {\\r\\n //estimate it\\r\\n var minX = points[0];\\r\\n var maxX = points[points.length-ps];\\r\\n fpDist = (maxX - minX) / (500 * 100); //x range / (estimated pixel length of placeholder * factor)\\r\\n } else {\\r\\n //use user defined value\\r\\n fpDist = curvedLinesOptions.fitPointDist;\\r\\n }\\r\\n\\r\\n for (var i = 0; i < points.length; i += ps) {\\r\\n\\r\\n var frontX;\\r\\n var backX;\\r\\n curX = i;\\r\\n curY = i + yPos;\\r\\n\\r\\n //add point X s\\r\\n frontX = points[curX] - fpDist;\\r\\n backX = points[curX] + fpDist;\\r\\n\\r\\n var factor = 2;\\r\\n while (frontX == points[curX] || backX == points[curX]) {\\r\\n //inside the ulp\\r\\n frontX = points[curX] - (fpDist * factor);\\r\\n backX = points[curX] + (fpDist * factor);\\r\\n factor++;\\r\\n }\\r\\n\\r\\n //add curve points\\r\\n xdata[j] = frontX;\\r\\n ydata[j] = points[curY];\\r\\n j++;\\r\\n\\r\\n xdata[j] = points[curX];\\r\\n ydata[j] = points[curY];\\r\\n j++;\\r\\n\\r\\n xdata[j] = backX;\\r\\n ydata[j] = points[curY];\\r\\n j++;\\r\\n }\\r\\n } else {\\r\\n //just use the datapoints\\r\\n for (var i = 0; i < points.length; i += ps) {\\r\\n curX = i;\\r\\n curY = i + yPos;\\r\\n\\r\\n xdata[j] = points[curX];\\r\\n ydata[j] = points[curY];\\r\\n j++;\\r\\n }\\r\\n }\\r\\n\\r\\n var n = xdata.length;\\r\\n\\r\\n var y2 = new Array();\\r\\n var delta = new Array();\\r\\n y2[0] = 0;\\r\\n y2[n - 1] = 0;\\r\\n delta[0] = 0;\\r\\n\\r\\n for (var i = 1; i < n - 1; ++i) {\\r\\n var d = (xdata[i + 1] - xdata[i - 1]);\\r\\n if (d == 0) {\\r\\n //point before current point and after current point need some space in between\\r\\n return [];\\r\\n }\\r\\n\\r\\n var s = (xdata[i] - xdata[i - 1]) / d;\\r\\n var p = s * y2[i - 1] + 2;\\r\\n y2[i] = (s - 1) / p;\\r\\n delta[i] = (ydata[i + 1] - ydata[i]) / (xdata[i + 1] - xdata[i]) - (ydata[i] - ydata[i - 1]) / (xdata[i] - xdata[i - 1]);\\r\\n delta[i] = (6 * delta[i] / (xdata[i + 1] - xdata[i - 1]) - s * delta[i - 1]) / p;\\r\\n }\\r\\n\\r\\n for (var j = n - 2; j >= 0; --j) {\\r\\n y2[j] = y2[j] * y2[j + 1] + delta[j];\\r\\n }\\r\\n\\r\\n // xmax - xmin / #points\\r\\n var step = (xdata[n - 1] - xdata[0]) / (num - 1);\\r\\n\\r\\n var xnew = new Array;\\r\\n var ynew = new Array;\\r\\n var result = new Array;\\r\\n\\r\\n xnew[0] = xdata[0];\\r\\n ynew[0] = ydata[0];\\r\\n\\r\\n result.push(xnew[0]);\\r\\n result.push(ynew[0]);\\r\\n\\r\\n for ( j = 1; j < num; ++j) {\\r\\n //new x point (sampling point for the created curve)\\r\\n xnew[j] = xnew[0] + j * step;\\r\\n\\r\\n var max = n - 1;\\r\\n var min = 0;\\r\\n\\r\\n while (max - min > 1) {\\r\\n var k = Math.round((max + min) / 2);\\r\\n if (xdata[k] > xnew[j]) {\\r\\n max = k;\\r\\n } else {\\r\\n min = k;\\r\\n }\\r\\n }\\r\\n\\r\\n //found point one to the left and one to the right of generated new point\\r\\n var h = (xdata[max] - xdata[min]);\\r\\n\\r\\n if (h == 0) {\\r\\n //similar to above two points from original x data need some space between them\\r\\n return [];\\r\\n }\\r\\n\\r\\n var a = (xdata[max] - xnew[j]) / h;\\r\\n var b = (xnew[j] - xdata[min]) / h;\\r\\n\\r\\n ynew[j] = a * ydata[min] + b * ydata[max] + ((a * a * a - a) * y2[min] + (b * b * b - b) * y2[max]) * (h * h) / 6;\\r\\n\\r\\n result.push(xnew[j]);\\r\\n result.push(ynew[j]);\\r\\n }\\r\\n\\r\\n return result;\\r\\n }\\r\\n\\r\\n }//end init\\r\\n\\r\\n $.plot.plugins.push({\\r\\n init : init,\\r\\n options : options,\\r\\n name : 'curvedLines',\\r\\n version : '0.5'\\r\\n });\\r\\n\\r\\n})(jQuery);\\r\\n\"\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/raw-loader!./src/assets/inspinia/plugins/flot/curvedLines.js\n// module id = 2218\n// module chunks = 1","require(\"!!/opt/atlassian/pipelines/agent/build/node_modules/script-loader/addScript.js\")(require(\"!!/opt/atlassian/pipelines/agent/build/node_modules/raw-loader/index.js!/opt/atlassian/pipelines/agent/build/src/assets/inspinia/plugins/flot/angular-flot.js\"))\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/script-loader!./src/assets/inspinia/plugins/flot/angular-flot.js\n// module id = 2219\n// module chunks = 1","module.exports = \"// Generated by CoffeeScript 1.8.0\\nangular.module('angular-flot', []).directive('flot', function() {\\n return {\\n restrict: 'EA',\\n template: '<div></div>',\\n scope: {\\n dataset: '=',\\n options: '=',\\n callback: '='\\n },\\n link: function(scope, element, attributes) {\\n var height, init, onDatasetChanged, onOptionsChanged, plot, plotArea, width, _ref, _ref1;\\n plot = null;\\n width = attributes.width || '100%';\\n height = attributes.height || '100%';\\n if (((_ref = scope.options) != null ? (_ref1 = _ref.legend) != null ? _ref1.container : void 0 : void 0) instanceof jQuery) {\\n throw 'Please use a jQuery expression string with the \\\"legend.container\\\" option.';\\n }\\n if (!scope.dataset) {\\n scope.dataset = [];\\n }\\n if (!scope.options) {\\n scope.options = {\\n legend: {\\n show: false\\n }\\n };\\n }\\n plotArea = $(element.children()[0]);\\n plotArea.css({\\n width: width,\\n height: height\\n });\\n init = function() {\\n var plotObj;\\n plotObj = $.plot(plotArea, scope.dataset, scope.options);\\n if (scope.callback) {\\n scope.callback(plotObj);\\n }\\n return plotObj;\\n };\\n onDatasetChanged = function(dataset) {\\n if (plot) {\\n plot.setData(dataset);\\n plot.setupGrid();\\n return plot.draw();\\n } else {\\n return plot = init();\\n }\\n };\\n scope.$watch('dataset', onDatasetChanged, true);\\n onOptionsChanged = function() {\\n return plot = init();\\n };\\n return scope.$watch('options', onOptionsChanged, true);\\n }\\n };\\n});\\n\"\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/raw-loader!./src/assets/inspinia/plugins/flot/angular-flot.js\n// module id = 2220\n// module chunks = 1","require(\"!!/opt/atlassian/pipelines/agent/build/node_modules/script-loader/addScript.js\")(require(\"!!/opt/atlassian/pipelines/agent/build/node_modules/raw-loader/index.js!/opt/atlassian/pipelines/agent/build/src/assets/inspinia/plugins/jvectormap/jquery-jvectormap-2.0.2.min.js\"))\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/script-loader!./src/assets/inspinia/plugins/jvectormap/jquery-jvectormap-2.0.2.min.js\n// module id = 2221\n// module chunks = 1","module.exports = \"/**\\n * jVectorMap version 2.0.2\\n *\\n * Copyright 2011-2014, Kirill Lebedev\\n *\\n */\\n\\n(function( $ ){\\n var apiParams = {\\n set: {\\n colors: 1,\\n values: 1,\\n backgroundColor: 1,\\n scaleColors: 1,\\n normalizeFunction: 1,\\n focus: 1\\n },\\n get: {\\n selectedRegions: 1,\\n selectedMarkers: 1,\\n mapObject: 1,\\n regionName: 1\\n }\\n };\\n\\n $.fn.vectorMap = function(options) {\\n var map,\\n methodName,\\n map = this.children('.jvectormap-container').data('mapObject');\\n\\n if (options === 'addMap') {\\n jvm.Map.maps[arguments[1]] = arguments[2];\\n } else if ((options === 'set' || options === 'get') && apiParams[options][arguments[1]]) {\\n methodName = arguments[1].charAt(0).toUpperCase()+arguments[1].substr(1);\\n return map[options+methodName].apply(map, Array.prototype.slice.call(arguments, 2));\\n } else {\\n options = options || {};\\n options.container = this;\\n map = new jvm.Map(options);\\n }\\n\\n return this;\\n };\\n})( jQuery );\\n/*! Copyright (c) 2013 Brandon Aaron (http://brandon.aaron.sh)\\n * Licensed under the MIT License (LICENSE.txt).\\n *\\n * Version: 3.1.9\\n *\\n * Requires: jQuery 1.2.2+\\n */\\n\\n(function (factory) {\\n if ( typeof define === 'function' && define.amd ) {\\n // AMD. Register as an anonymous module.\\n define(['jquery'], factory);\\n } else if (typeof exports === 'object') {\\n // Node/CommonJS style for Browserify\\n module.exports = factory;\\n } else {\\n // Browser globals\\n factory(jQuery);\\n }\\n}(function ($) {\\n\\n var toFix = ['wheel', 'mousewheel', 'DOMMouseScroll', 'MozMousePixelScroll'],\\n toBind = ( 'onwheel' in document || document.documentMode >= 9 ) ?\\n ['wheel'] : ['mousewheel', 'DomMouseScroll', 'MozMousePixelScroll'],\\n slice = Array.prototype.slice,\\n nullLowestDeltaTimeout, lowestDelta;\\n\\n if ( $.event.fixHooks ) {\\n for ( var i = toFix.length; i; ) {\\n $.event.fixHooks[ toFix[--i] ] = $.event.mouseHooks;\\n }\\n }\\n\\n var special = $.event.special.mousewheel = {\\n version: '3.1.9',\\n\\n setup: function() {\\n if ( this.addEventListener ) {\\n for ( var i = toBind.length; i; ) {\\n this.addEventListener( toBind[--i], handler, false );\\n }\\n } else {\\n this.onmousewheel = handler;\\n }\\n // Store the line height and page height for this particular element\\n $.data(this, 'mousewheel-line-height', special.getLineHeight(this));\\n $.data(this, 'mousewheel-page-height', special.getPageHeight(this));\\n },\\n\\n teardown: function() {\\n if ( this.removeEventListener ) {\\n for ( var i = toBind.length; i; ) {\\n this.removeEventListener( toBind[--i], handler, false );\\n }\\n } else {\\n this.onmousewheel = null;\\n }\\n },\\n\\n getLineHeight: function(elem) {\\n return parseInt($(elem)['offsetParent' in $.fn ? 'offsetParent' : 'parent']().css('fontSize'), 10);\\n },\\n\\n getPageHeight: function(elem) {\\n return $(elem).height();\\n },\\n\\n settings: {\\n adjustOldDeltas: true\\n }\\n };\\n\\n $.fn.extend({\\n mousewheel: function(fn) {\\n return fn ? this.bind('mousewheel', fn) : this.trigger('mousewheel');\\n },\\n\\n unmousewheel: function(fn) {\\n return this.unbind('mousewheel', fn);\\n }\\n });\\n\\n\\n function handler(event) {\\n var orgEvent = event || window.event,\\n args = slice.call(arguments, 1),\\n delta = 0,\\n deltaX = 0,\\n deltaY = 0,\\n absDelta = 0;\\n event = $.event.fix(orgEvent);\\n event.type = 'mousewheel';\\n\\n // Old school scrollwheel delta\\n if ( 'detail' in orgEvent ) { deltaY = orgEvent.detail * -1; }\\n if ( 'wheelDelta' in orgEvent ) { deltaY = orgEvent.wheelDelta; }\\n if ( 'wheelDeltaY' in orgEvent ) { deltaY = orgEvent.wheelDeltaY; }\\n if ( 'wheelDeltaX' in orgEvent ) { deltaX = orgEvent.wheelDeltaX * -1; }\\n\\n // Firefox < 17 horizontal scrolling related to DOMMouseScroll event\\n if ( 'axis' in orgEvent && orgEvent.axis === orgEvent.HORIZONTAL_AXIS ) {\\n deltaX = deltaY * -1;\\n deltaY = 0;\\n }\\n\\n // Set delta to be deltaY or deltaX if deltaY is 0 for backwards compatabilitiy\\n delta = deltaY === 0 ? deltaX : deltaY;\\n\\n // New school wheel delta (wheel event)\\n if ( 'deltaY' in orgEvent ) {\\n deltaY = orgEvent.deltaY * -1;\\n delta = deltaY;\\n }\\n if ( 'deltaX' in orgEvent ) {\\n deltaX = orgEvent.deltaX;\\n if ( deltaY === 0 ) { delta = deltaX * -1; }\\n }\\n\\n // No change actually happened, no reason to go any further\\n if ( deltaY === 0 && deltaX === 0 ) { return; }\\n\\n // Need to convert lines and pages to pixels if we aren't already in pixels\\n // There are three delta modes:\\n // * deltaMode 0 is by pixels, nothing to do\\n // * deltaMode 1 is by lines\\n // * deltaMode 2 is by pages\\n if ( orgEvent.deltaMode === 1 ) {\\n var lineHeight = $.data(this, 'mousewheel-line-height');\\n delta *= lineHeight;\\n deltaY *= lineHeight;\\n deltaX *= lineHeight;\\n } else if ( orgEvent.deltaMode === 2 ) {\\n var pageHeight = $.data(this, 'mousewheel-page-height');\\n delta *= pageHeight;\\n deltaY *= pageHeight;\\n deltaX *= pageHeight;\\n }\\n\\n // Store lowest absolute delta to normalize the delta values\\n absDelta = Math.max( Math.abs(deltaY), Math.abs(deltaX) );\\n\\n if ( !lowestDelta || absDelta < lowestDelta ) {\\n lowestDelta = absDelta;\\n\\n // Adjust older deltas if necessary\\n if ( shouldAdjustOldDeltas(orgEvent, absDelta) ) {\\n lowestDelta /= 40;\\n }\\n }\\n\\n // Adjust older deltas if necessary\\n if ( shouldAdjustOldDeltas(orgEvent, absDelta) ) {\\n // Divide all the things by 40!\\n delta /= 40;\\n deltaX /= 40;\\n deltaY /= 40;\\n }\\n\\n // Get a whole, normalized value for the deltas\\n delta = Math[ delta >= 1 ? 'floor' : 'ceil' ](delta / lowestDelta);\\n deltaX = Math[ deltaX >= 1 ? 'floor' : 'ceil' ](deltaX / lowestDelta);\\n deltaY = Math[ deltaY >= 1 ? 'floor' : 'ceil' ](deltaY / lowestDelta);\\n\\n // Add information to the event object\\n event.deltaX = deltaX;\\n event.deltaY = deltaY;\\n event.deltaFactor = lowestDelta;\\n // Go ahead and set deltaMode to 0 since we converted to pixels\\n // Although this is a little odd since we overwrite the deltaX/Y\\n // properties with normalized deltas.\\n event.deltaMode = 0;\\n\\n // Add event and delta to the front of the arguments\\n args.unshift(event, delta, deltaX, deltaY);\\n\\n // Clearout lowestDelta after sometime to better\\n // handle multiple device types that give different\\n // a different lowestDelta\\n // Ex: trackpad = 3 and mouse wheel = 120\\n if (nullLowestDeltaTimeout) { clearTimeout(nullLowestDeltaTimeout); }\\n nullLowestDeltaTimeout = setTimeout(nullLowestDelta, 200);\\n\\n return ($.event.dispatch || $.event.handle).apply(this, args);\\n }\\n\\n function nullLowestDelta() {\\n lowestDelta = null;\\n }\\n\\n function shouldAdjustOldDeltas(orgEvent, absDelta) {\\n // If this is an older event and the delta is divisable by 120,\\n // then we are assuming that the browser is treating this as an\\n // older mouse wheel event and that we should divide the deltas\\n // by 40 to try and get a more usable deltaFactor.\\n // Side note, this actually impacts the reported scroll distance\\n // in older browsers and can cause scrolling to be slower than native.\\n // Turn this off by setting $.event.special.mousewheel.settings.adjustOldDeltas to false.\\n return special.settings.adjustOldDeltas && orgEvent.type === 'mousewheel' && absDelta % 120 === 0;\\n }\\n\\n}));/**\\n * @namespace jvm Holds core methods and classes used by jVectorMap.\\n */\\nvar jvm = {\\n\\n /**\\n * Inherits child's prototype from the parent's one.\\n * @param {Function} child\\n * @param {Function} parent\\n */\\n inherits: function(child, parent) {\\n function temp() {}\\n temp.prototype = parent.prototype;\\n child.prototype = new temp();\\n child.prototype.constructor = child;\\n child.parentClass = parent;\\n },\\n\\n /**\\n * Mixes in methods from the source constructor to the target one.\\n * @param {Function} target\\n * @param {Function} source\\n */\\n mixin: function(target, source){\\n var prop;\\n\\n for (prop in source.prototype) {\\n if (source.prototype.hasOwnProperty(prop)) {\\n target.prototype[prop] = source.prototype[prop];\\n }\\n }\\n },\\n\\n min: function(values){\\n var min = Number.MAX_VALUE,\\n i;\\n\\n if (values instanceof Array) {\\n for (i = 0; i < values.length; i++) {\\n if (values[i] < min) {\\n min = values[i];\\n }\\n }\\n } else {\\n for (i in values) {\\n if (values[i] < min) {\\n min = values[i];\\n }\\n }\\n }\\n return min;\\n },\\n\\n max: function(values){\\n var max = Number.MIN_VALUE,\\n i;\\n\\n if (values instanceof Array) {\\n for (i = 0; i < values.length; i++) {\\n if (values[i] > max) {\\n max = values[i];\\n }\\n }\\n } else {\\n for (i in values) {\\n if (values[i] > max) {\\n max = values[i];\\n }\\n }\\n }\\n return max;\\n },\\n\\n keys: function(object){\\n var keys = [],\\n key;\\n\\n for (key in object) {\\n keys.push(key);\\n }\\n return keys;\\n },\\n\\n values: function(object){\\n var values = [],\\n key,\\n i;\\n\\n for (i = 0; i < arguments.length; i++) {\\n object = arguments[i];\\n for (key in object) {\\n values.push(object[key]);\\n }\\n }\\n return values;\\n },\\n\\n whenImageLoaded: function(url){\\n var deferred = new jvm.$.Deferred(),\\n img = jvm.$('<img/>');\\n\\n img.error(function(){\\n deferred.reject();\\n }).load(function(){\\n deferred.resolve(img);\\n });\\n img.attr('src', url);\\n\\n return deferred;\\n },\\n\\n isImageUrl: function(s){\\n return /\\\\.\\\\w{3,4}$/.test(s);\\n }\\n};\\n\\njvm.$ = jQuery;\\n\\n/**\\n * indexOf polyfill for IE < 9\\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf\\n */\\nif (!Array.prototype.indexOf) {\\n Array.prototype.indexOf = function (searchElement, fromIndex) {\\n\\n var k;\\n\\n // 1. Let O be the result of calling ToObject passing\\n // the this value as the argument.\\n if (this == null) {\\n throw new TypeError('\\\"this\\\" is null or not defined');\\n }\\n\\n var O = Object(this);\\n\\n // 2. Let lenValue be the result of calling the Get\\n // internal method of O with the argument \\\"length\\\".\\n // 3. Let len be ToUint32(lenValue).\\n var len = O.length >>> 0;\\n\\n // 4. If len is 0, return -1.\\n if (len === 0) {\\n return -1;\\n }\\n\\n // 5. If argument fromIndex was passed let n be\\n // ToInteger(fromIndex); else let n be 0.\\n var n = +fromIndex || 0;\\n\\n if (Math.abs(n) === Infinity) {\\n n = 0;\\n }\\n\\n // 6. If n >= len, return -1.\\n if (n >= len) {\\n return -1;\\n }\\n\\n // 7. If n >= 0, then Let k be n.\\n // 8. Else, n<0, Let k be len - abs(n).\\n // If k is less than 0, then let k be 0.\\n k = Math.max(n >= 0 ? n : len - Math.abs(n), 0);\\n\\n // 9. Repeat, while k < len\\n while (k < len) {\\n // a. Let Pk be ToString(k).\\n // This is implicit for LHS operands of the in operator\\n // b. Let kPresent be the result of calling the\\n // HasProperty internal method of O with argument Pk.\\n // This step can be combined with c\\n // c. If kPresent is true, then\\n // i. Let elementK be the result of calling the Get\\n // internal method of O with the argument ToString(k).\\n // ii. Let same be the result of applying the\\n // Strict Equality Comparison Algorithm to\\n // searchElement and elementK.\\n // iii. If same is true, return k.\\n if (k in O && O[k] === searchElement) {\\n return k;\\n }\\n k++;\\n }\\n return -1;\\n };\\n}/**\\n * Basic wrapper for DOM element.\\n * @constructor\\n * @param {String} name Tag name of the element\\n * @param {Object} config Set of parameters to initialize element with\\n */\\njvm.AbstractElement = function(name, config){\\n /**\\n * Underlying DOM element\\n * @type {DOMElement}\\n * @private\\n */\\n this.node = this.createElement(name);\\n\\n /**\\n * Name of underlying element\\n * @type {String}\\n * @private\\n */\\n this.name = name;\\n\\n /**\\n * Internal store of attributes\\n * @type {Object}\\n * @private\\n */\\n this.properties = {};\\n\\n if (config) {\\n this.set(config);\\n }\\n};\\n\\n/**\\n * Set attribute of the underlying DOM element.\\n * @param {String} name Name of attribute\\n * @param {Number|String} config Set of parameters to initialize element with\\n */\\njvm.AbstractElement.prototype.set = function(property, value){\\n var key;\\n\\n if (typeof property === 'object') {\\n for (key in property) {\\n this.properties[key] = property[key];\\n this.applyAttr(key, property[key]);\\n }\\n } else {\\n this.properties[property] = value;\\n this.applyAttr(property, value);\\n }\\n};\\n\\n/**\\n * Returns value of attribute.\\n * @param {String} name Name of attribute\\n */\\njvm.AbstractElement.prototype.get = function(property){\\n return this.properties[property];\\n};\\n\\n/**\\n * Applies attribute value to the underlying DOM element.\\n * @param {String} name Name of attribute\\n * @param {Number|String} config Value of attribute to apply\\n * @private\\n */\\njvm.AbstractElement.prototype.applyAttr = function(property, value){\\n this.node.setAttribute(property, value);\\n};\\n\\njvm.AbstractElement.prototype.remove = function(){\\n jvm.$(this.node).remove();\\n};/**\\n * Implements abstract vector canvas.\\n * @constructor\\n * @param {HTMLElement} container Container to put element to.\\n * @param {Number} width Width of canvas.\\n * @param {Number} height Height of canvas.\\n */\\njvm.AbstractCanvasElement = function(container, width, height){\\n this.container = container;\\n this.setSize(width, height);\\n this.rootElement = new jvm[this.classPrefix+'GroupElement']();\\n this.node.appendChild( this.rootElement.node );\\n this.container.appendChild(this.node);\\n}\\n\\n/**\\n * Add element to the certain group inside of the canvas.\\n * @param {HTMLElement} element Element to add to canvas.\\n * @param {HTMLElement} group Group to add element into or into root group if not provided.\\n */\\njvm.AbstractCanvasElement.prototype.add = function(element, group){\\n group = group || this.rootElement;\\n group.add(element);\\n element.canvas = this;\\n}\\n\\n/**\\n * Create path and add it to the canvas.\\n * @param {Object} config Parameters of path to create.\\n * @param {Object} style Styles of the path to create.\\n * @param {HTMLElement} group Group to add path into.\\n */\\njvm.AbstractCanvasElement.prototype.addPath = function(config, style, group){\\n var el = new jvm[this.classPrefix+'PathElement'](config, style);\\n\\n this.add(el, group);\\n return el;\\n};\\n\\n/**\\n * Create circle and add it to the canvas.\\n * @param {Object} config Parameters of path to create.\\n * @param {Object} style Styles of the path to create.\\n * @param {HTMLElement} group Group to add circle into.\\n */\\njvm.AbstractCanvasElement.prototype.addCircle = function(config, style, group){\\n var el = new jvm[this.classPrefix+'CircleElement'](config, style);\\n\\n this.add(el, group);\\n return el;\\n};\\n\\n/**\\n * Create circle and add it to the canvas.\\n * @param {Object} config Parameters of path to create.\\n * @param {Object} style Styles of the path to create.\\n * @param {HTMLElement} group Group to add circle into.\\n */\\njvm.AbstractCanvasElement.prototype.addImage = function(config, style, group){\\n var el = new jvm[this.classPrefix+'ImageElement'](config, style);\\n\\n this.add(el, group);\\n return el;\\n};\\n\\n/**\\n * Create text and add it to the canvas.\\n * @param {Object} config Parameters of path to create.\\n * @param {Object} style Styles of the path to create.\\n * @param {HTMLElement} group Group to add circle into.\\n */\\njvm.AbstractCanvasElement.prototype.addText = function(config, style, group){\\n var el = new jvm[this.classPrefix+'TextElement'](config, style);\\n\\n this.add(el, group);\\n return el;\\n};\\n\\n/**\\n * Add group to the another group inside of the canvas.\\n * @param {HTMLElement} group Group to add circle into or root group if not provided.\\n */\\njvm.AbstractCanvasElement.prototype.addGroup = function(parentGroup){\\n var el = new jvm[this.classPrefix+'GroupElement']();\\n\\n if (parentGroup) {\\n parentGroup.node.appendChild(el.node);\\n } else {\\n this.node.appendChild(el.node);\\n }\\n el.canvas = this;\\n return el;\\n};/**\\n * Abstract shape element. Shape element represents some visual vector or raster object.\\n * @constructor\\n * @param {String} name Tag name of the element.\\n * @param {Object} config Set of parameters to initialize element with.\\n * @param {Object} style Object with styles to set on element initialization.\\n */\\njvm.AbstractShapeElement = function(name, config, style){\\n this.style = style || {};\\n this.style.current = this.style.current || {};\\n this.isHovered = false;\\n this.isSelected = false;\\n this.updateStyle();\\n};\\n\\n/**\\n * Set element's style.\\n * @param {Object|String} property Could be string to set only one property or object to set several style properties at once.\\n * @param {String} value Value to set in case only one property should be set.\\n */\\njvm.AbstractShapeElement.prototype.setStyle = function(property, value){\\n var styles = {};\\n\\n if (typeof property === 'object') {\\n styles = property;\\n } else {\\n styles[property] = value;\\n }\\n jvm.$.extend(this.style.current, styles);\\n this.updateStyle();\\n};\\n\\n\\njvm.AbstractShapeElement.prototype.updateStyle = function(){\\n var attrs = {};\\n\\n jvm.AbstractShapeElement.mergeStyles(attrs, this.style.initial);\\n jvm.AbstractShapeElement.mergeStyles(attrs, this.style.current);\\n if (this.isHovered) {\\n jvm.AbstractShapeElement.mergeStyles(attrs, this.style.hover);\\n }\\n if (this.isSelected) {\\n jvm.AbstractShapeElement.mergeStyles(attrs, this.style.selected);\\n if (this.isHovered) {\\n jvm.AbstractShapeElement.mergeStyles(attrs, this.style.selectedHover);\\n }\\n }\\n this.set(attrs);\\n};\\n\\njvm.AbstractShapeElement.mergeStyles = function(styles, newStyles){\\n var key;\\n\\n newStyles = newStyles || {};\\n for (key in newStyles) {\\n if (newStyles[key] === null) {\\n delete styles[key];\\n } else {\\n styles[key] = newStyles[key];\\n }\\n }\\n}/**\\n * Wrapper for SVG element.\\n * @constructor\\n * @extends jvm.AbstractElement\\n * @param {String} name Tag name of the element\\n * @param {Object} config Set of parameters to initialize element with\\n */\\n\\njvm.SVGElement = function(name, config){\\n jvm.SVGElement.parentClass.apply(this, arguments);\\n}\\n\\njvm.inherits(jvm.SVGElement, jvm.AbstractElement);\\n\\njvm.SVGElement.svgns = \\\"http://www.w3.org/2000/svg\\\";\\n\\n/**\\n * Creates DOM element.\\n * @param {String} tagName Name of element\\n * @private\\n * @returns DOMElement\\n */\\njvm.SVGElement.prototype.createElement = function( tagName ){\\n return document.createElementNS( jvm.SVGElement.svgns, tagName );\\n};\\n\\n/**\\n * Adds CSS class for underlying DOM element.\\n * @param {String} className Name of CSS class name\\n */\\njvm.SVGElement.prototype.addClass = function( className ){\\n this.node.setAttribute('class', className);\\n};\\n\\n/**\\n * Returns constructor for element by name prefixed with 'VML'.\\n * @param {String} ctr Name of basic constructor to return\\n * proper implementation for.\\n * @returns Function\\n * @private\\n */\\njvm.SVGElement.prototype.getElementCtr = function( ctr ){\\n return jvm['SVG'+ctr];\\n};\\n\\njvm.SVGElement.prototype.getBBox = function(){\\n return this.node.getBBox();\\n};jvm.SVGGroupElement = function(){\\n jvm.SVGGroupElement.parentClass.call(this, 'g');\\n}\\n\\njvm.inherits(jvm.SVGGroupElement, jvm.SVGElement);\\n\\njvm.SVGGroupElement.prototype.add = function(element){\\n this.node.appendChild( element.node );\\n};jvm.SVGCanvasElement = function(container, width, height){\\n this.classPrefix = 'SVG';\\n jvm.SVGCanvasElement.parentClass.call(this, 'svg');\\n\\n this.defsElement = new jvm.SVGElement('defs');\\n this.node.appendChild( this.defsElement.node );\\n\\n jvm.AbstractCanvasElement.apply(this, arguments);\\n}\\n\\njvm.inherits(jvm.SVGCanvasElement, jvm.SVGElement);\\njvm.mixin(jvm.SVGCanvasElement, jvm.AbstractCanvasElement);\\n\\njvm.SVGCanvasElement.prototype.setSize = function(width, height){\\n this.width = width;\\n this.height = height;\\n this.node.setAttribute('width', width);\\n this.node.setAttribute('height', height);\\n};\\n\\njvm.SVGCanvasElement.prototype.applyTransformParams = function(scale, transX, transY) {\\n this.scale = scale;\\n this.transX = transX;\\n this.transY = transY;\\n this.rootElement.node.setAttribute('transform', 'scale('+scale+') translate('+transX+', '+transY+')');\\n};jvm.SVGShapeElement = function(name, config, style){\\n jvm.SVGShapeElement.parentClass.call(this, name, config);\\n jvm.AbstractShapeElement.apply(this, arguments);\\n};\\n\\njvm.inherits(jvm.SVGShapeElement, jvm.SVGElement);\\njvm.mixin(jvm.SVGShapeElement, jvm.AbstractShapeElement);\\n\\njvm.SVGShapeElement.prototype.applyAttr = function(attr, value){\\n var patternEl,\\n imageEl,\\n that = this;\\n\\n if (attr === 'fill' && jvm.isImageUrl(value)) {\\n if (!jvm.SVGShapeElement.images[value]) {\\n jvm.whenImageLoaded(value).then(function(img){\\n imageEl = new jvm.SVGElement('image');\\n imageEl.node.setAttributeNS('http://www.w3.org/1999/xlink', 'href', value);\\n imageEl.applyAttr('x', '0');\\n imageEl.applyAttr('y', '0');\\n imageEl.applyAttr('width', img[0].width);\\n imageEl.applyAttr('height', img[0].height);\\n\\n patternEl = new jvm.SVGElement('pattern');\\n patternEl.applyAttr('id', 'image'+jvm.SVGShapeElement.imageCounter);\\n patternEl.applyAttr('x', 0);\\n patternEl.applyAttr('y', 0);\\n patternEl.applyAttr('width', img[0].width / 2);\\n patternEl.applyAttr('height', img[0].height / 2);\\n patternEl.applyAttr('viewBox', '0 0 '+img[0].width+' '+img[0].height);\\n patternEl.applyAttr('patternUnits', 'userSpaceOnUse');\\n patternEl.node.appendChild( imageEl.node );\\n\\n that.canvas.defsElement.node.appendChild( patternEl.node );\\n\\n jvm.SVGShapeElement.images[value] = jvm.SVGShapeElement.imageCounter++;\\n\\n that.applyAttr('fill', 'url(#image'+jvm.SVGShapeElement.images[value]+')');\\n });\\n } else {\\n this.applyAttr('fill', 'url(#image'+jvm.SVGShapeElement.images[value]+')');\\n }\\n } else {\\n jvm.SVGShapeElement.parentClass.prototype.applyAttr.apply(this, arguments);\\n }\\n};\\n\\njvm.SVGShapeElement.imageCounter = 1;\\njvm.SVGShapeElement.images = {};jvm.SVGPathElement = function(config, style){\\n jvm.SVGPathElement.parentClass.call(this, 'path', config, style);\\n this.node.setAttribute('fill-rule', 'evenodd');\\n}\\n\\njvm.inherits(jvm.SVGPathElement, jvm.SVGShapeElement);jvm.SVGCircleElement = function(config, style){\\n jvm.SVGCircleElement.parentClass.call(this, 'circle', config, style);\\n};\\n\\njvm.inherits(jvm.SVGCircleElement, jvm.SVGShapeElement);jvm.SVGImageElement = function(config, style){\\n jvm.SVGImageElement.parentClass.call(this, 'image', config, style);\\n};\\n\\njvm.inherits(jvm.SVGImageElement, jvm.SVGShapeElement);\\n\\njvm.SVGImageElement.prototype.applyAttr = function(attr, value){\\n var that = this;\\n\\n if (attr == 'image') {\\n jvm.whenImageLoaded(value).then(function(img){\\n that.node.setAttributeNS('http://www.w3.org/1999/xlink', 'href', value);\\n that.width = img[0].width;\\n that.height = img[0].height;\\n that.applyAttr('width', that.width);\\n that.applyAttr('height', that.height);\\n\\n that.applyAttr('x', that.cx - that.width / 2);\\n that.applyAttr('y', that.cy - that.height / 2);\\n\\n jvm.$(that.node).trigger('imageloaded', [img]);\\n });\\n } else if(attr == 'cx') {\\n this.cx = value;\\n if (this.width) {\\n this.applyAttr('x', value - this.width / 2);\\n }\\n } else if(attr == 'cy') {\\n this.cy = value;\\n if (this.height) {\\n this.applyAttr('y', value - this.height / 2);\\n }\\n } else {\\n jvm.SVGImageElement.parentClass.prototype.applyAttr.apply(this, arguments);\\n }\\n};jvm.SVGTextElement = function(config, style){\\n jvm.SVGTextElement.parentClass.call(this, 'text', config, style);\\n}\\n\\njvm.inherits(jvm.SVGTextElement, jvm.SVGShapeElement);\\n\\njvm.SVGTextElement.prototype.applyAttr = function(attr, value){\\n if (attr === 'text') {\\n this.node.textContent = value;\\n } else {\\n jvm.SVGTextElement.parentClass.prototype.applyAttr.apply(this, arguments);\\n }\\n};/**\\n * Wrapper for VML element.\\n * @constructor\\n * @extends jvm.AbstractElement\\n * @param {String} name Tag name of the element\\n * @param {Object} config Set of parameters to initialize element with\\n */\\n\\njvm.VMLElement = function(name, config){\\n if (!jvm.VMLElement.VMLInitialized) {\\n jvm.VMLElement.initializeVML();\\n }\\n\\n jvm.VMLElement.parentClass.apply(this, arguments);\\n};\\n\\njvm.inherits(jvm.VMLElement, jvm.AbstractElement);\\n\\n/**\\n * Shows if VML was already initialized for the current document or not.\\n * @static\\n * @private\\n * @type {Boolean}\\n */\\njvm.VMLElement.VMLInitialized = false;\\n\\n/**\\n * Initializes VML handling before creating the first element\\n * (adds CSS class and creates namespace). Adds one of two forms\\n * of createElement method depending of support by browser.\\n * @static\\n * @private\\n */\\n\\n // The following method of VML handling is borrowed from the\\n // Raphael library by Dmitry Baranovsky.\\n\\njvm.VMLElement.initializeVML = function(){\\n try {\\n if (!document.namespaces.rvml) {\\n document.namespaces.add(\\\"rvml\\\",\\\"urn:schemas-microsoft-com:vml\\\");\\n }\\n /**\\n * Creates DOM element.\\n * @param {String} tagName Name of element\\n * @private\\n * @returns DOMElement\\n */\\n jvm.VMLElement.prototype.createElement = function (tagName) {\\n return document.createElement('<rvml:' + tagName + ' class=\\\"rvml\\\">');\\n };\\n } catch (e) {\\n /**\\n * @private\\n */\\n jvm.VMLElement.prototype.createElement = function (tagName) {\\n return document.createElement('<' + tagName + ' xmlns=\\\"urn:schemas-microsoft.com:vml\\\" class=\\\"rvml\\\">');\\n };\\n }\\n document.createStyleSheet().addRule(\\\".rvml\\\", \\\"behavior:url(#default#VML)\\\");\\n jvm.VMLElement.VMLInitialized = true;\\n};\\n\\n/**\\n * Returns constructor for element by name prefixed with 'VML'.\\n * @param {String} ctr Name of basic constructor to return\\n * proper implementation for.\\n * @returns Function\\n * @private\\n */\\njvm.VMLElement.prototype.getElementCtr = function( ctr ){\\n return jvm['VML'+ctr];\\n};\\n\\n/**\\n * Adds CSS class for underlying DOM element.\\n * @param {String} className Name of CSS class name\\n */\\njvm.VMLElement.prototype.addClass = function( className ){\\n jvm.$(this.node).addClass(className);\\n};\\n\\n/**\\n * Applies attribute value to the underlying DOM element.\\n * @param {String} name Name of attribute\\n * @param {Number|String} config Value of attribute to apply\\n * @private\\n */\\njvm.VMLElement.prototype.applyAttr = function( attr, value ){\\n this.node[attr] = value;\\n};\\n\\n/**\\n * Returns boundary box for the element.\\n * @returns {Object} Boundary box with numeric fields: x, y, width, height\\n * @override\\n */\\njvm.VMLElement.prototype.getBBox = function(){\\n var node = jvm.$(this.node);\\n\\n return {\\n x: node.position().left / this.canvas.scale,\\n y: node.position().top / this.canvas.scale,\\n width: node.width() / this.canvas.scale,\\n height: node.height() / this.canvas.scale\\n };\\n};jvm.VMLGroupElement = function(){\\n jvm.VMLGroupElement.parentClass.call(this, 'group');\\n\\n this.node.style.left = '0px';\\n this.node.style.top = '0px';\\n this.node.coordorigin = \\\"0 0\\\";\\n};\\n\\njvm.inherits(jvm.VMLGroupElement, jvm.VMLElement);\\n\\njvm.VMLGroupElement.prototype.add = function(element){\\n this.node.appendChild( element.node );\\n};jvm.VMLCanvasElement = function(container, width, height){\\n this.classPrefix = 'VML';\\n jvm.VMLCanvasElement.parentClass.call(this, 'group');\\n jvm.AbstractCanvasElement.apply(this, arguments);\\n this.node.style.position = 'absolute';\\n};\\n\\njvm.inherits(jvm.VMLCanvasElement, jvm.VMLElement);\\njvm.mixin(jvm.VMLCanvasElement, jvm.AbstractCanvasElement);\\n\\njvm.VMLCanvasElement.prototype.setSize = function(width, height){\\n var paths,\\n groups,\\n i,\\n l;\\n\\n this.width = width;\\n this.height = height;\\n this.node.style.width = width + \\\"px\\\";\\n this.node.style.height = height + \\\"px\\\";\\n this.node.coordsize = width+' '+height;\\n this.node.coordorigin = \\\"0 0\\\";\\n if (this.rootElement) {\\n paths = this.rootElement.node.getElementsByTagName('shape');\\n for(i = 0, l = paths.length; i < l; i++) {\\n paths[i].coordsize = width+' '+height;\\n paths[i].style.width = width+'px';\\n paths[i].style.height = height+'px';\\n }\\n groups = this.node.getElementsByTagName('group');\\n for(i = 0, l = groups.length; i < l; i++) {\\n groups[i].coordsize = width+' '+height;\\n groups[i].style.width = width+'px';\\n groups[i].style.height = height+'px';\\n }\\n }\\n};\\n\\njvm.VMLCanvasElement.prototype.applyTransformParams = function(scale, transX, transY) {\\n this.scale = scale;\\n this.transX = transX;\\n this.transY = transY;\\n this.rootElement.node.coordorigin = (this.width-transX-this.width/100)+','+(this.height-transY-this.height/100);\\n this.rootElement.node.coordsize = this.width/scale+','+this.height/scale;\\n};jvm.VMLShapeElement = function(name, config){\\n jvm.VMLShapeElement.parentClass.call(this, name, config);\\n\\n this.fillElement = new jvm.VMLElement('fill');\\n this.strokeElement = new jvm.VMLElement('stroke');\\n this.node.appendChild(this.fillElement.node);\\n this.node.appendChild(this.strokeElement.node);\\n this.node.stroked = false;\\n\\n jvm.AbstractShapeElement.apply(this, arguments);\\n};\\n\\njvm.inherits(jvm.VMLShapeElement, jvm.VMLElement);\\njvm.mixin(jvm.VMLShapeElement, jvm.AbstractShapeElement);\\n\\njvm.VMLShapeElement.prototype.applyAttr = function(attr, value){\\n switch (attr) {\\n case 'fill':\\n this.node.fillcolor = value;\\n break;\\n case 'fill-opacity':\\n this.fillElement.node.opacity = Math.round(value*100)+'%';\\n break;\\n case 'stroke':\\n if (value === 'none') {\\n this.node.stroked = false;\\n } else {\\n this.node.stroked = true;\\n }\\n this.node.strokecolor = value;\\n break;\\n case 'stroke-opacity':\\n this.strokeElement.node.opacity = Math.round(value*100)+'%';\\n break;\\n case 'stroke-width':\\n if (parseInt(value, 10) === 0) {\\n this.node.stroked = false;\\n } else {\\n this.node.stroked = true;\\n }\\n this.node.strokeweight = value;\\n break;\\n case 'd':\\n this.node.path = jvm.VMLPathElement.pathSvgToVml(value);\\n break;\\n default:\\n jvm.VMLShapeElement.parentClass.prototype.applyAttr.apply(this, arguments);\\n }\\n};jvm.VMLPathElement = function(config, style){\\n var scale = new jvm.VMLElement('skew');\\n\\n jvm.VMLPathElement.parentClass.call(this, 'shape', config, style);\\n\\n this.node.coordorigin = \\\"0 0\\\";\\n\\n scale.node.on = true;\\n scale.node.matrix = '0.01,0,0,0.01,0,0';\\n scale.node.offset = '0,0';\\n\\n this.node.appendChild(scale.node);\\n};\\n\\njvm.inherits(jvm.VMLPathElement, jvm.VMLShapeElement);\\n\\njvm.VMLPathElement.prototype.applyAttr = function(attr, value){\\n if (attr === 'd') {\\n this.node.path = jvm.VMLPathElement.pathSvgToVml(value);\\n } else {\\n jvm.VMLShapeElement.prototype.applyAttr.call(this, attr, value);\\n }\\n};\\n\\njvm.VMLPathElement.pathSvgToVml = function(path) {\\n var cx = 0, cy = 0, ctrlx, ctrly;\\n\\n path = path.replace(/(-?\\\\d+)e(-?\\\\d+)/g, '0');\\n return path.replace(/([MmLlHhVvCcSs])\\\\s*((?:-?\\\\d*(?:\\\\.\\\\d+)?\\\\s*,?\\\\s*)+)/g, function(segment, letter, coords, index){\\n coords = coords.replace(/(\\\\d)-/g, '$1,-')\\n .replace(/^\\\\s+/g, '')\\n .replace(/\\\\s+$/g, '')\\n .replace(/\\\\s+/g, ',').split(',');\\n if (!coords[0]) coords.shift();\\n for (var i=0, l=coords.length; i<l; i++) {\\n coords[i] = Math.round(100*coords[i]);\\n }\\n switch (letter) {\\n case 'm':\\n cx += coords[0];\\n cy += coords[1];\\n return 't'+coords.join(',');\\n case 'M':\\n cx = coords[0];\\n cy = coords[1];\\n return 'm'+coords.join(',');\\n case 'l':\\n cx += coords[0];\\n cy += coords[1];\\n return 'r'+coords.join(',');\\n case 'L':\\n cx = coords[0];\\n cy = coords[1];\\n return 'l'+coords.join(',');\\n case 'h':\\n cx += coords[0];\\n return 'r'+coords[0]+',0';\\n case 'H':\\n cx = coords[0];\\n return 'l'+cx+','+cy;\\n case 'v':\\n cy += coords[0];\\n return 'r0,'+coords[0];\\n case 'V':\\n cy = coords[0];\\n return 'l'+cx+','+cy;\\n case 'c':\\n ctrlx = cx + coords[coords.length-4];\\n ctrly = cy + coords[coords.length-3];\\n cx += coords[coords.length-2];\\n cy += coords[coords.length-1];\\n return 'v'+coords.join(',');\\n case 'C':\\n ctrlx = coords[coords.length-4];\\n ctrly = coords[coords.length-3];\\n cx = coords[coords.length-2];\\n cy = coords[coords.length-1];\\n return 'c'+coords.join(',');\\n case 's':\\n coords.unshift(cy-ctrly);\\n coords.unshift(cx-ctrlx);\\n ctrlx = cx + coords[coords.length-4];\\n ctrly = cy + coords[coords.length-3];\\n cx += coords[coords.length-2];\\n cy += coords[coords.length-1];\\n return 'v'+coords.join(',');\\n case 'S':\\n coords.unshift(cy+cy-ctrly);\\n coords.unshift(cx+cx-ctrlx);\\n ctrlx = coords[coords.length-4];\\n ctrly = coords[coords.length-3];\\n cx = coords[coords.length-2];\\n cy = coords[coords.length-1];\\n return 'c'+coords.join(',');\\n }\\n return '';\\n }).replace(/z/g, 'e');\\n};jvm.VMLCircleElement = function(config, style){\\n jvm.VMLCircleElement.parentClass.call(this, 'oval', config, style);\\n};\\n\\njvm.inherits(jvm.VMLCircleElement, jvm.VMLShapeElement);\\n\\njvm.VMLCircleElement.prototype.applyAttr = function(attr, value){\\n switch (attr) {\\n case 'r':\\n this.node.style.width = value*2+'px';\\n this.node.style.height = value*2+'px';\\n this.applyAttr('cx', this.get('cx') || 0);\\n this.applyAttr('cy', this.get('cy') || 0);\\n break;\\n case 'cx':\\n if (!value) return;\\n this.node.style.left = value - (this.get('r') || 0) + 'px';\\n break;\\n case 'cy':\\n if (!value) return;\\n this.node.style.top = value - (this.get('r') || 0) + 'px';\\n break;\\n default:\\n jvm.VMLCircleElement.parentClass.prototype.applyAttr.call(this, attr, value);\\n }\\n};/**\\n * Class for vector images manipulations.\\n * @constructor\\n * @param {DOMElement} container to place canvas to\\n * @param {Number} width\\n * @param {Number} height\\n */\\njvm.VectorCanvas = function(container, width, height) {\\n this.mode = window.SVGAngle ? 'svg' : 'vml';\\n\\n if (this.mode == 'svg') {\\n this.impl = new jvm.SVGCanvasElement(container, width, height);\\n } else {\\n this.impl = new jvm.VMLCanvasElement(container, width, height);\\n }\\n this.impl.mode = this.mode;\\n return this.impl;\\n};jvm.SimpleScale = function(scale){\\n this.scale = scale;\\n};\\n\\njvm.SimpleScale.prototype.getValue = function(value){\\n return value;\\n};jvm.OrdinalScale = function(scale){\\n this.scale = scale;\\n};\\n\\njvm.OrdinalScale.prototype.getValue = function(value){\\n return this.scale[value];\\n};\\n\\njvm.OrdinalScale.prototype.getTicks = function(){\\n var ticks = [],\\n key;\\n\\n for (key in this.scale) {\\n ticks.push({\\n label: key,\\n value: this.scale[key]\\n });\\n }\\n\\n return ticks;\\n};jvm.NumericScale = function(scale, normalizeFunction, minValue, maxValue) {\\n this.scale = [];\\n\\n normalizeFunction = normalizeFunction || 'linear';\\n\\n if (scale) this.setScale(scale);\\n if (normalizeFunction) this.setNormalizeFunction(normalizeFunction);\\n if (typeof minValue !== 'undefined' ) this.setMin(minValue);\\n if (typeof maxValue !== 'undefined' ) this.setMax(maxValue);\\n};\\n\\njvm.NumericScale.prototype = {\\n setMin: function(min) {\\n this.clearMinValue = min;\\n if (typeof this.normalize === 'function') {\\n this.minValue = this.normalize(min);\\n } else {\\n this.minValue = min;\\n }\\n },\\n\\n setMax: function(max) {\\n this.clearMaxValue = max;\\n if (typeof this.normalize === 'function') {\\n this.maxValue = this.normalize(max);\\n } else {\\n this.maxValue = max;\\n }\\n },\\n\\n setScale: function(scale) {\\n var i;\\n\\n this.scale = [];\\n for (i = 0; i < scale.length; i++) {\\n this.scale[i] = [scale[i]];\\n }\\n },\\n\\n setNormalizeFunction: function(f) {\\n if (f === 'polynomial') {\\n this.normalize = function(value) {\\n return Math.pow(value, 0.2);\\n }\\n } else if (f === 'linear') {\\n delete this.normalize;\\n } else {\\n this.normalize = f;\\n }\\n this.setMin(this.clearMinValue);\\n this.setMax(this.clearMaxValue);\\n },\\n\\n getValue: function(value) {\\n var lengthes = [],\\n fullLength = 0,\\n l,\\n i = 0,\\n c;\\n\\n if (typeof this.normalize === 'function') {\\n value = this.normalize(value);\\n }\\n for (i = 0; i < this.scale.length-1; i++) {\\n l = this.vectorLength(this.vectorSubtract(this.scale[i+1], this.scale[i]));\\n lengthes.push(l);\\n fullLength += l;\\n }\\n\\n c = (this.maxValue - this.minValue) / fullLength;\\n for (i=0; i<lengthes.length; i++) {\\n lengthes[i] *= c;\\n }\\n\\n i = 0;\\n value -= this.minValue;\\n while (value - lengthes[i] >= 0) {\\n value -= lengthes[i];\\n i++;\\n }\\n\\n if (i == this.scale.length - 1) {\\n value = this.vectorToNum(this.scale[i])\\n } else {\\n value = (\\n this.vectorToNum(\\n this.vectorAdd(this.scale[i],\\n this.vectorMult(\\n this.vectorSubtract(this.scale[i+1], this.scale[i]),\\n (value) / (lengthes[i])\\n )\\n )\\n )\\n );\\n }\\n\\n return value;\\n },\\n\\n vectorToNum: function(vector) {\\n var num = 0,\\n i;\\n\\n for (i = 0; i < vector.length; i++) {\\n num += Math.round(vector[i])*Math.pow(256, vector.length-i-1);\\n }\\n return num;\\n },\\n\\n vectorSubtract: function(vector1, vector2) {\\n var vector = [],\\n i;\\n\\n for (i = 0; i < vector1.length; i++) {\\n vector[i] = vector1[i] - vector2[i];\\n }\\n return vector;\\n },\\n\\n vectorAdd: function(vector1, vector2) {\\n var vector = [],\\n i;\\n\\n for (i = 0; i < vector1.length; i++) {\\n vector[i] = vector1[i] + vector2[i];\\n }\\n return vector;\\n },\\n\\n vectorMult: function(vector, num) {\\n var result = [],\\n i;\\n\\n for (i = 0; i < vector.length; i++) {\\n result[i] = vector[i] * num;\\n }\\n return result;\\n },\\n\\n vectorLength: function(vector) {\\n var result = 0,\\n i;\\n for (i = 0; i < vector.length; i++) {\\n result += vector[i] * vector[i];\\n }\\n return Math.sqrt(result);\\n },\\n\\n /* Derived from d3 implementation https://github.com/mbostock/d3/blob/master/src/scale/linear.js#L94 */\\n getTicks: function(){\\n var m = 5,\\n extent = [this.clearMinValue, this.clearMaxValue],\\n span = extent[1] - extent[0],\\n step = Math.pow(10, Math.floor(Math.log(span / m) / Math.LN10)),\\n err = m / span * step,\\n ticks = [],\\n tick,\\n v;\\n\\n if (err <= .15) step *= 10;\\n else if (err <= .35) step *= 5;\\n else if (err <= .75) step *= 2;\\n\\n extent[0] = Math.floor(extent[0] / step) * step;\\n extent[1] = Math.ceil(extent[1] / step) * step;\\n\\n tick = extent[0];\\n while (tick <= extent[1]) {\\n if (tick == extent[0]) {\\n v = this.clearMinValue;\\n } else if (tick == extent[1]) {\\n v = this.clearMaxValue;\\n } else {\\n v = tick;\\n }\\n ticks.push({\\n label: tick,\\n value: this.getValue(v)\\n });\\n tick += step;\\n }\\n\\n return ticks;\\n }\\n};\\njvm.ColorScale = function(colors, normalizeFunction, minValue, maxValue) {\\n jvm.ColorScale.parentClass.apply(this, arguments);\\n}\\n\\njvm.inherits(jvm.ColorScale, jvm.NumericScale);\\n\\njvm.ColorScale.prototype.setScale = function(scale) {\\n var i;\\n\\n for (i = 0; i < scale.length; i++) {\\n this.scale[i] = jvm.ColorScale.rgbToArray(scale[i]);\\n }\\n};\\n\\njvm.ColorScale.prototype.getValue = function(value) {\\n return jvm.ColorScale.numToRgb(jvm.ColorScale.parentClass.prototype.getValue.call(this, value));\\n};\\n\\njvm.ColorScale.arrayToRgb = function(ar) {\\n var rgb = '#',\\n d,\\n i;\\n\\n for (i = 0; i < ar.length; i++) {\\n d = ar[i].toString(16);\\n rgb += d.length == 1 ? '0'+d : d;\\n }\\n return rgb;\\n};\\n\\njvm.ColorScale.numToRgb = function(num) {\\n num = num.toString(16);\\n\\n while (num.length < 6) {\\n num = '0' + num;\\n }\\n\\n return '#'+num;\\n};\\n\\njvm.ColorScale.rgbToArray = function(rgb) {\\n rgb = rgb.substr(1);\\n return [parseInt(rgb.substr(0, 2), 16), parseInt(rgb.substr(2, 2), 16), parseInt(rgb.substr(4, 2), 16)];\\n};/**\\n * Represents map legend.\\n * @constructor\\n * @param {Object} params Configuration parameters.\\n * @param {String} params.cssClass Additional CSS class to apply to legend element.\\n * @param {Boolean} params.vertical If <code>true</code> legend will be rendered as vertical.\\n * @param {String} params.title Legend title.\\n * @param {Function} params.labelRender Method to convert series values to legend labels.\\n */\\njvm.Legend = function(params) {\\n this.params = params || {};\\n this.map = this.params.map;\\n this.series = this.params.series;\\n this.body = jvm.$('<div/>');\\n this.body.addClass('jvectormap-legend');\\n if (this.params.cssClass) {\\n this.body.addClass(this.params.cssClass);\\n }\\n\\n if (params.vertical) {\\n this.map.legendCntVertical.append( this.body );\\n } else {\\n this.map.legendCntHorizontal.append( this.body );\\n }\\n\\n this.render();\\n}\\n\\njvm.Legend.prototype.render = function(){\\n var ticks = this.series.scale.getTicks(),\\n i,\\n inner = jvm.$('<div/>').addClass('jvectormap-legend-inner'),\\n tick,\\n sample,\\n label;\\n\\n this.body.html('');\\n if (this.params.title) {\\n this.body.append(\\n jvm.$('<div/>').addClass('jvectormap-legend-title').html(this.params.title)\\n );\\n }\\n this.body.append(inner);\\n\\n for (i = 0; i < ticks.length; i++) {\\n tick = jvm.$('<div/>').addClass('jvectormap-legend-tick');\\n sample = jvm.$('<div/>').addClass('jvectormap-legend-tick-sample');\\n\\n switch (this.series.params.attribute) {\\n case 'fill':\\n if (jvm.isImageUrl(ticks[i].value)) {\\n sample.css('background', 'url('+ticks[i].value+')');\\n } else {\\n sample.css('background', ticks[i].value);\\n }\\n break;\\n case 'stroke':\\n sample.css('background', ticks[i].value);\\n break;\\n case 'image':\\n sample.css('background', 'url('+ticks[i].value+') no-repeat center center');\\n break;\\n case 'r':\\n jvm.$('<div/>').css({\\n 'border-radius': ticks[i].value,\\n border: this.map.params.markerStyle.initial['stroke-width']+'px '+\\n this.map.params.markerStyle.initial['stroke']+' solid',\\n width: ticks[i].value * 2 + 'px',\\n height: ticks[i].value * 2 + 'px',\\n background: this.map.params.markerStyle.initial['fill']\\n }).appendTo(sample);\\n break;\\n }\\n tick.append( sample );\\n label = ticks[i].label;\\n if (this.params.labelRender) {\\n label = this.params.labelRender(label);\\n }\\n tick.append( jvm.$('<div>'+label+' </div>').addClass('jvectormap-legend-tick-text') );\\n inner.append(tick);\\n }\\n inner.append( jvm.$('<div/>').css('clear', 'both') );\\n}/**\\n * Creates data series.\\n * @constructor\\n * @param {Object} params Parameters to initialize series with.\\n * @param {Array} params.values The data set to visualize.\\n * @param {String} params.attribute Numberic or color attribute to use for data visualization. This could be: <code>fill</code>, <code>stroke</code>, <code>fill-opacity</code>, <code>stroke-opacity</code> for markers and regions and <code>r</code> (radius) for markers only.\\n * @param {Array} params.scale Values used to map a dimension of data to a visual representation. The first value sets visualization for minimum value from the data set and the last value sets visualization for the maximum value. There also could be intermidiate values. Default value is <code>['#C8EEFF', '#0071A4']</code>\\n * @param {Function|String} params.normalizeFunction The function used to map input values to the provided scale. This parameter could be provided as function or one of the strings: <code>'linear'</code> or <code>'polynomial'</code>, while <code>'linear'</code> is used by default. The function provided takes value from the data set as an input and returns corresponding value from the scale.\\n * @param {Number} params.min Minimum value of the data set. Could be calculated automatically if not provided.\\n * @param {Number} params.min Maximum value of the data set. Could be calculated automatically if not provided.\\n */\\njvm.DataSeries = function(params, elements, map) {\\n var scaleConstructor;\\n\\n params = params || {};\\n params.attribute = params.attribute || 'fill';\\n\\n this.elements = elements;\\n this.params = params;\\n this.map = map;\\n\\n if (params.attributes) {\\n this.setAttributes(params.attributes);\\n }\\n\\n if (jvm.$.isArray(params.scale)) {\\n scaleConstructor = (params.attribute === 'fill' || params.attribute === 'stroke') ? jvm.ColorScale : jvm.NumericScale;\\n this.scale = new scaleConstructor(params.scale, params.normalizeFunction, params.min, params.max);\\n } else if (params.scale) {\\n this.scale = new jvm.OrdinalScale(params.scale);\\n } else {\\n this.scale = new jvm.SimpleScale(params.scale);\\n }\\n\\n this.values = params.values || {};\\n this.setValues(this.values);\\n\\n if (this.params.legend) {\\n this.legend = new jvm.Legend($.extend({\\n map: this.map,\\n series: this\\n }, this.params.legend))\\n }\\n};\\n\\njvm.DataSeries.prototype = {\\n setAttributes: function(key, attr){\\n var attrs = key,\\n code;\\n\\n if (typeof key == 'string') {\\n if (this.elements[key]) {\\n this.elements[key].setStyle(this.params.attribute, attr);\\n }\\n } else {\\n for (code in attrs) {\\n if (this.elements[code]) {\\n this.elements[code].element.setStyle(this.params.attribute, attrs[code]);\\n }\\n }\\n }\\n },\\n\\n /**\\n * Set values for the data set.\\n * @param {Object} values Object which maps codes of regions or markers to values.\\n */\\n setValues: function(values) {\\n var max = -Number.MAX_VALUE,\\n min = Number.MAX_VALUE,\\n val,\\n cc,\\n attrs = {};\\n\\n if (!(this.scale instanceof jvm.OrdinalScale) && !(this.scale instanceof jvm.SimpleScale)) {\\n // we have a color scale as an array\\n if (typeof this.params.min === 'undefined' || typeof this.params.max === 'undefined') {\\n // min and/or max are not defined, so calculate them\\n for (cc in values) {\\n val = parseFloat(values[cc]);\\n if (val > max) max = val;\\n if (val < min) min = val;\\n }\\n }\\n\\n if (typeof this.params.min === 'undefined') {\\n this.scale.setMin(min);\\n this.params.min = min;\\n } else {\\n this.scale.setMin(this.params.min);\\n }\\n\\n if (typeof this.params.max === 'undefined') {\\n this.scale.setMax(max);\\n this.params.max = max;\\n } else {\\n this.scale.setMax(this.params.max);\\n }\\n\\n for (cc in values) {\\n if (cc != 'indexOf') {\\n val = parseFloat(values[cc]);\\n if (!isNaN(val)) {\\n attrs[cc] = this.scale.getValue(val);\\n } else {\\n attrs[cc] = this.elements[cc].element.style.initial[this.params.attribute];\\n }\\n }\\n }\\n } else {\\n for (cc in values) {\\n if (values[cc]) {\\n attrs[cc] = this.scale.getValue(values[cc]);\\n } else {\\n attrs[cc] = this.elements[cc].element.style.initial[this.params.attribute];\\n }\\n }\\n }\\n\\n this.setAttributes(attrs);\\n jvm.$.extend(this.values, values);\\n },\\n\\n clear: function(){\\n var key,\\n attrs = {};\\n\\n for (key in this.values) {\\n if (this.elements[key]) {\\n attrs[key] = this.elements[key].element.shape.style.initial[this.params.attribute];\\n }\\n }\\n this.setAttributes(attrs);\\n this.values = {};\\n },\\n\\n /**\\n * Set scale of the data series.\\n * @param {Array} scale Values representing scale.\\n */\\n setScale: function(scale) {\\n this.scale.setScale(scale);\\n if (this.values) {\\n this.setValues(this.values);\\n }\\n },\\n\\n /**\\n * Set normalize function of the data series.\\n * @param {Function|String} normilizeFunction.\\n */\\n setNormalizeFunction: function(f) {\\n this.scale.setNormalizeFunction(f);\\n if (this.values) {\\n this.setValues(this.values);\\n }\\n }\\n};\\n/**\\n * Contains methods for transforming point on sphere to\\n * Cartesian coordinates using various projections.\\n * @class\\n */\\njvm.Proj = {\\n degRad: 180 / Math.PI,\\n radDeg: Math.PI / 180,\\n radius: 6381372,\\n\\n sgn: function(n){\\n if (n > 0) {\\n return 1;\\n } else if (n < 0) {\\n return -1;\\n } else {\\n return n;\\n }\\n },\\n\\n /**\\n * Converts point on sphere to the Cartesian coordinates using Miller projection\\n * @param {Number} lat Latitude in degrees\\n * @param {Number} lng Longitude in degrees\\n * @param {Number} c Central meridian in degrees\\n */\\n mill: function(lat, lng, c){\\n return {\\n x: this.radius * (lng - c) * this.radDeg,\\n y: - this.radius * Math.log(Math.tan((45 + 0.4 * lat) * this.radDeg)) / 0.8\\n };\\n },\\n\\n /**\\n * Inverse function of mill()\\n * Converts Cartesian coordinates to point on sphere using Miller projection\\n * @param {Number} x X of point in Cartesian system as integer\\n * @param {Number} y Y of point in Cartesian system as integer\\n * @param {Number} c Central meridian in degrees\\n */\\n mill_inv: function(x, y, c){\\n return {\\n lat: (2.5 * Math.atan(Math.exp(0.8 * y / this.radius)) - 5 * Math.PI / 8) * this.degRad,\\n lng: (c * this.radDeg + x / this.radius) * this.degRad\\n };\\n },\\n\\n /**\\n * Converts point on sphere to the Cartesian coordinates using Mercator projection\\n * @param {Number} lat Latitude in degrees\\n * @param {Number} lng Longitude in degrees\\n * @param {Number} c Central meridian in degrees\\n */\\n merc: function(lat, lng, c){\\n return {\\n x: this.radius * (lng - c) * this.radDeg,\\n y: - this.radius * Math.log(Math.tan(Math.PI / 4 + lat * Math.PI / 360))\\n };\\n },\\n\\n /**\\n * Inverse function of merc()\\n * Converts Cartesian coordinates to point on sphere using Mercator projection\\n * @param {Number} x X of point in Cartesian system as integer\\n * @param {Number} y Y of point in Cartesian system as integer\\n * @param {Number} c Central meridian in degrees\\n */\\n merc_inv: function(x, y, c){\\n return {\\n lat: (2 * Math.atan(Math.exp(y / this.radius)) - Math.PI / 2) * this.degRad,\\n lng: (c * this.radDeg + x / this.radius) * this.degRad\\n };\\n },\\n\\n /**\\n * Converts point on sphere to the Cartesian coordinates using Albers Equal-Area Conic\\n * projection\\n * @see <a href=\\\"http://mathworld.wolfram.com/AlbersEqual-AreaConicProjection.html\\\">Albers Equal-Area Conic projection</a>\\n * @param {Number} lat Latitude in degrees\\n * @param {Number} lng Longitude in degrees\\n * @param {Number} c Central meridian in degrees\\n */\\n aea: function(lat, lng, c){\\n var fi0 = 0,\\n lambda0 = c * this.radDeg,\\n fi1 = 29.5 * this.radDeg,\\n fi2 = 45.5 * this.radDeg,\\n fi = lat * this.radDeg,\\n lambda = lng * this.radDeg,\\n n = (Math.sin(fi1)+Math.sin(fi2)) / 2,\\n C = Math.cos(fi1)*Math.cos(fi1)+2*n*Math.sin(fi1),\\n theta = n*(lambda-lambda0),\\n ro = Math.sqrt(C-2*n*Math.sin(fi))/n,\\n ro0 = Math.sqrt(C-2*n*Math.sin(fi0))/n;\\n\\n return {\\n x: ro * Math.sin(theta) * this.radius,\\n y: - (ro0 - ro * Math.cos(theta)) * this.radius\\n };\\n },\\n\\n /**\\n * Converts Cartesian coordinates to the point on sphere using Albers Equal-Area Conic\\n * projection\\n * @see <a href=\\\"http://mathworld.wolfram.com/AlbersEqual-AreaConicProjection.html\\\">Albers Equal-Area Conic projection</a>\\n * @param {Number} x X of point in Cartesian system as integer\\n * @param {Number} y Y of point in Cartesian system as integer\\n * @param {Number} c Central meridian in degrees\\n */\\n aea_inv: function(xCoord, yCoord, c){\\n var x = xCoord / this.radius,\\n y = yCoord / this.radius,\\n fi0 = 0,\\n lambda0 = c * this.radDeg,\\n fi1 = 29.5 * this.radDeg,\\n fi2 = 45.5 * this.radDeg,\\n n = (Math.sin(fi1)+Math.sin(fi2)) / 2,\\n C = Math.cos(fi1)*Math.cos(fi1)+2*n*Math.sin(fi1),\\n ro0 = Math.sqrt(C-2*n*Math.sin(fi0))/n,\\n ro = Math.sqrt(x*x+(ro0-y)*(ro0-y)),\\n theta = Math.atan( x / (ro0 - y) );\\n\\n return {\\n lat: (Math.asin((C - ro * ro * n * n) / (2 * n))) * this.degRad,\\n lng: (lambda0 + theta / n) * this.degRad\\n };\\n },\\n\\n /**\\n * Converts point on sphere to the Cartesian coordinates using Lambert conformal\\n * conic projection\\n * @see <a href=\\\"http://mathworld.wolfram.com/LambertConformalConicProjection.html\\\">Lambert Conformal Conic Projection</a>\\n * @param {Number} lat Latitude in degrees\\n * @param {Number} lng Longitude in degrees\\n * @param {Number} c Central meridian in degrees\\n */\\n lcc: function(lat, lng, c){\\n var fi0 = 0,\\n lambda0 = c * this.radDeg,\\n lambda = lng * this.radDeg,\\n fi1 = 33 * this.radDeg,\\n fi2 = 45 * this.radDeg,\\n fi = lat * this.radDeg,\\n n = Math.log( Math.cos(fi1) * (1 / Math.cos(fi2)) ) / Math.log( Math.tan( Math.PI / 4 + fi2 / 2) * (1 / Math.tan( Math.PI / 4 + fi1 / 2) ) ),\\n F = ( Math.cos(fi1) * Math.pow( Math.tan( Math.PI / 4 + fi1 / 2 ), n ) ) / n,\\n ro = F * Math.pow( 1 / Math.tan( Math.PI / 4 + fi / 2 ), n ),\\n ro0 = F * Math.pow( 1 / Math.tan( Math.PI / 4 + fi0 / 2 ), n );\\n\\n return {\\n x: ro * Math.sin( n * (lambda - lambda0) ) * this.radius,\\n y: - (ro0 - ro * Math.cos( n * (lambda - lambda0) ) ) * this.radius\\n };\\n },\\n\\n /**\\n * Converts Cartesian coordinates to the point on sphere using Lambert conformal conic\\n * projection\\n * @see <a href=\\\"http://mathworld.wolfram.com/LambertConformalConicProjection.html\\\">Lambert Conformal Conic Projection</a>\\n * @param {Number} x X of point in Cartesian system as integer\\n * @param {Number} y Y of point in Cartesian system as integer\\n * @param {Number} c Central meridian in degrees\\n */\\n lcc_inv: function(xCoord, yCoord, c){\\n var x = xCoord / this.radius,\\n y = yCoord / this.radius,\\n fi0 = 0,\\n lambda0 = c * this.radDeg,\\n fi1 = 33 * this.radDeg,\\n fi2 = 45 * this.radDeg,\\n n = Math.log( Math.cos(fi1) * (1 / Math.cos(fi2)) ) / Math.log( Math.tan( Math.PI / 4 + fi2 / 2) * (1 / Math.tan( Math.PI / 4 + fi1 / 2) ) ),\\n F = ( Math.cos(fi1) * Math.pow( Math.tan( Math.PI / 4 + fi1 / 2 ), n ) ) / n,\\n ro0 = F * Math.pow( 1 / Math.tan( Math.PI / 4 + fi0 / 2 ), n ),\\n ro = this.sgn(n) * Math.sqrt(x*x+(ro0-y)*(ro0-y)),\\n theta = Math.atan( x / (ro0 - y) );\\n\\n return {\\n lat: (2 * Math.atan(Math.pow(F/ro, 1/n)) - Math.PI / 2) * this.degRad,\\n lng: (lambda0 + theta / n) * this.degRad\\n };\\n }\\n};jvm.MapObject = function(config){};\\n\\njvm.MapObject.prototype.getLabelText = function(key){\\n var text;\\n\\n if (this.config.label) {\\n if (typeof this.config.label.render === 'function') {\\n text = this.config.label.render(key);\\n } else {\\n text = key;\\n }\\n } else {\\n text = null;\\n }\\n return text;\\n}\\n\\njvm.MapObject.prototype.getLabelOffsets = function(key){\\n var offsets;\\n\\n if (this.config.label) {\\n if (typeof this.config.label.offsets === 'function') {\\n offsets = this.config.label.offsets(key);\\n } else if (typeof this.config.label.offsets === 'object') {\\n offsets = this.config.label.offsets[key];\\n }\\n }\\n return offsets || [0, 0];\\n}\\n\\n/**\\n * Set hovered state to the element. Hovered state means mouse cursor is over element. Styles will be updates respectively.\\n * @param {Boolean} isHovered <code>true</code> to make element hovered, <code>false</code> otherwise.\\n */\\njvm.MapObject.prototype.setHovered = function(isHovered){\\n if (this.isHovered !== isHovered) {\\n this.isHovered = isHovered;\\n this.shape.isHovered = isHovered;\\n this.shape.updateStyle();\\n if (this.label) {\\n this.label.isHovered = isHovered;\\n this.label.updateStyle();\\n }\\n }\\n};\\n\\n/**\\n * Set selected state to the element. Styles will be updates respectively.\\n * @param {Boolean} isSelected <code>true</code> to make element selected, <code>false</code> otherwise.\\n */\\njvm.MapObject.prototype.setSelected = function(isSelected){\\n if (this.isSelected !== isSelected) {\\n this.isSelected = isSelected;\\n this.shape.isSelected = isSelected;\\n this.shape.updateStyle();\\n if (this.label) {\\n this.label.isSelected = isSelected;\\n this.label.updateStyle();\\n }\\n jvm.$(this.shape).trigger('selected', [isSelected]);\\n }\\n};\\n\\njvm.MapObject.prototype.setStyle = function(){\\n\\tthis.shape.setStyle.apply(this.shape, arguments);\\n};\\n\\njvm.MapObject.prototype.remove = function(){\\n this.shape.remove();\\n if (this.label) {\\n this.label.remove();\\n }\\n};jvm.Region = function(config){\\n var bbox,\\n text,\\n offsets,\\n labelDx,\\n labelDy;\\n\\n this.config = config;\\n this.map = this.config.map;\\n\\n this.shape = config.canvas.addPath({\\n d: config.path,\\n 'data-code': config.code\\n }, config.style, config.canvas.rootElement);\\n this.shape.addClass('jvectormap-region jvectormap-element');\\n\\n bbox = this.shape.getBBox();\\n\\n text = this.getLabelText(config.code);\\n if (this.config.label && text) {\\n offsets = this.getLabelOffsets(config.code);\\n this.labelX = bbox.x + bbox.width / 2 + offsets[0];\\n this.labelY = bbox.y + bbox.height / 2 + offsets[1];\\n this.label = config.canvas.addText({\\n text: text,\\n 'text-anchor': 'middle',\\n 'alignment-baseline': 'central',\\n x: this.labelX,\\n y: this.labelY,\\n 'data-code': config.code\\n }, config.labelStyle, config.labelsGroup);\\n this.label.addClass('jvectormap-region jvectormap-element');\\n }\\n};\\n\\njvm.inherits(jvm.Region, jvm.MapObject);\\n\\njvm.Region.prototype.updateLabelPosition = function(){\\n if (this.label) {\\n this.label.set({\\n x: this.labelX * this.map.scale + this.map.transX * this.map.scale,\\n y: this.labelY * this.map.scale + this.map.transY * this.map.scale\\n });\\n }\\n};jvm.Marker = function(config){\\n var text,\\n offsets;\\n\\n this.config = config;\\n this.map = this.config.map;\\n\\n this.isImage = !!this.config.style.initial.image;\\n this.createShape();\\n\\n text = this.getLabelText(config.index);\\n if (this.config.label && text) {\\n this.offsets = this.getLabelOffsets(config.index);\\n this.labelX = config.cx / this.map.scale - this.map.transX;\\n this.labelY = config.cy / this.map.scale - this.map.transY;\\n this.label = config.canvas.addText({\\n text: text,\\n 'data-index': config.index,\\n dy: \\\"0.6ex\\\",\\n x: this.labelX,\\n y: this.labelY\\n }, config.labelStyle, config.labelsGroup);\\n\\n this.label.addClass('jvectormap-marker jvectormap-element');\\n }\\n};\\n\\njvm.inherits(jvm.Marker, jvm.MapObject);\\n\\njvm.Marker.prototype.createShape = function(){\\n var that = this;\\n\\n if (this.shape) {\\n this.shape.remove();\\n }\\n this.shape = this.config.canvas[this.isImage ? 'addImage' : 'addCircle']({\\n \\\"data-index\\\": this.config.index,\\n cx: this.config.cx,\\n cy: this.config.cy\\n }, this.config.style, this.config.group);\\n\\n this.shape.addClass('jvectormap-marker jvectormap-element');\\n\\n if (this.isImage) {\\n jvm.$(this.shape.node).on('imageloaded', function(){\\n that.updateLabelPosition();\\n });\\n }\\n};\\n\\njvm.Marker.prototype.updateLabelPosition = function(){\\n if (this.label) {\\n this.label.set({\\n x: this.labelX * this.map.scale + this.offsets[0] +\\n this.map.transX * this.map.scale + 5 + (this.isImage ? (this.shape.width || 0) / 2 : this.shape.properties.r),\\n y: this.labelY * this.map.scale + this.map.transY * this.map.scale + this.offsets[1]\\n });\\n }\\n};\\n\\njvm.Marker.prototype.setStyle = function(property, value){\\n var isImage;\\n\\n jvm.Marker.parentClass.prototype.setStyle.apply(this, arguments);\\n\\n if (property === 'r') {\\n this.updateLabelPosition();\\n }\\n\\n isImage = !!this.shape.get('image');\\n if (isImage != this.isImage) {\\n this.isImage = isImage;\\n this.config.style = jvm.$.extend(true, {}, this.shape.style);\\n this.createShape();\\n }\\n};/**\\n * Creates map, draws paths, binds events.\\n * @constructor\\n * @param {Object} params Parameters to initialize map with.\\n * @param {String} params.map Name of the map in the format <code>territory_proj_lang</code> where <code>territory</code> is a unique code or name of the territory which the map represents (ISO 3166 standard is used where possible), <code>proj</code> is a name of projection used to generate representation of the map on the plane (projections are named according to the conventions of proj4 utility) and <code>lang</code> is a code of the language, used for the names of regions.\\n * @param {String} params.backgroundColor Background color of the map in CSS format.\\n * @param {Boolean} params.zoomOnScroll When set to true map could be zoomed using mouse scroll. Default value is <code>true</code>.\\n * @param {Boolean} params.zoomOnScrollSpeed Mouse scroll speed. Number from 1 to 10. Default value is <code>3</code>.\\n * @param {Boolean} params.panOnDrag When set to true, the map pans when being dragged. Default value is <code>true</code>.\\n * @param {Number} params.zoomMax Indicates the maximum zoom ratio which could be reached zooming the map. Default value is <code>8</code>.\\n * @param {Number} params.zoomMin Indicates the minimum zoom ratio which could be reached zooming the map. Default value is <code>1</code>.\\n * @param {Number} params.zoomStep Indicates the multiplier used to zoom map with +/- buttons. Default value is <code>1.6</code>.\\n * @param {Boolean} params.zoomAnimate Indicates whether or not to animate changing of map zoom with zoom buttons.\\n * @param {Boolean} params.regionsSelectable When set to true regions of the map could be selected. Default value is <code>false</code>.\\n * @param {Boolean} params.regionsSelectableOne Allow only one region to be selected at the moment. Default value is <code>false</code>.\\n * @param {Boolean} params.markersSelectable When set to true markers on the map could be selected. Default value is <code>false</code>.\\n * @param {Boolean} params.markersSelectableOne Allow only one marker to be selected at the moment. Default value is <code>false</code>.\\n * @param {Object} params.regionStyle Set the styles for the map's regions. Each region or marker has four states: <code>initial</code> (default state), <code>hover</code> (when the mouse cursor is over the region or marker), <code>selected</code> (when region or marker is selected), <code>selectedHover</code> (when the mouse cursor is over the region or marker and it's selected simultaneously). Styles could be set for each of this states. Default value for that parameter is:\\n<pre>{\\n initial: {\\n fill: 'white',\\n \\\"fill-opacity\\\": 1,\\n stroke: 'none',\\n \\\"stroke-width\\\": 0,\\n \\\"stroke-opacity\\\": 1\\n },\\n hover: {\\n \\\"fill-opacity\\\": 0.8,\\n cursor: 'pointer'\\n },\\n selected: {\\n fill: 'yellow'\\n },\\n selectedHover: {\\n }\\n}</pre>\\n* @param {Object} params.regionLabelStyle Set the styles for the regions' labels. Each region or marker has four states: <code>initial</code> (default state), <code>hover</code> (when the mouse cursor is over the region or marker), <code>selected</code> (when region or marker is selected), <code>selectedHover</code> (when the mouse cursor is over the region or marker and it's selected simultaneously). Styles could be set for each of this states. Default value for that parameter is:\\n<pre>{\\n initial: {\\n 'font-family': 'Verdana',\\n 'font-size': '12',\\n 'font-weight': 'bold',\\n cursor: 'default',\\n fill: 'black'\\n },\\n hover: {\\n cursor: 'pointer'\\n }\\n}</pre>\\n * @param {Object} params.markerStyle Set the styles for the map's markers. Any parameter suitable for <code>regionStyle</code> could be used as well as numeric parameter <code>r</code> to set the marker's radius. Default value for that parameter is:\\n<pre>{\\n initial: {\\n fill: 'grey',\\n stroke: '#505050',\\n \\\"fill-opacity\\\": 1,\\n \\\"stroke-width\\\": 1,\\n \\\"stroke-opacity\\\": 1,\\n r: 5\\n },\\n hover: {\\n stroke: 'black',\\n \\\"stroke-width\\\": 2,\\n cursor: 'pointer'\\n },\\n selected: {\\n fill: 'blue'\\n },\\n selectedHover: {\\n }\\n}</pre>\\n * @param {Object} params.markerLabelStyle Set the styles for the markers' labels. Default value for that parameter is:\\n<pre>{\\n initial: {\\n 'font-family': 'Verdana',\\n 'font-size': '12',\\n 'font-weight': 'bold',\\n cursor: 'default',\\n fill: 'black'\\n },\\n hover: {\\n cursor: 'pointer'\\n }\\n}</pre>\\n * @param {Object|Array} params.markers Set of markers to add to the map during initialization. In case of array is provided, codes of markers will be set as string representations of array indexes. Each marker is represented by <code>latLng</code> (array of two numeric values), <code>name</code> (string which will be show on marker's tip) and any marker styles.\\n * @param {Object} params.series Object with two keys: <code>markers</code> and <code>regions</code>. Each of which is an array of series configs to be applied to the respective map elements. See <a href=\\\"jvm.DataSeries.html\\\">DataSeries</a> description for a list of parameters available.\\n * @param {Object|String} params.focusOn This parameter sets the initial position and scale of the map viewport. See <code>setFocus</code> docuemntation for possible parameters.\\n * @param {Object} params.labels Defines parameters for rendering static labels. Object could contain two keys: <code>regions</code> and <code>markers</code>. Each key value defines configuration object with the following possible options:\\n<ul>\\n <li><code>render {Function}</code> - defines method for converting region code or marker index to actual label value.</li>\\n <li><code>offsets {Object|Function}</code> - provides method or object which could be used to define label offset by region code or marker index.</li>\\n</ul>\\n<b>Plase note: static labels feature is not supported in Internet Explorer 8 and below.</b>\\n * @param {Array|Object|String} params.selectedRegions Set initially selected regions.\\n * @param {Array|Object|String} params.selectedMarkers Set initially selected markers.\\n * @param {Function} params.onRegionTipShow <code>(Event e, Object tip, String code)</code> Will be called right before the region tip is going to be shown.\\n * @param {Function} params.onRegionOver <code>(Event e, String code)</code> Will be called on region mouse over event.\\n * @param {Function} params.onRegionOut <code>(Event e, String code)</code> Will be called on region mouse out event.\\n * @param {Function} params.onRegionClick <code>(Event e, String code)</code> Will be called on region click event.\\n * @param {Function} params.onRegionSelected <code>(Event e, String code, Boolean isSelected, Array selectedRegions)</code> Will be called when region is (de)selected. <code>isSelected</code> parameter of the callback indicates whether region is selected or not. <code>selectedRegions</code> contains codes of all currently selected regions.\\n * @param {Function} params.onMarkerTipShow <code>(Event e, Object tip, String code)</code> Will be called right before the marker tip is going to be shown.\\n * @param {Function} params.onMarkerOver <code>(Event e, String code)</code> Will be called on marker mouse over event.\\n * @param {Function} params.onMarkerOut <code>(Event e, String code)</code> Will be called on marker mouse out event.\\n * @param {Function} params.onMarkerClick <code>(Event e, String code)</code> Will be called on marker click event.\\n * @param {Function} params.onMarkerSelected <code>(Event e, String code, Boolean isSelected, Array selectedMarkers)</code> Will be called when marker is (de)selected. <code>isSelected</code> parameter of the callback indicates whether marker is selected or not. <code>selectedMarkers</code> contains codes of all currently selected markers.\\n * @param {Function} params.onViewportChange <code>(Event e, Number scale)</code> Triggered when the map's viewport is changed (map was panned or zoomed).\\n */\\njvm.Map = function(params) {\\n var map = this,\\n e;\\n\\n this.params = jvm.$.extend(true, {}, jvm.Map.defaultParams, params);\\n\\n if (!jvm.Map.maps[this.params.map]) {\\n throw new Error('Attempt to use map which was not loaded: '+this.params.map);\\n }\\n\\n this.mapData = jvm.Map.maps[this.params.map];\\n this.markers = {};\\n this.regions = {};\\n this.regionsColors = {};\\n this.regionsData = {};\\n\\n this.container = jvm.$('<div>').addClass('jvectormap-container');\\n if (this.params.container) {\\n this.params.container.append( this.container );\\n }\\n this.container.data('mapObject', this);\\n\\n this.defaultWidth = this.mapData.width;\\n this.defaultHeight = this.mapData.height;\\n\\n this.setBackgroundColor(this.params.backgroundColor);\\n\\n this.onResize = function(){\\n map.updateSize();\\n }\\n jvm.$(window).resize(this.onResize);\\n\\n for (e in jvm.Map.apiEvents) {\\n if (this.params[e]) {\\n this.container.bind(jvm.Map.apiEvents[e]+'.jvectormap', this.params[e]);\\n }\\n }\\n\\n this.canvas = new jvm.VectorCanvas(this.container[0], this.width, this.height);\\n\\n if ( ('ontouchstart' in window) || (window.DocumentTouch && document instanceof DocumentTouch) ) {\\n if (this.params.bindTouchEvents) {\\n this.bindContainerTouchEvents();\\n }\\n }\\n this.bindContainerEvents();\\n this.bindElementEvents();\\n this.createTip();\\n if (this.params.zoomButtons) {\\n this.bindZoomButtons();\\n }\\n\\n this.createRegions();\\n this.createMarkers(this.params.markers || {});\\n\\n this.updateSize();\\n\\n if (this.params.focusOn) {\\n if (typeof this.params.focusOn === 'string') {\\n this.params.focusOn = {region: this.params.focusOn};\\n } else if (jvm.$.isArray(this.params.focusOn)) {\\n this.params.focusOn = {regions: this.params.focusOn};\\n }\\n this.setFocus(this.params.focusOn);\\n }\\n\\n if (this.params.selectedRegions) {\\n this.setSelectedRegions(this.params.selectedRegions);\\n }\\n if (this.params.selectedMarkers) {\\n this.setSelectedMarkers(this.params.selectedMarkers);\\n }\\n\\n this.legendCntHorizontal = jvm.$('<div/>').addClass('jvectormap-legend-cnt jvectormap-legend-cnt-h');\\n this.legendCntVertical = jvm.$('<div/>').addClass('jvectormap-legend-cnt jvectormap-legend-cnt-v');\\n this.container.append(this.legendCntHorizontal);\\n this.container.append(this.legendCntVertical);\\n\\n if (this.params.series) {\\n this.createSeries();\\n }\\n};\\n\\njvm.Map.prototype = {\\n transX: 0,\\n transY: 0,\\n scale: 1,\\n baseTransX: 0,\\n baseTransY: 0,\\n baseScale: 1,\\n\\n width: 0,\\n height: 0,\\n\\n /**\\n * Set background color of the map.\\n * @param {String} backgroundColor Background color in CSS format.\\n */\\n setBackgroundColor: function(backgroundColor) {\\n this.container.css('background-color', backgroundColor);\\n },\\n\\n resize: function() {\\n var curBaseScale = this.baseScale;\\n if (this.width / this.height > this.defaultWidth / this.defaultHeight) {\\n this.baseScale = this.height / this.defaultHeight;\\n this.baseTransX = Math.abs(this.width - this.defaultWidth * this.baseScale) / (2 * this.baseScale);\\n } else {\\n this.baseScale = this.width / this.defaultWidth;\\n this.baseTransY = Math.abs(this.height - this.defaultHeight * this.baseScale) / (2 * this.baseScale);\\n }\\n this.scale *= this.baseScale / curBaseScale;\\n this.transX *= this.baseScale / curBaseScale;\\n this.transY *= this.baseScale / curBaseScale;\\n },\\n\\n /**\\n * Synchronize the size of the map with the size of the container. Suitable in situations where the size of the container is changed programmatically or container is shown after it became visible.\\n */\\n updateSize: function(){\\n this.width = this.container.width();\\n this.height = this.container.height();\\n this.resize();\\n this.canvas.setSize(this.width, this.height);\\n this.applyTransform();\\n },\\n\\n /**\\n * Reset all the series and show the map with the initial zoom.\\n */\\n reset: function() {\\n var key,\\n i;\\n\\n for (key in this.series) {\\n for (i = 0; i < this.series[key].length; i++) {\\n this.series[key][i].clear();\\n }\\n }\\n this.scale = this.baseScale;\\n this.transX = this.baseTransX;\\n this.transY = this.baseTransY;\\n this.applyTransform();\\n },\\n\\n applyTransform: function() {\\n var maxTransX,\\n maxTransY,\\n minTransX,\\n minTransY;\\n\\n if (this.defaultWidth * this.scale <= this.width) {\\n maxTransX = (this.width - this.defaultWidth * this.scale) / (2 * this.scale);\\n minTransX = (this.width - this.defaultWidth * this.scale) / (2 * this.scale);\\n } else {\\n maxTransX = 0;\\n minTransX = (this.width - this.defaultWidth * this.scale) / this.scale;\\n }\\n\\n if (this.defaultHeight * this.scale <= this.height) {\\n maxTransY = (this.height - this.defaultHeight * this.scale) / (2 * this.scale);\\n minTransY = (this.height - this.defaultHeight * this.scale) / (2 * this.scale);\\n } else {\\n maxTransY = 0;\\n minTransY = (this.height - this.defaultHeight * this.scale) / this.scale;\\n }\\n\\n if (this.transY > maxTransY) {\\n this.transY = maxTransY;\\n } else if (this.transY < minTransY) {\\n this.transY = minTransY;\\n }\\n if (this.transX > maxTransX) {\\n this.transX = maxTransX;\\n } else if (this.transX < minTransX) {\\n this.transX = minTransX;\\n }\\n\\n this.canvas.applyTransformParams(this.scale, this.transX, this.transY);\\n\\n if (this.markers) {\\n this.repositionMarkers();\\n }\\n\\n this.repositionLabels();\\n\\n this.container.trigger('viewportChange', [this.scale/this.baseScale, this.transX, this.transY]);\\n },\\n\\n bindContainerEvents: function(){\\n var mouseDown = false,\\n oldPageX,\\n oldPageY,\\n map = this;\\n\\n if (this.params.panOnDrag) {\\n this.container.mousemove(function(e){\\n if (mouseDown) {\\n map.transX -= (oldPageX - e.pageX) / map.scale;\\n map.transY -= (oldPageY - e.pageY) / map.scale;\\n\\n map.applyTransform();\\n\\n oldPageX = e.pageX;\\n oldPageY = e.pageY;\\n }\\n return false;\\n }).mousedown(function(e){\\n mouseDown = true;\\n oldPageX = e.pageX;\\n oldPageY = e.pageY;\\n return false;\\n });\\n\\n this.onContainerMouseUp = function(){\\n mouseDown = false;\\n };\\n jvm.$('body').mouseup(this.onContainerMouseUp);\\n }\\n\\n if (this.params.zoomOnScroll) {\\n this.container.mousewheel(function(event, delta, deltaX, deltaY) {\\n var offset = jvm.$(map.container).offset(),\\n centerX = event.pageX - offset.left,\\n centerY = event.pageY - offset.top,\\n zoomStep = Math.pow(1 + map.params.zoomOnScrollSpeed / 1000, event.deltaFactor * event.deltaY);\\n\\n map.tip.hide();\\n\\n map.setScale(map.scale * zoomStep, centerX, centerY);\\n event.preventDefault();\\n });\\n }\\n },\\n\\n bindContainerTouchEvents: function(){\\n var touchStartScale,\\n touchStartDistance,\\n map = this,\\n touchX,\\n touchY,\\n centerTouchX,\\n centerTouchY,\\n lastTouchesLength,\\n handleTouchEvent = function(e){\\n var touches = e.originalEvent.touches,\\n offset,\\n scale,\\n transXOld,\\n transYOld;\\n\\n if (e.type == 'touchstart') {\\n lastTouchesLength = 0;\\n }\\n\\n if (touches.length == 1) {\\n if (lastTouchesLength == 1) {\\n transXOld = map.transX;\\n transYOld = map.transY;\\n map.transX -= (touchX - touches[0].pageX) / map.scale;\\n map.transY -= (touchY - touches[0].pageY) / map.scale;\\n map.applyTransform();\\n map.tip.hide();\\n if (transXOld != map.transX || transYOld != map.transY) {\\n e.preventDefault();\\n }\\n }\\n touchX = touches[0].pageX;\\n touchY = touches[0].pageY;\\n } else if (touches.length == 2) {\\n if (lastTouchesLength == 2) {\\n scale = Math.sqrt(\\n Math.pow(touches[0].pageX - touches[1].pageX, 2) +\\n Math.pow(touches[0].pageY - touches[1].pageY, 2)\\n ) / touchStartDistance;\\n map.setScale(\\n touchStartScale * scale,\\n centerTouchX,\\n centerTouchY\\n )\\n map.tip.hide();\\n e.preventDefault();\\n } else {\\n offset = jvm.$(map.container).offset();\\n if (touches[0].pageX > touches[1].pageX) {\\n centerTouchX = touches[1].pageX + (touches[0].pageX - touches[1].pageX) / 2;\\n } else {\\n centerTouchX = touches[0].pageX + (touches[1].pageX - touches[0].pageX) / 2;\\n }\\n if (touches[0].pageY > touches[1].pageY) {\\n centerTouchY = touches[1].pageY + (touches[0].pageY - touches[1].pageY) / 2;\\n } else {\\n centerTouchY = touches[0].pageY + (touches[1].pageY - touches[0].pageY) / 2;\\n }\\n centerTouchX -= offset.left;\\n centerTouchY -= offset.top;\\n touchStartScale = map.scale;\\n touchStartDistance = Math.sqrt(\\n Math.pow(touches[0].pageX - touches[1].pageX, 2) +\\n Math.pow(touches[0].pageY - touches[1].pageY, 2)\\n );\\n }\\n }\\n\\n lastTouchesLength = touches.length;\\n };\\n\\n jvm.$(this.container).bind('touchstart', handleTouchEvent);\\n jvm.$(this.container).bind('touchmove', handleTouchEvent);\\n },\\n\\n bindElementEvents: function(){\\n var map = this,\\n mouseMoved;\\n\\n this.container.mousemove(function(){\\n mouseMoved = true;\\n });\\n\\n /* Can not use common class selectors here because of the bug in jQuery\\n SVG handling, use with caution. */\\n this.container.delegate(\\\"[class~='jvectormap-element']\\\", 'mouseover mouseout', function(e){\\n var baseVal = jvm.$(this).attr('class').baseVal || jvm.$(this).attr('class'),\\n type = baseVal.indexOf('jvectormap-region') === -1 ? 'marker' : 'region',\\n code = type == 'region' ? jvm.$(this).attr('data-code') : jvm.$(this).attr('data-index'),\\n element = type == 'region' ? map.regions[code].element : map.markers[code].element,\\n tipText = type == 'region' ? map.mapData.paths[code].name : (map.markers[code].config.name || ''),\\n tipShowEvent = jvm.$.Event(type+'TipShow.jvectormap'),\\n overEvent = jvm.$.Event(type+'Over.jvectormap');\\n\\n if (e.type == 'mouseover') {\\n map.container.trigger(overEvent, [code]);\\n if (!overEvent.isDefaultPrevented()) {\\n element.setHovered(true);\\n }\\n\\n map.tip.text(tipText);\\n map.container.trigger(tipShowEvent, [map.tip, code]);\\n if (!tipShowEvent.isDefaultPrevented()) {\\n map.tip.show();\\n map.tipWidth = map.tip.width();\\n map.tipHeight = map.tip.height();\\n }\\n } else {\\n element.setHovered(false);\\n map.tip.hide();\\n map.container.trigger(type+'Out.jvectormap', [code]);\\n }\\n });\\n\\n /* Can not use common class selectors here because of the bug in jQuery\\n SVG handling, use with caution. */\\n this.container.delegate(\\\"[class~='jvectormap-element']\\\", 'mousedown', function(){\\n mouseMoved = false;\\n });\\n\\n /* Can not use common class selectors here because of the bug in jQuery\\n SVG handling, use with caution. */\\n this.container.delegate(\\\"[class~='jvectormap-element']\\\", 'mouseup', function(){\\n var baseVal = jvm.$(this).attr('class').baseVal ? jvm.$(this).attr('class').baseVal : jvm.$(this).attr('class'),\\n type = baseVal.indexOf('jvectormap-region') === -1 ? 'marker' : 'region',\\n code = type == 'region' ? jvm.$(this).attr('data-code') : jvm.$(this).attr('data-index'),\\n clickEvent = jvm.$.Event(type+'Click.jvectormap'),\\n element = type == 'region' ? map.regions[code].element : map.markers[code].element;\\n\\n if (!mouseMoved) {\\n map.container.trigger(clickEvent, [code]);\\n if ((type === 'region' && map.params.regionsSelectable) || (type === 'marker' && map.params.markersSelectable)) {\\n if (!clickEvent.isDefaultPrevented()) {\\n if (map.params[type+'sSelectableOne']) {\\n map.clearSelected(type+'s');\\n }\\n element.setSelected(!element.isSelected);\\n }\\n }\\n }\\n });\\n },\\n\\n bindZoomButtons: function() {\\n var map = this;\\n\\n jvm.$('<div/>').addClass('jvectormap-zoomin').text('+').appendTo(this.container);\\n jvm.$('<div/>').addClass('jvectormap-zoomout').html('−').appendTo(this.container);\\n\\n this.container.find('.jvectormap-zoomin').click(function(){\\n map.setScale(map.scale * map.params.zoomStep, map.width / 2, map.height / 2, false, map.params.zoomAnimate);\\n });\\n this.container.find('.jvectormap-zoomout').click(function(){\\n map.setScale(map.scale / map.params.zoomStep, map.width / 2, map.height / 2, false, map.params.zoomAnimate);\\n });\\n },\\n\\n createTip: function(){\\n var map = this;\\n\\n this.tip = jvm.$('<div/>').addClass('jvectormap-tip').appendTo(jvm.$('body'));\\n\\n this.container.mousemove(function(e){\\n var left = e.pageX-15-map.tipWidth,\\n top = e.pageY-15-map.tipHeight;\\n\\n if (left < 5) {\\n left = e.pageX + 15;\\n }\\n if (top < 5) {\\n top = e.pageY + 15;\\n }\\n\\n map.tip.css({\\n left: left,\\n top: top\\n });\\n });\\n },\\n\\n setScale: function(scale, anchorX, anchorY, isCentered, animate) {\\n var viewportChangeEvent = jvm.$.Event('zoom.jvectormap'),\\n interval,\\n that = this,\\n i = 0,\\n count = Math.abs(Math.round((scale - this.scale) * 60 / Math.max(scale, this.scale))),\\n scaleStart,\\n scaleDiff,\\n transXStart,\\n transXDiff,\\n transYStart,\\n transYDiff,\\n transX,\\n transY,\\n deferred = new jvm.$.Deferred();\\n\\n if (scale > this.params.zoomMax * this.baseScale) {\\n scale = this.params.zoomMax * this.baseScale;\\n } else if (scale < this.params.zoomMin * this.baseScale) {\\n scale = this.params.zoomMin * this.baseScale;\\n }\\n\\n if (typeof anchorX != 'undefined' && typeof anchorY != 'undefined') {\\n zoomStep = scale / this.scale;\\n if (isCentered) {\\n transX = anchorX + this.defaultWidth * (this.width / (this.defaultWidth * scale)) / 2;\\n transY = anchorY + this.defaultHeight * (this.height / (this.defaultHeight * scale)) / 2;\\n } else {\\n transX = this.transX - (zoomStep - 1) / scale * anchorX;\\n transY = this.transY - (zoomStep - 1) / scale * anchorY;\\n }\\n }\\n\\n if (animate && count > 0) {\\n scaleStart = this.scale;\\n scaleDiff = (scale - scaleStart) / count;\\n transXStart = this.transX * this.scale;\\n transYStart = this.transY * this.scale;\\n transXDiff = (transX * scale - transXStart) / count;\\n transYDiff = (transY * scale - transYStart) / count;\\n interval = setInterval(function(){\\n i += 1;\\n that.scale = scaleStart + scaleDiff * i;\\n that.transX = (transXStart + transXDiff * i) / that.scale;\\n that.transY = (transYStart + transYDiff * i) / that.scale;\\n that.applyTransform();\\n if (i == count) {\\n clearInterval(interval);\\n that.container.trigger(viewportChangeEvent, [scale/that.baseScale]);\\n deferred.resolve();\\n }\\n }, 10);\\n } else {\\n this.transX = transX;\\n this.transY = transY;\\n this.scale = scale;\\n this.applyTransform();\\n this.container.trigger(viewportChangeEvent, [scale/this.baseScale]);\\n deferred.resolve();\\n }\\n\\n return deferred;\\n },\\n\\n /**\\n * Set the map's viewport to the specific point and set zoom of the map to the specific level. Point and zoom level could be defined in two ways: using the code of some region to focus on or a central point and zoom level as numbers.\\n * @param This method takes a configuration object as the single argument. The options passed to it are the following:\\n * @param {Array} params.regions Array of region codes to zoom to.\\n * @param {String} params.region Region code to zoom to.\\n * @param {Number} params.scale Map scale to set.\\n * @param {Number} params.lat Latitude to set viewport to.\\n * @param {Number} params.lng Longitude to set viewport to.\\n * @param {Number} params.x Number from 0 to 1 specifying the horizontal coordinate of the central point of the viewport.\\n * @param {Number} params.y Number from 0 to 1 specifying the vertical coordinate of the central point of the viewport.\\n * @param {Boolean} params.animate Indicates whether or not to animate the scale change and transition.\\n */\\n setFocus: function(config){\\n var bbox,\\n itemBbox,\\n newBbox,\\n codes,\\n i,\\n point;\\n\\n config = config || {};\\n\\n if (config.region) {\\n codes = [config.region];\\n } else if (config.regions) {\\n codes = config.regions;\\n }\\n\\n if (codes) {\\n for (i = 0; i < codes.length; i++) {\\n if (this.regions[codes[i]]) {\\n itemBbox = this.regions[codes[i]].element.shape.getBBox();\\n if (itemBbox) {\\n if (typeof bbox == 'undefined') {\\n bbox = itemBbox;\\n } else {\\n newBbox = {\\n x: Math.min(bbox.x, itemBbox.x),\\n y: Math.min(bbox.y, itemBbox.y),\\n width: Math.max(bbox.x + bbox.width, itemBbox.x + itemBbox.width) - Math.min(bbox.x, itemBbox.x),\\n height: Math.max(bbox.y + bbox.height, itemBbox.y + itemBbox.height) - Math.min(bbox.y, itemBbox.y)\\n }\\n bbox = newBbox;\\n }\\n }\\n }\\n }\\n return this.setScale(\\n Math.min(this.width / bbox.width, this.height / bbox.height),\\n - (bbox.x + bbox.width / 2),\\n - (bbox.y + bbox.height / 2),\\n true,\\n config.animate\\n );\\n } else {\\n if (config.lat && config.lng) {\\n point = this.latLngToPoint(config.lat, config.lng);\\n config.x = this.transX - point.x / this.scale;\\n config.y = this.transY - point.y / this.scale;\\n } else if (config.x && config.y) {\\n config.x *= -this.defaultWidth;\\n config.y *= -this.defaultHeight;\\n }\\n return this.setScale(config.scale * this.baseScale, config.x, config.y, true, config.animate);\\n }\\n },\\n\\n getSelected: function(type){\\n var key,\\n selected = [];\\n\\n for (key in this[type]) {\\n if (this[type][key].element.isSelected) {\\n selected.push(key);\\n }\\n }\\n return selected;\\n },\\n\\n /**\\n * Return the codes of currently selected regions.\\n * @returns {Array}\\n */\\n getSelectedRegions: function(){\\n return this.getSelected('regions');\\n },\\n\\n /**\\n * Return the codes of currently selected markers.\\n * @returns {Array}\\n */\\n getSelectedMarkers: function(){\\n return this.getSelected('markers');\\n },\\n\\n setSelected: function(type, keys){\\n var i;\\n\\n if (typeof keys != 'object') {\\n keys = [keys];\\n }\\n\\n if (jvm.$.isArray(keys)) {\\n for (i = 0; i < keys.length; i++) {\\n this[type][keys[i]].element.setSelected(true);\\n }\\n } else {\\n for (i in keys) {\\n this[type][i].element.setSelected(!!keys[i]);\\n }\\n }\\n },\\n\\n /**\\n * Set or remove selected state for the regions.\\n * @param {String|Array|Object} keys If <code>String</code> or <code>Array</code> the region(s) with the corresponding code(s) will be selected. If <code>Object</code> was provided its keys are codes of regions, state of which should be changed. Selected state will be set if value is true, removed otherwise.\\n */\\n setSelectedRegions: function(keys){\\n this.setSelected('regions', keys);\\n },\\n\\n /**\\n * Set or remove selected state for the markers.\\n * @param {String|Array|Object} keys If <code>String</code> or <code>Array</code> the marker(s) with the corresponding code(s) will be selected. If <code>Object</code> was provided its keys are codes of markers, state of which should be changed. Selected state will be set if value is true, removed otherwise.\\n */\\n setSelectedMarkers: function(keys){\\n this.setSelected('markers', keys);\\n },\\n\\n clearSelected: function(type){\\n var select = {},\\n selected = this.getSelected(type),\\n i;\\n\\n for (i = 0; i < selected.length; i++) {\\n select[selected[i]] = false;\\n };\\n\\n this.setSelected(type, select);\\n },\\n\\n /**\\n * Remove the selected state from all the currently selected regions.\\n */\\n clearSelectedRegions: function(){\\n this.clearSelected('regions');\\n },\\n\\n /**\\n * Remove the selected state from all the currently selected markers.\\n */\\n clearSelectedMarkers: function(){\\n this.clearSelected('markers');\\n },\\n\\n /**\\n * Return the instance of Map. Useful when instantiated as a jQuery plug-in.\\n * @returns {Map}\\n */\\n getMapObject: function(){\\n return this;\\n },\\n\\n /**\\n * Return the name of the region by region code.\\n * @returns {String}\\n */\\n getRegionName: function(code){\\n return this.mapData.paths[code].name;\\n },\\n\\n createRegions: function(){\\n var key,\\n region,\\n map = this;\\n\\n this.regionLabelsGroup = this.regionLabelsGroup || this.canvas.addGroup();\\n\\n for (key in this.mapData.paths) {\\n region = new jvm.Region({\\n map: this,\\n path: this.mapData.paths[key].path,\\n code: key,\\n style: jvm.$.extend(true, {}, this.params.regionStyle),\\n labelStyle: jvm.$.extend(true, {}, this.params.regionLabelStyle),\\n canvas: this.canvas,\\n labelsGroup: this.regionLabelsGroup,\\n label: this.canvas.mode != 'vml' ? (this.params.labels && this.params.labels.regions) : null\\n });\\n\\n jvm.$(region.shape).bind('selected', function(e, isSelected){\\n map.container.trigger('regionSelected.jvectormap', [jvm.$(this.node).attr('data-code'), isSelected, map.getSelectedRegions()]);\\n });\\n this.regions[key] = {\\n element: region,\\n config: this.mapData.paths[key]\\n };\\n }\\n },\\n\\n createMarkers: function(markers) {\\n var i,\\n marker,\\n point,\\n markerConfig,\\n markersArray,\\n map = this;\\n\\n this.markersGroup = this.markersGroup || this.canvas.addGroup();\\n this.markerLabelsGroup = this.markerLabelsGroup || this.canvas.addGroup();\\n\\n if (jvm.$.isArray(markers)) {\\n markersArray = markers.slice();\\n markers = {};\\n for (i = 0; i < markersArray.length; i++) {\\n markers[i] = markersArray[i];\\n }\\n }\\n\\n for (i in markers) {\\n markerConfig = markers[i] instanceof Array ? {latLng: markers[i]} : markers[i];\\n point = this.getMarkerPosition( markerConfig );\\n\\n if (point !== false) {\\n marker = new jvm.Marker({\\n map: this,\\n style: jvm.$.extend(true, {}, this.params.markerStyle, {initial: markerConfig.style || {}}),\\n labelStyle: jvm.$.extend(true, {}, this.params.markerLabelStyle),\\n index: i,\\n cx: point.x,\\n cy: point.y,\\n group: this.markersGroup,\\n canvas: this.canvas,\\n labelsGroup: this.markerLabelsGroup,\\n label: this.canvas.mode != 'vml' ? (this.params.labels && this.params.labels.markers) : null\\n });\\n\\n jvm.$(marker.shape).bind('selected', function(e, isSelected){\\n map.container.trigger('markerSelected.jvectormap', [jvm.$(this.node).attr('data-index'), isSelected, map.getSelectedMarkers()]);\\n });\\n if (this.markers[i]) {\\n this.removeMarkers([i]);\\n }\\n this.markers[i] = {element: marker, config: markerConfig};\\n }\\n }\\n },\\n\\n repositionMarkers: function() {\\n var i,\\n point;\\n\\n for (i in this.markers) {\\n point = this.getMarkerPosition( this.markers[i].config );\\n if (point !== false) {\\n this.markers[i].element.setStyle({cx: point.x, cy: point.y});\\n }\\n }\\n },\\n\\n repositionLabels: function() {\\n var key;\\n\\n for (key in this.regions) {\\n this.regions[key].element.updateLabelPosition();\\n }\\n\\n for (key in this.markers) {\\n this.markers[key].element.updateLabelPosition();\\n }\\n },\\n\\n getMarkerPosition: function(markerConfig) {\\n if (jvm.Map.maps[this.params.map].projection) {\\n return this.latLngToPoint.apply(this, markerConfig.latLng || [0, 0]);\\n } else {\\n return {\\n x: markerConfig.coords[0]*this.scale + this.transX*this.scale,\\n y: markerConfig.coords[1]*this.scale + this.transY*this.scale\\n };\\n }\\n },\\n\\n /**\\n * Add one marker to the map.\\n * @param {String} key Marker unique code.\\n * @param {Object} marker Marker configuration parameters.\\n * @param {Array} seriesData Values to add to the data series.\\n */\\n addMarker: function(key, marker, seriesData){\\n var markers = {},\\n data = [],\\n values,\\n i,\\n seriesData = seriesData || [];\\n\\n markers[key] = marker;\\n\\n for (i = 0; i < seriesData.length; i++) {\\n values = {};\\n if (typeof seriesData[i] !== 'undefined') {\\n values[key] = seriesData[i];\\n }\\n data.push(values);\\n }\\n this.addMarkers(markers, data);\\n },\\n\\n /**\\n * Add set of marker to the map.\\n * @param {Object|Array} markers Markers to add to the map. In case of array is provided, codes of markers will be set as string representations of array indexes.\\n * @param {Array} seriesData Values to add to the data series.\\n */\\n addMarkers: function(markers, seriesData){\\n var i;\\n\\n seriesData = seriesData || [];\\n\\n this.createMarkers(markers);\\n for (i = 0; i < seriesData.length; i++) {\\n this.series.markers[i].setValues(seriesData[i] || {});\\n };\\n },\\n\\n /**\\n * Remove some markers from the map.\\n * @param {Array} markers Array of marker codes to be removed.\\n */\\n removeMarkers: function(markers){\\n var i;\\n\\n for (i = 0; i < markers.length; i++) {\\n this.markers[ markers[i] ].element.remove();\\n delete this.markers[ markers[i] ];\\n };\\n },\\n\\n /**\\n * Remove all markers from the map.\\n */\\n removeAllMarkers: function(){\\n var i,\\n markers = [];\\n\\n for (i in this.markers) {\\n markers.push(i);\\n }\\n this.removeMarkers(markers)\\n },\\n\\n /**\\n * Converts coordinates expressed as latitude and longitude to the coordinates in pixels on the map.\\n * @param {Number} lat Latitide of point in degrees.\\n * @param {Number} lng Longitude of point in degrees.\\n */\\n latLngToPoint: function(lat, lng) {\\n var point,\\n proj = jvm.Map.maps[this.params.map].projection,\\n centralMeridian = proj.centralMeridian,\\n inset,\\n bbox;\\n\\n if (lng < (-180 + centralMeridian)) {\\n lng += 360;\\n }\\n\\n point = jvm.Proj[proj.type](lat, lng, centralMeridian);\\n\\n inset = this.getInsetForPoint(point.x, point.y);\\n if (inset) {\\n bbox = inset.bbox;\\n\\n point.x = (point.x - bbox[0].x) / (bbox[1].x - bbox[0].x) * inset.width * this.scale;\\n point.y = (point.y - bbox[0].y) / (bbox[1].y - bbox[0].y) * inset.height * this.scale;\\n\\n return {\\n x: point.x + this.transX*this.scale + inset.left*this.scale,\\n y: point.y + this.transY*this.scale + inset.top*this.scale\\n };\\n } else {\\n return false;\\n }\\n },\\n\\n /**\\n * Converts cartesian coordinates into coordinates expressed as latitude and longitude.\\n * @param {Number} x X-axis of point on map in pixels.\\n * @param {Number} y Y-axis of point on map in pixels.\\n */\\n pointToLatLng: function(x, y) {\\n var proj = jvm.Map.maps[this.params.map].projection,\\n centralMeridian = proj.centralMeridian,\\n insets = jvm.Map.maps[this.params.map].insets,\\n i,\\n inset,\\n bbox,\\n nx,\\n ny;\\n\\n for (i = 0; i < insets.length; i++) {\\n inset = insets[i];\\n bbox = inset.bbox;\\n\\n nx = x - (this.transX*this.scale + inset.left*this.scale);\\n ny = y - (this.transY*this.scale + inset.top*this.scale);\\n\\n nx = (nx / (inset.width * this.scale)) * (bbox[1].x - bbox[0].x) + bbox[0].x;\\n ny = (ny / (inset.height * this.scale)) * (bbox[1].y - bbox[0].y) + bbox[0].y;\\n\\n if (nx > bbox[0].x && nx < bbox[1].x && ny > bbox[0].y && ny < bbox[1].y) {\\n return jvm.Proj[proj.type + '_inv'](nx, -ny, centralMeridian);\\n }\\n }\\n\\n return false;\\n },\\n\\n getInsetForPoint: function(x, y){\\n var insets = jvm.Map.maps[this.params.map].insets,\\n i,\\n bbox;\\n\\n for (i = 0; i < insets.length; i++) {\\n bbox = insets[i].bbox;\\n if (x > bbox[0].x && x < bbox[1].x && y > bbox[0].y && y < bbox[1].y) {\\n return insets[i];\\n }\\n }\\n },\\n\\n createSeries: function(){\\n var i,\\n key;\\n\\n this.series = {\\n markers: [],\\n regions: []\\n };\\n\\n for (key in this.params.series) {\\n for (i = 0; i < this.params.series[key].length; i++) {\\n this.series[key][i] = new jvm.DataSeries(\\n this.params.series[key][i],\\n this[key],\\n this\\n );\\n }\\n }\\n },\\n\\n /**\\n * Gracefully remove the map and and all its accessories, unbind event handlers.\\n */\\n remove: function(){\\n this.tip.remove();\\n this.container.remove();\\n jvm.$(window).unbind('resize', this.onResize);\\n jvm.$('body').unbind('mouseup', this.onContainerMouseUp);\\n }\\n};\\n\\njvm.Map.maps = {};\\njvm.Map.defaultParams = {\\n map: 'world_mill_en',\\n backgroundColor: '#505050',\\n zoomButtons: true,\\n zoomOnScroll: true,\\n zoomOnScrollSpeed: 3,\\n panOnDrag: true,\\n zoomMax: 8,\\n zoomMin: 1,\\n zoomStep: 1.6,\\n zoomAnimate: true,\\n regionsSelectable: false,\\n markersSelectable: false,\\n bindTouchEvents: true,\\n regionStyle: {\\n initial: {\\n fill: 'white',\\n \\\"fill-opacity\\\": 1,\\n stroke: 'none',\\n \\\"stroke-width\\\": 0,\\n \\\"stroke-opacity\\\": 1\\n },\\n hover: {\\n \\\"fill-opacity\\\": 0.8,\\n cursor: 'pointer'\\n },\\n selected: {\\n fill: 'yellow'\\n },\\n selectedHover: {\\n }\\n },\\n regionLabelStyle: {\\n initial: {\\n 'font-family': 'Verdana',\\n 'font-size': '12',\\n 'font-weight': 'bold',\\n cursor: 'default',\\n fill: 'black'\\n },\\n hover: {\\n cursor: 'pointer'\\n }\\n },\\n markerStyle: {\\n initial: {\\n fill: 'grey',\\n stroke: '#505050',\\n \\\"fill-opacity\\\": 1,\\n \\\"stroke-width\\\": 1,\\n \\\"stroke-opacity\\\": 1,\\n r: 5\\n },\\n hover: {\\n stroke: 'black',\\n \\\"stroke-width\\\": 2,\\n cursor: 'pointer'\\n },\\n selected: {\\n fill: 'blue'\\n },\\n selectedHover: {\\n }\\n },\\n markerLabelStyle: {\\n initial: {\\n 'font-family': 'Verdana',\\n 'font-size': '12',\\n 'font-weight': 'bold',\\n cursor: 'default',\\n fill: 'black'\\n },\\n hover: {\\n cursor: 'pointer'\\n }\\n }\\n};\\njvm.Map.apiEvents = {\\n onRegionTipShow: 'regionTipShow',\\n onRegionOver: 'regionOver',\\n onRegionOut: 'regionOut',\\n onRegionClick: 'regionClick',\\n onRegionSelected: 'regionSelected',\\n onMarkerTipShow: 'markerTipShow',\\n onMarkerOver: 'markerOver',\\n onMarkerOut: 'markerOut',\\n onMarkerClick: 'markerClick',\\n onMarkerSelected: 'markerSelected',\\n onViewportChange: 'viewportChange'\\n};\\n/**\\n * Creates map with drill-down functionality.\\n * @constructor\\n * @param {Object} params Parameters to initialize map with.\\n * @param {Number} params.maxLevel Maximum number of levels user can go through\\n * @param {Object} params.main Config of the main map. See <a href=\\\"./jvm-map/\\\">jvm.Map</a> for more information.\\n * @param {Function} params.mapNameByCode Function go generate map name by region code. Default value is:\\n<pre>\\nfunction(code, multiMap) {\\n return code.toLowerCase()+'_'+\\n multiMap.defaultProjection+'_en';\\n}\\n</pre>\\n * @param {Function} params.mapUrlByCode Function to generate map url by region code. Default value is:\\n<pre>\\nfunction(code, multiMap){\\n return 'jquery-jvectormap-data-'+\\n code.toLowerCase()+'-'+\\n multiMap.defaultProjection+'-en.js';\\n}\\n</pre>\\n */\\njvm.MultiMap = function(params) {\\n var that = this;\\n\\n this.maps = {};\\n this.params = jvm.$.extend(true, {}, jvm.MultiMap.defaultParams, params);\\n this.params.maxLevel = this.params.maxLevel || Number.MAX_VALUE;\\n this.params.main = this.params.main || {};\\n this.params.main.multiMapLevel = 0;\\n this.history = [ this.addMap(this.params.main.map, this.params.main) ];\\n this.defaultProjection = this.history[0].mapData.projection.type;\\n this.mapsLoaded = {};\\n\\n this.params.container.css({position: 'relative'});\\n this.backButton = jvm.$('<div/>').addClass('jvectormap-goback').text('Back').appendTo(this.params.container);\\n this.backButton.hide();\\n this.backButton.click(function(){\\n that.goBack();\\n });\\n\\n this.spinner = jvm.$('<div/>').addClass('jvectormap-spinner').appendTo(this.params.container);\\n this.spinner.hide();\\n};\\n\\njvm.MultiMap.prototype = {\\n addMap: function(name, config){\\n var cnt = jvm.$('<div/>').css({\\n width: '100%',\\n height: '100%'\\n });\\n\\n this.params.container.append(cnt);\\n\\n this.maps[name] = new jvm.Map(jvm.$.extend(config, {container: cnt}));\\n if (this.params.maxLevel > config.multiMapLevel) {\\n this.maps[name].container.on('regionClick.jvectormap', {scope: this}, function(e, code){\\n var multimap = e.data.scope,\\n mapName = multimap.params.mapNameByCode(code, multimap);\\n\\n if (!multimap.drillDownPromise || multimap.drillDownPromise.state() !== 'pending') {\\n multimap.drillDown(mapName, code);\\n }\\n });\\n }\\n\\n\\n return this.maps[name];\\n },\\n\\n downloadMap: function(code){\\n var that = this,\\n deferred = jvm.$.Deferred();\\n\\n if (!this.mapsLoaded[code]) {\\n jvm.$.get(this.params.mapUrlByCode(code, this)).then(function(){\\n that.mapsLoaded[code] = true;\\n deferred.resolve();\\n }, function(){\\n deferred.reject();\\n });\\n } else {\\n deferred.resolve();\\n }\\n return deferred;\\n },\\n\\n drillDown: function(name, code){\\n var currentMap = this.history[this.history.length - 1],\\n that = this,\\n focusPromise = currentMap.setFocus({region: code, animate: true}),\\n downloadPromise = this.downloadMap(code);\\n\\n focusPromise.then(function(){\\n if (downloadPromise.state() === 'pending') {\\n that.spinner.show();\\n }\\n });\\n downloadPromise.always(function(){\\n that.spinner.hide();\\n });\\n this.drillDownPromise = jvm.$.when(downloadPromise, focusPromise);\\n this.drillDownPromise.then(function(){\\n currentMap.params.container.hide();\\n if (!that.maps[name]) {\\n that.addMap(name, {map: name, multiMapLevel: currentMap.params.multiMapLevel + 1});\\n } else {\\n that.maps[name].params.container.show();\\n }\\n that.history.push( that.maps[name] );\\n that.backButton.show();\\n });\\n },\\n\\n goBack: function(){\\n var currentMap = this.history.pop(),\\n prevMap = this.history[this.history.length - 1],\\n that = this;\\n\\n currentMap.setFocus({scale: 1, x: 0.5, y: 0.5, animate: true}).then(function(){\\n currentMap.params.container.hide();\\n prevMap.params.container.show();\\n prevMap.updateSize();\\n if (that.history.length === 1) {\\n that.backButton.hide();\\n }\\n prevMap.setFocus({scale: 1, x: 0.5, y: 0.5, animate: true});\\n });\\n }\\n};\\n\\njvm.MultiMap.defaultParams = {\\n mapNameByCode: function(code, multiMap){\\n return code.toLowerCase()+'_'+multiMap.defaultProjection+'_en';\\n },\\n mapUrlByCode: function(code, multiMap){\\n return 'jquery-jvectormap-data-'+code.toLowerCase()+'-'+multiMap.defaultProjection+'-en.js';\\n }\\n}\\n\"\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/raw-loader!./src/assets/inspinia/plugins/jvectormap/jquery-jvectormap-2.0.2.min.js\n// module id = 2222\n// module chunks = 1","require(\"!!/opt/atlassian/pipelines/agent/build/node_modules/script-loader/addScript.js\")(require(\"!!/opt/atlassian/pipelines/agent/build/node_modules/raw-loader/index.js!/opt/atlassian/pipelines/agent/build/src/assets/inspinia/plugins/jvectormap/jquery-jvectormap-world-mill-en.js\"))\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/script-loader!./src/assets/inspinia/plugins/jvectormap/jquery-jvectormap-world-mill-en.js\n// module id = 2223\n// module chunks = 1","module.exports = \"$.fn.vectorMap('addMap', 'world_mill_en',{\\\"insets\\\": [{\\\"width\\\": 900.0, \\\"top\\\": 0, \\\"height\\\": 440.7063107441331, \\\"bbox\\\": [{\\\"y\\\": -12671671.123330014, \\\"x\\\": -20004297.151525836}, {\\\"y\\\": 6930392.02513512, \\\"x\\\": 20026572.394749384}], \\\"left\\\": 0}], \\\"paths\\\": {\\\"BD\\\": {\\\"path\\\": \\\"M652.71,228.85l-0.04,1.38l-0.46,-0.21l-0.42,0.3l0.05,0.65l-0.17,-1.37l-0.48,-1.26l-1.08,-1.6l-0.23,-0.13l-2.31,-0.11l-0.31,0.36l0.21,0.98l-0.6,1.11l-0.8,-0.4l-0.37,0.09l-0.23,0.3l-0.54,-0.21l-0.78,-0.19l-0.38,-2.04l-0.83,-1.89l0.4,-1.5l-0.16,-0.35l-1.24,-0.57l0.36,-0.62l1.5,-0.95l0.02,-0.49l-1.62,-1.26l0.64,-1.31l1.7,1.0l0.12,0.04l0.96,0.11l0.19,1.62l0.25,0.26l2.38,0.37l2.32,-0.04l1.06,0.33l-0.92,1.79l-0.97,0.13l-0.23,0.16l-0.77,1.51l0.05,0.35l1.37,1.37l0.5,-0.14l0.35,-1.46l0.24,-0.0l1.24,3.92Z\\\", \\\"name\\\": \\\"Bangladesh\\\"}, \\\"BE\\\": {\\\"path\\\": \\\"M429.28,143.95l1.76,0.25l0.13,-0.01l2.16,-0.64l1.46,1.34l1.26,0.71l-0.23,1.8l-0.44,0.08l-0.24,0.25l-0.2,1.36l-1.8,-1.22l-0.23,-0.05l-1.14,0.23l-1.62,-1.43l-1.15,-1.31l-0.21,-0.1l-0.95,-0.04l-0.21,-0.68l1.66,-0.54Z\\\", \\\"name\\\": \\\"Belgium\\\"}, \\\"BF\\\": {\\\"path\\\": \\\"M413.48,260.21l-1.22,-0.46l-0.13,-0.02l-1.17,0.1l-0.15,0.06l-0.73,0.53l-0.87,-0.41l-0.39,-0.75l-0.13,-0.13l-0.98,-0.48l-0.14,-1.2l0.63,-0.99l0.05,-0.18l-0.05,-0.73l1.9,-2.01l0.08,-0.14l0.35,-1.65l0.49,-0.44l1.05,0.3l0.21,-0.02l1.05,-0.52l0.13,-0.13l0.3,-0.58l1.87,-1.1l0.11,-0.1l0.43,-0.72l2.23,-1.01l1.21,-0.32l0.51,0.4l0.19,0.06l1.25,-0.01l-0.14,0.89l0.01,0.13l0.34,1.16l0.06,0.11l1.35,1.59l0.07,1.13l0.24,0.28l2.64,0.53l-0.05,1.39l-0.42,0.59l-1.11,0.21l-0.22,0.17l-0.46,0.99l-0.69,0.23l-2.12,-0.05l-1.14,-0.2l-0.19,0.03l-0.72,0.36l-1.07,-0.17l-4.35,0.12l-0.29,0.29l-0.06,1.44l0.25,1.45Z\\\", \\\"name\\\": \\\"Burkina Faso\\\"}, \\\"BG\\\": {\\\"path\\\": \\\"M477.63,166.84l0.51,0.9l0.33,0.14l0.9,-0.21l1.91,0.47l3.68,0.16l0.17,-0.05l1.2,-0.75l2.78,-0.67l1.72,1.05l1.02,0.24l-0.97,0.97l-0.91,2.17l0.0,0.24l0.56,1.19l-1.58,-0.3l-0.16,0.01l-2.55,0.95l-0.2,0.28l-0.02,1.23l-1.92,0.24l-1.68,-0.99l-0.27,-0.02l-1.94,0.8l-1.52,-0.07l-0.15,-1.72l-0.12,-0.21l-0.99,-0.76l0.18,-0.18l0.02,-0.39l-0.17,-0.22l0.33,-0.75l0.91,-0.91l0.01,-0.42l-1.16,-1.25l-0.18,-0.89l0.24,-0.27Z\\\", \\\"name\\\": \\\"Bulgaria\\\"}, \\\"BA\\\": {\\\"path\\\": \\\"M468.39,164.66l0.16,0.04l0.43,-0.0l-0.43,0.93l0.06,0.34l1.08,1.06l-0.28,1.09l-0.5,0.13l-0.47,0.28l-0.86,0.74l-0.1,0.16l-0.28,1.29l-1.81,-0.94l-0.9,-1.22l-1.0,-0.73l-1.1,-1.1l-0.55,-0.96l-1.11,-1.3l0.3,-0.75l0.59,0.46l0.42,-0.04l0.46,-0.54l1.0,-0.06l2.11,0.5l1.72,-0.03l1.06,0.64Z\\\", \\\"name\\\": \\\"Bosnia and Herzegovina\\\"}, \\\"BN\\\": {\\\"path\\\": \\\"M707.34,273.57l0.76,-0.72l1.59,-1.03l-0.18,1.93l-0.9,-0.06l-0.28,0.14l-0.31,0.51l-0.68,-0.78Z\\\", \\\"name\\\": \\\"Brunei\\\"}, \\\"BO\\\": {\\\"path\\\": \\\"M263.83,340.79l-0.23,-0.12l-2.86,-0.11l-0.28,0.17l-0.77,1.67l-1.17,-1.51l-0.18,-0.11l-3.28,-0.64l-0.28,0.1l-2.02,2.3l-1.43,0.29l-0.91,-3.35l-1.31,-2.88l0.75,-2.41l-0.09,-0.32l-1.23,-1.03l-0.31,-1.76l-0.05,-0.12l-1.12,-1.6l1.49,-2.62l0.01,-0.28l-1.0,-2.0l0.48,-0.72l0.02,-0.29l-0.37,-0.78l0.87,-1.13l0.06,-0.18l0.05,-2.17l0.12,-1.71l0.5,-0.8l0.01,-0.3l-1.9,-3.58l1.3,0.15l1.34,-0.05l0.23,-0.12l0.51,-0.7l2.12,-0.99l1.31,-0.93l2.81,-0.37l-0.21,1.51l0.01,0.13l0.29,0.91l-0.19,1.64l0.11,0.27l2.72,2.27l0.15,0.07l2.71,0.41l0.92,0.88l0.12,0.07l1.64,0.49l1.0,0.71l0.18,0.06l1.5,-0.02l1.24,0.64l0.1,1.31l0.05,0.14l0.44,0.68l0.02,0.73l-0.44,0.03l-0.27,0.39l0.96,2.99l0.28,0.21l4.43,0.1l-0.28,1.12l0.0,0.15l0.27,1.02l0.15,0.19l1.27,0.67l0.52,1.42l-0.42,1.91l-0.66,1.1l-0.04,0.2l0.21,1.3l-0.19,0.13l-0.01,-0.27l-0.15,-0.24l-2.33,-1.33l-0.14,-0.04l-2.38,-0.03l-4.36,0.76l-0.21,0.16l-1.2,2.29l-0.03,0.13l-0.06,1.37l-0.79,2.53l-0.05,-0.08Z\\\", \\\"name\\\": \\\"Bolivia\\\"}, \\\"JP\\\": {\\\"path\\\": \\\"M781.17,166.78l1.8,0.67l0.28,-0.04l1.38,-1.01l0.43,2.67l-3.44,0.77l-0.18,0.12l-2.04,2.79l-3.71,-1.94l-0.42,0.15l-1.29,3.11l-2.32,0.04l-0.3,-2.63l1.12,-2.1l2.51,-0.16l0.28,-0.25l0.73,-4.22l0.58,-1.9l2.59,2.84l2.0,1.1ZM773.66,187.36l-0.92,2.24l-0.01,0.2l0.4,1.3l-1.18,1.81l-3.06,1.28l-4.35,0.17l-0.19,0.08l-3.4,3.06l-1.36,-0.87l-0.1,-1.95l-0.34,-0.28l-4.35,0.62l-2.99,1.33l-2.87,0.05l-0.28,0.2l0.09,0.33l2.37,1.93l-1.57,4.44l-1.35,0.97l-0.9,-0.79l0.57,-2.32l-0.15,-0.34l-1.5,-0.77l-0.81,-1.53l2.04,-0.75l0.14,-0.1l1.28,-1.72l2.47,-1.43l1.84,-1.92l4.83,-0.82l2.62,0.57l0.33,-0.16l2.45,-4.77l1.38,1.14l0.38,0.0l5.1,-4.02l0.09,-0.11l1.57,-3.57l0.02,-0.16l-0.42,-3.22l0.94,-1.67l2.27,-0.47l1.26,3.82l-0.07,2.23l-2.26,2.86l-0.06,0.19l0.04,2.93ZM757.85,196.18l0.22,0.66l-1.11,1.33l-0.8,-0.7l-0.33,-0.04l-1.28,0.65l-0.14,0.15l-0.54,1.34l-1.17,-0.57l0.02,-1.03l1.2,-1.45l1.24,0.28l0.29,-0.1l0.9,-1.03l1.51,0.5Z\\\", \\\"name\\\": \\\"Japan\\\"}, \\\"BI\\\": {\\\"path\\\": \\\"M494.7,295.83l-0.14,-2.71l-0.04,-0.13l-0.34,-0.62l0.93,0.12l0.3,-0.16l0.67,-1.25l0.9,0.11l0.11,0.76l0.08,0.16l0.46,0.48l0.02,0.56l-0.55,0.48l-0.96,1.29l-0.82,0.82l-0.61,0.07Z\\\", \\\"name\\\": \\\"Burundi\\\"}, \\\"BJ\\\": {\\\"path\\\": \\\"M427.4,268.94l-1.58,0.22l-0.52,-1.45l0.11,-5.73l-0.08,-0.21l-0.43,-0.44l-0.09,-1.13l-0.09,-0.19l-1.52,-1.52l0.24,-1.01l0.7,-0.23l0.18,-0.16l0.45,-0.97l1.07,-0.21l0.19,-0.12l0.53,-0.73l0.73,-0.65l0.68,-0.0l1.69,1.3l-0.08,0.67l0.02,0.14l0.52,1.38l-0.44,0.9l-0.01,0.24l0.2,0.52l-1.1,1.42l-0.76,0.76l-0.08,0.13l-0.47,1.59l0.05,1.69l-0.13,3.79Z\\\", \\\"name\\\": \\\"Benin\\\"}, \\\"BT\\\": {\\\"path\\\": \\\"M650.38,213.78l0.88,0.75l-0.13,1.24l-1.77,0.07l-2.1,-0.18l-1.57,0.4l-2.02,-0.91l-0.02,-0.24l1.54,-1.87l1.18,-0.6l1.67,0.59l1.32,0.08l1.01,0.67Z\\\", \\\"name\\\": \\\"Bhutan\\\"}, \\\"JM\\\": {\\\"path\\\": \\\"M226.67,238.37l1.64,0.23l1.2,0.56l0.11,0.19l-1.25,0.03l-0.14,0.04l-0.65,0.37l-1.24,-0.37l-1.17,-0.77l0.11,-0.22l0.86,-0.15l0.52,0.08Z\\\", \\\"name\\\": \\\"Jamaica\\\"}, \\\"BW\\\": {\\\"path\\\": \\\"M484.91,331.96l0.53,0.52l0.82,1.53l2.83,2.86l0.14,0.08l0.85,0.22l0.03,0.81l0.74,1.66l0.21,0.17l1.87,0.39l1.17,0.87l-3.13,1.71l-2.3,2.01l-0.07,0.1l-0.82,1.74l-0.66,0.88l-1.24,0.19l-0.24,0.2l-0.65,1.98l-1.4,0.55l-1.9,-0.12l-1.2,-0.74l-1.06,-0.32l-0.22,0.02l-1.22,0.62l-0.14,0.14l-0.58,1.21l-1.16,0.79l-1.18,1.13l-1.5,0.23l-0.4,-0.68l0.22,-1.53l-0.04,-0.19l-1.48,-2.54l-0.11,-0.11l-0.53,-0.31l-0.0,-7.25l2.18,-0.08l0.29,-0.3l0.07,-9.0l1.63,-0.08l3.69,-0.86l0.84,0.93l0.38,0.05l1.53,-0.97l0.79,-0.03l1.3,-0.53l0.23,0.1l0.92,1.96Z\\\", \\\"name\\\": \\\"Botswana\\\"}, \\\"BR\\\": {\\\"path\\\": \\\"M259.49,274.87l1.42,0.25l1.97,0.62l0.28,-0.05l0.67,-0.55l1.76,-0.38l2.8,-0.94l0.12,-0.08l0.92,-0.96l0.05,-0.33l-0.15,-0.32l0.73,-0.06l0.36,0.35l-0.27,0.93l0.17,0.36l0.76,0.34l0.44,0.9l-0.58,0.73l-0.06,0.13l-0.4,2.13l0.03,0.19l0.62,1.22l0.17,1.11l0.11,0.19l1.54,1.18l0.15,0.06l1.23,0.12l0.29,-0.15l0.2,-0.36l0.71,-0.11l1.13,-0.44l0.79,-0.63l1.25,0.19l0.65,-0.08l1.32,0.2l0.32,-0.18l0.23,-0.51l-0.05,-0.31l-0.31,-0.37l0.11,-0.31l0.75,0.17l0.13,0.0l1.1,-0.24l1.34,0.5l1.08,0.51l0.33,-0.05l0.67,-0.58l0.27,0.05l0.28,0.57l0.31,0.17l1.2,-0.18l0.17,-0.08l1.03,-1.05l0.76,-1.82l1.39,-2.16l0.49,-0.07l0.52,1.17l1.4,4.37l0.2,0.2l1.14,0.35l0.05,1.39l-1.8,1.97l0.01,0.42l0.78,0.75l0.18,0.08l4.16,0.37l0.08,2.25l0.5,0.22l1.78,-1.54l2.98,0.85l4.07,1.5l1.07,1.28l-0.37,1.23l0.36,0.38l2.83,-0.75l4.8,1.3l3.75,-0.09l3.6,2.02l3.27,2.84l1.93,0.72l2.13,0.11l0.76,0.66l1.22,4.56l-0.96,4.03l-1.22,1.58l-3.52,3.51l-1.63,2.91l-1.75,2.09l-0.5,0.04l-0.26,0.19l-0.72,1.99l0.18,4.76l-0.95,5.56l-0.74,0.96l-0.06,0.15l-0.43,3.39l-2.49,3.34l-0.06,0.13l-0.4,2.56l-1.9,1.07l-0.13,0.16l-0.51,1.38l-2.59,0.0l-3.94,1.01l-1.82,1.19l-2.85,0.81l-3.01,2.17l-2.12,2.65l-0.06,0.13l-0.36,2.0l0.01,0.13l0.4,1.42l-0.45,2.63l-0.53,1.23l-1.76,1.53l-2.76,4.79l-2.16,2.15l-1.69,1.29l-0.09,0.12l-1.12,2.6l-1.3,1.26l-0.45,-1.02l0.99,-1.18l0.01,-0.37l-1.5,-1.95l-1.98,-1.54l-2.58,-1.77l-0.2,-0.05l-0.81,0.07l-2.42,-2.05l-0.25,-0.07l-0.77,0.14l2.75,-3.07l2.8,-2.61l1.67,-1.09l2.11,-1.49l0.13,-0.24l0.05,-2.15l-0.07,-0.2l-1.26,-1.54l-0.35,-0.09l-0.64,0.27l0.3,-0.95l0.34,-1.57l0.01,-1.52l-0.16,-0.26l-0.9,-0.48l-0.27,-0.01l-0.86,0.39l-0.65,-0.08l-0.23,-0.8l-0.23,-2.39l-0.04,-0.12l-0.47,-0.79l-0.14,-0.12l-1.69,-0.71l-0.25,0.01l-0.93,0.47l-2.29,-0.44l0.15,-3.3l-0.03,-0.15l-0.62,-1.22l0.57,-0.39l0.13,-0.3l-0.22,-1.37l0.67,-1.13l0.44,-2.04l-0.01,-0.17l-0.59,-1.61l-0.14,-0.16l-1.25,-0.66l-0.22,-0.82l0.35,-1.41l-0.28,-0.37l-4.59,-0.1l-0.78,-2.41l0.34,-0.02l0.28,-0.31l-0.03,-1.1l-0.05,-0.16l-0.45,-0.68l-0.1,-1.4l-0.16,-0.24l-1.45,-0.76l-0.14,-0.03l-1.48,0.02l-1.04,-0.73l-1.62,-0.48l-0.93,-0.9l-0.16,-0.08l-2.72,-0.41l-2.53,-2.12l0.18,-1.54l-0.01,-0.13l-0.29,-0.91l0.26,-1.83l-0.34,-0.34l-3.28,0.43l-0.14,0.05l-1.3,0.93l-2.16,1.01l-0.12,0.09l-0.47,0.65l-1.12,0.05l-1.84,-0.21l-0.12,0.01l-1.33,0.41l-0.82,-0.21l0.16,-3.6l-0.48,-0.26l-1.97,1.43l-1.96,-0.06l-0.86,-1.23l-0.22,-0.13l-1.23,-0.11l0.34,-0.69l-0.05,-0.33l-1.36,-1.5l-0.92,-2.0l0.45,-0.32l0.13,-0.25l-0.0,-0.87l1.34,-0.64l0.17,-0.32l-0.23,-1.23l0.56,-0.77l0.05,-0.13l0.16,-1.03l2.7,-1.61l2.01,-0.47l0.16,-0.09l0.24,-0.27l2.11,0.11l0.31,-0.25l1.13,-6.87l0.06,-1.12l-0.4,-1.53l-0.1,-0.15l-1.0,-0.82l0.01,-1.45l1.08,-0.32l0.39,0.2l0.44,-0.24l0.08,-0.96l-0.25,-0.32l-1.22,-0.22l-0.02,-1.01l4.57,0.05l0.22,-0.09l0.6,-0.63l0.44,0.5l0.47,1.42l0.45,0.16l0.27,-0.18l1.21,1.16l0.23,0.08l1.95,-0.16l0.23,-0.14l0.43,-0.67l1.76,-0.55l1.05,-0.42l0.18,-0.2l0.25,-0.92l1.65,-0.66l0.18,-0.35l-0.14,-0.53l-0.26,-0.22l-1.91,-0.19l-0.29,-1.33l0.1,-1.64l-0.15,-0.28l-0.44,-0.25Z\\\", \\\"name\\\": \\\"Brazil\\\"}, \\\"BS\\\": {\\\"path\\\": \\\"M227.51,216.69l0.3,0.18l-0.24,1.07l0.03,-1.04l-0.09,-0.21ZM226.5,224.03l-0.13,0.03l-0.54,-1.3l-0.09,-0.12l-0.78,-0.64l0.4,-1.26l0.33,0.05l0.79,2.0l0.01,1.24ZM225.76,216.5l-2.16,0.34l-0.07,-0.41l0.85,-0.16l1.36,0.07l0.02,0.16Z\\\", \\\"name\\\": \\\"The Bahamas\\\"}, \\\"BY\\\": {\\\"path\\\": \\\"M480.08,135.28l2.09,0.02l0.13,-0.03l2.72,-1.3l0.16,-0.19l0.55,-1.83l1.94,-1.06l0.15,-0.31l-0.2,-1.33l1.33,-0.52l2.58,-1.3l2.39,0.8l0.3,0.75l0.37,0.17l1.22,-0.39l2.18,0.75l0.2,1.36l-0.48,0.85l0.01,0.32l1.57,2.26l0.92,0.6l-0.1,0.41l0.19,0.35l1.61,0.57l0.48,0.6l-0.64,0.49l-1.91,-0.11l-0.18,0.05l-0.48,0.32l-0.1,0.39l0.57,1.1l0.51,1.78l-1.79,0.17l-0.18,0.08l-0.77,0.73l-0.09,0.19l-0.13,1.31l-0.75,-0.22l-2.11,0.15l-0.56,-0.66l-0.39,-0.06l-0.8,0.49l-0.79,-0.4l-0.13,-0.03l-1.94,-0.07l-2.76,-0.79l-2.58,-0.27l-1.98,0.07l-0.15,0.05l-1.31,0.86l-0.8,0.09l-0.04,-1.16l-0.03,-0.12l-0.63,-1.28l1.22,-0.56l0.17,-0.27l0.01,-1.35l-0.04,-0.15l-0.66,-1.24l-0.08,-1.12Z\\\", \\\"name\\\": \\\"Belarus\\\"}, \\\"BZ\\\": {\\\"path\\\": \\\"M198.03,239.7l0.28,0.19l0.43,-0.1l0.82,-1.42l0.0,0.07l0.29,0.29l0.16,0.0l-0.02,0.35l-0.39,1.08l0.02,0.25l0.16,0.29l-0.23,0.8l0.04,0.24l0.09,0.14l-0.25,1.12l-0.38,0.53l-0.33,0.06l-0.21,0.15l-0.41,0.74l-0.25,0.0l0.17,-2.58l0.01,-2.2Z\\\", \\\"name\\\": \\\"Belize\\\"}, \\\"RU\\\": {\\\"path\\\": \\\"M688.57,38.85l0.63,2.39l0.44,0.19l2.22,-1.23l7.18,0.07l5.54,2.49l1.85,1.77l-0.55,2.34l-2.64,1.42l-6.57,2.76l-1.95,1.5l0.12,0.53l3.09,0.68l3.69,1.23l0.21,-0.01l1.98,-0.81l1.16,2.84l0.5,0.08l1.03,-1.18l3.86,-0.74l7.79,0.78l0.56,2.05l0.27,0.22l10.47,0.71l0.32,-0.29l0.13,-3.34l4.98,0.8l3.96,-0.02l3.88,2.43l1.06,2.79l-1.38,1.83l0.01,0.38l3.15,3.64l0.1,0.08l3.94,1.86l0.4,-0.14l2.28,-4.56l3.75,1.94l0.22,0.02l4.18,-1.22l4.76,1.4l0.26,-0.04l1.74,-1.23l3.98,0.63l0.32,-0.41l-1.71,-4.1l3.0,-1.86l22.39,3.04l2.06,2.67l0.1,0.08l6.55,3.51l0.17,0.03l10.08,-0.86l4.86,0.73l1.91,1.72l-0.29,3.13l0.18,0.31l3.08,1.26l0.19,0.01l3.32,-0.9l4.37,-0.11l4.78,0.87l4.61,-0.48l4.26,3.82l0.32,0.05l3.1,-1.4l0.12,-0.45l-1.91,-2.67l0.92,-1.64l7.78,1.22l5.22,-0.26l7.12,2.1l9.6,5.22l6.4,4.15l-0.2,2.44l0.14,0.28l1.69,1.04l0.45,-0.31l-0.51,-2.66l6.31,0.58l4.52,3.61l-2.1,1.52l-4.02,0.42l-0.27,0.29l-0.06,3.83l-0.81,0.67l-2.14,-0.11l-1.91,-1.39l-3.19,-1.13l-0.51,-1.63l-0.21,-0.2l-2.54,-0.67l-0.13,-0.0l-2.69,0.5l-1.12,-1.19l0.48,-1.36l-0.38,-0.39l-3.0,0.98l-0.17,0.44l1.02,1.76l-1.27,1.55l-3.09,1.71l-3.15,-0.29l-0.3,0.18l0.07,0.34l2.22,2.1l1.47,3.22l1.15,1.09l0.25,1.41l-0.48,0.76l-4.47,-0.81l-0.17,0.02l-6.97,2.9l-2.2,0.44l-0.11,0.05l-3.83,2.68l-3.63,2.32l-0.1,0.11l-0.76,1.4l-3.3,-2.4l-0.3,-0.03l-6.31,2.85l-0.99,-1.21l-0.4,-0.06l-2.32,1.54l-3.23,-0.49l-0.33,0.2l-0.79,2.39l-2.97,3.51l-0.07,0.21l0.09,1.47l0.22,0.27l2.62,0.74l-0.3,4.7l-2.06,0.12l-0.26,0.2l-1.07,2.94l0.04,0.27l0.83,1.19l-4.03,1.63l-0.18,0.21l-0.83,3.72l-3.55,0.79l-0.23,0.23l-0.73,3.32l-3.22,2.76l-0.76,-1.88l-1.07,-4.88l-1.39,-7.59l1.17,-4.76l2.05,-2.08l0.09,-0.19l0.11,-1.46l3.67,-0.77l0.15,-0.08l4.47,-4.61l4.29,-3.82l4.48,-3.01l0.11,-0.14l2.01,-5.43l-0.31,-0.4l-3.04,0.33l-0.24,0.17l-1.47,3.11l-5.98,3.94l-1.91,-4.36l-0.33,-0.17l-6.46,1.3l-0.15,0.08l-6.27,6.33l-0.01,0.41l1.7,1.87l-5.04,0.87l-3.51,0.34l0.16,-2.32l-0.26,-0.32l-3.89,-0.56l-0.19,0.04l-3.02,1.77l-7.63,-0.63l-8.24,1.1l-0.16,0.07l-8.11,7.09l-9.6,8.31l0.16,0.52l3.79,0.42l1.16,2.03l0.17,0.14l2.43,0.76l0.31,-0.08l1.5,-1.61l2.49,0.2l3.46,3.6l0.08,2.67l-1.91,3.26l-0.04,0.14l-0.21,3.91l-1.11,5.09l-3.73,4.55l-0.87,2.21l-6.73,7.14l-1.59,1.77l-3.23,1.72l-1.38,0.03l-1.48,-1.39l-0.37,-0.03l-3.36,2.22l-0.11,0.14l-0.16,0.42l-0.01,-1.09l1.0,-0.06l0.28,-0.27l0.36,-3.6l-0.61,-2.51l1.85,-0.94l2.94,0.53l0.32,-0.15l1.71,-3.1l0.84,-3.38l0.97,-1.18l1.32,-2.88l-0.34,-0.42l-4.14,0.95l-2.18,1.25l-3.51,-0.0l-0.95,-2.81l-0.1,-0.14l-2.97,-2.3l-0.11,-0.05l-4.19,-1.0l-0.89,-3.08l-0.87,-2.03l-0.95,-1.46l-1.54,-3.37l-0.12,-0.14l-2.27,-1.28l-3.83,-1.02l-3.37,0.1l-3.11,0.61l-0.13,0.06l-2.07,1.69l0.04,0.49l1.23,0.72l0.03,1.53l-1.34,1.05l-2.26,3.51l-0.05,0.17l0.02,1.27l-3.25,1.9l-2.87,-1.17l-0.14,-0.02l-2.86,0.26l-1.22,-1.02l-0.12,-0.06l-1.5,-0.35l-0.23,0.04l-3.62,2.27l-3.24,0.53l-2.28,0.79l-3.08,-0.51l-2.24,0.03l-1.49,-1.61l-2.45,-1.57l-0.11,-0.04l-2.6,-0.43l-3.17,0.43l-2.31,0.59l-3.31,-1.28l-0.45,-2.31l-0.21,-0.23l-2.94,-0.85l-2.26,-0.39l-2.77,-1.36l-0.37,0.09l-2.59,3.45l-0.03,0.32l0.91,1.74l-2.15,2.01l-3.47,-0.79l-2.44,-0.12l-1.59,-1.46l-0.2,-0.08l-2.55,-0.05l-2.12,-0.98l-0.24,-0.01l-3.85,1.57l-4.74,2.79l-2.59,0.55l-0.79,0.21l-1.21,-1.81l-0.29,-0.13l-3.05,0.41l-0.96,-1.25l-0.14,-0.1l-1.65,-0.6l-1.15,-1.82l-0.13,-0.12l-1.38,-0.6l-0.19,-0.02l-3.49,0.82l-3.35,-1.85l-0.38,0.08l-1.08,1.4l-5.36,-8.17l-3.02,-2.52l0.72,-0.85l0.01,-0.38l-0.37,-0.08l-6.22,3.21l-1.98,0.16l0.17,-1.51l-0.2,-0.31l-3.22,-1.17l-0.19,-0.0l-2.3,0.74l-0.72,-3.27l-0.24,-0.23l-4.5,-0.75l-0.21,0.04l-2.2,1.42l-6.21,1.27l-0.11,0.05l-1.16,0.81l-9.3,1.19l-0.18,0.09l-1.15,1.17l-0.02,0.39l1.56,2.01l-2.02,0.74l-0.16,0.42l0.35,0.68l-2.18,1.49l0.02,0.51l3.83,2.16l-0.45,1.13l-3.31,-0.13l-0.25,0.12l-0.57,0.77l-2.97,-1.59l-0.15,-0.04l-3.97,0.07l-0.13,0.03l-2.53,1.32l-2.84,-1.28l-5.52,-2.3l-0.12,-0.02l-3.91,0.09l-0.16,0.05l-5.17,3.6l-0.13,0.21l-0.25,1.89l-2.17,-1.6l-0.44,0.1l-2.0,3.59l0.06,0.37l0.55,0.5l-1.32,2.23l0.04,0.36l2.13,2.17l0.23,0.09l1.7,-0.08l1.42,1.89l-0.23,1.5l0.19,0.32l0.94,0.38l-0.89,1.44l-2.3,0.49l-0.17,0.11l-2.49,3.2l0.0,0.37l2.2,2.81l-0.23,1.93l0.06,0.22l2.56,3.32l-1.27,1.02l-0.4,0.66l-0.8,-0.15l-1.65,-1.75l-0.18,-0.09l-0.66,-0.09l-1.45,-0.64l-0.72,-1.16l-0.18,-0.13l-2.34,-0.63l-0.17,0.0l-1.32,0.41l-0.31,-0.4l-0.12,-0.09l-3.49,-1.48l-3.67,-0.49l-2.1,-0.52l-0.3,0.1l-0.12,0.14l-2.96,-2.4l-2.89,-1.19l-1.69,-1.42l1.27,-0.35l0.16,-0.1l2.08,-2.61l-0.04,-0.41l-1.02,-0.9l3.21,-1.12l0.2,-0.31l-0.07,-0.69l-0.37,-0.26l-1.86,0.42l0.05,-0.86l1.11,-0.76l2.35,-0.23l0.25,-0.19l0.39,-1.07l0.0,-0.19l-0.51,-1.64l0.95,-1.58l0.04,-0.16l-0.03,-0.95l-0.22,-0.28l-3.69,-1.06l-1.43,0.02l-1.45,-1.44l-0.29,-0.08l-1.83,0.49l-2.88,-1.04l0.04,-0.42l-0.04,-0.18l-0.89,-1.43l-0.23,-0.14l-1.77,-0.14l-0.13,-0.66l0.52,-0.56l0.01,-0.4l-1.6,-1.9l-0.27,-0.1l-2.55,0.32l-0.71,-0.16l-0.3,0.1l-0.53,0.63l-0.58,-0.08l-0.56,-1.97l-0.48,-0.94l0.17,-0.11l1.92,0.11l0.2,-0.06l0.97,-0.74l0.05,-0.42l-0.72,-0.91l-0.13,-0.1l-1.43,-0.51l0.09,-0.36l-0.13,-0.33l-0.97,-0.59l-1.43,-2.06l0.44,-0.77l0.04,-0.19l-0.25,-1.64l-0.2,-0.24l-2.45,-0.84l-0.19,-0.0l-1.05,0.34l-0.25,-0.62l-0.18,-0.17l-2.5,-0.84l-0.74,-1.93l-0.21,-1.7l-0.13,-0.21l-0.92,-0.63l0.83,-0.89l0.07,-0.27l-0.71,-3.26l1.69,-2.01l0.03,-0.34l-0.24,-0.41l2.63,-1.9l-0.01,-0.49l-2.31,-1.57l5.08,-4.61l2.33,-2.24l1.01,-2.08l-0.09,-0.37l-3.52,-2.56l0.94,-2.38l-0.04,-0.29l-2.14,-2.86l1.61,-3.35l-0.01,-0.29l-2.81,-4.58l2.19,-3.04l-0.06,-0.42l-3.7,-2.76l0.32,-2.67l1.87,-0.38l4.26,-1.77l2.46,-1.47l3.96,2.58l0.12,0.05l6.81,1.04l9.37,4.87l1.81,1.92l0.15,2.55l-2.61,2.06l-3.95,1.07l-11.1,-3.15l-0.17,0.0l-1.84,0.53l-0.1,0.53l3.97,2.97l0.15,1.77l0.16,4.14l0.19,0.27l3.21,1.22l1.94,1.03l0.44,-0.22l0.32,-1.94l-0.07,-0.25l-1.32,-1.52l1.25,-1.2l5.87,2.45l0.24,-0.01l2.11,-0.98l0.13,-0.42l-1.55,-2.75l5.52,-3.84l2.13,0.22l2.28,1.42l0.43,-0.12l1.46,-2.87l-0.04,-0.33l-1.97,-2.37l1.14,-2.38l-0.02,-0.3l-1.42,-2.07l6.15,1.22l1.14,1.92l-2.74,0.46l-0.25,0.3l0.02,2.36l0.12,0.24l1.97,1.44l0.25,0.05l3.87,-0.91l0.22,-0.23l0.58,-2.55l5.09,-1.98l8.67,-3.69l1.22,0.14l-2.06,2.2l0.18,0.5l3.11,0.45l0.23,-0.07l1.71,-1.41l4.59,-0.12l0.12,-0.03l3.53,-1.72l2.7,2.48l0.42,-0.01l2.85,-2.88l-0.0,-0.43l-2.42,-2.35l1.0,-1.13l7.2,1.31l3.42,1.36l9.06,4.97l0.39,-0.08l1.67,-2.27l-0.04,-0.4l-2.46,-2.23l-0.06,-0.82l-0.26,-0.27l-2.64,-0.38l0.69,-1.76l0.0,-0.22l-1.32,-3.47l-0.07,-1.27l4.52,-4.09l0.08,-0.11l1.6,-4.18l1.67,-0.84l6.33,1.2l0.46,2.31l-2.31,3.67l0.05,0.38l1.49,1.41l0.77,3.04l-0.56,6.05l0.09,0.24l2.62,2.54l-0.99,2.65l-4.87,5.96l0.17,0.48l2.86,0.61l0.31,-0.13l0.94,-1.42l2.67,-1.04l0.18,-0.19l0.64,-2.01l2.11,-1.98l0.05,-0.37l-1.38,-2.32l1.11,-2.74l-0.24,-0.41l-2.53,-0.33l-0.53,-2.16l1.96,-4.42l-0.05,-0.32l-3.03,-3.48l4.21,-2.94l0.12,-0.3l-0.52,-3.04l0.72,-0.06l1.18,2.35l-0.97,4.39l0.2,0.35l2.68,0.84l0.37,-0.38l-1.05,-3.07l3.89,-1.71l5.05,-0.24l4.55,2.62l0.36,-0.05l0.05,-0.36l-2.19,-3.84l-0.23,-4.78l4.07,-0.92l5.98,0.21l5.47,-0.64l0.2,-0.48l-1.88,-2.37l2.65,-2.99l2.75,-0.13l0.12,-0.03l4.82,-2.48l6.56,-0.67l0.23,-0.14l0.76,-1.27l6.33,-0.46l1.97,1.11l0.28,0.01l5.55,-2.71l4.53,0.08l0.29,-0.21l0.67,-2.18l2.29,-2.15l5.75,-2.13l3.48,1.4l-2.7,1.03l-0.19,0.31l0.26,0.26l5.47,0.78ZM871.83,65.73l0.25,-0.15l1.99,0.01l3.3,1.2l-0.08,0.22l-2.41,1.03l-5.73,0.49l-0.31,-1.0l2.99,-1.8ZM797.64,48.44l-2.22,1.51l-3.85,-0.43l-4.35,-1.85l0.42,-1.13l4.42,0.72l5.59,1.17ZM783.82,46.06l-1.71,3.25l-9.05,-0.14l-4.11,1.15l-4.64,-3.04l1.21,-3.13l3.11,-0.91l6.53,0.22l8.66,2.59ZM780.37,145.71l2.28,5.23l-3.09,-0.89l-0.37,0.19l-1.54,4.65l0.04,0.27l2.38,3.17l-0.05,1.4l-1.41,-1.41l-0.46,0.04l-1.23,1.81l-0.33,-1.86l0.28,-3.1l-0.28,-3.41l0.58,-2.46l0.11,-4.39l-0.03,-0.13l-1.44,-3.2l0.21,-4.39l2.19,-1.49l0.09,-0.41l-0.81,-1.3l0.48,-0.21l0.56,1.94l0.86,3.23l-0.05,3.36l1.03,3.35ZM780.16,57.18l-3.4,0.03l-5.06,-0.53l1.97,-1.59l2.95,-0.42l3.35,1.75l0.18,0.77ZM683.84,31.18l-13.29,1.97l4.16,-6.56l1.88,-0.58l1.77,0.34l6.08,3.02l-0.6,1.8ZM670.94,28.02l-5.18,0.65l-6.89,-1.58l-4.03,-2.07l-1.88,-3.98l-0.18,-0.16l-2.8,-0.93l5.91,-3.62l5.25,-1.29l4.73,2.88l5.63,5.44l-0.57,4.66ZM564.37,68.98l-0.85,0.23l-7.93,-0.57l-0.6,-1.84l-0.21,-0.2l-4.34,-1.18l-0.3,-2.08l2.34,-0.92l0.19,-0.29l-0.08,-2.43l4.85,-4.0l-0.12,-0.52l-1.68,-0.43l5.47,-3.94l0.11,-0.33l-0.6,-2.02l5.36,-2.55l8.22,-3.27l8.29,-0.96l4.34,-1.94l4.67,-0.65l1.45,1.72l-1.43,1.37l-8.8,2.52l-7.65,2.42l-7.92,4.84l-3.73,4.75l-3.92,4.58l-0.07,0.23l0.51,3.88l0.11,0.2l4.32,3.39ZM548.86,18.57l-3.28,0.75l-2.25,0.44l-0.22,0.19l-0.3,0.81l-2.67,0.86l-2.27,-1.14l1.2,-1.51l-0.23,-0.49l-3.14,-0.1l2.48,-0.54l3.55,-0.07l0.44,1.36l0.49,0.12l1.4,-1.35l2.2,-0.9l3.13,1.08l-0.54,0.49ZM477.5,133.25l-4.21,0.05l-2.69,-0.34l0.39,-1.03l3.24,-1.06l2.51,0.58l0.85,0.43l-0.2,0.71l-0.0,0.15l0.12,0.52Z\\\", \\\"name\\\": \\\"Russia\\\"}, \\\"RW\\\": {\\\"path\\\": \\\"M497.03,288.12l0.78,1.11l-0.12,1.19l-0.49,0.21l-1.25,-0.15l-0.3,0.16l-0.67,1.24l-1.01,-0.13l0.16,-0.92l0.22,-0.12l0.15,-0.24l0.09,-1.37l0.49,-0.48l0.42,0.18l0.25,-0.01l1.26,-0.65Z\\\", \\\"name\\\": \\\"Rwanda\\\"}, \\\"RS\\\": {\\\"path\\\": \\\"M469.75,168.65l0.21,-0.21l0.36,-1.44l-0.08,-0.29l-1.06,-1.03l0.54,-1.16l-0.28,-0.43l-0.26,0.0l0.55,-0.67l-0.01,-0.39l-0.77,-0.86l-0.45,-0.89l1.56,-0.67l1.39,0.12l1.22,1.1l0.26,0.91l0.16,0.19l1.38,0.66l0.17,1.12l0.14,0.21l1.46,0.9l0.35,-0.03l0.62,-0.54l0.09,0.06l-0.28,0.25l-0.03,0.42l0.29,0.34l-0.44,0.5l-0.07,0.26l0.22,1.12l0.07,0.14l1.02,1.1l-0.81,0.84l-0.42,0.96l0.04,0.3l0.12,0.15l-0.15,0.16l-1.04,0.04l-0.39,0.08l0.33,-0.81l-0.29,-0.41l-0.21,0.01l-0.39,-0.45l-0.13,-0.09l-0.32,-0.11l-0.27,-0.4l-0.14,-0.11l-0.4,-0.16l-0.31,-0.37l-0.34,-0.09l-0.45,0.17l-0.18,0.18l-0.29,0.84l-0.96,-0.65l-0.81,-0.33l-0.32,-0.37l-0.22,-0.18Z\\\", \\\"name\\\": \\\"Republic of Serbia\\\"}, \\\"LT\\\": {\\\"path\\\": \\\"M478.13,133.31l-0.14,-0.63l0.25,-0.88l-0.15,-0.35l-1.17,-0.58l-2.43,-0.57l-0.45,-2.51l2.58,-0.97l4.14,0.22l2.3,-0.32l0.26,0.54l0.22,0.17l1.26,0.22l2.25,1.6l0.19,1.23l-1.87,1.01l-0.14,0.18l-0.54,1.83l-2.54,1.21l-2.18,-0.02l-0.52,-0.91l-0.18,-0.14l-1.11,-0.32Z\\\", \\\"name\\\": \\\"Lithuania\\\"}, \\\"LU\\\": {\\\"path\\\": \\\"M435.95,147.99l0.33,0.49l-0.11,1.07l-0.39,0.04l-0.29,-0.15l0.21,-1.4l0.25,-0.05Z\\\", \\\"name\\\": \\\"Luxembourg\\\"}, \\\"LR\\\": {\\\"path\\\": \\\"M401.37,273.67l-0.32,0.01l-2.48,-1.15l-2.24,-1.89l-2.14,-1.38l-1.47,-1.42l0.44,-0.59l0.05,-0.13l0.12,-0.65l1.07,-1.3l1.08,-1.09l0.52,-0.07l0.43,-0.18l0.84,1.24l-0.15,0.89l0.07,0.25l0.49,0.54l0.22,0.1l0.71,0.01l0.27,-0.16l0.42,-0.83l0.19,0.02l-0.06,0.52l0.23,1.12l-0.5,1.03l0.06,0.35l0.73,0.69l0.14,0.08l0.71,0.15l0.92,0.91l0.06,0.76l-0.17,0.22l-0.06,0.15l-0.17,1.8Z\\\", \\\"name\\\": \\\"Liberia\\\"}, \\\"RO\\\": {\\\"path\\\": \\\"M477.94,155.19l1.02,-0.64l1.49,0.33l1.52,0.01l1.09,0.73l0.32,0.01l0.81,-0.46l1.8,-0.3l0.18,-0.1l0.54,-0.64l0.86,0.0l0.64,0.26l0.71,0.87l0.8,1.35l1.39,1.81l0.07,1.25l-0.26,1.3l0.01,0.15l0.45,1.42l0.15,0.18l1.12,0.57l0.25,0.01l1.05,-0.45l0.86,0.4l0.03,0.43l-0.92,0.51l-0.63,-0.24l-0.4,0.22l-0.64,3.41l-1.12,-0.24l-1.78,-1.09l-0.23,-0.04l-2.95,0.71l-1.25,0.77l-3.55,-0.16l-1.89,-0.47l-0.14,-0.0l-0.75,0.17l-0.61,-1.07l-0.3,-0.36l0.36,-0.32l-0.04,-0.48l-0.62,-0.38l-0.36,0.03l-0.62,0.54l-1.15,-0.71l-0.18,-1.14l-0.17,-0.22l-1.4,-0.67l-0.24,-0.86l-0.09,-0.14l-0.96,-0.87l1.49,-0.44l0.16,-0.11l1.51,-2.14l1.15,-2.09l1.44,-0.63Z\\\", \\\"name\\\": \\\"Romania\\\"}, \\\"GW\\\": {\\\"path\\\": \\\"M383.03,256.73l-1.12,-0.88l-0.14,-0.06l-0.94,-0.15l-0.43,-0.54l0.01,-0.27l-0.13,-0.26l-0.68,-0.48l-0.05,-0.16l0.99,-0.31l0.77,0.08l0.15,-0.02l0.61,-0.26l4.25,0.1l-0.02,0.44l-0.19,0.18l-0.08,0.29l0.17,0.66l-0.17,0.14l-0.44,0.0l-0.16,0.05l-0.57,0.37l-0.66,-0.04l-0.24,0.1l-0.92,1.03Z\\\", \\\"name\\\": \\\"Guinea Bissau\\\"}, \\\"GT\\\": {\\\"path\\\": \\\"M195.13,249.89l-1.05,-0.35l-1.5,-0.04l-1.06,-0.47l-1.19,-0.93l0.04,-0.53l0.27,-0.55l-0.03,-0.31l-0.24,-0.32l1.02,-1.77l3.04,-0.01l0.3,-0.28l0.06,-0.88l-0.19,-0.3l-0.3,-0.11l-0.23,-0.45l-0.11,-0.12l-0.9,-0.58l-0.35,-0.33l0.37,-0.0l0.3,-0.3l0.0,-1.15l4.05,0.02l-0.02,1.74l-0.2,2.89l0.3,0.32l0.67,-0.0l0.75,0.42l0.4,-0.11l-0.62,0.53l-1.17,0.7l-0.13,0.16l-0.18,0.49l0.0,0.21l0.14,0.34l-0.35,0.44l-0.49,0.13l-0.2,0.41l0.03,0.06l-0.27,0.16l-0.86,0.64l-0.12,0.22ZM199.35,245.38l0.07,-0.13l0.05,0.02l-0.13,0.11Z\\\", \\\"name\\\": \\\"Guatemala\\\"}, \\\"GR\\\": {\\\"path\\\": \\\"M487.2,174.55l-0.64,1.54l-0.43,0.24l-1.41,-0.08l-1.28,-0.28l-0.14,0.0l-3.03,0.77l-0.13,0.51l1.39,1.34l-0.78,0.29l-1.2,0.0l-1.23,-1.42l-0.47,0.02l-0.47,0.65l-0.04,0.27l0.56,1.76l0.06,0.11l1.02,1.12l-0.66,0.45l-0.04,0.46l1.39,1.35l1.15,0.79l0.02,1.06l-1.91,-0.63l-0.36,0.42l0.56,1.12l-1.2,0.23l-0.22,0.4l0.8,2.14l-1.15,0.02l-1.89,-1.15l-0.89,-2.19l-0.43,-1.91l-0.05,-0.11l-0.98,-1.35l-1.24,-1.62l-0.13,-0.63l1.07,-1.32l0.06,-0.14l0.13,-0.81l0.68,-0.36l0.16,-0.25l0.03,-0.54l1.4,-0.23l0.12,-0.05l0.87,-0.6l1.26,0.05l0.25,-0.11l0.34,-0.43l0.33,-0.07l1.81,0.08l0.13,-0.02l1.87,-0.77l1.64,0.97l0.19,0.04l2.28,-0.28l0.26,-0.29l0.02,-0.95l0.56,0.36ZM480.44,192.0l1.05,0.74l0.01,0.0l-1.26,-0.23l0.2,-0.51ZM481.76,192.79l1.86,-0.15l1.53,0.17l-0.02,0.19l0.34,0.3l-2.28,0.15l0.01,-0.13l-0.25,-0.31l-1.19,-0.22ZM485.65,193.28l0.65,-0.16l-0.05,0.12l-0.6,0.04Z\\\", \\\"name\\\": \\\"Greece\\\"}, \\\"GQ\\\": {\\\"path\\\": \\\"M444.81,282.04l-0.21,-0.17l0.74,-2.4l3.56,0.05l0.02,2.42l-3.34,-0.02l-0.76,0.13Z\\\", \\\"name\\\": \\\"Equatorial Guinea\\\"}, \\\"GY\\\": {\\\"path\\\": \\\"M271.34,264.25l1.43,0.81l1.44,1.53l0.06,1.19l0.28,0.28l0.84,0.05l2.13,1.92l-0.34,1.93l-1.37,0.59l-0.17,0.34l0.12,0.51l-0.43,1.21l0.03,0.26l1.11,1.82l0.26,0.14l0.56,0.0l0.32,1.29l1.25,1.78l-0.08,0.01l-1.34,-0.21l-0.24,0.06l-0.78,0.64l-1.06,0.41l-0.76,0.1l-0.22,0.15l-0.18,0.32l-0.95,-0.1l-1.38,-1.05l-0.19,-1.13l-0.6,-1.18l0.37,-1.96l0.65,-0.83l0.03,-0.32l-0.57,-1.17l-0.15,-0.14l-0.62,-0.27l0.25,-0.85l-0.08,-0.3l-0.58,-0.58l-0.24,-0.09l-1.15,0.1l-1.41,-1.58l0.48,-0.49l0.09,-0.22l-0.04,-0.92l1.31,-0.34l0.73,-0.52l0.04,-0.44l-0.75,-0.82l0.16,-0.66l1.74,-1.3Z\\\", \\\"name\\\": \\\"Guyana\\\"}, \\\"GE\\\": {\\\"path\\\": \\\"M525.41,174.19l0.26,-0.88l-0.0,-0.17l-0.63,-2.06l-0.1,-0.15l-1.45,-1.12l-0.11,-0.05l-1.31,-0.33l-0.66,-0.69l1.97,0.48l3.65,0.49l3.3,1.41l0.39,0.5l0.33,0.1l1.43,-0.45l2.14,0.58l0.7,1.14l0.13,0.12l1.06,0.47l-0.18,0.11l-0.08,0.43l1.08,1.41l-0.06,0.06l-1.16,-0.15l-1.82,-0.84l-0.31,0.04l-0.55,0.44l-3.29,0.44l-2.32,-1.41l-0.17,-0.04l-2.25,0.12Z\\\", \\\"name\\\": \\\"Georgia\\\"}, \\\"GB\\\": {\\\"path\\\": \\\"M412.82,118.6l-2.31,3.4l-0.0,0.33l0.31,0.13l2.52,-0.49l2.34,0.02l-0.56,2.51l-2.22,3.13l0.22,0.47l2.43,0.21l2.35,4.35l0.17,0.14l1.58,0.51l1.49,3.78l0.73,1.37l0.2,0.15l2.76,0.59l-0.25,1.75l-1.18,0.91l-0.08,0.39l0.87,1.49l-1.96,1.51l-3.31,-0.02l-4.15,0.88l-1.07,-0.59l-0.35,0.04l-1.55,1.44l-2.17,-0.35l-0.22,0.05l-1.61,1.15l-0.78,-0.38l3.31,-3.12l2.18,-0.7l0.21,-0.31l-0.26,-0.27l-3.78,-0.54l-0.48,-0.9l2.3,-0.92l0.13,-0.46l-1.29,-1.71l0.39,-1.83l3.46,0.29l0.32,-0.24l0.37,-1.99l-0.06,-0.24l-1.71,-2.17l-0.18,-0.11l-2.91,-0.58l-0.43,-0.68l0.82,-1.4l-0.03,-0.35l-0.82,-0.97l-0.46,0.01l-0.85,1.05l-0.11,-2.6l-0.05,-0.16l-1.19,-1.7l0.86,-3.53l1.81,-2.75l1.88,0.26l2.38,-0.24ZM406.39,132.84l-1.09,1.92l-1.65,-0.62l-1.26,0.02l0.41,-1.46l0.0,-0.16l-0.42,-1.51l1.62,-0.11l2.39,1.92Z\\\", \\\"name\\\": \\\"United Kingdom\\\"}, \\\"GA\\\": {\\\"path\\\": \\\"M448.76,294.47l-2.38,-2.34l-1.63,-2.04l-1.46,-2.48l0.06,-0.66l0.54,-0.81l0.61,-1.82l0.46,-1.69l0.63,-0.11l3.62,0.03l0.3,-0.3l-0.02,-2.75l0.88,-0.12l1.47,0.32l0.13,0.0l1.39,-0.3l-0.13,0.87l0.03,0.19l0.7,1.29l0.3,0.16l1.74,-0.19l0.36,0.29l-1.01,2.7l0.05,0.29l1.13,1.42l0.25,1.82l-0.3,1.56l-0.64,0.99l-1.93,-0.09l-1.26,-1.13l-0.5,0.17l-0.16,0.91l-1.48,0.27l-0.12,0.05l-0.86,0.63l-0.08,0.39l0.81,1.42l-1.48,1.08Z\\\", \\\"name\\\": \\\"Gabon\\\"}, \\\"GN\\\": {\\\"path\\\": \\\"M399.83,265.31l-0.69,-0.06l-0.3,0.16l-0.43,0.85l-0.39,-0.01l-0.3,-0.33l0.14,-0.87l-0.05,-0.22l-1.05,-1.54l-0.37,-0.11l-0.61,0.27l-0.84,0.12l0.02,-0.54l-0.04,-0.17l-0.35,-0.57l0.07,-0.63l-0.03,-0.17l-0.57,-1.11l-0.7,-0.9l-0.24,-0.12l-2.0,-0.0l-0.19,0.07l-0.51,0.42l-0.6,0.05l-0.21,0.11l-0.43,0.55l-0.3,0.7l-1.04,0.86l-0.91,-1.24l-1.0,-1.02l-0.69,-0.37l-0.52,-0.42l-0.3,-1.11l-0.37,-0.56l-0.1,-0.1l-0.4,-0.23l0.77,-0.85l0.62,0.04l0.18,-0.05l0.58,-0.38l0.46,-0.0l0.19,-0.07l0.39,-0.34l0.1,-0.3l-0.17,-0.67l0.15,-0.14l0.09,-0.2l0.03,-0.57l0.87,0.02l1.76,0.6l0.13,0.01l0.55,-0.06l0.22,-0.13l0.08,-0.12l1.18,0.17l0.17,-0.02l0.09,0.56l0.3,0.25l0.4,-0.0l0.14,-0.03l0.56,-0.29l0.23,0.05l0.63,0.59l0.15,0.07l1.07,0.2l0.24,-0.06l0.65,-0.52l0.77,-0.32l0.55,-0.32l0.3,0.04l0.44,0.45l0.34,0.74l0.84,0.87l-0.35,0.45l-0.06,0.15l-0.1,0.82l0.42,0.31l0.35,-0.16l0.05,0.04l-0.1,0.59l0.09,0.27l0.42,0.4l-0.06,0.02l-0.18,0.21l-0.2,0.86l0.03,0.21l0.56,1.02l0.52,1.71l-0.65,0.21l-0.15,0.12l-0.24,0.35l-0.03,0.28l0.16,0.41l-0.1,0.76l-0.12,0.0Z\\\", \\\"name\\\": \\\"Guinea\\\"}, \\\"GM\\\": {\\\"path\\\": \\\"M379.18,251.48l0.15,-0.55l2.51,-0.07l0.21,-0.09l0.48,-0.52l0.58,-0.03l0.91,0.58l0.16,0.05l0.78,0.01l0.14,-0.03l0.59,-0.31l0.16,0.24l-0.71,0.38l-0.94,-0.04l-1.02,-0.51l-0.3,0.01l-0.86,0.55l-0.37,0.02l-0.14,0.04l-0.53,0.31l-1.81,-0.04Z\\\", \\\"name\\\": \\\"Gambia\\\"}, \\\"GL\\\": {\\\"path\\\": \\\"M304.13,6.6l8.19,-3.63l8.72,0.28l0.19,-0.06l3.12,-2.28l8.75,-0.61l19.94,0.8l14.93,4.75l-3.92,2.01l-9.52,0.27l-13.48,0.6l-0.27,0.2l0.09,0.33l1.26,1.09l0.22,0.07l8.81,-0.67l7.49,2.07l0.19,-0.01l4.68,-1.78l1.76,1.84l-2.59,3.26l-0.01,0.36l0.34,0.11l6.35,-2.2l12.09,-2.32l7.31,1.14l1.17,2.13l-9.9,4.05l-1.43,1.32l-7.91,0.98l-0.26,0.31l0.29,0.29l5.25,0.25l-2.63,3.72l-2.02,3.61l-0.04,0.15l0.08,6.05l0.07,0.19l2.61,3.0l-3.4,0.2l-4.12,1.66l-0.04,0.54l4.5,2.67l0.53,3.9l-2.39,0.42l-0.19,0.48l2.91,3.83l-5.0,0.32l-0.27,0.22l0.12,0.33l2.69,1.84l-0.65,1.35l-3.36,0.71l-3.46,0.01l-0.21,0.51l3.05,3.15l0.02,1.53l-4.54,-1.79l-0.32,0.06l-1.29,1.26l0.11,0.5l3.33,1.15l3.17,2.74l0.85,3.29l-4.0,0.78l-1.83,-1.66l-3.1,-2.64l-0.36,-0.02l-0.13,0.33l0.8,2.92l-2.76,2.26l-0.09,0.33l0.28,0.2l6.59,0.19l2.47,0.18l-5.86,3.38l-6.76,3.43l-7.26,1.48l-2.73,0.02l-0.16,0.05l-2.67,1.72l-3.44,4.42l-5.28,2.86l-1.73,0.18l-3.33,1.01l-3.59,0.96l-0.15,0.1l-2.15,2.52l-0.07,0.19l-0.03,2.76l-1.21,2.49l-4.03,3.1l-0.1,0.33l0.98,2.94l-2.31,6.57l-3.21,0.21l-3.6,-3.0l-0.19,-0.07l-4.9,-0.02l-2.29,-1.97l-1.69,-3.78l-4.31,-4.86l-1.23,-2.52l-0.34,-3.58l-0.08,-0.17l-3.35,-3.67l0.85,-2.92l-0.09,-0.31l-1.5,-1.34l2.33,-4.7l3.67,-1.57l0.15,-0.13l1.02,-1.93l0.52,-3.47l-0.44,-0.31l-2.85,1.57l-1.33,0.64l-2.12,0.59l-2.81,-1.32l-0.15,-2.79l0.88,-2.17l2.09,-0.06l5.07,1.2l0.34,-0.17l-0.11,-0.37l-4.3,-2.9l-2.24,-1.58l-0.25,-0.05l-2.38,0.62l-1.7,-0.93l2.62,-4.1l-0.03,-0.36l-1.51,-1.75l-1.97,-3.3l-3.01,-5.21l-0.1,-0.11l-3.04,-1.85l0.03,-1.94l-0.18,-0.28l-6.82,-3.01l-5.35,-0.38l-6.69,0.21l-6.03,0.37l-2.81,-1.59l-3.84,-2.9l5.94,-1.5l5.01,-0.28l0.28,-0.29l-0.26,-0.31l-10.68,-1.38l-5.38,-2.1l0.27,-1.68l9.3,-2.6l9.18,-2.68l0.19,-0.16l0.97,-2.05l-0.18,-0.42l-6.29,-1.91l1.81,-1.9l8.58,-4.05l3.6,-0.63l0.23,-0.4l-0.92,-2.37l5.59,-1.5l7.66,-0.95l7.58,-0.05l2.65,1.84l0.31,0.02l6.52,-3.29l5.85,2.24l3.55,0.49l5.17,1.95l0.38,-0.16l-0.13,-0.39l-5.77,-3.16l0.29,-2.26Z\\\", \\\"name\\\": \\\"Greenland\\\"}, \\\"KW\\\": {\\\"path\\\": \\\"M540.87,207.81l0.41,0.94l-0.18,0.51l0.0,0.21l0.65,1.66l-1.15,0.05l-0.54,-1.12l-0.24,-0.17l-1.73,-0.2l1.44,-2.06l1.33,0.18Z\\\", \\\"name\\\": \\\"Kuwait\\\"}, \\\"GH\\\": {\\\"path\\\": \\\"M423.16,269.88l-3.58,1.34l-1.41,0.87l-2.13,0.69l-1.91,-0.61l0.09,-0.75l-0.03,-0.17l-1.04,-2.07l0.62,-2.7l1.04,-2.08l0.03,-0.19l-1.0,-5.46l0.05,-1.12l4.04,-0.11l1.08,0.18l0.18,-0.03l0.72,-0.36l0.75,0.13l-0.11,0.48l0.06,0.26l0.98,1.22l-0.0,1.77l0.24,1.99l0.05,0.13l0.55,0.81l-0.52,2.14l0.19,1.37l0.69,1.66l0.38,0.62Z\\\", \\\"name\\\": \\\"Ghana\\\"}, \\\"OM\\\": {\\\"path\\\": \\\"M568.16,231.0l-0.08,0.1l-0.84,1.61l-0.93,-0.11l-0.27,0.11l-0.58,0.73l-0.4,1.32l-0.01,0.14l0.29,1.61l-0.07,0.09l-1.0,-0.01l-0.16,0.04l-1.56,0.97l-0.14,0.2l-0.23,1.17l-0.41,0.4l-1.44,-0.02l-0.17,0.05l-0.98,0.65l-0.13,0.25l0.01,0.87l-0.97,0.57l-1.27,-0.22l-0.19,0.03l-1.63,0.84l-0.88,0.11l-2.55,-5.57l7.2,-2.49l0.19,-0.19l1.67,-5.23l-0.03,-0.25l-1.1,-1.78l0.05,-0.89l0.68,-1.03l0.05,-0.16l0.01,-0.89l0.96,-0.44l0.07,-0.5l-0.32,-0.26l0.16,-1.31l0.85,-0.01l1.03,1.67l0.09,0.09l1.4,0.96l0.11,0.05l1.82,0.34l1.37,0.45l1.75,2.32l0.13,0.1l0.7,0.26l-0.0,0.3l-1.25,2.19l-1.01,0.8ZM561.88,218.47l-0.01,0.02l-0.15,-0.29l0.3,-0.38l-0.14,0.65Z\\\", \\\"name\\\": \\\"Oman\\\"}, \\\"_3\\\": {\\\"path\\\": \\\"M543.2,261.06l-1.07,1.46l-1.65,1.99l-1.91,0.01l-8.08,-2.95l-0.89,-0.84l-0.9,-1.19l-0.81,-1.23l0.44,-0.73l0.76,-1.12l0.49,0.28l0.52,1.05l1.13,1.06l0.2,0.08l1.24,0.01l2.42,-0.65l2.77,-0.31l2.17,-0.78l1.31,-0.19l0.84,-0.43l1.03,-0.06l-0.01,4.54Z\\\", \\\"name\\\": \\\"Somaliland\\\"}, \\\"_2\\\": {\\\"path\\\": \\\"M384.23,230.37l0.07,-0.06l0.28,-0.89l0.99,-1.13l0.07,-0.13l0.8,-3.54l3.4,-2.8l0.09,-0.13l0.76,-2.17l0.07,5.5l-2.07,0.21l-0.24,0.17l-0.61,1.36l-0.02,0.16l0.43,3.46l-4.01,-0.01ZM391.82,218.2l0.07,-0.06l0.75,-1.93l1.86,-0.25l0.94,0.34l1.14,0.0l0.18,-0.06l0.73,-0.56l1.41,-0.08l-0.0,2.72l-7.08,-0.12Z\\\", \\\"name\\\": \\\"Western Sahara\\\"}, \\\"_1\\\": {\\\"path\\\": \\\"M472.71,172.84l-0.07,-0.43l-0.16,-0.22l-0.53,-0.27l-0.38,-0.58l0.3,-0.43l0.51,-0.19l0.18,-0.18l0.3,-0.87l0.12,-0.04l0.22,0.26l0.12,0.09l0.38,0.15l0.28,0.41l0.15,0.12l0.34,0.12l0.43,0.5l0.15,0.07l-0.12,0.3l-0.27,0.32l-0.03,0.18l-0.31,0.06l-1.48,0.47l-0.15,0.17Z\\\", \\\"name\\\": \\\"Kosovo\\\"}, \\\"_0\\\": {\\\"path\\\": \\\"M503.54,192.92l0.09,-0.17l0.41,0.01l-0.08,0.01l-0.42,0.15ZM504.23,192.76l1.02,0.02l0.4,-0.13l-0.09,0.29l0.03,0.08l-0.35,0.16l-0.24,-0.04l-0.06,-0.1l-0.18,-0.17l-0.19,-0.08l-0.33,-0.02Z\\\", \\\"name\\\": \\\"Northern Cyprus\\\"}, \\\"JO\\\": {\\\"path\\\": \\\"M510.26,200.93l0.28,-0.57l2.53,1.0l0.27,-0.02l4.57,-2.77l0.84,2.84l-0.28,0.25l-4.95,1.37l-0.14,0.49l2.24,2.48l-0.5,0.28l-0.13,0.14l-0.35,0.78l-1.76,0.35l-0.2,0.14l-0.57,0.94l-0.94,0.73l-2.45,-0.38l-0.03,-0.12l1.23,-4.32l-0.04,-1.1l0.34,-0.75l0.03,-0.12l0.0,-1.63Z\\\", \\\"name\\\": \\\"Jordan\\\"}, \\\"HR\\\": {\\\"path\\\": \\\"M455.49,162.73l1.53,0.09l0.24,-0.1l0.29,-0.34l0.64,0.38l0.14,0.04l0.98,0.06l0.32,-0.3l-0.01,-0.66l0.67,-0.25l0.19,-0.22l0.21,-1.11l1.72,-0.72l0.65,0.32l1.94,1.37l2.07,0.6l0.22,-0.02l0.67,-0.33l0.47,0.94l0.67,0.76l-0.63,0.77l-0.91,-0.55l-0.16,-0.04l-1.69,0.04l-2.2,-0.51l-1.17,0.07l-0.21,0.11l-0.36,0.42l-0.67,-0.53l-0.46,0.12l-0.52,1.29l0.05,0.31l1.21,1.42l0.58,0.99l1.15,1.14l0.95,0.68l0.92,1.23l0.1,0.09l1.75,0.91l-1.87,-0.89l-1.5,-1.11l-2.23,-0.88l-1.77,-1.9l0.12,-0.06l0.1,-0.47l-1.07,-1.22l-0.04,-0.94l-0.21,-0.27l-1.61,-0.49l-0.35,0.14l-0.53,0.93l-0.41,-0.57l0.04,-0.73Z\\\", \\\"name\\\": \\\"Croatia\\\"}, \\\"HT\\\": {\\\"path\\\": \\\"M237.82,234.68l1.35,0.1l1.95,0.37l0.18,1.15l-0.16,0.83l-0.51,0.37l-0.06,0.44l0.57,0.68l-0.02,0.22l-1.31,-0.35l-1.26,0.17l-1.49,-0.18l-0.15,0.02l-1.03,0.43l-1.02,-0.61l0.09,-0.36l2.04,0.32l1.9,0.21l0.19,-0.05l0.9,-0.58l0.05,-0.47l-1.05,-1.03l0.02,-0.86l-0.23,-0.3l-1.13,-0.29l0.18,-0.23Z\\\", \\\"name\\\": \\\"Haiti\\\"}, \\\"HU\\\": {\\\"path\\\": \\\"M461.96,157.92l0.68,-1.66l-0.03,-0.29l-0.15,-0.22l0.84,-0.0l0.3,-0.26l0.12,-0.84l0.88,0.57l0.98,0.38l0.16,0.01l2.1,-0.39l0.23,-0.21l0.14,-0.45l0.88,-0.1l1.06,-0.43l0.13,0.1l0.28,0.04l1.18,-0.4l0.14,-0.1l0.52,-0.67l0.63,-0.15l2.6,0.95l0.26,-0.03l0.38,-0.23l1.12,0.7l0.1,0.49l-1.31,0.57l-0.14,0.13l-1.18,2.14l-1.44,2.04l-1.85,0.55l-1.51,-0.13l-0.14,0.02l-1.92,0.82l-0.85,0.42l-1.91,-0.55l-1.83,-1.31l-0.74,-0.37l-0.44,-0.97l-0.26,-0.18Z\\\", \\\"name\\\": \\\"Hungary\\\"}, \\\"HN\\\": {\\\"path\\\": \\\"M202.48,251.87l-0.33,-0.62l-0.18,-0.14l-0.5,-0.15l0.13,-0.76l-0.11,-0.28l-0.34,-0.28l-0.6,-0.23l-0.18,-0.01l-0.81,0.22l-0.16,-0.24l-0.72,-0.39l-0.51,-0.48l-0.12,-0.07l-0.31,-0.09l0.24,-0.3l0.04,-0.3l-0.16,-0.4l0.1,-0.28l1.14,-0.69l1.0,-0.86l0.09,0.04l0.3,-0.05l0.47,-0.39l0.49,-0.03l0.14,0.13l0.29,0.06l0.31,-0.1l1.16,0.22l1.24,-0.08l0.81,-0.28l0.29,-0.25l0.63,0.1l0.69,0.18l0.65,-0.06l0.49,-0.2l1.04,0.32l0.38,0.06l0.7,0.44l0.71,0.56l0.92,0.41l0.1,0.11l-0.11,-0.01l-0.23,0.09l-0.3,0.3l-0.76,0.29l-0.58,0.0l-0.15,0.04l-0.45,0.26l-0.31,-0.07l-0.37,-0.34l-0.28,-0.07l-0.26,0.07l-0.18,0.15l-0.23,0.43l-0.04,-0.0l-0.33,0.28l-0.03,0.4l-0.76,0.61l-0.45,0.3l-0.15,0.16l-0.51,-0.36l-0.41,0.06l-0.45,0.56l-0.41,-0.01l-0.59,0.06l-0.27,0.31l0.04,0.96l-0.07,0.0l-0.25,0.16l-0.24,0.45l-0.42,0.06Z\\\", \\\"name\\\": \\\"Honduras\\\"}, \\\"PR\\\": {\\\"path\\\": \\\"M254.95,238.31l1.15,0.21l0.2,0.23l-0.36,0.36l-1.76,-0.01l-1.2,0.07l-0.09,-0.69l0.17,-0.18l1.89,0.01Z\\\", \\\"name\\\": \\\"Puerto Rico\\\"}, \\\"PS\\\": {\\\"path\\\": \\\"M509.66,201.06l-0.0,1.44l-0.29,0.63l-0.59,0.19l0.02,-0.11l0.52,-0.31l-0.02,-0.53l-0.41,-0.2l0.36,-1.28l0.41,0.17Z\\\", \\\"name\\\": \\\"West Bank\\\"}, \\\"PT\\\": {\\\"path\\\": \\\"M398.65,173.6l0.75,-0.63l0.7,-0.3l0.51,1.2l0.28,0.18l1.48,-0.0l0.2,-0.08l0.33,-0.3l1.16,0.08l0.52,1.11l-0.95,0.66l-0.13,0.24l-0.03,2.2l-0.33,0.35l-0.08,0.18l-0.08,1.17l-0.86,0.19l-0.2,0.44l0.93,1.64l-0.64,1.79l0.07,0.31l0.72,0.72l-0.24,0.56l-0.9,1.05l-0.07,0.26l0.17,0.77l-0.73,0.54l-1.18,-0.36l-0.16,-0.0l-0.85,0.21l0.31,-1.81l-0.23,-1.87l-0.23,-0.25l-0.99,-0.24l-0.49,-0.91l0.18,-1.72l0.93,-0.99l0.08,-0.16l0.17,-1.17l0.52,-1.76l-0.04,-1.36l-0.51,-1.14l-0.09,-0.8Z\\\", \\\"name\\\": \\\"Portugal\\\"}, \\\"PY\\\": {\\\"path\\\": \\\"M264.33,341.43l0.93,-2.96l0.07,-1.42l1.1,-2.1l4.19,-0.73l2.22,0.04l2.12,1.21l0.07,0.76l0.7,1.38l-0.16,3.48l0.24,0.31l2.64,0.5l0.19,-0.03l0.9,-0.45l1.47,0.62l0.38,0.64l0.23,2.35l0.3,1.07l0.25,0.21l0.93,0.12l0.16,-0.02l0.8,-0.37l0.61,0.33l-0.0,1.25l-0.33,1.53l-0.5,1.57l-0.39,2.26l-2.14,1.94l-1.85,0.4l-2.74,-0.4l-2.13,-0.62l2.26,-3.75l0.03,-0.24l-0.36,-1.18l-0.17,-0.19l-2.55,-1.03l-3.04,-1.95l-2.07,-0.43l-4.4,-4.12Z\\\", \\\"name\\\": \\\"Paraguay\\\"}, \\\"PA\\\": {\\\"path\\\": \\\"M213.65,263.79l0.18,-0.43l0.02,-0.18l-0.06,-0.28l0.23,-0.18l-0.01,-0.48l-0.4,-0.29l-0.01,-0.62l0.57,-0.13l0.68,0.69l-0.04,0.39l0.26,0.33l1.0,0.11l0.27,-0.1l0.49,0.44l0.24,0.07l1.34,-0.22l1.04,-0.62l1.49,-0.5l0.86,-0.73l0.99,0.11l0.18,0.28l1.35,0.08l1.02,0.4l0.78,0.72l0.71,0.53l-0.1,0.12l-0.05,0.3l0.53,1.34l-0.28,0.44l-0.6,-0.13l-0.36,0.22l-0.2,0.76l-0.41,-0.36l-0.44,-1.12l0.49,-0.53l-0.14,-0.49l-0.51,-0.14l-0.41,-0.72l-0.11,-0.11l-1.25,-0.7l-0.19,-0.04l-1.1,0.16l-0.22,0.15l-0.47,0.81l-0.9,0.56l-0.49,0.08l-0.22,0.17l-0.25,0.52l0.05,0.32l0.93,1.07l-0.41,0.21l-0.29,0.3l-0.81,0.09l-0.36,-1.26l-0.53,-0.1l-0.21,0.28l-0.5,-0.09l-0.44,-0.88l-0.22,-0.16l-0.99,-0.16l-0.61,-0.28l-0.13,-0.03l-1.0,0.0Z\\\", \\\"name\\\": \\\"Panama\\\"}, \\\"PG\\\": {\\\"path\\\": \\\"M808.4,298.6l0.62,0.46l1.19,1.56l1.04,0.77l-0.18,0.37l-0.42,0.15l-0.92,-0.82l-1.05,-1.53l-0.27,-0.96ZM804.09,296.06l-0.3,0.26l-0.36,-1.11l-0.66,-1.06l-2.55,-1.89l-1.42,-0.59l0.17,-0.15l1.16,0.6l0.85,0.55l1.01,0.58l0.97,1.02l0.9,0.76l0.24,1.03ZM796.71,297.99l0.15,0.82l0.34,0.24l1.43,-0.19l0.19,-0.11l0.68,-0.82l1.36,-0.87l0.13,-0.31l-0.21,-1.13l1.04,-0.03l0.3,0.25l-0.04,1.17l-0.74,1.34l-1.17,0.18l-0.22,0.15l-0.35,0.62l-2.51,1.13l-1.21,-0.0l-1.99,-0.71l-1.19,-0.58l0.07,-0.28l1.98,0.32l1.46,-0.2l0.24,-0.21l0.25,-0.79ZM789.24,303.52l0.11,0.15l2.19,1.62l1.6,2.62l0.27,0.14l1.09,-0.06l-0.07,0.77l0.23,0.32l1.23,0.27l-0.14,0.09l0.05,0.53l2.39,0.95l-0.11,0.28l-1.33,0.14l-0.51,-0.55l-0.18,-0.09l-4.59,-0.65l-1.87,-1.55l-1.38,-1.35l-1.28,-2.17l-0.16,-0.13l-3.27,-1.1l-0.19,0.0l-2.12,0.72l-1.58,0.85l-0.15,0.31l0.28,1.63l-1.65,0.73l-1.37,-0.4l-2.3,-0.09l-0.08,-15.65l3.95,1.57l4.58,1.42l1.67,1.25l1.32,1.19l0.36,1.39l0.19,0.21l4.06,1.51l0.39,0.85l-1.9,0.22l-0.25,0.39l0.55,1.68Z\\\", \\\"name\\\": \\\"Papua New Guinea\\\"}, \\\"PE\\\": {\\\"path\\\": \\\"M246.44,329.21l-0.63,1.25l-1.05,0.54l-2.25,-1.33l-0.19,-0.93l-0.16,-0.21l-4.95,-2.58l-4.46,-2.79l-1.87,-1.52l-0.94,-1.91l0.33,-0.6l-0.01,-0.31l-2.11,-3.33l-2.46,-4.66l-2.36,-5.02l-1.04,-1.18l-0.77,-1.81l-0.08,-0.11l-1.95,-1.64l-1.54,-0.88l0.61,-0.85l0.02,-0.31l-1.15,-2.27l0.69,-1.56l1.59,-1.26l0.12,0.42l-0.56,0.47l-0.11,0.25l0.07,0.92l0.36,0.27l0.97,-0.19l0.85,0.23l0.99,1.19l0.41,0.05l1.42,-1.03l0.11,-0.16l0.46,-1.64l1.45,-2.06l2.92,-0.96l0.11,-0.07l2.73,-2.62l0.84,-1.72l0.02,-0.18l-0.3,-1.65l0.28,-0.1l1.49,1.06l0.77,1.14l0.1,0.09l1.08,0.6l1.43,2.55l0.21,0.15l1.86,0.31l0.18,-0.03l1.25,-0.6l0.77,0.37l0.17,0.03l1.4,-0.2l1.57,0.96l-1.45,2.29l0.23,0.46l0.63,0.05l0.66,0.7l-1.51,-0.08l-0.24,0.1l-0.27,0.31l-1.96,0.46l-2.95,1.74l-0.14,0.21l-0.17,1.1l-0.6,0.82l-0.05,0.23l0.21,1.13l-1.31,0.63l-0.17,0.27l0.0,0.91l-0.53,0.37l-0.1,0.37l1.04,2.27l1.31,1.46l-0.44,0.9l0.24,0.43l1.52,0.13l0.87,1.23l0.24,0.13l2.21,0.07l0.18,-0.06l1.55,-1.13l-0.14,3.22l0.23,0.3l1.14,0.29l0.16,-0.0l1.18,-0.36l1.97,3.71l-0.45,0.71l-0.04,0.14l-0.12,1.8l-0.05,2.07l-0.92,1.2l-0.03,0.31l0.38,0.8l-0.48,0.72l-0.02,0.3l1.01,2.02l-1.5,2.64Z\\\", \\\"name\\\": \\\"Peru\\\"}, \\\"PK\\\": {\\\"path\\\": \\\"M609.08,187.76l1.66,1.21l0.71,2.11l0.2,0.19l3.62,1.01l-1.98,1.95l-2.65,0.4l-3.75,-0.68l-0.26,0.08l-1.23,1.22l-0.07,0.31l0.89,2.46l0.88,1.92l0.1,0.12l1.67,1.14l-1.8,1.35l-0.12,0.25l0.04,1.85l-2.35,2.67l-1.59,2.79l-2.5,2.72l-2.76,-0.2l-0.24,0.09l-2.76,2.83l0.04,0.45l1.54,1.13l0.27,1.94l0.09,0.17l1.34,1.29l0.4,1.83l-5.14,-0.01l-0.22,0.09l-1.53,1.63l-1.52,-0.56l-0.76,-1.88l-1.93,-2.03l-0.25,-0.09l-4.6,0.5l-4.05,0.05l-3.1,0.33l0.77,-2.53l3.48,-1.33l0.19,-0.33l-0.21,-1.24l-0.19,-0.23l-1.01,-0.37l-0.06,-2.18l-0.17,-0.26l-2.32,-1.16l-0.96,-1.57l-0.56,-0.65l3.16,1.05l0.14,0.01l2.45,-0.4l1.44,0.33l0.3,-0.1l0.4,-0.47l1.58,0.22l0.14,-0.01l3.25,-1.14l0.2,-0.27l0.08,-2.23l1.23,-1.38l1.73,0.0l0.28,-0.2l0.22,-0.61l1.68,-0.32l0.86,0.24l0.27,-0.05l0.98,-0.78l0.11,-0.26l-0.13,-1.57l0.96,-1.52l1.51,-0.67l0.14,-0.41l-0.74,-1.4l1.86,0.07l0.26,-0.13l0.69,-1.01l0.05,-0.2l-0.09,-0.94l1.14,-1.09l0.09,-0.28l-0.29,-1.41l-0.51,-1.07l1.23,-1.05l2.6,-0.58l2.86,-0.33l1.33,-0.54l1.3,-0.29Z\\\", \\\"name\\\": \\\"Pakistan\\\"}, \\\"PH\\\": {\\\"path\\\": \\\"M737.11,263.82l0.25,1.66l0.14,1.34l-0.54,1.46l-0.64,-1.79l-0.5,-0.1l-1.17,1.28l-0.05,0.32l0.74,1.71l-0.49,0.81l-2.6,-1.28l-0.61,-1.57l0.68,-1.07l-0.07,-0.4l-1.59,-1.19l-0.42,0.06l-0.69,0.91l-1.01,-0.08l-0.21,0.06l-1.58,1.2l-0.17,-0.3l0.87,-1.88l1.48,-0.66l1.18,-0.81l0.71,0.92l0.34,0.1l1.9,-0.69l0.18,-0.18l0.34,-0.94l1.57,-0.06l0.29,-0.32l-0.1,-1.38l1.41,0.83l0.36,2.06ZM734.94,254.42l0.56,2.24l-1.41,-0.49l-0.4,0.3l0.07,0.94l0.51,1.3l-0.54,0.26l-0.08,-1.34l-0.25,-0.28l-0.56,-0.1l-0.23,-0.91l1.03,0.14l0.34,-0.31l-0.03,-0.96l-0.06,-0.18l-1.14,-1.44l1.62,0.04l0.57,0.78ZM724.68,238.33l1.48,0.71l0.33,-0.04l0.44,-0.38l0.05,0.13l-0.37,0.97l0.01,0.23l0.81,1.75l-0.59,1.92l-1.37,0.79l-0.14,0.2l-0.39,2.07l0.01,0.14l0.56,2.04l0.23,0.21l1.33,0.28l0.14,-0.0l1.0,-0.27l2.82,1.28l-0.2,1.16l0.12,0.29l0.66,0.5l-0.13,0.56l-1.54,-0.99l-0.89,-1.29l-0.49,0.0l-0.44,0.65l-1.34,-1.28l-0.26,-0.08l-2.18,0.36l-0.96,-0.44l0.09,-0.72l0.69,-0.57l-0.01,-0.47l-0.75,-0.59l-0.47,0.14l-0.15,0.43l-0.86,-1.02l-0.34,-1.02l-0.07,-1.74l0.49,0.41l0.49,-0.21l0.26,-3.99l0.73,-2.1l1.23,0.0ZM731.12,258.92l-0.82,0.75l-0.83,1.64l-0.52,0.5l-1.17,-1.33l0.36,-0.47l0.62,-0.7l0.07,-0.15l0.24,-1.35l0.73,-0.08l-0.31,1.29l0.16,0.34l0.37,-0.09l1.21,-1.6l-0.12,1.24ZM726.66,255.58l0.85,0.45l0.14,0.03l1.28,-0.0l-0.03,0.62l-1.04,0.96l-1.15,0.55l-0.05,-0.71l0.17,-1.26l-0.01,-0.13l-0.16,-0.51ZM724.92,252.06l-0.45,1.5l-0.7,-0.83l-0.95,-1.43l1.44,0.06l0.67,0.7ZM717.48,261.28l-1.87,1.35l0.21,-0.3l1.81,-1.57l1.5,-1.75l0.97,-1.84l0.23,1.08l-1.56,1.33l-1.29,1.7Z\\\", \\\"name\\\": \\\"Philippines\\\"}, \\\"PL\\\": {\\\"path\\\": \\\"M458.8,144.25l-0.96,-1.98l0.18,-1.06l-0.01,-0.15l-0.62,-1.8l-0.82,-1.11l0.56,-0.73l0.05,-0.28l-0.51,-1.51l1.48,-0.87l3.88,-1.58l3.06,-1.14l2.23,0.52l0.15,0.66l0.29,0.23l2.4,0.04l3.11,0.39l4.56,-0.05l1.12,0.32l0.51,0.89l0.1,1.45l0.03,0.12l0.66,1.23l-0.01,1.08l-1.33,0.61l-0.14,0.41l0.74,1.5l0.07,1.53l1.22,2.79l-0.19,0.66l-1.09,0.33l-0.14,0.09l-2.27,2.72l-0.04,0.31l0.35,0.8l-2.22,-1.16l-0.21,-0.02l-1.72,0.44l-1.1,-0.31l-0.21,0.02l-1.3,0.61l-1.11,-1.02l-0.32,-0.05l-0.81,0.35l-1.15,-1.61l-0.21,-0.12l-1.65,-0.17l-0.19,-0.82l-0.23,-0.23l-1.72,-0.37l-0.34,0.17l-0.25,0.56l-0.88,-0.44l0.12,-0.69l-0.25,-0.35l-1.78,-0.27l-1.08,-0.97Z\\\", \\\"name\\\": \\\"Poland\\\"}, \\\"ZM\\\": {\\\"path\\\": \\\"M502.81,308.32l1.09,1.04l0.58,1.94l-0.39,0.66l-0.5,2.05l-0.0,0.14l0.45,1.95l-0.69,0.77l-0.06,0.11l-0.76,2.37l0.15,0.36l0.62,0.31l-6.85,1.9l-0.22,0.33l0.2,1.54l-1.62,0.3l-0.12,0.05l-1.43,1.02l-0.11,0.15l-0.25,0.73l-0.73,0.17l-0.14,0.08l-2.18,2.12l-1.33,1.6l-0.65,0.05l-0.83,-0.29l-2.75,-0.28l-0.24,-0.1l-0.15,-0.27l-0.99,-0.58l-0.12,-0.04l-1.73,-0.14l-1.88,0.54l-1.5,-1.48l-1.61,-2.01l0.11,-7.73l4.92,0.03l0.29,-0.37l-0.19,-0.79l0.34,-0.86l0.0,-0.21l-0.41,-1.11l0.26,-1.14l-0.01,-0.16l-0.12,-0.36l0.18,0.01l0.1,0.56l0.31,0.25l1.14,-0.06l1.44,0.21l0.76,1.05l0.19,0.12l2.01,0.35l0.19,-0.03l1.24,-0.65l0.44,1.03l0.22,0.18l1.81,0.34l0.85,0.99l1.02,1.39l0.24,0.12l1.92,0.02l0.3,-0.32l-0.21,-2.74l-0.47,-0.23l-0.53,0.36l-1.58,-0.89l-0.51,-0.34l0.29,-2.36l0.44,-2.99l-0.03,-0.18l-0.5,-0.99l0.61,-1.38l0.53,-0.24l3.26,-0.41l0.89,0.23l1.01,0.62l1.04,0.44l1.6,0.43l1.35,0.72Z\\\", \\\"name\\\": \\\"Zambia\\\"}, \\\"EE\\\": {\\\"path\\\": \\\"M482.19,120.88l0.23,-1.68l-0.43,-0.31l-0.75,0.37l-1.34,-1.1l-0.18,-1.75l2.92,-0.95l3.07,-0.53l2.66,0.6l2.48,-0.1l0.18,0.31l-1.65,1.96l-0.06,0.26l0.71,3.25l-0.88,0.94l-1.85,-0.01l-2.08,-1.3l-1.14,-0.47l-0.2,-0.01l-1.69,0.51Z\\\", \\\"name\\\": \\\"Estonia\\\"}, \\\"EG\\\": {\\\"path\\\": \\\"M508.07,208.8l-0.66,1.06l-0.53,2.03l-0.64,1.32l-0.32,0.26l-1.74,-1.85l-1.77,-3.86l-0.48,-0.09l-0.26,0.25l-0.07,0.32l1.04,2.88l1.55,2.76l1.89,4.18l0.94,1.48l0.83,1.54l2.08,2.73l-0.3,0.28l-0.1,0.23l0.08,1.72l0.11,0.22l2.91,2.37l-28.78,0.0l0.0,-19.06l-0.73,-2.2l0.61,-1.59l0.0,-0.2l-0.34,-1.04l0.73,-1.08l3.13,-0.04l2.36,0.72l2.48,0.81l1.15,0.43l0.23,-0.01l1.93,-0.87l1.02,-0.78l2.08,-0.21l1.59,0.31l0.62,1.24l0.52,0.03l0.46,-0.71l1.86,0.59l1.95,0.16l0.17,-0.04l0.92,-0.52l1.48,4.24Z\\\", \\\"name\\\": \\\"Egypt\\\"}, \\\"ZA\\\": {\\\"path\\\": \\\"M467.06,373.27l-0.13,-0.29l0.01,-1.58l-0.02,-0.12l-0.71,-1.64l0.59,-0.37l0.14,-0.26l-0.07,-2.13l-0.05,-0.15l-1.63,-2.58l-1.25,-2.31l-1.71,-3.37l0.88,-0.98l0.7,0.52l0.39,1.08l0.23,0.19l1.1,0.19l1.55,0.51l0.14,0.01l1.35,-0.2l0.11,-0.04l2.24,-1.39l0.14,-0.25l0.0,-9.4l0.16,0.09l1.39,2.38l-0.22,1.53l0.04,0.19l0.56,0.94l0.3,0.14l1.79,-0.27l0.16,-0.08l1.23,-1.18l1.17,-0.79l0.1,-0.12l0.57,-1.19l1.02,-0.52l0.9,0.28l1.16,0.73l0.14,0.05l2.04,0.13l0.13,-0.02l1.6,-0.62l0.18,-0.19l0.63,-1.93l1.18,-0.19l0.19,-0.12l0.78,-1.05l0.81,-1.71l2.18,-1.91l3.44,-1.88l0.89,0.02l1.17,0.43l0.21,-0.0l0.76,-0.29l1.07,0.21l1.15,3.55l0.63,1.82l-0.44,2.9l0.1,0.52l-0.74,-0.29l-0.18,-0.01l-0.72,0.19l-0.21,0.2l-0.22,0.74l-0.66,0.97l-0.05,0.18l0.02,0.93l0.09,0.21l1.49,1.46l0.27,0.08l1.47,-0.29l0.22,-0.18l0.43,-1.01l1.29,0.02l-0.51,1.63l-0.29,2.2l-0.59,1.12l-2.2,1.78l-1.06,1.39l-0.72,1.44l-1.39,1.93l-2.81,2.84l-1.75,1.65l-1.85,1.24l-2.55,1.06l-1.23,0.14l-0.24,0.18l-0.22,0.54l-1.27,-0.35l-0.2,0.01l-1.15,0.5l-2.62,-0.52l-0.12,0.0l-1.46,0.33l-0.98,-0.14l-0.16,0.02l-2.55,1.1l-2.11,0.44l-1.59,1.07l-0.93,0.06l-0.97,-0.92l-0.19,-0.08l-0.72,-0.04l-1.0,-1.16l-0.25,0.05ZM493.72,359.24l-1.12,-0.86l-0.31,-0.03l-1.23,0.59l-1.36,1.07l-1.39,1.78l0.01,0.38l1.88,2.11l0.31,0.09l0.9,-0.27l0.18,-0.15l0.4,-0.77l1.28,-0.39l0.18,-0.16l0.42,-0.88l0.76,-1.32l-0.05,-0.37l-0.87,-0.82Z\\\", \\\"name\\\": \\\"South Africa\\\"}, \\\"EC\\\": {\\\"path\\\": \\\"M220.2,293.48l1.25,-1.76l0.02,-0.31l-0.54,-1.09l-0.5,-0.06l-0.78,0.94l-1.03,-0.75l0.33,-0.46l0.05,-0.23l-0.38,-2.04l0.66,-0.28l0.17,-0.19l0.45,-1.52l0.93,-1.58l0.04,-0.2l-0.13,-0.78l1.19,-0.47l1.57,-0.91l2.35,1.34l0.17,0.04l0.28,-0.02l0.52,0.91l0.21,0.15l2.12,0.35l0.2,-0.03l0.55,-0.31l1.08,0.73l0.97,0.54l0.31,1.67l-0.71,1.49l-2.64,2.54l-2.95,0.97l-0.15,0.11l-1.53,2.18l-0.49,1.68l-1.1,0.8l-0.87,-1.05l-0.15,-0.1l-1.01,-0.27l-0.13,-0.0l-0.7,0.14l-0.03,-0.43l0.6,-0.5l0.1,-0.31l-0.26,-0.91Z\\\", \\\"name\\\": \\\"Ecuador\\\"}, \\\"AL\\\": {\\\"path\\\": \\\"M470.27,171.7l0.38,0.19l0.45,-0.18l0.4,0.61l0.11,0.1l0.46,0.24l0.13,0.87l-0.3,0.95l-0.0,0.17l0.36,1.28l0.12,0.17l0.9,0.63l-0.03,0.44l-0.67,0.35l-0.16,0.22l-0.14,0.88l-0.96,1.18l-0.06,-0.03l-0.04,-0.48l-0.12,-0.22l-1.28,-0.92l-0.19,-1.25l0.2,-1.96l0.33,-0.89l-0.06,-0.3l-0.36,-0.41l-0.13,-0.75l0.66,-0.9Z\\\", \\\"name\\\": \\\"Albania\\\"}, \\\"AO\\\": {\\\"path\\\": \\\"M461.62,299.93l0.55,1.67l0.73,1.54l1.56,2.18l0.28,0.12l1.66,-0.2l0.81,-0.34l1.28,0.33l0.33,-0.14l0.39,-0.67l0.56,-1.3l1.37,-0.09l0.27,-0.21l0.07,-0.23l0.67,-0.01l-0.13,0.53l0.29,0.37l2.74,-0.02l0.04,1.29l0.03,0.13l0.46,0.87l-0.35,1.52l0.18,1.55l0.07,0.16l0.75,0.85l-0.13,2.89l0.41,0.29l0.56,-0.21l1.11,0.05l1.5,-0.37l0.9,0.12l0.18,0.53l-0.27,1.15l0.01,0.17l0.4,1.08l-0.33,0.85l-0.01,0.18l0.12,0.51l-4.83,-0.03l-0.3,0.3l-0.12,8.13l0.07,0.19l1.69,2.1l1.27,1.25l-4.03,0.92l-5.93,-0.36l-1.66,-1.19l-0.18,-0.06l-10.15,0.11l-0.34,0.13l-1.35,-1.05l-0.17,-0.06l-1.62,-0.08l-1.6,0.45l-0.88,0.36l-0.17,-1.2l0.34,-2.19l0.85,-2.32l0.14,-1.13l0.79,-2.24l0.57,-1.0l1.42,-1.64l0.82,-1.15l0.05,-0.13l0.26,-1.88l-0.13,-1.51l-0.07,-0.16l-0.72,-0.87l-1.23,-2.91l0.09,-0.37l0.73,-0.95l0.05,-0.27l-1.27,-4.12l-1.19,-1.54l0.1,-0.2l0.86,-0.28l0.78,0.03l0.83,-0.29l7.12,0.03ZM451.81,298.94l-0.17,0.07l-0.5,-1.42l0.85,-0.92l0.53,-0.29l0.48,0.44l-0.56,0.32l-0.1,0.1l-0.41,0.65l-0.05,0.14l-0.07,0.91Z\\\", \\\"name\\\": \\\"Angola\\\"}, \\\"KZ\\\": {\\\"path\\\": \\\"M598.42,172.08l-1.37,0.54l-3.3,2.09l-0.11,0.12l-1.01,1.97l-0.56,0.01l-0.6,-1.24l-0.26,-0.17l-2.95,-0.09l-0.46,-2.22l-0.29,-0.24l-0.91,-0.02l0.17,-2.72l-0.12,-0.26l-3.0,-2.22l-0.2,-0.06l-4.29,0.24l-2.8,0.42l-2.36,-2.7l-6.4,-3.65l-0.23,-0.03l-6.45,1.83l-0.22,0.29l0.1,10.94l-0.84,0.1l-1.65,-2.21l-0.11,-0.09l-1.69,-0.84l-0.2,-0.02l-2.84,0.63l-0.14,0.07l-0.71,0.64l-0.02,-0.11l0.57,-1.17l0.0,-0.26l-0.48,-1.05l-0.17,-0.16l-2.78,-0.99l-1.08,-2.62l-0.13,-0.15l-1.24,-0.7l-0.04,-0.48l2.07,0.25l0.34,-0.29l0.09,-2.03l1.84,-0.44l2.12,0.45l0.36,-0.25l0.45,-3.04l-0.45,-2.06l-0.31,-0.23l-2.44,0.15l-2.07,-0.75l-0.23,0.01l-2.88,1.38l-2.21,0.62l-0.96,-0.38l0.22,-1.39l-0.06,-0.23l-1.6,-2.12l-0.25,-0.12l-1.72,0.08l-1.87,-1.91l1.33,-2.24l-0.06,-0.38l-0.55,-0.5l1.72,-3.08l2.3,1.7l0.48,-0.2l0.29,-2.26l4.99,-3.48l3.76,-0.08l5.46,2.27l2.96,1.33l0.26,-0.01l2.59,-1.36l3.82,-0.06l3.13,1.67l0.38,-0.09l0.63,-0.85l3.36,0.14l0.29,-0.19l0.63,-1.57l-0.13,-0.37l-3.64,-2.05l2.0,-1.36l0.1,-0.38l-0.32,-0.62l2.09,-0.76l0.13,-0.47l-1.65,-2.13l0.89,-0.91l9.27,-1.18l0.13,-0.05l1.17,-0.82l6.2,-1.27l2.26,-1.43l4.19,0.7l0.74,3.39l0.38,0.22l2.52,-0.81l2.9,1.06l-0.18,1.63l0.32,0.33l2.52,-0.23l5.0,-2.58l0.03,0.39l3.16,2.62l5.57,8.48l0.49,0.02l1.18,-1.53l3.22,1.78l0.21,0.03l3.5,-0.83l1.21,0.52l1.16,1.82l0.15,0.12l1.67,0.61l1.01,1.32l0.28,0.11l3.04,-0.41l1.1,1.64l-1.68,1.89l-1.97,0.28l-0.26,0.29l-0.12,3.09l-1.2,1.23l-4.81,-1.01l-0.35,0.2l-1.77,5.51l-1.14,0.62l-4.92,1.23l-0.2,0.41l2.14,5.06l-1.45,0.67l-0.17,0.31l0.15,1.28l-1.05,-0.3l-1.21,-1.04l-0.17,-0.07l-3.73,-0.32l-4.15,-0.08l-0.92,0.31l-3.46,-1.24l-0.22,0.01l-1.42,0.63l-0.17,0.21l-0.32,1.49l-3.82,-0.97l-0.15,0.0l-1.65,0.43l-0.2,0.17l-0.51,1.21Z\\\", \\\"name\\\": \\\"Kazakhstan\\\"}, \\\"ET\\\": {\\\"path\\\": \\\"M516.0,247.63l1.21,0.92l0.3,0.04l1.3,-0.53l0.46,0.41l0.19,0.08l1.65,0.03l2.05,0.96l0.67,0.88l1.07,0.79l1.0,1.45l0.7,0.68l-0.72,0.92l-0.85,1.19l-0.04,0.25l0.19,0.67l0.04,0.74l0.29,0.28l1.4,0.04l0.55,-0.15l0.23,0.19l-0.41,0.67l0.01,0.32l0.92,1.39l0.93,1.23l0.99,0.94l0.1,0.06l8.19,2.99l1.51,0.01l-6.51,6.95l-3.14,0.11l-0.18,0.06l-2.15,1.71l-1.51,0.04l-0.22,0.1l-0.6,0.69l-1.46,-0.0l-0.93,-0.78l-0.32,-0.04l-2.29,1.05l-0.12,0.1l-0.64,0.9l-1.44,-0.17l-0.51,-0.26l-0.17,-0.03l-0.56,0.07l-0.68,-0.02l-3.1,-2.08l-0.17,-0.05l-1.62,0.0l-0.68,-0.65l0.0,-1.28l-0.21,-0.29l-1.19,-0.38l-1.42,-2.63l-0.13,-0.12l-1.05,-0.53l-0.46,-1.0l-1.27,-1.23l-0.17,-0.08l-1.08,-0.13l0.53,-0.9l1.17,-0.05l0.26,-0.17l0.37,-0.77l0.03,-0.14l-0.03,-2.23l0.7,-2.49l1.08,-0.65l0.14,-0.19l0.24,-1.0l1.03,-1.85l1.47,-1.22l0.09,-0.12l1.02,-2.51l0.36,-1.96l2.62,0.48l0.33,-0.18l0.63,-1.55Z\\\", \\\"name\\\": \\\"Ethiopia\\\"}, \\\"ZW\\\": {\\\"path\\\": \\\"M498.95,341.2l-1.16,-0.23l-0.16,0.01l-0.74,0.28l-1.11,-0.41l-1.02,-0.04l-1.52,-1.13l-0.12,-0.05l-1.79,-0.37l-0.65,-1.46l-0.01,-0.86l-0.22,-0.29l-0.99,-0.26l-2.74,-2.77l-0.77,-1.46l-0.52,-0.5l-0.72,-1.54l2.24,0.23l0.78,0.28l0.12,0.02l0.85,-0.06l0.21,-0.11l1.38,-1.66l2.11,-2.05l0.81,-0.18l0.22,-0.2l0.27,-0.8l1.29,-0.93l1.53,-0.28l0.11,0.66l0.3,0.25l2.02,-0.05l1.04,0.48l0.5,0.59l0.18,0.1l1.13,0.18l1.11,0.7l0.01,3.06l-0.49,1.82l-0.11,1.94l0.03,0.16l0.35,0.68l-0.24,1.3l-0.27,0.17l-0.12,0.15l-0.64,1.83l-2.49,2.8Z\\\", \\\"name\\\": \\\"Zimbabwe\\\"}, \\\"ES\\\": {\\\"path\\\": \\\"M398.67,172.8l0.09,-1.45l-0.06,-0.2l-0.82,-1.05l3.16,-1.96l3.01,0.54l3.33,-0.02l2.64,0.52l2.14,-0.15l3.9,0.1l0.91,1.08l0.14,0.09l4.61,1.38l0.26,-0.04l0.77,-0.55l2.66,1.29l0.17,0.03l2.59,-0.35l0.1,1.28l-2.2,1.85l-3.13,0.62l-0.23,0.23l-0.21,0.92l-1.54,1.68l-0.97,2.4l0.02,0.26l0.85,1.46l-1.27,1.14l-0.09,0.14l-0.5,1.73l-1.73,0.53l-0.15,0.1l-1.68,2.1l-3.03,0.04l-2.38,-0.05l-0.17,0.05l-1.57,1.01l-0.9,1.01l-0.96,-0.19l-0.82,-0.86l-0.69,-1.6l-0.22,-0.18l-2.14,-0.41l-0.13,-0.62l0.83,-0.97l0.39,-0.86l-0.06,-0.33l-0.73,-0.73l0.63,-1.74l-0.02,-0.25l-0.8,-1.41l0.69,-0.15l0.23,-0.27l0.09,-1.29l0.33,-0.36l0.08,-0.2l0.03,-2.16l1.03,-0.72l0.1,-0.37l-0.7,-1.5l-0.25,-0.17l-1.46,-0.11l-0.22,0.07l-0.34,0.3l-1.17,0.0l-0.55,-1.29l-0.39,-0.16l-1.02,0.44l-0.45,0.36Z\\\", \\\"name\\\": \\\"Spain\\\"}, \\\"ER\\\": {\\\"path\\\": \\\"M527.15,253.05l-0.77,-0.74l-1.01,-1.47l-1.14,-0.86l-0.62,-0.84l-0.11,-0.09l-2.18,-1.02l-0.12,-0.03l-1.61,-0.03l-0.52,-0.46l-0.31,-0.05l-1.31,0.54l-1.38,-1.06l-0.46,0.12l-0.69,1.68l-2.49,-0.46l-0.2,-0.76l1.06,-3.69l0.24,-1.65l0.66,-0.66l1.76,-0.4l0.16,-0.1l0.97,-1.13l1.24,2.55l0.68,2.34l0.09,0.14l1.4,1.27l3.39,2.4l1.37,1.43l2.14,2.34l0.94,0.6l-0.32,0.26l-0.85,-0.17Z\\\", \\\"name\\\": \\\"Eritrea\\\"}, \\\"ME\\\": {\\\"path\\\": \\\"M469.05,172.9l-0.57,-0.8l-0.1,-0.09l-0.82,-0.46l0.16,-0.33l0.35,-1.57l0.72,-0.62l0.27,-0.16l0.48,0.38l0.35,0.4l0.12,0.08l0.79,0.32l0.66,0.43l-0.43,0.62l-0.28,0.11l-0.07,-0.25l-0.53,-0.1l-1.09,1.49l-0.05,0.23l0.06,0.32Z\\\", \\\"name\\\": \\\"Montenegro\\\"}, \\\"MD\\\": {\\\"path\\\": \\\"M488.2,153.75l0.14,-0.11l1.49,-0.28l1.75,0.95l1.06,0.14l0.92,0.7l-0.15,0.9l0.15,0.31l0.8,0.46l0.33,1.2l0.09,0.14l0.72,0.66l-0.11,0.28l0.1,0.33l-0.06,0.02l-1.25,-0.08l-0.17,-0.29l-0.39,-0.12l-0.52,0.25l-0.16,0.36l0.13,0.42l-0.6,0.88l-0.43,1.03l-0.22,0.12l-0.32,-1.0l0.25,-1.34l-0.08,-1.38l-0.06,-0.17l-1.43,-1.87l-0.81,-1.36l-0.78,-0.95l-0.12,-0.09l-0.29,-0.12Z\\\", \\\"name\\\": \\\"Moldova\\\"}, \\\"MG\\\": {\\\"path\\\": \\\"M544.77,316.45l0.64,1.04l0.6,1.62l0.4,3.04l0.63,1.21l-0.22,1.07l-0.15,0.26l-0.59,-1.05l-0.52,-0.01l-0.47,0.76l-0.04,0.23l0.46,1.84l-0.19,0.92l-0.61,0.53l-0.1,0.21l-0.16,2.15l-0.97,2.98l-1.24,3.59l-1.55,4.97l-0.96,3.67l-1.08,2.93l-1.94,0.61l-2.05,1.06l-3.2,-1.53l-0.62,-1.26l-0.18,-2.39l-0.87,-2.07l-0.22,-1.8l0.4,-1.69l1.01,-0.4l0.19,-0.28l0.01,-0.79l1.15,-1.91l0.04,-0.11l0.23,-1.66l-0.03,-0.17l-0.57,-1.21l-0.46,-1.58l-0.19,-2.25l0.82,-1.36l0.33,-1.51l1.11,-0.1l1.4,-0.53l0.9,-0.45l1.03,-0.03l0.21,-0.09l1.41,-1.45l2.12,-1.65l0.75,-1.29l0.03,-0.24l-0.17,-0.56l0.53,0.15l0.32,-0.1l1.38,-1.77l0.06,-0.18l0.04,-1.44l0.54,-0.74l0.62,0.77Z\\\", \\\"name\\\": \\\"Madagascar\\\"}, \\\"MA\\\": {\\\"path\\\": \\\"M378.66,230.13l0.07,-0.75l0.93,-0.72l0.82,-1.37l0.04,-0.21l-0.14,-0.8l0.8,-1.74l1.33,-1.61l0.79,-0.4l0.14,-0.15l0.66,-1.55l0.08,-1.46l0.83,-1.52l1.6,-0.94l0.11,-0.11l1.56,-2.71l1.2,-0.99l2.24,-0.29l0.17,-0.08l1.95,-1.83l1.3,-0.77l2.09,-2.28l0.07,-0.26l-0.61,-3.34l0.92,-2.3l0.33,-1.44l1.52,-1.79l2.48,-1.27l1.86,-1.16l0.1,-0.11l1.67,-2.93l0.72,-1.59l1.54,0.01l1.43,1.14l0.21,0.06l2.33,-0.19l2.55,0.62l0.97,0.03l0.83,1.6l0.15,1.71l0.86,2.96l0.09,0.14l0.5,0.45l-0.31,0.73l-3.11,0.44l-0.16,0.07l-1.07,0.97l-1.36,0.23l-0.25,0.28l-0.1,1.85l-2.74,1.02l-0.14,0.11l-0.9,1.3l-1.93,0.69l-2.56,0.44l-4.04,2.01l-0.17,0.27l0.02,2.91l-0.08,0.0l-0.3,0.31l0.05,1.15l-1.25,0.07l-0.16,0.06l-0.73,0.55l-0.98,0.0l-0.85,-0.33l-0.15,-0.02l-2.11,0.29l-0.24,0.19l-0.76,1.95l-0.63,0.16l-0.21,0.19l-1.15,3.29l-3.42,2.81l-0.1,0.17l-0.81,3.57l-0.98,1.12l-0.3,0.85l-5.13,0.19Z\\\", \\\"name\\\": \\\"Morocco\\\"}, \\\"UZ\\\": {\\\"path\\\": \\\"M587.83,186.48l0.06,-1.46l-0.19,-0.29l-3.31,-1.24l-2.57,-1.4l-1.63,-1.38l-2.79,-1.98l-1.2,-2.98l-0.12,-0.14l-0.84,-0.54l-0.18,-0.05l-2.61,0.13l-0.76,-0.48l-0.25,-2.25l-0.17,-0.24l-3.37,-1.6l-0.32,0.04l-2.08,1.73l-2.11,1.02l-0.16,0.35l0.31,1.14l-2.14,0.03l-0.09,-10.68l6.1,-1.74l6.25,3.57l2.36,2.72l0.27,0.1l2.92,-0.44l4.17,-0.23l2.78,2.06l-0.18,2.87l0.29,0.32l0.98,0.02l0.46,2.22l0.28,0.24l3.0,0.09l0.61,1.25l0.28,0.17l0.93,-0.02l0.26,-0.16l1.06,-2.06l3.21,-2.03l1.3,-0.5l0.19,0.08l-1.75,1.62l0.05,0.48l1.85,1.12l0.27,0.02l1.65,-0.69l2.4,1.27l-2.69,1.79l-1.79,-0.27l-0.89,0.06l-0.22,-0.52l0.48,-1.26l-0.34,-0.4l-3.35,0.69l-0.22,0.18l-0.78,1.87l-1.07,1.47l-1.93,-0.13l-0.29,0.16l-0.65,1.29l0.16,0.42l1.69,0.64l0.48,1.91l-1.25,2.6l-1.64,-0.53l-1.18,-0.03Z\\\", \\\"name\\\": \\\"Uzbekistan\\\"}, \\\"MM\\\": {\\\"path\\\": \\\"M670.1,233.39l-1.46,1.11l-1.68,0.11l-0.26,0.19l-1.1,2.7l-0.95,0.42l-0.14,0.42l1.21,2.27l1.61,1.92l0.94,1.55l-0.82,1.99l-0.77,0.42l-0.13,0.39l0.64,1.35l1.62,1.97l0.26,1.32l-0.04,1.15l0.02,0.13l0.92,2.18l-1.3,2.23l-0.79,1.69l-0.1,-0.77l0.74,-1.87l-0.02,-0.26l-0.8,-1.42l0.2,-2.68l-0.06,-0.2l-0.98,-1.27l-0.8,-2.98l-0.45,-3.22l-1.11,-2.22l-0.45,-0.1l-1.64,1.28l-2.74,1.76l-1.26,-0.2l-1.27,-0.49l0.79,-2.93l0.0,-0.14l-0.52,-2.42l-1.93,-2.97l0.26,-0.8l-0.22,-0.39l-1.37,-0.31l-1.65,-1.98l-0.12,-1.5l0.41,0.19l0.42,-0.26l0.05,-1.7l1.08,-0.54l0.16,-0.34l-0.24,-1.0l0.5,-0.79l0.05,-0.15l0.08,-2.35l1.58,0.49l0.36,-0.15l1.12,-2.19l0.15,-1.34l1.35,-2.18l0.04,-0.17l-0.07,-1.35l2.97,-1.71l1.67,0.45l0.38,-0.33l-0.18,-1.46l0.7,-0.4l0.15,-0.32l-0.13,-0.72l0.94,-0.13l0.74,1.41l0.11,0.12l0.95,0.56l0.07,1.89l-0.09,2.08l-2.28,2.15l-0.09,0.19l-0.3,3.15l0.35,0.32l2.37,-0.39l0.53,2.17l0.2,0.21l1.3,0.42l-0.63,1.9l0.14,0.36l1.86,0.99l1.1,0.49l0.24,0.0l1.45,-0.6l0.04,0.51l-2.01,1.6l-0.56,0.96l-1.34,0.56Z\\\", \\\"name\\\": \\\"Myanmar\\\"}, \\\"ML\\\": {\\\"path\\\": \\\"M390.79,248.2l0.67,-0.37l0.14,-0.18l0.36,-1.31l0.51,-0.04l1.68,0.69l0.21,0.0l1.34,-0.48l0.89,0.16l0.3,-0.13l0.29,-0.44l9.89,-0.04l0.29,-0.21l0.56,-1.8l-0.11,-0.33l-0.33,-0.24l-2.37,-22.1l3.41,-0.04l8.37,5.73l8.38,5.68l0.56,1.15l0.14,0.14l1.56,0.75l0.99,0.36l0.03,1.45l0.33,0.29l2.45,-0.22l0.01,5.52l-1.3,1.64l-0.06,0.15l-0.18,1.37l-1.99,0.36l-3.4,0.22l-0.19,0.09l-0.85,0.83l-1.48,0.09l-1.49,0.01l-0.54,-0.43l-0.26,-0.05l-1.38,0.36l-2.39,1.08l-0.13,0.12l-0.44,0.73l-1.88,1.11l-0.11,0.12l-0.3,0.57l-0.86,0.42l-1.1,-0.31l-0.28,0.07l-0.69,0.62l-0.09,0.16l-0.35,1.66l-1.93,2.04l-0.08,0.23l0.05,0.76l-0.63,0.99l-0.04,0.19l0.14,1.23l-0.81,0.29l-0.32,0.17l-0.27,-0.75l-0.39,-0.18l-0.65,0.26l-0.36,-0.04l-0.29,0.14l-0.37,0.6l-1.69,-0.02l-0.63,-0.34l-0.32,0.02l-0.12,0.09l-0.47,-0.45l0.1,-0.6l-0.09,-0.27l-0.31,-0.3l-0.33,-0.05l-0.05,0.02l0.02,-0.21l0.46,-0.59l-0.02,-0.39l-0.99,-1.02l-0.34,-0.74l-0.56,-0.56l-0.17,-0.09l-0.5,-0.07l-0.19,0.04l-0.58,0.35l-0.79,0.33l-0.65,0.51l-0.85,-0.16l-0.63,-0.59l-0.14,-0.07l-0.41,-0.08l-0.2,0.03l-0.59,0.31l-0.07,0.0l-0.1,-0.63l0.11,-0.85l-0.21,-0.98l-0.11,-0.17l-0.86,-0.66l-0.45,-1.34l-0.1,-1.36Z\\\", \\\"name\\\": \\\"Mali\\\"}, \\\"MN\\\": {\\\"path\\\": \\\"M641.06,150.59l2.41,-0.53l4.76,-2.8l3.67,-1.49l2.06,0.96l0.12,0.03l2.5,0.05l1.59,1.45l0.19,0.08l2.47,0.12l3.59,0.81l0.27,-0.07l2.43,-2.28l0.06,-0.36l-0.93,-1.77l2.33,-3.1l2.66,1.3l2.26,0.39l2.75,0.8l0.44,2.3l0.19,0.22l3.56,1.38l0.18,0.01l2.35,-0.6l3.1,-0.42l2.4,0.41l2.37,1.52l1.49,1.63l0.23,0.1l2.29,-0.03l3.13,0.52l0.15,-0.01l2.28,-0.79l3.27,-0.53l0.11,-0.04l3.56,-2.23l1.31,0.31l1.26,1.05l0.22,0.07l2.45,-0.22l-0.98,1.96l-1.77,3.21l-0.01,0.28l0.64,1.31l0.35,0.16l1.35,-0.38l2.4,0.48l0.22,-0.04l1.78,-1.09l1.82,0.92l2.11,2.07l-0.17,0.68l-1.79,-0.31l-3.74,0.45l-1.85,0.96l-1.78,2.01l-3.74,1.18l-2.46,1.61l-2.45,-0.6l-1.42,-0.28l-0.31,0.13l-1.31,1.99l0.0,0.33l0.78,1.15l0.3,0.74l-1.58,0.93l-1.75,1.59l-2.83,1.03l-3.77,0.12l-4.05,1.05l-2.81,1.54l-0.95,-0.8l-0.19,-0.07l-2.96,0.0l-3.64,-1.8l-2.55,-0.48l-3.38,0.41l-5.13,-0.67l-2.66,0.06l-1.35,-1.65l-1.12,-2.78l-0.21,-0.18l-1.5,-0.33l-2.98,-1.89l-0.12,-0.04l-3.37,-0.43l-2.84,-0.51l-0.75,-1.13l0.93,-3.54l-0.04,-0.24l-1.73,-2.55l-0.15,-0.12l-3.52,-1.18l-1.99,-1.61l-0.54,-1.85Z\\\", \\\"name\\\": \\\"Mongolia\\\"}, \\\"MK\\\": {\\\"path\\\": \\\"M472.73,173.87l0.08,0.01l0.32,-0.25l0.08,-0.44l1.29,-0.41l1.37,-0.28l1.03,-0.04l1.06,0.82l0.14,1.59l-0.22,0.04l-0.17,0.11l-0.32,0.4l-1.2,-0.05l-0.18,0.05l-0.9,0.61l-1.45,0.23l-0.85,-0.59l-0.3,-1.09l0.22,-0.71Z\\\", \\\"name\\\": \\\"Macedonia\\\"}, \\\"MW\\\": {\\\"path\\\": \\\"M507.18,313.84l-0.67,1.85l-0.01,0.16l0.7,3.31l0.31,0.24l0.75,-0.03l0.78,0.71l0.99,1.75l0.2,3.03l-0.91,0.45l-0.14,0.15l-0.59,1.38l-1.24,-1.21l-0.17,-1.62l0.49,-1.12l0.02,-0.16l-0.15,-1.03l-0.13,-0.21l-0.99,-0.65l-0.26,-0.03l-0.53,0.18l-1.31,-1.12l-1.15,-0.59l0.66,-2.06l0.75,-0.84l0.07,-0.27l-0.47,-2.04l0.48,-1.94l0.4,-0.65l0.03,-0.24l-0.64,-2.15l-0.08,-0.13l-0.44,-0.42l1.34,0.26l1.25,1.73l0.67,3.3Z\\\", \\\"name\\\": \\\"Malawi\\\"}, \\\"MR\\\": {\\\"path\\\": \\\"M390.54,247.66l-1.48,-1.58l-1.51,-1.88l-0.12,-0.09l-1.64,-0.67l-1.17,-0.74l-0.17,-0.05l-1.4,0.03l-0.12,0.03l-1.14,0.52l-1.15,-0.21l-0.26,0.08l-0.44,0.43l-0.11,-0.72l0.68,-1.29l0.31,-2.43l-0.28,-2.63l-0.29,-1.27l0.24,-1.24l-0.03,-0.2l-0.65,-1.24l-1.19,-1.05l0.32,-0.51l9.64,0.02l0.3,-0.34l-0.46,-3.71l0.51,-1.12l2.17,-0.22l0.27,-0.3l-0.08,-6.5l7.91,0.13l0.31,-0.3l0.01,-3.5l8.17,5.63l-2.89,0.04l-0.29,0.33l2.42,22.56l0.12,0.21l0.26,0.19l-0.43,1.38l-9.83,0.04l-0.25,0.13l-0.27,0.41l-0.77,-0.14l-0.15,0.01l-1.3,0.47l-1.64,-0.67l-0.14,-0.02l-0.79,0.06l-0.27,0.22l-0.39,1.39l-0.53,0.29Z\\\", \\\"name\\\": \\\"Mauritania\\\"}, \\\"UG\\\": {\\\"path\\\": \\\"M500.74,287.17l-2.84,-0.02l-0.92,0.32l-1.37,0.71l-0.29,-0.12l0.02,-1.6l0.54,-0.89l0.04,-0.13l0.14,-1.96l0.49,-1.09l0.91,-1.24l0.97,-0.68l0.8,-0.89l-0.13,-0.49l-0.79,-0.27l0.13,-2.55l0.78,-0.52l1.45,0.51l0.18,0.01l1.97,-0.57l1.72,0.01l0.18,-0.06l1.29,-0.97l0.98,1.44l0.29,1.24l1.05,2.75l-0.84,1.68l-1.94,2.66l-0.06,0.18l0.02,2.36l-4.8,0.18Z\\\", \\\"name\\\": \\\"Uganda\\\"}, \\\"MY\\\": {\\\"path\\\": \\\"M717.6,273.52l-1.51,0.7l-2.13,-0.41l-2.88,-0.0l-0.29,0.21l-0.84,2.77l-0.9,0.82l-0.08,0.12l-1.23,3.34l-1.81,0.47l-2.29,-0.68l-0.14,-0.01l-1.2,0.22l-0.14,0.07l-1.36,1.18l-1.47,-0.17l-0.12,0.01l-1.46,0.46l-1.51,-1.25l-0.24,-0.97l1.26,0.59l0.2,0.02l1.93,-0.47l0.22,-0.22l0.47,-1.98l0.9,-0.4l2.97,-0.54l0.17,-0.09l1.8,-1.98l1.02,-1.32l0.9,1.03l0.48,-0.04l0.43,-0.7l1.02,0.07l0.32,-0.27l0.25,-2.72l1.84,-1.67l1.23,-1.89l0.73,-0.01l1.12,1.11l0.1,0.99l0.18,0.24l1.66,0.71l1.85,0.67l-0.09,0.51l-1.45,0.11l-0.26,0.4l0.35,0.97ZM673.78,269.53l0.17,1.14l0.35,0.25l1.65,-0.3l0.18,-0.11l0.68,-0.86l0.31,0.13l1.41,1.45l0.99,1.59l0.13,1.57l-0.26,1.09l0.0,0.15l0.24,0.84l0.18,1.46l0.11,0.2l0.82,0.64l0.92,2.08l-0.03,0.52l-1.4,0.13l-2.29,-1.79l-2.86,-1.92l-0.27,-1.16l-0.07,-0.13l-1.39,-1.61l-0.33,-1.99l-0.05,-0.12l-0.84,-1.27l0.26,-1.72l-0.03,-0.18l-0.45,-0.87l0.13,-0.13l1.71,0.92Z\\\", \\\"name\\\": \\\"Malaysia\\\"}, \\\"MX\\\": {\\\"path\\\": \\\"M133.41,213.83l0.61,0.09l0.27,-0.09l0.93,-1.01l0.08,-0.18l0.09,-1.22l-0.09,-0.23l-1.93,-1.94l-1.46,-0.77l-2.96,-5.62l-0.86,-2.1l2.44,-0.18l2.68,-0.25l-0.03,0.08l0.17,0.4l3.79,1.35l5.81,1.97l6.96,-0.02l0.3,-0.3l0.0,-0.84l3.91,0.0l0.87,0.93l1.27,0.87l1.44,1.17l0.79,1.37l0.62,1.49l0.12,0.14l1.35,0.85l2.08,0.82l0.35,-0.1l1.49,-2.04l1.81,-0.05l1.63,1.01l1.21,1.8l0.86,1.58l1.47,1.55l0.53,1.82l0.73,1.32l0.14,0.13l1.98,0.84l1.78,0.59l0.61,-0.03l-0.78,1.89l-0.45,1.96l-0.19,3.58l-0.24,1.27l0.01,0.14l0.43,1.43l0.78,1.31l0.49,1.98l0.06,0.12l1.63,1.9l0.61,1.51l0.98,1.28l0.16,0.11l2.58,0.67l0.98,1.02l0.31,0.08l2.17,-0.71l1.91,-0.26l1.87,-0.47l1.67,-0.49l1.59,-1.06l0.11,-0.14l0.6,-1.52l0.22,-2.21l0.35,-0.62l1.58,-0.64l2.59,-0.59l2.18,0.09l1.43,-0.2l0.39,0.36l-0.07,1.02l-1.28,1.48l-0.65,1.68l0.07,0.32l0.33,0.32l-0.79,2.49l-0.28,-0.3l-0.24,-0.09l-1.0,0.08l-0.24,0.15l-0.74,1.28l-0.19,-0.13l-0.28,-0.03l-0.3,0.12l-0.19,0.29l0.0,0.06l-4.34,-0.02l-0.3,0.3l-0.0,1.16l-0.83,0.0l-0.28,0.19l0.08,0.33l0.93,0.86l0.9,0.58l0.24,0.48l0.16,0.15l0.2,0.08l-0.03,0.38l-2.94,0.01l-0.26,0.15l-1.21,2.09l0.02,0.33l0.25,0.33l-0.21,0.44l-0.04,0.22l-2.42,-2.35l-1.36,-0.87l-2.04,-0.67l-0.13,-0.01l-1.4,0.19l-2.07,0.98l-1.14,0.23l-1.72,-0.66l-1.85,-0.48l-2.31,-1.16l-1.92,-0.38l-2.79,-1.18l-2.04,-1.2l-0.6,-0.66l-0.19,-0.1l-1.37,-0.15l-2.45,-0.78l-1.07,-1.18l-2.63,-1.44l-1.2,-1.56l-0.44,-0.93l0.5,-0.15l0.2,-0.39l-0.2,-0.58l0.46,-0.55l0.07,-0.19l0.01,-0.91l-0.06,-0.18l-0.81,-1.13l-0.25,-1.08l-0.86,-1.36l-2.21,-2.63l-2.53,-2.09l-1.2,-1.63l-0.11,-0.09l-2.08,-1.06l-0.34,-0.48l0.35,-1.53l-0.16,-0.34l-1.24,-0.61l-1.39,-1.23l-0.6,-1.81l-0.24,-0.2l-1.25,-0.2l-1.38,-1.35l-1.11,-1.25l-0.1,-0.76l-0.05,-0.13l-1.33,-2.04l-0.85,-2.02l0.04,-0.99l-0.14,-0.27l-1.81,-1.1l-0.2,-0.04l-0.74,0.11l-1.34,-0.72l-0.42,0.16l-0.4,1.12l-0.0,0.19l0.41,1.3l0.24,2.04l0.06,0.15l0.88,1.16l1.84,1.86l0.4,0.61l0.12,0.1l0.27,0.14l0.29,0.82l0.31,0.2l0.2,-0.02l0.43,1.51l0.09,0.14l0.72,0.65l0.51,0.91l1.58,1.4l0.8,2.42l0.77,1.23l0.66,1.19l0.13,1.34l0.28,0.27l1.08,0.08l0.92,1.1l0.83,1.08l-0.03,0.24l-0.88,0.81l-0.13,-0.0l-0.59,-1.42l-0.07,-0.11l-1.67,-1.53l-1.81,-1.28l-1.15,-0.61l0.07,-1.85l-0.38,-1.45l-0.12,-0.17l-2.91,-2.03l-0.39,0.04l-0.11,0.11l-0.42,-0.46l-0.11,-0.08l-1.49,-0.63l-1.09,-1.16Z\\\", \\\"name\\\": \\\"Mexico\\\"}, \\\"VU\\\": {\\\"path\\\": \\\"M839.92,325.66l0.78,0.73l-0.18,0.07l-0.6,-0.8ZM839.13,322.74l0.27,1.36l-0.13,-0.06l-0.21,-0.02l-0.29,0.08l-0.22,-0.43l-0.03,-1.32l0.61,0.4Z\\\", \\\"name\\\": \\\"Vanuatu\\\"}, \\\"FR\\\": {\\\"path\\\": \\\"M444.58,172.63l-0.68,1.92l-0.72,-0.38l-0.51,-1.79l0.43,-0.95l1.15,-0.83l0.33,2.04ZM429.71,147.03l1.77,1.57l0.26,0.07l1.16,-0.23l2.12,1.44l0.56,0.28l0.16,0.03l0.61,-0.06l1.09,0.78l0.13,0.05l3.18,0.53l-1.09,1.94l-0.3,2.16l-0.48,0.38l-1.0,-0.26l-0.37,0.32l0.07,0.66l-1.73,1.68l-0.09,0.21l-0.04,1.42l0.41,0.29l0.96,-0.4l0.67,1.07l-0.09,0.78l0.04,0.19l0.61,0.97l-0.71,0.78l-0.07,0.28l0.65,2.39l0.21,0.21l1.09,0.31l-0.2,0.95l-2.08,1.58l-4.81,-0.8l-0.13,0.01l-3.65,0.99l-0.22,0.24l-0.25,1.6l-2.59,0.35l-2.74,-1.33l-0.31,0.03l-0.79,0.57l-4.38,-1.31l-0.79,-0.94l1.16,-1.64l0.05,-0.15l0.48,-6.17l-0.06,-0.21l-2.58,-3.3l-1.89,-1.65l-0.11,-0.06l-3.64,-1.17l-0.2,-1.88l2.92,-0.63l4.14,0.82l0.35,-0.36l-0.65,-3.0l1.77,1.05l0.27,0.02l5.83,-2.54l0.17,-0.19l0.71,-2.54l1.75,-0.53l0.27,0.88l0.27,0.21l1.04,0.05l1.08,1.23ZM289.1,278.45l-0.85,0.84l-0.88,0.13l-0.25,-0.51l-0.21,-0.16l-0.56,-0.1l-0.25,0.07l-0.63,0.55l-0.62,-0.29l0.5,-0.88l0.21,-1.11l0.42,-1.05l-0.03,-0.28l-0.93,-1.42l-0.18,-1.54l1.13,-1.87l2.42,0.78l2.55,2.04l0.33,0.81l-1.4,2.16l-0.77,1.84Z\\\", \\\"name\\\": \\\"France\\\"}, \\\"FI\\\": {\\\"path\\\": \\\"M492.26,76.42l-0.38,3.12l0.12,0.28l3.6,2.69l-2.14,2.96l-0.01,0.33l2.83,4.61l-1.61,3.36l0.03,0.31l2.15,2.87l-0.96,2.44l0.1,0.35l3.51,2.55l-0.81,1.72l-2.28,2.19l-5.28,4.79l-4.51,0.31l-4.39,1.37l-3.87,0.75l-1.34,-1.89l-0.11,-0.09l-2.23,-1.14l0.53,-3.54l-0.01,-0.14l-1.17,-3.37l1.12,-2.13l2.23,-2.44l5.69,-4.33l1.65,-0.84l0.16,-0.31l-0.26,-1.73l-0.15,-0.22l-3.4,-1.91l-0.77,-1.47l-0.07,-6.45l-0.12,-0.24l-3.91,-2.94l-3.0,-1.92l0.97,-0.76l2.6,2.17l0.21,0.07l3.2,-0.21l2.63,1.03l0.3,-0.05l2.39,-1.94l0.09,-0.13l1.18,-3.12l3.63,-1.42l2.87,1.59l-0.98,2.87Z\\\", \\\"name\\\": \\\"Finland\\\"}, \\\"FJ\\\": {\\\"path\\\": \\\"M869.98,327.07l-1.31,0.44l-0.14,-0.41l0.96,-0.41l0.85,-0.17l1.43,-0.78l-0.16,0.65l-1.64,0.67ZM867.58,329.12l0.54,0.47l-0.31,1.0l-1.32,0.3l-1.13,-0.26l-0.17,-0.78l0.72,-0.66l0.98,0.27l0.25,-0.04l0.43,-0.29Z\\\", \\\"name\\\": \\\"Fiji\\\"}, \\\"FK\\\": {\\\"path\\\": \\\"M268.15,427.89l2.6,-1.73l1.98,0.77l0.31,-0.05l1.32,-1.17l1.58,1.18l-0.54,0.84l-3.1,0.92l-1.0,-1.04l-0.39,-0.04l-1.9,1.35l-0.86,-1.04Z\\\", \\\"name\\\": \\\"Falkland Islands\\\"}, \\\"NI\\\": {\\\"path\\\": \\\"M202.1,252.6l0.23,-0.0l0.12,-0.11l0.68,-0.09l0.22,-0.15l0.23,-0.43l0.2,-0.01l0.28,-0.31l-0.04,-0.97l0.29,-0.03l0.5,0.02l0.25,-0.11l0.37,-0.46l0.51,0.35l0.4,-0.06l0.23,-0.28l0.45,-0.29l0.87,-0.7l0.11,-0.21l0.02,-0.26l0.23,-0.12l0.25,-0.48l0.29,0.27l0.14,0.07l0.5,0.12l0.22,-0.03l0.48,-0.28l0.66,-0.02l0.87,-0.33l0.36,-0.32l0.21,0.01l-0.11,0.48l0.0,0.14l0.22,0.8l-0.54,0.85l-0.27,1.03l-0.09,1.18l0.14,0.72l0.05,0.95l-0.24,0.15l-0.13,0.19l-0.23,1.09l0.0,0.14l0.14,0.53l-0.42,0.53l-0.06,0.24l0.12,0.69l0.08,0.15l0.18,0.19l-0.26,0.23l-0.49,-0.11l-0.35,-0.44l-0.16,-0.1l-0.79,-0.21l-0.23,0.03l-0.45,0.26l-1.51,-0.62l-0.31,0.05l-0.17,0.15l-1.81,-1.62l-0.6,-0.9l-1.04,-0.79l-0.77,-0.71Z\\\", \\\"name\\\": \\\"Nicaragua\\\"}, \\\"NL\\\": {\\\"path\\\": \\\"M436.22,136.65l1.82,0.08l0.36,0.89l-0.6,2.96l-0.53,1.06l-1.32,0.0l-0.3,0.34l0.35,2.89l-0.83,-0.47l-1.56,-1.43l-0.29,-0.07l-2.26,0.67l-1.02,-0.15l0.68,-0.48l0.1,-0.12l2.14,-4.84l3.25,-1.35Z\\\", \\\"name\\\": \\\"Netherlands\\\"}, \\\"NO\\\": {\\\"path\\\": \\\"M491.45,67.31l7.06,3.0l-2.52,0.94l-0.11,0.49l2.43,2.49l-3.82,1.59l-1.48,0.3l0.89,-2.61l-0.14,-0.36l-3.21,-1.78l-0.25,-0.02l-3.89,1.52l-0.17,0.17l-1.2,3.17l-2.19,1.78l-2.53,-0.99l-0.13,-0.02l-3.15,0.21l-2.69,-2.25l-0.38,-0.01l-1.43,1.11l-1.47,0.17l-0.26,0.26l-0.33,2.57l-4.42,-0.65l-0.33,0.22l-0.6,2.19l-2.17,-0.01l-0.27,0.16l-4.15,7.68l-3.88,5.76l-0.0,0.33l0.81,1.23l-0.7,1.27l-2.3,-0.06l-0.28,0.18l-1.63,3.72l-0.02,0.13l0.15,5.17l0.07,0.18l1.51,1.84l-0.79,4.24l-2.04,2.5l-0.92,1.75l-1.39,-1.88l-0.44,-0.05l-4.89,4.21l-3.16,0.81l-3.24,-1.74l-0.86,-3.82l-0.78,-8.6l2.18,-2.36l6.56,-3.28l5.0,-4.16l4.63,-5.74l5.99,-8.09l4.17,-3.23l6.84,-5.49l5.39,-1.92l4.06,0.24l0.23,-0.09l3.72,-3.67l4.51,0.19l4.4,-0.89ZM484.58,19.95l4.42,1.82l-3.25,2.68l-7.14,0.65l-7.16,-0.91l-0.39,-1.37l-0.28,-0.22l-3.48,-0.1l-2.25,-2.15l7.09,-1.48l3.55,1.36l0.28,-0.03l2.42,-1.66l6.18,1.41ZM481.99,33.92l-4.73,1.85l-3.76,-1.06l1.27,-1.02l0.04,-0.43l-1.18,-1.35l4.46,-0.94l0.89,1.83l0.17,0.15l2.83,0.96ZM466.5,23.95l7.64,3.87l-5.63,1.94l-0.19,0.19l-1.35,3.88l-2.08,0.96l-0.16,0.19l-1.14,4.18l-2.71,0.18l-4.94,-2.95l1.95,-1.63l-0.08,-0.51l-3.7,-1.54l-4.79,-4.54l-1.78,-4.01l6.29,-1.88l1.25,1.81l0.25,0.13l3.57,-0.08l0.26,-0.17l0.87,-1.79l3.41,-0.18l3.08,1.94Z\\\", \\\"name\\\": \\\"Norway\\\"}, \\\"NA\\\": {\\\"path\\\": \\\"M461.88,357.98l-1.61,-1.77l-0.94,-1.9l-0.54,-2.58l-0.62,-1.95l-0.83,-4.05l-0.06,-3.13l-0.33,-1.5l-0.07,-0.14l-0.95,-1.06l-1.27,-2.12l-1.3,-3.1l-0.59,-1.71l-1.98,-2.46l-0.13,-1.67l0.99,-0.4l1.44,-0.42l1.48,0.07l1.42,1.11l0.31,0.03l0.32,-0.15l9.99,-0.11l1.66,1.18l0.16,0.06l6.06,0.37l4.69,-1.06l2.01,-0.57l1.5,0.14l0.63,0.37l-1.0,0.41l-0.7,0.01l-0.16,0.05l-1.38,0.88l-0.79,-0.88l-0.29,-0.09l-3.83,0.9l-1.84,0.08l-0.29,0.3l-0.07,8.99l-2.18,0.08l-0.29,0.3l-0.0,17.47l-2.04,1.27l-1.21,0.18l-1.51,-0.49l-0.99,-0.18l-0.36,-1.0l-0.1,-0.14l-0.99,-0.74l-0.4,0.04l-0.98,1.09Z\\\", \\\"name\\\": \\\"Namibia\\\"}, \\\"NC\\\": {\\\"path\\\": \\\"M835.87,338.68l2.06,1.63l1.01,0.94l-0.49,0.32l-1.21,-0.62l-1.76,-1.16l-1.58,-1.36l-1.61,-1.79l-0.16,-0.41l0.54,0.02l1.32,0.83l1.08,0.87l0.79,0.73Z\\\", \\\"name\\\": \\\"New Caledonia\\\"}, \\\"NE\\\": {\\\"path\\\": \\\"M426.67,254.17l0.03,-1.04l-0.24,-0.3l-2.66,-0.53l-0.06,-1.0l-0.07,-0.17l-1.37,-1.62l-0.3,-1.04l0.15,-0.94l1.37,-0.09l0.19,-0.09l0.85,-0.83l3.34,-0.22l2.22,-0.41l0.24,-0.26l0.2,-1.5l1.32,-1.65l0.07,-0.19l-0.01,-5.74l3.4,-1.13l7.24,-5.12l8.46,-4.95l3.76,1.08l1.35,1.39l0.36,0.05l1.39,-0.77l0.55,3.66l0.12,0.2l0.82,0.6l0.03,0.69l0.1,0.21l0.87,0.74l-0.47,0.99l-0.96,5.26l-0.13,3.25l-3.08,2.34l-0.1,0.15l-1.08,3.37l0.08,0.31l0.94,0.86l-0.01,1.51l0.29,0.3l1.25,0.05l-0.14,0.66l-0.51,0.11l-0.24,0.26l-0.06,0.57l-0.04,0.0l-1.59,-2.62l-0.21,-0.14l-0.59,-0.1l-0.23,0.05l-1.83,1.33l-1.79,-0.68l-1.42,-0.17l-0.17,0.03l-0.65,0.32l-1.39,-0.07l-0.19,0.06l-1.4,1.03l-1.12,0.05l-2.97,-1.29l-0.26,0.01l-1.12,0.59l-1.08,-0.04l-0.85,-0.88l-0.11,-0.07l-2.51,-0.95l-0.14,-0.02l-2.69,0.3l-0.16,0.07l-0.65,0.55l-0.1,0.16l-0.34,1.41l-0.69,0.98l-0.05,0.15l-0.13,1.72l-1.47,-1.13l-0.18,-0.06l-0.9,0.01l-0.2,0.08l-0.32,0.28Z\\\", \\\"name\\\": \\\"Niger\\\"}, \\\"NG\\\": {\\\"path\\\": \\\"M442.0,272.7l-2.4,0.83l-0.88,-0.12l-0.19,0.04l-0.89,0.52l-1.78,-0.05l-1.23,-1.44l-0.88,-1.87l-1.77,-1.66l-0.21,-0.08l-3.78,0.03l0.13,-3.75l-0.06,-1.58l0.44,-1.47l0.74,-0.75l1.21,-1.56l0.04,-0.29l-0.22,-0.56l0.44,-0.9l0.01,-0.24l-0.54,-1.44l0.26,-2.97l0.72,-1.06l0.33,-1.37l0.51,-0.43l2.53,-0.28l2.38,0.9l0.89,0.91l0.2,0.09l1.28,0.04l0.15,-0.03l1.06,-0.56l2.9,1.26l0.13,0.02l1.28,-0.06l0.16,-0.06l1.39,-1.02l1.36,0.07l0.15,-0.03l0.64,-0.32l1.22,0.13l1.9,0.73l0.28,-0.04l1.86,-1.35l0.33,0.06l1.62,2.67l0.29,0.14l0.32,-0.04l0.73,0.74l-0.19,0.37l-0.12,0.74l-2.03,1.89l-0.07,0.11l-0.66,1.62l-0.35,1.28l-0.48,0.51l-0.07,0.12l-0.48,1.67l-1.26,0.98l-0.1,0.15l-0.38,1.24l-0.58,1.07l-0.2,0.91l-1.43,0.7l-1.26,-0.93l-0.19,-0.06l-0.95,0.04l-0.2,0.09l-1.41,1.39l-0.61,0.02l-0.26,0.17l-1.19,2.42l-0.61,1.67Z\\\", \\\"name\\\": \\\"Nigeria\\\"}, \\\"NZ\\\": {\\\"path\\\": \\\"M857.9,379.62l1.85,3.1l0.33,0.14l0.22,-0.28l0.04,-1.41l0.57,0.4l0.35,2.06l0.17,0.22l2.02,0.94l1.78,0.26l0.22,-0.06l1.31,-1.01l0.84,0.22l-0.53,2.27l-0.67,1.5l-1.71,-0.05l-0.25,0.12l-0.67,0.89l-0.05,0.23l0.21,1.15l-0.31,0.46l-2.15,3.57l-1.6,0.99l-0.28,-0.51l-0.15,-0.13l-0.72,-0.3l1.27,-2.15l0.01,-0.29l-0.82,-1.63l-0.15,-0.14l-2.5,-1.09l0.05,-0.69l1.67,-0.94l0.15,-0.21l0.42,-2.24l-0.11,-1.95l-0.03,-0.12l-0.97,-1.85l0.05,-0.41l-0.09,-0.25l-1.18,-1.17l-1.94,-2.49l-0.86,-1.64l0.38,-0.09l1.24,1.43l0.12,0.08l1.81,0.68l0.67,2.39ZM853.93,393.55l0.57,1.24l0.44,0.12l1.51,-1.03l0.52,0.91l0.0,1.09l-0.88,1.31l-1.62,2.2l-1.26,1.2l-0.05,0.38l0.64,1.02l-1.4,0.03l-0.14,0.04l-2.14,1.16l-0.14,0.17l-0.67,2.0l-1.38,3.06l-3.07,2.19l-2.12,-0.06l-1.55,-0.99l-0.14,-0.05l-2.53,-0.2l-0.31,-0.84l1.25,-2.15l3.07,-2.97l1.62,-0.59l1.81,-1.17l2.18,-1.63l1.55,-1.65l1.08,-2.18l0.9,-0.72l0.11,-0.17l0.35,-1.56l1.37,-1.07l0.4,0.91Z\\\", \\\"name\\\": \\\"New Zealand\\\"}, \\\"NP\\\": {\\\"path\\\": \\\"M641.26,213.53l-0.14,0.95l0.32,1.64l-0.21,0.78l-1.83,0.04l-2.98,-0.62l-1.86,-0.25l-1.37,-1.3l-0.18,-0.08l-3.38,-0.34l-3.21,-1.49l-2.38,-1.34l-2.16,-0.92l0.84,-2.2l1.51,-1.18l0.89,-0.57l1.83,0.77l2.5,1.76l1.39,0.41l0.78,1.21l0.17,0.13l1.91,0.53l2.0,1.17l2.92,0.66l2.63,0.24Z\\\", \\\"name\\\": \\\"Nepal\\\"}, \\\"CI\\\": {\\\"path\\\": \\\"M413.53,272.08l-0.83,0.02l-1.79,-0.49l-1.64,0.03l-3.04,0.46l-1.73,0.72l-2.4,0.89l-0.12,-0.02l0.16,-1.7l0.19,-0.25l0.06,-0.2l-0.08,-0.99l-0.09,-0.19l-1.06,-1.05l-0.15,-0.08l-0.71,-0.15l-0.51,-0.48l0.45,-0.92l0.02,-0.19l-0.24,-1.16l0.07,-0.43l0.14,-0.0l0.3,-0.26l0.15,-1.1l-0.02,-0.15l-0.13,-0.34l0.09,-0.13l0.83,-0.27l0.19,-0.37l-0.62,-2.02l-0.55,-1.0l0.14,-0.59l0.35,-0.14l0.24,-0.16l0.53,0.29l0.14,0.04l1.93,0.02l0.26,-0.14l0.36,-0.58l0.39,0.01l0.43,-0.17l0.28,0.79l0.43,0.16l0.56,-0.31l0.89,-0.32l0.92,0.45l0.39,0.75l0.14,0.13l1.13,0.53l0.3,-0.03l0.81,-0.59l1.02,-0.08l1.49,0.57l0.62,3.33l-1.03,2.09l-0.65,2.84l0.02,0.2l1.05,2.08l-0.07,0.64Z\\\", \\\"name\\\": \\\"Ivory Coast\\\"}, \\\"CH\\\": {\\\"path\\\": \\\"M444.71,156.27l0.05,0.3l-0.34,0.69l0.13,0.4l1.13,0.58l1.07,0.1l-0.12,0.81l-0.87,0.42l-1.75,-0.37l-0.34,0.18l-0.47,1.1l-0.86,0.07l-0.33,-0.38l-0.41,-0.04l-1.34,1.01l-1.02,0.13l-0.93,-0.58l-0.82,-1.32l-0.37,-0.12l-0.77,0.32l0.02,-0.84l1.74,-1.69l0.09,-0.25l-0.04,-0.38l0.73,0.19l0.26,-0.06l0.6,-0.48l2.02,0.02l0.24,-0.12l0.38,-0.51l2.31,0.84Z\\\", \\\"name\\\": \\\"Switzerland\\\"}, \\\"CO\\\": {\\\"path\\\": \\\"M232.24,284.95l-0.94,-0.52l-1.22,-0.82l-0.31,-0.01l-0.62,0.35l-1.88,-0.31l-0.54,-0.95l-0.29,-0.15l-0.37,0.03l-2.34,-1.33l-0.15,-0.35l0.57,-0.11l0.24,-0.32l-0.1,-1.15l0.46,-0.71l1.11,-0.15l0.21,-0.13l1.05,-1.57l0.95,-1.31l-0.08,-0.43l-0.73,-0.47l0.4,-1.24l0.01,-0.16l-0.53,-2.15l0.44,-0.54l0.06,-0.24l-0.4,-2.13l-0.06,-0.13l-0.93,-1.22l0.21,-0.8l0.52,0.12l0.32,-0.13l0.47,-0.75l0.03,-0.27l-0.52,-1.32l0.09,-0.11l1.14,0.07l0.22,-0.08l1.82,-1.71l0.96,-0.25l0.22,-0.28l0.02,-0.81l0.43,-2.01l1.28,-1.04l1.48,-0.05l0.27,-0.19l0.12,-0.31l1.73,0.19l0.2,-0.05l1.96,-1.28l0.97,-0.56l1.16,-1.16l0.64,0.11l0.43,0.44l-0.31,0.55l-1.49,0.39l-0.19,0.16l-0.6,1.2l-0.97,0.74l-0.73,0.94l-0.06,0.13l-0.3,1.76l-0.68,1.44l0.23,0.43l1.1,0.14l0.27,0.97l0.08,0.13l0.49,0.49l0.17,0.85l-0.27,0.86l-0.01,0.14l0.09,0.53l0.2,0.23l0.52,0.18l0.54,0.79l0.27,0.13l3.18,-0.24l1.31,0.29l1.7,2.08l0.31,0.1l0.96,-0.26l1.75,0.13l1.41,-0.27l0.56,0.27l-0.36,1.07l-0.54,0.81l-0.05,0.13l-0.2,1.8l0.51,1.79l0.07,0.12l0.65,0.68l0.05,0.32l-1.16,1.14l0.05,0.47l0.86,0.52l0.6,0.79l0.31,1.01l-0.7,-0.81l-0.44,-0.01l-0.74,0.77l-4.75,-0.05l-0.3,0.31l0.03,1.57l0.25,0.29l1.2,0.21l-0.02,0.24l-0.1,-0.05l-0.22,-0.02l-1.41,0.41l-0.22,0.29l-0.01,1.82l0.11,0.23l1.04,0.85l0.35,1.3l-0.06,1.02l-1.02,6.26l-0.84,-0.89l-0.19,-0.09l-0.25,-0.02l1.35,-2.13l-0.1,-0.42l-1.92,-1.17l-0.2,-0.04l-1.41,0.2l-0.82,-0.39l-0.26,0.0l-1.29,0.62l-1.63,-0.27l-1.4,-2.5l-0.12,-0.12l-1.1,-0.61l-0.83,-1.2l-1.67,-1.19l-0.27,-0.04l-0.54,0.19Z\\\", \\\"name\\\": \\\"Colombia\\\"}, \\\"CN\\\": {\\\"path\\\": \\\"M740.32,148.94l0.22,0.21l4.3,1.03l2.84,2.2l0.99,2.92l0.28,0.2l3.8,0.0l0.15,-0.04l2.13,-1.24l3.5,-0.8l-1.05,2.29l-0.95,1.13l-0.06,0.12l-0.85,3.41l-1.56,2.81l-2.83,-0.51l-0.19,0.03l-2.15,1.09l-0.15,0.34l0.65,2.59l-0.33,3.3l-1.03,0.07l-0.28,0.3l0.01,0.75l-1.09,-1.2l-0.48,0.05l-0.94,1.6l-3.76,1.26l-0.2,0.36l0.29,1.19l-1.67,-0.08l-1.11,-0.88l-0.42,0.05l-1.69,2.08l-2.71,1.57l-2.04,1.88l-3.42,0.84l-0.11,0.05l-1.8,1.34l-1.54,0.46l0.52,-0.53l0.06,-0.33l-0.44,-0.96l1.84,-1.84l0.02,-0.41l-1.32,-1.56l-0.36,-0.08l-2.23,1.08l-2.83,2.06l-1.52,1.85l-2.32,0.13l-0.2,0.09l-1.28,1.37l-0.03,0.37l1.32,1.97l0.18,0.13l1.83,0.43l0.07,1.08l0.18,0.26l1.98,0.84l0.3,-0.03l2.66,-1.96l2.06,1.04l0.12,0.03l1.4,0.07l0.27,1.0l-3.24,0.73l-0.17,0.11l-1.13,1.5l-2.38,1.4l-0.1,0.1l-1.29,1.99l0.1,0.42l2.6,1.5l0.97,2.72l1.52,2.56l1.66,2.08l-0.03,1.76l-1.4,0.67l-0.15,0.38l0.6,1.47l0.13,0.15l1.29,0.75l-0.35,2.0l-0.58,1.96l-1.22,0.21l-0.2,0.14l-1.83,2.93l-2.02,3.51l-2.29,3.13l-3.4,2.42l-3.42,2.18l-2.75,0.3l-0.15,0.06l-1.32,1.01l-0.68,-0.67l-0.41,-0.01l-1.37,1.27l-3.42,1.28l-2.62,0.4l-0.24,0.21l-0.8,2.57l-0.95,0.11l-0.53,-1.54l0.52,-0.89l-0.19,-0.44l-3.36,-0.84l-0.17,0.01l-1.09,0.4l-2.36,-0.64l-1.0,-0.9l0.35,-1.34l-0.23,-0.37l-2.22,-0.47l-1.15,-0.94l-0.36,-0.02l-2.08,1.37l-2.35,0.29l-1.98,-0.01l-0.13,0.03l-1.32,0.63l-1.28,0.38l-0.21,0.33l0.33,2.65l-0.78,-0.04l-0.14,-0.39l-0.07,-1.04l-0.41,-0.26l-1.72,0.71l-0.96,-0.43l-1.63,-0.86l0.65,-1.95l-0.19,-0.38l-1.43,-0.46l-0.56,-2.27l-0.34,-0.22l-2.26,0.38l0.25,-2.65l2.29,-2.15l0.09,-0.2l0.1,-2.21l-0.07,-2.09l-0.15,-0.25l-1.02,-0.6l-0.8,-1.52l-0.31,-0.16l-1.42,0.2l-2.16,-0.32l0.55,-0.74l0.01,-0.35l-1.17,-1.7l-0.41,-0.08l-1.67,1.07l-1.97,-0.63l-0.25,0.03l-2.89,1.73l-2.26,1.99l-1.82,0.3l-1.0,-0.66l-0.15,-0.05l-1.28,-0.06l-1.75,-0.61l-0.24,0.02l-1.35,0.69l-0.1,0.08l-1.2,1.45l-0.14,-1.41l-0.4,-0.25l-1.46,0.55l-2.83,-0.26l-2.77,-0.61l-1.99,-1.17l-1.91,-0.54l-0.78,-1.21l-0.17,-0.13l-1.36,-0.38l-2.54,-1.79l-2.01,-0.84l-0.28,0.02l-0.89,0.56l-3.31,-1.83l-2.35,-1.67l-0.57,-2.49l1.34,0.28l0.36,-0.28l0.08,-1.42l-0.05,-0.19l-0.93,-1.34l0.24,-2.18l-0.07,-0.22l-2.69,-3.32l-0.15,-0.1l-3.97,-1.11l-0.69,-2.05l-0.11,-0.15l-1.79,-1.3l-0.39,-0.73l-0.36,-1.57l0.08,-1.09l-0.18,-0.3l-1.52,-0.66l-0.22,-0.01l-0.51,0.18l-0.52,-2.21l0.59,-0.55l0.06,-0.35l-0.22,-0.44l2.12,-1.24l1.63,-0.55l2.58,0.39l0.31,-0.16l0.87,-1.75l3.05,-0.34l0.21,-0.12l0.84,-1.12l3.87,-1.59l0.15,-0.14l0.35,-0.68l0.03,-0.17l-0.17,-1.51l1.52,-0.7l0.15,-0.39l-2.12,-5.0l4.62,-1.15l1.35,-0.72l0.14,-0.17l1.72,-5.37l4.7,0.99l0.28,-0.08l1.39,-1.43l0.08,-0.2l0.11,-2.95l1.83,-0.26l0.18,-0.1l1.85,-2.08l0.61,-0.17l0.57,1.97l0.1,0.15l2.2,1.75l3.48,1.17l1.59,2.36l-0.93,3.53l0.04,0.24l0.9,1.35l0.2,0.13l2.98,0.53l3.32,0.43l2.97,1.89l1.49,0.35l1.08,2.67l1.52,1.88l0.24,0.11l2.74,-0.07l5.15,0.67l3.36,-0.41l2.39,0.43l3.67,1.81l0.13,0.03l2.92,-0.0l1.02,0.86l0.34,0.03l2.88,-1.59l3.98,-1.03l3.81,-0.13l3.02,-1.12l1.77,-1.61l1.73,-1.01l0.13,-0.37l-0.41,-1.01l-0.72,-1.07l1.09,-1.66l1.21,0.24l2.57,0.63l0.24,-0.04l2.46,-1.62l3.78,-1.19l0.13,-0.09l1.8,-2.03l1.66,-0.84l3.54,-0.41l1.93,0.35l0.34,-0.22l0.27,-1.12l-0.08,-0.29l-2.27,-2.22l-2.08,-1.07l-0.29,0.01l-1.82,1.12l-2.36,-0.47l-0.14,0.01l-1.18,0.34l-0.46,-0.94l1.69,-3.08l1.1,-2.21l2.75,1.12l0.26,-0.02l3.53,-2.06l0.15,-0.26l-0.02,-1.35l2.18,-3.39l1.35,-1.04l0.12,-0.24l-0.03,-1.85l-0.15,-0.25l-1.0,-0.58l1.68,-1.37l3.01,-0.59l3.25,-0.09l3.67,0.99l2.08,1.18l1.51,3.3l0.95,1.45l0.85,1.99l0.92,3.19ZM697.0,237.37l-1.95,1.12l-1.74,-0.68l-0.06,-1.9l1.08,-1.03l2.62,-0.7l1.23,0.05l0.37,0.65l-1.01,1.08l-0.54,1.4Z\\\", \\\"name\\\": \\\"China\\\"}, \\\"CM\\\": {\\\"path\\\": \\\"M453.76,278.92l-0.26,-0.11l-0.18,-0.02l-1.42,0.31l-1.56,-0.33l-1.17,0.16l-3.7,-0.05l0.3,-1.63l-0.04,-0.21l-0.98,-1.66l-0.15,-0.13l-1.03,-0.38l-0.46,-1.01l-0.13,-0.14l-0.48,-0.27l0.02,-0.46l0.62,-1.72l1.1,-2.25l0.54,-0.02l0.2,-0.09l1.41,-1.39l0.73,-0.03l1.32,0.97l0.31,0.03l1.72,-0.85l0.16,-0.2l0.22,-1.0l0.57,-1.03l0.36,-1.18l1.26,-0.98l0.1,-0.15l0.49,-1.7l0.48,-0.51l0.07,-0.13l0.35,-1.3l0.63,-1.54l2.06,-1.92l0.09,-0.17l0.12,-0.79l0.24,-0.41l-0.04,-0.36l-0.89,-0.91l0.04,-0.45l0.28,-0.06l0.85,1.39l0.16,1.59l-0.09,1.66l0.04,0.17l1.09,1.84l-0.86,-0.02l-0.72,0.17l-1.07,-0.24l-0.34,0.17l-0.54,1.19l0.06,0.34l1.48,1.47l1.06,0.44l0.32,0.94l0.73,1.6l-0.32,0.57l-1.23,2.49l-0.54,0.41l-0.12,0.21l-0.19,1.95l0.24,1.08l-0.18,0.67l0.07,0.28l1.13,1.25l0.24,0.93l0.92,1.29l1.1,0.8l0.1,1.01l0.26,0.73l-0.12,0.93l-1.65,-0.49l-2.02,-0.66l-3.19,-0.11Z\\\", \\\"name\\\": \\\"Cameroon\\\"}, \\\"CL\\\": {\\\"path\\\": \\\"M246.8,429.1l-1.14,0.78l-2.25,1.21l-0.16,0.23l-0.37,2.94l-0.75,0.06l-2.72,-1.07l-2.83,-2.34l-3.06,-1.9l-0.71,-1.92l0.67,-1.84l-0.02,-0.25l-1.22,-2.13l-0.31,-5.41l1.02,-2.95l2.59,-2.4l-0.13,-0.51l-3.32,-0.8l2.06,-2.4l0.07,-0.15l0.79,-4.77l2.44,0.95l0.4,-0.22l1.31,-6.31l-0.16,-0.33l-1.68,-0.8l-0.42,0.21l-0.72,3.47l-1.01,-0.27l0.74,-4.06l0.85,-5.46l1.12,-1.96l0.03,-0.22l-0.71,-2.82l-0.19,-2.94l0.76,-0.07l0.26,-0.2l1.53,-4.62l1.73,-4.52l1.07,-4.2l-0.56,-4.2l0.73,-2.2l0.01,-0.12l-0.29,-3.3l1.46,-3.34l0.45,-5.19l0.8,-5.52l0.78,-5.89l-0.18,-4.33l-0.49,-3.47l1.1,-0.56l0.13,-0.13l0.44,-0.88l0.9,1.29l0.32,1.8l0.1,0.18l1.16,0.97l-0.73,2.33l0.01,0.21l1.33,2.91l0.97,3.6l0.35,0.22l1.57,-0.31l0.16,0.34l-0.79,2.51l-2.61,1.25l-0.17,0.28l0.08,4.36l-0.48,0.79l0.01,0.33l0.6,0.84l-1.62,1.55l-1.67,2.6l-0.89,2.47l-0.02,0.13l0.23,2.56l-1.5,2.76l-0.03,0.21l1.15,4.8l0.11,0.17l0.54,0.42l-0.01,2.37l-1.4,2.7l-0.03,0.15l0.06,2.25l-1.8,1.78l-0.09,0.21l0.02,2.73l0.71,2.63l-1.33,0.94l-0.12,0.17l-0.67,2.64l-0.59,3.03l0.4,3.55l-0.84,0.51l-0.14,0.31l0.58,3.5l0.08,0.16l0.96,0.99l-0.7,1.08l0.11,0.43l1.04,0.55l0.19,0.8l-0.89,0.48l-0.16,0.31l0.26,1.77l-0.89,4.06l-1.31,2.67l-0.03,0.19l0.28,1.53l-0.73,1.88l-1.85,1.37l-0.12,0.26l0.22,3.46l0.06,0.16l0.88,1.19l0.28,0.12l1.32,-0.17l-0.04,2.13l0.04,0.15l1.04,1.95l0.24,0.16l5.94,0.44ZM248.79,430.71l0.0,7.41l0.3,0.3l2.67,0.0l1.01,0.06l-0.54,0.91l-1.99,1.01l-1.13,-0.1l-1.42,-0.27l-1.87,-1.06l-2.57,-0.49l-3.09,-1.9l-2.52,-1.83l-2.65,-2.93l0.93,0.32l3.54,2.29l3.32,1.23l0.34,-0.09l1.29,-1.57l0.83,-2.32l2.11,-1.28l1.43,0.32Z\\\", \\\"name\\\": \\\"Chile\\\"}, \\\"CA\\\": {\\\"path\\\": \\\"M280.14,145.66l-1.66,2.88l0.06,0.37l0.37,0.03l1.5,-1.01l1.17,0.49l-0.64,0.83l0.13,0.46l2.22,0.89l0.28,-0.03l1.02,-0.7l2.09,0.83l-0.69,2.1l0.37,0.38l1.43,-0.45l0.27,1.43l0.74,1.88l-0.95,2.5l-0.88,0.09l-1.34,-0.48l0.49,-2.34l-0.14,-0.32l-0.7,-0.4l-0.36,0.04l-2.81,2.66l-0.63,-0.05l1.2,-1.01l-0.1,-0.52l-2.4,-0.77l-2.79,0.18l-4.65,-0.09l-0.22,-0.54l1.37,-0.99l0.01,-0.48l-0.82,-0.65l1.91,-1.79l2.57,-5.17l1.49,-1.81l2.04,-1.07l0.63,0.08l-0.27,0.51l-1.33,2.07ZM193.92,74.85l-0.01,4.24l0.19,0.28l0.33,-0.07l3.14,-3.22l2.65,2.5l-0.71,3.04l0.06,0.26l2.42,2.88l0.46,0.0l2.66,-3.14l1.83,-3.74l0.03,-0.12l0.13,-4.53l3.23,0.31l3.63,0.64l3.18,2.08l0.13,1.91l-1.79,2.22l-0.0,0.37l1.69,2.2l-0.28,1.8l-4.74,2.84l-3.33,0.62l-2.5,-1.21l-0.41,0.17l-0.73,2.05l-2.39,3.44l-0.74,1.78l-2.78,2.61l-3.48,0.26l-0.17,0.07l-1.98,1.68l-0.1,0.21l-0.15,2.33l-2.68,0.45l-0.17,0.09l-3.1,3.2l-2.75,4.38l-0.99,3.06l-0.14,4.31l0.25,0.31l3.5,0.58l1.07,3.24l1.18,2.76l0.34,0.18l3.43,-0.69l4.55,1.52l2.45,1.32l1.76,1.65l0.12,0.07l3.11,0.96l2.63,1.46l0.13,0.04l4.12,0.2l2.41,0.3l-0.36,2.81l0.8,3.51l1.81,3.78l0.08,0.1l3.73,3.17l0.34,0.03l1.93,-1.08l0.13,-0.15l1.35,-3.44l0.01,-0.18l-1.31,-5.38l-0.08,-0.14l-1.46,-1.5l3.68,-1.51l2.84,-2.46l1.45,-2.55l0.04,-0.17l-0.2,-2.39l-0.04,-0.12l-1.7,-3.07l-2.9,-2.64l2.79,-3.66l0.05,-0.27l-1.08,-3.38l-0.8,-5.75l1.45,-0.75l4.18,1.03l2.6,0.38l0.18,-0.03l1.93,-0.95l2.18,1.23l3.01,2.18l0.73,1.42l0.25,0.16l4.18,0.27l-0.06,2.95l0.83,4.7l0.22,0.24l2.19,0.55l1.75,2.08l0.38,0.07l3.63,-2.03l0.11,-0.11l2.38,-4.06l1.36,-1.43l1.76,3.01l3.26,4.68l2.68,4.19l-0.94,2.09l0.12,0.38l3.31,1.98l2.23,1.98l0.13,0.07l3.94,0.89l1.48,1.02l0.96,2.82l0.22,0.2l1.85,0.43l0.88,1.13l0.17,3.53l-1.68,1.16l-1.76,1.14l-4.08,1.17l-0.11,0.06l-3.08,2.65l-4.11,0.52l-5.35,-0.69l-3.76,-0.02l-2.62,0.23l-0.2,0.1l-2.05,2.29l-3.13,1.41l-0.11,0.08l-3.6,4.24l-2.87,2.92l-0.05,0.36l0.33,0.14l2.13,-0.52l0.15,-0.08l3.98,-4.15l5.16,-2.63l3.58,-0.31l1.82,1.3l-2.09,1.91l-0.09,0.29l0.8,3.46l0.82,2.37l0.15,0.17l3.25,1.56l0.16,0.03l4.14,-0.45l0.21,-0.12l2.03,-2.86l0.11,1.46l0.13,0.22l1.26,0.88l-2.7,1.78l-5.51,1.83l-2.52,1.26l-2.75,2.16l-1.52,-0.18l-0.08,-2.16l4.19,-2.47l0.14,-0.34l-0.3,-0.22l-4.01,0.1l-2.66,0.36l-1.45,-1.56l0.0,-4.16l-0.11,-0.23l-1.11,-0.91l-0.28,-0.05l-1.5,0.48l-0.7,-0.7l-0.45,0.02l-1.91,2.39l-0.8,2.5l-0.82,1.31l-0.95,0.43l-0.77,0.15l-0.23,0.2l-0.18,0.56l-8.2,0.02l-0.13,0.03l-1.19,0.61l-2.95,2.45l-0.78,1.13l-4.6,0.01l-0.12,0.02l-1.13,0.48l-0.13,0.44l0.37,0.55l0.2,0.82l-0.01,0.09l-3.1,1.42l-2.63,0.5l-2.84,1.57l-0.47,0.0l-0.72,-0.4l-0.18,-0.27l0.03,-0.15l0.52,-1.0l1.2,-1.71l0.73,-1.8l0.02,-0.17l-1.03,-5.47l-0.15,-0.21l-2.35,-1.32l0.16,-0.29l-0.05,-0.35l-0.37,-0.38l-0.22,-0.09l-0.56,0.0l-0.35,-0.34l-0.11,-0.65l-0.46,-0.2l-0.39,0.26l-0.2,-0.03l-0.11,-0.33l-0.48,-0.25l-0.21,-0.71l-0.15,-0.18l-3.97,-2.07l-4.8,-2.39l-0.25,-0.01l-2.19,0.89l-0.72,0.03l-3.04,-0.82l-0.14,-0.0l-1.94,0.4l-2.4,-0.98l-2.56,-0.51l-1.7,-0.19l-0.62,-0.44l-0.42,-1.67l-0.3,-0.23l-0.85,0.02l-0.29,0.3l-0.01,0.95l-69.26,-0.01l-4.77,-3.14l-1.78,-1.41l-4.51,-1.38l-1.3,-2.73l0.34,-1.96l-0.17,-0.33l-3.06,-1.37l-0.41,-2.58l-0.11,-0.18l-2.92,-2.4l-0.05,-1.53l1.32,-1.59l0.07,-0.2l-0.07,-2.21l-0.16,-0.26l-4.19,-2.22l-2.52,-4.02l-1.56,-2.6l-0.08,-0.09l-2.28,-1.64l-1.65,-1.48l-1.31,-1.89l-0.38,-0.1l-2.51,1.21l-2.28,1.92l-2.03,-2.22l-1.85,-1.71l-2.44,-1.04l-2.28,-0.12l0.03,-37.72l4.27,0.98l4.0,2.13l2.61,0.4l0.24,-0.07l2.17,-1.81l2.92,-1.33l3.63,0.53l0.18,-0.03l3.72,-1.94l3.89,-1.06l1.6,1.72l0.37,0.06l1.87,-1.04l0.14,-0.19l0.48,-1.83l1.37,0.38l4.18,3.96l0.41,0.0l2.89,-2.62l0.28,2.79l0.37,0.26l3.08,-0.73l0.17,-0.12l0.85,-1.16l2.81,0.24l3.83,1.86l5.86,1.61l3.46,0.75l2.44,-0.26l2.89,1.89l-3.12,1.89l-0.14,0.31l0.24,0.24l4.53,0.92l6.84,-0.5l2.04,-0.71l2.54,2.44l0.39,0.02l2.72,-2.16l-0.01,-0.48l-2.26,-1.61l1.27,-1.16l2.94,-0.19l1.94,-0.42l1.89,0.97l2.49,2.32l0.24,0.08l2.71,-0.33l4.35,1.9l0.17,0.02l3.86,-0.67l3.62,0.1l0.31,-0.33l-0.26,-2.44l1.9,-0.65l3.58,1.36l-0.01,3.84l0.23,0.29l0.34,-0.17l1.51,-3.23l1.81,0.1l0.31,-0.22l1.13,-4.37l-0.08,-0.29l-2.68,-2.73l-2.83,-1.76l0.19,-4.73l2.77,-3.15l3.06,0.69l2.44,1.97l3.24,4.88l-2.05,2.02l0.15,0.51l4.41,0.85ZM265.85,150.7l-0.84,0.04l-3.15,-0.99l-1.77,-1.17l0.19,-0.06l3.17,0.79l2.39,1.27l0.01,0.12ZM249.41,3.71l6.68,0.49l5.34,0.79l4.34,1.6l-0.08,1.24l-5.91,2.56l-6.03,1.21l-2.36,1.38l-0.14,0.34l0.29,0.22l4.37,-0.02l-4.96,3.01l-4.06,1.64l-0.11,0.08l-4.21,4.62l-5.07,0.92l-0.12,0.05l-1.53,1.1l-7.5,0.59l-0.28,0.28l0.24,0.31l2.67,0.54l-1.04,0.6l-0.09,0.44l1.89,2.49l-2.11,1.66l-3.83,1.52l-0.15,0.13l-1.14,2.01l-3.41,1.55l-0.16,0.36l0.35,1.19l0.3,0.22l3.98,-0.19l0.03,0.78l-6.42,2.99l-6.44,-1.41l-7.41,0.79l-3.72,-0.62l-4.48,-0.26l-0.25,-2.0l4.37,-1.13l0.21,-0.38l-1.14,-3.55l1.13,-0.28l6.61,2.29l0.35,-0.12l-0.04,-0.37l-3.41,-3.45l-0.14,-0.08l-3.57,-0.92l1.62,-1.7l4.36,-1.3l0.2,-0.18l0.71,-1.94l-0.12,-0.36l-3.45,-2.15l-0.88,-2.43l6.36,0.23l1.94,0.61l0.23,-0.02l3.91,-2.1l0.15,-0.32l-0.26,-0.24l-5.69,-0.67l-8.69,0.37l-4.3,-1.92l-2.12,-2.39l-2.82,-1.68l-0.44,-1.65l3.41,-1.06l2.93,-0.2l4.91,-0.99l3.69,-2.28l2.93,0.31l2.64,1.68l0.42,-0.1l1.84,-3.23l3.17,-0.96l4.45,-0.69l7.56,-0.26l1.26,0.64l0.18,0.03l7.2,-1.06l10.81,0.8ZM203.94,57.59l0.01,0.32l1.97,2.97l0.51,-0.01l2.26,-3.75l6.05,-1.89l4.08,4.72l-0.36,2.95l0.38,0.33l4.95,-1.36l0.11,-0.05l2.23,-1.77l5.37,2.31l3.32,2.14l0.3,1.89l0.36,0.25l4.48,-1.01l2.49,2.8l0.14,0.09l5.99,1.78l2.09,1.74l2.18,3.83l-4.29,1.91l-0.01,0.54l5.9,2.83l3.95,0.94l3.54,3.84l0.2,0.1l3.58,0.25l-0.67,2.51l-4.18,4.54l-2.84,-1.61l-3.91,-3.95l-0.26,-0.09l-3.24,0.52l-0.25,0.26l-0.32,2.37l0.1,0.26l2.63,2.38l3.42,1.89l0.96,1.0l1.57,3.8l-0.74,2.43l-2.85,-0.96l-6.26,-3.15l-0.38,0.09l0.04,0.39l3.54,3.4l2.55,2.31l0.23,0.78l-6.26,-1.43l-5.33,-2.25l-2.73,-1.73l0.67,-0.86l-0.09,-0.45l-7.38,-4.01l-0.44,0.27l0.03,0.89l-6.85,0.61l-1.8,-1.17l1.43,-2.6l4.56,-0.07l5.15,-0.52l0.23,-0.45l-0.76,-1.34l0.8,-1.89l3.21,-4.06l0.05,-0.29l-0.72,-1.95l-0.97,-1.47l-0.11,-0.1l-3.84,-2.1l-4.53,-1.33l1.09,-0.75l0.05,-0.45l-2.65,-2.75l-0.18,-0.09l-2.12,-0.24l-1.91,-1.47l-0.39,0.02l-1.27,1.25l-4.4,0.56l-9.06,-0.99l-5.28,-1.31l-4.01,-0.67l-1.72,-1.31l2.32,-1.85l0.1,-0.33l-0.28,-0.2l-3.3,-0.02l-0.74,-4.36l1.86,-4.09l2.46,-1.88l5.74,-1.15l-1.5,2.55ZM261.28,159.28l0.19,0.14l1.82,0.42l1.66,-0.05l-0.66,0.68l-0.75,0.16l-3.0,-1.25l-0.46,-0.77l0.51,-0.52l0.68,1.19ZM230.87,84.48l-2.48,0.19l-0.52,-1.74l0.96,-2.17l2.03,-0.53l1.71,1.04l0.02,1.6l-0.22,0.46l-1.5,1.16ZM229.52,58.19l0.14,0.82l-4.99,-0.22l-2.73,0.63l-0.59,-0.23l-2.61,-2.4l0.08,-1.38l0.94,-0.25l5.61,0.51l4.14,2.54ZM222.12,105.0l-0.79,1.63l-0.75,-0.22l-0.52,-0.91l0.04,-0.09l0.84,-1.01l0.74,0.06l0.44,0.55ZM183.77,38.22l2.72,1.65l0.16,0.04l4.83,-0.01l1.92,1.52l-0.51,1.75l0.18,0.36l2.84,1.14l1.56,1.19l0.16,0.06l3.37,0.22l3.65,0.42l4.07,-1.1l5.05,-0.43l3.96,0.35l2.53,1.8l0.48,1.79l-1.37,1.16l-3.6,1.03l-3.22,-0.59l-7.17,0.76l-5.1,0.09l-4.0,-0.6l-6.48,-1.56l-0.81,-2.57l-0.3,-2.49l-0.1,-0.19l-2.51,-2.25l-0.16,-0.07l-5.12,-0.63l-2.61,-1.45l0.75,-1.71l4.88,0.32ZM207.46,91.26l0.42,1.62l0.42,0.19l1.12,-0.55l1.35,0.99l2.74,1.39l2.73,1.2l0.2,1.74l0.35,0.26l1.72,-0.29l1.31,0.97l-1.72,0.96l-3.68,-0.9l-1.34,-1.71l-0.43,-0.04l-2.46,2.1l-3.23,1.85l-0.74,-1.98l-0.31,-0.19l-2.47,0.28l1.49,-1.34l0.1,-0.19l0.32,-3.15l0.79,-3.45l1.34,0.25ZM215.59,102.66l-2.73,2.0l-1.49,-0.08l-0.37,-0.7l1.61,-1.56l3.0,0.03l-0.02,0.3ZM202.79,24.07l0.11,0.12l2.54,1.53l-3.01,1.47l-4.55,4.07l-4.3,0.38l-5.07,-0.68l-2.51,-2.09l0.03,-1.72l1.86,-1.4l0.1,-0.34l-0.29,-0.2l-4.49,0.04l-2.63,-1.79l-1.45,-2.36l1.61,-2.38l1.65,-1.69l2.47,-0.4l0.19,-0.48l-0.72,-0.89l5.1,-0.26l3.1,3.05l0.13,0.07l4.21,1.25l3.99,1.06l1.92,3.65ZM187.5,59.3l-0.15,0.1l-2.59,3.4l-2.5,-0.15l-1.47,-3.92l0.04,-2.24l1.22,-1.92l2.34,-1.26l5.11,0.17l4.28,1.06l-3.36,3.86l-2.9,0.9ZM186.19,48.8l-1.15,1.63l-3.42,-0.35l-2.68,-1.15l1.11,-1.88l3.34,-1.27l2.01,1.63l0.79,1.38ZM185.78,35.41l-0.95,0.13l-4.48,-0.33l-0.4,-0.91l4.5,0.07l1.45,0.82l-0.1,0.21ZM180.76,32.56l-3.43,1.03l-1.85,-1.14l-1.01,-1.92l-0.16,-1.87l2.87,0.2l1.39,0.35l2.75,1.75l-0.55,1.6ZM181.03,76.32l-1.21,1.2l-3.19,-1.26l-0.18,-0.01l-1.92,0.45l-2.88,-1.67l1.84,-1.16l1.6,-1.77l2.45,1.17l1.45,0.77l2.05,2.28ZM169.72,54.76l2.83,0.97l0.14,0.01l4.25,-0.58l0.47,1.01l-2.19,2.16l0.07,0.48l3.61,1.95l-0.41,3.84l-3.87,1.68l-2.23,-0.36l-1.73,-1.75l-6.07,-3.53l0.03,-1.01l4.79,0.55l0.3,-0.16l-0.04,-0.34l-2.55,-2.89l2.59,-2.05ZM174.44,40.56l1.49,1.87l0.07,2.48l-1.07,3.52l-3.87,0.48l-2.41,-0.72l0.05,-2.72l-0.33,-0.3l-3.79,0.36l-0.13,-3.31l2.36,0.14l0.15,-0.03l3.7,-1.74l3.44,0.29l0.31,-0.22l0.03,-0.12ZM170.14,31.5l0.75,1.74l-3.52,-0.52l-4.19,-1.77l-4.65,-0.17l1.65,-1.11l-0.05,-0.52l-2.86,-1.26l-0.13,-1.58l4.52,0.7l6.66,1.99l1.84,2.5ZM134.64,58.08l-1.08,1.93l0.34,0.44l5.44,-1.41l3.37,2.32l0.37,-0.02l2.66,-2.28l2.03,1.38l2.01,4.53l0.53,0.04l1.26,-1.93l0.03,-0.27l-1.67,-4.55l1.82,-0.58l2.36,0.73l2.69,1.84l1.53,4.46l0.77,3.24l0.15,0.19l4.22,2.26l4.32,2.04l-0.21,1.51l-3.87,0.34l-0.19,0.5l1.45,1.54l-0.65,1.23l-4.3,-0.65l-4.4,-1.19l-2.97,0.28l-4.67,1.48l-6.31,0.65l-4.27,0.39l-1.26,-1.91l-0.15,-0.12l-3.42,-1.2l-0.16,-0.01l-2.05,0.45l-2.66,-3.02l1.2,-0.34l3.82,-0.76l3.58,0.19l3.27,-0.78l0.23,-0.29l-0.24,-0.29l-4.84,-1.06l-5.42,0.35l-3.4,-0.09l-0.97,-1.22l5.39,-1.7l0.21,-0.33l-0.3,-0.25l-3.82,0.06l-3.95,-1.1l1.88,-3.13l1.68,-1.81l6.54,-2.84l2.11,0.77ZM158.85,56.58l-1.82,2.62l-3.38,-2.9l0.49,-0.39l3.17,-0.18l1.54,0.86ZM149.71,42.7l1.0,1.87l0.37,0.14l2.17,-0.83l2.33,0.2l0.38,2.16l-1.38,2.17l-8.33,0.76l-6.34,2.15l-3.51,0.1l-0.22,-1.13l4.98,-2.12l0.17,-0.34l-0.31,-0.23l-11.27,0.6l-3.04,-0.78l3.14,-4.57l2.2,-1.35l6.87,1.7l4.4,3.0l0.14,0.05l4.37,0.39l0.27,-0.48l-3.41,-4.68l1.96,-1.62l2.28,0.53l0.79,2.32ZM145.44,29.83l-2.18,0.77l-3.79,-0.0l0.02,-0.31l2.34,-1.5l1.2,0.23l2.42,0.83ZM144.83,34.5l-4.44,1.46l-3.18,-1.48l1.6,-1.36l3.51,-0.53l3.1,0.75l-0.6,1.16ZM119.02,65.87l-6.17,2.07l-1.19,-1.82l-0.13,-0.11l-5.48,-2.32l0.92,-1.7l1.73,-3.44l2.16,-3.15l-0.02,-0.36l-2.09,-2.56l7.84,-0.71l3.59,1.02l6.32,0.27l2.35,1.37l2.25,1.71l-2.68,1.04l-6.21,3.41l-3.1,3.28l-0.08,0.21l0.0,1.81ZM129.66,35.4l-0.3,3.55l-1.77,1.67l-2.34,0.27l-4.62,2.2l-3.89,0.76l-2.83,-0.93l3.85,-3.52l5.04,-3.36l3.75,0.07l3.11,-0.7ZM111.24,152.74l-0.82,0.29l-3.92,-1.39l-0.7,-1.06l-0.12,-0.1l-2.15,-1.09l-0.41,-0.84l-0.2,-0.16l-2.44,-0.56l-0.84,-1.56l0.1,-0.36l2.34,0.64l1.53,0.5l2.28,0.34l0.78,1.04l1.24,1.55l0.09,0.08l2.42,1.3l0.81,1.39ZM88.54,134.82l0.14,0.02l2.0,-0.23l-0.67,3.48l0.06,0.24l1.78,2.22l-0.24,-0.0l-1.4,-1.42l-0.91,-1.53l-1.26,-1.08l-0.42,-1.35l0.09,-0.66l0.82,0.31Z\\\", \\\"name\\\": \\\"Canada\\\"}, \\\"CG\\\": {\\\"path\\\": \\\"M453.66,296.61l-0.9,-0.82l-0.35,-0.04l-0.83,0.48l-0.77,0.83l-1.65,-2.13l1.66,-1.2l0.08,-0.39l-0.81,-1.43l0.59,-0.43l1.62,-0.29l0.24,-0.24l0.1,-0.58l0.94,0.84l0.19,0.08l2.21,0.11l0.27,-0.14l0.81,-1.29l0.32,-1.76l-0.27,-1.96l-0.06,-0.15l-1.08,-1.35l1.02,-2.74l-0.09,-0.34l-0.62,-0.5l-0.22,-0.06l-1.66,0.18l-0.55,-1.03l0.12,-0.73l2.85,0.09l1.98,0.65l2.0,0.59l0.38,-0.25l0.17,-1.3l1.26,-2.24l1.34,-1.19l1.54,0.38l1.35,0.12l-0.11,1.15l-0.74,1.34l-0.5,1.61l-0.31,2.22l0.12,1.41l-0.4,0.9l-0.06,0.88l-0.24,0.67l-1.57,1.15l-1.24,1.41l-1.09,2.43l-0.03,0.13l0.08,1.95l-0.55,0.69l-1.46,1.23l-1.32,1.41l-0.61,-0.29l-0.13,-0.57l-0.29,-0.23l-1.36,-0.02l-0.23,0.1l-0.72,0.81l-0.41,-0.16Z\\\", \\\"name\\\": \\\"Republic of the Congo\\\"}, \\\"CF\\\": {\\\"path\\\": \\\"M459.41,266.56l1.9,-0.17l0.22,-0.12l0.36,-0.5l0.14,0.02l0.55,0.51l0.29,0.07l3.15,-0.96l0.12,-0.07l1.05,-0.97l1.29,-0.87l0.12,-0.33l-0.17,-0.61l0.38,-0.12l2.36,0.15l0.15,-0.03l2.36,-1.17l0.12,-0.1l1.78,-2.72l1.18,-0.96l1.23,-0.34l0.21,0.79l0.07,0.13l1.37,1.5l0.01,0.86l-0.39,1.0l-0.01,0.17l0.16,0.78l0.1,0.17l0.91,0.76l1.89,1.09l1.24,0.92l0.02,0.67l0.12,0.23l1.67,1.3l0.99,1.03l0.61,1.46l0.14,0.15l1.79,0.95l0.2,0.4l-0.44,0.14l-1.54,-0.06l-1.98,-0.26l-0.93,0.22l-0.19,0.14l-0.3,0.48l-0.57,0.05l-0.91,-0.49l-0.26,-0.01l-2.7,1.21l-1.04,-0.23l-0.21,0.03l-0.34,0.19l-0.12,0.13l-0.64,1.3l-1.67,-0.43l-1.77,-0.24l-1.58,-0.91l-2.06,-0.85l-0.27,0.02l-1.42,0.88l-0.97,1.27l-0.06,0.14l-0.19,1.46l-1.3,-0.11l-1.67,-0.42l-0.27,0.07l-1.55,1.41l-0.99,1.76l-0.14,-1.18l-0.13,-0.22l-1.1,-0.78l-0.86,-1.2l-0.2,-0.84l-0.07,-0.13l-1.07,-1.19l0.16,-0.59l0.0,-0.15l-0.24,-1.01l0.18,-1.77l0.5,-0.38l0.09,-0.11l1.18,-2.4Z\\\", \\\"name\\\": \\\"Central African Republic\\\"}, \\\"CD\\\": {\\\"path\\\": \\\"M497.85,276.25l-0.14,2.77l0.2,0.3l0.57,0.19l-0.47,0.52l-1.0,0.71l-0.96,1.31l-0.56,1.22l-0.16,2.04l-0.54,0.89l-0.04,0.15l-0.02,1.76l-0.63,0.61l-0.09,0.2l-0.08,1.33l-0.2,0.11l-0.15,0.21l-0.23,1.37l0.03,0.2l0.6,1.08l0.16,2.96l0.44,2.29l-0.24,1.25l0.01,0.15l0.5,1.46l0.07,0.12l1.41,1.37l1.09,2.56l-0.51,-0.11l-3.45,0.45l-0.67,0.3l-0.15,0.15l-0.71,1.61l0.01,0.26l0.52,1.03l-0.43,2.9l-0.31,2.55l0.13,0.29l0.7,0.46l1.75,0.99l0.31,-0.01l0.26,-0.17l0.15,1.9l-1.44,-0.02l-0.94,-1.28l-0.94,-1.1l-0.17,-0.1l-1.76,-0.33l-0.5,-1.18l-0.42,-0.15l-1.44,0.75l-1.79,-0.32l-0.77,-1.05l-0.2,-0.12l-1.59,-0.23l-0.97,0.04l-0.1,-0.53l-0.27,-0.25l-0.86,-0.06l-1.13,-0.15l-1.62,0.37l-1.04,-0.06l-0.32,0.09l0.11,-2.56l-0.08,-0.21l-0.77,-0.87l-0.17,-1.41l0.36,-1.47l-0.03,-0.21l-0.48,-0.91l-0.04,-1.52l-0.3,-0.29l-2.65,0.02l0.13,-0.53l-0.29,-0.37l-1.28,0.01l-0.28,0.21l-0.07,0.24l-1.35,0.09l-0.26,0.18l-0.62,1.45l-0.25,0.42l-1.17,-0.3l-0.19,0.01l-0.79,0.34l-1.44,0.18l-1.41,-1.96l-0.7,-1.47l-0.61,-1.86l-0.28,-0.21l-7.39,-0.03l-0.92,0.3l-0.78,-0.03l-0.78,0.25l-0.11,-0.25l0.35,-0.15l0.18,-0.26l0.07,-1.02l0.33,-0.52l0.72,-0.42l0.52,0.2l0.33,-0.08l0.76,-0.86l0.99,0.02l0.11,0.48l0.16,0.2l0.94,0.44l0.35,-0.07l1.46,-1.56l1.44,-1.21l0.68,-0.85l0.06,-0.2l-0.08,-1.99l1.04,-2.33l1.1,-1.23l1.62,-1.19l0.11,-0.14l0.29,-0.8l0.08,-0.94l0.38,-0.82l0.03,-0.16l-0.13,-1.38l0.3,-2.16l0.47,-1.51l0.73,-1.31l0.04,-0.12l0.15,-1.51l0.21,-1.66l0.89,-1.16l1.16,-0.7l1.9,0.79l1.69,0.95l1.81,0.24l1.85,0.48l0.35,-0.16l0.71,-1.43l0.16,-0.09l1.03,0.23l0.19,-0.02l2.65,-1.19l0.86,0.46l0.17,0.03l0.81,-0.08l0.23,-0.14l0.31,-0.5l0.75,-0.17l1.83,0.26l1.64,0.06l0.72,-0.21l1.39,1.9l0.16,0.11l1.12,0.3l0.24,-0.04l0.58,-0.36l1.05,0.15l0.15,-0.02l1.15,-0.44l0.47,0.84l0.08,0.09l2.08,1.57Z\\\", \\\"name\\\": \\\"Democratic Republic of the Congo\\\"}, \\\"CZ\\\": {\\\"path\\\": \\\"M463.29,152.22l-0.88,-0.47l-0.18,-0.03l-1.08,0.15l-1.86,-0.94l-0.21,-0.02l-0.88,0.24l-0.13,0.07l-1.25,1.17l-1.63,-0.91l-1.38,-1.36l-1.22,-0.75l-0.24,-1.24l-0.33,-0.75l1.53,-0.6l0.98,-0.84l1.74,-0.62l0.11,-0.07l0.47,-0.47l0.46,0.27l0.24,0.03l0.96,-0.3l1.06,0.95l0.15,0.07l1.57,0.24l-0.1,0.6l0.16,0.32l1.36,0.68l0.41,-0.15l0.28,-0.62l1.29,0.28l0.19,0.84l0.26,0.23l1.73,0.18l0.74,1.02l-0.17,0.0l-0.25,0.13l-0.32,0.49l-0.46,0.11l-0.22,0.23l-0.13,0.57l-0.32,0.1l-0.2,0.22l-0.03,0.14l-0.65,0.25l-1.05,-0.05l-0.28,0.17l-0.22,0.43Z\\\", \\\"name\\\": \\\"Czech Republic\\\"}, \\\"CY\\\": {\\\"path\\\": \\\"M505.03,193.75l-1.51,0.68l-1.0,-0.3l-0.32,-0.63l0.69,-0.06l0.41,0.13l0.19,-0.0l0.62,-0.22l0.31,0.02l0.06,0.22l0.49,0.17l0.06,-0.01Z\\\", \\\"name\\\": \\\"Cyprus\\\"}, \\\"CR\\\": {\\\"path\\\": \\\"M213.0,263.84l-0.98,-0.4l-0.3,-0.31l0.16,-0.24l0.05,-0.21l-0.09,-0.56l-0.1,-0.18l-0.76,-0.65l-0.99,-0.5l-0.74,-0.28l-0.13,-0.58l-0.12,-0.18l-0.66,-0.45l-0.34,-0.0l-0.13,0.31l0.13,0.59l-0.17,0.21l-0.34,-0.42l-0.14,-0.1l-0.7,-0.22l-0.23,-0.34l0.01,-0.62l0.31,-0.74l-0.14,-0.38l-0.3,-0.15l0.47,-0.4l1.48,0.6l0.26,-0.02l0.47,-0.27l0.58,0.15l0.35,0.44l0.17,0.11l0.74,0.17l0.27,-0.07l0.3,-0.27l0.52,1.09l0.97,1.02l0.77,0.71l-0.41,0.1l-0.23,0.3l0.01,1.02l0.12,0.24l0.2,0.14l-0.07,0.05l-0.11,0.3l0.08,0.37l-0.23,0.63Z\\\", \\\"name\\\": \\\"Costa Rica\\\"}, \\\"CU\\\": {\\\"path\\\": \\\"M215.01,226.09l2.08,0.18l1.94,0.03l2.24,0.86l0.95,0.92l0.25,0.08l2.22,-0.28l0.79,0.55l3.68,2.81l0.19,0.06l0.77,-0.03l1.18,0.42l-0.12,0.47l0.27,0.37l1.78,0.1l1.59,0.9l-0.11,0.22l-1.5,0.3l-1.64,0.13l-1.75,-0.2l-2.69,0.19l1.0,-0.86l-0.03,-0.48l-1.02,-0.68l-0.13,-0.05l-1.52,-0.16l-0.74,-0.64l-0.57,-1.42l-0.3,-0.19l-1.36,0.1l-2.23,-0.67l-0.71,-0.52l-0.14,-0.06l-3.2,-0.4l-0.42,-0.25l0.56,-0.39l0.12,-0.33l-0.27,-0.22l-2.46,-0.13l-0.2,0.06l-1.72,1.31l-0.94,0.03l-0.25,0.15l-0.29,0.53l-1.04,0.24l-0.29,-0.07l0.7,-0.43l0.1,-0.11l0.5,-0.87l1.04,-0.54l1.23,-0.49l1.86,-0.25l0.62,-0.28Z\\\", \\\"name\\\": \\\"Cuba\\\"}, \\\"SZ\\\": {\\\"path\\\": \\\"M500.95,353.41l-0.41,0.97l-1.16,0.23l-1.29,-1.26l-0.02,-0.71l0.63,-0.93l0.23,-0.7l0.47,-0.12l1.04,0.4l0.32,1.05l0.2,1.08Z\\\", \\\"name\\\": \\\"Swaziland\\\"}, \\\"SY\\\": {\\\"path\\\": \\\"M510.84,199.83l0.09,-0.11l0.07,-0.2l-0.04,-1.08l0.56,-1.4l1.3,-1.01l0.1,-0.34l-0.41,-1.11l-0.24,-0.19l-0.89,-0.11l-0.2,-1.84l0.55,-1.05l1.3,-1.22l0.09,-0.19l0.09,-1.09l0.39,0.27l0.25,0.04l2.66,-0.77l1.35,0.52l2.06,-0.01l2.93,-1.08l1.35,0.04l2.14,-0.34l-0.83,1.16l-1.31,0.68l-0.16,0.3l0.23,2.03l-0.9,3.25l-5.43,2.87l-4.79,2.91l-2.32,-0.92Z\\\", \\\"name\\\": \\\"Syria\\\"}, \\\"KG\\\": {\\\"path\\\": \\\"M599.04,172.15l0.38,-0.9l1.43,-0.37l4.04,1.02l0.37,-0.23l0.36,-1.64l1.17,-0.52l3.45,1.24l0.2,-0.0l0.86,-0.31l4.09,0.08l3.61,0.31l1.18,1.02l0.11,0.06l1.19,0.34l-0.13,0.26l-3.84,1.58l-0.13,0.1l-0.81,1.08l-3.08,0.34l-0.24,0.16l-0.85,1.7l-2.43,-0.37l-0.14,0.01l-1.79,0.61l-2.39,1.4l-0.12,0.39l0.25,0.49l-0.48,0.45l-4.57,0.43l-3.04,-0.94l-2.45,0.18l0.14,-1.02l2.42,0.44l0.27,-0.08l0.81,-0.81l1.76,0.27l0.21,-0.05l3.21,-2.14l-0.03,-0.51l-2.97,-1.57l-0.26,-0.01l-1.64,0.69l-1.38,-0.84l1.81,-1.67l-0.09,-0.5l-0.46,-0.18Z\\\", \\\"name\\\": \\\"Kyrgyzstan\\\"}, \\\"KE\\\": {\\\"path\\\": \\\"M523.3,287.04l0.06,0.17l1.29,1.8l-1.46,0.84l-0.11,0.11l-0.55,0.93l-0.81,0.16l-0.24,0.24l-0.34,1.69l-0.81,1.06l-0.46,1.58l-0.76,0.63l-3.3,-2.3l-0.16,-1.32l-0.15,-0.23l-9.35,-5.28l-0.02,-2.4l1.92,-2.63l0.91,-1.83l0.01,-0.24l-1.09,-2.86l-0.29,-1.24l-1.09,-1.63l2.93,-2.85l0.92,0.3l0.0,1.19l0.09,0.22l0.86,0.83l0.21,0.08l1.65,0.0l3.09,2.08l0.16,0.05l0.79,0.03l0.54,-0.06l0.58,0.28l1.67,0.2l0.28,-0.12l0.69,-0.98l2.04,-0.94l0.86,0.73l0.19,0.07l1.1,0.0l-1.82,2.36l-0.06,0.18l0.03,9.12Z\\\", \\\"name\\\": \\\"Kenya\\\"}, \\\"SS\\\": {\\\"path\\\": \\\"M505.7,261.39l0.02,1.64l-0.27,0.55l-1.15,0.05l-0.24,0.15l-0.85,1.44l0.22,0.45l1.44,0.17l1.15,1.12l0.42,0.95l0.14,0.15l1.06,0.54l1.33,2.45l-3.06,2.98l-1.44,1.08l-1.75,0.01l-1.92,0.56l-1.5,-0.53l-0.27,0.03l-0.85,0.57l-1.98,-1.5l-0.56,-1.02l-0.37,-0.13l-1.32,0.5l-1.08,-0.15l-0.2,0.04l-0.56,0.35l-0.9,-0.24l-1.44,-1.97l-0.39,-0.77l-0.13,-0.13l-1.78,-0.94l-0.65,-1.5l-1.08,-1.12l-1.57,-1.22l-0.02,-0.68l-0.12,-0.23l-1.37,-1.02l-1.17,-0.68l0.2,-0.08l0.86,-0.48l0.14,-0.18l0.63,-2.22l0.6,-1.02l1.47,-0.28l0.35,0.56l1.29,1.48l0.14,0.09l0.69,0.22l0.22,-0.02l0.83,-0.4l1.58,0.08l0.26,0.39l0.25,0.13l2.49,0.0l0.3,-0.25l0.06,-0.35l1.13,-0.42l0.18,-0.18l0.22,-0.63l0.68,-0.38l1.95,1.37l0.23,0.05l1.29,-0.26l0.19,-0.12l1.23,-1.8l1.36,-1.37l0.08,-0.25l-0.21,-1.52l-0.06,-0.15l-0.25,-0.3l0.94,-0.08l0.26,-0.21l0.1,-0.32l0.6,0.09l-0.25,1.67l0.3,1.83l0.11,0.19l1.22,0.94l0.25,0.73l-0.04,1.2l0.26,0.31l0.09,0.01Z\\\", \\\"name\\\": \\\"South Sudan\\\"}, \\\"SR\\\": {\\\"path\\\": \\\"M278.1,270.26l2.71,0.45l0.31,-0.14l0.19,-0.32l1.82,-0.16l2.25,0.56l-1.09,1.81l-0.04,0.19l0.2,1.72l0.05,0.13l0.9,1.35l-0.39,0.99l-0.21,1.09l-0.48,0.8l-1.2,-0.44l-0.17,-0.01l-1.12,0.24l-0.95,-0.21l-0.35,0.2l-0.25,0.73l0.05,0.29l0.3,0.35l-0.06,0.13l-1.01,-0.15l-1.42,-2.03l-0.32,-1.36l-0.29,-0.23l-0.63,-0.0l-0.95,-1.56l0.41,-1.16l0.01,-0.17l-0.08,-0.35l1.29,-0.56l0.18,-0.22l0.35,-1.97Z\\\", \\\"name\\\": \\\"Suriname\\\"}, \\\"KH\\\": {\\\"path\\\": \\\"M680.28,257.89l-0.93,-1.2l-1.24,-2.56l-0.56,-2.9l1.45,-1.92l3.07,-0.46l2.26,0.35l2.03,0.98l0.38,-0.11l1.0,-1.55l1.86,0.79l0.52,1.51l-0.28,2.82l-4.05,1.88l-0.12,0.45l0.79,1.1l-2.2,0.17l-2.08,0.98l-1.89,-0.33Z\\\", \\\"name\\\": \\\"Cambodia\\\"}, \\\"SV\\\": {\\\"path\\\": \\\"M197.02,248.89l0.18,-0.05l0.59,0.17l0.55,0.51l0.64,0.35l0.06,0.22l0.37,0.21l1.01,-0.28l0.38,0.13l0.16,0.13l-0.14,0.81l-0.18,0.38l-1.22,-0.03l-0.84,-0.23l-1.11,-0.52l-1.31,-0.15l-0.49,-0.38l0.02,-0.08l0.76,-0.57l0.46,-0.27l0.11,-0.35Z\\\", \\\"name\\\": \\\"El Salvador\\\"}, \\\"SK\\\": {\\\"path\\\": \\\"M468.01,150.02l0.05,0.07l0.36,0.1l0.85,-0.37l1.12,1.02l0.33,0.05l1.38,-0.65l1.07,0.3l0.16,0.0l1.69,-0.43l1.95,1.02l-0.51,0.64l-0.45,1.2l-0.32,0.2l-2.55,-0.93l-0.17,-0.01l-0.82,0.2l-0.17,0.11l-0.53,0.68l-0.94,0.32l-0.14,-0.11l-0.29,-0.04l-1.18,0.48l-0.95,0.09l-0.26,0.21l-0.15,0.47l-1.84,0.34l-0.82,-0.31l-1.14,-0.73l-0.2,-0.89l0.42,-0.84l0.91,0.05l0.12,-0.02l0.86,-0.33l0.18,-0.21l0.03,-0.13l0.32,-0.1l0.2,-0.22l0.12,-0.55l0.39,-0.1l0.18,-0.13l0.3,-0.45l0.43,-0.0Z\\\", \\\"name\\\": \\\"Slovakia\\\"}, \\\"KR\\\": {\\\"path\\\": \\\"M737.31,185.72l0.84,0.08l0.27,-0.12l0.89,-1.2l1.63,-0.13l1.1,-0.2l0.21,-0.16l0.12,-0.24l1.86,2.95l0.59,1.79l0.02,3.17l-0.84,1.38l-2.23,0.55l-1.95,1.14l-1.91,0.21l-0.22,-1.21l0.45,-2.07l-0.01,-0.17l-0.99,-2.67l1.54,-0.4l0.17,-0.46l-1.55,-2.24Z\\\", \\\"name\\\": \\\"South Korea\\\"}, \\\"SI\\\": {\\\"path\\\": \\\"M455.77,159.59l1.79,0.21l0.18,-0.04l1.2,-0.68l2.12,-0.08l0.21,-0.1l0.38,-0.42l0.1,0.01l0.28,0.62l-1.71,0.71l-0.18,0.22l-0.21,1.1l-0.71,0.26l-0.2,0.28l0.01,0.55l-0.59,-0.04l-0.79,-0.47l-0.38,0.06l-0.36,0.41l-0.84,-0.05l0.05,-0.15l-0.56,-1.24l0.21,-1.17Z\\\", \\\"name\\\": \\\"Slovenia\\\"}, \\\"KP\\\": {\\\"path\\\": \\\"M747.76,172.02l-0.23,-0.04l-0.26,0.08l-1.09,1.02l-0.78,1.06l-0.06,0.19l0.09,1.95l-1.12,0.57l-0.53,0.58l-0.88,0.82l-1.69,0.51l-1.09,0.79l-0.12,0.22l-0.07,1.17l-0.22,0.25l0.09,0.47l0.96,0.46l1.22,1.1l-0.19,0.37l-0.91,0.16l-1.75,0.14l-0.22,0.12l-0.87,1.18l-0.95,-0.09l-0.3,0.18l-0.97,-0.44l-0.39,0.13l-0.25,0.44l-0.29,0.09l-0.03,-0.2l-0.18,-0.23l-0.62,-0.25l-0.43,-0.29l0.52,-0.97l0.52,-0.3l0.13,-0.38l-0.18,-0.42l0.59,-1.47l0.01,-0.21l-0.16,-0.48l-0.22,-0.2l-1.41,-0.31l-0.82,-0.55l1.74,-1.62l2.73,-1.58l1.62,-1.96l0.96,0.76l0.17,0.06l2.17,0.11l0.31,-0.37l-0.32,-1.31l3.61,-1.21l0.16,-0.13l0.79,-1.34l1.25,1.38Z\\\", \\\"name\\\": \\\"North Korea\\\"}, \\\"SO\\\": {\\\"path\\\": \\\"M543.8,256.48l0.61,-0.05l1.14,-0.37l1.31,-0.25l0.12,-0.05l1.11,-0.81l0.57,-0.0l0.03,0.39l-0.23,1.49l0.01,1.25l-0.52,0.92l-0.7,2.71l-1.19,2.79l-1.54,3.2l-2.13,3.66l-2.12,2.79l-2.92,3.39l-2.47,2.0l-3.76,2.5l-2.33,1.9l-2.77,3.06l-0.61,1.35l-0.28,0.29l-1.22,-1.69l-0.03,-8.92l2.12,-2.76l0.59,-0.68l1.47,-0.04l0.18,-0.06l2.15,-1.71l3.16,-0.11l0.21,-0.09l7.08,-7.55l1.76,-2.12l1.14,-1.57l0.06,-0.18l0.01,-4.67Z\\\", \\\"name\\\": \\\"Somalia\\\"}, \\\"SN\\\": {\\\"path\\\": \\\"M379.28,250.34l-0.95,-1.82l-0.09,-0.1l-0.83,-0.6l0.62,-0.28l0.13,-0.11l1.21,-1.8l0.6,-1.31l0.71,-0.68l1.09,0.2l0.18,-0.02l1.17,-0.53l1.25,-0.03l1.17,0.73l1.59,0.65l1.47,1.83l1.59,1.7l0.12,1.56l0.49,1.46l0.1,0.14l0.85,0.65l0.18,0.82l-0.08,0.57l-0.13,0.05l-1.29,-0.19l-0.29,0.13l-0.11,0.16l-0.35,0.04l-1.83,-0.61l-5.84,-0.13l-0.12,0.02l-0.6,0.26l-0.87,-0.06l-1.01,0.32l-0.26,-1.26l1.9,0.04l0.16,-0.04l0.54,-0.32l0.37,-0.02l0.15,-0.05l0.78,-0.5l0.92,0.46l0.12,0.03l1.09,0.04l0.15,-0.03l1.08,-0.57l0.11,-0.44l-0.51,-0.74l-0.39,-0.1l-0.76,0.39l-0.62,-0.01l-0.92,-0.58l-0.18,-0.05l-0.79,0.04l-0.2,0.09l-0.48,0.51l-2.41,0.06Z\\\", \\\"name\\\": \\\"Senegal\\\"}, \\\"SL\\\": {\\\"path\\\": \\\"M392.19,267.53l-0.44,-0.12l-1.73,-0.97l-1.24,-1.28l-0.4,-0.84l-0.27,-1.65l1.21,-1.0l0.09,-0.12l0.27,-0.66l0.32,-0.41l0.56,-0.05l0.16,-0.07l0.5,-0.41l1.75,0.0l0.59,0.77l0.49,0.96l-0.07,0.64l0.04,0.19l0.36,0.58l-0.03,0.84l0.24,0.2l-0.64,0.65l-1.13,1.37l-0.06,0.14l-0.12,0.66l-0.43,0.58Z\\\", \\\"name\\\": \\\"Sierra Leone\\\"}, \\\"SB\\\": {\\\"path\\\": \\\"M826.74,311.51l0.23,0.29l-0.95,-0.01l-0.39,-0.63l0.65,0.27l0.45,0.09ZM825.01,308.52l-1.18,-1.39l-0.37,-1.06l0.24,0.0l0.82,1.84l0.49,0.6ZM823.21,309.42l-0.44,0.03l-1.43,-0.24l-0.32,-0.24l0.08,-0.5l1.29,0.31l0.72,0.47l0.11,0.18ZM817.9,303.81l2.59,1.44l0.3,0.41l-1.21,-0.66l-1.34,-0.89l-0.34,-0.3ZM813.77,302.4l0.48,0.34l0.1,0.08l-0.33,-0.17l-0.25,-0.25Z\\\", \\\"name\\\": \\\"Solomon Islands\\\"}, \\\"SA\\\": {\\\"path\\\": \\\"M528.24,243.1l-0.2,-0.69l-0.07,-0.12l-0.69,-0.71l-0.18,-0.94l-0.12,-0.19l-1.24,-0.89l-1.28,-2.09l-0.7,-2.08l-0.07,-0.11l-1.73,-1.79l-0.11,-0.07l-1.03,-0.39l-1.57,-2.36l-0.27,-1.72l0.1,-1.53l-0.03,-0.15l-1.44,-2.93l-1.25,-1.13l-1.34,-0.56l-0.72,-1.33l0.11,-0.49l-0.02,-0.2l-0.7,-1.38l-0.08,-0.1l-0.68,-0.56l-0.97,-1.98l-2.8,-4.03l-0.25,-0.13l-0.85,0.01l0.29,-1.11l0.12,-0.97l0.23,-0.81l2.52,0.39l0.23,-0.06l1.08,-0.84l0.6,-0.95l1.78,-0.35l0.22,-0.17l0.37,-0.83l0.74,-0.42l0.08,-0.46l-2.17,-2.4l4.55,-1.26l0.12,-0.06l0.36,-0.32l2.83,0.71l3.67,1.91l7.04,5.5l0.17,0.06l4.64,0.22l2.06,0.24l0.55,1.15l0.28,0.17l1.56,-0.06l0.9,2.15l0.14,0.15l1.14,0.57l0.39,0.85l0.11,0.13l1.59,1.06l0.12,0.91l-0.23,0.83l0.01,0.18l0.32,0.9l0.07,0.11l0.68,0.7l0.33,0.86l0.37,0.65l0.09,0.1l0.76,0.53l0.25,0.04l0.45,-0.12l0.35,0.75l0.1,0.63l0.96,2.68l0.23,0.19l7.53,1.33l0.27,-0.09l0.24,-0.26l0.87,1.41l-1.58,4.96l-7.34,2.54l-7.28,1.02l-2.34,1.17l-0.12,0.1l-1.74,2.63l-0.86,0.32l-0.49,-0.68l-0.28,-0.12l-0.92,0.12l-2.32,-0.25l-0.41,-0.23l-0.15,-0.04l-2.89,0.06l-0.63,0.2l-0.91,-0.59l-0.43,0.11l-0.66,1.27l-0.03,0.21l0.21,0.89l-0.6,0.45Z\\\", \\\"name\\\": \\\"Saudi Arabia\\\"}, \\\"SE\\\": {\\\"path\\\": \\\"M476.42,90.44l-0.15,0.1l-2.43,2.86l-0.07,0.24l0.36,2.31l-3.84,3.1l-4.83,3.38l-0.11,0.15l-1.82,5.45l0.03,0.26l1.78,2.68l2.27,1.99l-2.13,3.88l-2.49,0.82l-0.2,0.24l-0.95,6.05l-1.32,3.09l-2.82,-0.32l-0.3,0.16l-1.34,2.64l-2.48,0.14l-0.76,-3.15l-2.09,-4.04l-1.85,-5.01l1.03,-1.98l2.06,-2.53l0.06,-0.13l0.83,-4.45l-0.06,-0.25l-1.54,-1.86l-0.15,-5.0l1.52,-3.48l2.28,0.06l0.27,-0.16l0.87,-1.59l-0.01,-0.31l-0.8,-1.21l3.79,-5.63l4.07,-7.54l2.23,0.01l0.29,-0.22l0.59,-2.15l4.46,0.66l0.34,-0.26l0.34,-2.64l1.21,-0.14l3.24,2.08l3.78,2.85l0.06,6.37l0.03,0.14l0.67,1.29l-3.95,1.07Z\\\", \\\"name\\\": \\\"Sweden\\\"}, \\\"SD\\\": {\\\"path\\\": \\\"M505.98,259.75l-0.31,-0.9l-0.1,-0.14l-1.2,-0.93l-0.27,-1.66l0.29,-1.83l-0.25,-0.34l-1.16,-0.17l-0.33,0.21l-0.11,0.37l-1.3,0.11l-0.21,0.49l0.55,0.68l0.18,1.29l-1.31,1.33l-1.18,1.72l-1.04,0.21l-2.0,-1.4l-0.32,-0.02l-0.95,0.52l-0.14,0.16l-0.21,0.6l-1.16,0.43l-0.19,0.23l-0.04,0.27l-2.08,0.0l-0.25,-0.39l-0.24,-0.13l-1.81,-0.09l-0.14,0.03l-0.8,0.38l-0.49,-0.16l-1.22,-1.39l-0.42,-0.67l-0.31,-0.14l-1.81,0.35l-0.2,0.14l-0.72,1.24l-0.61,2.14l-0.73,0.4l-0.62,0.22l-0.83,-0.68l-0.12,-0.6l0.38,-0.97l0.01,-1.14l-0.08,-0.2l-1.39,-1.53l-0.25,-0.97l0.03,-0.57l-0.11,-0.25l-0.81,-0.66l-0.03,-1.34l-0.04,-0.14l-0.52,-0.98l-0.31,-0.15l-0.42,0.07l0.12,-0.44l0.63,-1.03l0.03,-0.23l-0.24,-0.88l0.69,-0.66l0.02,-0.41l-0.4,-0.46l0.58,-1.39l1.04,-1.71l1.97,0.16l0.32,-0.3l-0.12,-10.24l0.02,-0.8l2.59,-0.01l0.3,-0.3l0.0,-4.92l29.19,0.0l0.68,2.17l-0.4,0.35l-0.1,0.27l0.36,2.69l0.93,3.15l0.12,0.16l2.05,1.4l-0.99,1.15l-1.75,0.4l-0.15,0.08l-0.79,0.79l-0.08,0.17l-0.24,1.69l-1.07,3.75l-0.0,0.16l0.25,0.96l-0.38,2.1l-0.98,2.41l-1.52,1.3l-1.07,1.94l-0.25,0.99l-1.08,0.64l-0.13,0.18l-0.46,1.65Z\\\", \\\"name\\\": \\\"Sudan\\\"}, \\\"DO\\\": {\\\"path\\\": \\\"M241.7,234.97l0.15,-0.22l1.73,0.01l1.43,0.64l0.15,0.03l0.45,-0.04l0.36,0.74l0.28,0.17l1.02,-0.04l-0.04,0.43l0.27,0.33l1.03,0.09l0.91,0.7l-0.57,0.64l-0.99,-0.47l-0.16,-0.03l-1.11,0.11l-0.79,-0.12l-0.26,0.09l-0.38,0.4l-0.66,0.11l-0.28,-0.45l-0.38,-0.12l-0.83,0.37l-0.14,0.13l-0.85,1.49l-0.27,-0.17l-0.1,-0.58l0.05,-0.67l-0.07,-0.21l-0.44,-0.53l0.35,-0.25l0.12,-0.19l0.19,-1.0l-0.2,-1.4Z\\\", \\\"name\\\": \\\"Dominican Republic\\\"}, \\\"DJ\\\": {\\\"path\\\": \\\"M528.78,253.36l0.34,0.45l-0.06,0.76l-1.26,0.54l-0.05,0.53l0.82,0.53l-0.57,0.83l-0.3,-0.25l-0.27,-0.05l-0.56,0.17l-1.07,-0.03l-0.04,-0.56l-0.16,-0.56l0.76,-1.07l0.76,-0.97l0.89,0.18l0.25,-0.06l0.51,-0.42Z\\\", \\\"name\\\": \\\"Djibouti\\\"}, \\\"DK\\\": {\\\"path\\\": \\\"M452.4,129.07l-1.27,2.39l-2.25,-1.69l-0.26,-1.08l3.15,-1.0l0.63,1.39ZM447.87,126.25l-0.35,0.76l-0.47,-0.24l-0.38,0.09l-1.8,2.53l-0.03,0.29l0.56,1.4l-1.22,0.4l-1.68,-0.41l-0.92,-1.76l-0.07,-3.47l0.38,-0.88l0.62,-0.93l2.07,-0.21l0.19,-0.1l0.84,-0.95l1.5,-0.76l-0.06,1.26l-0.7,1.1l-0.03,0.25l0.3,1.0l0.18,0.19l1.06,0.42Z\\\", \\\"name\\\": \\\"Denmark\\\"}, \\\"DE\\\": {\\\"path\\\": \\\"M445.51,131.69l0.03,0.94l0.21,0.28l2.32,0.74l-0.02,1.0l0.37,0.3l2.55,-0.65l1.36,-0.89l2.63,1.27l1.09,1.01l0.51,1.51l-0.6,0.78l-0.0,0.36l0.88,1.17l0.58,1.68l-0.18,1.08l0.03,0.18l0.87,1.81l-0.66,0.2l-0.55,-0.32l-0.36,0.05l-0.58,0.58l-1.73,0.62l-0.99,0.84l-1.77,0.7l-0.16,0.4l0.42,0.94l0.26,1.34l0.14,0.2l1.25,0.76l1.22,1.2l-0.71,1.2l-0.81,0.37l-0.17,0.32l0.34,1.99l-0.04,0.09l-0.47,-0.39l-0.17,-0.07l-1.2,-0.1l-1.85,0.57l-2.15,-0.13l-0.29,0.18l-0.21,0.5l-0.96,-0.67l-0.24,-0.05l-0.67,0.16l-2.6,-0.94l-0.34,0.1l-0.42,0.57l-1.64,-0.02l0.26,-1.88l1.24,-2.15l-0.21,-0.45l-3.54,-0.58l-0.98,-0.71l0.12,-1.26l-0.05,-0.2l-0.44,-0.64l0.27,-2.18l-0.38,-3.14l1.17,-0.0l0.27,-0.17l0.63,-1.26l0.65,-3.17l-0.02,-0.17l-0.41,-1.0l0.32,-0.47l1.77,-0.16l0.37,0.6l0.47,0.06l1.7,-1.69l0.06,-0.33l-0.55,-1.24l-0.09,-1.51l1.5,0.36l0.16,-0.01l1.22,-0.4Z\\\", \\\"name\\\": \\\"Germany\\\"}, \\\"YE\\\": {\\\"path\\\": \\\"M553.53,242.65l-1.51,0.58l-0.17,0.16l-0.48,1.14l-0.07,0.79l-2.31,1.0l-3.98,1.19l-2.28,1.8l-0.97,0.12l-0.7,-0.14l-0.23,0.05l-1.42,1.03l-1.51,0.47l-2.07,0.13l-0.68,0.15l-0.17,0.1l-0.49,0.6l-0.57,0.16l-0.18,0.13l-0.3,0.49l-1.06,-0.05l-0.13,0.02l-0.73,0.32l-1.48,-0.11l-0.55,-1.26l0.07,-1.32l-0.04,-0.16l-0.39,-0.72l-0.48,-1.85l-0.52,-0.79l0.08,-0.02l0.22,-0.36l-0.23,-1.05l0.24,-0.39l0.04,-0.19l-0.09,-0.95l0.96,-0.72l0.11,-0.31l-0.23,-0.98l0.46,-0.88l0.75,0.49l0.26,0.03l0.63,-0.22l2.76,-0.06l0.5,0.25l2.42,0.26l0.85,-0.11l0.52,0.71l0.35,0.1l1.17,-0.43l0.15,-0.12l1.75,-2.64l2.22,-1.11l6.95,-0.96l2.55,5.58Z\\\", \\\"name\\\": \\\"Yemen\\\"}, \\\"AT\\\": {\\\"path\\\": \\\"M463.17,154.15l-0.14,0.99l-1.15,0.01l-0.24,0.47l0.39,0.56l-0.75,1.84l-0.36,0.4l-2.06,0.07l-0.14,0.04l-1.18,0.67l-1.96,-0.23l-3.43,-0.78l-0.5,-0.97l-0.33,-0.16l-2.47,0.55l-0.2,0.16l-0.18,0.37l-1.27,-0.38l-1.28,-0.09l-0.81,-0.41l0.25,-0.51l0.03,-0.18l-0.05,-0.28l0.35,-0.08l1.16,0.81l0.45,-0.13l0.27,-0.64l2.0,0.12l1.84,-0.57l1.05,0.09l0.71,0.59l0.47,-0.11l0.23,-0.54l0.02,-0.17l-0.32,-1.85l0.69,-0.31l0.13,-0.12l0.73,-1.23l1.61,0.89l0.35,-0.04l1.35,-1.27l0.7,-0.19l1.84,0.93l0.18,0.03l1.08,-0.15l0.81,0.43l-0.07,0.15l-0.02,0.2l0.24,1.06Z\\\", \\\"name\\\": \\\"Austria\\\"}, \\\"DZ\\\": {\\\"path\\\": \\\"M450.58,224.94l-8.31,4.86l-7.23,5.12l-3.46,1.13l-2.42,0.22l-0.02,-1.33l-0.2,-0.28l-1.15,-0.42l-1.45,-0.69l-0.55,-1.13l-0.1,-0.12l-8.45,-5.72l-17.72,-12.17l0.03,-0.38l-0.02,-3.21l3.84,-1.91l2.46,-0.41l2.1,-0.75l0.14,-0.11l0.9,-1.3l2.84,-1.06l0.19,-0.27l0.09,-1.81l1.21,-0.2l0.15,-0.07l1.06,-0.96l3.19,-0.46l0.23,-0.18l0.46,-1.08l-0.08,-0.34l-0.6,-0.54l-0.83,-2.85l-0.18,-1.8l-0.82,-1.57l2.13,-1.37l2.65,-0.49l0.13,-0.05l1.55,-1.15l2.34,-0.85l4.2,-0.51l4.07,-0.23l1.21,0.41l0.23,-0.01l2.3,-1.11l2.52,-0.02l0.94,0.62l0.2,0.05l1.25,-0.13l-0.36,1.03l-0.01,0.14l0.39,2.66l-0.56,2.2l-1.49,1.52l-0.08,0.24l0.22,2.12l0.11,0.2l1.94,1.58l0.02,0.54l0.12,0.23l1.45,1.06l1.04,4.85l0.81,2.42l0.13,1.19l-0.43,2.17l0.17,1.28l-0.31,1.53l0.2,1.56l-0.9,1.02l-0.01,0.38l1.43,1.88l0.09,1.06l0.04,0.13l0.89,1.48l0.37,0.12l1.03,-0.43l1.79,1.12l0.89,1.34Z\\\", \\\"name\\\": \\\"Algeria\\\"}, \\\"US\\\": {\\\"path\\\": \\\"M892.64,99.05l1.16,0.57l0.21,0.02l1.45,-0.38l1.92,0.99l2.17,0.47l-1.65,0.72l-1.75,-0.79l-0.93,-0.7l-0.21,-0.06l-2.11,0.22l-0.35,-0.2l0.09,-0.87ZM183.29,150.37l0.39,1.54l0.12,0.17l0.78,0.55l0.14,0.05l1.74,0.2l2.52,0.5l2.4,0.98l0.17,0.02l1.96,-0.4l3.01,0.81l0.91,-0.02l2.22,-0.88l4.67,2.33l3.86,2.01l0.21,0.71l0.15,0.18l0.33,0.17l-0.02,0.05l0.23,0.43l0.67,0.1l0.21,-0.05l0.1,-0.07l0.05,0.29l0.09,0.16l0.5,0.5l0.21,0.09l0.56,0.0l0.13,0.13l-0.2,0.36l0.12,0.41l2.49,1.39l0.99,5.24l-0.69,1.68l-1.16,1.64l-0.6,1.18l-0.06,0.31l0.04,0.22l0.28,0.43l0.11,0.1l0.85,0.47l0.15,0.04l0.63,0.0l0.14,-0.04l2.87,-1.58l2.6,-0.49l3.28,-1.5l0.17,-0.23l0.04,-0.43l-0.23,-0.93l-0.24,-0.39l0.74,-0.32l4.7,-0.01l0.25,-0.13l0.77,-1.15l2.9,-2.41l1.04,-0.52l8.35,-0.02l0.28,-0.21l0.2,-0.6l0.7,-0.14l1.06,-0.48l0.13,-0.11l0.92,-1.49l0.75,-2.39l1.67,-2.08l0.59,0.6l0.3,0.07l1.52,-0.49l0.88,0.72l-0.0,4.14l0.08,0.2l1.6,1.72l0.31,0.72l-2.42,1.35l-2.55,1.05l-2.64,0.9l-0.14,0.11l-1.33,1.81l-0.44,0.7l-0.05,0.15l-0.03,1.6l0.03,0.14l0.83,1.59l0.24,0.16l0.78,0.06l-1.15,0.33l-1.25,-0.04l-1.83,0.52l-2.51,0.29l-2.17,0.88l-0.17,0.36l0.33,0.22l3.55,-0.54l0.15,0.11l-2.87,0.73l-1.19,0.0l-0.16,-0.33l-0.36,0.06l-0.76,0.82l0.17,0.5l0.42,0.08l-0.45,1.75l-1.4,1.74l-0.04,-0.17l-0.21,-0.22l-0.48,-0.13l-0.77,-0.69l-0.36,-0.03l-0.12,0.34l0.52,1.58l0.09,0.14l0.52,0.43l0.03,0.87l-0.74,1.05l-0.39,0.63l0.05,-0.12l-0.08,-0.34l-1.19,-1.03l-0.28,-2.31l-0.26,-0.26l-0.32,0.19l-0.48,1.27l-0.01,0.19l0.39,1.33l-1.14,-0.31l-0.36,0.18l0.14,0.38l1.57,0.85l0.1,2.58l0.22,0.28l0.55,0.15l0.21,0.81l0.33,2.72l-1.46,1.94l-2.5,0.81l-0.12,0.07l-1.58,1.58l-1.15,0.17l-0.15,0.06l-1.27,1.03l-0.09,0.13l-0.32,0.85l-2.71,1.79l-1.45,1.37l-1.18,1.64l-0.05,0.12l-0.39,1.96l0.0,0.13l0.44,1.91l0.85,2.37l1.1,1.91l0.03,1.2l1.16,3.07l-0.08,1.74l-0.1,0.99l-0.57,1.48l-0.54,0.24l-0.97,-0.26l-0.34,-1.02l-0.12,-0.16l-0.89,-0.58l-2.44,-4.28l-0.34,-0.94l0.49,-1.71l-0.02,-0.21l-0.7,-1.5l-2.0,-2.35l-0.11,-0.08l-0.98,-0.42l-0.25,0.01l-2.42,1.19l-0.26,-0.08l-1.26,-1.29l-1.57,-0.68l-0.16,-0.02l-2.79,0.34l-2.18,-0.3l-1.98,0.19l-1.12,0.45l-0.14,0.44l0.4,0.65l-0.04,1.02l0.09,0.22l0.29,0.3l-0.06,0.05l-0.77,-0.33l-0.26,0.01l-0.87,0.48l-1.64,-0.08l-1.79,-1.39l-0.23,-0.06l-2.11,0.33l-1.75,-0.61l-0.14,-0.01l-1.61,0.2l-2.11,0.64l-0.11,0.06l-2.25,1.99l-2.53,1.21l-1.43,1.38l-0.58,1.22l-0.03,0.12l-0.03,1.86l0.13,1.32l0.3,0.62l-0.46,0.04l-1.71,-0.57l-1.85,-0.79l-0.63,-1.14l-0.54,-1.85l-0.07,-0.12l-1.45,-1.51l-0.86,-1.58l-1.26,-1.87l-0.09,-0.09l-1.76,-1.09l-0.17,-0.04l-2.05,0.05l-0.23,0.12l-1.44,1.97l-1.84,-0.72l-1.19,-0.76l-0.6,-1.45l-0.9,-1.52l-1.49,-1.21l-1.27,-0.87l-0.89,-0.96l-0.22,-0.1l-4.34,-0.0l-0.3,0.3l-0.0,0.84l-6.62,0.02l-5.66,-1.93l-3.48,-1.24l0.11,-0.25l-0.3,-0.42l-3.18,0.3l-2.6,0.2l-0.35,-1.19l-0.08,-0.13l-1.62,-1.61l-0.13,-0.08l-1.02,-0.29l-0.22,-0.66l-0.25,-0.2l-1.31,-0.13l-0.82,-0.7l-0.16,-0.07l-2.25,-0.27l-0.48,-0.34l-0.28,-1.44l-0.07,-0.14l-2.41,-2.84l-2.03,-3.89l0.08,-0.58l-0.1,-0.27l-1.08,-0.94l-1.87,-2.36l-0.33,-2.31l-0.07,-0.15l-1.24,-1.5l0.52,-2.4l-0.09,-2.57l-0.78,-2.3l0.96,-2.83l0.61,-5.66l-0.46,-4.26l-0.79,-2.71l-0.68,-1.4l0.13,-0.26l3.24,0.97l1.28,2.88l0.52,0.06l0.62,-0.84l0.06,-0.22l-0.4,-2.61l-0.74,-2.29l68.9,-0.0l0.3,-0.3l0.01,-0.95l0.32,-0.01ZM32.5,67.43l1.75,1.99l0.41,0.04l1.02,-0.81l3.79,0.25l-0.1,0.72l0.24,0.34l3.83,0.77l2.6,-0.44l5.21,1.41l4.84,0.43l1.9,0.57l0.15,0.01l3.25,-0.71l3.72,1.32l2.52,0.58l-0.03,38.14l0.29,0.3l2.41,0.11l2.34,1.0l1.7,1.59l2.22,2.42l0.42,0.03l2.41,-2.04l2.25,-1.08l1.23,1.76l1.71,1.53l2.24,1.62l1.54,2.56l2.56,4.09l0.11,0.11l4.1,2.17l0.06,1.93l-1.12,1.35l-1.22,-1.14l-2.08,-1.05l-0.68,-2.94l-0.09,-0.16l-3.18,-2.84l-1.32,-3.35l-0.25,-0.19l-2.43,-0.24l-3.93,-0.09l-2.85,-1.02l-5.24,-3.85l-6.77,-2.04l-3.52,0.3l-4.84,-1.7l-2.96,-1.6l-0.23,-0.02l-2.78,0.8l-0.21,0.35l0.46,2.31l-1.11,0.19l-2.9,0.78l-2.24,1.26l-2.42,0.68l-0.29,-1.79l1.07,-3.49l2.54,-1.11l0.12,-0.45l-0.69,-0.96l-0.41,-0.07l-3.19,2.12l-1.76,2.54l-3.57,2.62l-0.03,0.46l1.63,1.59l-2.14,2.38l-2.64,1.49l-2.49,1.09l-0.16,0.17l-0.58,1.48l-3.8,1.79l-0.14,0.14l-0.75,1.57l-2.75,1.41l-1.62,-0.25l-0.16,0.02l-2.35,0.98l-2.54,1.19l-2.06,1.15l-4.05,0.93l-0.1,-0.15l2.45,-1.45l2.49,-1.1l2.61,-1.88l3.03,-0.39l0.19,-0.1l1.2,-1.41l3.43,-2.11l0.61,-0.75l1.81,-1.24l0.13,-0.2l0.42,-2.7l1.24,-2.12l-0.03,-0.35l-0.34,-0.09l-2.73,1.05l-0.67,-0.53l-0.39,0.02l-1.13,1.11l-1.43,-1.62l-0.49,0.06l-0.41,0.8l-0.67,-1.31l-0.42,-0.12l-2.43,1.43l-1.18,-0.0l-0.18,-1.86l0.43,-1.3l-0.09,-0.33l-1.61,-1.33l-0.26,-0.06l-3.11,0.68l-2.0,-1.66l-1.61,-0.85l-0.01,-1.97l-0.11,-0.23l-1.76,-1.48l0.86,-1.96l2.01,-2.13l0.88,-1.94l1.79,-0.25l1.65,0.6l0.31,-0.06l1.91,-1.8l1.67,0.31l0.22,-0.04l1.91,-1.23l0.13,-0.33l-0.47,-1.82l-0.15,-0.19l-1.0,-0.52l1.51,-1.27l0.09,-0.34l-0.29,-0.19l-1.62,0.06l-2.66,0.88l-0.13,0.09l-0.62,0.72l-1.77,-0.8l-0.16,-0.02l-3.48,0.44l-3.5,-0.92l-1.06,-1.61l-2.78,-2.09l3.07,-1.51l5.52,-2.01l1.65,0.0l-0.28,1.73l0.31,0.35l5.29,-0.16l0.23,-0.49l-2.03,-2.59l-0.1,-0.08l-3.03,-1.58l-1.79,-2.12l-2.4,-1.83l-3.18,-1.27l1.13,-1.84l4.28,-0.14l0.15,-0.05l3.16,-2.0l0.13,-0.17l0.57,-2.07l2.43,-2.02l2.42,-0.52l4.67,-1.98l2.22,0.29l0.2,-0.04l3.74,-2.37l3.57,0.91ZM37.66,123.49l-2.31,1.26l-1.04,-0.75l-0.31,-1.35l2.06,-1.16l1.24,-0.51l1.48,0.22l0.76,0.81l-1.89,1.49ZM30.89,233.84l1.2,0.57l0.35,0.3l0.48,0.69l-1.6,0.86l-0.3,0.31l-0.24,-0.14l0.05,-0.54l-0.02,-0.15l-0.36,-0.83l0.05,-0.12l0.39,-0.38l0.07,-0.31l-0.09,-0.27ZM29.06,231.89l0.5,0.14l0.31,0.19l-0.46,0.1l-0.34,-0.43ZM25.02,230.13l0.2,-0.11l0.4,0.47l-0.43,-0.05l-0.17,-0.31ZM21.29,228.68l0.1,-0.07l0.22,0.02l0.02,0.21l-0.02,0.02l-0.32,-0.18ZM6.0,113.33l-1.19,0.45l-1.5,-0.64l-0.94,-0.63l1.76,-0.46l1.71,0.29l0.16,0.98Z\\\", \\\"name\\\": \\\"United States of America\\\"}, \\\"LV\\\": {\\\"path\\\": \\\"M473.99,127.16l0.07,-2.15l1.15,-2.11l2.05,-1.07l1.84,2.48l0.25,0.12l2.01,-0.07l0.29,-0.25l0.45,-2.58l1.85,-0.56l0.98,0.4l2.13,1.33l0.16,0.05l1.97,0.01l1.02,0.7l0.21,1.67l0.71,1.84l-2.44,1.23l-1.36,0.53l-2.28,-1.62l-0.12,-0.05l-1.18,-0.2l-0.28,-0.6l-0.31,-0.17l-2.43,0.35l-4.17,-0.23l-0.12,0.02l-2.45,0.93Z\\\", \\\"name\\\": \\\"Latvia\\\"}, \\\"UY\\\": {\\\"path\\\": \\\"M276.9,363.17l1.3,-0.23l2.4,2.04l0.22,0.07l0.82,-0.07l2.48,1.7l1.93,1.5l1.28,1.67l-0.95,1.14l-0.04,0.31l0.63,1.45l-0.96,1.57l-2.65,1.47l-1.73,-0.53l-0.15,-0.01l-1.25,0.28l-2.22,-1.16l-0.16,-0.03l-1.56,0.08l-1.33,-1.36l0.17,-1.58l0.48,-0.55l0.07,-0.2l-0.02,-2.74l0.66,-2.8l0.57,-2.02Z\\\", \\\"name\\\": \\\"Uruguay\\\"}, \\\"LB\\\": {\\\"path\\\": \\\"M510.44,198.11l-0.48,0.03l-0.26,0.17l-0.15,0.32l-0.21,-0.0l0.72,-1.85l1.19,-1.9l0.74,0.09l0.27,0.73l-1.19,0.93l-0.09,0.13l-0.54,1.36Z\\\", \\\"name\\\": \\\"Lebanon\\\"}, \\\"LA\\\": {\\\"path\\\": \\\"M684.87,248.8l0.61,-0.86l0.05,-0.16l0.11,-2.17l-0.08,-0.22l-1.96,-2.16l-0.15,-2.44l-0.08,-0.18l-1.9,-2.1l-0.19,-0.1l-1.89,-0.18l-0.29,0.15l-0.42,0.76l-1.21,0.06l-0.67,-0.41l-0.31,-0.0l-2.2,1.29l-0.05,-1.77l0.61,-2.7l-0.27,-0.37l-1.44,-0.1l-0.12,-1.31l-0.12,-0.21l-0.87,-0.65l0.38,-0.68l1.76,-1.41l0.08,0.22l0.27,0.2l1.33,0.07l0.31,-0.34l-0.35,-2.75l0.85,-0.25l1.32,1.88l1.11,2.36l0.27,0.17l2.89,0.02l0.78,1.82l-1.32,0.56l-0.12,0.09l-0.72,0.93l0.1,0.45l2.93,1.52l3.62,5.27l1.88,1.78l0.58,1.67l-0.38,2.11l-1.87,-0.79l-0.37,0.11l-0.99,1.54l-1.51,-0.73Z\\\", \\\"name\\\": \\\"Laos\\\"}, \\\"TW\\\": {\\\"path\\\": \\\"M725.6,222.5l-1.5,4.22l-0.82,1.65l-1.01,-1.7l-0.26,-1.8l1.4,-2.48l1.8,-1.81l0.76,0.53l-0.38,1.39Z\\\", \\\"name\\\": \\\"Taiwan\\\"}, \\\"TT\\\": {\\\"path\\\": \\\"M266.35,259.46l0.41,-0.39l0.09,-0.23l-0.04,-0.75l1.14,-0.26l0.2,0.03l-0.07,1.37l-1.73,0.23Z\\\", \\\"name\\\": \\\"Trinidad and Tobago\\\"}, \\\"TR\\\": {\\\"path\\\": \\\"M513.25,175.38l3.63,1.17l0.14,0.01l2.88,-0.45l2.11,0.26l0.18,-0.03l2.9,-1.53l2.51,-0.13l2.25,1.37l0.36,0.88l-0.23,1.36l0.19,0.33l1.81,0.72l0.61,0.53l-1.31,0.64l-0.16,0.34l0.76,3.24l-0.44,0.8l0.01,0.3l1.19,2.02l-0.71,0.29l-0.74,-0.62l-0.15,-0.07l-2.91,-0.37l-0.15,0.02l-1.04,0.43l-2.78,0.44l-1.44,-0.03l-2.83,1.06l-1.95,0.01l-1.28,-0.52l-0.2,-0.01l-2.62,0.76l-0.7,-0.48l-0.47,0.22l-0.13,1.49l-1.01,0.94l-0.58,-0.82l0.79,-0.9l0.04,-0.34l-0.31,-0.15l-1.46,0.23l-2.03,-0.64l-0.3,0.07l-1.65,1.58l-3.58,0.3l-1.94,-1.47l-0.17,-0.06l-2.7,-0.1l-0.28,0.17l-0.51,1.06l-1.47,0.29l-2.32,-1.46l-0.17,-0.05l-2.55,0.05l-1.4,-2.7l-1.72,-1.54l1.11,-2.06l-0.07,-0.37l-1.35,-1.19l2.47,-2.51l3.74,-0.11l0.26,-0.17l0.96,-2.07l4.56,0.38l0.19,-0.05l2.97,-1.92l2.84,-0.83l4.03,-0.06l4.31,2.08ZM488.85,176.8l-1.81,1.38l-0.57,-1.01l0.02,-0.36l0.45,-0.25l0.13,-0.15l0.78,-1.87l-0.11,-0.37l-0.72,-0.47l1.91,-0.71l1.89,0.35l0.25,0.97l0.17,0.2l1.87,0.83l-0.19,0.31l-2.82,0.16l-0.18,0.07l-1.06,0.91Z\\\", \\\"name\\\": \\\"Turkey\\\"}, \\\"LK\\\": {\\\"path\\\": \\\"M625.44,266.07l-0.35,2.4l-0.9,0.61l-1.91,0.5l-1.04,-1.75l-0.43,-3.5l1.0,-3.6l1.34,1.09l1.13,1.72l1.16,2.52Z\\\", \\\"name\\\": \\\"Sri Lanka\\\"}, \\\"TN\\\": {\\\"path\\\": \\\"M444.91,206.18l-0.99,-4.57l-0.12,-0.18l-1.43,-1.04l-0.02,-0.53l-0.11,-0.22l-1.95,-1.59l-0.19,-1.85l1.44,-1.47l0.08,-0.14l0.59,-2.34l-0.38,-2.77l0.44,-1.28l2.52,-1.08l1.41,0.28l-0.06,1.2l0.43,0.28l1.81,-0.9l0.02,0.06l-1.14,1.28l-0.08,0.2l-0.02,1.32l0.11,0.24l0.74,0.6l-0.29,2.18l-1.56,1.35l-0.09,0.32l0.48,1.54l0.28,0.21l1.11,0.04l0.55,1.17l0.15,0.14l0.76,0.35l-0.12,1.79l-1.1,0.72l-0.8,0.91l-1.68,1.04l-0.13,0.32l0.25,1.08l-0.18,0.96l-0.74,0.39Z\\\", \\\"name\\\": \\\"Tunisia\\\"}, \\\"TL\\\": {\\\"path\\\": \\\"M734.21,307.22l0.17,-0.34l1.99,-0.52l1.72,-0.08l0.78,-0.3l0.29,0.1l-0.43,0.32l-2.57,1.09l-1.71,0.59l-0.05,-0.49l-0.19,-0.36Z\\\", \\\"name\\\": \\\"East Timor\\\"}, \\\"TM\\\": {\\\"path\\\": \\\"M553.16,173.51l-0.12,1.0l-0.26,-0.65l0.38,-0.34ZM553.54,173.16l0.13,-0.12l0.43,-0.09l-0.56,0.21ZM555.68,172.6l0.65,-0.14l1.53,0.76l1.71,2.29l0.27,0.12l1.27,-0.14l2.81,-0.04l0.29,-0.38l-0.35,-1.27l1.98,-0.97l1.96,-1.63l3.05,1.44l0.25,2.23l0.14,0.22l0.96,0.61l0.18,0.05l2.61,-0.13l0.68,0.44l1.2,2.97l0.1,0.13l2.85,2.03l1.67,1.41l2.66,1.45l3.13,1.17l-0.05,1.23l-0.36,-0.04l-1.12,-0.73l-0.44,0.14l-0.34,0.89l-1.96,0.52l-0.22,0.23l-0.47,2.17l-1.26,0.78l-1.93,0.42l-0.21,0.18l-0.46,1.14l-1.64,0.33l-2.3,-0.97l-0.2,-2.23l-0.28,-0.27l-1.76,-0.1l-2.78,-2.48l-0.15,-0.07l-1.95,-0.31l-2.82,-1.48l-1.78,-0.27l-0.18,0.03l-1.03,0.51l-1.6,-0.08l-0.22,0.08l-1.72,1.6l-1.83,0.46l-0.39,-1.7l0.36,-3.0l-0.16,-0.3l-1.73,-0.88l0.57,-1.77l-0.25,-0.39l-1.33,-0.14l0.41,-1.85l2.05,0.63l0.21,-0.01l2.2,-0.95l0.09,-0.49l-1.78,-1.75l-0.69,-1.66l-0.07,-0.03Z\\\", \\\"name\\\": \\\"Turkmenistan\\\"}, \\\"TJ\\\": {\\\"path\\\": \\\"M597.99,178.71l-0.23,0.23l-2.57,-0.47l-0.35,0.25l-0.24,1.7l0.32,0.34l2.66,-0.22l3.15,0.95l4.47,-0.42l0.58,2.45l0.39,0.21l0.71,-0.25l1.22,0.53l-0.06,1.01l0.29,1.28l-2.19,-0.0l-1.71,-0.21l-0.23,0.07l-1.51,1.25l-1.05,0.27l-0.77,0.51l-0.71,-0.67l0.22,-2.28l-0.24,-0.32l-0.43,-0.08l0.17,-0.57l-0.16,-0.36l-1.36,-0.66l-0.34,0.05l-1.08,1.01l-0.09,0.15l-0.25,1.09l-0.24,0.26l-1.36,-0.05l-0.27,0.14l-0.65,1.06l-0.58,-0.39l-0.3,-0.02l-1.68,0.86l-0.36,-0.16l1.28,-2.65l0.02,-0.2l-0.54,-2.17l-0.18,-0.21l-1.53,-0.58l0.41,-0.82l1.89,0.13l0.26,-0.12l1.19,-1.63l0.77,-1.82l2.66,-0.55l-0.33,0.87l0.01,0.23l0.36,0.82l0.3,0.18l0.23,-0.02Z\\\", \\\"name\\\": \\\"Tajikistan\\\"}, \\\"LS\\\": {\\\"path\\\": \\\"M493.32,359.69l0.69,0.65l-0.65,1.12l-0.38,0.8l-1.27,0.39l-0.18,0.15l-0.4,0.77l-0.59,0.18l-1.59,-1.78l1.16,-1.5l1.3,-1.02l0.97,-0.46l0.94,0.72Z\\\", \\\"name\\\": \\\"Lesotho\\\"}, \\\"TH\\\": {\\\"path\\\": \\\"M677.42,253.68l-1.7,-0.88l-0.14,-0.03l-1.77,0.04l0.3,-1.64l-0.3,-0.35l-2.21,0.01l-0.3,0.28l-0.2,2.76l-2.15,5.9l-0.02,0.13l0.17,1.83l0.28,0.27l1.45,0.07l0.93,2.1l0.44,2.15l0.08,0.15l1.4,1.44l0.16,0.09l1.43,0.27l1.04,1.05l-0.58,0.73l-1.24,0.22l-0.15,-0.99l-0.15,-0.22l-2.04,-1.1l-0.36,0.06l-0.23,0.23l-0.72,-0.71l-0.41,-1.18l-0.06,-0.11l-1.33,-1.42l-1.22,-1.2l-0.5,0.13l-0.15,0.54l-0.14,-0.41l0.26,-1.48l0.73,-2.38l1.2,-2.57l1.37,-2.35l0.02,-0.27l-0.95,-2.26l0.03,-1.19l-0.29,-1.42l-0.06,-0.13l-1.65,-2.0l-0.46,-0.99l0.62,-0.34l0.13,-0.15l0.92,-2.23l-0.02,-0.27l-1.05,-1.74l-1.57,-1.86l-1.04,-1.96l0.76,-0.34l0.16,-0.16l1.07,-2.63l1.58,-0.1l0.16,-0.06l1.43,-1.11l1.24,-0.52l0.84,0.62l0.13,1.43l0.28,0.27l1.34,0.09l-0.54,2.39l0.05,2.39l0.45,0.25l2.48,-1.45l0.6,0.36l0.17,0.04l1.47,-0.07l0.25,-0.15l0.41,-0.73l1.58,0.15l1.76,1.93l0.15,2.44l0.08,0.18l1.94,2.15l-0.1,1.96l-0.66,0.93l-2.25,-0.34l-3.24,0.49l-0.19,0.12l-1.6,2.12l-0.06,0.24l0.48,2.46Z\\\", \\\"name\\\": \\\"Thailand\\\"}, \\\"TF\\\": {\\\"path\\\": \\\"M593.76,417.73l1.38,0.84l2.15,0.37l0.04,0.31l-0.59,1.24l-3.36,0.19l-0.05,-1.38l0.43,-1.56Z\\\", \\\"name\\\": \\\"French Southern and Antarctic Lands\\\"}, \\\"TG\\\": {\\\"path\\\": \\\"M425.23,269.29l-1.49,0.4l-0.43,-0.68l-0.64,-1.54l-0.18,-1.16l0.54,-2.21l-0.04,-0.24l-0.59,-0.86l-0.23,-1.9l0.0,-1.82l-0.07,-0.19l-0.95,-1.19l0.1,-0.41l1.58,0.04l-0.23,0.97l0.08,0.28l1.55,1.55l0.09,1.13l0.08,0.19l0.42,0.43l-0.11,5.66l0.52,1.53Z\\\", \\\"name\\\": \\\"Togo\\\"}, \\\"TD\\\": {\\\"path\\\": \\\"M457.57,252.46l0.23,-1.08l-0.28,-0.36l-1.32,-0.05l0.0,-1.35l-0.1,-0.22l-0.9,-0.82l0.99,-3.1l3.12,-2.37l0.12,-0.23l0.13,-3.33l0.95,-5.2l0.53,-1.09l-0.07,-0.36l-0.94,-0.81l-0.03,-0.7l-0.12,-0.23l-0.84,-0.61l-0.57,-3.76l2.21,-1.26l19.67,9.88l0.12,9.74l-1.83,-0.15l-0.28,0.14l-1.14,1.89l-0.68,1.62l0.05,0.31l0.33,0.38l-0.61,0.58l-0.08,0.3l0.25,0.93l-0.58,0.95l-0.29,1.01l0.34,0.37l0.67,-0.11l0.39,0.73l0.03,1.4l0.11,0.23l0.8,0.65l-0.01,0.24l-1.38,0.37l-0.11,0.06l-1.27,1.03l-1.83,2.76l-2.21,1.1l-2.34,-0.15l-0.82,0.25l-0.2,0.37l0.19,0.68l-1.16,0.79l-1.01,0.94l-2.92,0.89l-0.5,-0.46l-0.17,-0.08l-0.41,-0.05l-0.28,0.12l-0.38,0.54l-1.36,0.12l0.1,-0.18l0.01,-0.27l-0.78,-1.72l-0.35,-1.03l-0.17,-0.18l-1.03,-0.41l-1.29,-1.28l0.36,-0.78l0.9,0.2l0.14,-0.0l0.67,-0.17l1.36,0.02l0.26,-0.45l-1.32,-2.22l0.09,-1.64l-0.17,-1.68l-0.04,-0.13l-0.93,-1.53Z\\\", \\\"name\\\": \\\"Chad\\\"}, \\\"LY\\\": {\\\"path\\\": \\\"M457.99,226.38l-1.57,0.87l-1.25,-1.28l-0.13,-0.08l-3.85,-1.11l-1.04,-1.57l-0.09,-0.09l-1.98,-1.23l-0.27,-0.02l-0.93,0.39l-0.72,-1.2l-0.09,-1.07l-0.06,-0.16l-1.33,-1.75l0.83,-0.94l0.07,-0.24l-0.21,-1.64l0.31,-1.43l-0.17,-1.29l0.43,-2.26l-0.15,-1.33l-0.73,-2.18l0.99,-0.52l0.16,-0.21l0.22,-1.16l-0.22,-1.06l1.54,-0.95l0.81,-0.92l1.19,-0.78l0.14,-0.23l0.12,-1.76l2.57,0.84l0.16,0.01l0.99,-0.23l2.01,0.45l3.19,1.2l1.12,2.36l0.2,0.16l2.24,0.53l3.5,1.14l2.65,1.36l0.29,-0.01l1.22,-0.71l1.27,-1.32l0.07,-0.29l-0.55,-2.0l0.69,-1.19l1.7,-1.23l1.61,-0.35l3.2,0.54l0.78,1.14l0.24,0.13l0.85,0.01l0.84,0.47l2.35,0.31l0.42,0.63l-0.79,1.16l-0.04,0.26l0.35,1.08l-0.61,1.6l-0.0,0.2l0.73,2.16l0.0,24.24l-2.58,0.01l-0.3,0.29l-0.02,0.62l-19.55,-9.83l-0.28,0.01l-2.53,1.44Z\\\", \\\"name\\\": \\\"Libya\\\"}, \\\"AE\\\": {\\\"path\\\": \\\"M550.59,223.8l0.12,0.08l1.92,-0.41l3.54,0.15l0.23,-0.09l1.71,-1.79l1.86,-1.7l1.31,-1.36l0.26,0.5l0.28,1.72l-0.93,0.01l-0.3,0.26l-0.21,1.73l0.11,0.27l0.08,0.06l-0.7,0.32l-0.17,0.27l-0.01,0.99l-0.68,1.02l-0.05,0.15l-0.06,0.96l-0.32,0.36l-7.19,-1.27l-0.79,-2.22Z\\\", \\\"name\\\": \\\"United Arab Emirates\\\"}, \\\"VE\\\": {\\\"path\\\": \\\"M240.66,256.5l0.65,0.91l-0.03,1.13l-1.05,1.39l-0.03,0.31l0.95,2.0l0.32,0.17l1.08,-0.16l0.24,-0.21l0.56,-1.83l-0.06,-0.29l-0.71,-0.81l-0.1,-1.58l2.9,-0.96l0.19,-0.37l-0.29,-1.02l0.45,-0.41l0.72,1.43l0.26,0.16l1.65,0.04l1.46,1.27l0.08,0.72l0.3,0.27l2.28,0.02l2.55,-0.25l1.34,1.06l0.14,0.06l1.92,0.31l0.2,-0.03l1.4,-0.79l0.15,-0.25l0.02,-0.36l2.82,-0.14l1.17,-0.01l-0.41,0.14l-0.14,0.46l0.86,1.19l0.22,0.12l1.93,0.18l1.73,1.13l0.37,1.9l0.31,0.24l1.21,-0.05l0.52,0.32l-1.63,1.21l-0.11,0.17l-0.22,0.92l0.07,0.27l0.63,0.69l-0.31,0.24l-1.48,0.39l-0.22,0.3l0.04,1.03l-0.59,0.6l-0.01,0.41l1.67,1.87l0.23,0.48l-0.72,0.76l-2.71,0.91l-1.78,0.39l-0.13,0.06l-0.6,0.49l-1.84,-0.58l-1.89,-0.33l-0.18,0.03l-0.47,0.23l-0.02,0.53l0.96,0.56l-0.08,1.58l0.35,1.58l0.26,0.23l1.91,0.19l0.02,0.07l-1.54,0.62l-0.18,0.2l-0.25,0.92l-0.88,0.35l-1.85,0.58l-0.16,0.13l-0.4,0.64l-1.66,0.14l-1.22,-1.18l-0.79,-2.52l-0.67,-0.88l-0.66,-0.43l0.99,-0.98l0.09,-0.26l-0.09,-0.56l-0.08,-0.16l-0.66,-0.69l-0.47,-1.54l0.18,-1.67l0.55,-0.85l0.45,-1.35l-0.15,-0.36l-0.89,-0.43l-0.19,-0.02l-1.39,0.28l-1.76,-0.13l-0.92,0.23l-1.64,-2.01l-0.17,-0.1l-1.54,-0.33l-3.05,0.23l-0.5,-0.73l-0.15,-0.12l-0.45,-0.15l-0.05,-0.28l0.28,-0.86l0.01,-0.15l-0.2,-1.01l-0.08,-0.15l-0.5,-0.5l-0.3,-1.08l-0.25,-0.22l-0.89,-0.12l0.54,-1.18l0.29,-1.73l0.66,-0.85l0.94,-0.7l0.09,-0.11l0.3,-0.6Z\\\", \\\"name\\\": \\\"Venezuela\\\"}, \\\"AF\\\": {\\\"path\\\": \\\"M574.42,192.1l2.24,0.95l0.18,0.02l1.89,-0.38l0.22,-0.18l0.46,-1.14l1.82,-0.4l1.5,-0.91l0.14,-0.19l0.46,-2.12l1.93,-0.51l0.2,-0.18l0.26,-0.68l0.87,0.57l0.13,0.05l0.79,0.09l1.35,0.02l1.83,0.59l0.75,0.34l0.26,-0.01l1.66,-0.85l0.7,0.46l0.42,-0.09l0.72,-1.17l1.32,0.05l0.23,-0.1l0.39,-0.43l0.07,-0.14l0.24,-1.08l0.86,-0.81l0.94,0.46l-0.2,0.64l0.23,0.38l0.49,0.09l-0.21,2.15l0.09,0.25l0.99,0.94l0.38,0.03l0.83,-0.57l1.06,-0.27l0.12,-0.06l1.46,-1.21l1.63,0.2l2.4,0.0l0.17,0.32l-1.12,0.25l-1.23,0.52l-2.86,0.33l-2.69,0.6l-0.13,0.06l-1.46,1.25l-0.07,0.36l0.58,1.18l0.25,1.21l-1.13,1.08l-0.09,0.25l0.09,0.98l-0.53,0.79l-2.22,-0.08l-0.28,0.44l0.83,1.57l-1.3,0.58l-0.13,0.11l-1.06,1.69l-0.05,0.18l0.13,1.51l-0.73,0.58l-0.78,-0.22l-0.14,-0.01l-1.91,0.36l-0.23,0.19l-0.2,0.57l-1.65,-0.0l-0.22,0.1l-1.4,1.56l-0.08,0.19l-0.08,2.13l-2.99,1.05l-1.67,-0.23l-0.27,0.1l-0.39,0.46l-1.43,-0.31l-2.43,0.4l-3.69,-1.23l1.96,-2.15l0.08,-0.24l-0.21,-1.78l-0.23,-0.26l-1.69,-0.42l-0.19,-1.62l-0.77,-2.08l0.98,-1.41l-0.14,-0.45l-0.82,-0.31l0.6,-1.79l0.93,-3.21Z\\\", \\\"name\\\": \\\"Afghanistan\\\"}, \\\"IQ\\\": {\\\"path\\\": \\\"M534.42,190.89l0.13,0.14l1.5,0.78l0.15,1.34l-1.13,0.87l-0.11,0.16l-0.58,2.2l0.04,0.24l1.73,2.67l0.12,0.1l2.99,1.49l1.18,1.94l-0.39,1.89l0.29,0.36l0.5,-0.0l0.02,1.17l0.08,0.2l0.83,0.86l-2.36,-0.29l-0.29,0.13l-1.74,2.49l-4.4,-0.21l-7.03,-5.49l-3.73,-1.94l-2.92,-0.74l-0.89,-3.0l5.33,-2.81l0.15,-0.19l0.95,-3.43l-0.2,-2.0l1.19,-0.61l0.11,-0.09l1.23,-1.73l0.92,-0.38l2.75,0.35l0.81,0.68l0.31,0.05l0.94,-0.38l1.5,3.17Z\\\", \\\"name\\\": \\\"Iraq\\\"}, \\\"IS\\\": {\\\"path\\\": \\\"M384.26,87.96l-0.51,2.35l0.08,0.28l2.61,2.58l-2.99,2.83l-7.16,2.72l-2.08,0.7l-9.51,-1.71l1.89,-1.36l-0.07,-0.53l-4.4,-1.59l3.33,-0.59l0.25,-0.32l-0.11,-1.2l-0.25,-0.27l-4.82,-0.88l1.38,-2.2l3.54,-0.57l3.8,2.74l0.33,0.01l3.68,-2.18l3.02,1.12l0.25,-0.02l4.01,-2.18l3.72,0.27Z\\\", \\\"name\\\": \\\"Iceland\\\"}, \\\"IR\\\": {\\\"path\\\": \\\"M556.2,187.5l2.05,-0.52l0.13,-0.07l1.69,-1.57l1.55,0.08l0.15,-0.03l1.02,-0.5l1.64,0.25l2.82,1.48l1.91,0.3l2.8,2.49l0.18,0.08l1.61,0.09l0.19,2.09l-1.0,3.47l-0.69,2.04l0.18,0.38l0.73,0.28l-0.85,1.22l-0.04,0.28l0.81,2.19l0.19,1.72l0.23,0.26l1.69,0.42l0.17,1.43l-2.18,2.39l-0.01,0.4l1.22,1.42l1.0,1.62l0.12,0.11l2.23,1.11l0.06,2.2l0.2,0.27l1.03,0.38l0.14,0.83l-3.38,1.3l-0.18,0.19l-0.87,2.85l-4.44,-0.76l-2.75,-0.62l-2.64,-0.32l-1.01,-3.11l-0.17,-0.19l-1.2,-0.48l-0.18,-0.01l-1.99,0.51l-2.42,1.25l-2.89,-0.84l-2.48,-2.03l-2.41,-0.79l-1.61,-2.47l-1.84,-3.63l-0.36,-0.15l-1.22,0.4l-1.48,-0.84l-0.37,0.06l-0.72,0.82l-1.08,-1.12l-0.02,-1.35l-0.3,-0.29l-0.43,0.0l0.34,-1.64l-0.04,-0.22l-1.29,-2.11l-0.12,-0.11l-3.0,-1.49l-1.62,-2.49l0.52,-1.98l1.18,-0.92l0.11,-0.27l-0.19,-1.66l-0.16,-0.23l-1.55,-0.81l-1.58,-3.33l-1.3,-2.2l0.41,-0.75l0.03,-0.21l-0.73,-3.12l1.2,-0.59l0.35,0.9l1.26,1.35l0.15,0.09l1.81,0.39l0.91,-0.09l0.15,-0.06l2.9,-2.13l0.7,-0.16l0.48,0.56l-0.75,1.26l0.05,0.37l1.56,1.53l0.28,0.08l0.37,-0.09l0.7,1.89l0.21,0.19l2.31,0.59l1.69,1.4l0.15,0.07l3.66,0.49l3.91,-0.76l0.23,-0.19l0.19,-0.52Z\\\", \\\"name\\\": \\\"Iran\\\"}, \\\"AM\\\": {\\\"path\\\": \\\"M530.51,176.08l2.91,-0.39l0.41,0.63l0.11,0.1l0.66,0.36l-0.32,0.47l0.07,0.41l1.1,0.84l-0.53,0.7l0.06,0.42l1.06,0.8l1.01,0.44l0.04,1.56l-0.44,0.04l-0.88,-1.46l0.01,-0.37l-0.3,-0.31l-0.98,0.01l-0.65,-0.69l-0.26,-0.09l-0.38,0.06l-0.97,-0.82l-1.64,-0.65l0.2,-1.2l-0.02,-0.16l-0.28,-0.69Z\\\", \\\"name\\\": \\\"Armenia\\\"}, \\\"IT\\\": {\\\"path\\\": \\\"M451.68,158.58l0.2,0.16l3.3,0.75l-0.22,1.26l0.02,0.18l0.35,0.78l-1.4,-0.32l-0.21,0.03l-2.04,1.1l-0.16,0.29l0.13,1.47l-0.29,0.82l0.02,0.24l0.82,1.57l0.1,0.11l2.28,1.5l1.29,2.53l2.79,2.43l0.2,0.07l1.83,-0.02l0.31,0.34l-0.46,0.39l0.06,0.5l4.06,1.97l2.06,1.49l0.17,0.36l-0.24,0.53l-1.08,-1.07l-0.15,-0.08l-2.18,-0.49l-0.33,0.15l-1.05,1.91l0.11,0.4l1.63,0.98l-0.22,1.12l-0.84,0.14l-0.22,0.15l-1.27,2.38l-0.54,0.12l0.01,-0.47l0.48,-1.46l0.5,-0.58l0.03,-0.35l-0.97,-1.69l-0.76,-1.48l-0.17,-0.15l-0.94,-0.33l-0.68,-1.18l-0.16,-0.13l-1.53,-0.52l-1.03,-1.14l-0.19,-0.1l-1.78,-0.19l-1.88,-1.3l-2.27,-1.94l-1.64,-1.68l-0.76,-2.94l-0.21,-0.21l-1.22,-0.35l-2.01,-1.0l-0.24,-0.01l-1.15,0.42l-0.11,0.07l-1.38,1.36l-0.5,0.11l0.19,-0.87l-0.21,-0.35l-1.19,-0.34l-0.56,-2.06l0.76,-0.82l0.03,-0.36l-0.68,-1.08l0.04,-0.31l0.68,0.42l0.19,0.04l1.21,-0.15l0.14,-0.06l1.18,-0.89l0.25,0.29l0.25,0.1l1.19,-0.1l0.25,-0.18l0.45,-1.04l1.61,0.34l0.19,-0.02l1.1,-0.53l0.17,-0.22l0.15,-0.95l1.19,0.35l0.35,-0.16l0.23,-0.47l2.11,-0.47l0.45,0.89ZM459.35,184.63l-0.71,1.81l0.0,0.23l0.33,0.79l-0.37,1.03l-1.6,-0.91l-1.33,-0.34l-3.24,-1.36l0.23,-0.99l2.73,0.24l3.95,-0.5ZM443.95,175.91l1.26,1.77l-0.31,3.47l-0.82,-0.13l-0.26,0.08l-0.83,0.79l-0.64,-0.52l-0.1,-3.42l-0.44,-1.34l0.91,0.1l0.21,-0.06l1.01,-0.74Z\\\", \\\"name\\\": \\\"Italy\\\"}, \\\"VN\\\": {\\\"path\\\": \\\"M690.8,230.21l-2.86,1.93l-2.09,2.46l-0.06,0.11l-0.55,1.8l0.04,0.26l4.26,6.1l2.31,1.63l1.46,1.97l1.12,4.62l-0.32,4.3l-1.97,1.57l-2.85,1.62l-2.09,2.14l-2.83,2.13l-0.67,-1.19l0.65,-1.58l-0.09,-0.35l-1.47,-1.14l1.67,-0.79l2.57,-0.18l0.22,-0.47l-0.89,-1.24l3.88,-1.8l0.17,-0.24l0.31,-3.05l-0.01,-0.13l-0.56,-1.63l0.44,-2.48l-0.01,-0.15l-0.63,-1.81l-0.08,-0.12l-1.87,-1.77l-3.64,-5.3l-0.11,-0.1l-2.68,-1.39l0.45,-0.59l1.53,-0.65l0.16,-0.39l-0.97,-2.27l-0.27,-0.18l-2.89,-0.02l-1.04,-2.21l-1.28,-1.83l0.96,-0.46l1.97,0.01l2.43,-0.3l0.13,-0.05l1.95,-1.29l1.04,0.85l0.13,0.06l1.98,0.42l-0.32,1.21l0.09,0.3l1.19,1.07l0.12,0.07l1.88,0.51Z\\\", \\\"name\\\": \\\"Vietnam\\\"}, \\\"AR\\\": {\\\"path\\\": \\\"M258.11,341.34l1.4,1.81l0.51,-0.06l0.89,-1.94l2.51,0.1l0.36,0.49l4.6,4.31l0.15,0.08l1.99,0.39l3.01,1.93l2.5,1.01l0.28,0.91l-2.4,3.97l0.17,0.44l2.57,0.74l2.81,0.41l2.09,-0.44l0.14,-0.07l2.27,-2.06l0.09,-0.17l0.38,-2.2l0.88,-0.36l1.05,1.29l-0.04,1.88l-1.98,1.4l-1.72,1.13l-2.84,2.65l-3.34,3.73l-0.07,0.12l-0.63,2.22l-0.67,2.85l0.02,2.73l-0.47,0.54l-0.07,0.17l-0.36,3.28l0.12,0.27l3.03,2.32l-0.31,1.78l0.11,0.29l1.44,1.15l-0.11,1.17l-2.32,3.57l-3.59,1.51l-4.95,0.6l-2.72,-0.29l-0.32,0.38l0.5,1.67l-0.49,2.13l0.01,0.16l0.4,1.29l-1.27,0.88l-2.41,0.39l-2.33,-1.05l-0.31,0.04l-0.97,0.78l-0.11,0.27l0.35,2.98l0.16,0.23l1.69,0.91l0.31,-0.02l1.08,-0.75l0.46,0.96l-2.1,0.88l-2.01,1.89l-0.09,0.18l-0.36,3.05l-0.51,1.42l-2.16,0.01l-0.19,0.07l-1.96,1.59l-0.1,0.15l-0.72,2.34l0.08,0.31l2.46,2.31l0.13,0.07l2.09,0.56l-0.74,2.45l-2.86,1.75l-0.12,0.14l-1.59,3.71l-2.2,1.24l-0.1,0.09l-1.03,1.54l-0.04,0.23l0.81,3.45l0.06,0.13l1.13,1.32l-2.59,-0.57l-5.89,-0.44l-0.92,-1.73l0.05,-2.4l-0.34,-0.3l-1.49,0.19l-0.72,-0.98l-0.2,-3.21l1.79,-1.33l0.1,-0.13l0.79,-2.04l0.02,-0.16l-0.27,-1.52l1.31,-2.69l0.91,-4.15l-0.23,-1.72l0.91,-0.49l0.15,-0.33l-0.27,-1.16l-0.15,-0.2l-0.87,-0.46l0.65,-1.01l-0.04,-0.37l-1.06,-1.09l-0.54,-3.2l0.83,-0.51l0.14,-0.29l-0.42,-3.6l0.58,-2.98l0.64,-2.5l1.41,-1.0l0.12,-0.32l-0.75,-2.8l-0.01,-2.48l1.81,-1.78l0.09,-0.22l-0.06,-2.3l1.39,-2.69l0.03,-0.14l0.01,-2.58l-0.11,-0.24l-0.57,-0.45l-1.1,-4.59l1.49,-2.73l0.04,-0.17l-0.23,-2.59l0.86,-2.38l1.6,-2.48l1.74,-1.65l0.04,-0.39l-0.64,-0.89l0.42,-0.7l0.04,-0.16l-0.08,-4.26l2.55,-1.23l0.16,-0.18l0.86,-2.75l-0.01,-0.22l-0.22,-0.48l1.84,-2.1l3.0,0.59ZM256.77,438.98l-2.1,0.15l-1.18,-1.14l-0.19,-0.08l-1.53,-0.09l-2.38,-0.0l-0.0,-6.28l0.4,0.65l1.25,2.55l0.11,0.12l3.26,2.07l3.19,0.8l-0.82,1.26Z\\\", \\\"name\\\": \\\"Argentina\\\"}, \\\"AU\\\": {\\\"path\\\": \\\"M705.55,353.06l0.09,0.09l0.37,0.05l0.13,-0.35l-0.57,-1.69l0.48,0.3l0.71,0.99l0.34,0.11l0.2,-0.29l-0.04,-1.37l-0.04,-0.14l-1.22,-2.07l-0.28,-0.9l-0.51,-0.69l0.24,-1.33l0.52,-0.7l0.34,-1.32l0.01,-0.13l-0.25,-1.44l0.51,-0.94l0.1,1.03l0.23,0.26l0.32,-0.14l1.01,-1.72l1.94,-0.84l1.27,-1.14l1.84,-0.92l1.0,-0.18l0.6,0.28l0.26,-0.0l1.94,-0.96l1.48,-0.28l0.19,-0.13l0.32,-0.49l0.51,-0.18l1.42,0.05l2.63,-0.76l0.11,-0.06l1.36,-1.15l0.08,-0.1l0.61,-1.33l1.42,-1.27l0.1,-0.19l0.11,-1.03l0.06,-1.32l1.39,-1.74l0.85,1.79l0.4,0.14l1.07,-0.51l0.11,-0.45l-0.77,-1.05l0.53,-0.84l0.86,0.43l0.43,-0.22l0.29,-1.85l1.29,-1.19l0.6,-0.98l1.16,-0.4l0.2,-0.27l0.02,-0.34l0.74,0.2l0.38,-0.27l0.03,-0.44l1.98,-0.61l1.7,1.08l1.36,1.48l0.22,0.1l1.55,0.02l1.57,0.24l0.33,-0.4l-0.48,-1.27l1.09,-1.86l1.06,-0.63l0.1,-0.42l-0.28,-0.46l0.93,-1.24l1.36,-0.8l1.16,0.27l0.14,0.0l2.1,-0.48l0.23,-0.3l-0.05,-1.3l-0.18,-0.26l-1.08,-0.49l0.44,-0.12l1.52,0.58l1.39,1.06l2.11,0.65l0.19,-0.0l0.59,-0.21l1.44,0.72l0.27,0.0l1.37,-0.68l0.84,0.2l0.26,-0.06l0.37,-0.3l0.82,0.89l-0.56,1.14l-0.84,0.91l-0.75,0.07l-0.26,0.38l0.26,0.9l-0.67,1.15l-0.88,1.24l-0.05,0.25l0.18,0.72l0.12,0.17l1.99,1.42l1.96,0.84l1.25,0.86l1.8,1.51l0.19,0.07l0.63,-0.0l1.15,0.58l0.34,0.7l0.17,0.15l2.39,0.88l0.24,-0.02l1.65,-0.88l0.14,-0.16l0.49,-1.37l0.52,-1.19l0.31,-1.39l0.75,-2.02l0.01,-0.19l-0.33,-1.16l0.16,-0.67l0.0,-0.13l-0.28,-1.41l0.3,-1.78l0.42,-0.45l0.05,-0.33l-0.33,-0.73l0.56,-1.25l0.48,-1.39l0.07,-0.69l0.58,-0.59l0.48,0.84l0.17,1.53l0.17,0.24l0.47,0.23l0.09,0.9l0.05,0.14l0.87,1.23l0.17,1.33l-0.09,0.89l0.03,0.15l0.9,2.0l0.43,0.13l1.38,-0.83l0.71,0.92l1.06,0.88l-0.22,0.96l0.0,0.14l0.53,2.2l0.38,1.3l0.15,0.18l0.52,0.26l0.62,2.01l-0.23,1.27l0.02,0.18l0.81,1.76l0.14,0.14l2.69,1.35l3.21,2.21l-0.2,0.4l0.04,0.34l1.39,1.6l0.95,2.78l0.43,0.16l0.79,-0.46l0.85,0.96l0.39,0.05l0.22,-0.15l0.36,2.33l0.09,0.18l1.78,1.63l1.16,1.01l1.9,2.1l0.67,2.05l0.06,1.47l-0.17,1.64l0.03,0.17l1.16,2.22l-0.14,2.28l-0.43,1.24l-0.68,2.44l0.04,1.63l-0.48,1.92l-1.06,2.43l-1.79,1.32l-0.1,0.12l-0.91,2.15l-0.82,1.37l-0.76,2.47l-0.98,1.46l-0.63,2.14l-0.33,2.02l0.1,0.82l-1.21,0.85l-2.71,0.1l-0.13,0.03l-2.31,1.19l-1.21,1.17l-1.34,1.11l-1.89,-1.18l-1.33,-0.46l0.32,-1.24l-0.4,-0.35l-1.46,0.61l-2.06,1.98l-1.99,-0.73l-1.43,-0.46l-1.45,-0.22l-2.32,-0.81l-1.51,-1.67l-0.45,-2.11l-0.6,-1.5l-0.07,-0.11l-1.23,-1.16l-0.16,-0.08l-1.96,-0.28l0.59,-0.99l0.03,-0.24l-0.61,-2.1l-0.54,-0.08l-1.16,1.85l-1.23,0.29l0.73,-0.88l0.06,-0.12l0.37,-1.57l0.93,-1.33l0.05,-0.2l-0.2,-2.07l-0.53,-0.17l-2.01,2.35l-1.52,0.94l-0.12,0.14l-0.82,1.93l-1.5,-0.9l0.07,-1.32l-0.06,-0.2l-1.57,-2.04l-1.15,-0.92l0.3,-0.41l-0.1,-0.44l-3.21,-1.69l-0.13,-0.03l-1.69,-0.08l-2.35,-1.31l-0.16,-0.04l-4.55,0.27l-3.24,0.99l-2.8,0.91l-2.33,-0.18l-0.17,0.03l-2.63,1.41l-2.14,0.64l-0.2,0.19l-0.47,1.42l-0.8,0.99l-1.99,0.06l-1.55,0.24l-2.27,-0.5l-1.79,0.3l-1.71,0.13l-0.19,0.09l-1.38,1.39l-0.58,-0.1l-0.21,0.04l-1.26,0.8l-1.13,0.85l-1.72,-0.1l-1.6,-0.0l-2.58,-1.76l-1.21,-0.49l0.04,-1.19l1.04,-0.32l0.16,-0.12l0.42,-0.64l0.05,-0.19l-0.09,-0.97l0.3,-2.0l-0.28,-1.64l-1.34,-2.84l-0.39,-1.49l0.1,-1.51l-0.04,-0.17l-0.96,-1.72l-0.06,-0.73l-0.09,-0.19l-1.04,-1.01l-0.3,-2.02l-0.05,-0.12l-1.23,-1.83ZM784.95,393.35l2.39,1.01l0.2,0.01l3.26,-0.96l1.19,0.16l0.16,3.19l-0.78,0.95l-0.07,0.16l-0.19,1.83l-0.43,-0.41l-0.44,0.03l-1.61,1.96l-0.4,-0.12l-1.38,-0.09l-1.43,-2.42l-0.37,-2.03l-1.4,-2.53l0.04,-0.94l1.27,0.2Z\\\", \\\"name\\\": \\\"Australia\\\"}, \\\"IL\\\": {\\\"path\\\": \\\"M509.04,199.22l0.71,0.0l0.27,-0.17l0.15,-0.33l0.19,-0.01l0.02,0.73l-0.27,0.34l0.02,0.08l-0.32,0.62l-0.65,-0.27l-0.41,0.19l-0.52,1.85l0.16,0.35l0.14,0.07l-0.17,0.1l-0.14,0.21l-0.11,0.73l0.39,0.33l0.81,-0.26l0.03,0.64l-0.97,3.43l-1.28,-3.67l0.62,-0.78l-0.03,-0.41l0.58,-1.16l0.5,-2.07l0.27,-0.54Z\\\", \\\"name\\\": \\\"Israel\\\"}, \\\"IN\\\": {\\\"path\\\": \\\"M615.84,192.58l2.4,2.97l-0.24,2.17l0.05,0.2l0.94,1.35l-0.06,0.97l-1.46,-0.3l-0.35,0.36l0.7,3.06l0.12,0.18l2.46,1.75l3.11,1.72l-1.23,0.96l-0.1,0.13l-0.97,2.55l0.16,0.38l2.41,1.02l2.37,1.33l3.27,1.52l3.43,0.37l1.37,1.3l0.17,0.08l1.92,0.25l3.0,0.62l2.15,-0.04l0.28,-0.22l0.29,-1.06l0.0,-0.13l-0.32,-1.66l0.16,-0.94l1.0,-0.37l0.23,2.28l0.18,0.24l2.28,1.02l0.2,0.02l1.52,-0.41l2.06,0.18l2.08,-0.08l0.29,-0.27l0.18,-1.66l-0.1,-0.26l-0.53,-0.44l1.38,-0.23l0.15,-0.07l2.26,-2.0l2.75,-1.65l1.97,0.63l0.25,-0.03l1.54,-0.99l0.89,1.28l-0.72,0.97l0.2,0.48l2.49,0.37l0.11,0.61l-0.69,0.39l-0.15,0.3l0.15,1.22l-1.36,-0.37l-0.23,0.03l-3.24,1.86l-0.15,0.28l0.07,1.44l-1.33,2.16l-0.04,0.13l-0.12,1.24l-0.98,1.91l-1.72,-0.53l-0.39,0.28l-0.09,2.66l-0.52,0.83l-0.04,0.23l0.21,0.89l-0.71,0.36l-1.21,-3.85l-0.29,-0.21l-0.69,0.01l-0.29,0.23l-0.28,1.17l-0.84,-0.84l0.6,-1.17l0.97,-0.13l0.23,-0.16l1.15,-2.25l-0.18,-0.42l-1.54,-0.47l-2.3,0.04l-2.13,-0.33l-0.19,-1.63l-0.26,-0.26l-1.13,-0.13l-1.93,-1.13l-0.42,0.13l-0.88,1.82l0.08,0.37l1.47,1.15l-1.21,0.77l-0.1,0.1l-0.56,0.97l0.13,0.42l1.31,0.61l-0.36,1.35l0.01,0.2l0.85,1.95l0.37,2.05l-0.26,0.68l-1.55,-0.02l-3.09,0.54l-0.25,0.32l0.13,1.84l-1.21,1.4l-3.64,1.79l-2.79,3.04l-1.86,1.61l-2.48,1.68l-0.13,0.25l-0.0,1.0l-1.07,0.55l-2.21,0.9l-1.13,0.13l-0.25,0.19l-0.75,1.96l-0.02,0.15l0.52,3.31l0.13,2.03l-1.03,2.35l-0.03,0.12l-0.01,4.03l-1.02,0.1l-0.23,0.15l-1.14,1.93l0.04,0.36l0.44,0.48l-1.83,0.57l-0.18,0.15l-0.81,1.65l-0.74,0.53l-2.14,-2.12l-1.14,-3.47l-0.96,-2.57l-0.9,-1.26l-1.3,-2.38l-0.61,-3.14l-0.44,-1.62l-2.29,-3.56l-1.03,-4.94l-0.74,-3.29l0.01,-3.12l-0.49,-2.51l-0.41,-0.22l-3.56,1.53l-1.59,-0.28l-2.96,-2.87l0.94,-0.74l0.06,-0.41l-0.74,-1.03l-2.73,-2.1l1.35,-1.43l5.38,0.01l0.29,-0.36l-0.5,-2.29l-0.09,-0.15l-1.33,-1.28l-0.27,-1.96l-0.12,-0.2l-1.36,-1.0l2.42,-2.48l2.77,0.2l0.24,-0.1l2.62,-2.85l1.59,-2.8l2.41,-2.74l0.07,-0.2l-0.04,-1.82l2.01,-1.51l-0.01,-0.49l-1.95,-1.33l-0.83,-1.81l-0.82,-2.27l0.98,-0.97l3.64,0.66l2.89,-0.42l0.17,-0.08l2.18,-2.15Z\\\", \\\"name\\\": \\\"India\\\"}, \\\"TZ\\\": {\\\"path\\\": \\\"M505.77,287.58l0.36,0.23l8.95,5.03l0.15,1.3l0.13,0.21l3.4,2.37l-1.07,2.88l-0.02,0.14l0.15,1.42l0.15,0.23l1.47,0.84l0.05,0.42l-0.66,1.44l-0.02,0.18l0.13,0.72l-0.16,1.16l0.03,0.19l0.87,1.57l1.03,2.48l0.12,0.14l0.53,0.32l-1.59,1.18l-2.64,0.95l-1.45,-0.04l-0.2,0.07l-0.81,0.69l-1.64,0.06l-0.68,0.3l-2.9,-0.69l-1.71,0.17l-0.65,-3.18l-0.05,-0.12l-1.35,-1.88l-0.19,-0.12l-2.41,-0.46l-1.38,-0.74l-1.63,-0.44l-0.96,-0.41l-0.95,-0.58l-1.31,-3.09l-1.47,-1.46l-0.45,-1.31l0.24,-1.34l-0.39,-1.99l0.71,-0.08l0.18,-0.09l0.91,-0.91l0.98,-1.31l0.59,-0.5l0.11,-0.24l-0.02,-0.81l-0.08,-0.2l-0.47,-0.5l-0.1,-0.67l0.51,-0.23l0.18,-0.25l0.14,-1.47l-0.05,-0.2l-0.76,-1.09l0.45,-0.15l2.71,0.03l5.01,-0.19Z\\\", \\\"name\\\": \\\"Tanzania\\\"}, \\\"AZ\\\": {\\\"path\\\": \\\"M539.36,175.66l0.16,0.09l1.11,0.2l0.32,-0.15l0.4,-0.71l1.22,-0.99l1.11,1.33l1.26,2.09l0.22,0.14l1.06,0.13l0.28,0.29l-1.46,0.17l-0.26,0.24l-0.43,2.26l-0.39,0.92l-0.85,0.63l-0.12,0.25l0.06,1.2l-0.22,0.05l-1.28,-1.25l0.74,-1.25l-0.03,-0.35l-0.74,-0.86l-0.3,-0.1l-1.05,0.27l-2.49,1.82l-0.04,-1.46l-0.18,-0.27l-1.09,-0.47l-0.8,-0.6l0.53,-0.7l-0.06,-0.42l-1.11,-0.84l0.34,-0.51l-0.11,-0.43l-0.89,-0.48l-0.33,-0.49l0.25,-0.2l1.78,0.81l1.35,0.18l0.25,-0.09l0.34,-0.35l0.02,-0.39l-1.04,-1.36l0.28,-0.18l0.49,0.07l1.65,1.74ZM533.53,180.16l0.63,0.67l0.22,0.09l0.8,-0.0l0.04,0.31l0.66,1.09l-0.94,-0.21l-1.16,-1.24l-0.25,-0.71Z\\\", \\\"name\\\": \\\"Azerbaijan\\\"}, \\\"IE\\\": {\\\"path\\\": \\\"M405.17,135.35l0.36,2.16l-1.78,2.84l-4.28,1.91l-3.02,-0.43l1.81,-3.13l0.02,-0.26l-1.23,-3.26l3.24,-2.56l1.54,-1.32l0.37,1.33l-0.49,1.77l0.3,0.38l1.49,-0.05l1.68,0.63Z\\\", \\\"name\\\": \\\"Ireland\\\"}, \\\"ID\\\": {\\\"path\\\": \\\"M756.56,287.86l0.69,4.02l0.15,0.21l2.59,1.5l0.39,-0.07l2.05,-2.61l2.75,-1.45l2.09,-0.0l2.08,0.85l1.85,0.89l2.52,0.46l0.08,15.44l-1.72,-1.6l-0.15,-0.07l-2.54,-0.51l-0.29,0.1l-0.53,0.62l-2.53,0.06l0.78,-1.51l1.48,-0.66l0.17,-0.34l-0.65,-2.74l-1.23,-2.19l-0.14,-0.13l-4.85,-2.13l-2.09,-0.23l-3.7,-2.28l-0.41,0.1l-0.67,1.11l-0.63,0.14l-0.41,-0.67l-0.01,-1.01l-0.14,-0.25l-1.39,-0.89l2.05,-0.69l1.73,0.05l0.29,-0.39l-0.21,-0.66l-0.29,-0.21l-3.5,-0.0l-0.9,-1.36l-0.19,-0.13l-2.14,-0.44l-0.65,-0.76l2.86,-0.51l1.28,-0.79l3.75,0.96l0.32,0.76ZM758.01,300.37l-0.79,1.04l-0.14,-1.07l0.4,-0.81l0.29,-0.47l0.24,0.31l-0.0,1.0ZM747.45,292.9l0.48,1.02l-1.45,-0.69l-2.09,-0.21l-1.45,0.16l-1.28,-0.07l0.35,-0.81l2.86,-0.1l2.58,0.68ZM741.15,285.69l-0.16,-0.25l-0.72,-3.08l0.47,-1.86l0.35,-0.38l0.1,0.73l0.25,0.26l1.28,0.19l0.18,0.78l-0.11,1.8l-0.96,-0.18l-0.35,0.22l-0.38,1.52l0.05,0.24ZM741.19,285.75l0.76,0.97l-0.11,0.05l-0.65,-1.02ZM739.18,293.52l-0.61,0.54l-1.44,-0.38l-0.25,-0.55l1.93,-0.09l0.36,0.48ZM728.4,295.87l-0.27,-0.07l-2.26,0.89l-0.37,-0.41l0.27,-0.8l-0.09,-0.33l-1.68,-1.37l0.17,-2.29l-0.42,-0.3l-1.67,0.76l-0.17,0.29l0.21,2.92l0.09,3.34l-1.22,0.28l-0.78,-0.54l0.65,-2.1l0.01,-0.14l-0.39,-2.42l-0.29,-0.25l-0.86,-0.02l-0.63,-1.4l0.99,-1.61l0.35,-1.97l1.24,-3.73l0.49,-0.96l1.95,-1.7l1.86,0.69l3.16,0.35l2.92,-0.1l0.17,-0.06l2.24,-1.65l0.11,0.14l-1.8,2.22l-1.72,0.44l-2.41,-0.48l-4.21,0.13l-2.19,0.36l-0.25,0.24l-0.36,1.9l0.08,0.27l2.24,2.23l0.4,0.02l1.29,-1.08l3.19,-0.58l-0.19,0.06l-1.04,1.4l-2.13,0.94l-0.12,0.45l2.26,3.06l-0.37,0.69l0.03,0.32l1.51,1.95ZM728.48,295.97l0.59,0.76l-0.02,1.37l-1.0,0.55l-0.64,-0.58l1.09,-1.84l-0.02,-0.26ZM728.64,286.95l0.79,-0.14l-0.07,0.39l-0.72,-0.24ZM732.38,310.1l-1.89,0.49l-0.06,-0.06l0.17,-0.64l1.0,-1.42l2.14,-0.87l0.1,0.2l0.04,0.58l-1.49,1.72ZM728.26,305.71l-0.17,0.63l-3.53,0.67l-3.02,-0.28l-0.0,-0.42l1.66,-0.44l1.47,0.71l0.16,0.03l1.75,-0.21l1.69,-0.69ZM722.98,310.33l-0.74,0.03l-2.52,-1.35l1.42,-0.3l1.19,0.7l0.72,0.63l-0.06,0.28ZM716.24,305.63l0.66,0.49l0.22,0.06l1.35,-0.18l0.31,0.53l-4.18,0.77l-0.8,-0.01l0.51,-0.86l1.2,-0.02l0.24,-0.12l0.49,-0.65ZM715.84,280.21l0.09,0.34l2.25,1.86l-2.25,0.22l-0.24,0.17l-0.84,1.71l-0.03,0.15l0.1,2.11l-2.27,1.62l-0.13,0.24l-0.06,2.46l-0.74,2.92l-0.02,-0.05l-0.39,-0.16l-2.62,1.04l-0.86,-1.33l-0.23,-0.14l-1.71,-0.14l-1.19,-0.76l-0.25,-0.03l-2.78,0.84l-0.79,-1.05l-0.26,-0.12l-1.61,0.13l-1.8,-0.25l-0.36,-3.13l-0.15,-0.23l-1.18,-0.65l-1.13,-2.02l-0.33,-2.1l0.27,-2.19l1.05,-1.17l0.28,1.12l0.1,0.16l1.71,1.41l0.28,0.05l1.55,-0.49l1.54,0.17l0.23,-0.07l1.4,-1.21l1.05,-0.19l2.3,0.68l0.16,0.0l2.04,-0.53l0.21,-0.19l1.26,-3.41l0.91,-0.82l0.09,-0.14l0.8,-2.64l2.63,0.0l1.71,0.33l-1.19,1.89l0.02,0.34l1.74,2.24l-0.37,1.0ZM692.67,302.0l0.26,0.19l4.8,0.25l0.28,-0.16l0.44,-0.83l4.29,1.12l0.85,1.52l0.23,0.15l3.71,0.45l2.37,1.15l-2.06,0.69l-2.77,-1.0l-2.25,0.07l-2.57,-0.18l-2.31,-0.45l-2.94,-0.97l-1.84,-0.25l-0.13,0.01l-0.97,0.29l-4.34,-0.98l-0.38,-0.94l-0.25,-0.19l-1.76,-0.14l1.31,-1.84l2.81,0.14l1.97,0.96l0.95,0.19l0.28,0.74ZM685.63,299.27l-2.36,0.04l-2.07,-2.05l-3.17,-2.02l-1.06,-1.5l-1.88,-2.02l-1.22,-1.85l-1.9,-3.49l-2.2,-2.11l-0.71,-2.08l-0.94,-1.99l-0.1,-0.12l-2.21,-1.54l-1.35,-2.17l-1.86,-1.39l-2.53,-2.68l-0.14,-0.81l1.22,0.08l3.76,0.47l2.16,2.4l1.94,1.7l1.37,1.04l2.35,2.67l0.22,0.1l2.44,0.04l1.99,1.62l1.42,2.06l0.09,0.09l1.67,1.0l-0.88,1.8l0.11,0.39l1.44,0.87l0.13,0.04l0.68,0.05l0.41,1.62l0.87,1.4l0.22,0.14l1.71,0.21l1.06,1.38l-0.61,3.04l-0.09,3.6Z\\\", \\\"name\\\": \\\"Indonesia\\\"}, \\\"UA\\\": {\\\"path\\\": \\\"M500.54,141.42l0.9,0.13l0.27,-0.11l0.52,-0.62l0.68,0.13l2.43,-0.3l1.32,1.57l-0.45,0.48l-0.07,0.26l0.21,1.03l0.27,0.24l1.85,0.15l0.76,1.22l-0.05,0.55l0.2,0.31l3.18,1.15l0.18,0.01l1.75,-0.47l1.42,1.41l0.22,0.09l1.42,-0.03l3.44,0.99l0.02,0.65l-0.97,1.62l-0.03,0.24l0.52,1.67l-0.29,0.79l-2.24,0.22l-0.14,0.05l-1.29,0.89l-0.13,0.23l-0.07,1.16l-1.75,0.22l-0.12,0.04l-1.6,0.98l-2.27,0.16l-0.12,0.04l-2.16,1.17l-0.16,0.29l0.15,1.94l0.14,0.23l1.23,0.75l0.18,0.04l2.06,-0.15l-0.22,0.51l-2.67,0.54l-3.27,1.72l-1.0,-0.45l0.45,-1.19l-0.19,-0.39l-2.34,-0.78l0.15,-0.2l2.32,-1.0l0.09,-0.49l-0.73,-0.72l-0.15,-0.08l-3.69,-0.75l-0.14,-0.96l-0.35,-0.25l-2.32,0.39l-0.21,0.15l-0.91,1.7l-1.77,2.1l-0.93,-0.44l-0.24,-0.0l-1.05,0.45l-0.48,-0.25l0.13,-0.07l0.14,-0.15l0.43,-1.04l0.67,-0.97l0.04,-0.26l-0.1,-0.31l0.04,-0.02l0.11,0.19l0.24,0.15l1.48,0.09l0.78,-0.25l0.07,-0.53l-0.27,-0.19l0.09,-0.25l-0.08,-0.33l-0.81,-0.74l-0.34,-1.24l-0.14,-0.18l-0.73,-0.42l0.15,-0.87l-0.11,-0.29l-1.13,-0.86l-0.15,-0.06l-0.97,-0.11l-1.79,-0.97l-0.2,-0.03l-1.66,0.32l-0.13,0.06l-0.52,0.41l-0.95,-0.0l-0.23,0.11l-0.56,0.66l-1.74,0.29l-0.79,0.43l-1.01,-0.68l-0.16,-0.05l-1.57,-0.01l-1.52,-0.35l-0.23,0.04l-0.71,0.45l-0.09,-0.43l-0.13,-0.19l-1.18,-0.74l0.38,-1.02l0.53,-0.64l0.35,0.12l0.37,-0.41l-0.57,-1.29l2.1,-2.5l1.16,-0.36l0.2,-0.2l0.27,-0.92l-0.01,-0.2l-1.1,-2.52l0.79,-0.09l0.13,-0.05l1.3,-0.86l1.83,-0.07l2.48,0.26l2.84,0.8l1.91,0.06l0.88,0.45l0.29,-0.01l0.72,-0.44l0.49,0.58l0.25,0.11l2.2,-0.16l0.94,0.3l0.39,-0.26l0.15,-1.57l0.61,-0.59l2.01,-0.19Z\\\", \\\"name\\\": \\\"Ukraine\\\"}, \\\"QA\\\": {\\\"path\\\": \\\"M548.47,221.47l-0.15,-1.72l0.59,-1.23l0.38,-0.16l0.54,0.6l0.04,1.4l-0.47,1.37l-0.41,0.11l-0.53,-0.37Z\\\", \\\"name\\\": \\\"Qatar\\\"}, \\\"MZ\\\": {\\\"path\\\": \\\"M507.71,314.14l1.65,-0.18l2.96,0.7l0.2,-0.02l0.6,-0.29l1.68,-0.06l0.18,-0.07l0.8,-0.69l1.5,0.02l2.74,-0.98l1.74,-1.27l0.25,0.7l-0.1,2.47l0.31,2.27l0.1,3.97l0.42,1.24l-0.7,1.71l-0.94,1.73l-1.52,1.52l-5.06,2.21l-2.88,2.8l-1.01,0.51l-1.72,1.81l-0.99,0.58l-0.15,0.23l-0.21,1.86l0.04,0.19l1.17,1.95l0.47,1.47l0.03,0.74l0.39,0.28l0.05,-0.01l-0.06,2.13l-0.39,1.19l0.1,0.33l0.42,0.32l-0.28,0.83l-0.95,0.86l-2.03,0.88l-3.08,1.49l-1.1,0.99l-0.09,0.28l0.21,1.13l0.21,0.23l0.38,0.11l-0.14,0.89l-1.39,-0.02l-0.17,-0.94l-0.38,-1.23l-0.2,-0.89l0.44,-2.91l-0.01,-0.14l-0.65,-1.88l-1.15,-3.55l2.52,-2.85l0.68,-1.89l0.29,-0.18l0.14,-0.2l0.28,-1.53l-0.03,-0.19l-0.36,-0.7l0.1,-1.83l0.49,-1.84l-0.01,-3.26l-0.14,-0.25l-1.3,-0.83l-0.11,-0.04l-1.08,-0.17l-0.47,-0.55l-0.1,-0.08l-1.16,-0.54l-0.13,-0.03l-1.83,0.04l-0.32,-2.25l7.19,-1.99l1.32,1.12l0.29,0.06l0.55,-0.19l0.75,0.49l0.11,0.81l-0.49,1.11l-0.02,0.15l0.19,1.81l0.09,0.18l1.63,1.59l0.48,-0.1l0.72,-1.68l0.99,-0.49l0.17,-0.29l-0.21,-3.29l-0.04,-0.13l-1.11,-1.92l-0.9,-0.82l-0.21,-0.08l-0.62,0.03l-0.63,-2.98l0.61,-1.67Z\\\", \\\"name\\\": \\\"Mozambique\\\"}}, \\\"height\\\": 440.7063107441331, \\\"projection\\\": {\\\"type\\\": \\\"mill\\\", \\\"centralMeridian\\\": 11.5}, \\\"width\\\": 900.0});\"\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/raw-loader!./src/assets/inspinia/plugins/jvectormap/jquery-jvectormap-world-mill-en.js\n// module id = 2224\n// module chunks = 1"],"sourceRoot":""}